diff --git a/Cargo.lock b/Cargo.lock
index 031b3f4550758c9b421d34b60b4ca6c144ff9ec4..b246e363a78a8422c8eeb8dda61b597f9d61a28f 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -343,11 +343,6 @@ dependencies = [
  "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
-[[package]]
-name = "base58"
-version = "0.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
 [[package]]
 name = "base64"
 version = "0.9.3"
@@ -443,6 +438,11 @@ dependencies = [
  "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
+[[package]]
+name = "bs58"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
 [[package]]
 name = "bumpalo"
 version = "2.6.0"
@@ -838,9 +838,9 @@ dependencies = [
 name = "dup-crypto"
 version = "0.7.0"
 dependencies = [
- "base58 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "bincode 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "bs58 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "chacha20-poly1305-aead 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "clear_on_drop 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -1124,7 +1124,6 @@ dependencies = [
 name = "durs-network-documents"
 version = "0.4.0"
 dependencies = [
- "base58 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "bincode 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "dubp-common-doc 0.1.0",
  "dubp-currency-params 0.2.0",
@@ -3366,7 +3365,6 @@ dependencies = [
 "checksum awc 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "5e995283278dd3bf0449e7534e77184adb1570c0de8b6a50bf7c9d01ad8db8c4"
 "checksum backtrace 0.3.40 (registry+https://github.com/rust-lang/crates.io-index)" = "924c76597f0d9ca25d762c25a4d369d51267536465dc5064bdf0eb073ed477ea"
 "checksum backtrace-sys 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)" = "5d6575f128516de27e3ce99689419835fce9643a9b215a14d2b5b685be018491"
-"checksum base58 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5024ee8015f02155eee35c711107ddd9a9bf3cb689cf2a9089c97e79b6e1ae83"
 "checksum base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0b25d992356d2eb0ed82172f5248873db5560c4721f564b13cb5193bda5e668e"
 "checksum base64 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)" = "489d6c0ed21b11d038c31b6ceccca973e65d73ba3bd8ecb9a2babf5546164643"
 "checksum bincode 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b8ab639324e3ee8774d296864fbc0dbbb256cf1a41c490b94cba90c082915f92"
@@ -3376,6 +3374,7 @@ dependencies = [
 "checksum block-padding 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "fa79dedbb091f449f1f39e53edf88d5dbe95f895dae6135a8d7b881fb5af73f5"
 "checksum brotli-sys 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "4445dea95f4c2b41cde57cc9fee236ae4dbae88d8fcbdb4750fc1bb5d86aaecd"
 "checksum brotli2 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "0cb036c3eade309815c15ddbacec5b22c4d1f3983a774ab2eac2e3e9ea85568e"
+"checksum bs58 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b170cd256a3f9fa6b9edae3e44a7dfdfc77e8124dbc3e2612d75f9c3e2396dae"
 "checksum bumpalo 2.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ad807f2fc2bf185eeb98ff3a901bd46dc5ad58163d0fa4577ba0d25674d71708"
 "checksum byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7"
 "checksum byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a7c3dd8985a7111efc5c80b44e23ecdd8c007de8ade3b96595387e812b957cf5"
diff --git a/lib/crypto/Cargo.toml b/lib/crypto/Cargo.toml
index 497a2849bb393f2fb3e0a0432747ae155351eee1..bc0eca70d9587ef462f6a8388a450bfb07bd3425 100644
--- a/lib/crypto/Cargo.toml
+++ b/lib/crypto/Cargo.toml
@@ -13,8 +13,8 @@ edition = "2018"
 path = "src/lib.rs"
 
 [dependencies]
-base58 = "0.1.*"
 base64 = "0.10.*"
+bs58 = "0.3.0"
 byteorder = "1.2.3"
 chacha20-poly1305-aead = "0.1.2"
 clear_on_drop = "0.2.3"
diff --git a/lib/crypto/src/bases/b58.rs b/lib/crypto/src/bases/b58.rs
index 53686c245d28914adc20486480e47c3c3b144507..592f2076830d8e61573ed339cf1552a684805508 100644
--- a/lib/crypto/src/bases/b58.rs
+++ b/lib/crypto/src/bases/b58.rs
@@ -15,14 +15,17 @@
 
 //! Provide base58 convertion tools
 
-pub use base58::ToBase58;
-
 use crate::bases::BaseConvertionError;
-use base58::{FromBase58, FromBase58Error};
+
+/// Convert to base58 string
+pub trait ToBase58 {
+    /// Convert to base58 string
+    fn to_base58(&self) -> String;
+}
 
 /// Create an array of 32 bytes from a Base58 string.
 pub fn str_base58_to_32bytes(base58_data: &str) -> Result<[u8; 32], BaseConvertionError> {
-    match base58_data.from_base58() {
+    match bs58::decode(base58_data).into_vec() {
         Ok(result) => {
             if result.len() == 32 {
                 let mut u8_array = [0; 32];
@@ -37,15 +40,24 @@ pub fn str_base58_to_32bytes(base58_data: &str) -> Result<[u8; 32], BaseConverti
                 })
             }
         }
-        Err(FromBase58Error::InvalidBase58Character(character, offset)) => {
-            Err(BaseConvertionError::InvalidCharacter { character, offset })
+        Err(bs58::decode::Error::InvalidCharacter { character, index }) => {
+            Err(BaseConvertionError::InvalidCharacter {
+                character,
+                offset: index,
+            })
         }
-        Err(FromBase58Error::InvalidBase58Length) => {
+        Err(bs58::decode::Error::BufferTooSmall) => {
             Err(BaseConvertionError::InvalidBaseConverterLength)
         }
+        _ => Err(BaseConvertionError::UnknownError),
     }
 }
 
+/// Create a Base58 string from a slice of bytes.
+pub fn bytes_to_str_base58(bytes: &[u8]) -> String {
+    bs58::encode(bytes).into_string()
+}
+
 /*/// Create an array of 64bytes from a Base58 string.
 pub fn str_base58_to_64bytes(base58_data: &str) -> Result<[u8; 64], BaseConvertionError> {
     match base58_data.from_base58() {
diff --git a/lib/crypto/src/bases/mod.rs b/lib/crypto/src/bases/mod.rs
index 62dc0e8d48cbcfbadcda912b25bbcb345844506d..4bb0dc9f75b197aa65c1433a088387e7496c5988 100644
--- a/lib/crypto/src/bases/mod.rs
+++ b/lib/crypto/src/bases/mod.rs
@@ -57,6 +57,9 @@ pub enum BaseConvertionError {
         /// Offset (=position)
         offset: usize,
     },
+    /// Unknown error
+    #[fail(display = "Unknown error.")]
+    UnknownError,
 }
 
 impl From<base64::DecodeError> for BaseConvertionError {
diff --git a/lib/crypto/src/keys/ed25519.rs b/lib/crypto/src/keys/ed25519.rs
index e51c8304c7710e721a77ca31e7aac8acf2c71408..bd998df7226b6b0cf989299e148160b3fb551fa8 100644
--- a/lib/crypto/src/keys/ed25519.rs
+++ b/lib/crypto/src/keys/ed25519.rs
@@ -20,9 +20,9 @@
 //! [`KeyPairGenerator`]: struct.KeyPairGenerator.html
 
 use super::PublicKey as PublicKeyMethods;
+use crate::bases::b58::{bytes_to_str_base58, ToBase58};
 use crate::bases::*;
 use crate::seeds::Seed32;
-use base58::ToBase58;
 use base64;
 use clear_on_drop::clear::Clear;
 use ring::signature::{Ed25519KeyPair as RingKeyPair, KeyPair, UnparsedPublicKey, ED25519};
@@ -148,13 +148,13 @@ pub struct PublicKey(pub [u8; 32]);
 
 impl ToBase58 for PublicKey {
     fn to_base58(&self) -> String {
-        self.0.to_base58()
+        bytes_to_str_base58(&self.0[..])
     }
 }
 
 impl Display for PublicKey {
     fn fmt(&self, f: &mut Formatter) -> Result<(), fmt::Error> {
-        write!(f, "{}", self.to_base58())
+        write!(f, "{}", bytes_to_str_base58(&self.0[..]))
     }
 }
 
@@ -369,7 +369,6 @@ mod tests {
     use super::*;
     use crate::keys::{KeyPair, Sig, Signator, Signature};
     use crate::seeds::Seed32;
-    use base58::FromBase58;
     use bincode;
     use std::collections::hash_map::DefaultHasher;
 
@@ -430,7 +429,10 @@ mod tests {
                  "
             )
             .unwrap_err(),
-            BaseConvertionError::InvalidBaseConverterLength
+            BaseConvertionError::InvalidLength {
+                expected: 32,
+                found: 161
+            }
         );
     }
 
@@ -441,8 +443,8 @@ mod tests {
 
         // Test base58 encoding/decoding (loop for every bytes)
         assert_eq!(public_key.to_base58(), public58);
-        let public_raw = public58.from_base58().unwrap();
-        assert_eq!(public_raw, public_key.to_bytes_vector());
+        let public_raw = b58::str_base58_to_32bytes(public58).unwrap();
+        assert_eq!(public_raw.to_vec(), public_key.to_bytes_vector());
         for (key, raw) in public_key.0.iter().zip(public_raw.iter()) {
             assert_eq!(key, raw);
         }
@@ -488,7 +490,10 @@ mod tests {
                  "
             )
             .unwrap_err(),
-            BaseConvertionError::InvalidBaseConverterLength
+            BaseConvertionError::InvalidLength {
+                expected: 32,
+                found: 161
+            }
         );
     }
 
diff --git a/lib/crypto/src/keys/mod.rs b/lib/crypto/src/keys/mod.rs
index 0b90c88f1586750735eaefdd30cbf00516ee7cfa..f3a142e5fcbdee8c1ecf93ce1a01259522e2f16a 100644
--- a/lib/crypto/src/keys/mod.rs
+++ b/lib/crypto/src/keys/mod.rs
@@ -54,8 +54,8 @@ pub mod text_signable;
 
 pub use crate::seeds::Seed32;
 
+use crate::bases::b58::ToBase58;
 use crate::bases::BaseConvertionError;
-use base58::ToBase58;
 use durs_common_tools::fatal_error;
 use failure::Fail;
 use std::fmt::Debug;
diff --git a/lib/crypto/src/seeds.rs b/lib/crypto/src/seeds.rs
index 0dcca5eeaebb95f513c821981317d1fcd61af849..ea7a91ea5d2f7de3404a36382bb45734f738808d 100644
--- a/lib/crypto/src/seeds.rs
+++ b/lib/crypto/src/seeds.rs
@@ -15,8 +15,8 @@
 
 //! Provide wrappers around cryptographic seeds
 
+use crate::bases::b58::{bytes_to_str_base58, ToBase58};
 use crate::bases::*;
-use base58::ToBase58;
 use clear_on_drop::clear::Clear;
 use durs_common_tools::fatal_error;
 use log::error;
@@ -77,7 +77,7 @@ impl AsRef<[u8]> for Seed32 {
 
 impl ToBase58 for Seed32 {
     fn to_base58(&self) -> String {
-        self.0.to_base58()
+        bytes_to_str_base58(&self.0[..])
     }
 }
 
diff --git a/lib/dunp/network-documents/Cargo.toml b/lib/dunp/network-documents/Cargo.toml
index b1e327bac71a9ca6b86e2a308a2a0adc5d2cc43c..e0843e450446f01edaf87daa0f03698c24077ac5 100644
--- a/lib/dunp/network-documents/Cargo.toml
+++ b/lib/dunp/network-documents/Cargo.toml
@@ -12,7 +12,6 @@ edition = "2018"
 path = "src/lib.rs"
 
 [dependencies]
-base58 = "0.1.*"
 dubp-common-doc = { path = "../../dubp/common-doc" } #, version = "0.1.0" }
 dubp-currency-params = { path = "../../dubp/currency-params" }
 dubp-user-docs= { path = "../../dubp/user-docs" }
diff --git a/lib/dunp/network-documents/src/network_head_v3.rs b/lib/dunp/network-documents/src/network_head_v3.rs
index 1dddb956ac7fccadeae2f061c42646424788c634..109d09b2e2213dcee5ccd46dd5eb9fb773f0b08e 100644
--- a/lib/dunp/network-documents/src/network_head_v3.rs
+++ b/lib/dunp/network-documents/src/network_head_v3.rs
@@ -17,11 +17,11 @@
 
 use crate::network_head::NetworkHead;
 use crate::*;
-use base58::ToBase58;
 use dubp_common_doc::blockstamp::Blockstamp;
 use dubp_common_doc::traits::ToStringObject;
 use dubp_common_doc::{BlockHash, BlockNumber};
 use dubp_currency_params::CurrencyName;
+use dup_crypto::bases::b58::ToBase58;
 use dup_crypto::keys::text_signable::TextSignable;
 use dup_crypto::keys::*;
 use pest::iterators::Pair;
diff --git a/lib/dunp/network-documents/src/network_peer.rs b/lib/dunp/network-documents/src/network_peer.rs
index c125d4266a141db022f72321d7d9b49c0247a40d..2ea02da7c2f7ca7ed676905d1353e98a9c6010c8 100644
--- a/lib/dunp/network-documents/src/network_peer.rs
+++ b/lib/dunp/network-documents/src/network_peer.rs
@@ -17,11 +17,11 @@
 
 use crate::network_endpoint::*;
 use crate::*;
-use base58::ToBase58;
 use dubp_common_doc::blockstamp::Blockstamp;
 use dubp_common_doc::traits::ToStringObject;
 use dubp_common_doc::BlockNumber;
 use dubp_currency_params::CurrencyName;
+use dup_crypto::bases::b58::ToBase58;
 use dup_crypto::keys::text_signable::TextSignable;
 use dup_crypto::keys::*;
 use pest::iterators::Pair;