diff --git a/README.md b/README.md
index 6e4caa01f3feb919995fc0ab0324ee475aa79e2c..9989ac46f301012f987c37efd82143fe36055b2e 100644
--- a/README.md
+++ b/README.md
@@ -52,10 +52,6 @@ If you wish to participate/debate on Duniter, you can:
 
 ### Developement
 Duniter is using modules on different git repositories:
-- [Common](https://github.com/duniter/duniter-common): commons tools for Duniter core and modules.
-- [Crawler](https://github.com/duniter/duniter-crawler): network crawler.
-- [BMA API](https://github.com/duniter/duniter-bma): Basic Merkled API.
-- [Keypair](https://github.com/duniter/duniter-keypair): provide the cryptographic keypair.
 - [WotB](https://github.com/duniter/wotb): compute Web of Trust.
 - [Debug](https://github.com/duniter/duniter-debug): debug tool.
 - [Web admin](https://github.com/duniter/duniter-ui): web administration interface (optional).
diff --git a/app/modules/bma/lib/bma.ts b/app/modules/bma/lib/bma.ts
index 2fcbe2cb1fe3348892228577e557142325df1775..850510edf212302c60f310e14f33d86424fb9a62 100644
--- a/app/modules/bma/lib/bma.ts
+++ b/app/modules/bma/lib/bma.ts
@@ -43,54 +43,54 @@ export const bma = function(server:Server, interfaces:NetworkInterface[], httpLo
     const wot          = new WOTBinding(server)
     const transactions = new TransactionBinding(server)
     const dividend     = new UDBinding(server)
-    httpMethods.httpGET(  '/',                                      node.summary,                         dtos.Summary,        BMALimitation.limitAsHighUsage());
-    httpMethods.httpGET(  '/node/summary',                          node.summary,                         dtos.Summary,        BMALimitation.limitAsHighUsage());
-    httpMethods.httpGET(  '/node/sandboxes',                        node.sandboxes,                       dtos.Sandboxes,      BMALimitation.limitAsHighUsage());
-    httpMethods.httpGET(  '/blockchain/parameters',                 blockchain.parameters,                dtos.Parameters,     BMALimitation.limitAsHighUsage());
-    httpMethods.httpPOST( '/blockchain/membership',                 blockchain.parseMembership,           dtos.Membership,     BMALimitation.limitAsHighUsage());
-    httpMethods.httpGET(  '/blockchain/memberships/:search',        blockchain.memberships,               dtos.Memberships,    BMALimitation.limitAsHighUsage());
-    httpMethods.httpPOST( '/blockchain/block',                      blockchain.parseBlock,                dtos.Block,          BMALimitation.limitAsHighUsage());
-    httpMethods.httpGET(  '/blockchain/block/:number',              blockchain.promoted,                  dtos.Block,          BMALimitation.limitAsHighUsage());
-    httpMethods.httpGET(  '/blockchain/blocks/:count/:from',        blockchain.blocks,                    dtos.Blocks,         BMALimitation.limitAsHighUsage());
-    httpMethods.httpGET(  '/blockchain/current',                    blockchain.current,                   dtos.Block,          BMALimitation.limitAsHighUsage());
-    httpMethods.httpGET(  '/blockchain/hardship/:search',           blockchain.hardship,                  dtos.Hardship,       BMALimitation.limitAsHighUsage());
-    httpMethods.httpGET(  '/blockchain/difficulties',               blockchain.difficulties,              dtos.Difficulties,   BMALimitation.limitAsHighUsage());
-    httpMethods.httpGET(  '/blockchain/with/newcomers',             blockchain.with.newcomers,            dtos.Stat,           BMALimitation.limitAsHighUsage());
-    httpMethods.httpGET(  '/blockchain/with/certs',                 blockchain.with.certs,                dtos.Stat,           BMALimitation.limitAsHighUsage());
-    httpMethods.httpGET(  '/blockchain/with/joiners',               blockchain.with.joiners,              dtos.Stat,           BMALimitation.limitAsHighUsage());
-    httpMethods.httpGET(  '/blockchain/with/actives',               blockchain.with.actives,              dtos.Stat,           BMALimitation.limitAsHighUsage());
-    httpMethods.httpGET(  '/blockchain/with/leavers',               blockchain.with.leavers,              dtos.Stat,           BMALimitation.limitAsHighUsage());
-    httpMethods.httpGET(  '/blockchain/with/excluded',              blockchain.with.excluded,             dtos.Stat,           BMALimitation.limitAsHighUsage());
-    httpMethods.httpGET(  '/blockchain/with/revoked',               blockchain.with.revoked,              dtos.Stat,           BMALimitation.limitAsHighUsage());
-    httpMethods.httpGET(  '/blockchain/with/ud',                    blockchain.with.ud,                   dtos.Stat,           BMALimitation.limitAsHighUsage());
-    httpMethods.httpGET(  '/blockchain/with/tx',                    blockchain.with.tx,                   dtos.Stat,           BMALimitation.limitAsHighUsage());
-    httpMethods.httpGET(  '/blockchain/branches',                   blockchain.branches,                  dtos.Branches,       BMALimitation.limitAsHighUsage());
-    httpMethods.httpGET(  '/network/peering',                       net.peer,                             dtos.Peer,           BMALimitation.limitAsHighUsage());
-    httpMethods.httpGET(  '/network/peering/peers',                 net.peersGet,                         dtos.MerkleOfPeers,  BMALimitation.limitAsVeryHighUsage());
-    httpMethods.httpPOST( '/network/peering/peers',                 net.peersPost,                        dtos.Peer,           BMALimitation.limitAsHighUsage());
-    httpMethods.httpGET(  '/network/peers',                         net.peers,                            dtos.Peers,          BMALimitation.limitAsHighUsage());
-    httpMethods.httpPOST( '/wot/add',                               wot.add,                              dtos.Identity,       BMALimitation.limitAsHighUsage());
-    httpMethods.httpPOST( '/wot/certify',                           wot.certify,                          dtos.Cert,           BMALimitation.limitAsHighUsage());
-    httpMethods.httpPOST( '/wot/revoke',                            wot.revoke,                           dtos.Result,         BMALimitation.limitAsHighUsage());
-    httpMethods.httpGET(  '/wot/lookup/:search',                    wot.lookup,                           dtos.Lookup,         BMALimitation.limitAsHighUsage());
-    httpMethods.httpGET(  '/wot/members',                           wot.members,                          dtos.Members,        BMALimitation.limitAsHighUsage());
-    httpMethods.httpGET(  '/wot/pending',                           wot.pendingMemberships,               dtos.MembershipList, BMALimitation.limitAsHighUsage());
-    httpMethods.httpGET(  '/wot/requirements/:search',              wot.requirements,                     dtos.Requirements,   BMALimitation.limitAsHighUsage());
-    httpMethods.httpGET(  '/wot/requirements-of-pending/:minsig',   wot.requirementsOfPending,            dtos.Requirements,   BMALimitation.limitAsLowUsage());
-    httpMethods.httpGET(  '/wot/certifiers-of/:search',             wot.certifiersOf,                     dtos.Certifications, BMALimitation.limitAsHighUsage());
-    httpMethods.httpGET(  '/wot/certified-by/:search',              wot.certifiedBy,                      dtos.Certifications, BMALimitation.limitAsHighUsage());
-    httpMethods.httpGET(  '/wot/identity-of/:search',               wot.identityOf,                       dtos.SimpleIdentity, BMALimitation.limitAsHighUsage());
-    httpMethods.httpPOST( '/tx/process',                            transactions.parseTransaction,        dtos.Transaction,    BMALimitation.limitAsHighUsage());
-    httpMethods.httpGET(  '/tx/hash/:hash',                         transactions.getByHash,               dtos.Transaction,    BMALimitation.limitAsHighUsage());
-    httpMethods.httpGET(  '/tx/sources/:pubkey',                    transactions.getSources,              dtos.Sources,        BMALimitation.limitAsHighUsage());
-    httpMethods.httpGET(  '/tx/history/:pubkey',                    transactions.getHistory,              dtos.TxHistory,      BMALimitation.limitAsHighUsage());
-    httpMethods.httpGET(  '/tx/history/:pubkey/blocks/:from/:to',   transactions.getHistoryBetweenBlocks, dtos.TxHistory,      BMALimitation.limitAsHighUsage());
-    httpMethods.httpGET(  '/tx/history/:pubkey/times/:from/:to',    transactions.getHistoryBetweenTimes,  dtos.TxHistory,      BMALimitation.limitAsHighUsage());
-    httpMethods.httpGET(  '/tx/history/:pubkey/pending',            transactions.getPendingForPubkey,     dtos.TxHistory,      BMALimitation.limitAsHighUsage());
-    httpMethods.httpGET(  '/tx/pending',                            transactions.getPending,              dtos.TxPending,      BMALimitation.limitAsHighUsage());
-    httpMethods.httpGET(  '/ud/history/:pubkey',                    dividend.getHistory,                  dtos.UDHistory,      BMALimitation.limitAsHighUsage());
-    httpMethods.httpGET(  '/ud/history/:pubkey/blocks/:from/:to',   dividend.getHistoryBetweenBlocks,     dtos.UDHistory,      BMALimitation.limitAsHighUsage());
-    httpMethods.httpGET(  '/ud/history/:pubkey/times/:from/:to',    dividend.getHistoryBetweenTimes,      dtos.UDHistory,      BMALimitation.limitAsHighUsage());
+    httpMethods.httpGET(  '/',                                      (req:any) => node.summary(),                            dtos.Summary,        BMALimitation.limitAsHighUsage());
+    httpMethods.httpGET(  '/node/summary',                          (req:any) => node.summary(),                            dtos.Summary,        BMALimitation.limitAsHighUsage());
+    httpMethods.httpGET(  '/node/sandboxes',                        (req:any) => node.sandboxes(),                          dtos.Sandboxes,      BMALimitation.limitAsHighUsage());
+    httpMethods.httpGET(  '/blockchain/parameters',                 (req:any) => blockchain.parameters(),                   dtos.Parameters,     BMALimitation.limitAsHighUsage());
+    httpMethods.httpPOST( '/blockchain/membership',                 (req:any) => blockchain.parseMembership(req),           dtos.Membership,     BMALimitation.limitAsHighUsage());
+    httpMethods.httpGET(  '/blockchain/memberships/:search',        (req:any) => blockchain.memberships(req),               dtos.Memberships,    BMALimitation.limitAsHighUsage());
+    httpMethods.httpPOST( '/blockchain/block',                      (req:any) => blockchain.parseBlock(req),                dtos.Block,          BMALimitation.limitAsHighUsage());
+    httpMethods.httpGET(  '/blockchain/block/:number',              (req:any) => blockchain.promoted(req),                  dtos.Block,          BMALimitation.limitAsHighUsage());
+    httpMethods.httpGET(  '/blockchain/blocks/:count/:from',        (req:any) => blockchain.blocks(req),                    dtos.Blocks,         BMALimitation.limitAsHighUsage());
+    httpMethods.httpGET(  '/blockchain/current',                    (req:any) => blockchain.current(),                      dtos.Block,          BMALimitation.limitAsHighUsage());
+    httpMethods.httpGET(  '/blockchain/hardship/:search',           (req:any) => blockchain.hardship(req),                  dtos.Hardship,       BMALimitation.limitAsHighUsage());
+    httpMethods.httpGET(  '/blockchain/difficulties',               (req:any) => blockchain.difficulties(),                 dtos.Difficulties,   BMALimitation.limitAsHighUsage());
+    httpMethods.httpGET(  '/blockchain/with/newcomers',             (req:any) => blockchain.with.newcomers(req),            dtos.Stat,           BMALimitation.limitAsHighUsage());
+    httpMethods.httpGET(  '/blockchain/with/certs',                 (req:any) => blockchain.with.certs(req),                dtos.Stat,           BMALimitation.limitAsHighUsage());
+    httpMethods.httpGET(  '/blockchain/with/joiners',               (req:any) => blockchain.with.joiners(req),              dtos.Stat,           BMALimitation.limitAsHighUsage());
+    httpMethods.httpGET(  '/blockchain/with/actives',               (req:any) => blockchain.with.actives(req),              dtos.Stat,           BMALimitation.limitAsHighUsage());
+    httpMethods.httpGET(  '/blockchain/with/leavers',               (req:any) => blockchain.with.leavers(req),              dtos.Stat,           BMALimitation.limitAsHighUsage());
+    httpMethods.httpGET(  '/blockchain/with/excluded',              (req:any) => blockchain.with.excluded(req),             dtos.Stat,           BMALimitation.limitAsHighUsage());
+    httpMethods.httpGET(  '/blockchain/with/revoked',               (req:any) => blockchain.with.revoked(req),              dtos.Stat,           BMALimitation.limitAsHighUsage());
+    httpMethods.httpGET(  '/blockchain/with/ud',                    (req:any) => blockchain.with.ud(req),                   dtos.Stat,           BMALimitation.limitAsHighUsage());
+    httpMethods.httpGET(  '/blockchain/with/tx',                    (req:any) => blockchain.with.tx(req),                   dtos.Stat,           BMALimitation.limitAsHighUsage());
+    httpMethods.httpGET(  '/blockchain/branches',                   (req:any) => blockchain.branches(),                     dtos.Branches,       BMALimitation.limitAsHighUsage());
+    httpMethods.httpGET(  '/network/peering',                       (req:any) => net.peer(),                                dtos.Peer,           BMALimitation.limitAsHighUsage());
+    httpMethods.httpGET(  '/network/peering/peers',                 (req:any) => net.peersGet(req),                         dtos.MerkleOfPeers,  BMALimitation.limitAsVeryHighUsage());
+    httpMethods.httpPOST( '/network/peering/peers',                 (req:any) => net.peersPost(req),                        dtos.Peer,           BMALimitation.limitAsHighUsage());
+    httpMethods.httpGET(  '/network/peers',                         (req:any) => net.peers(),                               dtos.Peers,          BMALimitation.limitAsHighUsage());
+    httpMethods.httpPOST( '/wot/add',                               (req:any) => wot.add(req),                              dtos.Identity,       BMALimitation.limitAsHighUsage());
+    httpMethods.httpPOST( '/wot/certify',                           (req:any) => wot.certify(req),                          dtos.Cert,           BMALimitation.limitAsHighUsage());
+    httpMethods.httpPOST( '/wot/revoke',                            (req:any) => wot.revoke(req),                           dtos.Result,         BMALimitation.limitAsHighUsage());
+    httpMethods.httpGET(  '/wot/lookup/:search',                    (req:any) => wot.lookup(req),                           dtos.Lookup,         BMALimitation.limitAsHighUsage());
+    httpMethods.httpGET(  '/wot/members',                           (req:any) => wot.members(),                             dtos.Members,        BMALimitation.limitAsHighUsage());
+    httpMethods.httpGET(  '/wot/pending',                           (req:any) => wot.pendingMemberships(),                  dtos.MembershipList, BMALimitation.limitAsHighUsage());
+    httpMethods.httpGET(  '/wot/requirements/:search',              (req:any) => wot.requirements(req),                     dtos.Requirements,   BMALimitation.limitAsHighUsage());
+    httpMethods.httpGET(  '/wot/requirements-of-pending/:minsig',   (req:any) => wot.requirementsOfPending(req),            dtos.Requirements,   BMALimitation.limitAsLowUsage());
+    httpMethods.httpGET(  '/wot/certifiers-of/:search',             (req:any) => wot.certifiersOf(req),                     dtos.Certifications, BMALimitation.limitAsHighUsage());
+    httpMethods.httpGET(  '/wot/certified-by/:search',              (req:any) => wot.certifiedBy(req),                      dtos.Certifications, BMALimitation.limitAsHighUsage());
+    httpMethods.httpGET(  '/wot/identity-of/:search',               (req:any) => wot.identityOf(req),                       dtos.SimpleIdentity, BMALimitation.limitAsHighUsage());
+    httpMethods.httpPOST( '/tx/process',                            (req:any) => transactions.parseTransaction(req),        dtos.Transaction,    BMALimitation.limitAsHighUsage());
+    httpMethods.httpGET(  '/tx/hash/:hash',                         (req:any) => transactions.getByHash(req),               dtos.Transaction,    BMALimitation.limitAsHighUsage());
+    httpMethods.httpGET(  '/tx/sources/:pubkey',                    (req:any) => transactions.getSources(req),              dtos.Sources,        BMALimitation.limitAsHighUsage());
+    httpMethods.httpGET(  '/tx/history/:pubkey',                    (req:any) => transactions.getHistory(req),              dtos.TxHistory,      BMALimitation.limitAsHighUsage());
+    httpMethods.httpGET(  '/tx/history/:pubkey/blocks/:from/:to',   (req:any) => transactions.getHistoryBetweenBlocks(req), dtos.TxHistory,      BMALimitation.limitAsHighUsage());
+    httpMethods.httpGET(  '/tx/history/:pubkey/times/:from/:to',    (req:any) => transactions.getHistoryBetweenTimes(req),  dtos.TxHistory,      BMALimitation.limitAsHighUsage());
+    httpMethods.httpGET(  '/tx/history/:pubkey/pending',            (req:any) => transactions.getPendingForPubkey(req),     dtos.TxHistory,      BMALimitation.limitAsHighUsage());
+    httpMethods.httpGET(  '/tx/pending',                            (req:any) => transactions.getPending(),                 dtos.TxPending,      BMALimitation.limitAsHighUsage());
+    httpMethods.httpGET(  '/ud/history/:pubkey',                    (req:any) => dividend.getHistory(req),                  dtos.UDHistory,      BMALimitation.limitAsHighUsage());
+    httpMethods.httpGET(  '/ud/history/:pubkey/blocks/:from/:to',   (req:any) => dividend.getHistoryBetweenBlocks(req),     dtos.UDHistory,      BMALimitation.limitAsHighUsage());
+    httpMethods.httpGET(  '/ud/history/:pubkey/times/:from/:to',    (req:any) => dividend.getHistoryBetweenTimes(req),      dtos.UDHistory,      BMALimitation.limitAsHighUsage());
 
   }, (httpServer:any) => {
 
diff --git a/app/modules/bma/lib/controllers/transactions.ts b/app/modules/bma/lib/controllers/transactions.ts
index e09609e688676e187dca112cae7f550492d64b7d..7b889682feafdea0fa2ab231e6658e618f0d4433 100644
--- a/app/modules/bma/lib/controllers/transactions.ts
+++ b/app/modules/bma/lib/controllers/transactions.ts
@@ -1,6 +1,7 @@
 import {AbstractController} from "./AbstractController"
 import {ParametersService} from "../parameters"
 import {Source} from "../entity/source"
+import {BMAConstants} from "../constants";
 
 const _                = require('underscore');
 const common           = require('duniter-common');
@@ -11,7 +12,7 @@ const Transaction = common.document.Transaction
 export class TransactionBinding extends AbstractController {
 
   parseTransaction(req:any) {
-    return this.pushEntity(req, http2raw.transaction, constants.ENTITY_TRANSACTION)
+    return this.pushEntity(req, http2raw.transaction, BMAConstants.ENTITY_TRANSACTION)
   }
 
   async getSources(req:any) {
@@ -32,7 +33,7 @@ export class TransactionBinding extends AbstractController {
     const hash = ParametersService.getHash(req);
     const tx = await this.server.dal.getTxByHash(hash);
     if (!tx) {
-      throw constants.ERRORS.TX_NOT_FOUND;
+      throw BMAConstants.ERRORS.TX_NOT_FOUND;
     }
     if (tx.block_number) {
       tx.written_block = tx.block_number
diff --git a/app/modules/bma/lib/network.ts b/app/modules/bma/lib/network.ts
index 61e74ec38bdba9d8f32addcb403bd7d481591b4d..9d2c252c6a7e5808e070f278a20ed248fbc97480 100644
--- a/app/modules/bma/lib/network.ts
+++ b/app/modules/bma/lib/network.ts
@@ -163,7 +163,7 @@ export const Network = {
     }
 
     // Return API
-    return new BmaApi(interfaces, ddosInstance, httpServers, logger)
+    return new BmaApi(name, interfaces, ddosInstance, httpServers, logger)
   }
 }
 
@@ -172,6 +172,7 @@ export class BmaApi {
   private listenings:boolean[]
 
   constructor(
+    private name:string,
     private interfaces:any,
     private ddosInstance:any,
     private httpServers:any,
@@ -192,7 +193,7 @@ export class BmaApi {
     const isListening = this.listenings[i];
     if (isListening) {
       this.listenings[i] = false;
-      this.logger && this.logger.info(name + ' stop listening');
+      this.logger && this.logger.info(this.name + ' stop listening');
       await Q.Promise((resolve:any, reject:any) => {
         httpServer.errorPropagates((err:any) => {
           reject(err);
diff --git a/app/modules/crawler/lib/contacter.ts b/app/modules/crawler/lib/contacter.ts
index 5011485218778f1f5c981d533b462f31a6f83712..96cda407b0c4e418b0a93a60ccb6fb46a853ee15 100644
--- a/app/modules/crawler/lib/contacter.ts
+++ b/app/modules/crawler/lib/contacter.ts
@@ -1,8 +1,8 @@
 import {CrawlerConstants} from "./constants"
 
 const rp = require('request-promise');
-const sanitize = require('duniter-bma').duniter.methods.sanitize;
-const dtos = require('duniter-bma').duniter.methods.dtos;
+const sanitize = require('../../../modules/bma').BmaDependency.duniter.methods.sanitize;
+const dtos = require('../../../modules/bma').BmaDependency.duniter.methods.dtos;
 
 export class Contacter {
 
diff --git a/app/modules/crawler/lib/crawler.ts b/app/modules/crawler/lib/crawler.ts
index 5e67bc1d5948d27352b8195ac4c2303c2fcca1c7..4af7079cb5aa34e1edd339edb727543dc56ae7b2 100644
--- a/app/modules/crawler/lib/crawler.ts
+++ b/app/modules/crawler/lib/crawler.ts
@@ -374,7 +374,7 @@ export class BlockCrawler {
                 return server.dal.getCurrentBlockOrNull()
               }
               async remoteCurrent(source?: any): Promise<BlockDTO | null> {
-                return thePeer.getCurrent()
+                return source.getCurrent()
               }
               async remotePeers(source?: any): Promise<PeerDTO[]> {
                 return Promise.resolve([node])
diff --git a/app/modules/prover/index.ts b/app/modules/prover/index.ts
index 84937e761b934b51b567b7bc00e4ae3627e8bde1..9d343fb1f8c98841dedd97cbeed4f4a4211627c9 100644
--- a/app/modules/prover/index.ts
+++ b/app/modules/prover/index.ts
@@ -3,9 +3,9 @@ import {BlockGenerator, BlockGeneratorWhichProves} from "./lib/blockGenerator"
 import {Constants} from "./lib/constants"
 import {BlockProver} from "./lib/blockProver"
 import {Prover} from "./lib/prover"
+import {Contacter} from "../crawler/lib/contacter";
 
 const async = require('async');
-const contacter = require('duniter-crawler').duniter.methods.contacter;
 const common = require('duniter-common');
 
 const Peer = common.document.Peer
@@ -191,7 +191,7 @@ function proveAndSend(program:any, server:any, block:any, issuer:any, difficulty
           program.show && console.log(proven.getRawSigned());
           logger.info('Posted block ' + proven.getRawSigned());
           const p = Peer.fromJSON(peer);
-          const contact = contacter(p.getHostPreferDNS(), p.getPort());
+          const contact = new Contacter(p.getHostPreferDNS(), p.getPort());
           await contact.postBlock(proven.getRawSigned());
         } catch(e) {
           next(e);
diff --git a/package.json b/package.json
index 28e76655ca6f57058357c1c8b20808b1582ecbf9..ad6fec5e340083163fb74368a0e17e3a8f7acfcb 100644
--- a/package.json
+++ b/package.json
@@ -49,18 +49,28 @@
     "archiver": "1.3.0",
     "async": "2.2.0",
     "bindings": "1.2.1",
+    "body-parser": "1.17.1",
     "bs58": "^4.0.1",
     "co": "4.6.0",
     "colors": "1.1.2",
+    "cors": "2.8.2",
     "commander": "2.9.0",
     "daemonize2": "0.4.2",
+    "ddos": "0.1.16",
     "duniter-common": "1.4.x",
     "event-stream": "3.3.4",
+    "errorhandler": "1.5.0",
+    "express": "4.15.2",
+    "express-cors": "0.0.3",
+    "express-fileupload": "0.0.5",
     "heapdump": "^0.3.9",
     "inquirer": "3.0.6",
     "merkle": "0.5.1",
     "moment": "2.18.1",
+    "morgan": "1.8.1",
+    "multimeter": "0.1.1",
     "naclb": "1.3.9",
+    "nnupnp": "1.0.2",
     "node-pre-gyp": "0.6.34",
     "optimist": "0.6.1",
     "q-io": "1.13.2",
@@ -69,6 +79,7 @@
     "request-promise": "4.2.0",
     "seedrandom": "^2.4.3",
     "sha1": "1.1.1",
+    "scryptb": "6.0.4",
     "spawn-sync": "^1.0.15",
     "sqlite3": "3.1.4",
     "superagent": "3.5.2",
@@ -78,14 +89,14 @@
     "unzip": "0.1.11",
     "unzip2": "0.2.5",
     "winston": "2.3.1",
-    "wotb": "0.5.x"
+    "wotb": "0.5.x",
+    "ws": "1.1.1"
   },
   "devDependencies": {
     "@types/mocha": "^2.2.41",
     "@types/node": "^8.0.9",
     "@types/should": "^8.3.0",
     "coveralls": "2.11.4",
-    "duniter-ui": "1.3.x",
     "eslint": "3.13.1",
     "eslint-plugin-mocha": "4.8.0",
     "istanbul": "0.4.0",
diff --git a/server.ts b/server.ts
index 1aa0c167c7aa0d8b6523212a7a963791a93eb506..ada29a16bfb800ead06cc27970f1e1b03eb80413 100644
--- a/server.ts
+++ b/server.ts
@@ -66,7 +66,7 @@ export class Server extends stream.Duplex implements HookableServer {
 
     this.paramsP = directory.getHomeParams(memoryOnly, home)
 
-    this.MerkleService       = require("./app/lib/helpers/merkle");
+    this.MerkleService       = require("./app/lib/helpers/merkle").processForURL
     this.IdentityService     = new IdentityService()
     this.MembershipService   = new MembershipService()
     this.PeeringService      = new PeeringService(this)
diff --git a/test/integration/branches.js b/test/integration/branches.js
index e16696fe99c0888c6d13022ca249dc5d83f350f0..7c61d30dccde62b9059d6f01f00c6bbb6e19cf80 100644
--- a/test/integration/branches.js
+++ b/test/integration/branches.js
@@ -4,7 +4,7 @@ const _         = require('underscore');
 const co        = require('co');
 const should    = require('should');
 const duniter   = require('../../index');
-const bma       = require('duniter-bma').duniter.methods.bma;
+const bma       = require('../../app/modules/bma').BmaDependency.duniter.methods.bma;
 const rp        = require('request-promise');
 const httpTest  = require('./tools/http');
 
diff --git a/test/integration/branches2.js b/test/integration/branches2.js
index 9aeb656ff18e47d77946d1260adedc9e8a933b15..56edff1259e6f41e878238f27ff76984061fb7cc 100644
--- a/test/integration/branches2.js
+++ b/test/integration/branches2.js
@@ -3,7 +3,7 @@
 const co        = require('co');
 const _         = require('underscore');
 const duniter     = require('../../index');
-const bma       = require('duniter-bma').duniter.methods.bma;
+const bma       = require('../../app/modules/bma').BmaDependency.duniter.methods.bma;
 const user      = require('./tools/user');
 const constants = require('../../app/lib/constants');
 const rp        = require('request-promise');
@@ -15,7 +15,7 @@ const expectJSON     = httpTest.expectJSON;
 const expectHttpCode = httpTest.expectHttpCode;
 
 if (constants.MUTE_LOGS_DURING_UNIT_TESTS) {
-  require('../../app/lib/logger').NewLogger().mute();
+  // require('../../app/lib/logger').NewLogger().mute();
 }
 
 // Trace these errors
@@ -72,8 +72,8 @@ describe("SelfFork", function() {
 
     yield s1.initWithDAL().then(bma).then((bmapi) => bmapi.openConnections());
     yield s2.initWithDAL().then(bma).then((bmapi) => bmapi.openConnections());
-    s1.getMainEndpoint = require('duniter-bma').duniter.methods.getMainEndpoint
-    s2.getMainEndpoint = require('duniter-bma').duniter.methods.getMainEndpoint
+    s1.getMainEndpoint = require('../../app/modules/bma').BmaDependency.duniter.methods.getMainEndpoint
+    s2.getMainEndpoint = require('../../app/modules/bma').BmaDependency.duniter.methods.getMainEndpoint
 
     // Server 1
     yield cat.createIdentity();
@@ -106,7 +106,7 @@ describe("SelfFork", function() {
     yield s1.singleWritePromise(s2p);
 
     // Forking S1 from S2
-    return require('duniter-crawler').duniter.methods.pullBlocks(s1, s2p.pubkey);
+    return require('../../app/modules/crawler').CrawlerDependency.duniter.methods.pullBlocks(s1, s2p.pubkey);
   }));
 
   describe("Server 1 /blockchain", function() {
diff --git a/test/integration/branches_pending_data.js b/test/integration/branches_pending_data.js
index 9cf29a9b09b27ff136b72841c8cb8be1f5780e6b..378fc700006ea9f7a336db331c7ef2251ee9f458 100644
--- a/test/integration/branches_pending_data.js
+++ b/test/integration/branches_pending_data.js
@@ -3,7 +3,7 @@
 const co = require('co');
 const _         = require('underscore');
 const duniter   = require('../../index');
-const bma       = require('duniter-bma').duniter.methods.bma;
+const bma       = require('../../app/modules/bma').BmaDependency.duniter.methods.bma;
 const user      = require('./tools/user');
 const rp        = require('request-promise');
 const httpTest  = require('./tools/http');
diff --git a/test/integration/branches_revert.js b/test/integration/branches_revert.js
index f5a03a2b94934553499b8264938a51c2b748488f..71153f8c7ca9121ea72598673907d4b91d17530f 100644
--- a/test/integration/branches_revert.js
+++ b/test/integration/branches_revert.js
@@ -2,7 +2,7 @@
 
 const co = require('co');
 const _         = require('underscore');
-const bma       = require('duniter-bma').duniter.methods.bma;
+const bma       = require('../../app/modules/bma').BmaDependency.duniter.methods.bma;
 const user      = require('./tools/user');
 const toolbox   = require('./tools/toolbox');
 const commit    = require('./tools/commit');
diff --git a/test/integration/branches_revert2.js b/test/integration/branches_revert2.js
index 6845ac5a587ca08dd106738cff800405f6f3d2d6..2e963444e095645d534f2dd544e73e48ab09ba77 100644
--- a/test/integration/branches_revert2.js
+++ b/test/integration/branches_revert2.js
@@ -3,14 +3,14 @@
 const co = require('co');
 const _         = require('underscore');
 const duniter     = require('../../index');
-const bma       = require('duniter-bma').duniter.methods.bma;
+const bma       = require('../../app/modules/bma').BmaDependency.duniter.methods.bma;
 const user      = require('./tools/user');
 const rp        = require('request-promise');
 const httpTest  = require('./tools/http');
 const commit    = require('./tools/commit');
 
 require('../../app/modules/prover/lib/constants').Constants.CORES_MAXIMUM_USE_IN_PARALLEL = 1
-require('duniter-bma').duniter.methods.noLimit(); // Disables the HTTP limiter
+require('../../app/modules/bma').BmaDependency.duniter.methods.noLimit(); // Disables the HTTP limiter
 
 const expectJSON     = httpTest.expectJSON;
 const expectHttpCode = httpTest.expectHttpCode;
diff --git a/test/integration/branches_revert_memberships.js b/test/integration/branches_revert_memberships.js
index 6132aa45e1a5d479d1bc45aa9af55284cd8347d6..d6101ce35a8dc592b8df55db35e1550c33d5af47 100644
--- a/test/integration/branches_revert_memberships.js
+++ b/test/integration/branches_revert_memberships.js
@@ -2,7 +2,7 @@
 
 const co        = require('co');
 const should    = require('should');
-const bma       = require('duniter-bma').duniter.methods.bma;
+const bma       = require('../../app/modules/bma').BmaDependency.duniter.methods.bma;
 const user      = require('./tools/user');
 const commit    = require('./tools/commit');
 const toolbox   = require('./tools/toolbox');
diff --git a/test/integration/branches_switch.js b/test/integration/branches_switch.js
index bc62789d4aa9294af08a63619b7e0a7114106f2f..64128e1d022b3db7a679c774193cfa47abad163e 100644
--- a/test/integration/branches_switch.js
+++ b/test/integration/branches_switch.js
@@ -3,7 +3,7 @@
 const co = require('co');
 const _         = require('underscore');
 const duniter     = require('../../index');
-const bma       = require('duniter-bma').duniter.methods.bma;
+const bma       = require('../../app/modules/bma').BmaDependency.duniter.methods.bma;
 const user      = require('./tools/user');
 const rp        = require('request-promise');
 const httpTest  = require('./tools/http');
@@ -57,8 +57,8 @@ describe("Switch", function() {
   before(() => co(function *() {
     yield s1.initWithDAL().then(bma).then((bmapi) => bmapi.openConnections());
     yield s2.initWithDAL().then(bma).then((bmapi) => bmapi.openConnections());
-    s1.getMainEndpoint = require('duniter-bma').duniter.methods.getMainEndpoint
-    s2.getMainEndpoint = require('duniter-bma').duniter.methods.getMainEndpoint
+    s1.getMainEndpoint = require('../../app/modules/bma').BmaDependency.duniter.methods.getMainEndpoint
+    s2.getMainEndpoint = require('../../app/modules/bma').BmaDependency.duniter.methods.getMainEndpoint
     yield cat.createIdentity();
     yield toc.createIdentity();
     yield toc.cert(cat);
@@ -87,7 +87,7 @@ describe("Switch", function() {
     yield s1.singleWritePromise(s2p);
 
     // Forking S1 from S2
-    yield require('duniter-crawler').duniter.methods.pullBlocks(s1, s2p.pubkey);
+    yield require('../../app/modules/crawler').CrawlerDependency.duniter.methods.pullBlocks(s1, s2p.pubkey);
     // S1 should have switched to the other branch
   }));
 
diff --git a/test/integration/certification_chainability.js b/test/integration/certification_chainability.js
index 5731249fde98864ad1c17c4d77e75f4da0c67709..2e12d916d482671df1ced635ae7a84ce5fcf73d5 100644
--- a/test/integration/certification_chainability.js
+++ b/test/integration/certification_chainability.js
@@ -4,7 +4,7 @@ const _         = require('underscore');
 const co        = require('co');
 const should    = require('should');
 const duniter     = require('../../index');
-const bma       = require('duniter-bma').duniter.methods.bma;
+const bma       = require('../../app/modules/bma').BmaDependency.duniter.methods.bma;
 const user      = require('./tools/user');
 const constants = require('../../app/lib/constants');
 const rp        = require('request-promise');
diff --git a/test/integration/certifier-is-member.js b/test/integration/certifier-is-member.js
index 87026a463f8def8f80699b366b6c91a9cbed88e2..54562479e65abc5c1020fda6c14a975fc16c955d 100644
--- a/test/integration/certifier-is-member.js
+++ b/test/integration/certifier-is-member.js
@@ -5,7 +5,7 @@ const co        = require('co');
 const assert    = require('assert');
 const should    = require('should');
 const duniter   = require('../../index');
-const bma       = require('duniter-bma').duniter.methods.bma;
+const bma       = require('../../app/modules/bma').BmaDependency.duniter.methods.bma;
 const user      = require('./tools/user');
 const constants = require('../../app/lib/constants');
 const toolbox   = require('./tools/toolbox');
diff --git a/test/integration/collapse.js b/test/integration/collapse.js
index 9b602e302b759bea4ef8982e4cf54736f6e98eef..b1f35d6ace782c8bb0fe5949bcd529b069a4b7c1 100644
--- a/test/integration/collapse.js
+++ b/test/integration/collapse.js
@@ -3,7 +3,7 @@
 const co        = require('co');
 const _         = require('underscore');
 const duniter     = require('../../index');
-const bma       = require('duniter-bma').duniter.methods.bma;
+const bma       = require('../../app/modules/bma').BmaDependency.duniter.methods.bma;
 const user      = require('./tools/user');
 const commit    = require('./tools/commit');
 const httpTest  = require('./tools/http');
diff --git a/test/integration/continuous-proof.js b/test/integration/continuous-proof.js
index c373ddc1c66c6ad2123aabd7474e4108bce862ea..1b04ecbc680c94f6e60c75e9f35079c05ff79a1d 100644
--- a/test/integration/continuous-proof.js
+++ b/test/integration/continuous-proof.js
@@ -106,7 +106,7 @@ describe("Continous proof-of-work", function() {
     yield s2.until('block', 15);
     s2.stopBlockComputation();
     yield [
-      require('duniter-crawler').duniter.methods.pullBlocks(s3),
+      require('../../app/modules/crawler').CrawlerDependency.duniter.methods.pullBlocks(s3),
       s3.startBlockComputation()
     ];
     yield s3.expectJSON('/blockchain/current', { number: 15 });
diff --git a/test/integration/crosschain-test.js b/test/integration/crosschain-test.js
index 60850a66003a7a3d71cd0581cd2f2bf44fdec234..ae5c90827073d196c289d77aaa9c31d6092b470b 100644
--- a/test/integration/crosschain-test.js
+++ b/test/integration/crosschain-test.js
@@ -5,7 +5,7 @@ const _ = require('underscore');
 const assert = require('assert');
 const should = require('should');
 const rp        = require('request-promise');
-const bma       = require('duniter-bma').duniter.methods.bma;
+const bma       = require('../../app/modules/bma').BmaDependency.duniter.methods.bma;
 const commit    = require('./tools/commit');
 const toolbox = require('./tools/toolbox');
 const user   = require('./tools/user');
diff --git a/test/integration/forwarding.js b/test/integration/forwarding.js
index a57f8a563c097530eb02da063ca209f58aa40bc2..0898b7cc511e4856135c7d19807f30fd500df5fc 100644
--- a/test/integration/forwarding.js
+++ b/test/integration/forwarding.js
@@ -9,7 +9,7 @@ const user   = require('./tools/user');
 const jspckg = require('../../package');
 const constants = require('../../app/lib/constants');
 
-require('duniter-bma').duniter.methods.noLimit(); // Disables the HTTP limiter
+require('../../app/modules/bma').BmaDependency.duniter.methods.noLimit(); // Disables the HTTP limiter
 
 if (constants.MUTE_LOGS_DURING_UNIT_TESTS) {
   // require('../../app/lib/logger').NewLogger().mute();
diff --git a/test/integration/http_api.js b/test/integration/http_api.js
index 84747eaa22e2dff429c88c99e5ad94be68c9bbc3..e12c6233ccdd9cf0c2d59875ccc766cee6115c36 100644
--- a/test/integration/http_api.js
+++ b/test/integration/http_api.js
@@ -5,7 +5,7 @@ const _         = require('underscore');
 const should    = require('should');
 const assert    = require('assert');
 const duniter     = require('../../index');
-const bma       = require('duniter-bma').duniter.methods.bma;
+const bma       = require('../../app/modules/bma').BmaDependency.duniter.methods.bma;
 const user      = require('./tools/user');
 const http      = require('./tools/http');
 const constants = require('../../app/lib/constants');
diff --git a/test/integration/identity-absorption.js b/test/integration/identity-absorption.js
index 74b7a2ed3dde6a6c969b26f1ad9eaa4327cf5130..88734c94ab31d116b990737454bcbdbecbe655ba 100644
--- a/test/integration/identity-absorption.js
+++ b/test/integration/identity-absorption.js
@@ -3,7 +3,7 @@
 const _         = require('underscore');
 const co        = require('co');
 const duniter     = require('../../index');
-const bma       = require('duniter-bma').duniter.methods.bma;
+const bma       = require('../../app/modules/bma').BmaDependency.duniter.methods.bma;
 const user      = require('./tools/user');
 const rp        = require('request-promise');
 const httpTest  = require('./tools/http');
diff --git a/test/integration/identity-clean-test.js b/test/integration/identity-clean-test.js
index 2ee0fc13607cffd016d48c9a51eba339fe756fc7..7e46bb0e07aae6035be9398561616ef074affa5c 100644
--- a/test/integration/identity-clean-test.js
+++ b/test/integration/identity-clean-test.js
@@ -3,7 +3,7 @@
 const _         = require('underscore');
 const co        = require('co');
 const duniter     = require('../../index');
-const bma       = require('duniter-bma').duniter.methods.bma;
+const bma       = require('../../app/modules/bma').BmaDependency.duniter.methods.bma;
 const user      = require('./tools/user');
 const rp        = require('request-promise');
 const httpTest  = require('./tools/http');
diff --git a/test/integration/identity-expiry.js b/test/integration/identity-expiry.js
index 17fc852da291f28188132e8a510d1ea448dfa5a7..1104f5c993c931bf6972762d7b4025e256f416be 100644
--- a/test/integration/identity-expiry.js
+++ b/test/integration/identity-expiry.js
@@ -4,7 +4,7 @@ const _         = require('underscore');
 const co        = require('co');
 const should    = require('should');
 const duniter   = require('../../index');
-const bma       = require('duniter-bma').duniter.methods.bma;
+const bma       = require('../../app/modules/bma').BmaDependency.duniter.methods.bma;
 const prover    = require('../../app/modules/prover').ProverDependency.duniter.methods;
 const user      = require('./tools/user');
 const constants = require('../../app/lib/constants');
diff --git a/test/integration/identity-implicit-revocation.js b/test/integration/identity-implicit-revocation.js
index d477a926ef7c0a331d440591875d795d0c0eab39..704cb92bdbf7184414a4b934aedc1b62fb2c2950 100644
--- a/test/integration/identity-implicit-revocation.js
+++ b/test/integration/identity-implicit-revocation.js
@@ -5,7 +5,7 @@ const co        = require('co');
 const assert    = require('assert');
 const should    = require('should');
 const duniter   = require('../../index');
-const bma       = require('duniter-bma').duniter.methods.bma;
+const bma       = require('../../app/modules/bma').BmaDependency.duniter.methods.bma;
 const user      = require('./tools/user');
 const constants = require('../../app/lib/constants');
 const toolbox   = require('./tools/toolbox');
diff --git a/test/integration/identity-kicking-by-certs.js b/test/integration/identity-kicking-by-certs.js
index 0f9c14b45c371b353356cdafe2757b68f3ca9d74..e1da87805ea7ad3d6d14ac6c96fb505357fcfd64 100644
--- a/test/integration/identity-kicking-by-certs.js
+++ b/test/integration/identity-kicking-by-certs.js
@@ -5,7 +5,7 @@ const co        = require('co');
 const assert    = require('assert');
 const should    = require('should');
 const duniter   = require('../../index');
-const bma       = require('duniter-bma').duniter.methods.bma;
+const bma       = require('../../app/modules/bma').BmaDependency.duniter.methods.bma;
 const user      = require('./tools/user');
 const constants = require('../../app/lib/constants');
 const toolbox   = require('./tools/toolbox');
diff --git a/test/integration/identity-kicking.js b/test/integration/identity-kicking.js
index 9a1e996bb765c2c5b51d0e0cf5dc4d1a0c03b7ff..76e15b59bb1b5d849a4e345b8b8a6c7b5f092a04 100644
--- a/test/integration/identity-kicking.js
+++ b/test/integration/identity-kicking.js
@@ -4,7 +4,7 @@ const _         = require('underscore');
 const co        = require('co');
 const should    = require('should');
 const duniter   = require('../../index');
-const bma       = require('duniter-bma').duniter.methods.bma;
+const bma       = require('../../app/modules/bma').BmaDependency.duniter.methods.bma;
 const user      = require('./tools/user');
 const constants = require('../../app/lib/constants');
 const rp        = require('request-promise');
diff --git a/test/integration/identity-pulling.js b/test/integration/identity-pulling.js
index 6379137328e1e40b4028ba1332c2f32f4d6d330c..2f1a2f3c122ab63b952aa94447743b9188cfae8d 100644
--- a/test/integration/identity-pulling.js
+++ b/test/integration/identity-pulling.js
@@ -98,7 +98,7 @@ describe("Identity pulling", function() {
   it('s1 should be able to pull sandbox data from s2', () => co(function*() {
 
     yield s2.sharePeeringWith(s1)
-    const pullSandbox = require('duniter-crawler').duniter.methods.pullSandbox
+    const pullSandbox = require('../../app/modules/crawler').CrawlerDependency.duniter.methods.pullSandbox
     yield pullSandbox(s1)
     yield pullSandbox(s1)
 
diff --git a/test/integration/identity-same-pubkey.js b/test/integration/identity-same-pubkey.js
index 251e288c9fef19f03c5c0896bbb6b995006bc2b4..cf2f307eb53a68f51bb631077ae073a27770caf9 100644
--- a/test/integration/identity-same-pubkey.js
+++ b/test/integration/identity-same-pubkey.js
@@ -2,7 +2,7 @@
 
 const co        = require('co');
 const should    = require('should');
-const bma       = require('duniter-bma').duniter.methods.bma;
+const bma       = require('../../app/modules/bma').BmaDependency.duniter.methods.bma;
 const user      = require('./tools/user');
 const commit    = require('./tools/commit');
 const toolbox   = require('./tools/toolbox');
diff --git a/test/integration/identity-test.js b/test/integration/identity-test.js
index bcb51094bad3fa2c65823c1efd28a528b8e6d811..46a0ee0a038b3b377c3a3bebbd309cd5627e68c6 100644
--- a/test/integration/identity-test.js
+++ b/test/integration/identity-test.js
@@ -4,14 +4,14 @@ const _         = require('underscore');
 const co        = require('co');
 const should    = require('should');
 const duniter     = require('../../index');
-const bma       = require('duniter-bma').duniter.methods.bma;
+const bma       = require('../../app/modules/bma').BmaDependency.duniter.methods.bma;
 const user      = require('./tools/user');
 const constants = require('../../app/lib/constants');
 const rp        = require('request-promise');
 const httpTest  = require('./tools/http');
 const commit    = require('./tools/commit');
 
-require('duniter-bma').duniter.methods.noLimit(); // Disables the HTTP limiter
+require('../../app/modules/bma').BmaDependency.duniter.methods.noLimit(); // Disables the HTTP limiter
 
 const expectAnswer   = httpTest.expectAnswer;
 
diff --git a/test/integration/lookup.js b/test/integration/lookup.js
index 84fdf26c17f03c0063c8ea1858bc1a5141d82413..5bdbcf79c30396e9ec0ab7a1b365b0fa119fb87a 100644
--- a/test/integration/lookup.js
+++ b/test/integration/lookup.js
@@ -3,7 +3,7 @@
 const _         = require('underscore');
 const co        = require('co');
 const duniter     = require('../../index');
-const bma       = require('duniter-bma').duniter.methods.bma;
+const bma       = require('../../app/modules/bma').BmaDependency.duniter.methods.bma;
 const user      = require('./tools/user');
 const rp        = require('request-promise');
 const httpTest  = require('./tools/http');
diff --git a/test/integration/peer-outdated.js b/test/integration/peer-outdated.js
index fbc91d6e430456efeddd545e05cb42434df19590..d9d4721bef961d6318fedda1899651e32edc2336 100644
--- a/test/integration/peer-outdated.js
+++ b/test/integration/peer-outdated.js
@@ -4,7 +4,7 @@ const co        = require('co');
 const should    = require('should');
 const es        = require('event-stream');
 const _         = require('underscore');
-const bma       = require('duniter-bma').duniter.methods.bma;
+const bma       = require('../../app/modules/bma').BmaDependency.duniter.methods.bma;
 const user      = require('./tools/user');
 const commit    = require('./tools/commit');
 const until     = require('./tools/until');
diff --git a/test/integration/peerings.js b/test/integration/peerings.js
index dbbd98fed35691e21dc218564b3c1dc7b08f6346..f1dbdb253f0d4f96a98ae312e4cf181e85e49618 100644
--- a/test/integration/peerings.js
+++ b/test/integration/peerings.js
@@ -4,14 +4,14 @@ const co        = require('co');
 const _         = require('underscore');
 const should    = require('should');
 const duniter     = require('../../index');
-const bma       = require('duniter-bma').duniter.methods.bma;
+const bma       = require('../../app/modules/bma').BmaDependency.duniter.methods.bma;
 const user      = require('./tools/user');
 const constants = require('../../app/lib/constants');
 const rp        = require('request-promise');
 const httpTest  = require('./tools/http');
 const commit    = require('./tools/commit');
 const sync      = require('./tools/sync');
-const contacter  = require('duniter-crawler').duniter.methods.contacter;
+const contacter  = require('../../app/modules/crawler').CrawlerDependency.duniter.methods.contacter;
 const until     = require('./tools/until');
 const multicaster = require('../../app/lib/streams/multicaster');
 const PeerDTO = require('../../app/lib/dto/PeerDTO').PeerDTO
@@ -78,7 +78,7 @@ describe("Network", function() {
     const commitS3 = commit(s3);
 
     return [s1, s2, s3].reduce(function(p, server) {
-      server.getMainEndpoint = require('duniter-bma').duniter.methods.getMainEndpoint
+      server.getMainEndpoint = require('../../app/modules/bma').BmaDependency.duniter.methods.getMainEndpoint
       return p
         .then(function(){
           return server
diff --git a/test/integration/peers-same-pubkey.js b/test/integration/peers-same-pubkey.js
index 12bc7d221aa4273cc9d1651c4b678653e5c29e36..414f42e9ee569ce2c38e4038aabf1d6bfa44545d 100644
--- a/test/integration/peers-same-pubkey.js
+++ b/test/integration/peers-same-pubkey.js
@@ -3,7 +3,7 @@
 const co        = require('co');
 const _         = require('underscore');
 const should    = require('should');
-const bma       = require('duniter-bma').duniter.methods.bma;
+const bma       = require('../../app/modules/bma').BmaDependency.duniter.methods.bma;
 const user      = require('./tools/user');
 const commit    = require('./tools/commit');
 const sync      = require('./tools/sync');
diff --git a/test/integration/revocation-test.js b/test/integration/revocation-test.js
index 08f29dc37ac44a1febe3350ae973a48d63be9cc6..ab0aff83139c830f4619b8eee70e5c40970d8897 100644
--- a/test/integration/revocation-test.js
+++ b/test/integration/revocation-test.js
@@ -4,7 +4,7 @@ const _         = require('underscore');
 const co        = require('co');
 const should    = require('should');
 const duniter   = require('../../index');
-const bma       = require('duniter-bma').duniter.methods.bma;
+const bma       = require('../../app/modules/bma').BmaDependency.duniter.methods.bma;
 const user      = require('./tools/user');
 const rp        = require('request-promise');
 const httpTest  = require('./tools/http');
@@ -12,7 +12,7 @@ const commit    = require('./tools/commit');
 
 const expectAnswer  = httpTest.expectAnswer;
 
-require('duniter-bma').duniter.methods.noLimit(); // Disables the HTTP limiter
+require('../../app/modules/bma').BmaDependency.duniter.methods.noLimit(); // Disables the HTTP limiter
 
 const MEMORY_MODE = true;
 const commonConf = {
diff --git a/test/integration/server-import-export.js b/test/integration/server-import-export.js
index 71436b16cc4a51655d7850f1226620f262256f5a..da836bfc6041cbb26e513ea3ff4f8626cddfee80 100644
--- a/test/integration/server-import-export.js
+++ b/test/integration/server-import-export.js
@@ -6,7 +6,7 @@ const co = require('co');
 const unzip = require('unzip');
 const toolbox = require('../integration/tools/toolbox');
 const user    = require('../integration/tools/user');
-const bma     = require('duniter-bma').duniter.methods.bma;
+const bma     = require('../../app/modules/bma').BmaDependency.duniter.methods.bma;
 
 const serverConfig = {
   memory: false,
diff --git a/test/integration/server-sandbox.js b/test/integration/server-sandbox.js
index 5a3a44936c860cbbe148dc80ef375118738a6774..e76ef7a1b9cdd51657379870cd3c35064cfe3e47 100644
--- a/test/integration/server-sandbox.js
+++ b/test/integration/server-sandbox.js
@@ -2,7 +2,7 @@
 
 const co        = require('co');
 const should    = require('should');
-const bma       = require('duniter-bma').duniter.methods.bma;
+const bma       = require('../../app/modules/bma').BmaDependency.duniter.methods.bma;
 const common    = require('duniter-common');
 const user      = require('./tools/user');
 const commit    = require('./tools/commit');
diff --git a/test/integration/sources_property.js b/test/integration/sources_property.js
index 8812bd4e220ab1923d3d2063c428d68af89795e8..db5aa482273dc91c2288c0efc0a7b2bf4180a516 100644
--- a/test/integration/sources_property.js
+++ b/test/integration/sources_property.js
@@ -5,7 +5,7 @@ const _ = require('underscore');
 const should = require('should');
 const assert = require('assert');
 const constants = require('../../app/lib/constants');
-const bma       = require('duniter-bma').duniter.methods.bma;
+const bma       = require('../../app/modules/bma').BmaDependency.duniter.methods.bma;
 const toolbox   = require('./tools/toolbox');
 const node   = require('./tools/node');
 const unit   = require('./tools/unit');
diff --git a/test/integration/start_generate_blocks.js b/test/integration/start_generate_blocks.js
index 112d548f908c0ec1a0b6332e111b000198428190..1042306756c8e7dcc5192b31b742ddab7c8cf7fb 100644
--- a/test/integration/start_generate_blocks.js
+++ b/test/integration/start_generate_blocks.js
@@ -3,7 +3,7 @@
 const co        = require('co');
 const _         = require('underscore');
 const duniter     = require('../../index');
-const bma       = require('duniter-bma').duniter.methods.bma;
+const bma       = require('../../app/modules/bma').BmaDependency.duniter.methods.bma;
 const user      = require('./tools/user');
 const rp        = require('request-promise');
 const httpTest  = require('./tools/http');
@@ -11,7 +11,7 @@ const commit    = require('./tools/commit');
 const until     = require('./tools/until');
 const multicaster = require('../../app/lib/streams/multicaster');
 const PeerDTO   = require('../../app/lib/dto/PeerDTO').PeerDTO
-const contacter  = require('duniter-crawler').duniter.methods.contacter;
+const contacter  = require('../../app/modules/crawler').CrawlerDependency.duniter.methods.contacter;
 const sync      = require('./tools/sync');
 
 const expectJSON     = httpTest.expectJSON;
@@ -67,7 +67,7 @@ describe("Generation", function() {
     return co(function *() {
       let servers = [s1, s2];
       for (const server of servers) {
-        server.getMainEndpoint = require('duniter-bma').duniter.methods.getMainEndpoint
+        server.getMainEndpoint = require('../../app/modules/bma').BmaDependency.duniter.methods.getMainEndpoint
         yield server.initWithDAL();
         server.bma = yield bma(server);
         yield server.bma.openConnections();
diff --git a/test/integration/tests.js b/test/integration/tests.js
index 509cc582899aa86deb8fd8b58990808e7a8f7c34..950aa719a26c9c4aba00da2d23b15d65e7476111 100644
--- a/test/integration/tests.js
+++ b/test/integration/tests.js
@@ -4,7 +4,7 @@ const co = require('co');
 const _ = require('underscore');
 const should = require('should');
 const assert = require('assert');
-const bma       = require('duniter-bma').duniter.methods.bma;
+const bma       = require('../../app/modules/bma').BmaDependency.duniter.methods.bma;
 const constants = require('../../app/lib/constants');
 const node   = require('./tools/node');
 const duniter     = require('../../index');
@@ -17,7 +17,7 @@ const rp        = require('request-promise');
 const expectAnswer   = httpTest.expectAnswer;
 const MEMORY_MODE = true;
 
-require('duniter-bma').duniter.methods.noLimit(); // Disables the HTTP limiter
+require('../../app/modules/bma').BmaDependency.duniter.methods.noLimit(); // Disables the HTTP limiter
 
 describe("Integration", function() {
 
diff --git a/test/integration/tools/node.js b/test/integration/tools/node.js
index 43241a360e0fb97925fd091769844944c3a51614..eaca6d3ea846e5dbebc2e29022603d216d8245ec 100644
--- a/test/integration/tools/node.js
+++ b/test/integration/tools/node.js
@@ -3,14 +3,14 @@ var co = require('co');
 var _ = require('underscore');
 var async  = require('async');
 var request  = require('request');
-var contacter = require('duniter-crawler').duniter.methods.contacter;
+var contacter = require('../../../app/modules/crawler').CrawlerDependency.duniter.methods.contacter;
 var duniter  = require('../../../index');
 var multicaster = require('../../../app/lib/streams/multicaster');
 var ConfDTO = require('../../../app/lib/dto/ConfDTO').ConfDTO
 var PeerDTO   = require('../../../app/lib/dto/PeerDTO').PeerDTO
 var user   = require('./user');
 var http   = require('./http');
-const bma = require('duniter-bma').duniter.methods.bma;
+const bma = require('../../../app/modules/bma').BmaDependency.duniter.methods.bma;
 
 module.exports = function (dbName, options) {
   return new Node(dbName, options);
@@ -147,9 +147,8 @@ function Node (dbName, options) {
   function service(callback) {
     return function () {
       const stack = duniter.statics.simpleStack();
-      for (const name of ['duniter-keypair', 'duniter-bma']) {
-        stack.registerDependency(require(name), name);
-      }
+      stack.registerDependency(require('../../../app/modules/keypair').KeypairDependency, 'duniter-keypair')
+      stack.registerDependency(require('../../../app/modules/bma').BmaDependency,         'duniter-bma')
       stack.registerDependency({
         duniter: {
           config: {
diff --git a/test/integration/tools/toolbox.js b/test/integration/tools/toolbox.js
index 54927ea799ec0640d0d19802cd13221a79301384..eef84362e285f3eb0da1f8f239ecda674d06c813 100644
--- a/test/integration/tools/toolbox.js
+++ b/test/integration/tools/toolbox.js
@@ -19,11 +19,11 @@ const sync = require('../tools/sync');
 const commit = require('../tools/commit');
 const user = require('../tools/user');
 const until = require('../tools/until');
-const bma = require('duniter-bma').duniter.methods.bma;
+const bma = require('../../../app/modules/bma').BmaDependency.duniter.methods.bma;
 const multicaster = require('../../../app/lib/streams/multicaster');
-const dtos = require('duniter-bma').duniter.methods.dtos;
+const dtos = require('../../../app/modules/bma').BmaDependency.duniter.methods.dtos;
 const logger = require('../../../app/lib/logger').NewLogger('toolbox');
-require('duniter-bma').duniter.methods.noLimit(); // Disables the HTTP limiter
+require('../../../app/modules/bma').BmaDependency.duniter.methods.noLimit(); // Disables the HTTP limiter
 const MEMORY_MODE = true;
 const CURRENCY_NAME = 'duniter_unit_test_currency';
 const HOST = '127.0.0.1';
@@ -109,7 +109,7 @@ exports.fakeSyncServer = (readBlocksMethod, readParticularBlockMethod, onPeersRe
         canAnswerNow: () => true,
         processRequest: () => { }
     };
-    const fakeServer = yield require('duniter-bma').duniter.methods.createServersAndListen("Fake Duniter Server", { conf: {} }, [{
+    const fakeServer = yield require('../../../app/modules/bma').BmaDependency.duniter.methods.createServersAndListen("Fake Duniter Server", { conf: {} }, [{
             ip: host,
             port: port
         }], NO_HTTP_LOGS, logger, NO_STATIC_PATH, (app, httpMethods) => {
@@ -166,7 +166,7 @@ class TestingServer {
     constructor(port, server) {
         this.port = port;
         this.server = server;
-        server.getMainEndpoint = require('duniter-bma').duniter.methods.getMainEndpoint;
+        server.getMainEndpoint = require('../../../app/modules/bma').BmaDependency.duniter.methods.getMainEndpoint;
     }
     get BlockchainService() {
         return this.server.BlockchainService;
diff --git a/test/integration/tools/toolbox.ts b/test/integration/tools/toolbox.ts
index e3ec93af89fdb9bbd93a77bd35c98e244cca5bc3..7ccd7a6a1b97c9aa5f1649435cd9d77f46d4739b 100644
--- a/test/integration/tools/toolbox.ts
+++ b/test/integration/tools/toolbox.ts
@@ -14,12 +14,12 @@ const sync        = require('../tools/sync');
 const commit      = require('../tools/commit');
 const user        = require('../tools/user');
 const until       = require('../tools/until');
-const bma         = require('duniter-bma').duniter.methods.bma;
+const bma         = require('../../../app/modules/bma').BmaDependency.duniter.methods.bma;
 const multicaster = require('../../../app/lib/streams/multicaster');
-const dtos        = require('duniter-bma').duniter.methods.dtos;
+const dtos        = require('../../../app/modules/bma').BmaDependency.duniter.methods.dtos;
 const logger      = require('../../../app/lib/logger').NewLogger('toolbox');
 
-require('duniter-bma').duniter.methods.noLimit(); // Disables the HTTP limiter
+require('../../../app/modules/bma').BmaDependency.duniter.methods.noLimit(); // Disables the HTTP limiter
 
 const MEMORY_MODE = true;
 const CURRENCY_NAME = 'duniter_unit_test_currency';
@@ -135,7 +135,7 @@ export const fakeSyncServer = async (readBlocksMethod:any, readParticularBlockMe
     processRequest: () => { /* Does nothing */ }
   };
 
-  const fakeServer = await require('duniter-bma').duniter.methods.createServersAndListen("Fake Duniter Server", { conf: {} }, [{
+  const fakeServer = await require('../../../app/modules/bma').BmaDependency.duniter.methods.createServersAndListen("Fake Duniter Server", { conf: {} }, [{
     ip: host,
     port: port
   }], NO_HTTP_LOGS, logger, NO_STATIC_PATH, (app:any, httpMethods:any) => {
@@ -216,7 +216,7 @@ export class TestingServer {
     private port:number,
     private server:Server) {
 
-    server.getMainEndpoint = require('duniter-bma').duniter.methods.getMainEndpoint
+    server.getMainEndpoint = require('../../../app/modules/bma').BmaDependency.duniter.methods.getMainEndpoint
   }
 
   get BlockchainService() {
diff --git a/test/integration/tools/user.js b/test/integration/tools/user.js
index 6ef3ede138759bd5de0264f3e72c876fcffc3b09..d2912b6e6ba359ebd6f4511f15e597fd5c7f8bfb 100644
--- a/test/integration/tools/user.js
+++ b/test/integration/tools/user.js
@@ -3,7 +3,7 @@ const co      = require('co');
 const _ = require('underscore');
 const async		= require('async');
 const request	= require('request');
-const contacter = require('duniter-crawler').duniter.methods.contacter;
+const contacter = require('../../../app/modules/crawler').CrawlerDependency.duniter.methods.contacter;
 const common  = require('duniter-common');
 const ucp     = common.buid;
 const parsers = require('duniter-common').parsers;
diff --git a/test/integration/transactions-chaining.js b/test/integration/transactions-chaining.js
index 7d867158cc85ede461180752933a959712382a83..0ef947b48cf70b14e15bcbb67a5db09a91ee31f0 100644
--- a/test/integration/transactions-chaining.js
+++ b/test/integration/transactions-chaining.js
@@ -5,7 +5,7 @@ const _ = require('underscore');
 const should = require('should');
 const assert = require('assert');
 const constants = require('../../app/lib/constants');
-const bma       = require('duniter-bma').duniter.methods.bma;
+const bma       = require('../../app/modules/bma').BmaDependency.duniter.methods.bma;
 const common    = require('duniter-common');
 const toolbox   = require('./tools/toolbox');
 const node   = require('./tools/node');
diff --git a/test/integration/transactions-cltv.js b/test/integration/transactions-cltv.js
index eb0a89c7742eccb2e0663e16cf140242da74d5c7..61138251754a46d7357935de8507d61373701696 100644
--- a/test/integration/transactions-cltv.js
+++ b/test/integration/transactions-cltv.js
@@ -5,7 +5,7 @@ const _ = require('underscore');
 const should = require('should');
 const assert = require('assert');
 const constants = require('../../app/lib/constants');
-const bma       = require('duniter-bma').duniter.methods.bma;
+const bma       = require('../../app/modules/bma').BmaDependency.duniter.methods.bma;
 const toolbox   = require('./tools/toolbox');
 const node   = require('./tools/node');
 const unit   = require('./tools/unit');
diff --git a/test/integration/transactions-csv.js b/test/integration/transactions-csv.js
index 5ce58c9e175ba2b55127ab7f7b344b24123822d9..fbf95d4518cf963fd90c948ec1276f43f9c3eb53 100644
--- a/test/integration/transactions-csv.js
+++ b/test/integration/transactions-csv.js
@@ -5,7 +5,7 @@ const _ = require('underscore');
 const should = require('should');
 const assert = require('assert');
 const constants = require('../../app/lib/constants');
-const bma       = require('duniter-bma').duniter.methods.bma;
+const bma       = require('../../app/modules/bma').BmaDependency.duniter.methods.bma;
 const toolbox   = require('./tools/toolbox');
 const node   = require('./tools/node');
 const unit   = require('./tools/unit');
diff --git a/test/integration/transactions-test.js b/test/integration/transactions-test.js
index aab8f40f6863789f2057a69bc742646e2e1e7427..eb0e7f5a7995c95a8d95d76dba724633616f67f2 100644
--- a/test/integration/transactions-test.js
+++ b/test/integration/transactions-test.js
@@ -5,7 +5,7 @@ const _ = require('underscore');
 const should = require('should');
 const assert = require('assert');
 const constants = require('../../app/lib/constants');
-const bma       = require('duniter-bma').duniter.methods.bma;
+const bma       = require('../../app/modules/bma').BmaDependency.duniter.methods.bma;
 const toolbox   = require('./tools/toolbox');
 const node   = require('./tools/node');
 const user   = require('./tools/user');
diff --git a/test/integration/v0.4-times.js b/test/integration/v0.4-times.js
index c9f7cc61f48e011909d73dede3c87b9fdda725f1..419a231dec95ef14d451093ed47c9f9229e28ee4 100644
--- a/test/integration/v0.4-times.js
+++ b/test/integration/v0.4-times.js
@@ -2,7 +2,7 @@
 
 const co        = require('co');
 const should    = require('should');
-const bma       = require('duniter-bma').duniter.methods.bma;
+const bma       = require('../../app/modules/bma').BmaDependency.duniter.methods.bma;
 const commit    = require('./tools/commit');
 const toolbox   = require('./tools/toolbox');
 
diff --git a/test/integration/v0.5-identity-blockstamp.js b/test/integration/v0.5-identity-blockstamp.js
index 3cda2091019a473e2d7e411ff3fe985afc1ff277..06dd57f795812e683df2b0605efd627596237f60 100644
--- a/test/integration/v0.5-identity-blockstamp.js
+++ b/test/integration/v0.5-identity-blockstamp.js
@@ -2,7 +2,7 @@
 
 const co        = require('co');
 const should    = require('should');
-const bma       = require('duniter-bma').duniter.methods.bma;
+const bma       = require('../../app/modules/bma').BmaDependency.duniter.methods.bma;
 const constants = require('../../app/lib/constants');
 const toolbox   = require('./tools/toolbox');
 
diff --git a/test/integration/v0.5-transactions.js b/test/integration/v0.5-transactions.js
index 9a3ac591602b23261ef35644c1662576678b0c2e..dc4180c06e13fbecdaf038e6582a656ecf8563d0 100644
--- a/test/integration/v0.5-transactions.js
+++ b/test/integration/v0.5-transactions.js
@@ -2,7 +2,7 @@
 
 const co        = require('co');
 const should    = require('should');
-const bma       = require('duniter-bma').duniter.methods.bma;
+const bma       = require('../../app/modules/bma').BmaDependency.duniter.methods.bma;
 const constants = require('../../app/lib/constants');
 const toolbox   = require('./tools/toolbox');
 
diff --git a/test/integration/v0.6-difficulties.js b/test/integration/v0.6-difficulties.js
index 64f98bef6c75053e74f8ffeac23e480aa16a19e5..f4b7e76b0337ef314b558838883159c653582a22 100644
--- a/test/integration/v0.6-difficulties.js
+++ b/test/integration/v0.6-difficulties.js
@@ -2,7 +2,7 @@
 
 const co        = require('co');
 const should    = require('should');
-const bma       = require('duniter-bma').duniter.methods.bma;
+const bma       = require('../../app/modules/bma').BmaDependency.duniter.methods.bma;
 const constants = require('../../app/lib/constants');
 const toolbox   = require('./tools/toolbox');
 
diff --git a/test/integration/v1.0-double-dividend.js b/test/integration/v1.0-double-dividend.js
index fde26bb813628f3044dae3c31356ca6aa8f69674..bc51db461ba5a4951ffc5d8b060c8c5846b97b0b 100644
--- a/test/integration/v1.0-double-dividend.js
+++ b/test/integration/v1.0-double-dividend.js
@@ -2,7 +2,7 @@
 
 const co        = require('co');
 const should    = require('should');
-const bma       = require('duniter-bma').duniter.methods.bma;
+const bma       = require('../../app/modules/bma').BmaDependency.duniter.methods.bma;
 const constants = require('../../app/lib/constants');
 const toolbox   = require('./tools/toolbox');
 
diff --git a/test/integration/v1.0-g1-dividend-long-run.js b/test/integration/v1.0-g1-dividend-long-run.js
index 4cd3a0266b14aab0f22926dc6d702cee41e280d6..48b0e70f6f966167d5810883076995c984c816b5 100644
--- a/test/integration/v1.0-g1-dividend-long-run.js
+++ b/test/integration/v1.0-g1-dividend-long-run.js
@@ -2,7 +2,7 @@
 
 const co        = require('co');
 const should    = require('should');
-const bma       = require('duniter-bma').duniter.methods.bma;
+const bma       = require('../../app/modules/bma').BmaDependency.duniter.methods.bma;
 const constants = require('../../app/lib/constants');
 const toolbox   = require('./tools/toolbox');
 
diff --git a/test/integration/v1.0-g1-dividend.js b/test/integration/v1.0-g1-dividend.js
index 14bf41ca57911f8e21c4d3fe216791c65c8b3017..d3dd6b946c3eb32ef38f7ed93fed169ae891eda1 100644
--- a/test/integration/v1.0-g1-dividend.js
+++ b/test/integration/v1.0-g1-dividend.js
@@ -2,7 +2,7 @@
 
 const co        = require('co');
 const should    = require('should');
-const bma       = require('duniter-bma').duniter.methods.bma;
+const bma       = require('../../app/modules/bma').BmaDependency.duniter.methods.bma;
 const constants = require('../../app/lib/constants');
 const toolbox   = require('./tools/toolbox');
 
diff --git a/test/integration/v1.0-modules-api.js b/test/integration/v1.0-modules-api.js
index 79a13af03099411c1a189185e4d5a98d5619cb91..d0e79e535a20b8d4bb3c5acc2ba3b8b98761a4ce 100644
--- a/test/integration/v1.0-modules-api.js
+++ b/test/integration/v1.0-modules-api.js
@@ -43,7 +43,7 @@ describe("v1.0 Module API", () => {
 
     sStack.registerDependency(helloDependency, 'duniter-hello');
     sStack.registerDependency(helloDependency, 'duniter-hello'); // Try to load it 2 times, should not throw an error
-    sStack.registerDependency(require('duniter-keypair'), 'duniter-keypair');
+    sStack.registerDependency(require('../../app/modules/keypair').KeypairDependency, 'duniter-keypair');
     aStack.registerDependency(helloDependency, 'duniter-hello');
 
     (yield sStack.executeStack(['node', 'index.js', '--memory', 'hello', 'World', 'TEST', '--opt1', '--option2', '5'])).should.equal('Hello, World. You successfully sent arg \'TEST\' along with opt1 = true and option2 = 5.');
@@ -106,7 +106,7 @@ describe("v1.0 Module API", () => {
         }
       };
 
-      stack.registerDependency(require('duniter-keypair'), 'duniter-keypair');
+      stack.registerDependency(require('../../app/modules/keypair').KeypairDependency, 'duniter-keypair');
       stack.registerDependency(configurationDependency, 'duniter-configuration');
       stack.registerDependency(returnConfDependency, 'duniter-gimme-conf');
     }));
@@ -236,8 +236,8 @@ describe("v1.0 Module API", () => {
         }
       };
 
-      stack.registerDependency(require('duniter-keypair'), 'duniter-keypair');
-      stack.registerDependency(require('duniter-bma'), 'duniter-bma');
+      stack.registerDependency(require('../../app/modules/keypair').KeypairDependency, 'duniter-keypair');
+      stack.registerDependency(require('../../app/modules/bma').BmaDependency, 'duniter-bma');
       stack.registerDependency(dummyStartServiceDependency, 'duniter-dummy-start');
       stack.registerDependency(dummyStopServiceDependency, 'duniter-dummy-stop');
     }));
diff --git a/test/integration/v1.0-source-garbaging.disabled b/test/integration/v1.0-source-garbaging.disabled
index 3a9920d17f647796dd4140f965b3f9c35995c84f..e667749603216bdd6a0348f5b30e73f426b86a9a 100644
--- a/test/integration/v1.0-source-garbaging.disabled
+++ b/test/integration/v1.0-source-garbaging.disabled
@@ -2,7 +2,7 @@
 
 const co        = require('co');
 const should    = require('should');
-const bma       = require('duniter-bma').duniter.methods.bma;
+const bma       = require('../../app/modules/bma').BmaDependency.duniter.methods.bma;
 const constants = require('../../app/lib/constants');
 const toolbox   = require('./tools/toolbox');
 
diff --git a/test/integration/v1.1-dividend.js b/test/integration/v1.1-dividend.js
index 02516308ecd46104e80756957f93755a81bb6187..63efcee345d3ce3bf61864667a3d05941958a596 100644
--- a/test/integration/v1.1-dividend.js
+++ b/test/integration/v1.1-dividend.js
@@ -2,7 +2,7 @@
 
 const co        = require('co');
 const should    = require('should');
-const bma       = require('duniter-bma').duniter.methods.bma;
+const bma       = require('../../app/modules/bma').BmaDependency.duniter.methods.bma;
 const user      = require('./tools/user');
 const commit    = require('./tools/commit');
 const toolbox   = require('./tools/toolbox');
diff --git a/test/integration/wotb.js b/test/integration/wotb.js
index 98581d58d20df3592878ce70c3b31a543f4c36be..168cc575925168c32c67b2793835bdfb68b09ffd 100644
--- a/test/integration/wotb.js
+++ b/test/integration/wotb.js
@@ -4,7 +4,7 @@ const co        = require('co');
 const should    = require('should');
 const _         = require('underscore');
 const duniter     = require('../../index');
-const bma       = require('duniter-bma').duniter.methods.bma;
+const bma       = require('../../app/modules/bma').BmaDependency.duniter.methods.bma;
 const user      = require('./tools/user');
 const commit    = require('./tools/commit');
 
diff --git a/yarn.lock b/yarn.lock
index 4360e3cbf4de090125bfd291cbc1585f1447843f..c45705f3a7c462a156ef97989f856f6909343072 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -51,10 +51,6 @@ acorn@^5.0.1:
   version "5.1.1"
   resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.1.1.tgz#53fe161111f912ab999ee887a90a0bc52822fd75"
 
-adm-zip@0.4.7:
-  version "0.4.7"
-  resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.7.tgz#8606c2cbf1c426ce8c8ec00174447fd49b6eafc1"
-
 ajv-keywords@^1.0.0:
   version "1.5.1"
   resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.5.1.tgz#314dd0a4b3368fad3dfcdc54ede6171b886daf3c"
@@ -239,12 +235,6 @@ balanced-match@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
 
-base-x@^2.0.1:
-  version "2.0.6"
-  resolved "https://registry.yarnpkg.com/base-x/-/base-x-2.0.6.tgz#4582a91ebcec99ee06f4e4032030b0cf1c2941d8"
-  dependencies:
-    safe-buffer "^5.0.1"
-
 base-x@^3.0.2:
   version "3.0.2"
   resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.2.tgz#bf873861b7514279b7969f340929eab87c11d130"
@@ -334,12 +324,6 @@ brace-expansion@^1.0.0, brace-expansion@^1.1.7:
     balanced-match "^1.0.0"
     concat-map "0.0.1"
 
-bs58@4.0.0:
-  version "4.0.0"
-  resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.0.tgz#65f5deaf6d74e6135a99f763ca6209ab424b9172"
-  dependencies:
-    base-x "^2.0.1"
-
 bs58@^4.0.0, bs58@^4.0.1:
   version "4.0.1"
   resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a"
@@ -651,7 +635,7 @@ debug@2.0.0:
   dependencies:
     ms "0.6.2"
 
-debug@2.6.1:
+debug@2.6.1, debug@^2.1.1, debug@^2.2.0:
   version "2.6.1"
   resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.1.tgz#79855090ba2c4e3115cc7d8769491d58f0491351"
   dependencies:
@@ -663,12 +647,6 @@ debug@2.6.7:
   dependencies:
     ms "2.0.0"
 
-debug@^2.1.1, debug@^2.2.0:
-  version "2.6.8"
-  resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.8.tgz#e731531ca2ede27d188222427da17821d68ff4fc"
-  dependencies:
-    ms "2.0.0"
-
 debug@~2.2.0:
   version "2.2.0"
   resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da"
@@ -744,42 +722,7 @@ doctrine@^1.2.2:
     esutils "^2.0.2"
     isarray "^1.0.0"
 
-duniter-bma@1.3.x:
-  version "1.3.2"
-  resolved "https://registry.yarnpkg.com/duniter-bma/-/duniter-bma-1.3.2.tgz#9a44aa362cd3f576b157dd68402f26ce9495caee"
-  dependencies:
-    async "2.2.0"
-    body-parser "1.17.1"
-    co "4.6.0"
-    cors "2.8.2"
-    ddos "0.1.16"
-    duniter-common "^1.3.0"
-    errorhandler "1.5.0"
-    event-stream "3.3.4"
-    express "4.15.2"
-    express-cors "0.0.3"
-    express-fileupload "0.0.5"
-    inquirer "3.0.6"
-    morgan "1.8.1"
-    nnupnp "1.0.2"
-    node-pre-gyp "^0.6.34"
-    q "1.5.0"
-    underscore "1.8.3"
-    ws "1.1.1"
-
-duniter-common@1.3.x:
-  version "1.3.5"
-  resolved "https://registry.yarnpkg.com/duniter-common/-/duniter-common-1.3.5.tgz#b727117a2c9463d0486b7c0feb845df60b65e247"
-  dependencies:
-    bs58 "^4.0.0"
-    co "4.6.0"
-    jison "0.4.17"
-    naclb "1.3.9"
-    seedrandom "^2.4.3"
-    tweetnacl "0.14.3"
-    underscore "1.8.3"
-
-duniter-common@1.4.x, duniter-common@^1.3.0:
+duniter-common@1.4.x:
   version "1.4.1"
   resolved "https://registry.yarnpkg.com/duniter-common/-/duniter-common-1.4.1.tgz#e2093478ca3367d3ecb9b3b6891122c1054e95c4"
   dependencies:
@@ -791,62 +734,6 @@ duniter-common@1.4.x, duniter-common@^1.3.0:
     tweetnacl "0.14.3"
     underscore "1.8.3"
 
-duniter-crawler@1.3.x:
-  version "1.3.8"
-  resolved "https://registry.yarnpkg.com/duniter-crawler/-/duniter-crawler-1.3.8.tgz#823e6e84219669fd30ab94b4359bcc425c1299ac"
-  dependencies:
-    async "2.2.0"
-    co "4.6.0"
-    duniter-bma "1.3.x"
-    duniter-common "1.3.x"
-    moment "2.18.1"
-    multimeter "0.1.1"
-    querablep "0.1.0"
-    request "2.81.0"
-    request-promise "4.2.0"
-    underscore "1.8.3"
-
-duniter-keypair@1.3.x:
-  version "1.3.4"
-  resolved "https://registry.yarnpkg.com/duniter-keypair/-/duniter-keypair-1.3.4.tgz#0f13cbf3130ad3720bb853d4440b78a6b7106c6b"
-  dependencies:
-    bs58 "4.0.0"
-    co "4.6.0"
-    duniter-common "1.3.x"
-    inquirer "^3.0.6"
-    js-yaml "3.8.2"
-    node-pre-gyp "0.6.34"
-    q "1.5.0"
-    scryptb "6.0.4"
-    tweetnacl "0.14.5"
-    tweetnacl-util "0.15.0"
-
-duniter-ui@1.3.x:
-  version "1.3.11"
-  resolved "https://registry.yarnpkg.com/duniter-ui/-/duniter-ui-1.3.11.tgz#de22d5bff5b8313e4a563b6fa994c746f1908c39"
-  dependencies:
-    adm-zip "0.4.7"
-    body-parser "1.17.1"
-    co "4.6.0"
-    cors "2.8.2"
-    duniter-bma "1.3.x"
-    duniter-common "1.3.x"
-    duniter-crawler "1.3.x"
-    duniter-keypair "1.3.x"
-    event-stream "3.3.4"
-    express "4.15.2"
-    express-fileupload "0.0.5"
-    fs-extra "2.1.2"
-    materialize-css "0.98.1"
-    moment "2.18.1"
-    node-pre-gyp "0.6.34"
-    q "1.5.0"
-    request "2.81.0"
-    request-promise "4.2.0"
-    rimraf "2.6.1"
-    tmp "0.0.31"
-    underscore "1.8.3"
-
 duplexer@~0.1.1:
   version "0.1.1"
   resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1"
@@ -1070,10 +957,6 @@ esprima@^1.2.2:
   version "1.2.5"
   resolved "https://registry.yarnpkg.com/esprima/-/esprima-1.2.5.tgz#0993502feaf668138325756f30f9a51feeec11e9"
 
-esprima@^3.1.1:
-  version "3.1.3"
-  resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633"
-
 esprima@^4.0.0:
   version "4.0.0"
   resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804"
@@ -1309,13 +1192,6 @@ from@~0:
   version "0.1.7"
   resolved "https://registry.yarnpkg.com/from/-/from-0.1.7.tgz#83c60afc58b9c56997007ed1a768b3ab303a44fe"
 
-fs-extra@2.1.2:
-  version "2.1.2"
-  resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-2.1.2.tgz#046c70163cef9aad46b0e4a7fa467fb22d71de35"
-  dependencies:
-    graceful-fs "^4.1.2"
-    jsonfile "^2.1.0"
-
 fs-extra@^0.22.1:
   version "0.22.1"
   resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.22.1.tgz#5fd6f8049dc976ca19eb2355d658173cabcce056"
@@ -1463,10 +1339,6 @@ growl@1.8.1:
   version "1.8.1"
   resolved "https://registry.yarnpkg.com/growl/-/growl-1.8.1.tgz#4b2dec8d907e93db336624dcec0183502f8c9428"
 
-hammerjs@^2.0.4:
-  version "2.0.8"
-  resolved "https://registry.yarnpkg.com/hammerjs/-/hammerjs-2.0.8.tgz#04ef77862cff2bb79d30f7692095930222bf60f1"
-
 handlebars@^4.0.1:
   version "4.0.10"
   resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.10.tgz#3d30c718b09a3d96f23ea4cc1f403c4d3ba9ff4f"
@@ -1594,7 +1466,7 @@ ini@~1.3.0:
   version "1.3.4"
   resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e"
 
-inquirer@3.0.6, inquirer@^3.0.6:
+inquirer@3.0.6:
   version "3.0.6"
   resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.0.6.tgz#e04aaa9d05b7a3cb9b0f407d04375f0447190347"
   dependencies:
@@ -1774,10 +1646,6 @@ jison@0.4.17:
     lex-parser "~0.1.3"
     nomnom "1.5.2"
 
-jquery@^2.1.4:
-  version "2.2.4"
-  resolved "https://registry.yarnpkg.com/jquery/-/jquery-2.2.4.tgz#2c89d6889b5eac522a7eea32c14521559c6cbf02"
-
 js-tokens@^3.0.0:
   version "3.0.2"
   resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b"
@@ -1789,13 +1657,6 @@ js-yaml@3.0.1:
     argparse "~ 0.1.11"
     esprima "~ 1.0.2"
 
-js-yaml@3.8.2:
-  version "3.8.2"
-  resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.8.2.tgz#02d3e2c0f6beab20248d412c352203827d786721"
-  dependencies:
-    argparse "^1.0.7"
-    esprima "^3.1.1"
-
 js-yaml@3.x, js-yaml@^3.2.5, js-yaml@^3.5.1:
   version "3.9.0"
   resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.9.0.tgz#4ffbbf25c2ac963b8299dc74da7e3740de1c18ce"
@@ -1936,14 +1797,6 @@ map-stream@~0.1.0:
     buffers "~0.1.1"
     readable-stream "~1.0.0"
 
-materialize-css@0.98.1:
-  version "0.98.1"
-  resolved "https://registry.yarnpkg.com/materialize-css/-/materialize-css-0.98.1.tgz#7276895b2c998b53e26deaa0c23a0484c0851d99"
-  dependencies:
-    hammerjs "^2.0.4"
-    jquery "^2.1.4"
-    node-archiver "^0.3.0"
-
 media-typer@0.3.0:
   version "0.3.0"
   resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
@@ -2155,13 +2008,6 @@ nnupnp@1.0.2:
     request "2.10.0"
     xml2js "0.1.14"
 
-node-archiver@^0.3.0:
-  version "0.3.0"
-  resolved "https://registry.yarnpkg.com/node-archiver/-/node-archiver-0.3.0.tgz#b9f1afe5006d0bdf29260181833a070978bc6947"
-  dependencies:
-    fstream "^1.0.10"
-    tar "^2.2.1"
-
 node-pre-gyp@0.6.23:
   version "0.6.23"
   resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.23.tgz#155bf3683abcfcde008aedab1248891a0773db95"
@@ -2190,7 +2036,7 @@ node-pre-gyp@0.6.33:
     tar "~2.2.1"
     tar-pack "~3.3.0"
 
-node-pre-gyp@0.6.34, node-pre-gyp@^0.6.34, node-pre-gyp@~0.6.28:
+node-pre-gyp@0.6.34, node-pre-gyp@~0.6.28:
   version "0.6.34"
   resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.34.tgz#94ad1c798a11d7fc67381b50d47f8cc18d9799f7"
   dependencies:
@@ -2446,7 +2292,7 @@ q-io@1.13.2:
     qs "^1.2.1"
     url2 "^0.0.0"
 
-q@1.5.0, q@^1.0.1:
+q@^1.0.1:
   version "1.5.0"
   resolved "https://registry.yarnpkg.com/q/-/q-1.5.0.tgz#dd01bac9d06d30e6f219aecb8253ee9ebdc308f1"
 
@@ -2462,7 +2308,7 @@ qs@~1.0.0:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/qs/-/qs-1.0.2.tgz#50a93e2b5af6691c31bcea5dae78ee6ea1903768"
 
-querablep@0.1.0, querablep@^0.1.0:
+querablep@^0.1.0:
   version "0.1.0"
   resolved "https://registry.yarnpkg.com/querablep/-/querablep-0.1.0.tgz#b2cd2b3e75fcd45d5dd7ade4c1811ab547849a84"
 
@@ -2679,7 +2525,7 @@ right-align@^0.1.1:
   dependencies:
     align-text "^0.1.1"
 
-rimraf@2, rimraf@2.6.1, rimraf@^2.2.8, rimraf@^2.5.1, rimraf@^2.6.1:
+rimraf@2, rimraf@^2.2.8, rimraf@^2.5.1, rimraf@^2.6.1:
   version "2.6.1"
   resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.1.tgz#c2338ec643df7a1b7fe5c54fa86f57428a55f33d"
   dependencies:
@@ -3135,7 +2981,7 @@ tmp@0.0.29:
   dependencies:
     os-tmpdir "~1.0.1"
 
-tmp@0.0.31, tmp@^0.0.31:
+tmp@^0.0.31:
   version "0.0.31"
   resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.31.tgz#8f38ab9438e17315e5dbd8b3657e8bfb277ae4a7"
   dependencies:
@@ -3165,18 +3011,10 @@ tunnel-agent@~0.4.0:
   version "0.4.3"
   resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.4.3.tgz#6373db76909fe570e08d73583365ed828a74eeeb"
 
-tweetnacl-util@0.15.0:
-  version "0.15.0"
-  resolved "https://registry.yarnpkg.com/tweetnacl-util/-/tweetnacl-util-0.15.0.tgz#4576c1cee5e2d63d207fee52f1ba02819480bc75"
-
-tweetnacl@0.14.3:
+tweetnacl@0.14.3, tweetnacl@^0.14.3, tweetnacl@~0.14.0:
   version "0.14.3"
   resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.3.tgz#3da382f670f25ded78d7b3d1792119bca0b7132d"
 
-tweetnacl@0.14.5, tweetnacl@^0.14.3, tweetnacl@~0.14.0:
-  version "0.14.5"
-  resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64"
-
 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"