diff --git a/.gitignore b/.gitignore
index 6dd12606baa2fd31f558354b9063d39f2ed1e903..f06b49a0e10c9eacff6fce8f7b95d7c1178fd8cd 100644
--- a/.gitignore
+++ b/.gitignore
@@ -4,8 +4,6 @@ node_modules/
 npm-debug.log
 bin/jpgp*.jar
 .idea/
-naclb/build
-naclb/node_modules
 gui/nw
 
 # Vim swap files
diff --git a/.npmignore b/.npmignore
index 05cac4f53afce72d178648595fa97793dd919270..58a82be1f7e211e5fc76b7030c0412982e08c05e 100644
--- a/.npmignore
+++ b/.npmignore
@@ -4,8 +4,6 @@ node_modules/
 npm-debug.log
 bin/jpgp*.jar
 .idea/
-naclb/build
-naclb/node_modules
 gui/nw
 
 # Vim swap files
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 2d5dcb627e1cca09682d68ff5c341dbd88fc891e..a5f419dde5966d56299ffbc792c1f75fa8b76818 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,9 +1,15 @@
+# CHANGELOG
+
 ## v1.8.0 (XX XXXX 2019)
 
 ### Highlights
+
 - Migration to Nodejs v10
 
 ### Code
+
+- [enh] migrate `naclb` to rust implementation `dup-crypto-rs`
+- [enh] migrate `wotb` to rust implementation `dubp-wot`
 - #1373: Support for Nodejs v10
 - #1372: `scryptb` removal
 - [enh] Upgrade TypeScript to 3.4.3
@@ -13,14 +19,17 @@
 - [enh] StatsDAL => replaced by LevelDB indexes
 
 ### BMA
+
 - [enh] Document `network/ws2p/heads`
 - [fix] In case of wrong network configuration, Duniter could crash on startup
 - [fix] `/branches` should not throw if current block does not exist
 
 ### CI
+
+- Add dockerisation in Duniter CI
 - Add g1 and gt control hash has changed to add `replayable_on`
 
-Thanks @c-geek, @Moul, @vtexier
+Thanks @c-geek, @librelois, @Moul, @vtexier
 
 ## v1.7.21: (12th Fev 2020)
 - #1394: Former member back in the WoT with only 4 certifiers
diff --git a/README.md b/README.md
index 0a5c460c976f0d51f975d80dfbaaeba62785f99a..410936dd8918f4495b47aabb55bf278337af30d4 100644
--- a/README.md
+++ b/README.md
@@ -62,7 +62,7 @@ If you wish to participate/debate on Duniter, you can:
 
 Duniter is using modules on different git repositories:
 
