diff --git a/Cargo.lock b/Cargo.lock
index f73bbd70320c150054c3a3d0aa04530161277b07..b966b136042bca1ae6d779cf00b96d657c0cf539 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -622,9 +622,11 @@ dependencies = [
  "dirs 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
  "dubp-currency-params 0.2.0",
  "dup-crypto 0.7.0",
+ "durs-bc-db-reader 0.3.0-dev",
  "durs-blockchain 0.3.0-dev",
  "durs-common-tools 0.2.0",
  "durs-conf 0.3.0-dev",
+ "durs-dbs-tools 0.1.0-a",
  "durs-message 0.3.0-dev",
  "durs-module 0.3.0-dev",
  "durs-network 0.3.0-dev",
diff --git a/lib/core/core/Cargo.toml b/lib/core/core/Cargo.toml
index 86f6c5440444365360dc5eab1f16746cf6c25d84..555fd03ae89ce88a321d9106f333f6ec197d7e82 100644
--- a/lib/core/core/Cargo.toml
+++ b/lib/core/core/Cargo.toml
@@ -14,7 +14,9 @@ clear_on_drop = "0.2.3"
 dirs = "1.0.2"
 durs-blockchain = { path = "../../modules/blockchain/blockchain" }
 durs-common-tools = { path = "../../tools/common-tools" }
+durs-bc-db-reader = { path = "../../modules-lib/bc-db-reader" }
 durs-conf = { path = "../conf" }
+durs-dbs-tools = { path = "../../tools/dbs-tools" }
 dup-crypto = { path = "../../crypto" }
 dubp-currency-params = { path = "../../dubp/currency-params" }
 durs-message =  { path = "../message" }
diff --git a/lib/core/core/src/commands/mod.rs b/lib/core/core/src/commands/mod.rs
index bfe86cc7b54f4b756fd371129dc544893010ecba..0c51c03b966fd3f6b16bfcddd3bc0542702d61b1 100644
--- a/lib/core/core/src/commands/mod.rs
+++ b/lib/core/core/src/commands/mod.rs
@@ -21,10 +21,12 @@ pub mod modules;
 pub mod reset;
 pub mod start;
 
+use crate::constants::DEFAULT_USER_PROFILE;
 use crate::errors::DursCoreError;
 use crate::DursCore;
 pub use dbex::*;
 use durs_conf::DuRsConf;
+use durs_dbs_tools::kv_db::KvFileDbHandler;
 pub use durs_network::cli::sync::SyncOpt;
 pub use keys::KeysOpt;
 use log::Level;
@@ -47,6 +49,20 @@ pub struct DursCoreOptions {
     pub profiles_path: Option<PathBuf>,
 }
 
+impl DursCoreOptions {
+    /// Define profile path
+    #[inline]
+    pub fn define_profile_path(&self) -> PathBuf {
+        durs_conf::get_profile_path(
+            &self.profiles_path,
+            &self
+                .profile_name
+                .clone()
+                .unwrap_or_else(|| DEFAULT_USER_PROFILE.to_owned()),
+        )
+    }
+}
+
 /// Dunitrust executable command
 pub trait DursExecutableCoreCommand {
     /// Execute Dunitrust command
@@ -76,6 +92,14 @@ pub enum DursCommandEnum<T: ExecutableModuleCommand> {
 }
 
 impl<T: ExecutableModuleCommand> DursCommand<T> {
+    fn open_bc_db(&self, profile_path: &PathBuf) -> Result<KvFileDbHandler, DursCoreError> {
+        let bc_db_path = durs_conf::get_blockchain_db_path(profile_path.clone());
+        durs_dbs_tools::kv_db::KvFileDbHandler::open_db(
+            bc_db_path.as_path(),
+            &durs_bc_db_reader::bc_db_schema(),
+        )
+        .map_err(DursCoreError::FailOpenBcDb)
+    }
     /// Execute Dunitrust command
     pub fn execute<PlugFunc>(
         self,
@@ -86,12 +110,16 @@ impl<T: ExecutableModuleCommand> DursCommand<T> {
     where
         PlugFunc: FnMut(&mut DursCore<DuRsConf>) -> Result<(), DursCoreError>,
     {
+        let profile_path = self.options.define_profile_path();
+        let bc_db = self.open_bc_db(&profile_path)?;
+
         match self.command {
             DursCommandEnum::Core(core_cmd) => DursCore::execute_core_command(
+                bc_db,
                 core_cmd,
                 self.options,
-                vec![],
                 plug_modules,
+                profile_path,
                 soft_name,
                 soft_version,
             ),
diff --git a/lib/core/core/src/errors.rs b/lib/core/core/src/errors.rs
index 80d353745582a1287b5452fcbf9730c92bf859d8..9bd76606de2d8bb9f280fe0e02a5d08ff0ed288b 100644
--- a/lib/core/core/src/errors.rs
+++ b/lib/core/core/src/errors.rs
@@ -29,6 +29,9 @@ pub enum DursCoreError {
     /// Generic error that impl Fail
     #[fail(display = "{}", _0)]
     Error(Error),
+    /// Fail to open blockchain DB.
+    #[fail(display = "Fail to open blockchain DB: {:?}", _0)]
+    FailOpenBcDb(durs_dbs_tools::DbError),
     /// Fail to read currency params DB
     #[fail(display = "Fail to read currency params DB: {}", _0)]
     FailReadCurrencyParamsDb(CurrencyParamsDbError),
diff --git a/lib/core/core/src/lib.rs b/lib/core/core/src/lib.rs
index 8c0ad96623400cd27bd9eb539d07ac8284b999a4..583a10f88b3b609f4d8be694db1a8b32fb36a843 100644
--- a/lib/core/core/src/lib.rs
+++ b/lib/core/core/src/lib.rs
@@ -40,7 +40,6 @@ mod logger;
 mod router;
 
 use crate::commands::*;
-use crate::constants::DEFAULT_USER_PROFILE;
 use crate::errors::DursCoreError;
 use dubp_currency_params::CurrencyName;
 use durs_blockchain::{dbex::DbExQuery, BlockchainModule};
@@ -155,10 +154,11 @@ impl DursCore<DuRsConf> {
 
     /// Execute core command
     pub fn execute_core_command<PlugFunc>(
+        bc_db: durs_dbs_tools::kv_db::KvFileDbHandler,
         core_command: DursCoreCommand,
         durs_core_opts: DursCoreOptions,
-        external_followers: Vec<mpsc::Sender<DursMsg>>,
         mut plug_modules: PlugFunc,
+        profile_path: PathBuf,
         soft_name: &'static str,
         soft_version: &'static str,
     ) -> Result<(), DursCoreError>
@@ -168,8 +168,6 @@ impl DursCore<DuRsConf> {
         // Instantiate durs core
         let mut durs_core = DursCore::<DuRsConf>::init(soft_name, soft_version, durs_core_opts, 0)?;
 
-        let profile_path = durs_core.soft_meta_datas.profile_path.clone();
-
         /*
          * CORE COMMAND PROCESSING
          */
@@ -183,7 +181,6 @@ impl DursCore<DuRsConf> {
                     0,
                     profile_path.clone(),
                     durs_core.soft_meta_datas.conf.clone(),
-                    vec![],
                 ));
                 plug_modules(&mut durs_core)
             }
@@ -194,10 +191,9 @@ impl DursCore<DuRsConf> {
                     durs_core.run_duration_in_secs,
                     profile_path.clone(),
                     durs_core.soft_meta_datas.conf.clone(),
-                    external_followers,
                 ));
                 plug_modules(&mut durs_core)?;
-                durs_core.start()
+                durs_core.start(bc_db)
             }
             DursCoreCommand::SyncOpt(opts) => {
                 if opts.local_path.is_some() {
@@ -217,10 +213,9 @@ impl DursCore<DuRsConf> {
                         durs_core.run_duration_in_secs,
                         profile_path.clone(),
                         durs_core.soft_meta_datas.conf.clone(),
-                        external_followers,
                     ));
                     plug_modules(&mut durs_core)?;
-                    durs_core.start()
+                    durs_core.start(bc_db)
                 } else {
                     Err(DursCoreError::SyncWithoutSource)
                 }
@@ -238,13 +233,7 @@ impl DursCore<DuRsConf> {
         run_duration_in_secs: u64,
     ) -> Result<DursCore<DuRsConf>, DursCoreError> {
         // get profile path
-        let profile_path = durs_conf::get_profile_path(
-            &durs_core_opts.profiles_path,
-            &durs_core_opts
-                .profile_name
-                .clone()
-                .unwrap_or_else(|| DEFAULT_USER_PROFILE.to_owned()),
-        );
+        let profile_path = durs_core_opts.define_profile_path();
 
         // Init logger
         logger::init(
@@ -286,7 +275,10 @@ impl DursCore<DuRsConf> {
         })
     }
     /// Start durs server
-    pub fn start(mut self) -> Result<(), DursCoreError> {
+    pub fn start(
+        mut self,
+        bc_db: durs_dbs_tools::kv_db::KvFileDbHandler,
+    ) -> Result<(), DursCoreError> {
         if self.network_modules_count == 0 {
             fatal_error!(
                 "Dev error: no network module found: you must plug at least one network module !"
@@ -329,6 +321,7 @@ impl DursCore<DuRsConf> {
 
         // Instantiate blockchain module and load is conf
         let mut blockchain_module = BlockchainModule::load_blockchain_conf(
+            bc_db,
             router_sender.clone(),
             profile_path,
             RequiredKeysContent::MemberKeyPair(None),
diff --git a/lib/core/core/src/router.rs b/lib/core/core/src/router.rs
index acba54faf64e3b9e06c98bc6eec6204248f6acb1..5086e57221091731e0d816e0ca3b086349b0b876 100644
--- a/lib/core/core/src/router.rs
+++ b/lib/core/core/src/router.rs
@@ -41,7 +41,6 @@ enum DursMsgReceiver {
 fn start_broadcasting_thread(
     start_time: SystemTime,
     receiver: &mpsc::Receiver<RouterThreadMessage<DursMsg>>,
-    _external_followers: &[mpsc::Sender<DursMsg>],
 ) {
     // Define variables
     let mut modules_senders: HashMap<ModuleStaticName, mpsc::Sender<DursMsg>> = HashMap::new();
@@ -317,7 +316,6 @@ pub fn start_router(
     run_duration_in_secs: u64,
     profile_path: PathBuf,
     conf: DuRsConf,
-    external_followers: Vec<mpsc::Sender<DursMsg>>,
 ) -> mpsc::Sender<RouterThreadMessage<DursMsg>> {
     let start_time = SystemTime::now();
 
@@ -337,7 +335,7 @@ pub fn start_router(
 
         // Create broadcasting thread
         thread::spawn(move || {
-            start_broadcasting_thread(start_time, &broadcasting_receiver, &external_followers);
+            start_broadcasting_thread(start_time, &broadcasting_receiver);
         });
 
         // Create conf thread channel
diff --git a/lib/modules/blockchain/blockchain/src/dbex.rs b/lib/modules/blockchain/blockchain/src/dbex.rs
index 4dda821e85f64ceef1a72636c53e3cde5a84142c..65cc5165d99a779a83782c820b4b831ff9536d82 100644
--- a/lib/modules/blockchain/blockchain/src/dbex.rs
+++ b/lib/modules/blockchain/blockchain/src/dbex.rs
@@ -111,7 +111,7 @@ pub fn dbex_bc(profile_path: PathBuf, _csv: bool, _query: DbExBcQuery) -> Result
 
     // Open databases
     let load_dbs_begin = SystemTime::now();
-    let db = open_db(&db_path.as_path())?;
+    let db = durs_bc_db_reader::open_db_ro(&db_path.as_path())?;
 
     let load_dbs_duration = SystemTime::now()
         .duration_since(load_dbs_begin)
@@ -379,7 +379,7 @@ pub fn dbex_wot(profile_path: PathBuf, csv: bool, query: &DbExWotQuery) {
         }
         DbExWotQuery::ExpireMembers(ref reverse) => {
             // Open blockchain database
-            let db = open_db(&db_path.as_path()).expect("Fail to open DB.");
+            let db = durs_bc_db_reader::open_db_ro(&db_path.as_path()).expect("Fail to open DB.");
             // Get blocks_times
             let all_blocks = durs_bc_db_reader::readers::block::get_blocks_in_local_blockchain(
                 &db,
diff --git a/lib/modules/blockchain/blockchain/src/lib.rs b/lib/modules/blockchain/blockchain/src/lib.rs
index b71714b43bd8c7b21c82fabbc582905242d275d1..4706747be31fd845b1a3a66d54379b56e3b4c2c6 100644
--- a/lib/modules/blockchain/blockchain/src/lib.rs
+++ b/lib/modules/blockchain/blockchain/src/lib.rs
@@ -181,6 +181,7 @@ impl BlockchainModule {
     }
     /// Loading blockchain configuration
     pub fn load_blockchain_conf(
+        db: Db,
         router_sender: mpsc::Sender<RouterThreadMessage<DursMsg>>,
         profile_path: PathBuf,
         _keys: RequiredKeysContent,
@@ -189,7 +190,6 @@ impl BlockchainModule {
         let dbs_path = durs_conf::get_blockchain_db_path(profile_path.clone());
 
         // Open databases
-        let db = open_db(&dbs_path.as_path()).unwrap_or_else(|_| fatal_error!("Fail to open DB."));
         let fork_tree = durs_bc_db_reader::readers::current_meta_datas::get_fork_tree(&db)
             .unwrap_or_else(|_| fatal_error!("Fail to get fork tree."));
         let wot_databases = WotsV10DBs::open(Some(&dbs_path));
diff --git a/lib/modules/blockchain/blockchain/src/sync/download/json_reader_worker.rs b/lib/modules/blockchain/blockchain/src/sync/download/json_reader_worker.rs
index 11328f1cd76ac865d04d0d18512dec7af1d9891a..d288cca0c6247602542f9b6779d2e5788527aa22 100644
--- a/lib/modules/blockchain/blockchain/src/sync/download/json_reader_worker.rs
+++ b/lib/modules/blockchain/blockchain/src/sync/download/json_reader_worker.rs
@@ -96,7 +96,7 @@ pub fn json_reader_worker(
         // Get current local blockstamp
         debug!("Get local current blockstamp...");
         let db_path = durs_conf::get_blockchain_db_path(profile_path);
-        let db = open_db(&db_path).expect("Fail to open DB.");
+        let db = durs_bc_db_reader::open_db_ro(&db_path).expect("Fail to open DB.");
         let current_blockstamp: Blockstamp =
             durs_bc_db_reader::readers::current_meta_datas::get_current_blockstamp(&db)
                 .expect("get_current_blockstamp: Fail to read DB !")