diff --git a/lib/DataFinder.ts b/lib/DataFinder.ts
index 78692c7927b376cca7bcc307105d315beae3d043..e5d11218fdb860521b3eed2d8eef4cf3d32b10c6 100644
--- a/lib/DataFinder.ts
+++ b/lib/DataFinder.ts
@@ -126,6 +126,42 @@ export class DataFinder {
       () => this.query('SELECT `issuer`,`membersCount`,`medianTime`,`dividend`,`number`,`nonce` FROM block WHERE `fork`=0 AND `medianTime` > '+previousBlockchainTime+' ORDER BY `medianTime` ASC'))
   }
 
+  @MonitorExecutionTime()
+  getBlockWhereMedianTimeLte(medianTime: number) {
+    return this.getFromCacheOrDB('getBlockWhereMedianTimeLte', [medianTime].join('-'),
+      () => this.query('SELECT `hash`,`membersCount`,`medianTime`,`number`,`certifications`,`issuersCount`,`powMin` FROM block WHERE `fork`=0 AND `medianTime` <= '+medianTime+' ORDER BY `medianTime` ASC'))
+  }
+
+  @MonitorExecutionTime()
+  getBlockWhereMedianTimeLteNoLimit(medianTime: number) {
+    return this.getFromCacheOrDB('getBlockWhereMedianTimeLteNoLimit', [medianTime].join('-'),
+      () => this.query('SELECT `hash`,`membersCount`,`medianTime`,`number`,`certifications`,`issuersCount`,`powMin` FROM block WHERE `fork`=0 AND `medianTime` <= '+medianTime+' ORDER BY `medianTime` ASC'))
+  }
+
+  @MonitorExecutionTime()
+  getIdentityByWotbid(wotb_id: number): Promise<any> {
+    return this.getFromCacheOrDB('getIdentityByWotbid', [wotb_id].join('-'),
+      async () => (await this.duniterServer.dal.idtyDAL.query('SELECT * FROM i_index WHERE wotb_id = ?', [wotb_id]))[0])
+  }
+
+  @MonitorExecutionTime()
+  getBlockWhereMedianTimeLteAndGtNoLimit(currentBlockTime: number, medianTime: number) {
+    return this.getFromCacheOrDB('getBlockWhereMedianTimeLteAndGtNoLimit', [currentBlockTime, medianTime].join('-'),
+      () => this.query('SELECT `hash`,`membersCount`,`medianTime`,`number`,`certifications`,`joiners`,`actives`,`revoked` FROM block WHERE `fork`=0 AND `medianTime` > '+currentBlockTime+' AND `medianTime` <= '+medianTime+' ORDER BY `medianTime` ASC'))
+  }
+
+  @MonitorExecutionTime()
+  getBlockWhereMedianTimeLteAndGte(endMedianTime: number, beginMedianTime: number) {
+    return this.getFromCacheOrDB('getBlockWhereMedianTimeLteAndGte', [endMedianTime, beginMedianTime].join('-'),
+      () => this.query('SELECT `issuer`,`membersCount`,`monetaryMass`,`medianTime`,`dividend`,`number`,`nonce` FROM block WHERE `fork`=0 AND `medianTime` <= '+endMedianTime+' AND `medianTime` >= '+beginMedianTime+' ORDER BY `medianTime` ASC'))
+  }
+
+  @MonitorExecutionTime()
+  getBlockWhereMedianTimeGte(previousBlockchainTime: number) {
+    return this.getFromCacheOrDB('getBlockWhereMedianTimeGte', String(previousBlockchainTime),
+      () => this.query('SELECT `issuer`,`membersCount`,`medianTime`,`dividend`,`number`,`nonce` FROM block WHERE `fork`=0 AND `medianTime` >= '+previousBlockchainTime+' ORDER BY `medianTime` ASC'))
+  }
+
   @MonitorExecutionTime()
   getBlockWhereMedianTimeLteAndGt(medianTime: number, previousBlockchainTime: number) {
     return this.getFromCacheOrDB('getBlockWhereMedianTimeLteAndGt', [medianTime, previousBlockchainTime].join('-'),
diff --git a/lib/updateCache.js b/lib/updateCache2.ts
similarity index 82%
rename from lib/updateCache.js
rename to lib/updateCache2.ts
index 53e81697388d4a63fcc2864656b3a0e16423c7bf..91f6d50c09ffe8dca0e50082c5397df4202ff425 100755
--- a/lib/updateCache.js
+++ b/lib/updateCache2.ts
@@ -1,5 +1,8 @@
 "use strict";
 
+import {DataFinder} from "./DataFinder";
+import {DBBlock} from "duniter/app/lib/db/DBBlock";
+
 const co = require('co');
 const constants = require(__dirname + '/constants')
 
@@ -7,10 +10,12 @@ const constants = require(__dirname + '/constants')
      * updateCache
      * 
      */
-module.exports = (req, res, next) => co(function *() {
+module.exports = async (req:any, res:any, next:any) => {
   
   var { duniterServer, cache } = req.app.locals
 
+	const dataFinder = new DataFinder(duniterServer)
+
   try {
 		// Définition des constantes
 		const conf = duniterServer.conf;
@@ -35,7 +40,7 @@ module.exports = (req, res, next) => co(function *() {
     let reinitBdd = false;
     if (cache.endBlock != null)
     {
-      let checkBlock = yield duniterServer.dal.peerDAL.query('SELECT `hash` FROM block WHERE `fork`=0 AND `number`='+(cache.blockchain[cache.blockchain.length-1].number)+' LIMIT 1 ');
+      let checkBlock = [await dataFinder.getBlock(cache.blockchain[cache.blockchain.length-1].number) as DBBlock];
 			if (cache.blockchain.length > 0 && cache.blockchain[cache.blockchain.length-1].hash != checkBlock[0].hash && upgradeCache)
       {
 				// reinitialize cache
@@ -87,27 +92,27 @@ module.exports = (req, res, next) => co(function *() {
     // get endBlock
     if ( typeof(req.query.end) == 'undefined' || req.query.end <= 0)
     {
-      cache.endBlock = yield duniterServer.dal.peerDAL.query('SELECT `hash`,`medianTime`,`number`,`membersCount` FROM block WHERE `fork`=0 ORDER BY `medianTime` DESC LIMIT 1 ');
+      cache.endBlock = [await dataFinder.getCurrentBlockOrNull()];
     }
     else
     {
-      cache.endBlock = yield duniterServer.dal.peerDAL.query('SELECT `hash`,`medianTime`,`number`,`membersCount` FROM block WHERE `fork`=0 AND `number`='+req.query.end+' LIMIT 1 ');
+      cache.endBlock = [await dataFinder.getBlock(req.query.end)];
       // Si end >= currentBlock, get currentBlock
       if ( typeof(cache.endBlock[0]) == 'undefined' )
       {
-				cache.endBlock = yield duniterServer.dal.peerDAL.query('SELECT `hash`,`medianTime`,`number`,`membersCount` FROM block WHERE `fork`=0 ORDER BY `medianTime` DESC LIMIT 1 ');
+				cache.endBlock = [await dataFinder.getCurrentBlockOrNull()];
       }
 		}
     
     // fix begin value
     if ( typeof(req.query.begin) == 'undefined' || req.query.begin < 0 )
-    { cache.beginBlock = yield duniterServer.dal.peerDAL.query('SELECT `medianTime`,`number` FROM block WHERE `fork`=0 AND `number`=0 LIMIT 1 '); }
+    { cache.beginBlock = [await dataFinder.getBlock(0)]; }
     else if (req.query.begin > cache.endBlock[0].number)
     {
 			let beginTime = cache.endBlock[0].medianTime-(parseInt(cache.step)*unitTime*constants.STEP_COUNT_MIN);
-      cache.beginBlock =  yield duniterServer.dal.peerDAL.query('SELECT `medianTime`,`number` FROM block WHERE `fork`=0 AND `medianTime` >= \''+beginTime+'\' ORDER BY `medianTime` ASC LIMIT 1 ');
+      cache.beginBlock =  [await dataFinder.getBlockWhereMedianTimeGte(beginTime)];
     }
-		else { cache.beginBlock = yield duniterServer.dal.peerDAL.query('SELECT `medianTime`,`number` FROM block WHERE `fork`=0 AND `number`='+req.query.begin+' LIMIT 1 '); }
+		else { cache.beginBlock = [await dataFinder.getBlock(req.query.begin)]; }
 
 		// Define nbMaxPoints and adaptMaxPoints
 		if ( typeof(req.query.nbMaxPoints) != 'undefined' && req.query.nbMaxPoints > 0 ) {
@@ -127,13 +132,13 @@ module.exports = (req, res, next) => co(function *() {
 			if ( Math.ceil((cache.endBlock[0].medianTime-cache.beginBlock[0].medianTime)/(cache.step*unitTime)) > cache.nbMaxPoints  )
 			{
 				let newBeginTime = cache.endBlock[0].medianTime-cache.step*cache.nbMaxPoints*unitTime;
-				cache.beginBlock =  yield duniterServer.dal.peerDAL.query('SELECT `medianTime`,`number` FROM block WHERE `fork`=0 AND `medianTime` >= \''+newBeginTime+'\' ORDER BY `medianTime` ASC LIMIT 1 ');
+				cache.beginBlock =  [await dataFinder.getBlockWhereMedianTimeGte(newBeginTime)];
 			}
 		} else if (cache.adaptMaxPoints == "step") {
 			cache.step = Math.ceil((cache.endBlock[0].medianTime-cache.beginBlock[0].medianTime)/(constants.STEP_COUNT_MAX*unitTime));
 		} else {
 			let newEndTime = cache.beginBlock[0].medianTime+cache.step*cache.nbMaxPoints*unitTime;
-			cache.endBlock =  yield duniterServer.dal.peerDAL.query('SELECT `medianTime`,`number` FROM block WHERE `fork`=0 AND `medianTime` <= \''+newEndTime+'\' ORDER BY `medianTime` DESC LIMIT 1 ');
+			cache.endBlock = [await dataFinder.getBlockWhereMedianTimeLte(newEndTime)];
 		}
     
 		// Calculate stepTime
@@ -143,7 +148,7 @@ module.exports = (req, res, next) => co(function *() {
 		if ( parseInt(cache.endBlock[0].number) >= cache.currentBlockNumber && Math.floor(Date.now() / 1000) > (cache.lastUptime + constants.MIN_CACHE_UPDATE_FREQ))
     {
       // let previousCacheTime = (cache.blockchain.length > 0) ? cache.blockchain[cache.blockchain.length-1].medianTime:0;
-      var newBlocks = yield duniterServer.dal.peerDAL.query('SELECT `hash`,`membersCount`,`medianTime`,`number`,`certifications`,`joiners`,`actives`,`revoked` FROM block WHERE `fork`=0 AND `medianTime` > '+cache.currentBlockTime+' AND `medianTime` <= '+cache.endBlock[0].medianTime+' ORDER BY `medianTime` ASC');
+      var newBlocks = await dataFinder.getBlockWhereMedianTimeLteAndGtNoLimit(cache.currentBlockTime, cache.endBlock[0].medianTime);
       
       // Initialise newJoiners
       let newJoiners = new Array();
@@ -282,8 +287,9 @@ module.exports = (req, res, next) => co(function *() {
 
     next()
   } catch (e) {
+		console.error(e.stack || e)
     // En cas d'exception, afficher le message
     res.status(500).send(`<pre>${e.stack || e.message}</pre>`)
   }
-})
-.catch((err) => console.error(err.stack || err));
+}
+
diff --git a/routes/index.js b/routes/index.js
index 0a6bbd25c28bf27ad86e98e7ada80cdc74e18a9e..f7efc130c26adcdd701377df37d8c322d9bb4de7 100755
--- a/routes/index.js
+++ b/routes/index.js
@@ -94,7 +94,7 @@ app.get('/members',
 * Évolution du nombre de membres
 ***************************************/
 app.get('/membersCount',
-  require(__dirname + '/../lib/updateCache.js'), require(__dirname + '/membersCount.js'),
+  require(__dirname + '/../lib/updateCache2.js'), require(__dirname + '/membersCount2.js'),
   (req, res)=> res.render('Chart.html', {
     printMenu,
     pageName: 'MEMBERS_COUNT',
diff --git a/routes/membersCount.js b/routes/membersCount2.ts
similarity index 93%
rename from routes/membersCount.js
rename to routes/membersCount2.ts
index 3d6538a6bcbc3fd2048249abcb2eaff153c1c8f0..33f6dbd88bad71ddd80ae61ffbc48464fef37b64 100755
--- a/routes/membersCount.js
+++ b/routes/membersCount2.ts
@@ -1,5 +1,7 @@
 "use strict";
 
+import {DataFinder} from "../lib/DataFinder";
+
 const co = require('co')
 const timestampToDatetime = require(__dirname + '/../lib/timestampToDatetime')
 const getLang = require(__dirname + '/../lib/getLang')
@@ -7,9 +9,11 @@ const constants = require(__dirname + '/../lib/constants.js')
 
 //const STEP_COUNT_MAX = 150;
 
-module.exports = (req, res, next) => co(function *() {
+module.exports = async (req: any, res: any, next: any) => {
   
   var { duniterServer, cache } = req.app.locals
+
+	const dataFinder = new DataFinder(duniterServer)
   
   try {
     // get GET parameters
@@ -19,11 +23,8 @@ module.exports = (req, res, next) => co(function *() {
     // get lg file
 		const LANG = getLang(`${__dirname}/../lg/membersCount_${req.query.lg||constants.DEFAULT_LANGUAGE}.txt`);
     
-    // get medianTime of beginBlock
-    var beginBlock = yield duniterServer.dal.peerDAL.query('SELECT `medianTime`,`hash` FROM block WHERE `fork`=0 AND `number` = '+cache.beginBlock[0].number+' LIMIT 1');
-    
     // get blockchain
-    var blockchain = yield duniterServer.dal.peerDAL.query('SELECT `hash`,`membersCount`,`medianTime`,`number`,`certifications`,`issuersCount`,`powMin` FROM block WHERE `fork`=0 AND `medianTime` <= '+cache.endBlock[0].medianTime+' ORDER BY `medianTime` ASC');
+    var blockchain = await dataFinder.getBlockWhereMedianTimeLteNoLimit(cache.endBlock[0].medianTime);
 
     
     // Get blockchain timestamp
@@ -101,8 +102,8 @@ module.exports = (req, res, next) => co(function *() {
 						dateTime: dateTime,
 						membersCount: blockchain[blockIndex].membersCount,
 						sentriesCount: cache.blockchain[cacheIndex].sentries,
-						issuersCount: parseInt(stepIssuerCount/bStep),
-						powMin: parseInt(stepPowMin/bStep)
+						issuersCount: parseInt(String(stepIssuerCount/bStep)),
+						powMin: parseInt(String(stepPowMin/bStep))
 				});
 					
 				if (cache.stepUnit != "blocks") { nextStepTime += cache.stepTime; }
@@ -234,4 +235,4 @@ module.exports = (req, res, next) => co(function *() {
     // En cas d'exception, afficher le message
     res.status(500).send(`<pre>${e.stack || e.message}</pre>`);
   }
-})
+}