-- [WotB](https://git.duniter.org/libs/dubp-wot): compute Web of Trust.
+- [Duniteroxyde](https://git.duniter.org/nodes/typescript/duniteroxyde): Neon binding for rust DUBP libs.
 - [Debug](https://github.com/duniter/duniter-debug): debug tool.
 - [Web admin](https://git.duniter.org/nodes/typescript/modules/duniter-ui): web administration interface (optional).
 - [GVA](https://git.duniter.org/nodes/typescript/modules/gva-api): Future client API aimed to replace BMA. GVA stands for GraphQL Validation API.
diff --git a/app/lib/common-libs/constants.ts b/app/lib/common-libs/constants.ts
index c91a38579e0bc7b95ef7cf36056baceffc05c4ca..760d8969cd14914f852aa8e18197cca15e29b916 100755
--- a/app/lib/common-libs/constants.ts
+++ b/app/lib/common-libs/constants.ts
@@ -13,6 +13,8 @@
 
 "use strict";
 
+const G1           = "g1"
+const GT           = "g1-test"
 const CURRENCY     = "[a-zA-Z0-9-_ ]{2,50}"
 const BASE58       = "[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]+"
 const PUBKEY       = "[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{43,44}"
@@ -86,6 +88,9 @@ export const duniterDocument2str = (type:DuniterDocument) => {
 
 export const CommonConstants = {
 
+  G1,
+  GT,
+
   FORMATS: {
     CURRENCY,
     PUBKEY,
diff --git a/app/lib/common-libs/crypto/keyring.ts b/app/lib/common-libs/crypto/keyring.ts
index a20eb7a41a9e6c6d986e55acfe97d918ec8b5924..a6b045d49e3b6b8b05d2e094d1d80db49e76b2d1 100644
--- a/app/lib/common-libs/crypto/keyring.ts
+++ b/app/lib/common-libs/crypto/keyring.ts
@@ -11,14 +11,7 @@
 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 // GNU Affero General Public License for more details.
 
-import {Base58decode, Base58encode} from "./base58"
-import {decodeBase64, decodeUTF8, encodeBase64} from "./nacl-util"
-
-const nacl        = require('tweetnacl');
-const seedrandom  = require('seedrandom');
-const naclBinding = require('naclb');
-
-const crypto_sign_BYTES = 64;
+import {KeyPairBuilder, generateRandomSeed, seedToSecretKey} from "duniteroxyde"
 
 export class Key {
 
@@ -39,10 +32,6 @@ export class Key {
     return this.sec
   }
 
-  private rawSec() {
-    return Base58decode(this.secretKey)
-  }
-
   json() {
     return {
       pub: this.publicKey,
@@ -50,78 +39,22 @@ export class Key {
     }
   }
 
-  signBuggy(msg:string) {
-    return Promise.resolve(this.signSyncBuggy(msg))
-  }
-
-  signSyncBuggy(msg:string) {
-    const m = decodeUTF8(msg);
-    const signedMsg = naclBinding.sign(m, this.rawSec());
-    const sig = new Uint8Array(crypto_sign_BYTES);
-    for (let i = 0; i < sig.length; i++) {
-      sig[i] = signedMsg[i];
-    }
-    return encodeBase64(sig)
-  };
-
   sign(msg:string) {
     return Promise.resolve(this.signSync(msg))
   }
 
   signSync(msg:string) {
-    const m = decodeUTF8(msg);
-    const signedMsg = nacl.sign(m, this.rawSec());
-    const sig = new Uint8Array(crypto_sign_BYTES);
-    for (let i = 0; i < sig.length; i++) {
-      sig[i] = signedMsg[i];
-    }
-    return encodeBase64(sig)
+    const signator = KeyPairBuilder.fromSecretKey(this.secretKey);
+    return signator.sign(msg);
   };
 }
 
 export function randomKey() {
-  const byteseed = new Uint8Array(32)
-  for (let i = 0; i < 32; i++) {
-    byteseed[i] = Math.floor(seedrandom()() *  255) + 1
-  }
-  const keypair = nacl.sign.keyPair.fromSeed(byteseed)
+  const seed = generateRandomSeed();
+  const secretKey = seedToSecretKey(seed);
+  const keypair = KeyPairBuilder.fromSecretKey(secretKey);
   return new Key(
-    Base58encode(new Buffer(keypair.publicKey)),
-    Base58encode(new Buffer(keypair.secretKey))
+    keypair.getPublicKey(),
+    secretKey,
   )
 }
-
-export function KeyGen(pub:string, sec:string) {
-  return new Key(pub, sec)
-}
-
-/**
- * Verify a signature against data & public key.
- * Return true of false as callback argument.
- */
-export function verifyBuggy(rawMsg:string, rawSig:string, rawPub:string) {
-  const msg = decodeUTF8(rawMsg);
-  const sig = decodeBase64(rawSig);
-  const pub = Base58decode(rawPub);
-  const m = new Uint8Array(crypto_sign_BYTES + msg.length);
-  const sm = new Uint8Array(crypto_sign_BYTES + msg.length);
-  let i;
-  for (i = 0; i < crypto_sign_BYTES; i++) sm[i] = sig[i];
-  for (i = 0; i < msg.length; i++) sm[i+crypto_sign_BYTES] = msg[i];
-
-  // Call to verification lib...
-  return naclBinding.verify(m, sm, pub);
-}
-
-/**
- * Verify a signature against data & public key.
- * Return true of false as callback argument.
- */
-export function verify(rawMsg:string, rawSig:string, rawPub:string) {
-  const msg = decodeUTF8(rawMsg);
-  const sig = decodeBase64(rawSig);
-  const pub = Base58decode(rawPub);
-
-  // Call to verification lib...
-  return nacl.sign.detached.verify(msg, sig, pub);
-}
diff --git a/app/lib/dto/TransactionDTO.ts b/app/lib/dto/TransactionDTO.ts
index 64fcd3ed96a1324db9ad7dff5c014e5d80f58332..45e6b3749e5ffdf9c35e7e3236fc8dd6cae37af2 100644
--- a/app/lib/dto/TransactionDTO.ts
+++ b/app/lib/dto/TransactionDTO.ts
@@ -13,7 +13,7 @@
 
 import {hashf} from "../common"
 import {Cloneable} from "./Cloneable"
-import {verify, verifyBuggy} from "../common-libs/crypto/keyring"
+import {verify} from "duniteroxyde"
 
 export interface BaseDTO {
   base: number
@@ -248,7 +248,8 @@ export class TransactionDTO implements Cloneable {
       if (dubp_version >= 12) {
         sigResult.sigs[i].ok = verify(raw, sig, pub)
       } else {
-        sigResult.sigs[i].ok = verifyBuggy(raw, sig, pub)
+        // TODO ESZ list all invalid transactions
+        sigResult.sigs[i].ok = verify(raw, sig, pub)
       }
       matching = sigResult.sigs[i].ok 
       i++
diff --git a/app/lib/indexer.ts b/app/lib/indexer.ts
index dc602ee75d5b4bb7a255a2bb954d353309d6d065..ac397110faff7e0c41d57c1fa5817c9e9010351f 100644
--- a/app/lib/indexer.ts
+++ b/app/lib/indexer.ts
@@ -18,7 +18,7 @@ import {RevocationDTO} from "./dto/RevocationDTO"
 import {CertificationDTO} from "./dto/CertificationDTO"
 import {TransactionDTO} from "./dto/TransactionDTO"
 import {DBHead} from "./db/DBHead"
-import {verifyBuggy} from "./common-libs/crypto/keyring"
+import {verify} from "duniteroxyde"
 import {rawer, txunlock} from "./common-libs/index"
 import {CommonConstants} from "./common-libs/constants"
 import {MembershipDTO} from "./dto/MembershipDTO"
@@ -2086,7 +2086,7 @@ async function sigCheckRevoke(entry: MindexEntry, dal: FileDAL, currency: string
       sig: idty.sig,
       revocation: ''
     });
-    let sigOK = verifyBuggy(rawRevocation, sig, pubkey);
+    let sigOK = verify(rawRevocation, sig, pubkey);
     if (!sigOK) {
       throw Error("Revocation signature must match");
     }
@@ -2141,7 +2141,7 @@ async function checkCertificationIsValid (block: BlockDTO, cert: CindexEntry, fi
           buid: buid,
           sig: ''
         })
-        const verified = verifyBuggy(raw, cert.sig, cert.issuer);
+        const verified = verify(raw, cert.sig, cert.issuer);
         if (!verified) {
           throw constants.ERRORS.WRONG_SIGNATURE_FOR_CERT
         }
diff --git a/app/lib/rules/global_rules.ts b/app/lib/rules/global_rules.ts
index 21779706ac242ef610004fd1b321625be956fe19..3004a16494dd7243f101ea7363c222997ad7687c 100644
--- a/app/lib/rules/global_rules.ts
+++ b/app/lib/rules/global_rules.ts
@@ -16,7 +16,7 @@ import {FileDAL} from "../dal/fileDAL"
 import {DBBlock} from "../db/DBBlock"
 import {TransactionDTO, TxSignatureResult} from "../dto/TransactionDTO"
 import {BlockDTO} from "../dto/BlockDTO"
-import {verifyBuggy} from "../common-libs/crypto/keyring"
+import {verify} from "duniteroxyde"
 import {rawer, txunlock} from "../common-libs/index"
 import {CommonConstants} from "../common-libs/constants"
 import {IdentityDTO} from "../dto/IdentityDTO"
@@ -322,7 +322,7 @@ async function checkCertificationShouldBeValid (block:{ number:number, currency:
         buid: buid,
         sig: ''
       })
-      const verified = verifyBuggy(raw, cert.sig, cert.from);
+      const verified = verify(raw, cert.sig, cert.from);
       if (!verified) {
         throw constants.ERRORS.WRONG_SIGNATURE_FOR_CERT
       }
diff --git a/app/lib/rules/local_rules.ts b/app/lib/rules/local_rules.ts
index ad297305314e69a7c8d09ad1f3f3d913e5d67eaf..933e6b394c4b0fdd7aec3a8f7415e6ca21c82557 100644
--- a/app/lib/rules/local_rules.ts
+++ b/app/lib/rules/local_rules.ts
@@ -16,7 +16,7 @@ import {ConfDTO} from "../dto/ConfDTO"
 import {CindexEntry, IndexEntry, Indexer, MindexEntry, SindexEntry} from "../indexer"
 import {BaseDTO, TransactionDTO} from "../dto/TransactionDTO"
 import {DBBlock} from "../db/DBBlock"
-import {verify, verifyBuggy} from "../common-libs/crypto/keyring"
+import {verify} from "duniteroxyde"
 import {hashf} from "../common"
 import {CommonConstants} from "../common-libs/constants"
 import {IdentityDTO} from "../dto/IdentityDTO"
@@ -27,6 +27,10 @@ import {FileDAL} from "../dal/fileDAL"
 const constants       = CommonConstants
 const maxAcceleration = require('./helpers').maxAcceleration
 
+const INVALID_G1_BLOCKS = new Set([15144, 31202, 85448, 87566, 90830, 109327, 189835, 199172, 221274, 253582]);
+const INVALID_GT_BLOCKS = new Set([24316, 62067, 62551, 93288, 173118, 183706, 196196, 246027, 247211, 263207,
+  307038, 328741, 335914, 377316, 395714, 396024, 407913, 422366, 496751]);
+
 export const LOCAL_RULES_FUNCTIONS = {
 
   checkParameters: async (block:BlockDTO) => {
@@ -88,12 +92,28 @@ export const LOCAL_RULES_FUNCTIONS = {
 
   checkBlockSignature: async (block:BlockDTO) => {
     // Historically, Duniter used a buggy version of TweetNaCl (see #1390)
-    // Starting with the v12 blocks, Duniter uses a fixed version of TweetNaCl. 
-    if (block.version >= 12 && !verify(block.getSignedPart(), block.signature, block.issuer)) {
-      throw Error('Block\'s signature must match');
-    } else if (!verifyBuggy(block.getSignedPart(), block.signature, block.issuer)) {
-      throw Error('Block\'s signature must match');
+    // Starting with the v12 blocks, Duniter uses a fixed version of TweetNaCl.
+    if (!verify(block.getSignedPart(), block.signature, block.issuer)) {
+      if (block.version >= 12) {
+        throw Error('Block\'s signature must match');
+      }
+      // If DUBP < v12, block may have invalid signature
+      else if (block.currency === constants.G1) {
+        if (!INVALID_G1_BLOCKS.has(block.number)) {
+          throw Error('Block\'s signature must match');
+        }
+      }
+      else if (block.currency === constants.GT) {
+        if (!INVALID_GT_BLOCKS.has(block.number)) {
+          throw Error('Block\'s signature must match');
+        }
+      }
+      // Unknown currencies must have valid signature
+      else {
+        throw Error('Block\'s signature must match');
+      }
     }
+
     return true;
   },
 
@@ -113,7 +133,7 @@ export const LOCAL_RULES_FUNCTIONS = {
     while (!wrongSig && i < block.identities.length) {
       const idty = IdentityDTO.fromInline(block.identities[i]);
       idty.currency = block.currency;
-      wrongSig = !verifyBuggy(idty.rawWithoutSig(), idty.sig, idty.pubkey);
+      wrongSig = !verify(idty.rawWithoutSig(), idty.sig, idty.pubkey);
       if (wrongSig) {
         throw Error('Identity\'s signature must match');
       }
@@ -444,7 +464,7 @@ function getTransactionDepth(txHash:string, sindex:SindexShortEntry[], localDept
 }
 
 function checkSingleMembershipSignature(ms:any) {
-  return verifyBuggy(ms.getRaw(), ms.signature, ms.issuer);
+  return verify(ms.getRaw(), ms.signature, ms.issuer);
 }
 
 function checkBunchOfTransactions(transactions:TransactionDTO[], conf:ConfDTO, medianTime: number, options?:{ dontCareAboutChaining?:boolean }){
diff --git a/app/modules/crawler/lib/req2fwd.ts b/app/modules/crawler/lib/req2fwd.ts
index 113b1e38c0004d3c84b2ce355d15a73793fc9ace..8e7519030871b9b9912b597f959c15df65e9d971 100644
--- a/app/modules/crawler/lib/req2fwd.ts
+++ b/app/modules/crawler/lib/req2fwd.ts
@@ -12,7 +12,7 @@
 // GNU Affero General Public License for more details.
 
 import {Contacter} from "./contacter"
-import {verifyBuggy} from "../../../lib/common-libs/crypto/keyring"
+import {verify} from "duniteroxyde"
 import {rawer} from "../../../lib/common-libs/index"
 import {HttpRequirements} from "../../bma/lib/dtos"
 
@@ -80,7 +80,7 @@ export const req2fwd = async (requirements: HttpRequirements, toHost:string, toP
             buid: received.blockstamp
           });
           try {
-            const chkSig = verifyBuggy(rawCertNoSig, received.sig, received.from)
+            const chkSig = verify(rawCertNoSig, received.sig, received.from)
             if (!chkSig) {
               throw "Wrong signature for certification?!"
             }
diff --git a/app/modules/crawler/lib/sync/RemoteSynchronizer.ts b/app/modules/crawler/lib/sync/RemoteSynchronizer.ts
index b430582cb3884ca3f52ae373b5e42a6fde436481..b6307ee0d717128db405c984d1c459744161ded9 100644
--- a/app/modules/crawler/lib/sync/RemoteSynchronizer.ts
+++ b/app/modules/crawler/lib/sync/RemoteSynchronizer.ts
@@ -35,7 +35,7 @@ import {WS2PRequester} from "../../../ws2p/lib/WS2PRequester"
 import {WS2PMessageHandler} from "../../../ws2p/lib/impl/WS2PMessageHandler"
 import {WS2PResponse} from "../../../ws2p/lib/impl/WS2PResponse"
 import {DataErrors} from "../../../../lib/common-libs/errors"
-import {KeyGen} from "../../../../lib/common-libs/crypto/keyring"
+import {Key} from "../../../../lib/common-libs/crypto/keyring"
 import {WS2PRemoteContacter} from "./WS2PRemoteContacter"
 import {Keypair} from "../../../../lib/dto/ConfDTO"
 
@@ -141,7 +141,7 @@ export class RemoteSynchronizer extends AbstractSynchronizer {
 
       // If BMA is unreachable and the connection is not marked as strict BMA, let's try WS2P
       if (!api && access.isBMA !== true) {
-        const pair = KeyGen(keypair.pub, keypair.sec)
+        const pair = new Key(keypair.pub, keypair.sec)
         const connection = WS2PConnection.newConnectionToAddress(1,
           `ws://${host}:${port}${path && ' ' + path || ''}`,
           new (class SyncMessageHandler implements WS2PMessageHandler {
diff --git a/app/modules/prover/lib/blockGenerator.ts b/app/modules/prover/lib/blockGenerator.ts
index 45529c4106eb3dad6fdf60aed8aa4e79e4833f12..92dbd81e321ced5b8bebb3cb93e2264dc70bd1c5 100644
--- a/app/modules/prover/lib/blockGenerator.ts
+++ b/app/modules/prover/lib/blockGenerator.ts
@@ -19,7 +19,7 @@ import {GLOBAL_RULES_HELPERS} from "../../../lib/rules/global_rules"
 import {LOCAL_RULES_HELPERS} from "../../../lib/rules/local_rules"
 import {Indexer} from "../../../lib/indexer"
 import {DBBlock} from "../../../lib/db/DBBlock"
-import {verifyBuggy} from "../../../lib/common-libs/crypto/keyring"
+import {verify} from "duniteroxyde"
 import {rawer} from "../../../lib/common-libs/index"
 import {hashf} from "../../../lib/common"
 import {CommonConstants} from "../../../lib/common-libs/constants"
@@ -380,7 +380,7 @@ export class BlockGenerator {
     const idty = IdentityDTO.fromJSONObject(identity);
     idty.currency = this.conf.currency;
     const createIdentity = idty.rawWithoutSig();
-    const verified = verifyBuggy(createIdentity, idty.sig, idty.pubkey);
+    const verified = verify(createIdentity, idty.sig, idty.pubkey);
     if (!verified) {
       throw constants.ERRORS.IDENTITY_WRONGLY_SIGNED;
     }
@@ -761,7 +761,7 @@ class NextBlockGenerator implements BlockGeneratorInterface {
             idty_sig: targetIdty.sig,
             buid: current ? [cert.block_number, targetBlock.hash].join('-') : CommonConstants.SPECIAL_BLOCK,
           }).getRawUnSigned();
-          if (verifyBuggy(rawCert, certSig, cert.from)) {
+          if (verify(rawCert, certSig, cert.from)) {
             cert.sig = certSig;
             let exists = false;
             if (current) {
diff --git a/app/modules/prover/lib/proof.ts b/app/modules/prover/lib/proof.ts
index 1d723da5f768c7661b09c167407d5904949a0982..f99d53aba5d1a751ff209bca6226bf4b22752fb0 100644
--- a/app/modules/prover/lib/proof.ts
+++ b/app/modules/prover/lib/proof.ts
@@ -17,7 +17,7 @@ import {hashf} from "../../../lib/common"
 import {DBBlock} from "../../../lib/db/DBBlock"
 import {ConfDTO} from "../../../lib/dto/ConfDTO"
 import {ProverConstants} from "./constants"
-import {KeyGen, verify, verifyBuggy} from "../../../lib/common-libs/crypto/keyring"
+import {Ed25519Signator, KeyPairBuilder} from "duniteroxyde"
 import {dos2unix} from "../../../lib/common-libs/dos2unix"
 import {rawer} from "../../../lib/common-libs/index"
 import {ProcessCpuProfiler} from "../../../ProcessCpuProfiler"
@@ -37,7 +37,6 @@ export function createPowWorker() {
   let prefix = 0;
 
   let sigFuncSaved: (msg:string) => string; 
-  let verifyFuncSaved: (msg:string, sig:string) => boolean;
   let lastSecret:any, lastVersion: number, currentCPU:number = 1;
 
   process.on('uncaughtException', (err:any) => {
@@ -119,27 +118,13 @@ export function createPowWorker() {
       const highMark = stuff.highMark;
 
       // Define sigFunc
-      // Use Buggy version for performance reasons
+      const signator = KeyPairBuilder.fromSecretKey(pair.sec);
       let sigFunc = null;
       if (sigFuncSaved && lastSecret === pair.sec) {
         sigFunc = sigFuncSaved;
       } else {
         lastSecret = pair.sec;
-        sigFunc = (msg:string) => KeyGen(pair.pub, pair.sec).signSyncBuggy(msg)
-      }
-
-      // Define verifyFunc
-      let verifyFunc = null;
-      if (verifyFuncSaved && lastSecret === pair.sec && lastVersion === block.version) {
-        verifyFunc = verifyFuncSaved;
-      } else {
-        lastSecret = pair.sec;
-        lastVersion = block.version;
-        if (block.version >= 12) {
-          verifyFunc = (msg:string, sig:string) => verify(msg, sig, pair.pub)
-        } else {
-          verifyFunc = (msg:string, sig:string) => verifyBuggy(msg, sig, pair.pub)
-        }
+        sigFunc = (msg:string) => signator.sign(msg)
       }
       
       /*****************
@@ -212,12 +197,6 @@ export function createPowWorker() {
               }
               if (charOK) {
                 found = !!(pow[nbZeros].match(new RegExp('[0-' + highMark + ']')))
-                if (found) {
-                  let sigOk = verifyFunc(raw, sig);
-                  if (!sigOk) {
-                    found = false;
-                  }
-                }
               }
               if (!found && nbZeros > 0 && j - 1 >= ProverConstants.POW_MINIMAL_TO_SHOW) {
                 pSend({ pow: { pow: pow, block: block, nbZeros: nbZeros }});
diff --git a/app/modules/ws2p/lib/WS2PCluster.ts b/app/modules/ws2p/lib/WS2PCluster.ts
index b5eced67809cd26869d0edaccdeb725008fd2ab1..7dad2898b9bb516888386b679e1be5ab56c3c9fa 100644
--- a/app/modules/ws2p/lib/WS2PCluster.ts
+++ b/app/modules/ws2p/lib/WS2PCluster.ts
@@ -24,7 +24,8 @@ import {WS2PConstants} from "./constants"
 import {PeerDTO, WS2PEndpoint} from '../../../lib/dto/PeerDTO';
 import {GlobalFifoPromise} from "../../../service/GlobalFifoPromise"
 import {OtherConstants} from "../../../lib/other_constants"
-import {Key, verifyBuggy} from "../../../lib/common-libs/crypto/keyring"
+import {Key} from "../../../lib/common-libs/crypto/keyring"
+import {verify} from "duniteroxyde"
 import {WS2PServerMessageHandler} from "./interface/WS2PServerMessageHandler"
 import {WS2PMessageHandler} from "./impl/WS2PMessageHandler"
 import {CommonConstants} from '../../../lib/common-libs/constants';
@@ -208,8 +209,8 @@ export class WS2PCluster {
       ) {
         const head:WS2PHead = { message: h.message, sig: h.sig, messageV2: h.messageV2, sigV2: h.sigV2, step: h.step }
 
-        const sigOK = verifyBuggy(head.message, head.sig, pub)
-        const sigV2OK = (head.messageV2 !== undefined && head.sigV2 !== undefined) ? verifyBuggy(head.messageV2, head.sigV2, pub):false
+        const sigOK = verify(head.message, head.sig, pub)
+        const sigV2OK = (head.messageV2 !== undefined && head.sigV2 !== undefined) ? verify(head.messageV2, head.sigV2, pub):false
         if ((sigV2OK && sigOK) || sigOK) {
           // Already known or more recent or closer ?
           const step = (this.headsCache[fullId]) ? this.headsCache[fullId].step || 0:0
@@ -605,9 +606,9 @@ export class WS2PCluster {
     const prefix = this.server.conf.prefix || ProverConstants.DEFAULT_PEER_ID
     const { freeMemberRoom , freeMirorRoom }  = await this.countFreeRooms()
     const message = `${api}:HEAD:1:${key.publicKey}:${number}-${hash}:${ws2pId}:${software}:${softVersion}:${prefix}`
-    const sig = key.signSyncBuggy(message)
+    const sig = key.signSync(message)
     const messageV2 = `${api}:HEAD:2:${key.publicKey}:${number}-${hash}:${ws2pId}:${software}:${softVersion}:${prefix}:${freeMemberRoom}:${freeMirorRoom}`
-    const sigV2 = key.signSyncBuggy(messageV2)
+    const sigV2 = key.signSync(messageV2)
     
     const myHead:WS2PHead = {
       message,
diff --git a/app/modules/ws2p/lib/WS2PConnection.ts b/app/modules/ws2p/lib/WS2PConnection.ts
index cde3a4ae6e07c75b53c64ba9daea508fe4ebcb6c..2d124371bb03e71229eb26ff1f1fdb097ac39dfe 100644
--- a/app/modules/ws2p/lib/WS2PConnection.ts
+++ b/app/modules/ws2p/lib/WS2PConnection.ts
@@ -11,7 +11,8 @@
 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 // GNU Affero General Public License for more details.
 
-import {Key, verifyBuggy} from "../../../lib/common-libs/crypto/keyring"
+import {Key} from "../../../lib/common-libs/crypto/keyring"
+import {verify} from "duniteroxyde"
 import {WS2PMessageHandler} from "./impl/WS2PMessageHandler"
 import {BlockDTO} from "../../../lib/dto/BlockDTO"
 import {IdentityDTO} from "../../../lib/dto/IdentityDTO"
@@ -129,7 +130,7 @@ export class WS2PPubkeyRemoteAuth implements WS2PRemoteAuth {
   async sendACK(ws: any): Promise<void> {
     const challengeMessage = `WS2P:ACK:${this.currency}:${this.pair.pub}:${this.challenge}`
     Logger.log('sendACK >>> ' + challengeMessage)
-    const sig = this.pair.signSyncBuggy(challengeMessage)
+    const sig = this.pair.signSync(challengeMessage)
     await ws.send(JSON.stringify({
       auth: 'ACK',
       pub: this.pair.pub,
@@ -153,7 +154,7 @@ export class WS2PPubkeyRemoteAuth implements WS2PRemoteAuth {
     this.givenCurrency.resolve(this.currency)
     const challengeMessage = (ws2pVersion > 1) ? `WS2P:${type}:${this.currency}:${pub}:${ws2pId}:${challenge}`:`WS2P:${type}:${this.currency}:${pub}:${challenge}`
     Logger.log('registerCONNECT >>> ' + challengeMessage)
-    const verified = verifyBuggy(challengeMessage, sig, pub)
+    const verified = verify(challengeMessage, sig, pub)
     if (verified) {
       this.remoteVersion = ws2pVersion
       this.challenge = challenge
@@ -166,7 +167,7 @@ export class WS2PPubkeyRemoteAuth implements WS2PRemoteAuth {
   async registerOK(sig: string): Promise<boolean> {
     const challengeMessage = `WS2P:OK:${this.currency}:${this.remotePub}:${this.challenge}`
     Logger.log('registerOK >>> ' + challengeMessage)
-    this.authenticatedByRemote = verifyBuggy(challengeMessage, sig, this.remotePub)
+    this.authenticatedByRemote = verify(challengeMessage, sig, this.remotePub)
     if (!this.authenticatedByRemote) {
       this.serverAuthReject("Wrong signature from remote OK")
     } else {
@@ -215,7 +216,7 @@ export class WS2PPubkeyLocalAuth implements WS2PLocalAuth {
     if (ws2pVersion > 1) {
       const challengeMessage = `WS2P:${ws2pVersion}:${connectWord}:${this.currency}:${this.pair.pub}:${this.ws2pId}:${this.challenge}`
       Logger.log('sendCONNECT >>> ' + challengeMessage)
-      const sig = this.pair.signSyncBuggy(challengeMessage)
+      const sig = this.pair.signSync(challengeMessage)
       await ws.send(JSON.stringify({
         auth: `${connectWord}`,
         version: ws2pVersion,
@@ -229,7 +230,7 @@ export class WS2PPubkeyLocalAuth implements WS2PLocalAuth {
     } else if (ws2pVersion == 1) {
       const challengeMessage = `WS2P:${connectWord}:${this.currency}:${this.pair.pub}:${this.challenge}`
       Logger.log('sendCONNECT >>> ' + challengeMessage)
-      const sig = this.pair.signSyncBuggy(challengeMessage)
+      const sig = this.pair.signSync(challengeMessage)
       await ws.send(JSON.stringify({
         auth: `${connectWord}`,
         pub: this.pair.pub,
@@ -248,7 +249,7 @@ export class WS2PPubkeyLocalAuth implements WS2PLocalAuth {
     }
     const challengeMessage = `WS2P:ACK:${this.currency}:${pub}:${this.challenge}`
     Logger.log('registerACK >>> ' + challengeMessage)
-    this.authenticated = verifyBuggy(challengeMessage, sig, pub)
+    this.authenticated = verify(challengeMessage, sig, pub)
     if (!this.authenticated) {
       this.serverAuthReject("Wrong signature from server ACK")
     } else {
@@ -260,7 +261,7 @@ export class WS2PPubkeyLocalAuth implements WS2PLocalAuth {
   async sendOK(ws:any): Promise<void> {
     const challengeMessage = `WS2P:OK:${this.currency}:${this.pair.pub}:${this.challenge}`
     Logger.log('sendOK >>> ' + challengeMessage)
-    const sig = this.pair.signSyncBuggy(challengeMessage)
+    const sig = this.pair.signSync(challengeMessage)
     await ws.send(JSON.stringify({
       auth: 'OK',
       sig
diff --git a/app/service/IdentityService.ts b/app/service/IdentityService.ts
index 7f16a34fcd6913d82d95751dda4f81a1e56a4545..de99c94c3c1bdc4cb5f64b8e126c03e74ea37d84 100644
--- a/app/service/IdentityService.ts
+++ b/app/service/IdentityService.ts
@@ -21,7 +21,7 @@ import {RevocationDTO} from "../lib/dto/RevocationDTO"
 import {BasicIdentity, IdentityDTO} from "../lib/dto/IdentityDTO"
 import {CertificationDTO} from "../lib/dto/CertificationDTO"
 import {DBCert} from "../lib/dal/sqliteDAL/CertDAL"
-import {verifyBuggy} from "../lib/common-libs/crypto/keyring"
+import {verify} from "duniteroxyde"
 import {FIFOService} from "./FIFOService"
 import {MindexEntry} from "../lib/indexer"
 import {DataErrors} from "../lib/common-libs/errors"
@@ -121,7 +121,7 @@ export class IdentityService extends FIFOService {
       this.logger.info('⬇ IDTY %s %s', idty.pubkey, idty.uid);
       try {
         // Check signature's validity
-        let verified = verifyBuggy(createIdentity, idty.sig, idty.pubkey);
+        let verified = verify(createIdentity, idty.sig, idty.pubkey);
         if (!verified) {
           throw constants.ERRORS.SIGNATURE_DOES_NOT_MATCH;
         }
@@ -271,7 +271,7 @@ export class IdentityService extends FIFOService {
     return this.pushFIFO<RevocationDTO>(hash, async () => {
       try {
         this.logger.info('⬇ REVOCATION %s %s', revoc.pubkey, revoc.idty_uid);
-        let verified = verifyBuggy(raw, revoc.revocation, revoc.pubkey);
+        let verified = verify(raw, revoc.revocation, revoc.pubkey);
         if (!verified) {
           throw 'Wrong signature for revocation';
         }
diff --git a/app/service/PeeringService.ts b/app/service/PeeringService.ts
index ef5972183524a127cf935730fe787d92399d8687..67ed60c6ffc7088d74cc8453bd25f387f5627644 100755
--- a/app/service/PeeringService.ts
+++ b/app/service/PeeringService.ts
@@ -16,7 +16,7 @@ import {FileDAL} from "../lib/dal/fileDAL"
 import {DBBlock} from "../lib/db/DBBlock"
 import {Multicaster} from "../lib/streams/multicaster"
 import {PeerDTO} from "../lib/dto/PeerDTO"
-import {verifyBuggy} from "../lib/common-libs/crypto/keyring"
+import {verify} from "duniteroxyde"
 import {dos2unix} from "../lib/common-libs/dos2unix"
 import {rawer} from "../lib/common-libs/index"
 import {Server} from "../../server"
@@ -82,7 +82,7 @@ export class PeeringService {
     const raw = rawer.getPeerWithoutSignature(p);
     const sig = p.signature;
     const pub = p.pubkey;
-    const signaturesMatching = verifyBuggy(raw, sig, pub);
+    const signaturesMatching = verify(raw, sig, pub);
     return !!signaturesMatching;
   };
 
diff --git a/package.json b/package.json
index fcd1261dcbddcf8df5dba7aa4783bf2267ad8d16..b785d1618e209f1e3b36ec63043e032244d8c957 100644
--- a/package.json
+++ b/package.json
@@ -71,7 +71,7 @@
     "cors": "2.8.2",
     "daemonize2": "0.4.2",
     "ddos": "0.1.16",
-    "duniteroxyde": "0.2.0",
+    "duniteroxyde": "0.2.3",
     "errorhandler": "1.5.0",
     "event-stream": "3.3.4",
     "express": "4.15.2",
@@ -86,7 +86,6 @@
     "moment": "2.19.3",
     "morgan": "1.9.1",
     "multimeter": "0.1.1",
-    "naclb": "1.3.11",
     "nat-upnp": "^1.1.1",
     "node-pre-gyp": "0.6.34",
     "node-uuid": "1.4.8",
@@ -95,12 +94,10 @@
     "querablep": "^0.1.0",
     "request": "2.81.0",
     "request-promise": "4.2.0",
-    "seedrandom": "3.0.1",
     "sha1": "1.1.1",
     "socks-proxy-agent": "4.0.2",
     "sqlite3": "4.0.6",
     "tail": "^2.0.2",
-    "tweetnacl": "^1.0.1",
     "typedoc": "^0.11.1",
     "underscore": "1.8.3",
     "unzip": "0.1.11",
diff --git a/release/arch/linux/build-lin.sh b/release/arch/linux/build-lin.sh
index 632064cd70bdd5e9a8750ee81c9b669f7747c9b8..1c509b53b18bfa5ad277fd86baac4330251a83a5 100644
--- a/release/arch/linux/build-lin.sh
+++ b/release/arch/linux/build-lin.sh
@@ -204,7 +204,6 @@ cp -r "${RELEASES}/duniter" "${RELEASES}/server_" || exit 1
 echo "${NW_RELEASE}"
 
 cd "${RELEASES}/desktop_/node_modules/"
-nw_compile naclb nw_copy
 nw_compile leveldown nw_copy "build/Release/"
 nw_compile sqlite3 nw_copy_node
 
diff --git a/release/arch/windows/build.bat b/release/arch/windows/build.bat
index d523fc9596d65ade4879194925ca2bee3b25bab8..89b38404b40b74fef0e19a3d7db66274dac227c1 100644
--- a/release/arch/windows/build.bat
+++ b/release/arch/windows/build.bat
@@ -77,21 +77,7 @@ REM call ./node_modules/.bin/install-self-peers --npm -- --production
 
 set SRC=%cd%
 echo %SRC%
-cd node_modules/wotb
-call npm install --build-from-source
-
-REM PREPARE common.gypi
-call node-pre-gyp --runtime=node-webkit --target=%NW_VERSION% --msvs_version=2015 configure
-
-call node-pre-gyp --runtime=node-webkit --target=%NW_VERSION% --msvs_version=2015 configure
-call node-pre-gyp --runtime=node-webkit --target=%NW_VERSION% --msvs_version=2015 build
-copy %cd%\lib\binding\Release\node-webkit-%NW_RELEASE%-win32-x64\wotb.node %cd%\lib\binding\Release\node-v%ADDON_VERSION%-win32-x64\wotb.node /Y
-cd ../naclb
-call npm install --build-from-source
-call node-pre-gyp --runtime=node-webkit --target=%NW_VERSION% --msvs_version=2015 configure
-call node-pre-gyp --runtime=node-webkit --target=%NW_VERSION% --msvs_version=2015 build
-copy %cd%\lib\binding\Release\node-webkit-%NW_RELEASE%-win32-x64\naclb.node %cd%\lib\binding\Release\node-v%ADDON_VERSION%-win32-x64\naclb.node /Y
-cd ../leveldown
+cd node_modules/leveldown
 call npm install --build-from-source
 echo "Patch de leveldown..."
 move package.json package.json.back
diff --git a/server.ts b/server.ts
index 91b49cb944eb32ea6b20e3dc75215566239c3525..c84713ecdd7261a2c7254fdd89ab362314a4bd47 100644
--- a/server.ts
+++ b/server.ts
@@ -19,7 +19,7 @@ import {TransactionService} from "./app/service/TransactionsService"
 import {ConfDTO} from "./app/lib/dto/ConfDTO"
 import {FileDAL, FileDALParams} from "./app/lib/dal/fileDAL"
 import * as stream from "stream"
-import {KeyGen, randomKey} from "./app/lib/common-libs/crypto/keyring"
+import {Key, randomKey} from "./app/lib/common-libs/crypto/keyring"
 import {parsers} from "./app/lib/common-libs/parsers/index"
 import {Cloneable} from "./app/lib/dto/Cloneable"
 import {CommonConstants, DuniterDocument, duniterDocument2str} from "./app/lib/common-libs/constants"
@@ -214,7 +214,7 @@ export class Server extends stream.Duplex implements HookableServer {
       this.conf.pair = randomKey().json()
     }
     // Extract key pair
-    this.keyPair = KeyGen(this.conf.pair.pub, this.conf.pair.sec);
+    this.keyPair = new Key(this.conf.pair.pub, this.conf.pair.sec);
     this.sign = (msg:string) => this.keyPair.sign(msg)
     // Update services
     this.IdentityService.setConfDAL(this.conf, this.dal)
diff --git a/test/fast/crypto/crypto.ts b/test/fast/crypto/crypto.ts
index 5cd873293ca2445beffd03cf02e88dcb8aabf543..d5e2e388d7f48ef39de43eec40e5d07831cd295d 100644
--- a/test/fast/crypto/crypto.ts
+++ b/test/fast/crypto/crypto.ts
@@ -14,7 +14,8 @@
 "use strict";
 import {Base58decode, Base58encode} from "../../../app/lib/common-libs/crypto/base58"
 import {decodeBase64, encodeBase64} from "../../../app/lib/common-libs/crypto/nacl-util"
-import {KeyGen, verify, verifyBuggy} from "../../../app/lib/common-libs/crypto/keyring"
+import {Key} from "../../../app/lib/common-libs/crypto/keyring"
+import {verify} from "duniteroxyde"
 
 const should = require('should');
 
@@ -27,7 +28,7 @@ describe('ed25519 tests:', function(){
 
   before(async () => {
     // Generate the keypair
-    const keyPair = KeyGen('HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd', '51w4fEShBk1jCMauWu4mLpmDVfHksKmWcygpxriqCEZizbtERA6de4STKRkQBpxmMUwsKXRjSzuQ8ECwmqN1u2DP');
+    const keyPair = new Key('HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd', '51w4fEShBk1jCMauWu4mLpmDVfHksKmWcygpxriqCEZizbtERA6de4STKRkQBpxmMUwsKXRjSzuQ8ECwmqN1u2DP');
     pub = Base58decode(keyPair.publicKey);
     sec = Base58decode(keyPair.secretKey);
     rawPub = Base58encode(new Buffer(pub));
@@ -46,16 +47,16 @@ describe('ed25519 tests:', function(){
 
   it('good signature from generated key should be verified', function(done){
     const msg = "Some message to be signed";
-    const sig = KeyGen(rawPub, rawSec).signSyncBuggy(msg);
-    const verified = verifyBuggy(msg, sig, rawPub);
+    const sig = new Key(rawPub, rawSec).signSync(msg);
+    const verified = verify(msg, sig, rawPub);
     verified.should.equal(true);
     done();
   });
 
   it('wrong signature from generated key should NOT be verified', function(done){
     const msg = "Some message to be signed";
-    const sig = KeyGen(rawPub, rawSec).signSyncBuggy(msg);
-    const verified = verifyBuggy(msg + 'delta', sig, rawPub);
+    const sig = new Key(rawPub, rawSec).signSync(msg);
+    const verified = verify(msg + 'delta', sig, rawPub);
     verified.should.equal(false);
     done();
   });
@@ -68,7 +69,7 @@ describe('ed25519 tests:', function(){
       "Block: 33291-0000088375C232A4DDAE171BB3D3C51347CB6DC8B7AA8BE4CD4DAEEADF26FEB8\n" +
       "Endpoints:\n" +
       "BASIC_MERKLED_API g1.duniter.org 10901\n"
-    const verified = verifyBuggy(msg, "u8t1IoWrB/C7T+2rS0rKYJfjPG4FN/HkKGFiUO5tILIzjFDvxxQiVC+0o/Vaz805SMmqJvXqornI71U7//+wCg==", "3AF7bhGQRt6ymcBZgZTBMoDsEtSwruSarjNG8kDnaueX");
+    const verified = verify(msg, "u8t1IoWrB/C7T+2rS0rKYJfjPG4FN/HkKGFiUO5tILIzjFDvxxQiVC+0o/Vaz805SMmqJvXqornI71U7//+wCg==", "3AF7bhGQRt6ymcBZgZTBMoDsEtSwruSarjNG8kDnaueX");
     verified.should.equal(true);
     done();
   });
@@ -82,15 +83,7 @@ describe('ed25519 tests:', function(){
       "Endpoints:\n" +
       "BASIC_MERKLED_API g1.duniter.tednet.fr 37.187.0.204 8999\n" +
       "BMAS g1.duniter.tednet.fr 9000\n"
-    const verified = verifyBuggy(msg, "ImvQDdpGv2M6CxSnBuseM/azJhBUGzWVgQhIvb5L2oGLm2GyLk/Sbi5wkb4IjbjbQfdRPdlcx5zxaHhvZCiWAA==", "Com8rJukCozHZyFao6AheSsfDQdPApxQRnz7QYFf64mm");
-    verified.should.equal(true);
-    done();
-  });
-
-  it('wrong block signature due to oldest tweetnacl should be verified with verifyBuggy', function(done){
-    const msg = "InnerHash: 8B194B5C38CF0A38D16256405AC3E5FA5C2ABD26BE4DCC0C7ED5CC9824E6155B\nNonce: 30400000119992\n";
-    const rawSig = "fJusVDRJA8akPse/sv4uK8ekUuvTGj1OoKYVdMQQAACs7OawDfpsV6cEMPcXxrQTCTRMrTN/rRrl20hN5zC9DQ==";
-    const verified = verifyBuggy(msg, rawSig, "D9D2zaJoWYWveii1JRYLVK3J4Z7ZH3QczoKrnQeiM6mx");
+    const verified = verify(msg, "ImvQDdpGv2M6CxSnBuseM/azJhBUGzWVgQhIvb5L2oGLm2GyLk/Sbi5wkb4IjbjbQfdRPdlcx5zxaHhvZCiWAA==", "Com8rJukCozHZyFao6AheSsfDQdPApxQRnz7QYFf64mm");
     verified.should.equal(true);
     done();
   });
@@ -103,14 +96,6 @@ describe('ed25519 tests:', function(){
     done();
   });
 
-  it('rectified block signature should be NOT verified with verifyBuggy', function(done){
-    const msg = "InnerHash: 8B194B5C38CF0A38D16256405AC3E5FA5C2ABD26BE4DCC0C7ED5CC9824E6155B\nNonce: 30400000119992\n";
-    const rawSig = "aZusVDRJA8akPse/sv4uK8ekUuvTGj1OoKYVdMQQ/3+VMaDJ02I795GBBaLgjypZFEKYlPMssJMn/X+F/pxgAw==";
-    const verified = verifyBuggy(msg, rawSig, "D9D2zaJoWYWveii1JRYLVK3J4Z7ZH3QczoKrnQeiM6mx");
-    verified.should.equal(false);
-    done();
-  });
-
   it('rectified block signature should be verified with verify', function(done){
     const msg = "InnerHash: 8B194B5C38CF0A38D16256405AC3E5FA5C2ABD26BE4DCC0C7ED5CC9824E6155B\nNonce: 30400000119992\n";
     const rawSig = "aZusVDRJA8akPse/sv4uK8ekUuvTGj1OoKYVdMQQ/3+VMaDJ02I795GBBaLgjypZFEKYlPMssJMn/X+F/pxgAw==";
diff --git a/test/fast/crypto/randomKey.ts b/test/fast/crypto/randomKey.ts
index 6ad90ed9c50458a6fb8be6dd0edb59e38f107ec1..398d37e27f2c0c44db63d24ee3cc0b7a143aded4 100644
--- a/test/fast/crypto/randomKey.ts
+++ b/test/fast/crypto/randomKey.ts
@@ -11,7 +11,8 @@
 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 // GNU Affero General Public License for more details.
 
-import {Key, KeyGen, randomKey, verifyBuggy} from "../../../app/lib/common-libs/crypto/keyring"
+import {Key, randomKey} from "../../../app/lib/common-libs/crypto/keyring"
+import {verify} from "duniteroxyde"
 
 const should = require('should');
 
@@ -26,16 +27,16 @@ describe('Random keypair', function(){
 
   it('good signature from generated key should be verified', function(done){
     const msg = "Some message to be signed";
-    const sig = KeyGen(key.publicKey, key.secretKey).signSyncBuggy(msg);
-    const verified = verifyBuggy(msg, sig, key.publicKey);
+    const sig = new Key(key.publicKey, key.secretKey).signSync(msg);
+    const verified = verify(msg, sig, key.publicKey);
     verified.should.equal(true);
     done();
   });
 
   it('wrong signature from generated key should NOT be verified', function(done){
     const msg = "Some message to be signed";
-    const sig = KeyGen(key.publicKey, key.secretKey).signSyncBuggy(msg);
-    const verified = verifyBuggy(msg + 'delta', sig, key.publicKey);
+    const sig = new Key(key.publicKey, key.secretKey).signSync(msg);
+    const verified = verify(msg + 'delta', sig, key.publicKey);
     verified.should.equal(false);
     done();
   });
diff --git a/test/fast/modules/common/common-crypto-test.ts b/test/fast/modules/common/common-crypto-test.ts
index 797970fb3eacaf443b0d6640f8a58bcd57f6e376..eb63628cac13700c052547fa378da79b8be130de 100644
--- a/test/fast/modules/common/common-crypto-test.ts
+++ b/test/fast/modules/common/common-crypto-test.ts
@@ -11,7 +11,8 @@
 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 // GNU Affero General Public License for more details.
 
-import {KeyGen, verifyBuggy} from "../../../../app/lib/common-libs/crypto/keyring"
+import {Key} from "../../../../app/lib/common-libs/crypto/keyring"
+import {verify} from "duniteroxyde"
 import {Base58decode, Base58encode} from "../../../../app/lib/common-libs/crypto/base58"
 
 const should = require('should');
@@ -22,7 +23,7 @@ describe('ed25519 tests:', function(){
 
   before(async () => {
     // Generate the keypair
-    const keyPair = KeyGen('HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd', '51w4fEShBk1jCMauWu4mLpmDVfHksKmWcygpxriqCEZizbtERA6de4STKRkQBpxmMUwsKXRjSzuQ8ECwmqN1u2DP');
+    const keyPair = new Key('HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd', '51w4fEShBk1jCMauWu4mLpmDVfHksKmWcygpxriqCEZizbtERA6de4STKRkQBpxmMUwsKXRjSzuQ8ECwmqN1u2DP');
     pub = Base58decode(keyPair.publicKey);
     sec = Base58decode(keyPair.secretKey);
     rawPub = Base58encode(new Buffer(pub));
@@ -41,16 +42,16 @@ describe('ed25519 tests:', function(){
 
   it('good signature from generated key should be verified', function(done){
     const msg = "Some message to be signed";
-    const sig = KeyGen(rawPub, rawSec).signSyncBuggy(msg);
-    const verified = verifyBuggy(msg, sig, rawPub);
+    const sig = new Key(rawPub, rawSec).signSync(msg);
+    const verified = verify(msg, sig, rawPub);
     verified.should.equal(true);
     done();
   });
 
   it('wrong signature from generated key should NOT be verified', function(done){
     const msg = "Some message to be signed";
-    const sig = KeyGen(rawPub, rawSec).signSyncBuggy(msg);
-    const verified = verifyBuggy(msg + 'delta', sig, rawPub);
+    const sig = new Key(rawPub, rawSec).signSync(msg);
+    const verified = verify(msg + 'delta', sig, rawPub);
     verified.should.equal(false);
     done();
   });
diff --git a/test/fast/modules/common/common-random-key.ts b/test/fast/modules/common/common-random-key.ts
index 7751264debde373b7d347c8c7acb249d94478dcd..57ac443d9495c93df16857ef21e48fda8110af9e 100644
--- a/test/fast/modules/common/common-random-key.ts
+++ b/test/fast/modules/common/common-random-key.ts
@@ -11,7 +11,8 @@
 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 // GNU Affero General Public License for more details.
 
-import {Key, KeyGen, randomKey, verifyBuggy} from "../../../../app/lib/common-libs/crypto/keyring"
+import {Key, randomKey} from "../../../../app/lib/common-libs/crypto/keyring"
+import {verify} from "duniteroxyde"
 
 const should = require('should');
 
@@ -26,16 +27,16 @@ describe('Random keypair', function(){
 
   it('good signature from generated key should be verified', function(done){
     const msg = "Some message to be signed";
-    const sig = KeyGen(key.publicKey, key.secretKey).signSyncBuggy(msg);
-    const verified = verifyBuggy(msg, sig, key.publicKey);
+    const sig = new Key(key.publicKey, key.secretKey).signSync(msg);
+    const verified = verify(msg, sig, key.publicKey);
     verified.should.equal(true);
     done();
   });
 
   it('wrong signature from generated key should NOT be verified', function(done){
     const msg = "Some message to be signed";
-    const sig = KeyGen(key.publicKey, key.secretKey).signSyncBuggy(msg);
-    const verified = verifyBuggy(msg + 'delta', sig, key.publicKey);
+    const sig = new Key(key.publicKey, key.secretKey).signSync(msg);
+    const verified = verify(msg + 'delta', sig, key.publicKey);
     verified.should.equal(false);
     done();
   });
diff --git a/test/integration/misc/http-api.ts b/test/integration/misc/http-api.ts
index 2eb0ec0eb96d00bdcc045ab753791a135215219e..6ec11146cb3f3f5e4fe202068494191e3ce03bc9 100644
--- a/test/integration/misc/http-api.ts
+++ b/test/integration/misc/http-api.ts
@@ -333,7 +333,7 @@ async function expectJSON<T>(promise:Promise<T>, json:any) {
   try {
     const resJson = await promise;
     Underscore.keys(json).forEach(function(key){
-      resJson.should.have.property(String(key)).equal(json[key]);
+      should(resJson).have.property(String(key)).equal(json[key]);
     });
   } catch (err) {
     if (err.response) {
diff --git a/test/integration/tools/TestUser.ts b/test/integration/tools/TestUser.ts
index 7746b3b01245e743fee601fc5a9e5c03d07439fb..375b7b1071c1333ac11d6ac372ce118704c829a7 100644
--- a/test/integration/tools/TestUser.ts
+++ b/test/integration/tools/TestUser.ts
@@ -11,7 +11,7 @@
 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 // GNU Affero General Public License for more details.
 
-import {Key, KeyGen} from "../../../app/lib/common-libs/crypto/keyring"
+import {Key} from "../../../app/lib/common-libs/crypto/keyring"
 import {IdentityDTO} from "../../../app/lib/dto/IdentityDTO";
 import {TestingServer} from "./toolbox"
 import {CommonConstants} from "../../../app/lib/common-libs/constants"
@@ -85,7 +85,7 @@ export class TestUser {
       issuer: this.pub,
       currency: this.node.server.conf.currency
     }).getRawUnSigned()
-    return this.createdIdentity += KeyGen(this.pub, this.sec).signSyncBuggy(this.createdIdentity) + '\n'
+    return this.createdIdentity += new Key(this.pub, this.sec).signSync(this.createdIdentity) + '\n'
   }
 
   public submitIdentity(raw:string, fromServer?: TestingServer) {
@@ -116,7 +116,7 @@ export class TestUser {
     }
     Underscore.extend(cert, overrideProps || {});
     const rawCert = CertificationDTO.fromJSONObject(cert).getRawUnSigned()
-    cert.sig = KeyGen(this.pub, this.sec).signSyncBuggy(rawCert)
+    cert.sig = new Key(this.pub, this.sec).signSync(rawCert)
     return CertificationDTO.fromJSONObject(cert)
   }
 
@@ -157,7 +157,7 @@ export class TestUser {
     };
     Underscore.extend(revocation, overrideProps || {});
     const rawRevocation = RevocationDTO.fromJSONObject(revocation).getRawUnsigned()
-    revocation.revocation = KeyGen(this.pub, this.sec).signSyncBuggy(rawRevocation);
+    revocation.revocation = new Key(this.pub, this.sec).signSync(rawRevocation);
     return RevocationDTO.fromJSONObject(revocation)
   }
 
@@ -185,7 +185,7 @@ export class TestUser {
     };
     Underscore.extend(join, overrideProps || {});
     const rawJoin = MembershipDTO.fromJSONObject(join).getRaw()
-    join.signature = KeyGen(this.pub, this.sec).signSyncBuggy(rawJoin)
+    join.signature = new Key(this.pub, this.sec).signSync(rawJoin)
     return MembershipDTO.fromJSONObject(join)
   }
 
@@ -306,9 +306,9 @@ export class TestUser {
   }
 
   private signed(raw:string, user2?:TestUser) {
-    let signatures = [KeyGen(this.pub, this.sec).signSyncBuggy(raw)];
+    let signatures = [new Key(this.pub, this.sec).signSync(raw)];
     if (user2) {
-      signatures.push(KeyGen(user2.pub, user2.sec).signSyncBuggy(raw));
+      signatures.push(new Key(user2.pub, user2.sec).signSync(raw));
     }
     return raw + signatures.join('\n') + '\n';
   }
@@ -356,7 +356,7 @@ export class TestUser {
     });
     Underscore.extend(peer, overrideProps || {});
     const rawPeer = PeerDTO.fromJSONObject(peer).getRawUnsigned()
-    peer.signature = KeyGen(this.pub, this.sec).signSyncBuggy(rawPeer)
+    peer.signature = new Key(this.pub, this.sec).signSync(rawPeer)
     return PeerDTO.fromJSONObject(peer)
   }
 
diff --git a/test/integration/ws2p/ws2p_connection.ts b/test/integration/ws2p/ws2p_connection.ts
index 3309e0ec4164e735b02a8d1d356b689fa7e004ac..3e39d94b5b96bc745185cb9761e2bcb2770626a4 100644
--- a/test/integration/ws2p/ws2p_connection.ts
+++ b/test/integration/ws2p/ws2p_connection.ts
@@ -18,7 +18,8 @@ import {
   WS2PPubkeyRemoteAuth,
   WS2PRemoteAuth
 } from "../../../app/modules/ws2p/lib/WS2PConnection"
-import {Key, verifyBuggy} from "../../../app/lib/common-libs/crypto/keyring"
+import {Key} from "../../../app/lib/common-libs/crypto/keyring"
+import {verify} from "duniteroxyde"
 import {getNewTestingPort} from "../tools/toolbox"
 import {WS2PMessageHandler} from "../../../app/modules/ws2p/lib/impl/WS2PMessageHandler"
 import {WS2PResponse} from "../../../app/modules/ws2p/lib/impl/WS2PResponse"
@@ -83,7 +84,7 @@ describe('WS2P', () => {
             if (obj.auth) {
               if (nbAsk == 1 || nbAsk == 3) {
                 const challengeMessage = `WS2P:ACK:gtest:${serverKeypair.pub}:${obj.challenge}`
-                const sig = serverKeypair.signSyncBuggy(challengeMessage)
+                const sig = serverKeypair.signSync(challengeMessage)
                 if (nbAsk == 1) {
                   ws.send(JSON.stringify({ auth: 'ACK', pub: serverKeypair.pub, sig: 'hiohoihio' }))
                 }
@@ -95,7 +96,7 @@ describe('WS2P', () => {
                 // We do like if the key was wrong
                 const clientPub = 'GgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd'
                 const challengeMessage = `WS2P:CONNECT:${clientPub}:${obj.challenge}`
-                if (!verifyBuggy(challengeMessage, obj.sig, clientPub)) {
+                if (!verify(challengeMessage, obj.sig, clientPub)) {
                   clientAskError = 'Wrong signature from client CONNECT'
                 }
               }
@@ -332,7 +333,7 @@ describe('WS2P', () => {
         class WS2PPubkeyAnsweringWithWrongSigForACK extends WS2PPubkeyRemoteAuth {
           async sendACK(ws: any): Promise<void> {
             const challengeMessage = `WS2P:WRONG:${this.pair.pub}:${this.challenge}`
-            const sig = this.pair.signSyncBuggy(challengeMessage)
+            const sig = this.pair.signSync(challengeMessage)
             await ws.send(JSON.stringify({
               auth: 'ACK',
               pub: this.pair.pub,
@@ -354,7 +355,7 @@ describe('WS2P', () => {
 
           async registerACK(sig: string, pub: string): Promise<boolean> {
             const challengeMessage = `WS2P:BLABLA:${pub}:${this.challenge}`
-            this.authenticated = verifyBuggy(challengeMessage, sig, pub)
+            this.authenticated = verify(challengeMessage, sig, pub)
             if (!this.authenticated) {
               this.serverAuthReject("Wrong signature from server ACK")
             } else {
diff --git a/yarn.lock b/yarn.lock
index e92dd7d2d13ee6d2755508becadbe540039f358b..cf6c078c19ce6b710a618bd7ec72171d34ef66da 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -772,11 +772,6 @@ buffer-from@^1.0.0:
   resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef"
   integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==
 
-buffer-shims@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51"
-  integrity sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=
-
 buffer@^5.1.0:
   version "5.2.1"
   resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.2.1.tgz#dd57fa0f109ac59c602479044dca7b8b3d0b71d6"
@@ -1350,13 +1345,6 @@ debug@^4.1.0:
   dependencies:
     ms "^2.1.1"
 
-debug@~2.2.0:
-  version "2.2.0"
-  resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da"
-  integrity sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=
-  dependencies:
-    ms "0.7.1"
-
 decamelize@^1.1.1, decamelize@^1.2.0:
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
@@ -1379,11 +1367,6 @@ deep-extend@^0.6.0, deep-extend@~0.6.0:
   resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac"
   integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==
 
-deep-extend@~0.4.0:
-  version "0.4.2"
-  resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f"
-  integrity sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=
-
 deep-is@~0.1.2, deep-is@~0.1.3:
   version "0.1.3"
   resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
@@ -1495,10 +1478,10 @@ doctrine@^2.1.0:
   dependencies:
     esutils "^2.0.2"
 
-duniteroxyde@0.2.0:
-  version "0.2.0"
-  resolved "https://registry.yarnpkg.com/duniteroxyde/-/duniteroxyde-0.2.0.tgz#5f84de3f92e91c5c65406c710a36dd47d2bde4b0"
-  integrity sha512-jMOD74/ajxn8sOHaCUzQ1wgoKcLBTpHeCdMGolqJxRoA+22fQdoQFJvUbRBo/T50sjcHvF51TPofig1S0Gg+6w==
+duniteroxyde@0.2.3:
+  version "0.2.3"
+  resolved "https://registry.yarnpkg.com/duniteroxyde/-/duniteroxyde-0.2.3.tgz#0f2d2c01aee988f87c027903541df25b6f18e493"
+  integrity sha512-pwGbfeOky1MWLWs/mYiYq2dozlVs2161r+vmaj8zUNCGCocCiXzap6m6/wE0p5PxZv3ADMtEXO/qWDP67ZrZ3A==
   dependencies:
     neon-cli "^0.4.0"
 
@@ -2278,7 +2261,7 @@ fs.realpath@^1.0.0:
   resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
   integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8=
 
-fstream-ignore@^1.0.5, fstream-ignore@~1.0.5:
+fstream-ignore@^1.0.5:
   version "1.0.5"
   resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105"
   integrity sha1-nDHa40dnAY/h0kmyTa2mfQktoQU=
@@ -2297,7 +2280,7 @@ fstream-ignore@^1.0.5, fstream-ignore@~1.0.5:
     mkdirp "0.5"
     rimraf "2"
 
-fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2, fstream@~1.0.10:
+fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2:
   version "1.0.11"
   resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171"
   integrity sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=
@@ -2403,7 +2386,7 @@ glob@7.1.1:
     once "^1.3.0"
     path-is-absolute "^1.0.0"
 
-glob@^7.0.0, glob@^7.0.5, glob@^7.0.6, glob@^7.1.3:
+glob@^7.0.0, glob@^7.0.6, glob@^7.1.3:
   version "7.1.4"
   resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255"
   integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==
@@ -3672,7 +3655,7 @@ mixin-deep@^1.2.0:
     for-in "^1.0.2"
     is-extendable "^1.0.1"
 
-mkdirp@0.5, mkdirp@0.5.1, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1:
+mkdirp@0.5, mkdirp@0.5.1, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0:
   version "0.5.1"
   resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
   integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=
@@ -3722,11 +3705,6 @@ morgan@1.9.1:
     on-finished "~2.3.0"
     on-headers "~1.0.1"
 
-ms@0.7.1:
-  version "0.7.1"
-  resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098"
-  integrity sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=
-
 ms@0.7.2:
   version "0.7.2"
   resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.2.tgz#ae25cf2512b3885a1d95d7f037868d8431124765"
@@ -3759,20 +3737,6 @@ mute-stream@0.0.7:
   resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab"
   integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=
 
-naclb@1.3.11:
-  version "1.3.11"
-  resolved "https://registry.yarnpkg.com/naclb/-/naclb-1.3.11.tgz#67dfdb753bae4ce39ed0f6765c753735218e1b56"
-  integrity sha512-pC2iHObEf7TSSetzcpSJsDYnRi/GXnUV9b0AaXLmznHu7jTj2grOVwTcO7lJpwoiqRmwpsBESKLPVoJ+Xg5iKA==
-  dependencies:
-    bindings "1.2.1"
-    nan "2.13.2"
-    node-pre-gyp "0.6.33"
-
-nan@2.13.2:
-  version "2.13.2"
-  resolved "https://registry.yarnpkg.com/nan/-/nan-2.13.2.tgz#f51dc7ae66ba7d5d55e1e6d4d8092e802c9aefe7"
-  integrity sha512-TghvYc72wlMGMVMluVo9WRJc0mB8KxxF/gZ4YYFy7V2ZQX9l7rgbPg7vjS9mt6U5HXODVFVI2bOduCzwOMv/lw==
-
 nan@~2.10.0:
   version "2.10.0"
   resolved "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f"
@@ -3878,21 +3842,6 @@ node-abi@^2.7.0:
   dependencies:
     semver "^5.4.1"
 
-node-pre-gyp@0.6.33:
-  version "0.6.33"
-  resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.33.tgz#640ac55198f6a925972e0c16c4ac26a034d5ecc9"
-  integrity sha1-ZArFUZj2qSWXLgwWxKwmoDTV7Mk=
-  dependencies:
-    mkdirp "~0.5.1"
-    nopt "~3.0.6"
-    npmlog "^4.0.1"
-    rc "~1.1.6"
-    request "^2.79.0"
-    rimraf "~2.5.4"
-    semver "~5.3.0"
-    tar "~2.2.1"
-    tar-pack "~3.3.0"
-
 node-pre-gyp@0.6.34:
   version "0.6.34"
   resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.34.tgz#94ad1c798a11d7fc67381b50d47f8cc18d9799f7"
@@ -3963,13 +3912,6 @@ nopt@^4.0.1:
     abbrev "1"
     osenv "^0.1.4"
 
-nopt@~3.0.6:
-  version "3.0.6"
-  resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9"
-  integrity sha1-xkZdvwirzU2zWTF/eaxopkayj/k=
-  dependencies:
-    abbrev "1"
-
 normalize-package-data@^2.3.2:
   version "2.5.0"
   resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8"
@@ -4130,13 +4072,6 @@ once@^1.3.0, once@^1.3.1, once@^1.3.3, once@^1.4.0:
   dependencies:
     wrappy "1"
 
-once@~1.3.3:
-  version "1.3.3"
-  resolved "https://registry.yarnpkg.com/once/-/once-1.3.3.tgz#b2e261557ce4c314ec8304f3fa82663e4297ca20"
-  integrity sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=
-  dependencies:
-    wrappy "1"
-
 onetime@^2.0.0:
   version "2.0.1"
   resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4"
@@ -4422,11 +4357,6 @@ preserve@^0.2.0:
   resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b"
   integrity sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=
 
-process-nextick-args@~1.0.6:
-  version "1.0.7"
-  resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3"
-  integrity sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=
-
 process-nextick-args@~2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa"
@@ -4593,16 +4523,6 @@ rc@^1.1.7, rc@^1.2.7:
     minimist "^1.2.0"
     strip-json-comments "~2.0.1"
 
-rc@~1.1.6:
-  version "1.1.7"
-  resolved "https://registry.yarnpkg.com/rc/-/rc-1.1.7.tgz#c5ea564bb07aff9fd3a5b32e906c1d3a65940fea"
-  integrity sha1-xepWS7B6/5/TpbMukGwdOmWUD+o=
-  dependencies:
-    deep-extend "~0.4.0"
-    ini "~1.3.0"
-    minimist "^1.2.0"
-    strip-json-comments "~2.0.1"
-
 read-pkg-up@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02"
@@ -4652,19 +4572,6 @@ readable-stream@~1.0.0, readable-stream@~1.0.2, readable-stream@~1.0.31:
     isarray "0.0.1"
     string_decoder "~0.10.x"
 
-readable-stream@~2.1.4:
-  version "2.1.5"
-  resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.1.5.tgz#66fa8b720e1438b364681f2ad1a63c618448c9d0"
-  integrity sha1-ZvqLcg4UOLNkaB8q0aY8YYRIydA=
-  dependencies:
-    buffer-shims "^1.0.0"
-    core-util-is "~1.0.0"
-    inherits "~2.0.1"
-    isarray "~1.0.0"
-    process-nextick-args "~1.0.6"
-    string_decoder "~0.10.x"
-    util-deprecate "~1.0.1"
-
 readline2@^0.1.1:
   version "0.1.1"
   resolved "https://registry.yarnpkg.com/readline2/-/readline2-0.1.1.tgz#99443ba6e83b830ef3051bfd7dc241a82728d568"
@@ -4892,13 +4799,6 @@ rimraf@2, rimraf@^2.2.8, rimraf@^2.5.1, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@~2.
   dependencies:
     glob "^7.1.3"
 
-rimraf@~2.5.1, rimraf@~2.5.4:
-  version "2.5.4"
-  resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.5.4.tgz#96800093cbf1a0c86bd95b4625467535c29dfa04"
-  integrity sha1-loAAk8vxoMhr2VtGJUZ1NcKd+gQ=
-  dependencies:
-    glob "^7.0.5"
-
 rsvp@^3.5.0:
   version "3.6.2"
   resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.6.2.tgz#2e96491599a96cde1b515d5674a8f7a91452926a"
@@ -4960,11 +4860,6 @@ sax@>=0.1.1, sax@^1.2.4:
   resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
   integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==
 
-seedrandom@3.0.1:
-  version "3.0.1"
-  resolved "https://registry.yarnpkg.com/seedrandom/-/seedrandom-3.0.1.tgz#eb3dde015bcf55df05a233514e5df44ef9dce083"
-  integrity sha512-1/02Y/rUeU1CJBAGLebiC5Lbo5FnB22gQbIFFYTLkwvp1xdABZJH1sn4ZT1MzXmPpzv+Rf/Lu2NcsLJiK4rcDg==
-
 "semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1:
   version "5.7.0"
   resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.0.tgz#790a7cf6fea5459bac96110b29b60412dc8ff96b"
@@ -4975,11 +4870,6 @@ semver@^5.1.0:
   resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
   integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
 
-semver@~5.3.0:
-  version "5.3.0"
-  resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f"
-  integrity sha1-myzl094C0XxgEq0yaqa00M9U+U8=
-
 send@0.15.1:
   version "0.15.1"
   resolved "https://registry.yarnpkg.com/send/-/send-0.15.1.tgz#8a02354c26e6f5cca700065f5f0cdeba90ec7b5f"
@@ -5610,20 +5500,6 @@ tar-pack@^3.4.0:
     tar "^2.2.1"
     uid-number "^0.0.6"
 
-tar-pack@~3.3.0:
-  version "3.3.0"
-  resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.3.0.tgz#30931816418f55afc4d21775afdd6720cee45dae"
-  integrity sha1-MJMYFkGPVa/E0hd1r91nIM7kXa4=
-  dependencies:
-    debug "~2.2.0"
-    fstream "~1.0.10"
-    fstream-ignore "~1.0.5"
-    once "~1.3.3"
-    readable-stream "~2.1.4"
-    rimraf "~2.5.1"
-    tar "~2.2.1"
-    uid-number "~0.0.6"
-
 tar-stream@^1.1.2, tar-stream@^1.5.0:
   version "1.6.2"
   resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.6.2.tgz#8ea55dab37972253d9a9af90fdcd559ae435c555"
@@ -5637,7 +5513,7 @@ tar-stream@^1.1.2, tar-stream@^1.5.0:
     to-buffer "^1.1.1"
     xtend "^4.0.0"
 
-tar@^2.2.1, tar@~2.2.1:
+tar@^2.2.1:
   version "2.2.1"
   resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1"
   integrity sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=
@@ -5834,11 +5710,6 @@ tweetnacl@^0.14.3, tweetnacl@~0.14.0:
   resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64"
   integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=
 
-tweetnacl@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.1.tgz#2594d42da73cd036bd0d2a54683dd35a6b55ca17"
-  integrity sha512-kcoMoKTPYnoeS50tzoqjPY3Uv9axeuuFAZY9M/9zFnhoVvRfxz9K29IMPD7jGmt2c8SW7i3gT9WqDl2+nV7p4A==
-
 type-check@~0.3.1, type-check@~0.3.2:
   version "0.3.2"
   resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72"
@@ -5915,7 +5786,7 @@ uglify-js@^3.1.4:
     commander "~2.20.3"
     source-map "~0.6.1"
 
-uid-number@^0.0.6, uid-number@~0.0.6:
+uid-number@^0.0.6:
   version "0.0.6"
   resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81"
   integrity sha1-DqEOgDXo61uOREnwbaHHMGY7qoE=