diff --git a/Cargo.lock b/Cargo.lock
index ea1cb58265a2de2ce1cfd543af588713dcb4ca2d..39a1f360e2195238fa2f47ab23c4c2581db5e0fe 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -1092,6 +1092,7 @@ dependencies = [
  "dubp",
  "duniter-dbs",
  "duniter-dbs-write-ops",
+ "duniter-gva-db",
  "duniter-gva-indexer",
  "fast-threadpool",
  "flume",
@@ -1156,6 +1157,7 @@ dependencies = [
  "dubp",
  "duniter-conf",
  "duniter-dbs",
+ "duniter-gva-db",
  "duniter-gva-dbs-reader",
  "duniter-gva-gql",
  "duniter-gva-indexer",
@@ -1176,6 +1178,22 @@ dependencies = [
  "warp",
 ]
 
+[[package]]
+name = "duniter-gva-db"
+version = "0.1.0"
+dependencies = [
+ "bincode",
+ "chrono",
+ "dubp",
+ "duniter-dbs",
+ "kv_typed",
+ "paste",
+ "serde",
+ "serde_json",
+ "uninit",
+ "zerocopy",
+]
+
 [[package]]
 name = "duniter-gva-dbs-reader"
 version = "0.1.0"
@@ -1183,6 +1201,7 @@ dependencies = [
  "anyhow",
  "dubp",
  "duniter-dbs",
+ "duniter-gva-db",
  "maplit",
  "resiter",
  "smallvec",
@@ -1201,6 +1220,7 @@ dependencies = [
  "duniter-bc-reader",
  "duniter-conf",
  "duniter-dbs",
+ "duniter-gva-db",
  "duniter-gva-dbs-reader",
  "duniter-mempools",
  "duniter-module",
@@ -1223,6 +1243,7 @@ dependencies = [
  "anyhow",
  "dubp",
  "duniter-dbs",
+ "duniter-gva-db",
  "maplit",
  "once_cell",
  "resiter",
diff --git a/rust-bins/duniter-dbex/Cargo.toml b/rust-bins/duniter-dbex/Cargo.toml
index c0b2ce05fd1dfd12e09e39cd2f634b375d9fe688..24c60ff75133e7c3a9930798c50eeee60f9f80de 100644
--- a/rust-bins/duniter-dbex/Cargo.toml
+++ b/rust-bins/duniter-dbex/Cargo.toml
@@ -25,6 +25,7 @@ dirs = "3.0.1"
 dubp = { version = "0.34.0" }
 duniter-dbs = { path = "../../rust-libs/duniter-dbs", default-features = false, features = ["explorer", "leveldb_backend", "sled_backend"] }
 duniter-dbs-write-ops = { path = "../../rust-libs/duniter-dbs-write-ops", default-features = false, features = ["explorer", "leveldb_backend", "sled_backend"] }
+duniter-gva-db = { path = "../../rust-libs/modules/gva/db", default-features = false, features = ["explorer", "leveldb_backend"] }
 duniter-gva-indexer = { path = "../../rust-libs/modules/gva/indexer" }
 fast-threadpool = "0.2.3"
 flume = "0.10.0"
diff --git a/rust-bins/duniter-dbex/src/main.rs b/rust-bins/duniter-dbex/src/main.rs
index fa68156ae6fce1d6ad03ea89e72c68c70e14327a..ca55f5d4c1f9a270487388ad343d578fbd3b8f6f 100644
--- a/rust-bins/duniter-dbex/src/main.rs
+++ b/rust-bins/duniter-dbex/src/main.rs
@@ -36,7 +36,6 @@ use duniter_dbs::databases::{
     bc_v1::{BcV1Db, BcV1DbWritable},
     bc_v2::{BcV2Db, BcV2DbWritable},
     dunp_v1::{DunpV1Db, DunpV1DbWritable},
-    gva_v1::{GvaV1Db, GvaV1DbWritable},
     txs_mp_v2::{TxsMpV2Db, TxsMpV2DbWritable},
 };
 use duniter_dbs::kv_typed::prelude::*;
@@ -44,6 +43,7 @@ use duniter_dbs::prelude::*;
 use duniter_dbs::regex::Regex;
 use duniter_dbs::serde_json::{Map, Value};
 use duniter_dbs::smallvec::{smallvec, SmallVec};
+use duniter_gva_db::{GvaV1Db, GvaV1DbWritable};
 use rayon::prelude::*;
 use std::{
     collections::{HashMap, HashSet},
diff --git a/rust-libs/duniter-dbs/Cargo.toml b/rust-libs/duniter-dbs/Cargo.toml
index 9e448409355dcb7089cc2cc65629ac89777db22c..cd8424dd855ef3882b5f50747ac0ac68bcc5165b 100644
--- a/rust-libs/duniter-dbs/Cargo.toml
+++ b/rust-libs/duniter-dbs/Cargo.toml
@@ -37,7 +37,7 @@ unwrap = "1.2.1"
 [features]
 default = ["sled_backend"]
 
-# CAUTION: feature "leveldb_backend" MUST BE DISABLED by default. Uncomment this lire for dev/test only ! 
+# CAUTION: feature "leveldb_backend" MUST BE DISABLED by default. Uncomment this line for dev/test only ! 
 #default = ["sled_backend", "explorer", "leveldb_backend"]
 
 explorer = ["chrono", "kv_typed/explorer"]
diff --git a/rust-libs/duniter-dbs/src/databases.rs b/rust-libs/duniter-dbs/src/databases.rs
index 1c49eafdf9c13bc331d7608754d4a7207a92bd9e..501375802286b32313160c6b7debd9ff005d98c1 100644
--- a/rust-libs/duniter-dbs/src/databases.rs
+++ b/rust-libs/duniter-dbs/src/databases.rs
@@ -17,5 +17,4 @@ pub mod bc_v1;
 pub mod bc_v2;
 pub mod cm_v1;
 pub mod dunp_v1;
-pub mod gva_v1;
 pub mod txs_mp_v2;
diff --git a/rust-libs/duniter-dbs/src/keys.rs b/rust-libs/duniter-dbs/src/keys.rs
index 6f6e1f1d3aa1a404072429e1ca82eaf3cb162ecb..b5d2db16bd1451130a4bca39686bba24cfd933a1 100644
--- a/rust-libs/duniter-dbs/src/keys.rs
+++ b/rust-libs/duniter-dbs/src/keys.rs
@@ -26,4 +26,3 @@ pub mod ud_id;
 pub mod uid;
 pub mod utxo_id;
 pub mod wallet_conditions;
-pub mod wallet_hash_with_bn;
diff --git a/rust-libs/duniter-dbs/src/keys/utxo_id.rs b/rust-libs/duniter-dbs/src/keys/utxo_id.rs
index 6dead64f95fa53db7297b9d60072550de6e6f2b8..ca57bf0cbe3534eb83110a6bef29d694310711a1 100644
--- a/rust-libs/duniter-dbs/src/keys/utxo_id.rs
+++ b/rust-libs/duniter-dbs/src/keys/utxo_id.rs
@@ -98,137 +98,6 @@ impl ExplorableKey for UtxoIdDbV2 {
     }
 }
 
-#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq, PartialOrd, Ord)]
-pub struct GvaUtxoIdDbV1([u8; 69]); // script hash ++ block_number ++ tx_hash ++ output_index
-
-impl Default for GvaUtxoIdDbV1 {
-    fn default() -> Self {
-        GvaUtxoIdDbV1([0u8; 69])
-    }
-}
-
-impl std::fmt::Display for GvaUtxoIdDbV1 {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(
-            f,
-            "{}:{}:{}:{}",
-            self.get_script_hash(),
-            self.get_block_number(),
-            self.get_tx_hash(),
-            self.get_output_index()
-        )
-    }
-}
-
-impl GvaUtxoIdDbV1 {
-    pub fn get_script_hash(&self) -> Hash {
-        let mut buffer = uninit_array![u8; 32];
-
-        buffer.as_out().copy_from_slice(&self.0[..32]);
-
-        Hash(unsafe { std::mem::transmute(buffer) })
-    }
-    pub fn get_block_number(&self) -> u32 {
-        let mut buffer = uninit_array![u8; 4];
-
-        buffer.as_out().copy_from_slice(&self.0[32..36]);
-
-        u32::from_be_bytes(unsafe { std::mem::transmute(buffer) })
-    }
-    pub fn get_tx_hash(&self) -> Hash {
-        let mut buffer = uninit_array![u8; 32];
-
-        buffer.as_out().copy_from_slice(&self.0[36..68]);
-
-        Hash(unsafe { std::mem::transmute(buffer) })
-    }
-    pub fn get_output_index(&self) -> u8 {
-        self.0[68]
-    }
-    pub fn new(
-        script: WalletScriptV10,
-        block_number: u32,
-        tx_hash: Hash,
-        output_index: u8,
-    ) -> Self {
-        let script_hash = Hash::compute(script.to_string().as_bytes());
-        Self::new_(script_hash, block_number, tx_hash, output_index)
-    }
-    pub fn new_(script_hash: Hash, block_number: u32, tx_hash: Hash, output_index: u8) -> Self {
-        // TODO uncomment when feature const_generics became stable !
-        /*let mut buffer = uninit_array![u8; 69];
-        let (hash_buffer, rest_buffer) = buffer.as_out().split_at_out(32);
-        let (bn_buffer, rest_buffer) = rest_buffer.split_at_out(4);
-        let (tx_hash_buffer, output_index_buffer) = rest_buffer.split_at_out(32);
-        hash_buffer.copy_from_slice(script_hash.as_ref());
-        bn_buffer.copy_from_slice(&block_number.to_be_bytes()[..]);
-        tx_hash_buffer.copy_from_slice(tx_hash.as_ref());
-        output_index_buffer.copy_from_slice(&[output_index]);
-
-        Self(unsafe { std::mem::transmute(buffer) })*/
-        let mut buffer = [0u8; 69];
-        buffer[..32].copy_from_slice(script_hash.as_ref());
-        buffer[32..36].copy_from_slice(&block_number.to_be_bytes()[..]);
-        buffer[36..68].copy_from_slice(tx_hash.as_ref());
-        buffer[68] = output_index;
-        Self(buffer)
-    }
-    pub fn script_interval(script_hash: Hash) -> (Self, Self) {
-        let mut buffer = [0; 69];
-        buffer[..32].copy_from_slice(script_hash.as_ref());
-        let min = Self(buffer);
-        let mut buffer = [255; 69];
-        buffer[..32].copy_from_slice(script_hash.as_ref());
-        let max = Self(buffer);
-
-        (min, max)
-    }
-    pub fn script_block_interval(
-        script_hash: Hash,
-        block_number_start: u32,
-        block_number_end: u32,
-    ) -> (Self, Self) {
-        (
-            Self::new_(script_hash, block_number_start, Hash::default(), 0),
-            Self::new_(script_hash, block_number_end, Hash::max(), u8::MAX),
-        )
-    }
-}
-
-impl AsBytes for GvaUtxoIdDbV1 {
-    fn as_bytes<T, F: FnMut(&[u8]) -> T>(&self, mut f: F) -> T {
-        f(&self.0[..])
-    }
-}
-
-impl FromBytes for GvaUtxoIdDbV1 {
-    type Err = CorruptedBytes;
-
-    fn from_bytes(bytes: &[u8]) -> std::result::Result<Self, Self::Err> {
-        if bytes.len() == 69 {
-            // TODO uncomment when feature const_generics became stable !
-            /*let mut buffer = uninit_array![u8; 69];
-            buffer.as_out().copy_from_slice(bytes);
-            Ok(Self(unsafe { std::mem::transmute(buffer) }))*/
-            let mut buffer = [0u8; 69];
-            buffer.copy_from_slice(bytes);
-            Ok(Self(buffer))
-        } else {
-            Err(CorruptedBytes("db corrupted".to_owned()))
-        }
-    }
-}
-
-#[cfg(feature = "explorer")]
-impl ExplorableKey for GvaUtxoIdDbV1 {
-    fn from_explorer_str(_: &str) -> std::result::Result<Self, FromExplorerKeyErr> {
-        unimplemented!()
-    }
-    fn to_explorer_string(&self) -> KvResult<String> {
-        Ok(self.to_string())
-    }
-}
-
 #[cfg(test)]
 mod tests {
     use super::*;
@@ -252,17 +121,4 @@ mod tests {
 
         Ok(())
     }
-
-    #[test]
-    fn utxo_gva_id_new() {
-        let script = WalletScriptV10::single(WalletConditionV10::Csv(86_400));
-        let script_hash = Hash::compute(script.to_string().as_bytes());
-        let tx_hash = Hash::default();
-        let utxo_gva_id = GvaUtxoIdDbV1::new(script, 42, tx_hash, 3);
-
-        assert_eq!(utxo_gva_id.get_script_hash(), script_hash);
-        assert_eq!(utxo_gva_id.get_block_number(), 42);
-        assert_eq!(utxo_gva_id.get_tx_hash(), tx_hash);
-        assert_eq!(utxo_gva_id.get_output_index(), 3);
-    }
 }
diff --git a/rust-libs/duniter-dbs/src/lib.rs b/rust-libs/duniter-dbs/src/lib.rs
index 7004bd5b07c37789ef8ce7f9a686951e36f491ee..048cade01e04b3b134def393e7adc944996db023 100644
--- a/rust-libs/duniter-dbs/src/lib.rs
+++ b/rust-libs/duniter-dbs/src/lib.rs
@@ -64,16 +64,13 @@ pub use keys::source_key::SourceKeyV1;
 pub use keys::timestamp::TimestampKeyV1;
 pub use keys::ud_id::UdIdV2;
 pub use keys::uid::UidKeyV1;
-pub use keys::utxo_id::GvaUtxoIdDbV1;
 pub use keys::wallet_conditions::{WalletConditionsV1, WalletConditionsV2};
-pub use keys::wallet_hash_with_bn::WalletHashWithBnV1Db;
 pub use values::block_db::{BlockDbEnum, BlockDbV1, BlockDbV2, TransactionInBlockDbV1};
 pub use values::block_head_db::BlockHeadDbV1;
 pub use values::block_meta::BlockMetaV2;
 pub use values::block_number_array_db::BlockNumberArrayV1;
 pub use values::cindex_db::CIndexDbV1;
 pub use values::dunp_head::DunpHeadDbV1;
-pub use values::gva_idty_db::GvaIdtyDbV1;
 pub use values::idty_db::IdtyDbV2;
 pub use values::iindex_db::IIndexDbV1;
 pub use values::kick_db::KickDbV1;
@@ -82,12 +79,11 @@ pub use values::peer_card::PeerCardDbV1;
 pub use values::pubkey_db::{PubKeyValV2, PublicKeyArrayDbV1, PublicKeySingletonDbV1};
 pub use values::sindex_db::{SIndexDBV1, SourceKeyArrayDbV1};
 pub use values::source_amount::SourceAmountValV2;
-pub use values::tx_db::{PendingTxDbV2, TxDbV2};
+pub use values::tx_db::PendingTxDbV2;
 pub use values::txs::BlockTxsDbV2;
 pub use values::ud_entry_db::{ConsumedUdDbV1, UdAmountDbV1, UdEntryDbV1};
 pub use values::utxo::{BlockUtxosV2Db, UtxoValV2};
 pub use values::wallet_db::WalletDbV1;
-pub use values::wallet_script_array::WalletScriptArrayV2;
 pub use values::wallet_script_with_sa::WalletScriptWithSourceAmountV1Db;
 
 // Crate imports
diff --git a/rust-libs/duniter-dbs/src/values.rs b/rust-libs/duniter-dbs/src/values.rs
index b82603025d668e18d6b14214c4955d421fbec8b8..a77cb7fd247c3dd9d085da764bc323ca733eb8f2 100644
--- a/rust-libs/duniter-dbs/src/values.rs
+++ b/rust-libs/duniter-dbs/src/values.rs
@@ -19,7 +19,6 @@ pub mod block_meta;
 pub mod block_number_array_db;
 pub mod cindex_db;
 pub mod dunp_head;
-pub mod gva_idty_db;
 pub mod idty_db;
 pub mod iindex_db;
 pub mod kick_db;
@@ -33,5 +32,4 @@ pub mod txs;
 pub mod ud_entry_db;
 pub mod utxo;
 pub mod wallet_db;
-pub mod wallet_script_array;
 pub mod wallet_script_with_sa;
diff --git a/rust-libs/duniter-dbs/src/values/tx_db.rs b/rust-libs/duniter-dbs/src/values/tx_db.rs
index a332c1413783d41f27616f24aa336a6a6956b638..f5009f85fbffca986f98bd366a0c965095a78196 100644
--- a/rust-libs/duniter-dbs/src/values/tx_db.rs
+++ b/rust-libs/duniter-dbs/src/values/tx_db.rs
@@ -50,42 +50,3 @@ impl ExplorableValue for PendingTxDbV2 {
         serde_json::to_value(self).map_err(|e| KvError::DeserError(e.into()))
     }
 }
-
-#[derive(Clone, Debug, Default, Deserialize, PartialEq, Serialize)]
-pub struct TxDbV2 {
-    pub tx: TransactionDocumentV10,
-    pub written_block: Blockstamp,
-    pub written_time: i64,
-}
-
-impl AsBytes for TxDbV2 {
-    fn as_bytes<T, F: FnMut(&[u8]) -> T>(&self, mut f: F) -> T {
-        let bytes = bincode::serialize(self).unwrap_or_else(|_| unreachable!());
-        f(bytes.as_ref())
-    }
-}
-
-impl kv_typed::prelude::FromBytes for TxDbV2 {
-    type Err = CorruptedBytes;
-
-    fn from_bytes(bytes: &[u8]) -> std::result::Result<Self, Self::Err> {
-        Ok(bincode::deserialize(&bytes)
-            .map_err(|e| CorruptedBytes(format!("{}: '{:?}'", e, bytes)))?)
-    }
-}
-
-impl ToDumpString for TxDbV2 {
-    fn to_dump_string(&self) -> String {
-        todo!()
-    }
-}
-
-#[cfg(feature = "explorer")]
-impl ExplorableValue for TxDbV2 {
-    fn from_explorer_str(source: &str) -> Result<Self, FromExplorerValueErr> {
-        Self::from_bytes(source.as_bytes()).map_err(|e| FromExplorerValueErr(e.0.into()))
-    }
-    fn to_explorer_json(&self) -> KvResult<serde_json::Value> {
-        serde_json::to_value(self).map_err(|e| KvError::DeserError(e.into()))
-    }
-}
diff --git a/rust-libs/modules/gva/Cargo.toml b/rust-libs/modules/gva/Cargo.toml
index f4928b033c04599ad6efb6dffbe83c60882873f7..877cb89b702246e1d85c397f8975514ce730a1cd 100644
--- a/rust-libs/modules/gva/Cargo.toml
+++ b/rust-libs/modules/gva/Cargo.toml
@@ -14,6 +14,7 @@ async-trait = "0.1.41"
 dubp = { version = "0.34.0" }
 duniter-conf = { path = "../../duniter-conf" }
 duniter-dbs = { path = "../../duniter-dbs" }
+duniter-gva-db = { path = "./db" }
 duniter-gva-dbs-reader = { path = "./dbs-reader" }
 duniter-gva-indexer = { path = "./indexer" }
 duniter-gva-gql = { path = "./gql" }
diff --git a/rust-libs/modules/gva/db/Cargo.toml b/rust-libs/modules/gva/db/Cargo.toml
new file mode 100644
index 0000000000000000000000000000000000000000..de906c2bf809c437c7734b888c4876f76b2c65fb
--- /dev/null
+++ b/rust-libs/modules/gva/db/Cargo.toml
@@ -0,0 +1,31 @@
+[package]
+name = "duniter-gva-db"
+version = "0.1.0"
+authors = ["elois <elois@duniter.org>"]
+description = "Duniter GVA DB"
+repository = "https://git.duniter.org/nodes/typescript/duniter"
+license = "AGPL-3.0"
+edition = "2018"
+
+[lib]
+path = "src/lib.rs"
+
+[dependencies]
+bincode = "1.2.1"
+chrono = { version = "0.4.15", optional = true }
+duniter-dbs = { path = "../../../duniter-dbs" }
+dubp = { version = "0.34.0" }
+kv_typed = { path = "../../../tools/kv_typed", default-features = false, features = ["sled_backend"] }
+paste = "1.0.2"
+serde = { version = "1.0.105", features = ["derive"] }
+serde_json = "1.0.53"
+uninit = "0.4.0"
+zerocopy = "0.3.0"
+
+[dev-dependencies]
+
+[features]
+#default = ["explorer"]
+
+explorer = ["chrono", "duniter-dbs/explorer", "kv_typed/explorer"]
+leveldb_backend = ["kv_typed/leveldb_backend"]
diff --git a/rust-libs/modules/gva/db/src/keys.rs b/rust-libs/modules/gva/db/src/keys.rs
new file mode 100644
index 0000000000000000000000000000000000000000..ced890746bed7f72d910bf66d2e3e0f26c3ea091
--- /dev/null
+++ b/rust-libs/modules/gva/db/src/keys.rs
@@ -0,0 +1,17 @@
+//  Copyright (C) 2020 Éloïs SANCHEZ.
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero General Public License as
+// published by the Free Software Foundation, either version 3 of the
+// License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with this program.  If not, see <https://www.gnu.org/licenses/>.
+
+pub mod gva_utxo_id;
+pub mod wallet_hash_with_bn;
diff --git a/rust-libs/modules/gva/db/src/keys/gva_utxo_id.rs b/rust-libs/modules/gva/db/src/keys/gva_utxo_id.rs
new file mode 100644
index 0000000000000000000000000000000000000000..1f624a872a284fc84f87581a30af18aed9decfc4
--- /dev/null
+++ b/rust-libs/modules/gva/db/src/keys/gva_utxo_id.rs
@@ -0,0 +1,166 @@
+//  Copyright (C) 2020 Éloïs SANCHEZ.
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero General Public License as
+// published by the Free Software Foundation, either version 3 of the
+// License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with this program.  If not, see <https://www.gnu.org/licenses/>.
+
+use crate::*;
+use uninit::prelude::*;
+
+#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq, PartialOrd, Ord)]
+pub struct GvaUtxoIdDbV1([u8; 69]); // script hash ++ block_number ++ tx_hash ++ output_index
+
+impl Default for GvaUtxoIdDbV1 {
+    fn default() -> Self {
+        GvaUtxoIdDbV1([0u8; 69])
+    }
+}
+
+impl std::fmt::Display for GvaUtxoIdDbV1 {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(
+            f,
+            "{}:{}:{}:{}",
+            self.get_script_hash(),
+            self.get_block_number(),
+            self.get_tx_hash(),
+            self.get_output_index()
+        )
+    }
+}
+
+impl GvaUtxoIdDbV1 {
+    pub fn get_script_hash(&self) -> Hash {
+        let mut buffer = uninit_array![u8; 32];
+
+        buffer.as_out().copy_from_slice(&self.0[..32]);
+
+        Hash(unsafe { std::mem::transmute(buffer) })
+    }
+    pub fn get_block_number(&self) -> u32 {
+        let mut buffer = uninit_array![u8; 4];
+
+        buffer.as_out().copy_from_slice(&self.0[32..36]);
+
+        u32::from_be_bytes(unsafe { std::mem::transmute(buffer) })
+    }
+    pub fn get_tx_hash(&self) -> Hash {
+        let mut buffer = uninit_array![u8; 32];
+
+        buffer.as_out().copy_from_slice(&self.0[36..68]);
+
+        Hash(unsafe { std::mem::transmute(buffer) })
+    }
+    pub fn get_output_index(&self) -> u8 {
+        self.0[68]
+    }
+    pub fn new(
+        script: WalletScriptV10,
+        block_number: u32,
+        tx_hash: Hash,
+        output_index: u8,
+    ) -> Self {
+        let script_hash = Hash::compute(script.to_string().as_bytes());
+        Self::new_(script_hash, block_number, tx_hash, output_index)
+    }
+    pub fn new_(script_hash: Hash, block_number: u32, tx_hash: Hash, output_index: u8) -> Self {
+        // TODO uncomment when feature const_generics became stable !
+        /*let mut buffer = uninit_array![u8; 69];
+        let (hash_buffer, rest_buffer) = buffer.as_out().split_at_out(32);
+        let (bn_buffer, rest_buffer) = rest_buffer.split_at_out(4);
+        let (tx_hash_buffer, output_index_buffer) = rest_buffer.split_at_out(32);
+        hash_buffer.copy_from_slice(script_hash.as_ref());
+        bn_buffer.copy_from_slice(&block_number.to_be_bytes()[..]);
+        tx_hash_buffer.copy_from_slice(tx_hash.as_ref());
+        output_index_buffer.copy_from_slice(&[output_index]);
+
+        Self(unsafe { std::mem::transmute(buffer) })*/
+        let mut buffer = [0u8; 69];
+        buffer[..32].copy_from_slice(script_hash.as_ref());
+        buffer[32..36].copy_from_slice(&block_number.to_be_bytes()[..]);
+        buffer[36..68].copy_from_slice(tx_hash.as_ref());
+        buffer[68] = output_index;
+        Self(buffer)
+    }
+    pub fn script_interval(script_hash: Hash) -> (Self, Self) {
+        let mut buffer = [0; 69];
+        buffer[..32].copy_from_slice(script_hash.as_ref());
+        let min = Self(buffer);
+        let mut buffer = [255; 69];
+        buffer[..32].copy_from_slice(script_hash.as_ref());
+        let max = Self(buffer);
+
+        (min, max)
+    }
+    pub fn script_block_interval(
+        script_hash: Hash,
+        block_number_start: u32,
+        block_number_end: u32,
+    ) -> (Self, Self) {
+        (
+            Self::new_(script_hash, block_number_start, Hash::default(), 0),
+            Self::new_(script_hash, block_number_end, Hash::max(), u8::MAX),
+        )
+    }
+}
+
+impl AsBytes for GvaUtxoIdDbV1 {
+    fn as_bytes<T, F: FnMut(&[u8]) -> T>(&self, mut f: F) -> T {
+        f(&self.0[..])
+    }
+}
+
+impl FromBytes for GvaUtxoIdDbV1 {
+    type Err = CorruptedBytes;
+
+    fn from_bytes(bytes: &[u8]) -> std::result::Result<Self, Self::Err> {
+        if bytes.len() == 69 {
+            // TODO uncomment when feature const_generics became stable !
+            /*let mut buffer = uninit_array![u8; 69];
+            buffer.as_out().copy_from_slice(bytes);
+            Ok(Self(unsafe { std::mem::transmute(buffer) }))*/
+            let mut buffer = [0u8; 69];
+            buffer.copy_from_slice(bytes);
+            Ok(Self(buffer))
+        } else {
+            Err(CorruptedBytes("db corrupted".to_owned()))
+        }
+    }
+}
+
+#[cfg(feature = "explorer")]
+impl ExplorableKey for GvaUtxoIdDbV1 {
+    fn from_explorer_str(_: &str) -> std::result::Result<Self, FromExplorerKeyErr> {
+        unimplemented!()
+    }
+    fn to_explorer_string(&self) -> KvResult<String> {
+        Ok(self.to_string())
+    }
+}
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+
+    #[test]
+    fn utxo_gva_id_new() {
+        let script = WalletScriptV10::single(WalletConditionV10::Csv(86_400));
+        let script_hash = Hash::compute(script.to_string().as_bytes());
+        let tx_hash = Hash::default();
+        let utxo_gva_id = GvaUtxoIdDbV1::new(script, 42, tx_hash, 3);
+
+        assert_eq!(utxo_gva_id.get_script_hash(), script_hash);
+        assert_eq!(utxo_gva_id.get_block_number(), 42);
+        assert_eq!(utxo_gva_id.get_tx_hash(), tx_hash);
+        assert_eq!(utxo_gva_id.get_output_index(), 3);
+    }
+}
diff --git a/rust-libs/duniter-dbs/src/keys/wallet_hash_with_bn.rs b/rust-libs/modules/gva/db/src/keys/wallet_hash_with_bn.rs
similarity index 100%
rename from rust-libs/duniter-dbs/src/keys/wallet_hash_with_bn.rs
rename to rust-libs/modules/gva/db/src/keys/wallet_hash_with_bn.rs
diff --git a/rust-libs/duniter-dbs/src/databases/gva_v1.rs b/rust-libs/modules/gva/db/src/lib.rs
similarity index 60%
rename from rust-libs/duniter-dbs/src/databases/gva_v1.rs
rename to rust-libs/modules/gva/db/src/lib.rs
index 4990d0053774ab0d5a49af0d8b0e9b875029b0b8..e1e3d69758b5b669020b3358b880b39211820d01 100644
--- a/rust-libs/duniter-dbs/src/databases/gva_v1.rs
+++ b/rust-libs/modules/gva/db/src/lib.rs
@@ -13,14 +13,42 @@
 // You should have received a copy of the GNU Affero General Public License
 // along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
-use crate::*;
+#![deny(
+    clippy::unwrap_used,
+    missing_copy_implementations,
+    trivial_casts,
+    trivial_numeric_casts,
+    unstable_features,
+    unused_import_braces
+)]
+
+mod keys;
+mod values;
+
+pub use keys::gva_utxo_id::GvaUtxoIdDbV1;
+pub use keys::wallet_hash_with_bn::WalletHashWithBnV1Db;
+pub use values::gva_idty_db::GvaIdtyDbV1;
+pub use values::gva_tx::GvaTxDbV1;
+pub use values::wallet_script_array::WalletScriptArrayV2;
+
+pub(crate) use dubp::common::prelude::*;
+pub(crate) use dubp::crypto::hashs::Hash;
+pub(crate) use dubp::wallet::prelude::*;
+pub(crate) use duniter_dbs::smallvec::SmallVec;
+pub(crate) use duniter_dbs::{
+    CorruptedBytes, HashKeyV2, PubKeyKeyV2, SourceAmountValV2, ToDumpString, WalletConditionsV2,
+};
+pub(crate) use kv_typed::db_schema;
+pub(crate) use kv_typed::prelude::*;
+pub(crate) use serde::{Deserialize, Serialize};
+pub(crate) use std::collections::BTreeSet;
 
 db_schema!(
     GvaV1,
     [
         ["blocks_with_ud", BlocksWithUd, U32BE, ()],
         ["blockchain_time", BlockchainTime, U32BE, u64],
-        ["txs", Txs, HashKeyV2, TxDbV2],
+        ["txs", Txs, HashKeyV2, GvaTxDbV1],
         ["txs_by_issuer", TxsByIssuer, WalletHashWithBnV1Db, BTreeSet<Hash>],
         ["txs_by_recipient", TxsByRecipient, WalletHashWithBnV1Db, BTreeSet<Hash>],
         [
diff --git a/rust-libs/modules/gva/db/src/values.rs b/rust-libs/modules/gva/db/src/values.rs
new file mode 100644
index 0000000000000000000000000000000000000000..ed42095fa54010e5d37f4557d94d2f18d45df1d0
--- /dev/null
+++ b/rust-libs/modules/gva/db/src/values.rs
@@ -0,0 +1,18 @@
+//  Copyright (C) 2020 Éloïs SANCHEZ.
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero General Public License as
+// published by the Free Software Foundation, either version 3 of the
+// License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with this program.  If not, see <https://www.gnu.org/licenses/>.
+
+pub mod gva_idty_db;
+pub mod gva_tx;
+pub mod wallet_script_array;
diff --git a/rust-libs/duniter-dbs/src/values/gva_idty_db.rs b/rust-libs/modules/gva/db/src/values/gva_idty_db.rs
similarity index 100%
rename from rust-libs/duniter-dbs/src/values/gva_idty_db.rs
rename to rust-libs/modules/gva/db/src/values/gva_idty_db.rs
diff --git a/rust-libs/modules/gva/db/src/values/gva_tx.rs b/rust-libs/modules/gva/db/src/values/gva_tx.rs
new file mode 100644
index 0000000000000000000000000000000000000000..5bb8deaf788084455c820ee571055eb652edbeb2
--- /dev/null
+++ b/rust-libs/modules/gva/db/src/values/gva_tx.rs
@@ -0,0 +1,57 @@
+//  Copyright (C) 2020 Éloïs SANCHEZ.
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero General Public License as
+// published by the Free Software Foundation, either version 3 of the
+// License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with this program.  If not, see <https://www.gnu.org/licenses/>.
+
+use crate::*;
+
+use dubp::documents::transaction::TransactionDocumentV10;
+
+#[derive(Clone, Debug, Default, Deserialize, PartialEq, Serialize)]
+pub struct GvaTxDbV1 {
+    pub tx: TransactionDocumentV10,
+    pub written_block: Blockstamp,
+    pub written_time: i64,
+}
+
+impl AsBytes for GvaTxDbV1 {
+    fn as_bytes<T, F: FnMut(&[u8]) -> T>(&self, mut f: F) -> T {
+        let bytes = bincode::serialize(self).unwrap_or_else(|_| unreachable!());
+        f(bytes.as_ref())
+    }
+}
+
+impl kv_typed::prelude::FromBytes for GvaTxDbV1 {
+    type Err = CorruptedBytes;
+
+    fn from_bytes(bytes: &[u8]) -> std::result::Result<Self, Self::Err> {
+        Ok(bincode::deserialize(&bytes)
+            .map_err(|e| CorruptedBytes(format!("{}: '{:?}'", e, bytes)))?)
+    }
+}
+
+impl ToDumpString for GvaTxDbV1 {
+    fn to_dump_string(&self) -> String {
+        todo!()
+    }
+}
+
+#[cfg(feature = "explorer")]
+impl ExplorableValue for GvaTxDbV1 {
+    fn from_explorer_str(source: &str) -> Result<Self, FromExplorerValueErr> {
+        Self::from_bytes(source.as_bytes()).map_err(|e| FromExplorerValueErr(e.0.into()))
+    }
+    fn to_explorer_json(&self) -> KvResult<serde_json::Value> {
+        serde_json::to_value(self).map_err(|e| KvError::DeserError(e.into()))
+    }
+}
diff --git a/rust-libs/duniter-dbs/src/values/wallet_script_array.rs b/rust-libs/modules/gva/db/src/values/wallet_script_array.rs
similarity index 99%
rename from rust-libs/duniter-dbs/src/values/wallet_script_array.rs
rename to rust-libs/modules/gva/db/src/values/wallet_script_array.rs
index 719a5adde8dc2a7c6ba32053cb0b80c8e78fca47..d0b4fa932549d1e14620c3274ced6295708d59c1 100644
--- a/rust-libs/duniter-dbs/src/values/wallet_script_array.rs
+++ b/rust-libs/modules/gva/db/src/values/wallet_script_array.rs
@@ -14,7 +14,6 @@
 // along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 use crate::*;
-
 #[derive(Debug, Default, PartialEq)]
 pub struct WalletScriptArrayV2(pub std::collections::HashSet<WalletScriptV10>);
 
diff --git a/rust-libs/modules/gva/dbs-reader/Cargo.toml b/rust-libs/modules/gva/dbs-reader/Cargo.toml
index ee4a45a66f30daa9b14617c1c80540065ec003a6..5fc05c9c6dbf1b339e97b35a2f48c0789b1e856a 100644
--- a/rust-libs/modules/gva/dbs-reader/Cargo.toml
+++ b/rust-libs/modules/gva/dbs-reader/Cargo.toml
@@ -14,6 +14,7 @@ path = "src/lib.rs"
 [dependencies]
 anyhow = "1.0.34"
 duniter-dbs = { path = "../../../duniter-dbs" }
+duniter-gva-db = { path = "../db" }
 dubp = { version = "0.34.0" }
 resiter = "0.4.0"
 
diff --git a/rust-libs/modules/gva/dbs-reader/src/find_inputs.rs b/rust-libs/modules/gva/dbs-reader/src/find_inputs.rs
index ffb3b9c8a575fd26e1a955bb07044c050899a024..f47df7437977b655c576e9c7f39c5cb78c0aeea8 100644
--- a/rust-libs/modules/gva/dbs-reader/src/find_inputs.rs
+++ b/rust-libs/modules/gva/dbs-reader/src/find_inputs.rs
@@ -139,17 +139,17 @@ impl DbsReader {
 mod tests {
     use super::*;
     use duniter_dbs::{
-        databases::{bc_v2::BcV2DbWritable, gva_v1::GvaV1DbWritable, txs_mp_v2::TxsMpV2DbWritable},
-        BlockMetaV2, GvaUtxoIdDbV1, SourceAmountValV2, UdIdV2, UtxoIdDbV2, UtxoValV2,
-        WalletConditionsV2,
+        databases::{bc_v2::BcV2DbWritable, txs_mp_v2::TxsMpV2DbWritable},
+        BlockMetaV2, SourceAmountValV2, UdIdV2, UtxoIdDbV2, UtxoValV2, WalletConditionsV2,
     };
+    use duniter_gva_db::{GvaUtxoIdDbV1, GvaV1DbWritable};
 
     const UD0: i64 = 100;
 
     #[test]
     fn test_find_inputs() -> anyhow::Result<()> {
         let bc_db = duniter_dbs::databases::bc_v2::BcV2Db::<Mem>::open(MemConf::default())?;
-        let gva_db = duniter_dbs::databases::gva_v1::GvaV1Db::<Mem>::open(MemConf::default())?;
+        let gva_db = duniter_gva_db::GvaV1Db::<Mem>::open(MemConf::default())?;
         let db_reader = create_dbs_reader(unsafe { std::mem::transmute(&gva_db.get_ro_handler()) });
         let txs_mp_db =
             duniter_dbs::databases::txs_mp_v2::TxsMpV2Db::<Mem>::open(MemConf::default())?;
diff --git a/rust-libs/modules/gva/dbs-reader/src/lib.rs b/rust-libs/modules/gva/dbs-reader/src/lib.rs
index 5d346812c4a3753227be6a8208fdb5b996460e99..758192db8817156ccc7d2ebf3d86a8deb9f8eab0 100644
--- a/rust-libs/modules/gva/dbs-reader/src/lib.rs
+++ b/rust-libs/modules/gva/dbs-reader/src/lib.rs
@@ -41,14 +41,12 @@ use duniter_dbs::{
     databases::{
         bc_v2::{BcV2DbReadable, BcV2DbRo},
         cm_v1::CmV1DbReadable,
-        gva_v1::{GvaV1DbReadable, GvaV1DbRo},
         txs_mp_v2::TxsMpV2DbReadable,
     },
     BlockMetaV2,
 };
-use duniter_dbs::{
-    kv_typed::prelude::*, HashKeyV2, PubKeyKeyV2, SourceAmountValV2, TxDbV2, UtxoIdDbV2,
-};
+use duniter_dbs::{kv_typed::prelude::*, HashKeyV2, PubKeyKeyV2, SourceAmountValV2, UtxoIdDbV2};
+use duniter_gva_db::{GvaIdtyDbV1, GvaTxDbV1, GvaUtxoIdDbV1, GvaV1DbReadable, GvaV1DbRo};
 use resiter::filter::Filter;
 use resiter::filter_map::FilterMap;
 use resiter::flatten::Flatten;
@@ -119,8 +117,8 @@ impl DbsReader {
 #[cfg(test)]
 impl DbsReader {
     pub(crate) fn mem() -> Self {
-        use duniter_dbs::databases::gva_v1::GvaV1DbWritable;
-        let gva_db = duniter_dbs::databases::gva_v1::GvaV1Db::<Mem>::open(MemConf::default())
+        use duniter_gva_db::GvaV1DbWritable;
+        let gva_db = duniter_gva_db::GvaV1Db::<Mem>::open(MemConf::default())
             .expect("fail to create memory gva db");
         create_dbs_reader(unsafe { std::mem::transmute(&gva_db.get_ro_handler()) })
     }
diff --git a/rust-libs/modules/gva/dbs-reader/src/txs_history.rs b/rust-libs/modules/gva/dbs-reader/src/txs_history.rs
index 3633239db08a6de5c220f6206fc22691d1412d1c..57943ead7967b2e1792d9cfb13ea0dd6719fa320 100644
--- a/rust-libs/modules/gva/dbs-reader/src/txs_history.rs
+++ b/rust-libs/modules/gva/dbs-reader/src/txs_history.rs
@@ -14,7 +14,8 @@
 // along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 use crate::*;
-use duniter_dbs::{smallvec::SmallVec, WalletHashWithBnV1Db};
+use duniter_dbs::smallvec::SmallVec;
+use duniter_gva_db::WalletHashWithBnV1Db;
 
 #[derive(Clone, Copy, Debug, Default, Eq, Ord, PartialEq, PartialOrd)]
 pub struct TxBcCursor {
@@ -50,7 +51,7 @@ impl DbsReader {
         &self,
         page_info: PageInfo<TxBcCursor>,
         script_hash: Hash,
-    ) -> KvResult<PagedData<VecDeque<TxDbV2>>> {
+    ) -> KvResult<PagedData<VecDeque<GvaTxDbV1>>> {
         let mut start_k = WalletHashWithBnV1Db::new(script_hash, BlockNumber(0));
         let mut end_k = WalletHashWithBnV1Db::new(script_hash, BlockNumber(u32::MAX));
         let first_cursor_opt = if page_info.not_all() {
@@ -124,7 +125,7 @@ impl DbsReader {
                 .0
                 .txs_by_recipient()
                 .iter_ref_slice(start_k..=end_k, |_k, hashs| {
-                    let mut sent = SmallVec::<[TxDbV2; 8]>::new();
+                    let mut sent = SmallVec::<[GvaTxDbV1; 8]>::new();
                     for hash in hashs {
                         if let Some(tx_db) = self.0.txs().get(HashKeyV2::from_ref(hash))? {
                             sent.push(tx_db);
@@ -146,7 +147,7 @@ impl DbsReader {
                 .0
                 .txs_by_recipient()
                 .iter_ref_slice_rev(start_k..=end_k, |_k, hashs| {
-                    let mut sent = SmallVec::<[TxDbV2; 8]>::new();
+                    let mut sent = SmallVec::<[GvaTxDbV1; 8]>::new();
                     for hash in hashs {
                         if let Some(tx_db) = self.0.txs().get(HashKeyV2::from_ref(hash))? {
                             sent.push(tx_db);
@@ -169,7 +170,7 @@ impl DbsReader {
         &self,
         page_info: PageInfo<TxBcCursor>,
         script_hash: Hash,
-    ) -> KvResult<PagedData<VecDeque<TxDbV2>>> {
+    ) -> KvResult<PagedData<VecDeque<GvaTxDbV1>>> {
         let mut start_k = WalletHashWithBnV1Db::new(script_hash, BlockNumber(0));
         let mut end_k = WalletHashWithBnV1Db::new(script_hash, BlockNumber(u32::MAX));
         let first_cursor_opt = if page_info.not_all() {
@@ -247,7 +248,7 @@ impl DbsReader {
                 .0
                 .txs_by_issuer()
                 .iter_ref_slice(start_k..=end_k, |_k, hashs| {
-                    let mut sent = SmallVec::<[TxDbV2; 8]>::new();
+                    let mut sent = SmallVec::<[GvaTxDbV1; 8]>::new();
                     for hash in hashs {
                         if let Some(tx_db) = self.0.txs().get(HashKeyV2::from_ref(hash))? {
                             sent.push(tx_db);
@@ -269,7 +270,7 @@ impl DbsReader {
                 .0
                 .txs_by_issuer()
                 .iter_ref_slice_rev(start_k..=end_k, |_k, hashs| {
-                    let mut sent = SmallVec::<[TxDbV2; 8]>::new();
+                    let mut sent = SmallVec::<[GvaTxDbV1; 8]>::new();
                     for hash in hashs.iter().rev() {
                         if let Some(tx_db) = self.0.txs().get(HashKeyV2::from_ref(hash))? {
                             sent.push(tx_db);
@@ -321,14 +322,14 @@ impl DbsReader {
     }
 }
 
-fn txs_history_bc_collect<I: Iterator<Item = KvResult<TxDbV2>>>(
+fn txs_history_bc_collect<I: Iterator<Item = KvResult<GvaTxDbV1>>>(
     dbs_reader: DbsReader,
     first_cursor_opt: Option<TxBcCursor>,
     first_hashs_opt: Option<SmallVec<[Hash; 8]>>,
     last_cursor_opt: Option<TxBcCursor>,
     page_info: PageInfo<TxBcCursor>,
     txs_iter: I,
-) -> KvResult<PagedData<VecDeque<TxDbV2>>> {
+) -> KvResult<PagedData<VecDeque<GvaTxDbV1>>> {
     let mut txs = if let Some(limit) = page_info.limit_opt {
         txs_iter.take(limit).collect::<KvResult<VecDeque<_>>>()?
     } else {
@@ -384,8 +385,8 @@ fn txs_history_bc_collect<I: Iterator<Item = KvResult<TxDbV2>>>(
 
 // Needed for BMA only
 pub struct TxsHistory {
-    pub sent: Vec<TxDbV2>,
-    pub received: Vec<TxDbV2>,
+    pub sent: Vec<GvaTxDbV1>,
+    pub received: Vec<GvaTxDbV1>,
     pub sending: Vec<TransactionDocumentV10>,
     pub pending: Vec<TransactionDocumentV10>,
 }
@@ -403,7 +404,7 @@ pub fn get_transactions_history_for_bma<GvaDb: GvaV1DbReadable, TxsMpDb: TxsMpV2
     let sent = gva_db_ro
         .txs_by_issuer()
         .iter_ref_slice(start_k..end_k, |_k, hashs| {
-            let mut sent = SmallVec::<[TxDbV2; 2]>::new();
+            let mut sent = SmallVec::<[GvaTxDbV1; 2]>::new();
             for hash in hashs {
                 if let Some(tx_db) = gva_db_ro.txs().get(HashKeyV2::from_ref(hash))? {
                     sent.push(tx_db);
@@ -417,7 +418,7 @@ pub fn get_transactions_history_for_bma<GvaDb: GvaV1DbReadable, TxsMpDb: TxsMpV2
     let received = gva_db_ro
         .txs_by_recipient()
         .iter_ref_slice(start_k..end_k, |_k, hashs| {
-            let mut sent = SmallVec::<[TxDbV2; 2]>::new();
+            let mut sent = SmallVec::<[GvaTxDbV1; 2]>::new();
             for hash in hashs {
                 if let Some(tx_db) = gva_db_ro.txs().get(HashKeyV2::from_ref(hash))? {
                     sent.push(tx_db);
@@ -468,12 +469,12 @@ mod tests {
         documents::transaction::{TransactionDocumentV10, TransactionDocumentV10Stringified},
         documents_parser::prelude::FromStringObject,
     };
-    use duniter_dbs::databases::gva_v1::GvaV1DbWritable;
+    use duniter_gva_db::GvaV1DbWritable;
     use maplit::btreeset;
     use unwrap::unwrap;
 
-    fn gen_tx(hash: Hash, written_block_number: BlockNumber) -> TxDbV2 {
-        TxDbV2 {
+    fn gen_tx(hash: Hash, written_block_number: BlockNumber) -> GvaTxDbV1 {
+        GvaTxDbV1 {
             tx: unwrap!(TransactionDocumentV10::from_string_object(
                 &TransactionDocumentV10Stringified {
                     currency: "test".to_owned(),
@@ -500,7 +501,7 @@ mod tests {
 
     #[test]
     fn test_get_txs_history_bc_sent() -> KvResult<()> {
-        let gva_db = duniter_dbs::databases::gva_v1::GvaV1Db::<Mem>::open(MemConf::default())?;
+        let gva_db = duniter_gva_db::GvaV1Db::<Mem>::open(MemConf::default())?;
         let db_reader = create_dbs_reader(unsafe { std::mem::transmute(&gva_db.get_ro_handler()) });
 
         let s1 = WalletScriptV10::single_sig(PublicKey::default());
diff --git a/rust-libs/modules/gva/dbs-reader/src/uds_of_pubkey.rs b/rust-libs/modules/gva/dbs-reader/src/uds_of_pubkey.rs
index 873ba9e471f4508371fc9a1ba7a370b43dfc3775..669d3d5e7e9ce3394993354b433c72acd03e7cba 100644
--- a/rust-libs/modules/gva/dbs-reader/src/uds_of_pubkey.rs
+++ b/rust-libs/modules/gva/dbs-reader/src/uds_of_pubkey.rs
@@ -17,7 +17,7 @@ use crate::*;
 use duniter_dbs::smallvec::SmallVec;
 use duniter_dbs::{
     databases::bc_v2::{UdsEvent, UdsRevalEvent},
-    GvaIdtyDbV1, UdIdV2,
+    UdIdV2,
 };
 
 #[derive(Debug, Default)]
@@ -472,10 +472,8 @@ mod tests {
 
     use super::*;
     use duniter_dbs::smallvec::smallvec as svec;
-    use duniter_dbs::{
-        databases::{bc_v2::BcV2DbWritable, gva_v1::GvaV1DbWritable},
-        SourceAmountValV2, UdIdV2,
-    };
+    use duniter_dbs::{databases::bc_v2::BcV2DbWritable, SourceAmountValV2, UdIdV2};
+    use duniter_gva_db::GvaV1DbWritable;
     use std::iter::FromIterator;
 
     #[test]
@@ -538,7 +536,7 @@ mod tests {
 
         let bc_db = duniter_dbs::databases::bc_v2::BcV2Db::<Mem>::open(MemConf::default())?;
         let bc_db_ro = bc_db.get_ro_handler();
-        let gva_db = duniter_dbs::databases::gva_v1::GvaV1Db::<Mem>::open(MemConf::default())?;
+        let gva_db = duniter_gva_db::GvaV1Db::<Mem>::open(MemConf::default())?;
         let db_reader = create_dbs_reader(unsafe { std::mem::transmute(&gva_db.get_ro_handler()) });
         bc_db
             .uds_reval_write()
diff --git a/rust-libs/modules/gva/dbs-reader/src/utxos.rs b/rust-libs/modules/gva/dbs-reader/src/utxos.rs
index d7fa505352021ab90c62015b952aa92bd7a2a73e..902755ce5171851509af54898e2d84c0108ea3de 100644
--- a/rust-libs/modules/gva/dbs-reader/src/utxos.rs
+++ b/rust-libs/modules/gva/dbs-reader/src/utxos.rs
@@ -14,7 +14,7 @@
 // along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 use dubp::documents::dubp_wallet::prelude::*;
-use duniter_dbs::{GvaUtxoIdDbV1, SourceAmountValV2};
+use duniter_dbs::SourceAmountValV2;
 
 use crate::*;
 
@@ -251,14 +251,14 @@ where
 mod tests {
 
     use super::*;
-    use duniter_dbs::databases::gva_v1::GvaV1DbWritable;
     use duniter_dbs::databases::txs_mp_v2::TxsMpV2DbWritable;
+    use duniter_gva_db::GvaV1DbWritable;
 
     #[test]
     fn test_find_script_utxos() -> anyhow::Result<()> {
         let script = WalletScriptV10::single_sig(PublicKey::default());
 
-        let gva_db = duniter_dbs::databases::gva_v1::GvaV1Db::<Mem>::open(MemConf::default())?;
+        let gva_db = duniter_gva_db::GvaV1Db::<Mem>::open(MemConf::default())?;
         let db_reader = create_dbs_reader(unsafe { std::mem::transmute(&gva_db.get_ro_handler()) });
         let txs_mp_db =
             duniter_dbs::databases::txs_mp_v2::TxsMpV2Db::<Mem>::open(MemConf::default())?;
diff --git a/rust-libs/modules/gva/gql/Cargo.toml b/rust-libs/modules/gva/gql/Cargo.toml
index 50472efbabc54fb354c06c8925bc9a6847f4ff9f..58ee67e439828d7336a382070dde2eb1323230bd 100644
--- a/rust-libs/modules/gva/gql/Cargo.toml
+++ b/rust-libs/modules/gva/gql/Cargo.toml
@@ -14,6 +14,7 @@ dubp = { version = "0.34.0" }
 duniter-conf = { path = "../../../duniter-conf" }
 duniter-dbs = { path = "../../../duniter-dbs" }
 duniter-bc-reader = { path = "../../../duniter-bc-reader" }
+duniter-gva-db = { path = "../db" }
 duniter-gva-dbs-reader = { path = "../dbs-reader" }
 duniter-mempools = { path = "../../../duniter-mempools" }
 duniter-module = { path = "../../../duniter-module" }
diff --git a/rust-libs/modules/gva/gql/src/entities/tx_gva.rs b/rust-libs/modules/gva/gql/src/entities/tx_gva.rs
index baef6344e4a1ee0389534714e2032c7c2372c289..6fd3764338d17b728705c301a3383c08f243b6c1 100644
--- a/rust-libs/modules/gva/gql/src/entities/tx_gva.rs
+++ b/rust-libs/modules/gva/gql/src/entities/tx_gva.rs
@@ -13,9 +13,9 @@
 // You should have received a copy of the GNU Affero General Public License
 // along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
-use dubp::documents::transaction::TransactionDocumentV10Stringified;
-
 use crate::*;
+use dubp::documents::transaction::TransactionDocumentV10Stringified;
+use duniter_gva_db::GvaTxDbV1;
 
 #[derive(async_graphql::SimpleObject)]
 pub(crate) struct TxGva {
@@ -47,8 +47,8 @@ pub(crate) struct TxGva {
     pub written_time: Option<i64>,
 }
 
-impl From<TxDbV2> for TxGva {
-    fn from(db_tx: TxDbV2) -> Self {
+impl From<GvaTxDbV1> for TxGva {
+    fn from(db_tx: GvaTxDbV1) -> Self {
         let mut self_: TxGva = (&db_tx.tx).into();
         self_.written_block = Some(db_tx.written_block.to_string());
         self_.written_time = Some(db_tx.written_time);
diff --git a/rust-libs/modules/gva/gql/src/lib.rs b/rust-libs/modules/gva/gql/src/lib.rs
index b405760862033ef7a4a7ecf200eafd503d330fae..09cab530d8ee335f991c5d91c24ffda5e7ffd7bc 100644
--- a/rust-libs/modules/gva/gql/src/lib.rs
+++ b/rust-libs/modules/gva/gql/src/lib.rs
@@ -56,7 +56,7 @@ use dubp::documents_parser::prelude::*;
 use dubp::wallet::prelude::*;
 use duniter_dbs::databases::txs_mp_v2::TxsMpV2DbReadable;
 use duniter_dbs::prelude::*;
-use duniter_dbs::{kv_typed::prelude::*, FileBackend, TxDbV2};
+use duniter_dbs::{kv_typed::prelude::*, FileBackend};
 use duniter_gva_dbs_reader::pagination::PageInfo;
 #[cfg(not(test))]
 use duniter_gva_dbs_reader::DbsReader;
@@ -136,12 +136,12 @@ mod tests {
                 &self,
                 page_info: PageInfo<duniter_gva_dbs_reader::txs_history::TxBcCursor>,
                 script_hash: Hash,
-            ) -> KvResult<PagedData<VecDeque<TxDbV2>>>;
+            ) -> KvResult<PagedData<VecDeque<duniter_gva_db::GvaTxDbV1>>>;
             fn get_txs_history_bc_sent(
                 &self,
                 page_info: PageInfo<duniter_gva_dbs_reader::txs_history::TxBcCursor>,
                 script_hash: Hash,
-            ) -> KvResult<PagedData<VecDeque<TxDbV2>>>;
+            ) -> KvResult<PagedData<VecDeque<duniter_gva_db::GvaTxDbV1>>>;
             fn get_txs_history_mempool<TxsMpDb: 'static + TxsMpV2DbReadable>(
                 &self,
                 txs_mp_db_ro: &TxsMpDb,
diff --git a/rust-libs/modules/gva/gql/src/queries/txs_history.rs b/rust-libs/modules/gva/gql/src/queries/txs_history.rs
index 3084016708b2b897163860bba8e27f088b74ec57..0f855fe86a21dd995eb5da5662dbf1c07297485f 100644
--- a/rust-libs/modules/gva/gql/src/queries/txs_history.rs
+++ b/rust-libs/modules/gva/gql/src/queries/txs_history.rs
@@ -15,6 +15,7 @@
 
 use crate::*;
 use dubp::documents_parser::wallet_script_from_str;
+use duniter_gva_db::GvaTxDbV1;
 use duniter_gva_dbs_reader::txs_history::TxBcCursor;
 use futures::future::join;
 
@@ -84,7 +85,7 @@ impl TxsHistoryBlockchainQueryInner {
                     .into_iter()
                     .map(|db_tx| (TxDirection::Received, db_tx)),
             )
-            .collect::<Vec<(TxDirection, TxDbV2)>>();
+            .collect::<Vec<(TxDirection, GvaTxDbV1)>>();
         /*if let Some(TxBcCursor { tx_hash, .. }) = pagination.pos() {
             while both.txs
         }*/
@@ -229,7 +230,7 @@ mod tests {
     use dubp::documents::transaction::TransactionDocumentV10;
     use dubp::documents::transaction::TransactionDocumentV10Stringified;
     use dubp::documents_parser::prelude::FromStringObject;
-    use duniter_dbs::TxDbV2;
+    use duniter_gva_db::GvaTxDbV1;
     use duniter_gva_dbs_reader::pagination::PagedData;
 
     #[tokio::test]
@@ -264,7 +265,7 @@ mod tests {
                 )
                 .expect("wrong tx");
                 let mut expected_data = VecDeque::new();
-                expected_data.push_back(TxDbV2 {
+                expected_data.push_back(GvaTxDbV1 {
                     tx,
                     ..Default::default()
                 });
diff --git a/rust-libs/modules/gva/indexer/Cargo.toml b/rust-libs/modules/gva/indexer/Cargo.toml
index 5747bdc661dd490b74c347a8a3a72227b49dcfeb..7d3cbd23adbba98fdf80723c923f0a1bcc61111e 100644
--- a/rust-libs/modules/gva/indexer/Cargo.toml
+++ b/rust-libs/modules/gva/indexer/Cargo.toml
@@ -14,6 +14,7 @@ path = "src/lib.rs"
 [dependencies]
 anyhow = "1.0.34"
 duniter-dbs = { path = "../../../duniter-dbs" }
+duniter-gva-db = { path = "../db" }
 dubp = { version = "0.34.0" }
 once_cell = "1.5.2"
 resiter = "0.4.0"
diff --git a/rust-libs/modules/gva/indexer/src/identities.rs b/rust-libs/modules/gva/indexer/src/identities.rs
index 4815d39a96ef9444bba89d7a67b168cc91a62af8..0a33b376b0113412977700cc337c5eda5b586b5b 100644
--- a/rust-libs/modules/gva/indexer/src/identities.rs
+++ b/rust-libs/modules/gva/indexer/src/identities.rs
@@ -14,7 +14,6 @@
 // along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 use crate::*;
-use duniter_dbs::databases::gva_v1::GvaIdentitiesEvent;
 
 pub(crate) fn update_identities<B: Backend>(
     block: &DubpBlockV10,
diff --git a/rust-libs/modules/gva/indexer/src/lib.rs b/rust-libs/modules/gva/indexer/src/lib.rs
index 9ed890d4b7090abbe9a9cb44e518bc5f84a81863..8e39e42d1373b8fe46f52f407319c76849ca0337 100644
--- a/rust-libs/modules/gva/indexer/src/lib.rs
+++ b/rust-libs/modules/gva/indexer/src/lib.rs
@@ -33,13 +33,11 @@ use dubp::documents::{
     prelude::*, transaction::TransactionDocumentTrait, transaction::TransactionDocumentV10,
 };
 use dubp::wallet::prelude::*;
-use duniter_dbs::databases::gva_v1::*;
 use duniter_dbs::{
-    databases::gva_v1::{GvaV1Db, GvaV1DbReadable, GvaV1DbWritable},
-    kv_typed::prelude::*,
-    prelude::*,
-    FileBackend, HashKeyV2, PubKeyKeyV2, SourceAmountValV2, TxDbV2, WalletConditionsV2,
+    kv_typed::prelude::*, prelude::*, FileBackend, HashKeyV2, PubKeyKeyV2, SourceAmountValV2,
+    WalletConditionsV2,
 };
+use duniter_gva_db::*;
 use resiter::filter::Filter;
 use std::{
     collections::{BTreeSet, HashMap},
@@ -56,7 +54,7 @@ pub fn get_gva_db_ro(profile_path_opt: Option<&Path>) -> &'static GvaV1DbRo<File
 }
 pub fn get_gva_db_rw(profile_path_opt: Option<&Path>) -> &'static GvaV1Db<FileBackend> {
     GVA_DB_RW.get_or_init(|| {
-        duniter_dbs::databases::gva_v1::GvaV1Db::<FileBackend>::open(FileBackend::gen_backend_conf(
+        duniter_gva_db::GvaV1Db::<FileBackend>::open(FileBackend::gen_backend_conf(
             "gva_v1",
             profile_path_opt,
         ))
@@ -250,11 +248,9 @@ mod tests {
         documents::transaction::TransactionDocumentV10Stringified,
         documents_parser::prelude::FromStringObject,
     };
-    use duniter_dbs::GvaUtxoIdDbV1;
-
     #[test]
     fn test_gva_apply_block() -> anyhow::Result<()> {
-        let gva_db = duniter_dbs::databases::gva_v1::GvaV1Db::<Mem>::open(MemConf::default())?;
+        let gva_db = GvaV1Db::<Mem>::open(MemConf::default())?;
 
         let s1 = WalletScriptV10::single_sig(PublicKey::from_base58(
             "D9D2zaJoWYWveii1JRYLVK3J4Z7ZH3QczoKrnQeiM6mx",
diff --git a/rust-libs/modules/gva/indexer/src/tx.rs b/rust-libs/modules/gva/indexer/src/tx.rs
index ba0b62eb61068a862ef2d354723440913215526f..a2cb6b4a7447a6f2c0b2e32630a417463ea8c389 100644
--- a/rust-libs/modules/gva/indexer/src/tx.rs
+++ b/rust-libs/modules/gva/indexer/src/tx.rs
@@ -14,7 +14,6 @@
 // along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 use crate::*;
-use duniter_dbs::{databases::gva_v1::BalancesEvent, WalletHashWithBnV1Db};
 
 pub(crate) type ScriptsHash = HashMap<WalletScriptV10, Hash>;
 
@@ -140,7 +139,7 @@ pub(crate) fn apply_tx<B: Backend>(
                 // Insert tx itself
                 txs.upsert(
                     HashKeyV2(tx_hash),
-                    TxDbV2 {
+                    GvaTxDbV1 {
                         tx: tx.clone(),
                         written_block: current_blockstamp,
                         written_time: current_time,
@@ -315,7 +314,7 @@ mod tests {
         let o1_amount = ud0_amount - SourceAmount::with_base0(600);
         let o2_amount = ud0_amount - SourceAmount::with_base0(400);
 
-        let gva_db = duniter_dbs::databases::gva_v1::GvaV1Db::<Mem>::open(MemConf::default())?;
+        let gva_db = GvaV1Db::<Mem>::open(MemConf::default())?;
 
         let b0 = BlockMetaV2 {
             dividend: Some(ud0_amount),
diff --git a/rust-libs/modules/gva/indexer/src/utxos.rs b/rust-libs/modules/gva/indexer/src/utxos.rs
index b04ac63f34852e44035c2b5809589fb58a8a85ff..91ec82723ebb0c51605b05cd710739df339a15fd 100644
--- a/rust-libs/modules/gva/indexer/src/utxos.rs
+++ b/rust-libs/modules/gva/indexer/src/utxos.rs
@@ -14,11 +14,10 @@
 // along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 use crate::*;
-use duniter_dbs::GvaUtxoIdDbV1;
 
 pub(crate) fn write_utxo_v10<'s, B: Backend>(
-    scripts_by_pubkey: &mut TxColRw<B::Col, duniter_dbs::databases::gva_v1::ScriptsByPubkeyEvent>,
-    gva_utxos: &mut TxColRw<B::Col, duniter_dbs::databases::gva_v1::GvaUtxosEvent>,
+    scripts_by_pubkey: &mut TxColRw<B::Col, ScriptsByPubkeyEvent>,
+    gva_utxos: &mut TxColRw<B::Col, GvaUtxosEvent>,
     utxo: UtxoV10<'s>,
     utxo_script_hash: Hash,
 ) -> KvResult<()> {
@@ -49,8 +48,8 @@ pub(crate) fn write_utxo_v10<'s, B: Backend>(
 }
 
 pub(crate) fn remove_utxo_v10<B: Backend>(
-    scripts_by_pubkey: &mut TxColRw<B::Col, duniter_dbs::databases::gva_v1::ScriptsByPubkeyEvent>,
-    gva_utxos: &mut TxColRw<B::Col, duniter_dbs::databases::gva_v1::GvaUtxosEvent>,
+    scripts_by_pubkey: &mut TxColRw<B::Col, ScriptsByPubkeyEvent>,
+    gva_utxos: &mut TxColRw<B::Col, GvaUtxosEvent>,
     utxo_id: UtxoIdV10,
     utxo_script: &WalletScriptV10,
     utxo_script_hash: Hash,
diff --git a/rust-libs/modules/gva/src/lib.rs b/rust-libs/modules/gva/src/lib.rs
index f08943affefd1048d3a261f8f3817563c1add5b6..809b5953fff887a739d780b5ef1e3de92b223e74 100644
--- a/rust-libs/modules/gva/src/lib.rs
+++ b/rust-libs/modules/gva/src/lib.rs
@@ -32,12 +32,10 @@ use dubp::common::crypto::keys::{ed25519::PublicKey, KeyPair as _};
 use dubp::common::prelude::*;
 use dubp::documents::transaction::TransactionDocumentV10;
 use dubp::{block::DubpBlockV10, crypto::hashs::Hash};
-use duniter_dbs::databases::{
-    gva_v1::{GvaV1DbReadable, GvaV1DbRo},
-    txs_mp_v2::TxsMpV2DbReadable,
-};
+use duniter_dbs::databases::txs_mp_v2::TxsMpV2DbReadable;
 use duniter_dbs::prelude::*;
-use duniter_dbs::{kv_typed::prelude::*, FileBackend, TxDbV2};
+use duniter_dbs::{kv_typed::prelude::*, FileBackend};
+use duniter_gva_db::*;
 use duniter_gva_gql::GvaSchema;
 use duniter_gva_indexer::{get_gva_db_ro, get_gva_db_rw};
 use duniter_mempools::Mempools;
@@ -177,7 +175,7 @@ impl duniter_module::DuniterModule for GvaModule {
             sent: sent
                 .into_iter()
                 .map(
-                    |TxDbV2 {
+                    |GvaTxDbV1 {
                          tx,
                          written_block,
                          written_time,
@@ -187,7 +185,7 @@ impl duniter_module::DuniterModule for GvaModule {
             received: received
                 .into_iter()
                 .map(
-                    |TxDbV2 {
+                    |GvaTxDbV1 {
                          tx,
                          written_block,
                          written_time,