diff --git a/.gitignore b/.gitignore
index e33419e421c7fb54de9f98e3e02c9572fb131f3a..dfc3e2077942a9e57e79ccac71c736f59cd7c5d9 100644
--- a/.gitignore
+++ b/.gitignore
@@ -33,11 +33,20 @@ coverage/
 
 # TS migration
 test/blockchain/*.js*
+test/blockchain/*.d.ts
 test/blockchain/lib/*.js*
+test/blockchain/lib/*.d.ts
 /index.js*
+/index.d.ts
 /server.js*
+/server.d.ts
 app/**/*.js*
+app/**/*.d.ts
 test/integration/membership_chainability.js*
+test/integration/membership_chainability.d.ts
 test/integration/tools/toolbox.js*
+test/integration/tools/toolbox.d.ts
 test/integration/documents-currency.js*
-test/fast/modules/crawler/block_pulling.js*
\ No newline at end of file
+test/integration/documents-currency.d.ts
+test/fast/modules/crawler/block_pulling.js*
+test/fast/modules/crawler/block_pulling.d.ts
diff --git a/.npmignore b/.npmignore
new file mode 100644
index 0000000000000000000000000000000000000000..05cac4f53afce72d178648595fa97793dd919270
--- /dev/null
+++ b/.npmignore
@@ -0,0 +1,34 @@
+*.sublime*
+node_modules/
+*.html
+npm-debug.log
+bin/jpgp*.jar
+.idea/
+naclb/build
+naclb/node_modules
+gui/nw
+
+# Vim swap files
+*~
+*.swp
+*.swo
+
+# Vagrant
+.vagrant/
+vagrant/*.log
+vagrant/duniter
+
+# Releases
+*.deb
+*.tar.gz
+*.log
+*.exe
+
+# vscode
+.vscode
+
+# istanbul
+.nyc_output
+coverage/
+
+# TS => JS: OK!
diff --git a/app/lib/common-libs/crypto/keyring.ts b/app/lib/common-libs/crypto/keyring.ts
index 24cb7a1a13051279060f128b6be8d62a3e02edde..1427a7e55effda9291f92af99d0e4f00d64a2939 100644
--- a/app/lib/common-libs/crypto/keyring.ts
+++ b/app/lib/common-libs/crypto/keyring.ts
@@ -7,7 +7,7 @@ const naclBinding = require('naclb');
 
 const crypto_sign_BYTES = 64;
 
-class Key {
+export class Key {
 
   constructor(readonly pub:string, readonly sec:string) {
   }
diff --git a/app/lib/indexer.ts b/app/lib/indexer.ts
index 7f667b325f45a92076b503dd0829e5436fac361a..2ceced445e9e1b707d5a3962308545b47a7852e0 100644
--- a/app/lib/indexer.ts
+++ b/app/lib/indexer.ts
@@ -108,7 +108,7 @@ export interface SindexEntry extends IndexEntry {
   isTimeLocked?: boolean,
 }
 
-interface Ranger {
+export interface Ranger {
   (n:number, m:number, prop?:string): Promise<DBHead[]>
 }
 
diff --git a/app/modules/bma/lib/bma.ts b/app/modules/bma/lib/bma.ts
index 07277734df59118f384a89328f55dc3ecbda696c..d3a2967c7a23808d0c9adff2b65901cf704a2eb0 100644
--- a/app/modules/bma/lib/bma.ts
+++ b/app/modules/bma/lib/bma.ts
@@ -1,6 +1,6 @@
 import {Server} from "../../../../server"
-import {Network, NetworkInterface} from "./network"
-import * as dtos from "./dtos"
+import {BmaApi, Network, NetworkInterface} from "./network"
+import {block2HttpBlock, HttpPeer} from "./dtos"
 import {BMALimitation} from "./limiter"
 import {BlockchainBinding} from "./controllers/blockchain"
 import {NodeBinding} from "./controllers/node"
@@ -8,15 +8,14 @@ import {NetworkBinding} from "./controllers/network"
 import {WOTBinding} from "./controllers/wot"
 import {TransactionBinding} from "./controllers/transactions"
 import {UDBinding} from "./controllers/uds"
-import {block2HttpBlock, HttpBlock, HttpPeer, HttpTransactionOfBlock} from "./dtos";
-import {PeerDTO} from "../../../lib/dto/PeerDTO";
-import {BlockDTO} from "../../../lib/dto/BlockDTO";
+import {PeerDTO} from "../../../lib/dto/PeerDTO"
+import {BlockDTO} from "../../../lib/dto/BlockDTO"
 
 const co = require('co');
 const es = require('event-stream');
 const WebSocketServer = require('ws').Server;
 
-export const bma = function(server:Server, interfaces:NetworkInterface[], httpLogs:boolean, logger:any) {
+export const bma = function(server:Server, interfaces:NetworkInterface[], httpLogs:boolean, logger:any): Promise<BmaApi> {
 
   if (!interfaces) {
     interfaces = [];
diff --git a/app/modules/bma/lib/controllers/AbstractController.ts b/app/modules/bma/lib/controllers/AbstractController.ts
index 048a292ebca3ef4e8e50dc16099485e9beeb9b31..8ebcb3f409f3288134bbcbb25eabe3e138f53ecd 100644
--- a/app/modules/bma/lib/controllers/AbstractController.ts
+++ b/app/modules/bma/lib/controllers/AbstractController.ts
@@ -1,13 +1,17 @@
-import {Server} from "../../../../../server";
-import {dos2unix} from "../../../../lib/common-libs/dos2unix";
-import {CommonConstants} from "../../../../lib/common-libs/constants";
+import {Server} from "../../../../../server"
+import {dos2unix} from "../../../../lib/common-libs/dos2unix"
+import {CommonConstants} from "../../../../lib/common-libs/constants"
+import {BlockchainService} from "../../../../service/BlockchainService"
+import {IdentityService} from "../../../../service/IdentityService"
+import {PeeringService} from "../../../../service/PeeringService"
+import {ConfDTO} from "../../../../lib/dto/ConfDTO"
 
 export abstract class AbstractController {
 
   constructor(protected server:Server) {
   }
 
-  get conf() {
+  get conf(): ConfDTO {
     return this.server.conf
   }
 
@@ -15,15 +19,15 @@ export abstract class AbstractController {
     return this.server.logger
   }
 
-  get BlockchainService() {
+  get BlockchainService(): BlockchainService {
     return this.server.BlockchainService
   }
 
-  get IdentityService() {
+  get IdentityService(): IdentityService {
     return this.server.IdentityService
   }
 
-  get PeeringService() {
+  get PeeringService(): PeeringService {
     return this.server.PeeringService
   }
 
diff --git a/app/modules/crawler/lib/sync.ts b/app/modules/crawler/lib/sync.ts
index 046006982cc4e45b0727424f668255c2b230394b..25e8899524f3b80d864b7f3ea91e548efc933160 100644
--- a/app/modules/crawler/lib/sync.ts
+++ b/app/modules/crawler/lib/sync.ts
@@ -14,6 +14,8 @@ import {BlockchainService} from "../../../service/BlockchainService"
 import {rawer} from "../../../lib/common-libs/index"
 import {dos2unix} from "../../../lib/common-libs/dos2unix"
 import {hashf} from "../../../lib/common"
+import {ConfDTO} from "../../../lib/dto/ConfDTO"
+import {PeeringService} from "../../../service/PeeringService"
 
 const util         = require('util');
 const _            = require('underscore');
@@ -65,7 +67,7 @@ export class Synchroniser extends stream.Duplex {
     }
   }
 
-  get conf() {
+  get conf(): ConfDTO {
     return this.server.conf
   }
 
@@ -73,7 +75,7 @@ export class Synchroniser extends stream.Duplex {
     return this.server.logger
   }
 
-  get PeeringService() {
+  get PeeringService(): PeeringService {
     return this.server.PeeringService
   }
 
diff --git a/app/modules/prover/index.ts b/app/modules/prover/index.ts
index 509c61aa5bd9fdb913dc188ba1db48323990912f..094888333fd0ad2f767be0bf9cbf2cadb261d540 100644
--- a/app/modules/prover/index.ts
+++ b/app/modules/prover/index.ts
@@ -6,7 +6,8 @@ import {Prover} from "./lib/prover"
 import {Contacter} from "../crawler/lib/contacter"
 import {parsers} from "../../lib/common-libs/parsers/index"
 import {PeerDTO} from "../../lib/dto/PeerDTO"
-import {Server} from "../../../server";
+import {Server} from "../../../server"
+import {BlockDTO} from "../../lib/dto/BlockDTO"
 
 const async = require('async');
 
@@ -112,7 +113,7 @@ export const ProverDependency = {
           throw 'Difficulty is required.';
         }
         const generator = new BlockGenerator(server);
-        return generateAndSend(program, difficulty, server, () => generator.manualRoot);
+        return generateAndSend(program, difficulty, server, () => (): Promise<BlockDTO> => generator.manualRoot())
       }
     }]
   }
diff --git a/app/service/IdentityService.ts b/app/service/IdentityService.ts
index f4922af463fe94a334d077c205d4276b5f3c9392..81288451dc47dda3de811b1cc02c104d8f994b94 100644
--- a/app/service/IdentityService.ts
+++ b/app/service/IdentityService.ts
@@ -1,15 +1,15 @@
-import {GlobalFifoPromise} from "./GlobalFifoPromise";
-import {FileDAL} from "../lib/dal/fileDAL";
-import {ConfDTO} from "../lib/dto/ConfDTO";
-import {DBIdentity} from "../lib/dal/sqliteDAL/IdentityDAL";
-import {GLOBAL_RULES_FUNCTIONS, GLOBAL_RULES_HELPERS} from "../lib/rules/global_rules";
-import {BlockDTO} from "../lib/dto/BlockDTO";
-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 {verify} from "../lib/common-libs/crypto/keyring";
-import {FIFOService} from "./FIFOService";
+import {GlobalFifoPromise} from "./GlobalFifoPromise"
+import {FileDAL} from "../lib/dal/fileDAL"
+import {ConfDTO} from "../lib/dto/ConfDTO"
+import {DBIdentity, ExistingDBIdentity} from "../lib/dal/sqliteDAL/IdentityDAL"
+import {GLOBAL_RULES_FUNCTIONS, GLOBAL_RULES_HELPERS} from "../lib/rules/global_rules"
+import {BlockDTO} from "../lib/dto/BlockDTO"
+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 {verify} from "../lib/common-libs/crypto/keyring"
+import {FIFOService} from "./FIFOService"
 
 "use strict";
 const constants       = require('../lib/constants');
@@ -36,7 +36,7 @@ export class IdentityService extends FIFOService {
     return this.dal.searchJustIdentities(search)
   }
 
-  async findMember(search:string) {
+  async findMember(search:string): Promise<ExistingDBIdentity> {
     let idty = null;
     if (search.match(constants.PUBLIC_KEY)) {
       idty = await this.dal.getWrittenIdtyByPubkey(search);
diff --git a/server.ts b/server.ts
index e6e35e10c13c16ad752bc7de9fc02c873ea4128e..f707d0211033195d3f0ab4ad51ce8a3979418ce6 100644
--- a/server.ts
+++ b/server.ts
@@ -1,21 +1,29 @@
-import {IdentityService} from "./app/service/IdentityService";
-import {MembershipService} from "./app/service/MembershipService";
-import {PeeringService} from "./app/service/PeeringService";
-import {BlockchainService} from "./app/service/BlockchainService";
-import {TransactionService} from "./app/service/TransactionsService";
-import {ConfDTO, NetworkConfDTO} from "./app/lib/dto/ConfDTO";
-import {FileDAL} from "./app/lib/dal/fileDAL";
-import {DuniterBlockchain} from "./app/lib/blockchain/DuniterBlockchain";
-import {SQLBlockchain} from "./app/lib/blockchain/SqlBlockchain";
-import * as stream from "stream";
-import {KeyGen, 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 {DuniterDocument, duniterDocument2str} from "./app/lib/common-libs/constants";
-import {CrawlerConstants} from "./app/modules/crawler/lib/constants";
-import {GlobalFifoPromise} from "./app/service/GlobalFifoPromise";
-
-interface HookableServer {
+import {IdentityService} from "./app/service/IdentityService"
+import {MembershipService} from "./app/service/MembershipService"
+import {PeeringService} from "./app/service/PeeringService"
+import {BlockchainService} from "./app/service/BlockchainService"
+import {TransactionService} from "./app/service/TransactionsService"
+import {ConfDTO, NetworkConfDTO} from "./app/lib/dto/ConfDTO"
+import {FileDAL} from "./app/lib/dal/fileDAL"
+import {DuniterBlockchain} from "./app/lib/blockchain/DuniterBlockchain"
+import {SQLBlockchain} from "./app/lib/blockchain/SqlBlockchain"
+import * as stream from "stream"
+import {KeyGen, 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 {DuniterDocument, duniterDocument2str} from "./app/lib/common-libs/constants"
+import {CrawlerConstants} from "./app/modules/crawler/lib/constants"
+import {GlobalFifoPromise} from "./app/service/GlobalFifoPromise"
+import {BlockchainContext} from "./app/lib/computation/BlockchainContext"
+import {BlockDTO} from "./app/lib/dto/BlockDTO"
+import {DBIdentity} from "./app/lib/dal/sqliteDAL/IdentityDAL"
+import {CertificationDTO} from "./app/lib/dto/CertificationDTO"
+import {MembershipDTO} from "./app/lib/dto/MembershipDTO"
+import {RevocationDTO} from "./app/lib/dto/RevocationDTO"
+import {TransactionDTO} from "./app/lib/dto/TransactionDTO"
+import {PeerDTO} from "./app/lib/dto/PeerDTO"
+
+export interface HookableServer {
   getMainEndpoint: (...args:any[]) => Promise<any>
   generatorGetJoinData: (...args:any[]) => Promise<any>
   generatorComputeNewCerts: (...args:any[]) => Promise<any>
@@ -108,7 +116,7 @@ export class Server extends stream.Duplex implements HookableServer {
     }
   }
 
-  getBcContext() {
+  getBcContext(): BlockchainContext {
     return this.BlockchainService.getContext()
   }
 
@@ -179,7 +187,7 @@ export class Server extends stream.Duplex implements HookableServer {
     return this;
   }
 
-  async writeRawBlock(raw:string) {
+  async writeRawBlock(raw:string): Promise<BlockDTO> {
     const obj = parsers.parseBlock.syncWrite(raw, logger)
     return await this.writeBlock(obj)
   }
@@ -190,12 +198,12 @@ export class Server extends stream.Duplex implements HookableServer {
     return res
   }
 
-  async writeRawIdentity(raw:string) {
+  async writeRawIdentity(raw:string): Promise<DBIdentity> {
     const obj = parsers.parseIdentity.syncWrite(raw, logger)
     return await this.writeIdentity(obj)
   }
 
-  async writeIdentity(obj:any, notify = true) {
+  async writeIdentity(obj:any, notify = true): Promise<DBIdentity> {
     const res = await this.IdentityService.submitIdentity(obj)
     if (notify) {
       this.emitDocument(res, DuniterDocument.ENTITY_IDENTITY)
@@ -203,7 +211,7 @@ export class Server extends stream.Duplex implements HookableServer {
     return res
   }
 
-  async writeRawCertification(raw:string) {
+  async writeRawCertification(raw:string): Promise<CertificationDTO> {
     const obj = parsers.parseCertification.syncWrite(raw, logger)
     return await this.writeCertification(obj)
   }
@@ -216,7 +224,7 @@ export class Server extends stream.Duplex implements HookableServer {
     return res
   }
 
-  async writeRawMembership(raw:string) {
+  async writeRawMembership(raw:string): Promise<MembershipDTO> {
     const obj = parsers.parseMembership.syncWrite(raw, logger)
     return await this.writeMembership(obj)
   }
@@ -229,7 +237,7 @@ export class Server extends stream.Duplex implements HookableServer {
     return res
   }
 
-  async writeRawRevocation(raw:string) {
+  async writeRawRevocation(raw:string): Promise<RevocationDTO> {
     const obj = parsers.parseRevocation.syncWrite(raw, logger)
     return await this.writeRevocation(obj)
   }
@@ -240,7 +248,7 @@ export class Server extends stream.Duplex implements HookableServer {
     return res
   }
 
-  async writeRawTransaction(raw:string) {
+  async writeRawTransaction(raw:string): Promise<TransactionDTO> {
     const obj = parsers.parseTransaction.syncWrite(raw, logger)
     return await this.writeTransaction(obj)
   }
@@ -251,7 +259,7 @@ export class Server extends stream.Duplex implements HookableServer {
     return res
   }
 
-  async writeRawPeer(raw:string) {
+  async writeRawPeer(raw:string): Promise<PeerDTO> {
     const obj = parsers.parsePeer.syncWrite(raw, logger)
     return await this.writePeer(obj)
   }
diff --git a/test/integration/tools/toolbox.ts b/test/integration/tools/toolbox.ts
index 5d04dcbc696caa64f25ed16cc5d4e8112b4198c7..d26842937f4140da9e516bb146222d9a36fc1eed 100644
--- a/test/integration/tools/toolbox.ts
+++ b/test/integration/tools/toolbox.ts
@@ -6,7 +6,15 @@ import * as stream from "stream"
 import {RevocationDTO} from "../../../app/lib/dto/RevocationDTO"
 import {IdentityDTO} from "../../../app/lib/dto/IdentityDTO"
 import {PeerDTO} from "../../../app/lib/dto/PeerDTO"
-import {Network} from "../../../app/modules/bma/lib/network";
+import {Network} from "../../../app/modules/bma/lib/network"
+import {DBIdentity} from "../../../app/lib/dal/sqliteDAL/IdentityDAL"
+import {CertificationDTO} from "../../../app/lib/dto/CertificationDTO"
+import {BlockchainService} from "../../../app/service/BlockchainService"
+import {PeeringService} from "../../../app/service/PeeringService"
+import {ConfDTO} from "../../../app/lib/dto/ConfDTO"
+import {FileDAL} from "../../../app/lib/dal/fileDAL"
+import {MembershipDTO} from "../../../app/lib/dto/MembershipDTO"
+import {TransactionDTO} from "../../../app/lib/dto/TransactionDTO"
 
 const _           = require('underscore');
 const rp          = require('request-promise');
@@ -220,19 +228,19 @@ export class TestingServer {
     server.getMainEndpoint = require('../../../app/modules/bma').BmaDependency.duniter.methods.getMainEndpoint
   }
 
-  get BlockchainService() {
+  get BlockchainService(): BlockchainService {
     return this.server.BlockchainService
   }
 
-  get PeeringService() {
+  get PeeringService(): PeeringService {
     return this.server.PeeringService
   }
 
-  get conf() {
+  get conf(): ConfDTO {
     return this.server.conf
   }
 
-  get dal() {
+  get dal(): FileDAL {
     return this.server.dal
   }
 
@@ -264,15 +272,15 @@ export class TestingServer {
     return this.server.writeBlock(obj)
   }
   
-  async writeIdentity(obj:any) {
+  async writeIdentity(obj:any): Promise<DBIdentity> {
     return this.server.writeIdentity(obj)
   }
   
-  async writeCertification(obj:any) {
+  async writeCertification(obj:any): Promise<CertificationDTO> {
     return this.server.writeCertification(obj)
   }
   
-  async writeMembership(obj:any) {
+  async writeMembership(obj:any): Promise<MembershipDTO> {
     return this.server.writeMembership(obj)
   }
   
@@ -280,7 +288,7 @@ export class TestingServer {
     return this.server.writeRevocation(obj)
   }
   
-  async writeTransaction(obj:any) {
+  async writeTransaction(obj:any): Promise<TransactionDTO> {
     return this.server.writeTransaction(obj)
   }
   
diff --git a/tsconfig.json b/tsconfig.json
index 171c2148ef6a63c041f1d14927ce671f18ea5740..330af57dbdab513110b9a54bd45b6721b7921ef1 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -2,6 +2,7 @@
   "compilerOptions": {
     "sourceMap": true,
     "target": "es6",
+    "declaration": true,
     "moduleResolution": "node",
     "module": "commonjs",
     "strictNullChecks": true,