diff --git a/lg/blockCount_en.txt b/lg/blockCount_en.txt
deleted file mode 100755
index 0b4c69051b82ef71af69167872ea971d21f4f437..0000000000000000000000000000000000000000
--- a/lg/blockCount_en.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-SUBMIT_BUTTON submit
-WRITTEN_BLOCKS Written blocks
-BLOCKCHAIN blockchain
-SINCE_BECOME_MEMBER since become member
-MEAN_NONCE Mean nonce
-RANGE members have written blocks in the range
-BEGIN Begin
-END End
-NB_BLOCKS Number of written Blocks
-PERCENT_OF_WRITTEN_BLOCKS Percent of written Blocks
-DETAIL_BY_NODE detail by node
-SIGNIFICANT_LIMIT significant limit
-PERCENT_OF_BLOCKS % of blocks
\ No newline at end of file
diff --git a/lg/blockCount_fr.txt b/lg/blockCount_fr.txt
deleted file mode 100755
index 1f5aaef14b425ad20c141a6ee001a5f6c0ff3bf3..0000000000000000000000000000000000000000
--- a/lg/blockCount_fr.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-SUBMIT_BUTTON recharger
-WRITTEN_BLOCKS blocs écrits
-BLOCKCHAIN blockchain
-SINCE_BECOME_MEMBER par chaque membre depuis qu'il est devenu membre
-MEAN_NONCE Nonce moyen
-RANGE membres ayant écrit des blocs sur la période
-BEGIN Début
-END Fin
-NB_BLOCKS Nombre de blocs écrits
-PERCENT_OF_WRITTEN_BLOCKS % de blocs écrits
-DETAIL_BY_NODE detail par noeud
-SIGNIFICANT_LIMIT noeud significatif à partir de
-PERCENT_OF_BLOCKS % de blocs
\ No newline at end of file
diff --git a/lg/gaussianWotQuality_en.txt b/lg/gaussianWotQuality_en.txt
deleted file mode 100644
index d006671f1a47aaad43a3a5c1eb82d4c7d9a06c12..0000000000000000000000000000000000000000
--- a/lg/gaussianWotQuality_en.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-SUBMIT_BUTTON submit
-DISTRIBUTION_QUALITY gaussian distribution of quality members
-IF_NO_SENTRIES If the concept of referring members didn't exist
-NEXT_YN Feign the following Y[n] landing
-QUALITY quality
-PERCENT_REACHED % of referring members reached
-NB_REACHED number of referring members reached
\ No newline at end of file
diff --git a/lg/gaussianWotQuality_fr.txt b/lg/gaussianWotQuality_fr.txt
deleted file mode 100644
index ef3af141bffe963987ace30a05b6ba7dd49c93ba..0000000000000000000000000000000000000000
--- a/lg/gaussianWotQuality_fr.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-SUBMIT_BUTTON recharger
-DISTRIBUTION_QUALITY distribution gaussienne de la qualité des membres
-IF_NO_SENTRIES si le concept de membre référent n'existait pas
-NEXT_YN Simuler le palier Y[n] suivant
-QUALITY qualité
-PERCENT_REACHED % de nombres référents atteints
-NB_REACHED nombre de membres référents atteints
\ No newline at end of file
diff --git a/lg/membersCount_en.txt b/lg/membersCount_en.txt
deleted file mode 100755
index 6284013e0b9f5a944c4b46b12bedf59ca636ca60..0000000000000000000000000000000000000000
--- a/lg/membersCount_en.txt
+++ /dev/null
@@ -1,23 +0,0 @@
-LAST_BLOCK last block
-BEGIN Begin
-END End
-STEP step
-BLOCKS blocks
-HOURS hours
-DAYS days
-WEEKS weeks
-MONTHS months
-YEARS years
-SUBMIT_BUTTON submit
-DESCRIPTION1 *Every member automatically becomes a referring member as soon as he has emitted <b><u>and</u></b> received Y[n] certifications. (Y[n] = CEILING(N(t)^(1/5))).
-DESCRIPTION2 Currently, Y[n] =
-CHART_TITLE Evolution count of members, referring members and of members writers of the blockchain over the period
-SHOW_POW_MIN Show evolution of common difficulty network (proof of work)
-Afficher l'évolution de la difficulté commune du réseau (preuve de travail)
-MEMBERS_COUNT members
-SENTRIES_COUNT referring* members
-ISSUERS_COUNT Members co-writers blockchain
-POW_MIN Common difficulty network (proof of work)
-MAX max
-POINTS points
-REGULATE_BY_ADAPTING regulate by adapting
\ No newline at end of file
diff --git a/lg/membersCount_fr.txt b/lg/membersCount_fr.txt
deleted file mode 100755
index 5605b8e8a30a4d4cfa02d0f7f468920a6dce714f..0000000000000000000000000000000000000000
--- a/lg/membersCount_fr.txt
+++ /dev/null
@@ -1,22 +0,0 @@
-LAST_BLOCK dernier bloc
-BEGIN Début
-END Fin
-STEP précision
-BLOCKS blocs
-HOURS heures
-DAYS jours
-WEEKS semaines
-MONTHS mois
-YEARS années
-SUBMIT_BUTTON recharger
-DESCRIPTION1 *Tout membre devient automatiquement référent dès lors qu'il a émis <b><u>et</u></b> reçu Y[n] certifications. (Y[n] = CEILING(N(t)^(1/5))).
-DESCRIPTION2 Actuellement, Y[n] =
-CHART_TITLE Évolution du nombre de membres, de membres référents et de membres écrivains de la blockchain sur la période
-SHOW_POW_MIN Afficher l'évolution de la difficulté commune du réseau (preuve de travail)
-MEMBERS_COUNT Membres
-SENTRIES_COUNT Membres référents*
-ISSUERS_COUNT Membres co-écrivains de la blockchain Ğ1
-POW_MIN Difficulté commune du réseau (preuve de travail)
-MAX max
-POINTS points
-REGULATE_BY_ADAPTING réguler en adaptant
\ No newline at end of file
diff --git a/lg/members_en.txt b/lg/members_en.txt
deleted file mode 100755
index 7867a3360314afccf9d69adb4a5c17a11e8218a1..0000000000000000000000000000000000000000
--- a/lg/members_en.txt
+++ /dev/null
@@ -1,68 +0,0 @@
-FORM1 days - sort by
-SORT_BY_IDTY_WRITTEN identity written time
-SORT_BY_EXPIRE_MEMBERSHIP expire membership time
-SORT_LAST_RENEWAL last renewal time
-SORT_BY_OLDEST_SIG oldest sig time
-SORT_BY_LAST_SIG last sig time
-SORT_BY_CENTRALITY centrality degree
-SORT_BY_QUALITY member quality
-SORT_BY_SIG_COUNT certifications count
-ORDER_BY in the following order
-ASC ascending
-DESC descending
-SUBMIT_BUTTON submit
-CHECKBOX_CENTRALITY Recalculate members centrality degree
-CHECKBOX_PENDING_SIGS Include pending certifications
-CHECKBOX_MODE_SIG Print emitted certifications (Instead of received certifications)
-LEGEND Legend
-LEGEND_AVAILABILITY [availability : means this certification may already be written in the next block.]
-WHAT_IS_CENTRALITY_TITLE What is the centrality degree ?
-WHAT_IS_CENTRALITY_TEXT The centrality degree of a member is the number of pairs directed (member->member) for which the member makes left one of the shortest paths.
-QUALITY_MEMBER_TITLE What is the certification quality ?
-QUALITY_MEMBER_TXT It is the report enters the rate of referring members reachable by a certification of this member and the rate of referring members which needs to achieve to respect the rule of distance.
-WOT_TENSION_STATE Wot tension state
-CENTRALITY_NOT_CALC The degree of centrality of the members was never calculated
-CENTRALITY_CALC_BUSY The centrality data are currently recalculate, to see them, refresh this page by a few minutes
-MEAN_CENTRALITY Mean centrality degree
-NUMBER_OF_EXIST_PATH Number of pairs directed for which there is a path of 5 steps or less
-NUMBER_OF_PAIRS_MEMBER Number of pairs directed (member->member)
-PROPORTION_OF_EXIST_PATH Percent of pairs directed for which there is a path of 5 steps or less
-MEAN_LENGTH_PATH mean length shortest path
-WOT_TENSION_FACTOR Wot tension factor*
-DATA_AT Data at
-meanMembersReachedByMembers Mean members/sentries reached in single member/sentry certification
-SENTRIES_REACHED sentries reached
-MEMBERS_REACHED members reached
-SENTRY_CERT sentry certification
-MEMBER_CERT member certification
-MEAN_QUALITY mean quality
-PROPORTION_MEMBERS_WITH_QUALITY_UPPER_1 Proportion of members with an upper quality an equal in 1
-CURRENT_BLOCKCHAIN_TIME Current blockchain time
-TABLE_TITLE Members that will expire in less than
-DAYS days
-OF_WHICH of which
-ARE_REFERRING_MEMBERS are referrings
-COL_UID uid
-COL_IDTY_WRITTEN_TIME identity written time
-COL_LAST_RENEWAL last renewal
-COL_EXPIRE_MEMBERSHIP expire membership
-COL_DISTANCE distance
-COL_DISTANCE_isOutdistanced KO
-COL_DISTANCE_isNotOutdistanced OK
-COL_LIST_RECEIVED_CERT list received certifications
-COL_LIST_EMITTED_CERT list emitted certifications
-LAST2OLDEST récentes -> anciennes
-OLDEST2LAST anciennes -> récentes
-REFERRING_MEMBER referring
-YES yes
-NO no
-QUALITY_EXT quality
-CENTRALITY centrality
-EMITTED emitted
-WRITTEN written
-INVALID_BLOCKSTAMP invalid blockstamp
-CERT_AVAILABLE available
-MEMBERS members
-NEXT_YN Feign the following Y[n] landing
-MEMBER_FILTER search a member
-EXPIRE_TIME expiration datetime
\ No newline at end of file
diff --git a/lg/members_fr.txt b/lg/members_fr.txt
deleted file mode 100755
index 0aaf6791553fdea23cb3dbe421402f035cdd245c..0000000000000000000000000000000000000000
--- a/lg/members_fr.txt
+++ /dev/null
@@ -1,68 +0,0 @@
-FORM1 jours - tri par
-SORT_BY_IDTY_WRITTEN date d'obtention du statut de membre
-SORT_BY_EXPIRE_MEMBERSHIP date d'expiration du membership
-SORT_LAST_RENEWAL date de dernier renouvellement
-SORT_BY_OLDEST_SIG date de plus vielle certification
-SORT_BY_LAST_SIG date de plus récente certification
-SORT_BY_CENTRALITY degré de centralité
-SORT_BY_QUALITY qualité du membre
-SORT_BY_SIG_COUNT nombre de certifications reçues
-ORDER_BY dans l'ordre
-ASC croissant
-DESC décroissant
-SUBMIT_BUTTON recharger
-CHECKBOX_CENTRALITY Recalculer le degré de centralité des membres
-CHECKBOX_PENDING_SIGS Inclure les certifications en piscine
-CHECKBOX_MODE_SIG Afficher les certifications émises (à la place des certifications reçus)
-LEGEND Légende
-LEGEND_AVAILABILITY [disponibilité : date à partir de laquelle cette certification pourra être écrite compte tenu de sigPeriod]
-WHAT_IS_CENTRALITY_TITLE Qu'est ce que le degré de centralité ?
-WHAT_IS_CENTRALITY_TEXT Le degré de centralité d'un membre est le nombre de couples orientés (membre->membre) pour lesquels il fait parti d'un des plus court chemin reliant ce couple.
-QUALITY_MEMBER_TITLE Qu'est ce que la qualité d'un membre ?
-QUALITY_MEMBER_TXT C'est le rapport entre le taux de membres référents rendu atteignables par une certification de ce membre et le taux de membres référents qui faut atteindre pour respecter la règle de distance. Si ce nombre est supérieur ou égal à 1 c'est qu'une certification de ce membre suffit à elle seule pour respecter la règle de distance. Si les qualités de plusieurs certifieurs ne s'additionnent pas c'est tout simplement parce qu'une grande partie des membres référents qu'ils permettent d'atteindre sont les mêmes.
-WOT_TENSION_STATE État de tension de la toile
-CENTRALITY_NOT_CALC le degré de centralité des membres n'a jamais été calculé
-CENTRALITY_CALC_BUSY Les données de centralité sont en cours de mise à jours, pour les voir, rechargez cette page d'ici quelques minutes.
-MEAN_CENTRALITY Dégré de centralité moyen
-NUMBER_OF_EXIST_PATH Nombre de couples orientés pour lequels il existe un chemin de 5 pas ou moins
-NUMBER_OF_PAIRS_MEMBER Nombre de couples orientés (membre->membre)
-PROPORTION_OF_EXIST_PATH Proportion de couples orientés pour lesquels il existe un chemin de 5 pas ou moins
-MEAN_LENGTH_PATH Longueur moyenne d'un plus court chemin
-WOT_TENSION_FACTOR Facteur de tension de la toile*
-DATA_AT Données au
-meanMembersReachedByMembers Taux moyen de membres joiniables via une seule certification
-MEMBER_CERT certification d'un membre
-MEMBERS_REACHED membres joiniables
-SENTRY_CERT certification d'un membre référent
-SENTRIES_REACHED membres référents joiniables
-MEAN_QUALITY Qualité moyenne
-PROPORTION_MEMBERS_WITH_QUALITY_UPPER_1 Proportion de membre avec une qualité >= 1
-CURRENT_BLOCKCHAIN_TIME Temps Blockchain actuel
-TABLE_TITLE Membres dont le statut de membre va expirer dans moins de
-DAYS jours
-OF_WHICH dont
-ARE_REFERRING_MEMBERS sont référents
-COL_UID uid
-COL_IDTY_WRITTEN_TIME obtention statut membre
-COL_LAST_RENEWAL dernier renouvellement
-COL_EXPIRE_MEMBERSHIP date d'expiration du membre
-COL_DISTANCE distance
-COL_DISTANCE_isOutdistanced KO
-COL_DISTANCE_isNotOutdistanced OK
-COL_LIST_RECEIVED_CERT liste des certifications reçues
-COL_LIST_EMITTED_CERT liste des certifications émises
-LAST2OLDEST récentes -> anciennes
-OLDEST2LAST anciennes -> récentes
-REFERRING_MEMBER référent
-YES oui
-NO non
-QUALITY_EXT qualité
-CENTRALITY centralité
-EMITTED émise
-WRITTEN écrite
-INVALID_BLOCKSTAMP blockstamp incorrect
-CERT_AVAILABLE disponible
-MEMBERS membres
-NEXT_YN Simuler le palier Y[n] suivant
-MEMBER_FILTER rechercher un membre
-EXPIRE_TIME date et heure d'expiration
\ No newline at end of file
diff --git a/lg/menu_en.txt b/lg/menu_en.txt
index 4adc1d3601c310b39c37e4e253a3ef2101b36310..c4d1ddd7b85e3ee2da71261d3a6e0a1d8d557ea5 100755
--- a/lg/menu_en.txt
+++ b/lg/menu_en.txt
@@ -1,9 +1,3 @@
 LG en
-WILL_MEMBERS willMembers
-MEMBERS members
-MEMBERS_COUNT membersCount
-WOTEX wotex
-GAUSSIAN_WOT_QUALITY gaussianWotQuality
-BLOCK_COUNT blockCount
 MONETARY_MASS monetaryMass
 ABOUT about
\ No newline at end of file
diff --git a/lg/menu_fr.txt b/lg/menu_fr.txt
index f0ca603d23741e016034ae22f3c257d825ec8e7d..d7e8b9f2f7992e93a3ebc869a907be919838fd17 100755
--- a/lg/menu_fr.txt
+++ b/lg/menu_fr.txt
@@ -1,9 +1,3 @@
 LG fr
-WILL_MEMBERS futurs membres
-MEMBERS listes des membres
-MEMBERS_COUNT nombre de membres
-WOTEX wotex
-GAUSSIAN_WOT_QUALITY qualité toile
-BLOCK_COUNT nombre de blocs
 MONETARY_MASS masse monétaire
 ABOUT a propos
\ No newline at end of file
diff --git a/lg/pubkeyBalance_en.txt b/lg/pubkeyBalance_en.txt
deleted file mode 100755
index aa39d220cc8d87cdfeb3977954e05f9ee8c172bc..0000000000000000000000000000000000000000
--- a/lg/pubkeyBalance_en.txt
+++ /dev/null
@@ -1,22 +0,0 @@
-BEGIN Begin
-END End
-PUBKEY Pubkey
-SELECT_MODE1 self balance
-SELECT_MODE2 balance with others
-UNIT_Q in ğ1
-UNIT_R in DUğ1
-STEP step
-HOURS hours
-DAYS days
-WEEKS weeks
-MONTHS months
-YEARS years
-SUBMIT_BUTTON submit
-CHART_TITLE1 Balance of the account
-CHART_TITLE2 in the range
-LEGEND_TOTAL_BALANCE balance
-LEGEND_INPUTS_MOVES movement of costs
-LEGEND_OUTPUTS_MOVES movement of receipts
-LEGEND_DU_LINE monetary creation
-LEGEND_TX_BALANCE transactions balance
-DESCRIPTION /!\ WARNING : These data are presented for information purposes. Only the balance indicate by the last stable version of an official Ğ1 client is safe.
\ No newline at end of file
diff --git a/lg/pubkeyBalance_fr.txt b/lg/pubkeyBalance_fr.txt
deleted file mode 100755
index 2d38c08e114165bcd2a38779f6defaf2c4247050..0000000000000000000000000000000000000000
--- a/lg/pubkeyBalance_fr.txt
+++ /dev/null
@@ -1,22 +0,0 @@
-BEGIN Début
-END Fin
-PUBKEY Clé publique
-SELECT_MODE1 solde de la clé
-SELECT_MODE2 bilan des échanges avec les autres clés
-UNIT_Q en ğ1
-UNIT_R en DUğ1
-STEP précision
-HOURS heures
-DAYS jours
-WEEKS semaines
-MONTHS mois
-YEARS années
-SUBMIT_BUTTON recharger
-CHART_TITLE1 Solde de la clé
-CHART_TITLE2 sur la période
-LEGEND_TOTAL_BALANCE solde
-LEGEND_INPUTS_MOVES flux dépenses
-LEGEND_OUTPUTS_MOVES flux recettes
-LEGEND_DU_LINE création monétaire
-LEGEND_TX_BALANCE bilan des transactions
-DESCRIPTION /!\ ATTENTION : Ces données sont présentées à titre indicatif et ne font pas foi. Seul le solde affiché par la dernière version stable d'un client Ğ1 officiel fait foi.
\ No newline at end of file
diff --git a/lg/willMembers_en.txt b/lg/willMembers_en.txt
deleted file mode 100755
index d66105996bdac8ba75fbb9acb8c2ed85c6b8ab34..0000000000000000000000000000000000000000
--- a/lg/willMembers_en.txt
+++ /dev/null
@@ -1,57 +0,0 @@
-DAYS days
-SORT_BY sort by
-SORT_BY_CREATION_IDTY identity's expiration date
-SORT_BY_SIG_COUNT number of certifications received
-SORT_BY_REGISTRATION_PACKAGE Availability date of the registration package
-ORDER in the following order
-ORDER_ASC ascending
-ORDER_DESC descending
-SUBMIT_TXT Submit
-CHECKBOX_SHOW_IDTY_WITH_ZERO_CERT Show identities that didn't receive any certification.
-CHECKBOX_SORT_SIG sort certifications by availability time.
-LEGEND Legend
-SIG_PERIOD_LEGEND darkred : [date from which this certification can be written according to sigPeriod].
-SIG_PERIOD_LEGEND2 green : [available] : means this certification may already be written in the next block.
-HOW_TO_BECOME_MEMBER_TITLE When does an identity become a member ?
-HOW_TO_BECOME_MEMBER_TEXT An identity becomes a member as soon as it has at least <b>5</b> certifications in the <font color='green'>[available]</font> state <b>at the same time <u>and</u></b> it respects the Distance Rule.<br>You can click directly on an identity to reach the according wotex page to verify if it respects the Distance Rule.
-DISTANCE_RULE_TITLE What is the Distance Rule ?
-DISTANCE_RULE_TXT It is required that for more than <font color='blue'><b>80% of the referring members</b></font>, a path of at most 5 steps should exist between each of them and the identity about to be certified.<br>Every member automatically becomes a referring member as soon as he has emitted <b><u>and</u></b> received Y[n] certifications. (Y[n] = CEILING(N(t)^(1/5))).<br>Currently, Yn = 
-WHAT_IS_CENTRALITY_TITLE What is the centrality degree ?
-WHAT_IS_CENTRALITY_TEXT The centrality degree of a member is the number of pairs directed (member->member) for which the member makes left one of the shortest paths.
-QUALITY_MEMBER_TITLE What is the certification quality ?
-QUALITY_MEMBER_TXT It is the report enters the rate of referring members reachable by a certification of this member and the rate of referring members which needs to achieve to respect the rule of distance.
-BLOCKCHAIN_TIME Current Blockchain Time
-TABLE_TITLE1 Identities that will expire in less than
-TABLE_TITLE2 days
-COUNT_READY_MEMBERS Identities having received 5 valid certifications or more
-WOT_TENSION_STATE Quality averages cases of membership according to the number of received valid certifications
-NUMBER_OF_RECEIVED_CERTS Number of received certs
-MEAN_SENTRIES_REACHED mean sentries reached
-MEAN_QUALITY_CERTS Quality averages of the set of certifications
-MEAN_MEMBERS_REACHED mean members reached
-IDENTITY Identity
-MEMBERSHIP_CASE_FULL complete case ?
-DISTANCE_RULE distance
-COL_4 List of received certifications (recent -> old)
-COL_4_WITH_AVAIlABILITY_SORT List of received certifications (by availability time)
-PUBKEY_PART pubkey (first 16 characters)
-EMITTE emitted
-EMITTED_ON emitted on
-EXPIRE_TIME expiration datetime
-KO KO
-OK OK
-MEMBERSHIP_NOT_ASKED Membership not asked
-YES yes
-NO no
-QUALITY_CERTIFIERS package quality
-DISTANCE Distance
-CERTS certifications
-QUALITY quality
-SIG_PERIOD_OK available
-IDTY_REVOKED [identity revoked]
-INVALID_BLOCKSTAMP invalid blockstamp
-LAST_TR1  total
-LAST_TR2  identities
-ON_WOTEX on wotex
-IDTY_FILTER filter identities
-MISS it's missing
diff --git a/lg/willMembers_fr.txt b/lg/willMembers_fr.txt
deleted file mode 100755
index 09d3fbe18bbd51bed1b7be110cb9bad3d015460d..0000000000000000000000000000000000000000
--- a/lg/willMembers_fr.txt
+++ /dev/null
@@ -1,57 +0,0 @@
-DAYS jours
-SORT_BY tri par
-SORT_BY_CREATION_IDTY date d'expiration de l'identité
-SORT_BY_SIG_COUNT nombre de certifications reçues
-SORT_BY_REGISTRATION_PACKAGE date de disponibilité du dossier d'inscription
-ORDER dans l'ordre
-ORDER_ASC croissant
-ORDER_DESC décroissant
-SUBMIT_TXT envoyer
-CHECKBOX_SHOW_IDTY_WITH_ZERO_CERT Afficher les identités n'ayant reçu aucune certification.
-CHECKBOX_SORT_SIG trier les certifications par date de disponibilité.
-LEGEND Légende
-SIG_PERIOD_LEGEND darkred : [date à partir de laquelle cette certification pourra être écrite compte tenu de sigPeriod].
-SIG_PERIOD_LEGEND2 green : [disponible] : signifie que cette certification pourrait être écrite dès le prochain block.
-HOW_TO_BECOME_MEMBER_TITLE À quel moment une identité devient membre ?
-HOW_TO_BECOME_MEMBER_TEXT Une identité devient membre dès qu'elle bénéficie d'au moins <b>5</b> certifications à l'état <font color='green'>[disponible]</font> <b>au même moment <u>et</u></b> qu'elle respecte la règle de distance.<br>Vous pouvez cliquer directement sur une identité pour arriver sur la page wotex correspondante afin de vérifier si elle respecte la règle de distance.
-DISTANCE_RULE_TITLE C'est quoi la règle de distance ?
-DISTANCE_RULE_TXT Il faut qu'il existe un chemin de 5 pas maximum d'au moins <font color='blue'><b>80% des membres référents</b></font> vers l'identité qui souhaite devenir membre.<br>Tout membre devient automatiquement référent dès lors qu'il a émis <b><u>et</u></b> reçu Y[n] certifications. (Y[n] = CEILING(N(t)^(1/5))).<br>Actuellement, Yn = 
-WHAT_IS_CENTRALITY_TITLE Qu'est ce que le degré de centralité ?
-WHAT_IS_CENTRALITY_TEXT Le degré de centralité d'un membre est le nombre de couples orientés (membre->membre) pour lesquels il fait parti d'un des plus court chemin reliant ce couple.
-QUALITY_MEMBER_TITLE Qu'est ce que la qualité d'un membre ?
-QUALITY_MEMBER_TXT C'est le rapport entre le taux de membres référents rendu atteignables par une certification de ce membre et le taux de membres référents qui faut atteindre pour respecter la règle de distance. Si ce nombre est supérieur ou égal à 1 c'est qu'une certification de ce membre suffit à elle seule pour respecter la règle de distance. Si les qualités de plusieurs certifieurs ne s'additionnent pas c'est tout simplement parce qu'une grande partie des membres référents qu'ils permettent d'atteindre sont les mêmes.
-BLOCKCHAIN_TIME Temps Blockchain actuel
-TABLE_TITLE1 Identités qui vont expirer dans moins de
-TABLE_TITLE2 jours
-COUNT_READY_MEMBERS Identités avec au moins 5 certifications valides reçues
-WOT_TENSION_STATE Qualité moyenne des dossiers d'adhésion en fonction du nombre de certifications valides reçues
-NUMBER_OF_RECEIVED_CERTS Nombre de certifications reçues
-MEAN_SENTRIES_REACHED Taux moyen de membres référents joiniables
-MEAN_QUALITY_CERTS Qualité moyenne par groupe de certifications reçues
-MEAN_MEMBERS_REACHED Taux moyen de membres joiniables
-IDENTITY Identité
-MEMBERSHIP_CASE_FULL dossier complet ?
-DISTANCE_RULE distance
-COL_4 liste des certifications reçues (récentes -> anciennes)
-COL_4_WITH_AVAIlABILITY_SORT liste des certifications reçues (par date de disponibilité)
-PUBKEY_PART clé publique (16 premiers caractères)
-EMITTED émise
-EMITTED_ON émise le
-EXPIRE_TIME date et heure d'expiration
-KO KO
-OK OK
-MEMBERSHIP_NOT_ASKED Adhésion non demandée
-YES oui
-NO non
-QUALITY_CERTIFIERS qualité dossier
-DISTANCE Distance
-CERTS certifications
-QUALITY qualité
-SIG_PERIOD_OK disponible
-IDTY_REVOKED [identité revoquée]
-INVALID_BLOCKSTAMP blockstamp incorrect
-LAST_TR1  total
-LAST_TR2  identités
-ON_WOTEX sur wotex
-IDTY_FILTER filtrer les identités
-MISS il manque
diff --git a/lg/wotex_en.txt b/lg/wotex_en.txt
deleted file mode 100755
index d08e5ae2d802363d92d31f5d4e902727f1f6dd34..0000000000000000000000000000000000000000
--- a/lg/wotex_en.txt
+++ /dev/null
@@ -1,15 +0,0 @@
-LG en
-TITLE wotb explorer
-TEST_UID Test UID
-CHECKBOX_PENDING_DATA Include sandbox's data
-MODE_W2U See the distance of User from WoT's point of view
-MODE_U2W See the distance of WoT from User's point of view
-LEGEND_TITLE Legend
-LEGEND_BLACK Black: Member
-LEGEND_BLUE Blue: Sentry (= Member + point of control)
-LEGEND_ORANGE Orange: Pending certification/identity
-LEGEND_RED Red: Ex-member
-STEP Step
-MAX MAX
-INFINITY Infinity
-CURRENT_SENTRIES Current sentries
\ No newline at end of file
diff --git a/lg/wotex_fr.txt b/lg/wotex_fr.txt
deleted file mode 100755
index 43c3a1d23c346abb37448cb8891dc1c6f1565ec3..0000000000000000000000000000000000000000
--- a/lg/wotex_fr.txt
+++ /dev/null
@@ -1,15 +0,0 @@
-LG fr
-TITLE Explorateur de la Toile de Confiance
-TEST_UID Saisir 
-CHECKBOX_PENDING_DATA Inclure les données en piscine
-MODE_W2U Voir la distance des autres identités vers l'identité de référence choisi
-MODE_U2W Voir la distance de l'identité de référence choisi vers les identités
-LEGEND_TITLE Légende
-LEGEND_BLACK Noir : Membre
-LEGEND_BLUE Bleu : Membre référent (= Membre + point de controle)
-LEGEND_ORANGE Orange : Données en piscine
-LEGEND_RED Rouge : Anciens membres
-STEP Distance
-MAX MAX
-INFINITY Distance infinie
-CURRENT_SENTRIES Membres Référents actuels
\ No newline at end of file
diff --git a/lib/colorScale.js b/lib/colorScale.js
deleted file mode 100644
index 4d861a84f751eca7b804e63b630d76f7a295fdae..0000000000000000000000000000000000000000
--- a/lib/colorScale.js
+++ /dev/null
@@ -1,86 +0,0 @@
-/**
-     * Compute colors scale
-     * @param count
-     * @param opacity
-     * @param startColor
-     * @param startState
-     * @returns {Array}
-     */
-module.exports = function colorScale(count, opacity, startColor, startState) {
-
-      function _state2side(state) {
-        switch(state) {
-          case 0:
-            return 0;
-          case 1:
-            return -1;
-          case 2:
-            return 0;
-          case 3:
-            return 1;
-        }
-      }
-
-      // From [0,1]
-      opacity = opacity || '0.55';
-
-      var defaultStateSize = Math.round(count / 2.5/*=4 states max*/);
-
-      // Start color [r,v,b]
-      var color = startColor ? angular.copy(startColor) : [255,0,0]; // Red
-
-      // Colors state: 0=keep, 1=decrease, 2=keep, 3=increase
-      var states = startState ? angular.copy(startState) : [0,2,3]; // R=keep, V=keep, B=increase
-
-      var steps = startColor ? [
-        Math.round(255 / defaultStateSize),
-        Math.round(255 / defaultStateSize),
-        Math.round(255 / defaultStateSize)
-      ] : [
-        Math.round((color[0]-50) / defaultStateSize),
-        Math.round((255-color[1]) / defaultStateSize),
-        Math.round((255-color[2]) / defaultStateSize)
-      ];
-
-
-      // Compute start sides (1=increase, 0=flat, -1=decrease)
-      var sides = [
-        _state2side(states[0]),
-        _state2side(states[1]),
-        _state2side(states[2])];
-
-      // Use to detect when need to change a 'flat' state (when state = 0 or 2)
-      var stateCounters  = [0,0,0];
-
-      var result = [];
-      for (var i = 0; i<count; i++) {
-        for (var j=0; j<3;j++) {
-          color[j] +=  sides[j] * steps[j];
-          stateCounters[j]++;
-          // color has reach a limit
-          if (((color[j] <= 0 || color[j] >= 255) && sides[j] !== 0) ||
-            (sides[j] === 0 && stateCounters[j] == defaultStateSize)) {
-            // Max sure not overflow limit
-            if (color[j] <= 0) {
-              color[j] = 0;
-            }
-            else if (color[j] >= 255) {
-              color[j] = 255;
-            }
-            // Go to the next state, in [0..3]
-            states[j] = (states[j] + 1) % 4;
-
-            // Update side from this new state
-            sides[j] = _state2side(states[j]);
-
-            // Reset state counter
-            stateCounters[j] = 0;
-          }
-        }
-
-        // Add the color to result
-        result.push('rgba(' + color[0] + ',' + color[1] + ',' + color[2] + ',' + opacity+')');
-
-      }
-      return result;
-    }
\ No newline at end of file
diff --git a/lib/constants.js b/lib/constants.js
index 1bf2b0270fbcacd8f02df3d1a9df59865d360865..dd2d09d569436f158bfa584ef0feae55e86f9cce 100755
--- a/lib/constants.js
+++ b/lib/constants.js
@@ -1,11 +1,5 @@
 "use strict";
 
 module.exports = {
-  DEFAULT_LANGUAGE: "fr",
-  MIN_WILLMEMBERS_UPDATE_FREQ: 180,
-  MIN_MEMBERS_UPDATE_FREQ: 180,
-	STEP_COUNT_MIN: 4,
-	STEP_COUNT_MAX: 150,
-  MIN_CACHE_UPDATE_FREQ: 150, // 2 min 30 (150 sec)
-  MIN_WOT_QUALITY_CACHE_UPDATE_FREQ: 300
+  DEFAULT_LANGUAGE: "fr"
 };
\ No newline at end of file
diff --git a/lib/main.js b/lib/main.js
index a57ec2712abde46231fb6793e484716b7f460eb1..44dfbc30ea912c4c40bb2a6a9dcd99d4e1847b2a 100755
--- a/lib/main.js
+++ b/lib/main.js
@@ -9,37 +9,12 @@ const timestampToDatetime = require(__dirname + '/timestampToDatetime.js');
  * Main algorithm
  */
 module.exports = (duniterServer, host, port, appParente, program) => co(function *() {
-
-  // Get local timezone offset
-  var x = new Date();
-  var offset = -x.getTimezoneOffset();
-  //timestampToDatetime(1000000, true, offset);
-  
-  // Define cache
-  var cache = {
-		// membersCount
-		lockMembersCount: false,
-    lastUptime: 0,
-    beginBlock: null,
-    currentBlockNumber : 0,
-    currentBlockTime: 0,
-    currentSentries: 0,
-    endBlock: null,
-    step: null,
-    stepUnit: null,
-    stepTime: null,
-    onlyDate: null,
-		Yn: 0,
-		pubkeys: new Array(),
-		pub_index: new Array(),
-		blockchain: new Array()
-  };
     
   // Confirm started
   console.log("module currency-monit started");
   
   // Specialized node's UI
-  let httpServer = webserver(host, port, appParente, duniterServer, offset, cache);
+  let httpServer = webserver(host, port, appParente, duniterServer);
   yield httpServer.openConnection();
 
 })
diff --git a/lib/updateCache.js b/lib/updateCache.js
deleted file mode 100755
index 0f2fd076d5dd81a9f7de3d1a8ef9dfa5de6aa897..0000000000000000000000000000000000000000
--- a/lib/updateCache.js
+++ /dev/null
@@ -1,289 +0,0 @@
-"use strict";
-
-const co = require('co');
-const constants = require(__dirname + '/constants')
-
-/**
-     * updateCache
-     * 
-     */
-module.exports = (req, res, next) => co(function *() {
-  
-  var { duniterServer, cache } = req.app.locals
-
-  try {
-		// Définition des constantes
-		const conf = duniterServer.conf;
-		
-		// Définition des variables
-		let upgradeCache = false;
-		
-		// Cacluler s'il faut mettre à jour le cache ou pas
-		upgradeCache = (Math.floor(Date.now() / 1000) > (cache.lastUptime + constants.MIN_CACHE_UPDATE_FREQ));
-		
-		// Si le cache membersCount est dévérouillé, le vérouiller, sinon ne pas réinitialiser le cache
-		if (upgradeCache && !cache.lockMembersCount)
-		{
-			cache.lockMembersCount = true;
-		}
-		else if(cache.lockMembersCount)
-		{
-			upgradeCache = false;
-		}
-
-    // If fork, unstack cache
-    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 ');
-			if (cache.blockchain.length > 0 && cache.blockchain[cache.blockchain.length-1].hash != checkBlock[0].hash && upgradeCache)
-      {
-				// reinitialize cache
-				cache.lastUptime = 0;
-				cache.lockMembersCount = false;
-				cache.beginBlock = null;
-				cache.currentBlockNumber = 0;
-				cache.currentBlockTime = 0;
-				cache.currentSentries = 0;
-				cache.endBlock = null;
-				cache.step = null;
-				cache.stepUnit = null;
-				cache.stepTime = null;
-				cache.onlyDate = null;
-				cache.Yn = 0;
-				cache.pubkeys = new Array();
-				cache.pub_index = new Array();
-				cache.blockchain = new Array();
-				
-				// reinitialize bdd
-				reinitBdd = true;
-      }
-    }
-    
-    // define step
-    cache.step = 1;
-    if (typeof(req.query.step) != 'undefined' && parseInt(req.query.step) > 0) { cache.step = req.query.step; }
-    
-    // calculate unitTime and onlyDate
-    let unitTime = 0;
-    if (typeof(req.query.stepUnit) != 'undefined')
-    {
-      switch (req.query.stepUnit)
-      {
-				case "blocks": unitTime = 3600; cache.onlyDate = false; cache.stepUnit = "blocks"; break;
-				case "hours": unitTime = 3600; cache.onlyDate = false; cache.stepUnit = "hours"; break;
-				case "days": unitTime = 86400; cache.onlyDate = true; cache.stepUnit = "days"; break;
-				case "weeks": unitTime = 604800; cache.onlyDate = true; cache.stepUnit = "weeks"; break;
-				case "months": unitTime = 18144000; cache.onlyDate = true; cache.stepUnit = "months"; break;
-				case "years": unitTime = 31557600; cache.onlyDate = true; cache.stepUnit = "years"; break;
-      }
-    }
-    // Default values
-    else
-    {
-      unitTime = 86400; cache.onlyDate = true; cache.stepUnit = "days";
-    }
-    
-    // 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 ');
-    }
-    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 ');
-      // 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 ');
-      }
-		}
-    
-    // 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 '); }
-    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 ');
-    }
-		else { cache.beginBlock = yield duniterServer.dal.peerDAL.query('SELECT `medianTime`,`number` FROM block WHERE `fork`=0 AND `number`='+req.query.begin+' LIMIT 1 '); }
-
-		// Define nbMaxPoints and adaptMaxPoints
-		if ( typeof(req.query.nbMaxPoints) != 'undefined' && req.query.nbMaxPoints > 0 ) {
-			cache.nbMaxPoints = req.query.nbMaxPoints;
-		} else {
-			cache.nbMaxPoints = constants.STEP_COUNT_MAX;
-		}
-		if ( typeof(req.query.adaptMaxPoints) != 'undefined' && (req.query.adaptMaxPoints == "step" || req.query.adaptMaxPoints == "end")) {
-			cache.adaptMaxPoints = req.query.adaptMaxPoints;
-		} else {
-			cache.adaptMaxPoints = "begin";
-		}
-		
-		// Apply nbMaxPoints and adaptMaxPoints
-		if (cache.adaptMaxPoints == "begin")
-		{
-			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 ');
-			}
-		} 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 ');
-		}
-    
-		// Calculate stepTime
-    cache.stepTime = parseInt(cache.step)*unitTime;
-
-    // if new blocks and MIN_CACHE_UPDATE_FREQ pass, update cache
-		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');
-      
-      // Initialise newJoiners
-      let newJoiners = new Array();
-      
-      // Initialise delIdtys
-      let delIdtys = new Array();
-      
-      for (let b=0;b<newBlocks.length;b++)
-      {
-				// Init let variables
-				let newSentries=0;
-				let expireCertsNumber=-1;
-				let minReceivedCerts = 0;
-				let revoked = [];
-				let actives = [];
-				let joiners = [];
-				let certifications = [];
-				
-				/*// get expireCertsNumber
-				let tmpExpireCertsBlock = yield duniterServer.dal.peerDAL.query(
-				'SELECT `number` FROM block WHERE `fork`=0 AND `medianTime` > '+cache.currentBlockTime+' AND `medianTime` < '+(parseInt(newBlocks[b].medianTime)-sigValidity)+' ORDER BY `medianTime` DESC LIMIT 1');
-							if (tmpExpireCertsBlock.length > 0) { expireCertsNumber = parseInt(tmpExpireCertsBlock[0].number); }
-							
-							// Suppr expires certs
-							if (expireCertsNumber >= 0)
-				{
-					for (let m=0;m<cache.pubkeys.length;m++)
-					{
-						//..
-					}
-				}*/
-        
-        // For become sentrie, minReceivedCerts is max between Yn and sigQty
-				minReceivedCerts = (cache.Yn<conf.sigQty) ? conf.sigQty:cache.Yn;
-
-				// If Yn change, suppr sentries that not achieve new Yn value
-				let newYn = Math.ceil(Math.pow(newBlocks[b].membersCount, 1/conf.stepMax));
-				if (newYn > cache.Yn && cache.Yn > 0)
-				{
-					for (let m=0;m<cache.pubkeys.length;m++)
-					{
-						if (cache.pubkeys[m].writtenCerts.length >= cache.Yn && cache.pubkeys[m].receivedCerts.length >= minReceivedCerts && (cache.pubkeys[m].writtenCerts.length < newYn || cache.pubkeys[m].receivedCerts.length < newYn)) { newSentries -= 1; }
-					}
-					minReceivedCerts = (newYn<conf.sigQty) ? conf.sigQty:newYn; // recalculate minReceivedCerts
-				}
-				cache.Yn = newYn;
-
-				// parse and split revoked
-				revoked = JSON.parse(newBlocks[b].revoked);
-				for (let r=0;r<revoked.length;r++)
-				{
-					revoked[r] = revoked[r].split(":");
-					delIdtys.push(revoked[r][0]);
-					let tmpPubIndex = cache.pub_index[revoked[r][0]];
-					//cache.pubkeys.splice(tmpPubIndex,1);
-				}
-
-				// parse and split actives
-				actives = JSON.parse(newBlocks[b].actives);
-				for (let a=0;a<actives.length;a++)
-				{
-					actives[a] = actives[a].split(":");
-					cache.pubkeys[cache.pub_index[actives[a][0]]].expires_on = newBlocks[b].medianTime+conf.msValidity;
-				}
-
-				// parse and split joiners
-				joiners = JSON.parse(newBlocks[b].joiners);
-				for (let j=0;j<joiners.length;j++)
-				{
-					joiners[j] = joiners[j].split(":");
-					if ( typeof(cache.pub_index[joiners[j][0]]) != 'undefined') 
-					{
-						let tmpPubkeyIndex = cache.pub_index[joiners[j][0]];
-						cache.pubkeys[tmpPubkeyIndex].updateWot = true;
-						cache.pubkeys[tmpPubkeyIndex].expires_on = newBlocks[b].medianTime+conf.msValidity;
-					}
-					else
-					{
-						cache.pubkeys.push({
-							updateWot: false,
-							expires_on: newBlocks[b].medianTime+conf.msValidity,
-							pub: joiners[j][0],
-							writtenCerts: new Array(),
-							receivedCerts: new Array()       
-						});
-						cache.pub_index[joiners[j][0]] = cache.pubkeys.length-1;
-						newJoiners.push(joiners[j][0]);
-					}
-				}
-
-				// parse and split certifications
-				certifications = JSON.parse(newBlocks[b].certifications);
-				for (let c=0;c<certifications.length;c++)
-				{
-					certifications[c] = certifications[c].split(":");
-					// push cert to cache
-					cache.pubkeys[cache.pub_index[certifications[c][0]]].writtenCerts.push(certifications[c][2]);
-					cache.pubkeys[cache.pub_index[certifications[c][0]]].updateWot = true;
-					cache.pubkeys[cache.pub_index[certifications[c][1]]].receivedCerts.push(certifications[c][2]);
-					cache.pubkeys[cache.pub_index[certifications[c][1]]].updateWot = true;
-					
-					// Calculate if the issuer of cert become sentry
-					if (cache.pubkeys[cache.pub_index[certifications[c][0]]].writtenCerts.length == cache.Yn && cache.pubkeys[cache.pub_index[certifications[c][0]]].receivedCerts.length >= minReceivedCerts)
-					{ newSentries++; }
-					
-					// Calculate if the receiver of cert become sentry
-					if (cache.pubkeys[cache.pub_index[certifications[c][1]]].writtenCerts.length >= cache.Yn && cache.pubkeys[cache.pub_index[certifications[c][1]]].receivedCerts.length == minReceivedCerts)
-					{ newSentries++; }
-				}
-
-				if (newSentries != 0)
-				{
-					cache.blockchain.push({
-						number: newBlocks[b].number,
-						hash: newBlocks[b].hash,
-						medianTime: newBlocks[b].medianTime,
-						newSentries: newSentries,
-						sentries: (cache.blockchain.length > 0) ? cache.blockchain[cache.blockchain.length-1].sentries+newSentries:newSentries
-					});
-				}
-      } // end of newBlocks loop
-
-      // update cache.currentBlockNumber and cache.currentBlockTime
-      cache.currentBlockNumber = cache.endBlock[0].number;
-      cache.currentBlockTime = cache.endBlock[0].medianTime;
-      
-      // Upgrade lastUptime
-      cache.lastUptime = Math.floor(Date.now() / 1000);
-    }
-
-      // Unlock Members count cache
-      if (upgradeCache)
-			{
-        cache.lockMembersCount = false;
-			}
-
-    next()
-  } catch (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/lib/webserver.js b/lib/webserver.js
index c62427887a3e85c5447005e42f114177d67912ca..8bceb5be7a4df325d23f2315711e91e923e63de9 100755
--- a/lib/webserver.js
+++ b/lib/webserver.js
@@ -13,7 +13,7 @@ const bodyParser = require('body-parser');
 const routes = require(__dirname + '/../routes');
 const tpl = require(__dirname + '/tplit.js');
 
-module.exports = (host, port, appParente, duniterServer, offset, cache) => {
+module.exports = (host, port, appParente, duniterServer) => {
   
   var app = express();
   
@@ -32,11 +32,8 @@ module.exports = (host, port, appParente, duniterServer, offset, cache) => {
   
   app.locals.duniterServer = duniterServer
   app.locals.currencyName = duniterServer.conf.currency
-  app.locals.offset = offset
-  app.locals.cache = cache
   
   app.locals.HTML_HEAD = fs.readFileSync(__dirname + '/../views/HEAD.html', 'utf-8')
-  app.locals.HTML_TOR_HEAD = fs.readFileSync(__dirname + '/../views/TOR_HEAD.html', 'utf-8')
   
   app.use( routes )
   
diff --git a/routes/blockCount.js b/routes/blockCount.js
deleted file mode 100755
index e3c5ebd27e26caf8ca0b13355eeeecbe28170e76..0000000000000000000000000000000000000000
--- a/routes/blockCount.js
+++ /dev/null
@@ -1,367 +0,0 @@
-"use strict";
-
-const co = require('co')
-const timestampToDatetime = require(__dirname + '/../lib/timestampToDatetime')
-const colorScale = require(__dirname + '/../lib/colorScale')
-const getLang = require(__dirname + '/../lib/getLang')
-
-// Garder l'index des blocs en mémoire vive
-var blockchain = [];
-var hashPreviousCurrentblock = 0;
-var previousBlockchainTime= 0;
-
-module.exports = (req, res, next) => co(function *() {
-  
-  var { duniterServer  } = req.app.locals
-  
-  try {
-    // get GET parameters
-    var begin = req.query.begin >= 0 && req.query.begin || 0; // Default begin Value is zero
-    var end = req.query.end >= 0 && req.query.end || -1; // Default Value is -1 (=current block)
-    var format = req.query.format || 'HTML';
-    var help = req.query.help || 'yes';
-    var data = req.query.data || 'nbBlocks';
-    var perNode = (req.query.perNode == 'yes') ? 'yes':'no';
-    var significantPercent = req.query.significantPercent || 3;
-
-    // get lg file
-    const LANG = getLang(`${__dirname}/../lg/blockCount_${req.query.lg||constants.DEFAULT_LANGUAGE}.txt`);
-    
-    // detect fork
-    if ( blockchain.length > 0 )
-    {
-      let newHashPreviousCurrentblock = yield duniterServer.dal.peerDAL.query('SELECT `hash` FROM block WHERE `fork`=0 AND `number` = '+(blockchain.length-1)+' LIMIT 1');
-      if ( hashPreviousCurrentblock != newHashPreviousCurrentblock )
-      {
-				blockchain.splice(0, blockchain.length);
-				hashPreviousCurrentblock = 0;
-				previousBlockchainTime = 0;
-      }
-    }
-    
-    // get medianTime of endBlock 
-    var endBlock = yield duniterServer.dal.peerDAL.query('SELECT `medianTime`,`hash` FROM block WHERE `fork`=0 AND `number` = '+end+' LIMIT 1');
-    
-    // get new blocks
-    var newBlocks = [];
-    if (end < 0)
-    {
-      newBlocks = yield duniterServer.dal.peerDAL.query('SELECT `issuer`,`membersCount`,`medianTime`,`dividend`,`number`,`nonce` FROM block WHERE `fork`=0 AND `medianTime` > '+previousBlockchainTime+' ORDER BY `medianTime` ASC');
-      blockchain = blockchain.concat(newBlocks);
-    }
-    else if (end > blockchain.length)
-    {
-      newBlocks = yield duniterServer.dal.peerDAL.query('SELECT `issuer`,`membersCount`,`medianTime`,`dividend`,`number`,`nonce` FROM block WHERE `fork`=0 AND `medianTime` <= '+endBlock[0].medianTime+' AND `medianTime` > '+previousBlockchainTime+' ORDER BY `medianTime` ASC');
-      
-      for (let i=0;i<newBlocks.length;i++)
-      {
-        blockchain.push(newBlocks[i]);
-      }
-    }
-    
-    // stock hashPreviousCurrentblock and previousBlockchainTime
-    let tmpCurrentBlock = yield duniterServer.dal.peerDAL.query('SELECT `medianTime`,`hash` FROM block WHERE `fork`=0 AND `number` = '+(blockchain.length-1)+' LIMIT 1');
-    hashPreviousCurrentblock = tmpCurrentBlock[0].hash;
-    previousBlockchainTime = tmpCurrentBlock[0].medianTime;
-   
-    // fix end
-    if (end == -1) { end = blockchain.length-1; }
-    
-    // get idtys list
-    var idtys = yield duniterServer.dal.peerDAL.query('SELECT `uid`,`pub`,`written_on` FROM i_index WHERE `wasMember`=1');
-    
-    // create and initialize tabBlockMembers, tabBlockCountPerNode and tabDataPerNode
-    var tabBlockMembers = [ [] ];
-    var tabCoreCountPerNode = [ [] ];
-    var tabBlockCountPerNode = [ [] ];
-    var tabDataPerNode = [ [] ];
-    var maxIdNode = 1;
-    for (let i=0;i<idtys.length;i++)
-    {
-      let tmpBecomeMember = idtys[i].written_on.split("-");
-      tabBlockMembers.push ({
-        uid: idtys[i].uid,
-        pubkey: idtys[i].pub,
-	becomeMember: (tmpBecomeMember[0] > begin) ? tmpBecomeMember[0]:begin,
-	coreCount: 0,
-	blockCount: 0, 
-        data: 0
-      });
-      // initialize tabBlockCountPerNode and tabDataPerNode
-      if (perNode == 'yes')
-      {
-	tabCoreCountPerNode.push(new Array());
-	tabBlockCountPerNode.push(new Array());
-	tabDataPerNode.push(new Array());
-      }
-    }
-    
-    // full tabBlockCountPerNode and tabDataPerNode with zero
-    if (perNode == 'yes')
-    {
-      for (let m=0;m<tabBlockMembers.length;m++)
-      {
-	for (let n=0;n<9;n++)
-	{
-	  tabCoreCountPerNode[m].push(0);
-	  tabBlockCountPerNode[m].push(0);
-	  if (data == 'meanNonce') { tabDataPerNode[m].push(0); }
-	}
-      }
-    }
-    
-    // Calculate the sum of blocks and their nonce and number of core
-    for (let b=begin;b<blockchain.length;b++)
-    {
-      for (let m=0;m<tabBlockMembers.length;m++)
-      {
-        if (tabBlockMembers[m].pubkey == blockchain[b].issuer)
-        {
-	  tabBlockMembers[m].blockCount++;
-	  let nonce = parseInt((blockchain[b].nonce).toString().substr(3));
-	  if (data == 'meanNonce') { tabBlockMembers[m].data += nonce; }
-	  
-	  let idCore = parseInt((blockchain[b].nonce).toString().substr(1, 2));
-	  tabBlockMembers[m].coreCount = (tabBlockMembers[m].coreCount < idCore) ? idCore:tabBlockMembers[m].coreCount;
-	  
-	  let idNode = parseInt((blockchain[b].nonce).toString().substr(0, 1));
-	  if (perNode == 'yes')
-	  {
-	    maxIdNode = (idNode > maxIdNode) ? idNode:maxIdNode;
-	    tabCoreCountPerNode[m][idNode-1] = (tabCoreCountPerNode[m][idNode-1] < idCore) ? idCore:tabCoreCountPerNode[m][idNode-1];
-	    tabBlockCountPerNode[m][idNode-1]++;
-	    if (data == 'meanNonce') { tabDataPerNode[m][idNode-1] += nonce; }
-	  }
-        }
-      }
-    }
-    
-    // Delete non-significant nodes
-    // A node is considered as significant if its blockCount represents more than 3 % of the total member blockCount
-    var maxSignificantIdNode = 1;
-    if (perNode == 'yes')
-    {
-      for (let m=0;m<tabBlockMembers.length;m++)
-      {
-        let significantLimit = parseInt(tabBlockMembers[m].blockCount * significantPercent / 100);
-	for (let n=0;n<maxIdNode;n++)
-	{
-	      if (tabBlockCountPerNode[m][n] <= significantLimit)
-	      {
-	        tabBlockMembers[m].blockCount -= tabBlockCountPerNode[m][n];
-		tabCoreCountPerNode[m][n] = 0;
-		tabBlockCountPerNode[m][n] = 0;
-		if (data == 'meanNonce')
-		{
-		  tabBlockMembers[m].data -= tabDataPerNode[m][n];
-		  tabDataPerNode[m][n] = 0;
-		}
-	      }
-	      else if (tabBlockCountPerNode[m][n] > 0)
-	      {
-		maxSignificantIdNode = ((n+1) > maxSignificantIdNode) ? (n+1):maxSignificantIdNode;
-	      }
-	}
-      }
-    }
-    
-    // calculate data (writtenPercent or meanNonce or writtenPercentSinceBecomeMember or  
-    for (let m=0;m<tabBlockMembers.length;m++)
-    {
-      if (data == 'nbBlocks')
-      {
-	tabBlockMembers[m].data = tabBlockMembers[m].blockCount;
-	if (perNode == 'yes') {
-	  for (let n=0;n<maxSignificantIdNode;n++) { tabDataPerNode[m].push(tabBlockCountPerNode[m][n]); }
-	}
-      }
-      else if (data == 'writtenPercent')
-      {
-	tabBlockMembers[m].data = parseFloat( ((tabBlockMembers[m].blockCount * 100) / (blockchain.length-begin)).toFixed(2) );
-	if (perNode == 'yes') {
-	  for (let n=0;n<maxSignificantIdNode;n++) {
-            tabDataPerNode[m].push( parseFloat( ((tabBlockCountPerNode[m][n] * 100) / (blockchain.length-begin)).toFixed(2) ) );
-	  }
-	}
-      }
-      else if (data == 'meanNonce' && tabBlockMembers[m].blockCount > 0)    
-      {
-	tabBlockMembers[m].data = parseInt( (tabBlockMembers[m].data / (tabBlockMembers[m].blockCount)).toFixed(0) );
-	if (perNode == 'yes') {
-	  for (let n=0;n<maxSignificantIdNode;n++) {
-            tabDataPerNode[m][n] = parseInt( (tabDataPerNode[m][n] / (tabBlockCountPerNode[m][n])).toFixed(0) );
-	  }
-	}
-      }
-      else if (data == 'writtenPercentSinceBecomeMember')
-      {
-	let nbBlockwithThisMember = (tabBlockMembers[m].becomeMember > begin) ? (blockchain.length-tabBlockMembers[m].becomeMember) : (blockchain.length-begin);
-	tabBlockMembers[m].data = parseFloat( ((tabBlockMembers[m].blockCount * 100) / nbBlockwithThisMember).toFixed(2) );
-	if (perNode == 'yes') {
-	  for (let n=0;n<maxSignificantIdNode;n++) {
-	    tabDataPerNode[m].push( parseFloat( ((tabBlockCountPerNode[m][n] * 100) / nbBlockwithThisMember).toFixed(2) ) );
-	  }
-	}
-      }
-    }
-    
-    // trier le tableau par ordre croissant de data
-    var tabBlockMembersSort = [ [] ];
-    var tabExcluded = [];
-    for (let m=0;m<tabBlockMembers.length;m++)
-    {
-      let max = -1;
-      let idMax = 0;
-      for (let m2=0;m2<tabBlockMembers.length;m2++)
-      {
-        if (tabBlockMembers[m2].data > max)
-        {
-          let exclude = false;
-          for (let e=0;e<tabExcluded.length;e++)
-          {
-            if (tabExcluded[e] == tabBlockMembers[m2].uid) { exclude = true; }
-          }
-          if (!exclude)
-          {
-            max = tabBlockMembers[m2].data;
-            idMax = m2;
-          }
-        }
-      }
-      tabBlockMembersSort.push({
-        uid: tabBlockMembers[idMax].uid,
-        pubkey: tabBlockMembers[idMax].pub,
-	becomeMember: tabBlockMembers[idMax].becomeMember,
-	coreCount: tabBlockMembers[m].coreCount,
-	coreCountPerNode: (perNode == 'yes') ? tabCoreCountPerNode[idMax]:null,
-	blockCount: tabBlockMembers[idMax].blockCount,
-	blockCountPerNode: (perNode == 'yes') ? tabBlockCountPerNode[idMax]:null,
-        data: tabBlockMembers[idMax].data,
-	dataPerNode: (perNode == 'yes') ? tabDataPerNode[idMax]:null
-      });
-      tabExcluded.push(tabBlockMembers[idMax].uid);
-    }
-    
-    //define dataLabel
-    var dataLabel = '#'+LANG['WRITTEN_BLOCKS'];
-    if (data == 'writtenPercent') { dataLabel = "\% "+LANG['BLOCKCHAIN']; }
-    else if (data == 'writtenPercentSinceBecomeMember') { dataLabel = "\% "+LANG['BLOCKCHAIN']+" ("+LANG['SINCE_BECOME_MEMBER']+")"; }
-    else if (data == 'meanNonce') { dataLabel = '#'+LANG['MEAN_NONCE']; }
-    
-    // Si le client demande la réponse au format JSON, le faire
-    if (format == 'JSON')
-      res.status(200).jsonp( tabBlockMembersSort )
-    else
-    {
-      // Formatting data
-      var tabLabels = [];
-      var tabDataX = [];
-      var tabDataXperNode = [ [] ];
-      var tabBackgroundColor = [];
-      var tabBorderColor = [];
-      var tabHoverBackgroundColor = [];
-      var nbMembers = 0;
-      for (let n=0;n<maxIdNode;n++) { tabDataXperNode.push(new Array()); }
-      for (let m=0;m<tabBlockMembersSort.length;m++)
-      {
-	if (tabBlockMembersSort[m].data > 0)
-	{
-	  if (perNode == 'yes')
-	  {
-	    tabLabels.push(tabBlockMembersSort[m].uid+"(");
-	    for (let n=0;n<maxSignificantIdNode;n++)
-	    {
-	      tabDataXperNode[n].push(tabBlockMembersSort[m].dataPerNode[n]);
-	      if (tabBlockMembersSort[m].coreCountPerNode[n] > 0) { tabLabels[tabLabels.length-1] += tabBlockMembersSort[m].coreCountPerNode[n]+"c,"; }
-	    }
-	    tabLabels[tabLabels.length-1] = tabLabels[tabLabels.length-1].substr(0, tabLabels[tabLabels.length-1].length-1);
-	    tabLabels[tabLabels.length-1] += ")";
-	  }
-	  else
-	  {
-	    tabLabels.push(tabBlockMembersSort[m].uid);
-	    tabDataX.push(tabBlockMembersSort[m].data);
-	  }
-	  nbMembers++;
-	}
-      }
-      
-      var datasets = [ [] ];
-      if (perNode == 'yes')
-      {
-	for (let n=0;n<maxSignificantIdNode;n++)
-	{
-	  datasets.push({
-		label: dataLabel,
-		data: tabDataXperNode[n],
-		backgroundColor: colorScale(nbMembers, 0.5),
-		borderWidth: 0,
-		hoverBackgroundColor: colorScale(nbMembers, 0.2)
-	      });
-	}
-      }
-      else
-      {
-	datasets = [{
-		label: dataLabel,
-		data: tabDataX,
-		backgroundColor: colorScale(nbMembers, 0.5),
-                borderColor: colorScale(nbMembers, 1.0),
-		borderWidth: 1,
-		hoverBackgroundColor: colorScale(nbMembers, 0.2),
-		hoverBorderColor: colorScale(nbMembers, 0.2)
-	      }];
-      }
-      
-      res.locals = {
-	 host: req.headers.host.toString(),
-         tabBlockMembersSort, 
-         begin, 
-         end,
-	 help,
-	 data,
-	 perNode,
-	 description: ``,
-	 chart: {
-	    type: 'bar',
-	    data: {
-	      labels: tabLabels,
-	      datasets: datasets
-	    },
-	    options: {
-	      title: {
-		display: true,
-		text: nbMembers+' '+LANG["RANGE"]+' #'+begin+'-#'+end
-	      },
-	      legend: {
-		display: false
-	      },
-	      scales: {
-		yAxes: [{
-		  ticks: {
-		      beginAtZero: true,
-		  }
-		}]
-	      },
-	      categoryPercentage: 1.0,
-	      barPercentage: 1.0
-	    }
-	  },
-	  form: `${LANG['BEGIN']} #<input type="number" name="begin" value="${begin}" size="7" style="width:60px;"> - ${LANG['END']} #<input type="number" name="end" value="${end}" size="7" style="width:60px;">
-	    <select name="data">
-	      <option name="data" value ="nbBlocks">${LANG["NB_BLOCKS"]}
-	      <option name="data" value ="writtenPercent" ${data == 'writtenPercent' ? 'selected' : ''}>${LANG["PERCENT_OF_WRITTEN_BLOCKS"]}
-	      <option name="data" value ="writtenPercentSinceBecomeMember" ${data == 'writtenPercentSinceBecomeMember' ? 'selected' : ''}>${LANG["PERCENT_OF_WRITTEN_BLOCKS"]} ${LANG["SINCE_BECOME_MEMBER"]}
-	      <option name="data" value ="meanNonce" ${data == 'meanNonce' ? 'selected' : ''}>${LANG['MEAN_NONCE']}
-	    </select>
-	    <input type="checkbox" name="perNode" value="yes" ${perNode == 'yes' ? 'checked' : ''}>${LANG['DETAIL_BY_NODE']} - 
-	    ${LANG['SIGNIFICANT_LIMIT']} <input type="number" name="significantPercent" value="${significantPercent}" size="2" style="width:30px;">${LANG['PERCENT_OF_BLOCKS']}`
-      }
-      next()
-    }
-    
-  } catch (e) {
-    // En cas d'exception, afficher le message
-    res.status(500).send(`<pre>${e.stack || e.message}</pre>`);
-  }
-})
\ No newline at end of file
diff --git a/routes/gaussianWotQuality.js b/routes/gaussianWotQuality.js
deleted file mode 100644
index 091da7f69fc63b6d928d2dc33f6df90beb5fb394..0000000000000000000000000000000000000000
--- a/routes/gaussianWotQuality.js
+++ /dev/null
@@ -1,241 +0,0 @@
-"use strict";
-
-const co = require('co')
-
-const constants = require(__dirname + '/../lib/constants')
-const membersQuality = require(__dirname + '/tools/membersQuality')
-const getLang = require(__dirname + '/../lib/getLang')
-
-// gaussianWotQuality cache
-var previousNextYn = "no";
-
-module.exports = (req, res, next) => co(function *() {
-  
-  var { duniterServer  } = req.app.locals
-  
-  try {
-      // get GET parameters
-      const format = req.query.format || 'HTML';
-      const sentries = req.query.sentries || 'yes';
-      const unit = req.query.unit || 'quality';
-      const nextYn = (req.query.nextYn=="yes") ? "yes":"no";
-
-      // get lg file
-      const LANG = getLang(`${__dirname}/../lg/gaussianWotQuality_${req.query.lg||constants.DEFAULT_LANGUAGE}.txt`);
-
-      // Définition des contantes
-      const conf = duniterServer.conf;
-      const qualityMax = (1/conf.xpercent);
-
-      // Définition des variables
-      let lastUpgradeTimeDatas = membersQuality(-1);
-      let tabUidIndex = [];
-      let tabMembersQuality= [];
-      let tabMembersQualitySorted = [];
-      let tabLabels = [];
-      let tabColors = [];
-      let tabLimit1 = [];
-
-      // Récupérer la liste des identités ayant actuellement le statut de membre
-      let membersList = yield duniterServer.dal.peerDAL.query('SELECT `uid`,`wotb_id` FROM i_index WHERE `member`=1');
-
-      // Si les données de qualité n'ont jamais été calculés, le faire
-      if (lastUpgradeTimeDatas == 0 || (lastUpgradeTimeDatas+constants.MIN_WOT_QUALITY_CACHE_UPDATE_FREQ) < (Math.floor(Date.now() / 1000)) || (previousNextYn != nextYn))
-      {
-        // Calculer dSen
-        var dSen = Math.ceil(Math.pow(membersList.length, 1 / conf.stepMax));
-        if (nextYn == "yes") { dSen++; }
-
-        // récupérer la wot
-        const wot = duniterServer.dal.wotb;
-
-        // Initialiser le cache des données de qualité
-        membersQuality(-1, dSen, conf.stepMax, conf.xpercent, wot.memCopy());
-      }
-
-      // Mettre a jour previousNextYn
-      previousNextYn = (nextYn=="yes") ? "yes":"no";
-
-      // Calculer nbSentries, limit1 and label
-      const nbSentries = (sentries=="no") ? membersList.length:membersQuality(-2);
-      let limit1 = 1;
-      let label = LANG['QUALITY'];
-      switch (unit)
-      {
-          case 'percentReached': limit1 = conf.xpercent*100; label = LANG['PERCENT_REACHED']; break;
-          case 'nbReached': limit1 = parseInt(conf.xpercent*nbSentries); label = LANG['NB_REACHED']; break;
-          default: break;
-      }
-
-      // Remplir les tableaux tabUidIndex et tabLimit1
-      for(const member of membersList)
-      {
-        tabUidIndex[member.wotb_id] = member.uid;
-        tabLimit1.push(limit1);
-      }
-
-      // Récupérer le tableau de qualité des membres
-      tabMembersQuality= [];
-      for (let i=0;membersQuality(i) >= 0;i++)
-      {
-        if (sentries == "no")
-        {
-          tabMembersQuality[i] = membersQuality(i, -1);
-        }
-        else
-        {
-          tabMembersQuality[i] = membersQuality(i);
-        }
-      }
-
-      // Initialisation du tableau tabMembersQualitySorted
-      for (let i=0;i<tabMembersQuality.length;i++)
-      {
-        tabMembersQualitySorted.push(0);
-      }
-
-      // Trier le tableau de façon gaussienne
-      let debut = true;
-      let membersQualityAlreadyCounted = [];
-      for (let i=0;i<tabMembersQuality.length;i++)
-      {
-        let min = qualityMax;
-        let idMin = 0;
-
-        for (let j=0;j<tabMembersQuality.length;j++)
-        {
-          if (tabMembersQuality[j] < min && typeof(membersQualityAlreadyCounted[j])=='undefined')
-          {
-            min = tabMembersQuality[j];
-            idMin = j;
-          }
-        }
-
-        // Remplir les tableaux triée de façon gaussienne
-        let idGaussian = parseInt(i/2);
-        if(!debut)
-        {
-          idGaussian = parseInt(tabMembersQuality.length-(i/2));
-        }
-        debut = !debut;
-        tabMembersQualitySorted[idGaussian] = tabMembersQuality[idMin];
-
-        // Exclure les membres déjà traités
-        membersQualityAlreadyCounted[idMin] = true;
-
-        // Définir le label pour cet abscisse
-        tabLabels[idGaussian] = tabUidIndex[idMin];
-
-        // Définir la couleur
-        if (tabMembersQuality[idMin] >= 1.10)
-        {
-          tabColors[idGaussian] = 'rgba(128, 0, 128, 0.5)';
-        }
-        else if (tabMembersQuality[idMin] >= 1.05)
-        {
-          tabColors[idGaussian] = 'rgba(0, 0, 255, 0.5)';
-        }
-        else if (tabMembersQuality[idMin] >= 1.00)
-        {
-          tabColors[idGaussian] = 'rgba(0, 255, 0, 0.5)';
-        }
-        else if (tabMembersQuality[idMin] >= 0.95)
-        {
-          tabColors[idGaussian] = 'rgba(255, 128, 0, 0.5)';
-        }
-        else if (tabMembersQuality[idMin] >= 0.90)
-        {
-          tabColors[idGaussian] = 'rgba(255, 0, 0, 0.5)';
-        }
-        else
-        {
-          tabColors[idGaussian] = 'rgba(0, 0, 0, 0.5)';
-        }
-      }
-
-      // Si le client demande les données dans une autre unité, faire la transformation
-      let unitCoeff = 1.0;
-      if (unit=='percentReached' || unit=='nbReached')
-      {
-        unitCoeff = parseFloat(conf.xpercent);
-        if (unit=='nbReached') { unitCoeff *= parseFloat(nbSentries); }
-        else { unitCoeff *= 100.0; }
-        for (let i=0;i<tabMembersQualitySorted.length;i++)
-        {
-          tabMembersQualitySorted[i] = parseInt(tabMembersQualitySorted[i]*unitCoeff);
-        }
-      }
-      
-      // Si le client demande la réponse au format JSON, le faire
-      if (format == 'JSON')
-      {
-        let tabJson = [];
-        for (let i=0;i<tabMembersQualitySorted.length;i++)
-        {
-          tabJson.push({
-            label: tabLabels[i],
-            quality: tabMembersQualitySorted[i]
-          });
-        }
-        res.status(200).jsonp( tabJson )
-      }
-      else
-      {
-        res.locals = {
-        host: req.headers.host.toString(),
-          form: `
-            <select name="unit">
-              <option name="unit" value ="quality">${LANG['QUALITY']}
-              <option name="unit" value ="percentReached" ${unit == 'percentReached' ? 'selected' : ''}>${LANG['PERCENT_REACHED']}
-              <option name="unit" value ="nbReached" ${unit == 'nbReached' ? 'selected' : ''}>${LANG['NB_REACHED']}
-            </select>`,
-          form2: `<input type="checkbox" name="sentries" value="no" ${sentries == 'no' ? 'checked' : ''}> ${LANG["IF_NO_SENTRIES"]}<br>
-            <input type="checkbox" name="nextYn" value="yes" ${nextYn == 'yes' ? 'checked' : ''}> ${LANG["NEXT_YN"]}`,
-          chart: {
-            type: 'bar',
-            data: {
-              labels: tabLabels,
-              datasets: [{
-                label: label,
-                data: tabMembersQualitySorted,
-                backgroundColor: tabColors,
-                borderWidth: 0
-              },
-              {
-                label: 'limit',
-                data: tabLimit1,
-                backgroundColor: 'rgba(0, 255, 0, 0.5)',
-                borderColor: 'rgba(0, 255, 0, 1)',
-                borderWidth: 2,
-                type: 'line',
-                fill: false,
-                pointStyle: 'dash'
-              }]
-            },
-            options: {
-              title: {
-                display: true,
-                text: LANG['DISTRIBUTION_QUALITY']
-              },
-              legend: {
-                display: false
-              },
-              scales: {
-                yAxes: [{
-                  position: 'left',
-                  ticks: {
-                    min: 0,
-                    max: parseFloat(((1/conf.xpercent)*unitCoeff).toFixed(2))
-                  }
-                }]
-              }
-            }
-          }
-        }
-        next()
-      }
-  } catch (e) {
-    // En cas d'exception, afficher le message
-    res.status(500).send(`<pre>${e.stack || e.message}</pre>`);
-  }
-})
\ No newline at end of file
diff --git a/routes/index.js b/routes/index.js
index a1cb8ec0994c22f44b3f7b770389468ec7e9ba23..366bbb55f6b2809262734f34f94830a4b73f41b9 100755
--- a/routes/index.js
+++ b/routes/index.js
@@ -51,100 +51,6 @@ app.get('/about', // chemin (endpoint)
   })
 )
 
-/***************************************
-* Lister les futurs membres
-***************************************/
-app.get('/willMembers', // chemin (endpoint)
-  require(__dirname + '/willMembers.js'), // controleur (route)
-  (req, res)=> res.render('willMembers.html', { // rendu (template)
-    printMenu,
-	  help: req.query.help,
-	  MENU_LANG: getLang(`${__dirname}/../lg/menu_${req.query.lg||constants.DEFAULT_LANGUAGE}.txt`),
-    LANG: getLang(`${__dirname}/../lg/willMembers_${req.query.lg||constants.DEFAULT_LANGUAGE}.txt`)
-  })
-)
-
-/***************************************
-* Lister les membres
-***************************************/
-app.get('/members',
-  require(__dirname + '/members.js'),
-  (req, res)=> res.render('members.html', {
-    printMenu,
-		help: req.query.help,
-		MENU_LANG: getLang(`${__dirname}/../lg/menu_${req.query.lg||constants.DEFAULT_LANGUAGE}.txt`),
-    LANG: getLang(`${__dirname}/../lg/members_${req.query.lg||constants.DEFAULT_LANGUAGE}.txt`)
-  })
-)
-
-/***************************************
-* Lister les anciens membres
-***************************************/
-/*app.get('/wasMembers',
-  require(__dirname + '/wasMembers.js'),
-  (req, res)=> res.render('wasMembers.html', {
-    printMenu,
-    help: req.query.help,
-    MENU_LANG: getLang(`${__dirname}/../lg/menu_${req.query.lg||constants.DEFAULT_LANGUAGE}.txt`),
-    LANG: getLang(`${__dirname}/../lg/wasMembers_${lg}.txt`)
-  })
-)*/
-
-/***************************************
-* Évolution du nombre de membres
-***************************************/
-app.get('/membersCount',
-  require(__dirname + '/../lib/updateCache.js'), require(__dirname + '/membersCount.js'),
-  (req, res)=> res.render('Chart.html', {
-    printMenu,
-    pageName: 'MEMBERS_COUNT',
-    help: req.query.help,
-    MENU_LANG: getLang(`${__dirname}/../lg/menu_${req.query.lg||constants.DEFAULT_LANGUAGE}.txt`),
-    LANG: getLang(`${__dirname}/../lg/membersCount_${req.query.lg||constants.DEFAULT_LANGUAGE}.txt`)
-  })
-)
-
-/***************************************
-* Wotex
-***************************************/
-app.get('/wotex',
-  require(__dirname + '/wotex.js'),
-  (req, res)=> res.render('wotex.html', {
-    printMenu,
-    help: req.query.help,
-    MENU_LANG: getLang(`${__dirname}/../lg/menu_${req.query.lg||constants.DEFAULT_LANGUAGE}.txt`),
-    LANG: getLang(`${__dirname}/../lg/wotex_${req.query.lg||constants.DEFAULT_LANGUAGE}.txt`)
-  })
-)
-
-/*******************************************
-* Graphe gaussien de la qualité des membres
-********************************************/
-app.get('/gaussianWotQuality', 
-  require(__dirname + '/gaussianWotQuality.js'),
-  (req, res)=> res.render('Chart.html', {
-    printMenu,
-    pageName: 'GAUSSIAN_WOT_QUALITY',
-    help: req.query.help,
-    MENU_LANG: getLang(`${__dirname}/../lg/menu_${req.query.lg||constants.DEFAULT_LANGUAGE}.txt`),
-    LANG: getLang(`${__dirname}/../lg/gaussianWotQuality_${req.query.lg||constants.DEFAULT_LANGUAGE}.txt`)
-  })
-)
-
-/***************************************
-* Lister les block en graphe
-***************************************/
-app.get('/blockCount', 
-  require(__dirname + '/blockCount.js'),
-  (req, res)=> res.render('Chart.html', {
-    printMenu,
-    pageName: 'BLOCK_COUNT',
-    help: req.query.help,
-    MENU_LANG: getLang(`${__dirname}/../lg/menu_${req.query.lg||constants.DEFAULT_LANGUAGE}.txt`),
-    LANG: getLang(`${__dirname}/../lg/blockCount_${req.query.lg||constants.DEFAULT_LANGUAGE}.txt`)
-  })
-)
-
 /***************************************
 * Évolution de la masse monétaire totale
 ***************************************/
diff --git a/routes/members.js b/routes/members.js
deleted file mode 100755
index 7148b063a2ca870d5473bfe3f51a3ed2d41cc8a5..0000000000000000000000000000000000000000
--- a/routes/members.js
+++ /dev/null
@@ -1,641 +0,0 @@
-"use strict";
-
-const co = require('co')
-
-const constants = require(__dirname + '/../lib/constants')
-
-const timestampToDatetime = require(__dirname + '/../lib/timestampToDatetime')
-const membersQuality = require(__dirname + '/tools/membersQuality')
-
-// Préserver les résultats en cache
-var lockMembers = false;
-var membersLastUptime = 0;
-var previousMode = null;
-var previousCentrality = null;
-var previousNextYn = "no";
-var membersList = [];
-var membersIdentity = [];
-var membersFirstCertifExpire = [];
-var membersCertifsList = [];
-var membersPendingCertifsList = [];
-var membershipsTimeList = [];
-var membershipsBlockNumberList = [];
-var membershipsExpireTimeList = [];
-var nbMaxCertifs = 0;
-var sentries = [];
-var sentriesIndex = [];
-var countSentries = 0;
-/*var meanSentriesReachedBySentriesInSingleExtCert = 0;
-var meanMembersReachedBySentriesInSingleExtCert = 0;
-var meanSentriesReachedByMembersInSingleExtCert = 0;
-var meanMembersReachedByMembersInSingleExtCert = 0;*/
-var proportionMembersWithQualityUpper1 = 0;
-var proportionMembersWithQualityUpper1IfNoSentries = 0;
-
-// wotCentrality cache
-var lockCentralityCalc = false;
-var membersLastCentralityCalcTime = 0;
-var membersCentrality = [];
-var meanCentrality = 0;
-var meanShortestsPathLength = 0;
-var nbShortestsPath = 0;
-
-
-module.exports = (req, res, next) => co(function *() {
-  
-  var { duniterServer  } = req.app.locals
-  
-  try {
-    // Initaliser les constantes
-    const conf = duniterServer.conf;
-    const head = yield duniterServer.dal.getCurrentBlockOrNull();
-    const currentBlockchainTimestamp =  head ? head.medianTime : 0;
-    const membersCount = head ? head.membersCount : 0;
-    var dSen = Math.ceil(Math.pow(membersCount, 1 / conf.stepMax));
-    
-    // Initaliser les variables
-		let membersListOrdered = [];
-		let membersCertifsListSorted = [];
-		let tabSort = [];
-		let membersNbSentriesUnreached = [];
-
-    // Récupéré les paramètres
-    var days = req.query.d || 400 // Valeur par défaut
-    var mode = req.query.mode || 'received' // Valeur par défaut
-    var order = req.query.d && req.query.order || 'desc' // Valeur par défaut
-    var sort_by = req.query.sort_by || "idtyWritten" // Valeur par défaut
-	var pendingSigs = req.query.pendingSigs || "no"; // Valeur par défaut
-	var centrality = req.query.centrality || "no"; // Valeur par défaut
-	var format = req.query.format || 'HTML'; // Valeur par défaut
-	const nextYn = (req.query.nextYn=="yes") ? "yes":"no";
-
-	// Vérifier la valeur de nextYn dans le cache
-	let lastUpgradeTimeDatas = membersQuality(-1);
-	let dSenCache = membersQuality(-3);
-	if (lastUpgradeTimeDatas > 0 && dSenCache > dSen) { previousNextYn=="yes"; }
-    
-    // Alimenter wotb avec la toile actuelle
-		const wotbInstance = duniterServer.dal.wotb;
-		
-		// Vérifier si le cache doit être Réinitialiser
-		let reinitCache = (Math.floor(Date.now() / 1000) > (membersLastUptime + constants.MIN_MEMBERS_UPDATE_FREQ));
-		
-		// Si changement de conditions, alors forcer le rechargement du cache s'il n'est pas, vérouillé, sinon forcer les conditions à celles en mémoire
-		if (previousMode != mode || previousCentrality != centrality || previousNextYn != nextYn)
-		{
-			if (!lockMembers)
-			{
-				lockMembers = true;
-				reinitCache = true;
-			}
-			else
-			{
-				mode = previousMode;
-				centrality = previousCentrality;
-				nextYn =previousNextYn;
-			}
-		}
-		// Sinon, si les conditions sont identiques :
-		// Si le cache members est dévérouillé, le vérouiller, sinon ne pas réinitialiser le cache
-		else if (reinitCache && !lockMembers)
-		{
-			lockMembers = true;
-		}
-		else if(lockMembers)
-		{
-			reinitCache = false;
-		}
-		
-		if (reinitCache)
-		{
-			// Réinitialiser le cache
-			membersLastUptime = Math.floor(Date.now() / 1000);
-			previousMode = mode;
-			previousCentrality = centrality;
-			previousNextYn = nextYn;
-			membersList = [];
-			membersIdentity = [];
-			membersFirstCertifExpire = [];
-			membersCertifsList = [];
-			membersPendingCertifsList = [];
-			membershipsTimeList = [];
-			membershipsBlockNumberList = [];
-			membershipsExpireTimeList = [];
-			nbMaxCertifs = 0;
-			sentries = [];
-			sentriesIndex = [];
-			countSentries = 0;
-			/*meanSentriesReachedBySentriesInSingleExtCert = 0;
-			meanMembersReachedBySentriesInSingleExtCert = 0;
-			meanSentriesReachedByMembersInSingleExtCert = 0;
-			meanMembersReachedByMembersInSingleExtCert = 0;*/
-			proportionMembersWithQualityUpper1 = 0;
-			proportionMembersWithQualityUpper1IfNoSentries = 0;
-
-			// Appliquer le paramètre nextYn
-			if (nextYn=="yes") { dSen++; }
-
-			// réinitialiser le cache des données de qualité
-			membersQuality(-1, dSen, conf.stepMax, conf.xpercent, wotbInstance.memCopy());
-			
-			// Réinitialiser le cache des données de centralité
-			if (centrality=='yes')
-			{
-				membersLastCentralityCalcTime = Math.floor(Date.now() / 1000);
-				membersCentrality = [];
-				meanCentrality = 0;
-				meanShortestsPathLength = 0;
-				nbShortestsPath = 0;
-			}
-			
-			// Récupérer la liste des membres référents
-			sentries = wotbInstance.getSentries(dSen);
-    
-			// Récupérer la liste des identités ayant actuellement le statut de membre
-			membersList = yield duniterServer.dal.peerDAL.query('SELECT `uid`,`pub`,`member`,`written_on`,`wotb_id` FROM i_index WHERE `member`=1');
-    
-			// Récupérer pour chaque identité, le numéro du block d'écriture du dernier membership
-			// Ainsi que la première ou dernière certification
-			for (let m=0;m<membersList.length;m++)
-			{
-				// Récupérer les blockstamp d'écriture et date d'expiration du membership courant du membre m
-				let tmpQueryResult = yield duniterServer.dal.peerDAL.query(
-						'SELECT `written_on`,`expires_on` FROM m_index WHERE `pub`=\''+membersList[m].pub+'\' ORDER BY `expires_on` DESC LIMIT 1');
-					membershipsExpireTimeList.push(tmpQueryResult[0].expires_on);
-					
-				// Extraire le numéro de bloc du blockstamp d'écriture du membership courant
-				let blockstampMembershipWritten = tmpQueryResult[0].written_on.split("-"); // Separate blockNumber and blockHash
-				membershipsBlockNumberList.push(blockstampMembershipWritten[0]);
-				
-				// Extraire le numéro de bloc du blockstamp d'écriture de l'identité du membre
-				let blockstampIdtyWritten = membersList[m].written_on.split("-"); // Separate blockNumber and blockHash
-				
-				// Récupérer le champ medianTime du bloc d'écriture de l'identité du membre
-				let resultQueryTimeWrittenIdty = yield duniterServer.dal.peerDAL.query(
-						'SELECT `medianTime` FROM block WHERE `number`=\''+blockstampIdtyWritten[0]+'\' LIMIT 1')
-				
-				// Vérifier si le membre est référent
-				let currentMemberIsSentry = false;
-				sentriesIndex[membersList[m].uid] = false;
-				for (let s=0;s<sentries.length;s++)
-				{
-					if (sentries[s] == membersList[m].wotb_id)
-					{
-						currentMemberIsSentry=true;
-						sentries.splice(s, 1);
-						sentriesIndex[membersList[m].uid] = true;
-					}
-				}
-				
-				// Réinitialiser le degré de centralité du membre
-				if (centrality=='yes')
-				{
-					membersCentrality[membersList[m].wotb_id] = 0;
-				}
-				
-				// Créer une wot temporaire
-				let tmpWot = wotbInstance.memCopy();
-				
-				// Récupérer les informations détaillés de distance pour le membre courant
-				let detailedDistance = tmpWot.detailedDistance(membersList[m].wotb_id, dSen, conf.stepMax, conf.xpercent);
-				
-				// Calculer le nombre de membres référents
-				if (currentMemberIsSentry)
-				{
-					countSentries++;
-				}
-
-				// Calculate membersNbSentriesUnreached
-				membersNbSentriesUnreached[membersList[m].uid] = parseInt(detailedDistance.nbSentries) - parseInt(detailedDistance.nbSuccess);
-
-				// Calculer la qualité du membre courant
-				if (membersQuality(membersList[m].wotb_id, (currentMemberIsSentry) ? 1 : 0) >= 1.0) {
-					proportionMembersWithQualityUpper1++;
-				}
-
-				// Calculer la qualité du membre courant s'il n'y avait pas de référents (autrement di si tout les membres était référents)
-				//let membersQualityIfNoSentries = ((detailedDistanceQualityExt.nbReached/membersList.length)/conf.xpercent).toFixed(2);
-				//console.log("membersQualityIfNoSentries[%s] = %s", membersList[m].uid, membersQualityIfNoSentries);
-				if (membersQuality(membersList[m].wotb_id, -1) >= 1.0) {
-					proportionMembersWithQualityUpper1IfNoSentries++;
-				}
-				
-				// Nettoyer la wot temporaire
-				tmpWot.clear();
-				
-				// Stocker les informations de l'identité
-				membersIdentity.push({
-					writtenBloc: blockstampIdtyWritten[0],
-					writtenTimestamp: resultQueryTimeWrittenIdty[0].medianTime,
-					detailedDistance: detailedDistance,
-					isSentry: currentMemberIsSentry
-				});
-				
-				// récupérer toutes les certification  reçus/émises par l'utilisateur
-				let tmpQueryCertifsList = [];
-				let tmpOrder = (sort_by == "lastSig") ? 'DESC' : 'ASC';
-				if (mode == 'emitted')
-				{
-					tmpQueryCertifsList = yield duniterServer.dal.peerDAL.query(
-						'SELECT `receiver`,`written_on`,`expires_on` FROM c_index WHERE `issuer`=\''+membersList[m].pub+'\' ORDER BY `expires_on` '+tmpOrder);
-				}
-				else
-				{
-					tmpQueryCertifsList = yield duniterServer.dal.peerDAL.query(
-						'SELECT `issuer`,`written_on`,`expires_on` FROM c_index WHERE `receiver`=\''+membersList[m].pub+'\' ORDER BY `expires_on` '+tmpOrder);
-				}
-
-				// Calculer le nombre de certifications reçus/émises par le membre courant
-				let nbWrittenCertifs = tmpQueryCertifsList.length;
-				
-				// Récupérer les uid des émetteurs/receveurs des certifications reçus/émises par l'utilisateur
-				// Et stocker les uid et dates d'expiration dans un tableau
-				membersCertifsList[m] = new Array();
-				for (var i=0;i<nbWrittenCertifs;i++)
-				{
-					let tmpQueryGetUidProtagonistCert
-					if (mode == 'emitted')
-					{
-						tmpQueryGetUidProtagonistCert = yield duniterServer.dal.peerDAL.query('SELECT `uid`,`wotb_id` FROM i_index WHERE `pub`=\''+tmpQueryCertifsList[i].receiver+'\' LIMIT 1');
-					}
-					else
-					{
-						tmpQueryGetUidProtagonistCert = yield duniterServer.dal.peerDAL.query('SELECT `uid`,`wotb_id` FROM i_index WHERE `pub`=\''+tmpQueryCertifsList[i].issuer+'\' LIMIT 1');
-					}
-					let tmpBlockWrittenOn = tmpQueryCertifsList[i].written_on.split("-");
-					
-					// Stoker la liste des certifications qui n'ont pas encore expirées
-					if (tmpQueryCertifsList[i].expires_on > currentBlockchainTimestamp)
-					{
-						if (i == 0)
-						{
-							membersFirstCertifExpire.push(tmpQueryCertifsList[0].expires_on);
-						}
-						membersCertifsList[m].push({
-							protagonistWotId: tmpQueryGetUidProtagonistCert[0].wotb_id,
-							issuer: (mode=='emitted') ? membersList[m].uid:tmpQueryGetUidProtagonistCert[0].uid,
-							receiver: (mode!='emitted') ? membersList[m].uid:tmpQueryGetUidProtagonistCert[0].uid,
-							writtenBloc: tmpBlockWrittenOn[0],
-							timestampExpire: tmpQueryCertifsList[i].expires_on
-						});
-					}
-				}
-				
-					// Récupérer toutes les certification en piscine
-					let nbValidPendingCertifs = 0;
-					let tmpQueryPendingCertifsList = [];
-					if (mode == 'emitted')
-					{
-						tmpQueryPendingCertifsList = yield duniterServer.dal.peerDAL.query(
-							'SELECT `from`,`to`,`block_number`,`expires_on` FROM certifications_pending WHERE `from`=\''+membersList[m].pub+'\' ORDER BY `expires_on` '+tmpOrder);
-					}
-					else
-					{
-						tmpQueryPendingCertifsList = yield duniterServer.dal.peerDAL.query(
-							'SELECT `from`,`block_number`,`block_hash`,`expires_on` FROM certifications_pending WHERE `to`=\''+membersList[m].pub+'\' ORDER BY `expires_on` '+tmpOrder);
-					}
-					
-					// Récupérer les uid des émetteurs des certifications reçus par l'utilisateur
-					// Et stocker les uid et dates d'expiration dans un tableau
-					membersPendingCertifsList[m] = new Array();
-					for (var i=0;i<tmpQueryPendingCertifsList.length;i++)
-					{
-						// Récupérer le medianTime et le hash du bloc d'émission de la certification 
-						let emittedBlock = yield duniterServer.dal.peerDAL.query('SELECT `hash`,`medianTime` FROM block WHERE `number`=\''+tmpQueryPendingCertifsList[i].block_number+'\' AND `fork`=0 LIMIT 1');
-						
-						let tmpPub = (mode=='emitted') ? tmpQueryPendingCertifsList[i].to:tmpQueryPendingCertifsList[i].from;
-						let tmpQueryGetUidProtagonistPendingCert = yield duniterServer.dal.peerDAL.query('SELECT `uid` FROM i_index WHERE `pub`=\''+tmpPub+'\' LIMIT 1');
-						
-						// Vérifier que l'émetteur de la certification correspond à une identié connue
-						if ( tmpQueryGetUidProtagonistPendingCert.length > 0 )
-						{
-							// Vérifier la validité du blockStamp de la certification en piscine
-							let validBlockStamp = false;
-							if (typeof(emittedBlock[0]) != 'undefined' && emittedBlock[0].hash == tmpQueryPendingCertifsList[i].block_hash)
-							{ validBlockStamp = true; }
-							
-							// Vérifier que le membre courant n'a pas déjà émis/reçu d'autre(s) certification(s) vis à vis du même protagoniste ET dans le même état de validité du blockstamp
-							let doubloonPendingCertif = false;
-							for (const pendingCert of membersPendingCertifsList[m])
-							{
-								if (pendingCert.protagonist == tmpQueryGetUidProtagonistPendingCert[0].uid && pendingCert.validBlockStamp == validBlockStamp)
-								{
-									doubloonPendingCertif = true;
-								}
-							}
-							if (!doubloonPendingCertif)
-							{
-								// récupérer le timestamp d'écriture de la dernière certification écrite par l'émetteur
-								let tmpQueryLastIssuerCert = yield duniterServer.dal.peerDAL.query('SELECT `chainable_on` FROM c_index WHERE `issuer`=\''+tmpQueryPendingCertifsList[i].from+'\' ORDER BY `expires_on` DESC LIMIT 1');
-									
-								// Stoker la liste des certifications en piscine qui n'ont pas encore expirées
-								if (tmpQueryPendingCertifsList[i].expires_on > currentBlockchainTimestamp)
-								{
-									membersPendingCertifsList[m].push({
-											protagonist: tmpQueryGetUidProtagonistPendingCert[0].uid,
-											protagonistIsSentry: sentriesIndex[tmpQueryGetUidProtagonistPendingCert[0].uid],
-											blockNumber: tmpQueryPendingCertifsList[i].block_number,
-											timestampExpire: tmpQueryPendingCertifsList[i].expires_on,
-											timestampWritable: (typeof(tmpQueryLastIssuerCert[0]) == 'undefined') ? 0:tmpQueryLastIssuerCert[0].chainable_on,
-											validBlockStamp: validBlockStamp
-									});
-									nbValidPendingCertifs++;
-								}
-								
-							}
-						}
-					}
-				
-				// Calculer le nombre maximal de certifications reçus par le membre courant
-				let nbCertifs = nbWrittenCertifs + nbValidPendingCertifs;
-				if ( nbCertifs > nbMaxCertifs) { nbMaxCertifs = nbCertifs; }
-			} // END of members loop
-			
-			// Convertir chaque blockNumber (de membership) en timestamp
-			for (const membershipBlockNumber of membershipsBlockNumberList)
-			{
-				membershipsTimeList.push(yield duniterServer.dal.peerDAL.query(
-					'SELECT `medianTime` FROM block WHERE `number`=\''+membershipBlockNumber+'\' LIMIT 1') );
-			}
-    
-			// Traiter les cas ou expires_on est indéfini
-			for (let i=0;i<membershipsExpireTimeList.length;i++)
-			{
-				if (membershipsExpireTimeList[i] == null)
-				{
-					membershipsExpireTimeList[i] = membershipsTimeList[i] + msValidity;
-				}
-			}
-			
-			// Calculer le degré de centralité de tout les membres (si demandé)
-			if (centrality=='yes')
-			{
-				let test = '';
-				for (const member of membersList)
-				{
-					//if (sentriesIndex[member.uid])
-					//{
-						let tmpWot = wotbInstance.memCopy();
-						for (const member2 of membersList)
-						{
-							if (member.wotb_id != member2.wotb_id)
-							{
-								let paths = tmpWot.getPaths(member.wotb_id, member2.wotb_id, conf.stepMax);
-								if (paths.length > 0)
-								{
-									let shortestPathLength = paths[paths.length-1].length;
-									meanShortestsPathLength += shortestPathLength;
-									nbShortestsPath++;
-									let indexMembersPresent = new Array();
-									/*for (const path of paths)
-									{
-										if (path.length < shortestPathLength) { shortestPathLength = path.length; }
-									}*/
-									for (const path of paths)
-									{
-										//if (path[0] == 0 && path.length == shortestPathLength) { test += "\n"+'0-->'; }
-										for (let i=0;i<path.length;i++)
-										{
-											if (path.length == shortestPathLength && i>0 && i<(path.length-1))
-											{
-												//if (path[0] == 0) { test += path[i]+'-->'; }
-												indexMembersPresent[path[i]] = path[i];
-											}
-										}
-										//if (path[0] == 0 && path.length == shortestPathLength) { test += ''+path[path.length-1]; }
-									}
-									for (const indexMember of indexMembersPresent)
-									{
-										membersCentrality[indexMember]++;
-									}
-								}
-							}
-						}
-						tmpWot.clear();
-					//}
-				}
-			}
-		} // END if (reinitCache)
-        
-    // Calculer le timestamp limite à prendre en compte
-    let limitTimestamp = currentBlockchainTimestamp + (days*86400);
-        
-    // trier les membres par ordre croissant/decroissant du critère sort_by
-    if (sort_by == "idtyWritten")
-    { 
-      for (const memberIdentity of membersIdentity)
-      { tabSort.push(memberIdentity.writtenTimestamp); }
-    }
-    else if (sort_by == "expireMembership")
-    {
-      for (const membershipExpireTimeList of membershipsExpireTimeList)
-      { tabSort.push(membershipExpireTimeList); }
-    }
-    else if (sort_by == "lastRenewal")
-    { 
-      for (const membershipTimeList of membershipsTimeList)
-      { tabSort.push(membershipTimeList[0].medianTime); }
-    }
-    else if (sort_by == "oldestSig" || sort_by == "lastSig")
-    { 
-      for (const memberCertifsList of membersFirstCertifExpire)
-      { tabSort.push(memberCertifsList); }
-		}
-		else if (sort_by == "centrality")
-		{ 
-			for (const member of membersList)
-			{
-				if (membersCentrality[member.wotb_id] > 0)
-				{
-				  tabSort.push(membersCentrality[member.wotb_id]);
-				}
-				else
-				{
-					tabSort.push(1);
-				}
-			}
-		}
-		else if (sort_by == "quality")
-		{ 
-			for (const member of membersList)
-			{
-				tabSort.push(membersQuality(member.wotb_id));
-			}
-		}
-    else if (sort_by == "sigCount")
-    { 
-      for (const memberCertifsList of membersCertifsList)
-      {
-		if (memberCertifsList.length > 0)
-		{
-			tabSort.push(memberCertifsList.length+1);
-		}
-		else
-		{
-			tabSort.push(1);
-		}
-      }
-    }
-    else { res.status(500).send(`<pre><p>ERREUR : param <i>sort_by</i> invalid !</p></pre>`) } //
-    
-    for (var i=0;i<membersList.length;i++)
-    {
-      var maxTime = 0;
-      if (order == 'asc') { maxTime = currentBlockchainTimestamp + (conf.msValidity*2); } // maxTime = +infiny;
-      var idMaxTime =0;
-      for (var j=0;j<membersList.length;j++) {
-        if ( (order == 'desc' && tabSort[j] > maxTime)
-          || (order == 'asc' && tabSort[j] > 0 && tabSort[j] < maxTime) )
-        {
-          maxTime = tabSort[j];
-          idMaxTime = j;
-        }
-      }
-      
-      // Push max value on sort table, only if respect days limit
-      if (limitTimestamp > membershipsExpireTimeList[idMaxTime])
-      {
-        // Push max value on sort table
-        membersListOrdered.push({
-					wotb_id: membersList[idMaxTime].wotb_id,
-          uid: membersList[idMaxTime].uid,
-          pub: membersList[idMaxTime].pub,
-          idtyWrittenTimestamp: membersIdentity[idMaxTime].writtenTimestamp,
-          idtyWrittenBloc: membersIdentity[idMaxTime].writtenBloc,
-          lastRenewalTimestamp: membershipsTimeList[idMaxTime][0].medianTime,
-          lastRenewalWrittenBloc: membershipsBlockNumberList[idMaxTime],
-          expireMembershipTimestamp: membershipsExpireTimeList[idMaxTime],
-          certifications: membersCertifsList[idMaxTime],
-          pendingCertifications: membersPendingCertifsList[idMaxTime],
-					detailedDistance: membersIdentity[idMaxTime].detailedDistance,
-					percentSentriesReached: parseFloat(((membersIdentity[idMaxTime].detailedDistance.nbSuccess/membersIdentity[idMaxTime].detailedDistance.nbSentries)*100).toFixed(2)),
-					isSentry: membersIdentity[idMaxTime].isSentry
-        });
-        
-        membersCertifsListSorted.push({
-					issuer: membersCertifsList[idMaxTime].issuer,
-					receiver: membersCertifsList[idMaxTime].receiver,
-					writtenBloc: membersCertifsList[idMaxTime].writtenBloc,
-					timestampExpire: membersCertifsList[idMaxTime].timestampExpire
-        });
-      }
-      // Exclure la valeur max avant de poursuivre le tri
-      tabSort[idMaxTime] = -1;
-    }
-    
-    if (reinitCache)
-		{
-			//Calculate proportionMembersWithQualityUpper1 and proportionMembersWithQualityUpper1IfNoSentries
-			proportionMembersWithQualityUpper1 /= membersList.length;
-			proportionMembersWithQualityUpper1IfNoSentries /= membersList.length;
-			
-			// recalculate meanCentrality and meanShortestsPathLength
-			if (centrality=='yes')
-			{
-				for (const member of membersList)
-				{
-					meanCentrality += membersCentrality[member.wotb_id];
-				}
-				meanCentrality /= membersList.length;
-				meanShortestsPathLength /= nbShortestsPath;
-			}
-
-			// Dévérouiller le cache members
-			lockMembers = false;
-		}
-    
-    // Si le client demande la réponse au format JSON =, le faire
-    if (format == 'JSON')
-    {
-      // Send JSON reponse
-      res.status(200).jsonp( membersListOrdered )
-    }
-    // Sinon, printer le tableau html
-    else
-    {
-	  let meansMembersQuality = membersQuality(-1, -1);
-
-      res.locals = {
-				host: req.headers.host.toString(),
-				// get parameters
-        		days, mode, sort_by, order,
-				pendingSigs, centrality, nextYn,
-				
-				// page data
-        		currentBlockchainTimestamp,
-				limitTimestamp, nbMaxCertifs,
-				membersListFiltered: membersListOrdered.filter( member=> 
-					member.expireMembershipTimestamp < limitTimestamp 
-					&& member.expireMembershipTimestamp > currentBlockchainTimestamp
-				),
-				countSentries,
-				// currency parameters
-				xpercent: conf.xpercent,
-				sigWindow: conf.sigWindow,
-				idtyWindow: conf.idtyWindow,
-				msValidity: conf.msValidity,
-				sigValidity: conf.sigValidity,
-				stepMax: conf.stepMax,
-				
-				// members cache data
-				membersLastUptime,
-				membersQuality,
-				proportionMembersWithQualityUpper1,
-				proportionMembersWithQualityUpper1IfNoSentries,
-				meansMembersQuality,
-				
-				// centrality cache data
-				lockCentralityCalc,
-				membersLastCentralityCalcTime,
-				membersCentrality,
-				meanCentrality,
-				meanShortestsPathLength,
-				nbShortestsPath,
-        
-        // Template helpers
-        timestampToDatetime,
-				// Calculer la proportion de temps restant avant l'expiration
-				color: function( timestamp, idtyWindow, max )
-				{
-					let proportion = ((timestamp-currentBlockchainTimestamp)*max)/idtyWindow;
-					proportion = proportion < 0 ? 0 : proportion > max ? max : proportion 
-					let hex = parseInt( proportion ).toString(16)
-					return `#${hex}${hex}${hex}`
-				},
-        /**
-         * background: hsl( ${proportion(item.time,period,1,120)}, 100%, 50%, 1 )
-         * background: hsl( 0, 0%, ${proportion(item.time,period,0,200)}, 1 )
-         * background: #${proportion()}${proportion()}${proportion()}
-         */
-        proportion: function( timestamp, maxRange, min, max )
-        {
-          let proportion = ( (timestamp-currentBlockchainTimestamp) * max ) / maxRange
-          proportion = proportion < 0 ? 0 : proportion > max ? max : proportion 
-          return proportion
-        }
-        // color2: function( timestamp, maxRange, max )
-        // {
-        //   // Calculer la proportion de membership restant (en pour 255ème)
-        //   let proportion = ((timestamp-currentBlockchainTimestamp)*max)/maxRange;
-        //   proportion = proportion < 0 ? 0 : proportion > max ? max : proportion 
-          
-        //   // Calculer la couleur à attribuer à cette ligne (dégradé du vert au rouge)
-        //   let color="";
-        //   let tmpRed = 255-(membershipProportion);
-        //   if ( tmpRed < 16 ) { color = "0"; }
-        //   color += parseInt(tmpRed).toString(16);
-        //   let tmpGreen = (membershipProportion);
-        //   if ( tmpGreen < 16 ) { color += "0"; }
-        //   color += parseInt(tmpGreen).toString(16);
-        //   color += "00";
-          
-        // }
-      }
-      next()
-    }
-  } catch (e) {
-    // En cas d'exception, afficher le message
-    res.status(500).send(`<pre>${e.stack || e.message}</pre>`)
-  }
-  
-})
\ No newline at end of file
diff --git a/routes/membersCount.js b/routes/membersCount.js
deleted file mode 100755
index b69854554865f7fc7251cbb946ae80d006e163ef..0000000000000000000000000000000000000000
--- a/routes/membersCount.js
+++ /dev/null
@@ -1,243 +0,0 @@
-"use strict";
-
-const co = require('co')
-const timestampToDatetime = require(__dirname + '/../lib/timestampToDatetime')
-const getLang = require(__dirname + '/../lib/getLang')
-//const constants = require(__dirname + '/../lib/constants.js')
-
-//const STEP_COUNT_MAX = 150;
-
-module.exports = (req, res, next) => co(function *() {
-  
-  var { duniterServer, cache } = req.app.locals
-  
-  try {
-    // get GET parameters
-    var format = req.query.format || 'HTML';
-		var pow = req.query.pow || 'no';
-    
-    // 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');
-
-    
-    // Get blockchain timestamp
-    const currentBlockNumber = cache.beginBlock[0].number+blockchain.length-1;
-    const currentBlockchainTimestamp = blockchain[blockchain.length-1].medianTime;
-    
-    // Traiter le cas stepUnit == "blocks"
-    if (cache.stepUnit == "blocks")
-    {
-      if ( Math.ceil((cache.endBlock[0].number-cache.beginBlock[0].number)/cache.step) > constants.STEP_COUNT_MAX  ) { cache.step = Math.ceil((cache.endBlock[0].number-cache.beginBlock[0].number)/constants.STEP_COUNT_MAX); }
-    }
-    
-    // Initialize nextStepTime, stepIssuerCount and bStep
-    var nextStepTime = cache.beginBlock[0].medianTime;
-    let stepIssuerCount = 0;
-		let stepPowMin = 0;
-    let bStep = 0;
-    
-    // Adapt nextStepTime initial value
-    switch (cache.stepUnit)
-    {
-			case "hours": nextStepTime -= (cache.beginBlock[0].medianTime % 3600); break;
-			case "days":case "weeks":case "months":case "years": nextStepTime -= (cache.beginBlock[0].medianTime % 86400); break;
-			default: break;
-		}
-
-		// Calculate initial cacheIndex value
-		let cacheIndex = 0;
-		while (cache.blockchain[cacheIndex].number <= cache.beginBlock[0].number && (cache.blockchain.length-1) > cacheIndex) { cacheIndex++; }
-		console.log("cache.blockchain[cacheIndex].number = %s", cache.blockchain[cacheIndex].number); // DEBUG
-
-    // fill tabMembersCount
-    var tabMembersCount = [];
-    for (let b=cache.beginBlock[0].number;b<blockchain.length;b++)
-    {
-      stepIssuerCount += blockchain[b].issuersCount;
-			stepPowMin += blockchain[b].powMin;
-			bStep++;
-      
-      // If achieve next step
-		if ( b==cache.beginBlock[0].number || (cache.stepUnit == "blocks" && bStep == cache.step) || (cache.stepUnit != "blocks" && blockchain[b].medianTime >= nextStepTime/*(tabMembersCount[tabMembersCount.length-1].timestamp+cache.stepTime)*/))
-      {
-				let blockIndex = b;//-cache.beginBlock[0].number;//b-blockchain[0].number;
-
-				// Calculate if increment cacheIndex
-				while ((cache.blockchain.length-1) > cacheIndex && cache.blockchain[cacheIndex].number <= b) { cacheIndex++; }
-
-				let previousDateTime = "";
-				if(tabMembersCount.length > 0)
-				{
-					previousDateTime = timestampToDatetime(tabMembersCount[tabMembersCount.length-1].timestamp, cache.onlyDate);
-				}
-				else
-				{
-					previousDateTime = timestampToDatetime(cache.beginBlock[0].medianTime);
-				}
-				let dateTime = "";
-				if (cache.stepUnit != "blocks")
-				{
-					if (cache.step > 1)
-					{
-						switch (cache.stepUnit)
-						{
-							case "hours": dateTime = previousDateTime+" - "+timestampToDatetime(blockchain[blockIndex].medianTime, cache.onlyDate); break;
-							case "days": dateTime = previousDateTime+" - "+timestampToDatetime(blockchain[blockIndex].medianTime-(cache.stepTime/cache.step), cache.onlyDate); break;
-							case "weeks": dateTime = previousDateTime+" - "+timestampToDatetime(blockchain[blockIndex].medianTime, cache.onlyDate); break;
-							case "months": dateTime = previousDateTime+" - "+timestampToDatetime(blockchain[blockIndex].medianTime, cache.onlyDate); break;
-							case "years": dateTime = previousDateTime+" - "+timestampToDatetime(blockchain[blockIndex].medianTime, cache.onlyDate); break;
-						}
-					}
-					else
-					{
-						dateTime = previousDateTime; 
-					}
-				}
-				
-				// push tabMembersCount
-				tabMembersCount.push({
-						blockNumber: blockchain[blockIndex].number,
-						timestamp: blockchain[blockIndex].medianTime,
-						dateTime: dateTime,
-						membersCount: blockchain[blockIndex].membersCount,
-						sentriesCount: cache.blockchain[cacheIndex].sentries,
-						issuersCount: parseInt(stepIssuerCount/bStep),
-						powMin: parseInt(stepPowMin/bStep)
-				});
-					
-				if (cache.stepUnit != "blocks") { nextStepTime += cache.stepTime; }
-				stepIssuerCount = 0;
-				stepPowMin = 0;
-				bStep = 0;
-      }
-    }
-    
-    // Add current block data (only if end parameter is undefined or negative)
-    if (typeof(req.query.end) == 'undefined' || req.query.end <= 0)
-		{
-			tabMembersCount.push({
-				blockNumber: blockchain[blockchain.length-1].number,
-				timestamp: blockchain[blockchain.length-1].medianTime,
-				dateTime: LANG['LAST_BLOCK'],
-				membersCount: blockchain[blockchain.length-1].membersCount,
-				sentriesCount: cache.blockchain[cache.blockchain.length-1].sentries,
-				issuersCount: blockchain[blockchain.length-1].issuersCount,
-				powMin: blockchain[blockchain.length-1].powMin
-			});
-		}
-		
-		// Delete first tabMembersCount cell
-		tabMembersCount.splice(0, 1);
-    
-    if (format == 'JSON')
-      res.status(200).jsonp( tabMembersCount )
-    else
-    {
-      // GET parameters
-      var unit = req.query.unit == 'relative' ? 'relative' : 'quantitative';
-      var massByMembers = req.query.massByMembers == 'no' ? 'no' : 'yes';
-			
-			// Define datasets
-			let datasets = [{
-				label: `${LANG["MEMBERS_COUNT"]}`,
-				data: tabMembersCount.map(item=>item.membersCount),
-				fill: false,
-				backgroundColor: 'rgba(0, 0, 255, 0.5)',
-				borderColor: 'rgba(0, 0, 255, 1)',
-				borderWidth: 1
-			},
-			{
-				label: `${LANG["SENTRIES_COUNT"]}`,
-				data: tabMembersCount.map(item=>item.sentriesCount),
-				fill: false,
-				backgroundColor: 'rgba(0, 255, 0, 0.5)',
-				borderColor: 'rgba(0, 255, 0, 1)',
-				borderWidth: 1
-			},
-			{
-				label: `${LANG["ISSUERS_COUNT"]}`,
-				data: tabMembersCount.map(item=>item.issuersCount),
-				fill: false,
-				backgroundColor: 'rgba(255, 0, 0, 0.5)',
-				borderColor: 'rgba(255, 0, 0, 1)',
-				borderWidth: 1
-			}];
-			
-			if (pow == 'yes')
-			{
-				datasets.push({
-					label: `${LANG["POW_MIN"]}`,
-					data: tabMembersCount.map(item=>item.powMin),
-					fill: false,
-					backgroundColor: 'rgba(0, 0, 0, 0.5)',
-					borderColor: 'rgba(0, 0, 0, 1)',
-					borderWidth: 1
-				});
-			}
-      
-      res.locals = {
-	host: req.headers.host.toString(),
-        tabMembersCount,
-        begin: cache.beginBlock[0].number,
-        end: cache.endBlock[0].number,
-        form: `${LANG["BEGIN"]} #<input type="number" name="begin" value="${cache.beginBlock[0].number}" min="0" size="7" style="width:60px;"> - ${LANG["END"]} #<input type="number" name="end" value="${cache.endBlock[0].number}" size="7" style="width:60px;"> - 		${LANG["STEP"]} <input type="number" name="step" value="${cache.step}" min="1" size="4" style="width:50px;">
-					<select name="stepUnit">
-						<option name="stepUnit" value ="blocks" ${cache.stepUnit == 'blocks' ? 'selected' : ''}>${LANG["BLOCKS"]}
-						<option name="stepUnit" value ="hours" ${cache.stepUnit == 'hours' ? 'selected' : ''}>${LANG["HOURS"]}
-						<option name="stepUnit" value ="days" ${cache.stepUnit == 'days' ? 'selected' : ''}>${LANG["DAYS"]}
-						<option name="stepUnit" value ="weeks" ${cache.stepUnit == 'weeks' ? 'selected' : ''}>${LANG["WEEKS"]}
-						<option name="stepUnit" value ="months" ${cache.stepUnit == 'months' ? 'selected' : ''}>${LANG["MONTHS"]}
-						<option name="stepUnit" value ="years" ${cache.stepUnit == 'years' ? 'selected' : ''}>${LANG["YEARS"]}
-					</select> - ${LANG["MAX"]} <input type="number" name="nbMaxPoints" value="${cache.nbMaxPoints}" min="1" size="4" style="width:50px;"> ${LANG["POINTS"]} (${LANG["REGULATE_BY_ADAPTING"]} 
-					<select name="adaptMaxPoints">
-						<option name="adaptMaxPoints" value ="begin"> ${LANG["BEGIN"]}
-						<option name="adaptMaxPoints" value ="step" ${cache.adaptMaxPoints == 'step' ? 'selected' : ''}> ${LANG["STEP"]}
-						<option name="adaptMaxPoints" value ="end" ${cache.adaptMaxPoints == 'end' ? 'selected' : ''}> ${LANG["END"]}
-					</select>)`,
-				description: `${LANG["DESCRIPTION1"]+'<br>'+LANG["DESCRIPTION2"]+'<b>'+cache.Yn+'</b>.'}`,
-				form2: `
-					<input type="checkbox" name="pow" value="yes" ${pow == 'yes' ? 'checked' : ''}> ${LANG["SHOW_POW_MIN"]}`,
-        chart: {
-          type: 'line',
-          data: {
-						labels: (cache.stepUnit == "blocks") ? tabMembersCount.map(item=>item.blockNumber):tabMembersCount.map(item=>item.dateTime),
-						datasets: datasets,
-          },
-          options: {
-            // plugins: {
-            //   afterDraw: function (chart, easing) {
-            //     var self = chart.config;    /* Configuration object containing type, data, options */
-            //     var ctx = chart.chart.ctx;  /* Canvas context used to draw with */
-            //   }
-            // },
-            title: {
-              display: true,
-              text: `${LANG['CHART_TITLE']+' #'+cache.beginBlock[0].number+'-#'+cache.endBlock[0].number}`
-            },
-            legend: {
-              display: true
-            },
-            // scales: {
-            //   yAxes: [{
-            //     ticks: {
-            //         beginAtZero:true
-            //     }
-            //   }]
-            // }
-          }
-        }
-      }
-      next()
-    }
-    
-  } catch (e) {
-    // En cas d'exception, afficher le message
-    res.status(500).send(`<pre>${e.stack || e.message}</pre>`);
-  }
-})
\ No newline at end of file
diff --git a/routes/monetaryMass.js b/routes/monetaryMass.js
index 90da810fd6bf08bc818b178e41eb79ed2f8e63ed..341c3d0bdf9b96def8a24aee3e69981d24633d9d 100755
--- a/routes/monetaryMass.js
+++ b/routes/monetaryMass.js
@@ -29,8 +29,8 @@ module.exports = (req, res, next) => co(function *() {
       endBlock = yield duniterServer.dal.peerDAL.query('SELECT `medianTime`,`membersCount` FROM block WHERE `number` = '+end+' LIMIT 1');
       if ( typeof(endBlock[0]) == 'undefined')
       {
-	endBlock = yield duniterServer.dal.peerDAL.query('SELECT `medianTime`,`membersCount`,`number` FROM block ORDER BY `medianTime` DESC LIMIT 1');
-	end = endBlock[0].number;
+        endBlock = yield duniterServer.dal.peerDAL.query('SELECT `medianTime`,`membersCount`,`number` FROM block ORDER BY `medianTime` DESC LIMIT 1');
+        end = endBlock[0].number;
       }
     }
     else
@@ -105,21 +105,6 @@ module.exports = (req, res, next) => co(function *() {
       var type = req.query.type || 'logarithmic';
       if (unit == "percentOfFullCurrency") { type = 'linear'; }
       if (type != 'linear') { type = 'logarithmic'; }
-    
-      // Define full currency description
-      var fullCurrency = LANG['DESC1']+" <b>"+meanMonetaryMassAtFullCurrency
-	  +" "+LANG['UD']+"</b> ("+LANG['FULL_CURRENCY_FORMULA']+" = <b>"+meanMonetaryMassAtFullCurrency+" "+LANG['UD']+"</b>)<br>"
-	  +LANG['CURRENTLY']+", 1 "+LANG['UD']+"<sub>"+duniterServer.conf.currency+"</sub> = <b>"+(currentDividend/100)+"</b> "+duniterServer.conf.currency+" "+LANG['AND_WE_HAVE']+" <b>"
-	  +endBlock[0].membersCount+"</b> "+LANG['DESC2']+" <b>"
-	  +(meanMonetaryMassAtFullCurrency*currentDividend*endBlock[0].membersCount/100)+"</b> "+duniterServer.conf.currency
-	  +" (<b>"+(meanMonetaryMassAtFullCurrency*currentDividend/100)+"</b> "+duniterServer.conf.currency+"/"+LANG['MEMBER']+")." ;
-	  
-      // Define max yAxes
-      var maxYAxes = meanMonetaryMassAtFullCurrency;
-      let indexEnd = tabCurrency.length-1;
-      if (unit == "quantitative") { maxYAxes = maxYAxes*currentDividend/100; }
-      if (unit == "percentOfFullCurrency") { maxYAxes = 100; }
-      else if (massByMembers == "no") { maxYAxes = maxYAxes*endBlock[0].membersCount; }
       
       res.locals = {
 	      host: req.headers.host.toString(),
@@ -141,14 +126,13 @@ module.exports = (req, res, next) => co(function *() {
             <option name="type" value ="logarithmic">${LANG['LOGARITHMIC']}
             <option name="type" value ="linear" ${type == 'linear' ? 'selected' : ''}>${LANG['LINEAR']}
           </select>`,
-	      description: `${fullCurrency}`,
+	      description: ``,
         chart: {
           type: 'bar',
           data: {
             labels: tabCurrency.map( item=> item.dateTime ),
             //yLabels: tabCurrency.map( item=> item.monetaryMass, item=>derivedChoiceMonetaryMass),
             datasets: [{
-              //yAxisID: 1,
               label: `${unit == "percentOfFullCurrency" ? `${LANG['MONETARY_MASS']} (${LANG['IN_PERCENT_OF_FULL_CURRENCY']})`:`#${unit == "relative" ? LANG['UD']+"ğ1" : 'Ğ1'}${massByMembers == "yes" ? '/'+LANG['MEMBER'] : ''}`}`,
               data: tabCurrency.map( item=>
                     massByMembers == "no" 
@@ -157,16 +141,6 @@ module.exports = (req, res, next) => co(function *() {
               backgroundColor: 'rgba(54, 162, 235, 0.5)',
               borderColor: 'rgba(54, 162, 235, 1)',
               borderWidth: 1
-            },
-            {
-              //yAxisID: 2,
-              label: LANG['PERCENT_VARIATION_MONETARY_MASS'],
-              data: tabCurrency.map( item=> item.derivedChoiceMonetaryMass),
-              backgroundColor: 'rgba(0, 162, 0, 0.5)',
-              borderColor: 'rgba(0, 162, 0, 1)',
-              borderWidth: 1,
-              type: 'line',
-              fill: false
             }]
           },
           options: {
@@ -185,26 +159,14 @@ module.exports = (req, res, next) => co(function *() {
             },
             scales: {
               yAxes: [{
-                //yAxisID: 1,
 		            type: type,
                 position: 'left',
-                ticks: {
-                    callback: function(value, index, values) {//needed to change the scientific notation results from using logarithmic scale
-                            return Number(value.toString()); //pass tick values as a string into Number function
-                    },
-                    max: maxYAxes,
-                }
-              }/*,
-              {
-                //yAxisID: 2,
-		            type: type,
-                position: 'right',
                 ticks: {
                     callback: function(value, index, values) {//needed to change the scientific notation results from using logarithmic scale
                             return Number(value.toString()); //pass tick values as a string into Number function
                     }
                 }
-              }*/]
+              }]
             }
           }
         }
diff --git a/routes/tools/membersQuality.js b/routes/tools/membersQuality.js
deleted file mode 100644
index 93bd336638451ad22f6f3993b6d3c37906254c3b..0000000000000000000000000000000000000000
--- a/routes/tools/membersQuality.js
+++ /dev/null
@@ -1,116 +0,0 @@
-
-
-// membersQuality cache
-var lastUpgradeTime = 0;
-var wot = null;
-var membersCount = 0;
-var sentriesCount = 0;
-var conf = {
-	dSen : 0,
-	stepMax: 0,
-	xprecent: 1.0
-};
-var tabMembersQuality = [];
-var tabMembersQualityIfNoSentries = [];
-var tabMembersQualityDetailedDistance = [];
-var meansCalculate = false;
-var means = {
-	meanSentriesReachedBySentries: 0,
-	meanMembersReachedBySentries: 0,
-	meanSentriesReachedByMembers: 0,
-	meanMembersReachedByMembers: 0
-};
-
-module.exports = function membersQuality(wotb_id, dSen = 0, stepMax = 0, xpercent = 0, wotCopy = null) {
-
-  	if (wotb_id >= 0)
-  	{
-		if (typeof(tabMembersQuality[wotb_id])=='undefined')
-		{
-			// Si le wotb_id n'existe pas, renvoyer -1
-			if (wotb_id > membersCount)
-			{
-				return -1;
-			}
-
-			// Récupérer les informations détaillés de distance pour une nouvelle identité qui ne serait certifiée que par le membre courant (ce qui équivaut à récupérer les informations de distance pour le membre courant en décrémentant stepMax de 1)
-			let detailedDistance = wot.detailedDistance(wotb_id, conf.dSen, conf.stepMax-1, conf.xpercent);
-
-			// Calculer la qualité du membre
-			tabMembersQuality[wotb_id] = parseFloat(((detailedDistance.nbSuccess/detailedDistance.nbSentries)/conf.xpercent).toFixed(2));
-			tabMembersQualityIfNoSentries[wotb_id] = parseFloat(((detailedDistance.nbReached/membersCount)/conf.xpercent).toFixed(2));
-
-			if (dSen > 0)
-			{
-				means.meanSentriesReachedBySentries += parseFloat(((detailedDistance.nbSuccess/detailedDistance.nbSentries)*100).toFixed(2));
-				means.meanMembersReachedBySentries += parseFloat(((detailedDistance.nbReached/membersCount)*100).toFixed(2));
-			}
-			means.meanSentriesReachedByMembers += parseFloat(((detailedDistance.nbSuccess/detailedDistance.nbSentries)*100).toFixed(2));
-			means.meanMembersReachedByMembers += parseFloat(((detailedDistance.nbReached/membersCount)*100).toFixed(2));
-		}
-		if (dSen < 0)
-		{
-			return tabMembersQualityIfNoSentries[wotb_id];
-		}
-		else
-		{
-			return tabMembersQuality[wotb_id];
-		}
-	}
-	else if (dSen < 0)
-	{
-		if (!meansCalculate)
-		{
-			// Calculate mean Members/Sentries ReachedBy Members/Sentries
-			if (sentriesCount > 0)
-			{
-				means.meanSentriesReachedBySentries = parseFloat((means.meanSentriesReachedBySentries/sentriesCount).toFixed(2));
-				means.meanMembersReachedBySentries = parseFloat((means.meanMembersReachedBySentries/sentriesCount).toFixed(2));
-			}
-			if (membersCount > 0)
-			{
-				means.meanSentriesReachedByMembers = parseFloat((means.meanSentriesReachedByMembers/membersCount).toFixed(2));
-				means.meanMembersReachedByMembers = parseFloat((means.meanMembersReachedByMembers/membersCount).toFixed(2));
-			}
-			meansCalculate = true;
-		}
-
-		return means;
-	}
-	else if (wotb_id == -1)
-  	{
-		if (wotCopy != null)
-		{
-			lastUpgradeTime = Math.floor(Date.now() / 1000);
-			if (wot != null)
-			{
-				wot.clear();
-			}
-			wot = wotCopy;
-			membersCount = wot.getWoTSize()-wot.getDisabled().length;
-			sentriesCount = wot.getSentries(dSen).length;
-			conf.dSen = dSen;
-			conf.stepMax = stepMax;
-			conf.xpercent = xpercent;
-
-			tabMembersQuality = [];
-			tabMembersQualityIfNoSentries = [];
-
-			meansCalculate = false;
-			means.meanSentriesReachedBySentries = 0;
-			means.meanMembersReachedBySentries = 0;
-			means.meanSentriesReachedByMembers = 0;
-			means.meanMembersReachedByMembers = 0;
-		}
-
-		return lastUpgradeTime;
-	}
-	else if (wotb_id == -2)
-  	{
-	  return sentriesCount;
-	}
-	else if (wotb_id == -3)
-  	{
-	  return conf.dSen;
-	}
-}
diff --git a/routes/willMembers.js b/routes/willMembers.js
deleted file mode 100755
index bc41e5382eb6d720b44c9f3c6fb6e2a25ba07139..0000000000000000000000000000000000000000
--- a/routes/willMembers.js
+++ /dev/null
@@ -1,528 +0,0 @@
-"use strict";
-
-const co = require('co')
-const crypto = require('crypto')
-
-const constants = require(__dirname + '/../lib/constants')
-
-const timestampToDatetime = require(__dirname + '/../lib/timestampToDatetime')
-
-// Préserver les résultats en cache
-var lockWillMembers = false;
-var willMembersLastUptime = 0;
-var identitiesList = [];
-var idtysPendingCertifsList = [];
-var nbMaxCertifs = 0;
-var countMembersWithSigQtyValidCert = 0;
-var sentries = [];
-var sentriesIndex = [];
-var wotbIdIndex = [];
-var meanSentriesReachedByIdtyPerCert = [];
-var meanMembersReachedByIdtyPerCert = [];
-var countIdtiesPerReceiveCert = [];
-var membersQualityExt = [];
-
-module.exports = (req, res, next) => co(function *() {
-  
-  var { duniterServer } = req.app.locals
-  
-  try {
-    // get blockchain timestamp
-    let resultQueryCurrentBlock = yield duniterServer.dal.peerDAL.query('SELECT `medianTime`,`number`,`hash`,`membersCount` FROM block ORDER BY `medianTime` DESC LIMIT 1 ');
-    const currentBlockchainTimestamp = resultQueryCurrentBlock[0].medianTime;
-    const currentMembersCount = resultQueryCurrentBlock[0].membersCount;
-    const currentBlockNumber = resultQueryCurrentBlock[0].number;
-    const currentBlockHash = resultQueryCurrentBlock[0].hash;
-
-    // Initaliser les constantes
-    const conf = duniterServer.conf;
-    const dSen = Math.ceil(Math.pow(currentMembersCount, 1 / conf.stepMax));
-    
-    // Initaliser les variables
-    let errors = "";
-    let idtysListOrdered  = [];
-    let sumPercentSentriesReached = 0;
-    let sumPercentMembersReached = 0;
-    
-    // Récupérer les paramètres
-    let days = req.query.d || 65 // Valeur par défaut
-    let order = req.query.d && req.query.order || 'desc' // Valeur par défaut
-    let sort_by = req.query.sort_by || "registrationPackage"; // Valeur par défaut
-    let showIdtyWithZeroCert = req.query.showIdtyWithZeroCert || "no"; // Valeur par défaut
-    let sortSig = req.query.sortSig || "Availability"; // Valeur par défaut
-    let format = req.query.format || 'HTML';
-    
-    // Calculer le timestamp limite à prendre en compte
-    let limitTimestamp = currentBlockchainTimestamp + (days*86400);
-    
-    // Alimenter wotb avec la toile de confiance 
-		const wotbInstance = duniterServer.dal.wotb;
-		
-		
-		// Vérifier si le cache doit être Réinitialiser
-		let reinitCache = (Math.floor(Date.now() / 1000) > (willMembersLastUptime + constants.MIN_WILLMEMBERS_UPDATE_FREQ));
-		
-		// Si le cache willMembers est dévérouillé, le vérouiller, sinon ne pas réinitialiser le cache
-		if (reinitCache && !lockWillMembers)
-		{
-			lockWillMembers = true;
-		}
-		else if(lockWillMembers)
-		{
-			reinitCache = false;
-		}
-
-		if (reinitCache)
-    {
-      // Réinitialiser le cache
-      identitiesList = [];
-			idtysPendingCertifsList = [];
-      nbMaxCertifs = 0;
-      countMembersWithSigQtyValidCert = 0;
-      sentries = [];
-      sentriesIndex = [];
-      wotbIdIndex = [];
-			membersQualityExt = [];
-      willMembersLastUptime = Math.floor(Date.now() / 1000);
-      
-      // Récupérer la liste des membres référents
-      sentries = wotbInstance.getSentries(dSen);
-      
-      // Récupérer la liste des identités en piscine
-      const resultQueryIdtys = yield duniterServer.dal.peerDAL.query('SELECT `buid`,`pubkey`,`uid`,`hash`,`expires_on`,`revocation_sig` FROM identities_pending WHERE `member`=0');
-	
-      // Récupérer pour chaque identité, l'ensemble des certifications qu'elle à reçue.
-      for (let i=0;i<resultQueryIdtys.length;i++)
-      {
-				// Extraire le numéro de bloc d'émission de l'identité
-				let idtyBlockStamp = resultQueryIdtys[i].buid.split("-");
-				let idtyBlockNumber = idtyBlockStamp[0];
-	
-				// récupérer le medianTime et le hash du bloc d'émission de l'identité
-				let idtyEmittedBlock = yield duniterServer.dal.peerDAL.query('SELECT `medianTime`,`hash` FROM block WHERE `number`=\''+idtyBlockNumber+'\' AND fork=0 LIMIT 1');
-				
-				// Récupérer l'identifiant wotex de l'identité (en cas d'identité multiple)
-				let idties = yield duniterServer.dal.idtyDAL.query('' +
-					'SELECT hash, uid, pub, wotb_id FROM i_index WHERE uid = ? ' +
-					'UNION ALL ' + 'SELECT hash, uid, pubkey as pub, (SELECT NULL) AS wotb_id FROM idty WHERE uid = ?', [resultQueryIdtys[i].uid, resultQueryIdtys[i].uid]);
-				let wotexId = '';
-				if (idties.length > 1)
-				{
-					let pos = 0;
-					for (const idty of idties)
-					{
-						if (idty.hash == resultQueryIdtys[i].hash) { wotexId = '['+pos+']'; }
-						pos++;
-					}
-				}
-	
-				// vérifier la validité du blockstamp de l'identité
-				let validIdtyBlockStamp = false;
-				if (typeof(idtyEmittedBlock[0]) == 'undefined' || idtyEmittedBlock[0].hash == idtyBlockStamp[1])
-				{ validIdtyBlockStamp = true; }
-
-				// vérifier si l'identité a été révoquée ou non
-				let idtyRevoked = false;
-				if (resultQueryIdtys[i].revocation_sig != null)
-				{
-				  idtyRevoked = true;
-				}	
-
-				// Stocker les informations de l'identité
-				identitiesList.push({
-						BlockNumber: idtyBlockNumber,
-						creationTimestamp: (typeof(idtyEmittedBlock[0]) == 'undefined' ) ? currentBlockchainTimestamp:idtyEmittedBlock[0].medianTime,
-						pubkey: resultQueryIdtys[i].pubkey,
-						uid: resultQueryIdtys[i].uid,
-						hash: resultQueryIdtys[i].hash,
-						wotexId: wotexId,
-						expires_on: (resultQueryIdtys[i].expires_on=="") ? 0:resultQueryIdtys[i].expires_on,
-						nbCert: 0,
-						nbValidPendingCert: 0,
-						registrationAvailability: 0,
-						validBlockStamp: validIdtyBlockStamp,
-						idtyRevoked: idtyRevoked
-				});
-				idtysPendingCertifsList.push(new Array());
-	
-				// récupérer l'ensemble des certifications en attente destinées à l'identité courante
-				let tmpQueryPendingCertifsList = yield duniterServer.dal.peerDAL.query(
-					'SELECT `from`,`block_number`,`block_hash`,`expires_on` FROM certifications_pending WHERE `to`=\''+resultQueryIdtys[i].pubkey+'\' AND `target`=\''+resultQueryIdtys[i].hash+'\' ORDER BY `expires_on` DESC');
-
-				// Récupérer les uid des émetteurs des certifications reçus par l'utilisateur
-				// Et stocker les uid et dates d'expiration dans un tableau
-				for (let j=0;j<tmpQueryPendingCertifsList.length;j++)
-				{
-					// Récupérer le medianTime et le hash du bloc d'émission de la certification 
-					let emittedBlock = yield duniterServer.dal.peerDAL.query('SELECT `hash`,`medianTime` FROM block WHERE `number`=\''+tmpQueryPendingCertifsList[j].block_number+'\' AND `fork`=0 LIMIT 1');
-						
-						// Vérifier que l'émetteur de la certification correspond à une identité inscrite en blockchain
-						let tmpQueryGetUidIssuerPendingCert = yield duniterServer.dal.peerDAL.query('SELECT `uid` FROM i_index WHERE `pub`=\''+tmpQueryPendingCertifsList[j].from+'\' LIMIT 1');
-						if ( tmpQueryGetUidIssuerPendingCert.length > 0 )
-						{
-							// Récupérer la pubkey de l'émetteur
-							let issuerPubkey = tmpQueryPendingCertifsList[j].from;
-							
-							// Récupérer le wotb_id
-							let wotb_id = 0;
-							if (typeof(wotbIdIndex[issuerPubkey]) == 'undefined')
-							{
-								wotb_id = (yield duniterServer.dal.iindexDAL.query('SELECT wotb_id FROM i_index WHERE pub = ? AND wotb_id IS NOT NULL', [issuerPubkey]))[0].wotb_id;
-								wotbIdIndex[issuerPubkey] = wotb_id;
-							}
-							else { wotb_id = wotbIdIndex[issuerPubkey]; }
-							
-							// Vérifier si l'émetteur de la certification est référent
-							let issuerIsSentry = false;
-							if (typeof(sentriesIndex[issuerPubkey]) == 'undefined')
-							{
-								sentriesIndex[issuerPubkey] = false;
-								for (let s=0;s<sentries.length;s++)
-								{
-									if (sentries[s] == wotb_id)
-									{
-										issuerIsSentry=true;
-										sentriesIndex[issuerPubkey] = true;
-										sentries.splice(s, 1);
-									}
-								}
-							}
-							else { issuerIsSentry = sentriesIndex[issuerPubkey]; }
-
-							// Vérifier si le blockstamp est correct
-							var validBlockStamp = false;
-							if (typeof(emittedBlock[0]) != 'undefined' && emittedBlock[0].hash == tmpQueryPendingCertifsList[j].block_hash)
-							{ validBlockStamp = true; }
-							
-							// récupérer le timestamp d'enchainement de la dernière certification écrite par l'émetteur
-							let tmpQueryLastIssuerCert = yield duniterServer.dal.peerDAL.query('SELECT `chainable_on` FROM c_index WHERE `issuer`=\''+issuerPubkey+'\' ORDER BY `chainable_on` DESC LIMIT 1');
-							let certTimestampWritable = 0;
-							if ( typeof(tmpQueryLastIssuerCert[0]) != 'undefined' && typeof(tmpQueryLastIssuerCert[0].chainable_on) != 'undefined' )
-							{ certTimestampWritable = tmpQueryLastIssuerCert[0].chainable_on; }
-							//identitiesList[i].registrationAvailability = (certTimestampWritable > identitiesList[i].registrationAvailability) ? certTimestampWritable : identitiesList[i].registrationAvailability;
-							
-							// Vérifier que l'identité courant n'a pas déjà reçu d'autre(s) certification(s) de la part du même membre ET dans le même état de validité du blockstamp
-							let doubloonPendingCertif = false;
-							for (const pendingCert of idtysPendingCertifsList[i])
-							{
-								if (pendingCert.from == tmpQueryGetUidIssuerPendingCert[0].uid && pendingCert.validBlockStamp == validBlockStamp)
-								{
-									doubloonPendingCertif = true;
-								}
-							}
-							if (!doubloonPendingCertif)
-							{
-								// Stoker la liste des certifications en piscine qui n'ont pas encore expirées
-								if (tmpQueryPendingCertifsList[j].expires_on > currentBlockchainTimestamp)
-								{
-									idtysPendingCertifsList[i].push({
-										from: tmpQueryGetUidIssuerPendingCert[0].uid,
-										pubkey: issuerPubkey,
-										wotb_id: wotb_id,
-										issuerIsSentry: issuerIsSentry,
-										blockNumber: tmpQueryPendingCertifsList[j].block_number,
-										creationTimestamp: emittedBlock[0].medianTime,
-										timestampExpire: tmpQueryPendingCertifsList[j].expires_on,
-										timestampWritable: certTimestampWritable,
-										validBlockStamp: validBlockStamp
-									});
-									identitiesList[i].nbCert++;
-									if (validBlockStamp) { identitiesList[i].nbValidPendingCert++; }
-								}
-							}
-						}
-				}
-
-				// Calculer le nombre maximal de certifications reçues par l'identité courante
-				if ( identitiesList[i].nbCert > nbMaxCertifs) { nbMaxCertifs = identitiesList[i].nbCert; }
-	
-				// calculate countMembersWithSigQtyValidCert
-				if ( identitiesList[i].nbValidPendingCert >= conf.sigQty) { countMembersWithSigQtyValidCert++; }
-      }  // END IDENTITIES LOOP
-      
-      // Réinitialiser sumSentriesReachedByIdtyPerCert, sumMembersReachedByIdtyPerCert et countIdtiesPerReceiveCert
-      for (let i=0;i<=nbMaxCertifs;i++)
-      {
-				meanSentriesReachedByIdtyPerCert[i] = 0;
-				meanMembersReachedByIdtyPerCert[i] = 0;
-				countIdtiesPerReceiveCert[i] = 0;
-			}
-		} // END if (reinitCache)
-		
-      // Si demandé, retrier les, certifications par date de disponibilité
-      if (sortSig == "Availability")
-      {
-				var idtysPendingCertifsListSort = [ [] ];
-				for (var i=0;i<idtysPendingCertifsList.length;i++)
-				{
-					idtysPendingCertifsListSort[i] = Array();
-					let min;
-					let idMin =0;
-					let tmpExcluded = Array();
-					for (let j=0;j<idtysPendingCertifsList[i].length;j++) { tmpExcluded[j] = false; }
-					for (let j=0;j<idtysPendingCertifsList[i].length;j++)
-					{
-						min = currentBlockchainTimestamp+conf.sigValidity; // begin to min = max
-
-						// search idMin (id of certif with min timestampWritable)
-						for (let k=0;k<idtysPendingCertifsList[i].length;k++)
-						{
-							if (idtysPendingCertifsList[i][k].timestampWritable < min && !tmpExcluded[k])
-							{
-								min = idtysPendingCertifsList[i][k].timestampWritable;
-								idMin = k;
-							}
-						}
-
-						// Push min value on sort table
-						idtysPendingCertifsListSort[i].push({
-							from: idtysPendingCertifsList[i][idMin].from,
-							wotb_id: idtysPendingCertifsList[i][idMin].wotb_id,
-							issuerIsSentry: idtysPendingCertifsList[i][idMin].issuerIsSentry,
-							blockNumber: idtysPendingCertifsList[i][idMin].blockNumber,
-							creationTimestamp: idtysPendingCertifsList[i][idMin].creationTimestamp,
-							timestampExpire: idtysPendingCertifsList[i][idMin].timestampExpire,
-							timestampWritable: idtysPendingCertifsList[i][idMin].timestampWritable,
-							validBlockStamp: idtysPendingCertifsList[i][idMin].validBlockStamp
-						});
-						
-						// Calculer la date de disponibilité du dossier d'inscription de l'identité correspondante
-						// := date de disponibilité maximale parmi les sigQty certifications aux dates de disponibilités les plus faibles
-						if (j<conf.sigQty)
-						{
-							let timestampWritable = idtysPendingCertifsList[i][idMin].timestampWritable;
-							identitiesList[i].registrationAvailability = (timestampWritable > identitiesList[i].registrationAvailability) ? timestampWritable : identitiesList[i].registrationAvailability;
-						}
-
-						// Exclure la valeur min avant de poursuivre le tri
-						tmpExcluded[idMin] = true;
-					}
-					
-				}
-				idtysPendingCertifsList = idtysPendingCertifsListSort;
-      }
-      
-      // Récupérer la valeur du critère de tri pour chaque identité
-      var tabSort = [];
-      if (sort_by == "creationIdty")
-      {
-				for (const idty of identitiesList)
-				{
-					tabSort.push(idty.expires_on);
-				}
-      }
-      else if (sort_by == "sigCount" || sort_by == "registrationPackage")
-      {
-				for (const idty of identitiesList)
-				{
-					// Calculate registrationAvailabilityDelay
-					let registrationAvailabilityDelay = (idty.registrationAvailability > currentBlockchainTimestamp) ? (idty.registrationAvailability-currentBlockchainTimestamp):0;
-					
-					// Trier les identités par date de disponibilité de leur dossier d'inscription (le signe moins est nécessaire car plus un dossier est disponible tôt
-					//  plus la valeur de registrationAvailabilityDelay sera petite, hors le nombre obtenu est classé de façon décroissante)
-					// Attribuer un malus de 2*sigValidity secondes par certification valide (plafonner à sigQty dans le cas de 'registrationPackage') 
-					if (sort_by == "registrationPackage" && idty.nbValidPendingCert > conf.sigQty)
-					{
-						tabSort.push(-registrationAvailabilityDelay + (2*conf.sigValidity*conf.sigQty));
-					}
-					else
-					{
-						tabSort.push(-registrationAvailabilityDelay + (2*conf.sigValidity*idty.nbValidPendingCert));
-					}
-				}
-      }
-      else { errors += "<p>ERREUR : param <i>sort_by</i> invalid !</p>"; }
-
-      // Trier les identités par ordre decroissant du critère sort_by
-      for (var i=0;i<identitiesList.length;i++)
-      {
-				let max = -1;
-				let idMax =0;
-				for (var j=0;j<identitiesList.length;j++)
-				{
-					if (tabSort[j] > max)
-					{
-						max = tabSort[j];
-						idMax = j;
-					}
-				}
-				
-				// Push max value on sort table, only if respect days limit
-				if (limitTimestamp > identitiesList[idMax].expires_on)
-				{
-					// Vérifier que cette identité n'a pas déjà été prise en compte (empecher les doublons)
-					let doubloon = false;
-					for (const idty of idtysListOrdered)
-					{
-						if (identitiesList[idMax].uid == idty.uid && identitiesList[idMax].BlockNumber == idty.BlockNumber)
-						{
-							doubloon = true;
-						}
-					}
-					
-					// Push max value on sort table (and test distance rule)
-					if (!doubloon)
-					{
-						// Tester la présence de l'adhésion
-						let membership = null
-						const pendingMembershipsOfIdty = yield duniterServer.dal.msDAL.getPendingINOfTarget(identitiesList[idMax].hash);
-						for (const ms of pendingMembershipsOfIdty)
-						{
-							if (!membership && ms.expires_on > currentBlockchainTimestamp)
-							{
-								membership = ms
-							}
-						}
-						
-						// Créer une wot temporaire
-						let tmpWot = wotbInstance.memCopy();
-						
-						// Mesurer la qualité externe de chaque emetteur de chaque certification
-						for (const cert of idtysPendingCertifsList[idMax]) {
-							if (typeof (membersQualityExt[cert.from]) == 'undefined') {
-								let detailedDistanceQualityExt = tmpWot.detailedDistance(cert.wotb_id, dSen, conf.stepMax - 1, conf.xpercent);
-								membersQualityExt[cert.from] = ((detailedDistanceQualityExt.nbSuccess / detailedDistanceQualityExt.nbSentries) / conf.xpercent).toFixed(2);
-							}
-						}
-						
-						// Ajouter un noeud a la wot temporaire et lui donner toute les certifications valides reçues par l'indentité idMax
-						let pendingIdtyWID = tmpWot.addNode();
-						for (const cert of idtysPendingCertifsList[idMax])
-						{
-						  if (cert.validBlockStamp)
-						  {
-							  tmpWot.addLink(cert.wotb_id, pendingIdtyWID);
-							}
-						}
-						// Récupérer les données de distance du dossier d'adhésion de l'indentité idMax
-						let detailedDistance = tmpWot.detailedDistance(pendingIdtyWID, dSen, conf.stepMax, conf.xpercent);
-
-						// Nettoyer la wot temporaire
-						tmpWot.clear();
-						
-						// Calculer percentSentriesReached et percentMembersReached
-						let percentSentriesReached = parseFloat(((detailedDistance.nbSuccess/detailedDistance.nbSentries)*100).toFixed(2));
-						let percentMembersReached = parseFloat(((detailedDistance.nbReached/currentMembersCount)*100).toFixed(2));
-						
-						// Pousser l'identité dans le tableau idtysListOrdered
-						idtysListOrdered.push({
-							uid: identitiesList[idMax].uid,
-							wotexId: identitiesList[idMax].wotexId,
-							creationTimestamp: identitiesList[idMax].creationTimestamp,
-							pubkey: identitiesList[idMax].pubkey,
-							BlockNumber: identitiesList[idMax].BlockNumber,
-							expires_on: identitiesList[idMax].expires_on,
-							nbValidPendingCert: identitiesList[idMax].nbValidPendingCert,
-							detailedDistance: detailedDistance,
-							percentSentriesReached: percentSentriesReached,
-							percentMembersReached: percentMembersReached,
-							membership: membership,
-							pendingCertifications: idtysPendingCertifsList[idMax],
-							validBlockStamp: identitiesList[idMax].validBlockStamp,
-							idtyRevoked: identitiesList[idMax].idtyRevoked
-						});
-						
-						// Si le cache a été réinitialiser, recalculer les sommes meanSentriesReachedByIdtyPerCert et meanMembersReachedByIdtyPerCert
-						if (reinitCache && identitiesList[idMax].nbValidPendingCert > 0)
-						{
-						  let nbReceiveCert = identitiesList[idMax].nbValidPendingCert;
-							meanSentriesReachedByIdtyPerCert[nbReceiveCert-1] += percentSentriesReached;
-							meanMembersReachedByIdtyPerCert[nbReceiveCert-1] += percentMembersReached;
-							countIdtiesPerReceiveCert[nbReceiveCert-1] += 1;
-						}
-					} // END if (!doubloon)
-				}  // END days limit rule
-
-				// Exclure la valeur max avant de poursuivre le tri
-				tabSort[idMax] = -1;
-      }  // End sort identities loop
-      
-      // Si ordre croissant demandé, inverser le tableau
-      if (order == 'asc')
-      {
-				var idtysListOrdered2 = [ [] ];
-				let tmpIdtysListOrderedLength = idtysListOrdered.length;
-				for (let i=0;i<tmpIdtysListOrderedLength;i++)
-				{
-					idtysListOrdered2[i] = idtysListOrdered[tmpIdtysListOrderedLength-i-1];
-				}
-				idtysListOrdered = idtysListOrdered2;
-      }
-      
-	  if (reinitCache) {
-		  // Calculate meanSentriesReachedByIdtyPerCert and meanMembersReachedByIdtyPerCert
-		  for (let i = 0; i <= nbMaxCertifs; i++) {
-			  if (countIdtiesPerReceiveCert[i] > 0) {
-				  meanSentriesReachedByIdtyPerCert[i] = parseFloat((meanSentriesReachedByIdtyPerCert[i] / countIdtiesPerReceiveCert[i]).toFixed(2));
-				  meanMembersReachedByIdtyPerCert[i] = parseFloat((meanMembersReachedByIdtyPerCert[i] / countIdtiesPerReceiveCert[i]).toFixed(2));
-			  }
-			  else {
-				  meanSentriesReachedByIdtyPerCert[i] = 0.0;
-				  meanMembersReachedByIdtyPerCert[i] = 0.0;
-			  }
-		  }
-
-		  // Dévérouiller le cache willMembers
-		  lockWillMembers = false;
-	  }
-    
-    // Si le client demande la réponse au format JSON, le faire
-    if (format == 'JSON')
-    {
-      // Send JSON reponse
-      res.status(200).jsonp( idtysListOrdered )
-    }
-    // Sinon, printer le tableau html
-    else
-    {
-      res.locals = {
-        // Les varibles à passer au template
-				host: req.headers.host.toString(),
-				// get parameters
-        days, sort_by, order, sortSig,
-        showIdtyWithZeroCert,
-				// page data
-        currentBlockNumber,
-        currentBlockchainTimestamp,
-				currentMembersCount,
-        limitTimestamp,
-				nbMaxCertifs,
-				countMembersWithSigQtyValidCert,
-				idtysListFiltered: idtysListOrdered.filter( idty=> 
-				idty.expires_on < limitTimestamp
-				//&& idty.expires_on > currentBlockchainTimestamp
-				&& (showIdtyWithZeroCert == "yes" || idty.pendingCertifications.length > 0)
-				),
-				// currency parameters
-				dSen,
-        sigQty: conf.sigQty,
-        sigWindow: conf.sigWindow,
-        idtyWindow: conf.idtyWindow,
-        xpercent: conf.xpercent,
-				// willMembers cache data
-				meanSentriesReachedByIdtyPerCert,
-				meanMembersReachedByIdtyPerCert,
-				membersQualityExt,
-        // Template helpers
-        timestampToDatetime,
-        // Calculer la proportion de temps restant avant l'expiration
-        color: function( timestamp, idtyWindow, max )
-        {
-					const MIN = 120;
-					let proportion = (((timestamp-currentBlockchainTimestamp)*(max-MIN))/idtyWindow)+MIN;
-          proportion = proportion < MIN ? MIN : proportion > max ? max : proportion 
-          let hex = parseInt( proportion ).toString(16)
-          return `#${hex}${hex}${hex}`
-        }
-      }
-			// Passer la main au template
-      next()
-    }
-	}
-	catch (e)
-	{
-		// En cas d'exception, afficher le message
-		res.status(500).send(`<pre>${e.stack || e.message}</pre>`);
-	}
-  
-})
diff --git a/routes/wotex.js b/routes/wotex.js
deleted file mode 100755
index 828adb22eb97ca54768e6316600b4e4c90668ce2..0000000000000000000000000000000000000000
--- a/routes/wotex.js
+++ /dev/null
@@ -1,292 +0,0 @@
-"use strict";
-
-const _ = require('underscore')
-const co = require('co')
-const getLang = require(__dirname + '/../lib/getLang')
-
-const MAX_STEP_LOOK = 7
-
-module.exports = (req, res, next) => co(function *() {
-  
-  var { duniterServer  } = req.app.locals
-
-    try {
-      // get GET parameters
-      var format = req.query.format || 'HTML';
-      var help = req.query.help || 'yes';
-      
-      // get lg file
-      const LANG = getLang(`${__dirname}/../lg/wotex_${req.query.lg||constants.DEFAULT_LANGUAGE}.txt`);
-      
-      // Trouve les points de contrôle efficacement grâce au module C (nommé "wotb")
-      const wotb = duniterServer.dal.wotb.memCopy();
-      wotb.setMaxCert(100);
-      const head = yield duniterServer.dal.getCurrentBlockOrNull();
-      const membersCount = head ? head.membersCount : 0;
-      let dSen = Math.ceil(Math.pow(membersCount, 1 / duniterServer.conf.stepMax));
-      const dicoIdentites = {};
-      const pointsDeControle = wotb.getSentries(dSen);
-      const sentries = yield pointsDeControle.map((wotb_id) => co(function*() {
-        const identite = (yield duniterServer.dal.idtyDAL.query('SELECT * FROM i_index WHERE wotb_id = ?', [wotb_id]))[0];
-        identite.statusClass = 'isSentry';
-        dicoIdentites[identite.wotb_id] = identite;
-        return identite;
-      }));
-
-      let searchResult = '';
-			let lignes = [];
-      if (req.query.to) {
-        let idty;
-        let pos = 0, search = req.query.to;
-        if (req.query.to.match(/(\[|\])/)) {
-          const match = req.query.to.match(/^(.+)(\[\d+\])!?$/);
-          search = match[1];
-          pos = parseInt(match[2].replace(/(\[|\])/g, ''));
-        }
-        let idties = yield duniterServer.dal.idtyDAL.query('' +
-          'SELECT uid, pub, wotb_id FROM i_index WHERE (uid = ? or pub = ?) ' +
-          'UNION ALL ' +
-          'SELECT uid, pubkey as pub, (SELECT NULL) AS wotb_id FROM idty WHERE (uid = ? or pubkey = ?)', [search, search, search, search]);
-        idty = idties[pos];
-        if (!idty) {
-          searchResult = `
-                  <p>UID or public key « ${req.query.to} » is not known in the WoT nor in the sandboxes.</p>
-                `;
-        } else if (!req.query.pending && idty.wotb_id === null) {
-          searchResult = `
-                  <p>UID or public key « ${req.query.to} » requires the "Include sandbox's data" option to be enabled.</p>
-                `;
-        } else {
-
-          let membres = yield prepareMembresInitiaux(wotb, dSen, sentries, dicoIdentites, duniterServer);
-
-          const res = yield prepareMembres(req, wotb, duniterServer, membres, idty, dicoIdentites);
-          membres = res.membres;
-          idty = res.idty;
-          const mapPendingCerts = res.mapPendingCerts;
-
-          for (const membre of membres) {
-            if (req.query.mode == "u2w") {
-              alimenteLignes(wotb, idty, membre, lignes, dicoIdentites, mapPendingCerts);
-            } else {
-              alimenteLignes(wotb, membre, idty, lignes, dicoIdentites, mapPendingCerts);
-            }
-          }
-          searchResult = genereHTMLdeRecherche(lignes, LANG, help);
-        }
-      }
-
-      // Si le client demande la réponse au format JSON, le faire
-      if (format == 'JSON')
-      {
-				// Send JSON reponse
-				res.status(200).jsonp( lignes )
-      }
-      // Sinon, printer la page html
-      else
-      {
-				// write sentriesHTML
-				let sentriesHTML = sentries
-						.map((sentry) => `
-					<div class="sentry isSentry"><a href="wotex?lg=${LANG['LG']}&to=${sentry.uid}">${sentry.uid}</a></div>
-							`)
-						.join('');
-				
-				res.locals = {
-					// Les varibles à passer au template
-					host: req.headers.host.toString(),
-					searchResult,
-					sentriesHTML
-				}
-				next()
-      }
-    } catch (e) {
-      // En cas d'exception, afficher le message
-      res.status(500).send('<pre>' + (e.stack || e.message) + '</pre>');
-    }
-
-  });
-
-function traduitCheminEnIdentites(chemins, dicoIdentites) {
-  const cheminsTries = chemins.sort((cheminA, cheminB) => {
-    if (cheminA.length < cheminB.length) {
-      return -1;
-    }
-    if (cheminA.length > cheminB.length) {
-      return 1;
-    }
-    return 0;
-  });
-  if (cheminsTries[0]) {
-    return cheminsTries[0].slice().map((wotb_id) => {
-      return {
-        uid: dicoIdentites[wotb_id].uid,
-        pub: dicoIdentites[wotb_id].pub,
-        wotb_id: wotb_id,
-        statusClass: dicoIdentites[wotb_id].statusClass
-      };
-    });
-  } else {
-    return [];
-  }
-}
-
-function prepareMembresInitiaux(wotb, dSen, sentries, dicoIdentites, duniterServer) {
-  return co(function*() {
-    // Ajout des membres non-sentries
-    const pointsNormaux = wotb.getNonSentries(dSen);
-    const nonSentries = yield pointsNormaux.map((wotb_id) => co(function*() {
-      const identite = (yield duniterServer.dal.idtyDAL.query('SELECT * FROM i_index WHERE wotb_id = ?', [wotb_id]))[0];
-      identite.statusClass = 'isMember';
-      dicoIdentites[identite.wotb_id] = identite;
-      return identite;
-    }));
-    const nonMembres = wotb.getDisabled();
-    const disabled = yield nonMembres.map((wotb_id) => co(function*() {
-      const identite = (yield duniterServer.dal.idtyDAL.query('SELECT * FROM i_index WHERE wotb_id = ?', [wotb_id]))[0];
-      identite.statusClass = 'isNonMember';
-      dicoIdentites[identite.wotb_id] = identite;
-      return identite;
-    }));
-
-    return sentries.concat(nonSentries).concat(disabled);
-  });
-}
-
-function prepareMembres(req, wotb, duniterServer, membres, idty, dicoIdentites) {
-  return co(function*() {
-    const mapPendingCerts = {};
-    const mapPendingIdties = {};
-    const mapSiblings = {};
-    if (req.query.pending) {
-      // Recherche les identités en attente
-      const pendingIdties = yield duniterServer.dal.idtyDAL.sqlListAll();
-      for (const theIdty of pendingIdties) {
-        // Add it to the temp wot
-        theIdty.wotb_id = wotb.addNode();
-        theIdty.statusClass = 'isPending';
-        theIdty.pub = theIdty.pubkey;
-        const siblings = _.where(pendingIdties, { uid: theIdty.uid });
-        if (siblings.length > 1 || mapSiblings[theIdty.uid] !== undefined) {
-          const initialUID = theIdty.uid;
-          mapSiblings[initialUID] = (mapSiblings[initialUID] || 0);
-          theIdty.uid += "[" + mapSiblings[initialUID] + "]";
-          if (theIdty.uid == req.query.to) {
-            idty = theIdty;
-          }
-          mapSiblings[initialUID]++;
-        } else {
-          if (theIdty.uid == req.query.to) {
-            idty = theIdty;
-          }
-        }
-        dicoIdentites[theIdty.wotb_id] = theIdty;
-        mapPendingIdties[theIdty.wotb_id] = theIdty;
-      }
-
-      membres = membres.concat(Object.values(mapPendingIdties));
-
-      // Recherche les certifications en attente
-      const pendingCerts = yield duniterServer.dal.certDAL.sqlListAll();
-      for (const cert of pendingCerts) {
-        const from = _.findWhere(membres, { pub: cert.from });
-        const target = _.findWhere(membres, { hash: cert.target });
-        if (target && from) {
-          wotb.addLink(from.wotb_id, target.wotb_id);
-          mapPendingCerts[[from.wotb_id, target.wotb_id].join('-')] = true;
-        }
-      }
-    }
-    return { idty, membres, mapPendingCerts };
-  });
-}
-
-function alimenteLignes(wotb, source, cible, lignes, dicoIdentites, mapPendingCerts) {
-  const plusCourtsCheminsPossibles = wotb.getPaths(source.wotb_id, cible.wotb_id, MAX_STEP_LOOK);
-  if (plusCourtsCheminsPossibles.length) {
-    const ligne = traduitCheminEnIdentites(plusCourtsCheminsPossibles, dicoIdentites);
-    for (let i = 0; i < ligne.length - 1; i++) {
-      const from_wid = ligne[i].wotb_id;
-      const to_wid = ligne[i + 1].wotb_id;
-      const lien = [from_wid, to_wid].join('-');
-      if (mapPendingCerts[lien]) {
-        ligne[i + 1].pendingCert = true;
-      }
-    }
-    lignes.push(ligne);
-  } else {
-    const identiteObservee = dicoIdentites[source.wotb_id];
-    if (identiteObservee.uid != cible.uid) {
-      lignes.push([identiteObservee,
-        { uid: '?', statusClass: 'isPending', pendingCert: true },
-        { uid: '?', statusClass: 'isPending', pendingCert: true },
-        { uid: '?', statusClass: 'isPending', pendingCert: true },
-        { uid: '?', statusClass: 'isPending', pendingCert: true },
-        { uid: '?', statusClass: 'isPending', pendingCert: true },
-        cible]);
-    }
-  }
-}
-
-function genereHTMLdeRecherche(lignes, LANG, help) {
-  lignes.sort((ligneA, ligneB) => {
-    if (ligneA.length > ligneB.length) return -1;
-    if (ligneB.length > ligneA.length) return 1;
-    if ((ligneA[1] && ligneA[1] == '?') && (!ligneB[1] || ligneB[1] != '?')) {
-      return 1;
-    }
-    if ((ligneB[1] && ligneB[1] == '?') && (!ligneA[1] || ligneA[1] != '?')) {
-      return -1;
-    }
-    return 0;
-  });
-  lignes.reverse();
-  const chemins = lignes.map((colonnes) => {
-    return `
-    <tr>
-      <td class="${ colonnes[0] && colonnes[0].statusClass }"><a href="wotex?lg=${LANG['LG']}&help=${help}&to=${ (colonnes[0] && colonnes[0].uid) || ''}">${ (colonnes[0] && colonnes[0].uid) || ''}</td>
-      <td class="${ colonnes[1] && colonnes[1].pendingCert ? 'isPendingCert' : '' }">${ (colonnes[1] && colonnes[1].uid) ? '->' : ''}</td>
-      <td class="${ colonnes[1] && colonnes[1].statusClass }"><a href="wotex?lg=${LANG['LG']}&help=${help}&to=${ (colonnes[1] && colonnes[1].uid) || ''}">${ (colonnes[1] && colonnes[1].uid) || ''}</td>
-      <td class="${ colonnes[2] && colonnes[2].pendingCert ? 'isPendingCert' : '' }">${ (colonnes[2] && colonnes[2].uid) ? '->' : ''}</td>
-      <td class="${ colonnes[2] && colonnes[2].statusClass }"><a href="wotex?lg=${LANG['LG']}&help=${help}&to=${ (colonnes[2] && colonnes[2].uid) || ''}">${ (colonnes[2] && colonnes[2].uid) || ''}</td>
-      <td class="${ colonnes[3] && colonnes[3].pendingCert ? 'isPendingCert' : '' }">${ (colonnes[3] && colonnes[3].uid) ? '->' : ''}</td>
-      <td class="${ colonnes[3] && colonnes[3].statusClass }"><a href="wotex?lg=$&help=${help}&to=${ (colonnes[3] && colonnes[3].uid) || ''}">${ (colonnes[3] && colonnes[3].uid) || ''}</td>
-      <td class="${ colonnes[4] && colonnes[4].pendingCert ? 'isPendingCert' : '' }">${ (colonnes[4] && colonnes[4].uid) ? '->' : ''}</td>
-      <td class="${ colonnes[4] && colonnes[4].statusClass }"><a href="wotex?lg=${LANG['LG']}&help=${help}&to=${ (colonnes[4] && colonnes[4].uid) || ''}">${ (colonnes[4] && colonnes[4].uid) || ''}</td>
-      <td class="${ colonnes[5] && colonnes[5].pendingCert ? 'isPendingCert' : '' }">${ (colonnes[5] && colonnes[5].uid) ? '->' : ''}</td>
-      <td class="isMax ${ colonnes[5] && colonnes[5].statusClass }"><a href="wotex?lg=${LANG['LG']}&help=${help}&to=${ (colonnes[5] && colonnes[5].uid) || ''}">${ (colonnes[5] && colonnes[5].uid) || ''}</td>
-      <td class="${ colonnes[6] && colonnes[6].pendingCert ? 'isPendingCert' : '' }">${ (colonnes[6] && colonnes[6].uid) ? '->' : ''}</td>
-      <td class="${ colonnes[6] && colonnes[6].statusClass }"><a href="wotex?lg=${LANG['LG']}&help=${help}&to=${ (colonnes[6] && colonnes[6].uid) || ''}">${ (colonnes[6] && colonnes[6].uid) || ''}</td>
-      <td class="${ colonnes[7] && colonnes[7].pendingCert ? 'isPendingCert' : '' }">${ (colonnes[7] && colonnes[7].uid) ? '->' : ''}</td>
-      <td class="${ colonnes[7] && colonnes[7].statusClass }"><a href="wotex?lg=${LANG['LG']}&help=${help}&to=${ (colonnes[7] && colonnes[7].uid) || ''}">${ (colonnes[7] && colonnes[7].uid) || ''}</td>
-      <td class="${ colonnes[8] && colonnes[8].pendingCert ? 'isPendingCert' : '' }">${ (colonnes[8] && colonnes[8].uid) ? '->' : ''}</td>
-      <td class="${ colonnes[8] && colonnes[8].statusClass }"><a href="wotex?lg=${LANG['LG']}&help=${help}&to=${ (colonnes[8] && colonnes[8].uid) || ''}">${ (colonnes[8] && colonnes[8].uid) || ''}</td>
-    </tr>
-  `;
-  }).join('');
-
-  return `
-    <table>
-      <tr>
-        <th>${LANG['STEP']} 0</th>
-        <th class="arrow">-></th>
-        <th>${LANG['STEP']} 1</th>
-        <th class="arrow">-></th>
-        <th>${LANG['STEP']} 2</th>
-        <th class="arrow">-></th>
-        <th>${LANG['STEP']} 3</th>
-        <th class="arrow">-></th>
-        <th>${LANG['STEP']} 4</th>
-        <th class="arrow">-></th>
-        <th class="isMax">${LANG['STEP']} 5 (${LANG['MAX']})</th>
-        <th class="arrow">-></th>
-        <th>${LANG['STEP']} 6</th>
-        <th class="arrow">-></th>
-        <th>${LANG['STEP']} 7</th>
-        <th class="arrow">-></th>
-        <th>${LANG['INFINITY']}</th>
-      </tr>
-      ${chemins}
-    </table>
-  `;
-}
diff --git a/views/Chart.html b/views/Chart.html
index 34eaf74fee3b1f03211f858f982c51b02f971440..502fa35d103cd51f13d891e8421f1f53306a8752 100755
--- a/views/Chart.html
+++ b/views/Chart.html
@@ -1,4 +1,4 @@
-${(host.substr(host.length-6,6) == '.onion') ? HTML_TOR_HEAD:HTML_HEAD}
+${HTML_HEAD}
   <title>${currencyName}-monit : ${MENU_LANG[pageName]}</title>
 </head>
 <body>
diff --git a/views/TOR_HEAD.html b/views/TOR_HEAD.html
deleted file mode 100755
index 5cfb93fa22c0924ac87341c8240087430c0ed591..0000000000000000000000000000000000000000
--- a/views/TOR_HEAD.html
+++ /dev/null
@@ -1,6 +0,0 @@
-<!DOCTYPE html>
-<html>
-  <head>
-    <link rel="icon" type="image/png" href="http://722iprlhm7pw4mx7.onion/public/duniter.ico" />
-    <style>
-    </style>
\ No newline at end of file
diff --git a/views/about.html b/views/about.html
index a04396e38cfd54f77432cc4652fdb131a803bcef..3a896405ac174d36a93b80f2cb5a9f28d0f6bb2a 100755
--- a/views/about.html
+++ b/views/about.html
@@ -1,4 +1,4 @@
-${(host.substr(host.length-6,6) == '.onion') ? HTML_TOR_HEAD:HTML_HEAD}
+${HTML_HEAD}
   <title>${currencyName}-monit : ${MENU_LANG['ABOUT']}</title>
 </head>
 <body>
diff --git a/views/members.html b/views/members.html
deleted file mode 100755
index 53f9abc55f894a82e6310c6ec7c21f36d4c49403..0000000000000000000000000000000000000000
--- a/views/members.html
+++ /dev/null
@@ -1,185 +0,0 @@
-${(host.substr(host.length-6,6) == '.onion') ? HTML_TOR_HEAD:HTML_HEAD}
-  <title>${currencyName}-monit : ${MENU_LANG['MEMBERS']}</title>
-  <script type="text/javascript">// <![CDATA[
-	var table = document.getElementById('table')
-	var filter = document.getElementById('filter')
-
-	/*filter.onchange = function() {
-		return filterRows(table, 1, 0, this.value);
-  }*/
-
-	// tableElem : HTMLElement
-	// rowIndex  : index du row pour commencer le filtrage (0 indexed)
-	// tableElem : index du col à prendre en compte (0 indexed)
-	// tableElem : lettre pour la comparaison
-	function filterRows(tableElem, rowIndex, colIndex, filterString) {
-		for (var i = rowIndex, val; i < tableElem.rows.length; ++i) {
-			val = tableElem.rows[i].cells[colIndex].firstChild.nodeValue;
-			if (val.substr(0,filterString.length).toLowerCase() != filterString.toLowerCase())
-				tableElem.rows[i].style.display = 'none';
-			else
-				tableElem.rows[i].style.display = '';
-		}  
-		return false;
-	}
-// ]]></script>
-</head>
-<body>
-
-<!-- Afficher le menu -->
-${printMenu(MENU_LANG, help, "MEMBERS")}
-
-<!-- Afficher le formulaire -->
-<input type="number" name="d" value="${days}"/> ${LANG["FORM1"]} <select name="sort_by">
-<option name="sort_by" value ="idtyWritten">${LANG["SORT_BY_IDTY_WRITTEN"]}
-<option name="sort_by" value ="expireMembership" ${sort_by == 'expireMembership' ? 'selected' : ''}>${LANG["SORT_BY_EXPIRE_MEMBERSHIP"]}
-<option name="sort_by" value ="lastRenewal" ${sort_by == 'lastRenewal' ? 'selected' : ''}>${LANG["SORT_LAST_RENEWAL"]}
-<option name="sort_by" value ="oldestSig" ${sort_by == 'oldestSig' ? 'selected' : ''}>${LANG["SORT_BY_OLDEST_SIG"]}
-<option name="sort_by" value ="lastSig" ${sort_by == 'lastSig' ? 'selected' : ''}>${LANG["SORT_BY_LAST_SIG"]}
-<option name="sort_by" value ="centrality" ${sort_by == 'centrality' ? 'selected' : ''}>${LANG["SORT_BY_CENTRALITY"]}
-<option name="sort_by" value ="quality" ${sort_by == 'quality' ? 'selected' : ''}>${LANG["SORT_BY_QUALITY"]}
-<option name="sort_by" value ="sigCount" ${sort_by == 'sigCount' ? 'selected' : ''}>${LANG["SORT_BY_SIG_COUNT"]}
-</select> ${LANG["ORDER_BY"]} <select name="order">
-<option name="order" value ="asc"> ${LANG["ASC"]}
-<option name="order" value ="desc" ${order == 'desc' ? 'selected' : ''}> ${LANG["DESC"]}</select>
-<input type="submit" value="${LANG['SUBMIT_BUTTON']}"><br>
-<input type="checkbox" name="centrality" value="yes">${LANG["CHECKBOX_CENTRALITY"]}.<br>
-<input type="checkbox" name="pendingSigs" value="yes" ${pendingSigs == 'yes' ? 'checked' : ''}>${LANG["CHECKBOX_PENDING_SIGS"]}.<br>
-<input type="checkbox" name="mode" value="emitted" ${mode == 'emitted' ? 'checked' : ''}>${LANG["CHECKBOX_MODE_SIG"]}.<br>
-<input type="checkbox" name="nextYn" value="yes" ${nextYn == 'yes' ? 'checked' : ''}> ${LANG["NEXT_YN"]}<br>
-<hr>
-
-<!-- Afficher la légende et l'aide -->
-${(help != 'no') ? `
-  <b>${LANG["LEGEND"]}</b><br>
-  ${(pendingSigs == 'yes') ? ` ${LANG["LEGEND_AVAILABILITY"]}<br>` : ''}
-  <br>
-  <b>${LANG["WHAT_IS_CENTRALITY_TITLE"]}</b><br>
-  ${LANG["WHAT_IS_CENTRALITY_TEXT"]}<br>
-  <br>
-  <b>${LANG["QUALITY_MEMBER_TITLE"]}</b><br>
-  ${LANG["QUALITY_MEMBER_TXT"]}<br>
-  <hr>
-`:''}
-
-<!-- Afficher l'état de tension de la toile de confiance -->
-<h3>${LANG["WOT_TENSION_STATE"]}</h3>
-${(membersLastCentralityCalcTime==0) ? `
-	${LANG["CENTRALITY_NOT_CALC"]}.<br>
-`:`
-  ${(lockCentralityCalc) ? `
-    ${LANG["CENTRALITY_CALC_BUSY"]}.<br>
-  `:`
-		<table border="1">
-			<tr><td align='center' colspan='2'>${LANG["DATA_AT"]} ${timestampToDatetime(membersLastCentralityCalcTime)}</td></tr>
-			<tr><td align='center'>${LANG["MEAN_LENGTH_PATH"]}</td><td align='center'><b>${(meanShortestsPathLength).toFixed(2)}</b></td></tr>
-			<tr><td align='center'>${LANG["MEAN_CENTRALITY"]}</td><td align='center'><b>${meanCentrality.toFixed(2)}</b></td></tr>
-			<tr><td align='center'>${LANG["NUMBER_OF_PAIRS_MEMBER"]}</td><td align='center'>${(membersListFiltered.length*(membersListFiltered.length-1))}</td></tr>
-			<tr><td align='center'>${LANG["NUMBER_OF_EXIST_PATH"]}</td><td align='center'><b>${nbShortestsPath}</b></td></tr>
-			<tr><td align='center'><b>${LANG["PROPORTION_OF_EXIST_PATH"]}</b></td><td align='center'><font color="red"><b>${((nbShortestsPath/(membersListFiltered.length*(membersListFiltered.length-1)))*100).toFixed(2)}%</b></font></td></tr>
-		</table>
-	`}
-`}
-<br>
-	<table border="1">
-		<tr><td align='center' colspan='3'>${LANG["DATA_AT"]} ${timestampToDatetime(membersLastUptime)}</td></tr>
-		<tr><td align='center'>${LANG["meanMembersReachedByMembers"]}</td><td align='center'>${LANG["SENTRIES_REACHED"]}</td><td align='center'>${LANG["MEMBERS_REACHED"]}</td></tr>
-		<tr><td align='center'>${LANG["SENTRY_CERT"]}</td><td align='center'>${(meansMembersQuality.meanSentriesReachedBySentries).toFixed(2)}%</td><td align='center'>${(meansMembersQuality.meanMembersReachedBySentries).toFixed(2)}%</td></tr>
-		<tr><td align='center'>${LANG["MEMBER_CERT"]}</td><td align='center'><font ${(meansMembersQuality.meanSentriesReachedByMembers<xpercent) ? 'color="DarkRed"' : 'color="blue"' }><b>${meansMembersQuality.meanSentriesReachedByMembers}%</b></font></td><td align='center'><b>${meansMembersQuality.meanMembersReachedByMembers}%</b></td></tr>
-		<tr><td align='center'><b>${LANG["MEAN_QUALITY"]}</b></td><td align='center'><font color="red"><b>${(meansMembersQuality.meanSentriesReachedByMembers/(xpercent*100)).toFixed(2)}</b></font></td><td align='center'><b>${(meansMembersQuality.meanMembersReachedByMembers/(xpercent*100)).toFixed(2)}</b></td></tr>
-		<tr><td align='center'><b>${LANG["PROPORTION_MEMBERS_WITH_QUALITY_UPPER_1"]}</b></td><td align='center'><font color="red"><b>${(proportionMembersWithQualityUpper1*100).toFixed(2)}%</b></font></td><td align='center'><b>${(proportionMembersWithQualityUpper1IfNoSentries*100).toFixed(2)}%</b></td></tr>
-	</table>
-	<br>
-
-<!-- Afficher le currentBlockchainTimestamp -->
-<i>${LANG["CURRENT_BLOCKCHAIN_TIME"]} : ${timestampToDatetime(currentBlockchainTimestamp)}.<br>
-<!-- Afficher le nombre de membres et de membres référents -->
-<b>${membersListFiltered.length}</b> ${LANG["MEMBERS"]} ${LANG["OF_WHICH"]} <b>${countSentries}</b> ${LANG['ARE_REFERRING_MEMBERS']} (<b>${((countSentries/membersListFiltered.length)*100).toFixed(2)}%</b>).</i><br>
-<br>
-<!-- Afficher le filtre des membres -->
-${LANG["MEMBER_FILTER"]} : <input type="text" name="filter" id="filter" value="" maxlength="20" onchange="filterRows(document.getElementById('table'),1,0,this.value);" onkeypress="this.onchange();" onpaste="this.onchange();" oninput="this.onchange();"/><br>
-</form>
-
-<!-- On parcour tout les membres pour afficher ceux dont la date d'expiration est dans moins de 'd' jours -->
-<b>${LANG["TABLE_TITLE"]} ${days} ${LANG["DAYS"]} :</b>
-<table id="table" border="1">
-  <!-- Printer les nom des colonnes -->
-  <tr>
-    <td align="center" style="display :none"></td>
-    <td align="center">${LANG["COL_UID"]}</td>
-    <td align="center">${LANG["COL_IDTY_WRITTEN_TIME"]}</td>
-    <td align="center">${LANG["COL_LAST_RENEWAL"]}</td>
-    <td align="center">${LANG["COL_EXPIRE_MEMBERSHIP"]}</td>
-    <td align='center'>${LANG['COL_DISTANCE']}</td>
-    <td style="background:#000000">-</td>
-    <td align="left" colspan="${nbMaxCertifs}">${(mode=='emitted') ? LANG['COL_LIST_EMITTED_CERT']:LANG['COL_LIST_RECEIVED_CERT']} (${sort_by == 'lastSig' ? LANG["LAST2OLDEST"] : LANG["OLDEST2LAST"]})</td>
-  </tr>
-  ${membersListFiltered
-    .map( member=> `
-      <!-- Printer la ligne -->
-      <tr>
-        ${(member.proportion = proportion(member.expireMembershipTimestamp,msValidity,0,120),'')}
-        <td align="center" style="display :none">${member.uid}</td>
-        <td align="center" style="background:hsla(${member.proportion}, 100%, 50%, 1)"><b>${member.uid}</b><br>
-          
-          ${(member.isSentry) ? `<font color="blue">${LANG['REFERRING_MEMBER']} : ${LANG['YES']}</font>`:`${LANG['REFERRING_MEMBER']} : ${LANG['NO']}`}<br>
-            ${LANG['QUALITY_EXT']} : <b>${(typeof(membersQuality(member.wotb_id))=='undefined') ? `0.00`:membersQuality(member.wotb_id)}</b><br>
-          <b>${(membersLastCentralityCalcTime==0) ? `${LANG['CENTRALITY']} : ?`:`
-						${LANG['CENTRALITY']} : <b>${(typeof(membersCentrality[member.wotb_id])=='undefined') ? `0`:membersCentrality[member.wotb_id]}
-					`}</b><br>
-          ->${member.certifications.length}
-          ${pendingSigs == "yes" && typeof(member.pendingCertifications) != 'undefined' 
-            ? ` (+${member.pendingCertifications.length})` 
-            : ''}
-        </td>
-        <td align="center" style="background:hsla(${member.proportion}, 100%, 50%, 1)">
-          <span data-tip="${timestampToDatetime(member.idtyWrittenTimestamp)}">#${member.idtyWrittenBloc}</span>
-        </td>
-        <td align="center" style="background:hsla(${member.proportion}, 100%, 50%, 1)">
-          <span data-tip="${timestampToDatetime(member.lastRenewalTimestamp)}">#${member.lastRenewalWrittenBloc}</span>
-        </td>
-        <td align="center" style="background:hsla(${member.proportion}, 100%, 50%, 1)">
-          ${timestampToDatetime(member.expireMembershipTimestamp)}</td>
-        <td align='center' style="background:hsla(${member.proportion}, 100%, 50%, 1)">
-          
-						<font color="${member.detailedDistance.isOutdistanced ? 'red' : 'blue' }">
-							${member.detailedDistance.isOutdistanced ? LANG['COL_DISTANCE_isOutdistanced'] : LANG['COL_DISTANCE_isNotOutdistanced'] }
-								<br>${member.percentSentriesReached}% (${member.detailedDistance.nbSuccess}/${member.detailedDistance.nbSentries})
-						</font>
-        </td>
-        <td style="background:#000000">-</td>
-  
-        <!-- Printer les certifications en piscine -->
-        ${pendingSigs == "yes" && typeof(member.pendingCertifications) != 'undefined' ?
-            member.pendingCertifications.map( cert=> `
-              <!-- Printer la certification -->
-              <td align="center" style="background:${(cert.validBlockStamp) ? cert.colorPending=color(cert.expires_on,idtyWindow,250) : cert.colorPending='#FF8000'}">
-								<b>${cert.protagonist}</b><br>
-                <span data-tip="${LANG['EXPIRE_TIME']}">${timestampToDatetime(cert.timestampExpire)}</span><br>
-                
-                ${LANG["EMITTED"]} #${cert.blockNumber}<br>
-                ${ ( !cert.validBlockStamp || cert.timestampWritable > currentBlockchainTimestamp ) ? `
-									<font color="DarkRed">[${ (cert.validBlockStamp) ? timestampToDatetime(cert.timestampWritable):LANG['INVALID_BLOCKSTAMP']}]</font>
-								` : `
-									<font color='green'>[${LANG['CERT_AVAILABLE']}]</font>
-								`}
-                </font>
-              </td>
-            `).join('') 
-        :''}
-    
-        <!-- Printer les certifications écrites en blockchain -->
-        ${member.certifications.map( cert=> `
-          <!-- Printer la certification -->
-          <td align="center" style="background:hsla(${proportion(cert.timestampExpire,sigValidity,0,120)}, 100%, 50%, 1 )">
-            <b>${(mode=='emitted') ? cert.receiver:cert.issuer}</b><br>
-            <span data-tip="${LANG['EXPIRE_TIME']}">${timestampToDatetime(cert.timestampExpire)}</span><br>
-            ${LANG["WRITTEN"]} #${cert.writtenBloc}
-          </td>
-        `).join('')}
-      </tr>
-    `).join('')
-  }
-</table><br>
-
-<hr>
diff --git a/views/printMenu.js b/views/printMenu.js
index 82854f66fd045b972eaf193494820c11f1ef7efb..10eea32abc9a48e14c5acefaed36b832900f8957 100644
--- a/views/printMenu.js
+++ b/views/printMenu.js
@@ -2,13 +2,6 @@ const constants = require(__dirname + '/../lib/constants')
 
 module.exports = function printMenu(lang, help, location) {
   let htmlMenu = '<ul class="menu">';//'<table align="center" width="100%"><tr>';
-
-  htmlMenu += `<li class="menu"><a class="${(location=="WILL_MEMBERS") ? 'active':'menu'}" href="willMembers?lg=${lang['LG']}${(typeof(help) != 'undefined' && help == 'no') ? '&help=no':''}">${lang["WILL_MEMBERS"]}</a></li>`;
-  htmlMenu += `<li class="menu"><a class="${(location=="MEMBERS") ? 'active':'menu'}" href="members?lg=${lang['LG']}${(typeof(help) != 'undefined' && help == 'no') ? '&help=no':''}">${lang["MEMBERS"]}</a></li>`;
-  htmlMenu += `<li class="menu"><a class="${(location=="MEMBERS_COUNT") ? 'active':'menu'}" href="membersCount?lg=${lang['LG']}${(typeof(help) != 'undefined' && help == 'no') ? '&help=no':''}">${lang["MEMBERS_COUNT"]}</a></li>`;
-  htmlMenu += `<li class="menu"><a class="${(location=="WOTEX") ? 'active':'menu'}" href="wotex?lg=${lang['LG']}${(typeof(help) != 'undefined' && help == 'no') ? '&help=no':''}">${lang["WOTEX"]}</a></li>`;
-  htmlMenu += `<li class="menu"><a class="${(location=="GAUSSIAN_WOT_QUALITY") ? 'active':'menu'}" href="gaussianWotQuality?lg=${lang['LG']}${(typeof(help) != 'undefined' && help == 'no') ? '&help=no':''}">${lang["GAUSSIAN_WOT_QUALITY"]}</a></li>`;
-  htmlMenu += `<li class="menu"><a class="${(location=="BLOCK_COUNT") ? 'active':'menu'}" href="blockCount?lg=${lang['LG']}${(typeof(help) != 'undefined' && help == 'no') ? '&help=no':''}">${lang["BLOCK_COUNT"]}</a></li>`;
   htmlMenu += `<li class="menu"><a class="${(location=="MONETARY_MASS") ? 'active':'menu'}" href="monetaryMass?lg=${lang['LG']}${(typeof(help) != 'undefined' && help == 'no') ? '&help=no':''}">${lang["MONETARY_MASS"]}</a></li>`;
   htmlMenu += `<li class="menu"><a class="${(location=="ABOUT") ? 'active':'menu'}" href="about?lg=${lang['LG']}${(typeof(help) != 'undefined' && help == 'no') ? '&help=no':''}">${lang["ABOUT"]}</a></li>`;
   htmlMenu += `<li class="menu" style="float:right"><form action="" method="GET"><a class="menu"><select name="lg" onchange="this.form.submit()">`;
diff --git a/views/willMembers.html b/views/willMembers.html
deleted file mode 100755
index da3010ddbb056c3aefb9602767c6e10788ba565a..0000000000000000000000000000000000000000
--- a/views/willMembers.html
+++ /dev/null
@@ -1,233 +0,0 @@
-${(host.substr(host.length-6,6) == '.onion') ? HTML_TOR_HEAD:HTML_HEAD}
-  <title>${currencyName}-monit : ${MENU_LANG['WILL_MEMBERS']}</title>
-  
-<script type="text/javascript">// <![CDATA[
-	var table = document.getElementById('table')
-	var filter = document.getElementById('filter')
-
-	/*filter.onchange = function() {
-		return filterRows(table, 1, 0, this.value);
-  }*/
-
-	// tableElem : HTMLElement
-	// rowIndex  : index du row pour commencer le filtrage (0 indexed)
-	// tableElem : index du col à prendre en compte (0 indexed)
-	// tableElem : lettre pour la comparaison
-	function filterRows(tableElem, rowIndex, colIndex, filterString) {
-		for (var i = rowIndex, val; i < tableElem.rows.length; ++i) {
-			val = tableElem.rows[i].cells[colIndex].firstChild.nodeValue;
-			if (val.substr(0,filterString.length).toLowerCase() != filterString.toLowerCase())
-				tableElem.rows[i].style.display = 'none';
-			else
-				tableElem.rows[i].style.display = '';
-		}  
-		return false;
-	}
-	
-	function deroule(champ,valeur)
-	{
-		/*valeur est la hauteur en pixel de la zone*/
-		switch (champ)
-		{
-			case 1: /*si champ vaut 1 alors on change la hauteur de zone1*/
-				document.getElementById("zone1").style.height=valeur+'px';
-				break;
-		case 2: /*si champ vaut 2 alors on change la hauteur de zone2*/
-				document.getElementById("zone2").style.height=valeur+'px';
-				break;
-		}
-	}
-// ]]></script>
-</head>
-<body>
-
-<!-- Afficher le menu -->
-${printMenu(MENU_LANG, help, "WILL_MEMBERS")}
-
-<!-- Afficher le formulaire -->
-	<input type="number" name="d" value="${days}"/>${LANG["DAYS"]} - ${LANG["SORT_BY"]}
-	<select name="sort_by">
-		<option name="sort_by" value ="creationIdty">${LANG["SORT_BY_CREATION_IDTY"]}
-		<option name="sort_by" value ="sigCount" ${sort_by == 'sigCount' ? 'selected' : ''}>${LANG["SORT_BY_SIG_COUNT"]}
-		<option name="sort_by" value ="registrationPackage" ${sort_by == 'registrationPackage' ? 'selected' : ''}>${LANG["SORT_BY_REGISTRATION_PACKAGE"]}
-	</select> ${LANG["ORDER"]} : <select name="order">
-		<option name="order" value ="asc">${LANG["ORDER_ASC"]}
-		<option name="order" value ="desc" ${order == 'desc' ? 'selected' : ''}>${LANG["ORDER_DESC"]}
-	</select> <input type="submit" value="${LANG["SUBMIT_TXT"]}"><br>
-	<input type="checkbox" name="showIdtyWithZeroCert" value="yes" ${showIdtyWithZeroCert == 'yes' ? 'checked' : ''}>${LANG["CHECKBOX_SHOW_IDTY_WITH_ZERO_CERT"]}<br>
-	<input type="checkbox" name="sortSig" value="Availability" ${sortSig == 'Availability' ? 'checked' : ''}>${LANG["CHECKBOX_SORT_SIG"]}<br>
-	${LANG["IDTY_FILTER"]} : <input type="text" name="filter" id="filter" value="" maxlength="20" onchange="filterRows(document.getElementById('table'),2,0,this.value);" onkeypress="this.onchange();" onpaste="this.onchange();" oninput="this.onchange();"/>
-</form>
-<br>
-<hr>
-
-<!-- Afficher la légende et l'aide -->
-${(help != 'no') ? `
-  <div id="zone1" style="width: 100%; height: 20px; background: White; border: 1px solid DimGrey; transition: height 1s; -moz-transition: height 1s;-webkit-transition: height 1s;-o-transition: height 1s; overflow: hidden;">
-    <div id="bandeau1" style="height: 20px; width: 100%; font-size: medium; color: white; background-color: darkgrey;" onmouseover="deroule(1,400);" onmouseout="deroule(1,20);"><b>${LANG["LEGEND"]}</b>
-    </div>
-    <div id="texte1" style="float: left;">
-			<i><font color='DarkRed'>${LANG["SIG_PERIOD_LEGEND"]}</font><br>
-			<font color='green'>${LANG["SIG_PERIOD_LEGEND2"]}</font></i><br>
-			<br>
-			<b>${LANG["HOW_TO_BECOME_MEMBER_TITLE"]}</b><br>
-			${LANG["HOW_TO_BECOME_MEMBER_TEXT"]}<br>
-			<br>
-			<b>${LANG["DISTANCE_RULE_TITLE"]}</b><br>
-			${LANG["DISTANCE_RULE_TXT"]} <b>${dSen}</b><br>
-			<br>
-			<b>${LANG["WHAT_IS_CENTRALITY_TITLE"]}</b><br>
-			${LANG["WHAT_IS_CENTRALITY_TEXT"]}<br>
-			<br>
-			<b>${LANG["QUALITY_MEMBER_TITLE"]}</b><br>
-			${LANG["QUALITY_MEMBER_TXT"]}<br>
-		</div>
-	</div>
-`:''}
-
-<!-- Afficher l'état de tension de la toile de confiance -->
-	<div id="zone2" style="width: 100%; height: 20px; background: White; border: 1px solid DimGrey; transition: height 1s; -moz-transition: height 1s;-webkit-transition: height 1s;-o-transition: height 1s; overflow: hidden;">
-		<div id="bandeau2" style="height: 20px; width: 100%; font-size: medium; color: white; background-color: darkgrey;" onmouseover="deroule(2,150);" onmouseout="deroule(2,20);"><b>${LANG["WOT_TENSION_STATE"]}</b>
-		</div>
-		<div id="texte2" style="float: left;">
-			<table border="1">
-			<tr>
-				<td align='center'>${LANG["NUMBER_OF_RECEIVED_CERTS"]}</td><td align='center'>1</td><td align='center'>2</td><td align='center'>3</td><td align='center'>4</td><td align='center'>5</td>
-				${(nbMaxCertifs>5) ? `<td align='center'>6</td>`:``}
-				${(nbMaxCertifs>6) ? `<td align='center'>7</td>`:``}
-				${(nbMaxCertifs>7) ? `<td align='center'>8</td>`:``}
-				${(nbMaxCertifs>8) ? `<td align='center'>9</td>`:``}
-				${(nbMaxCertifs>9) ? `<td align='center'>10</td>`:``}
-			</tr>
-			<!-- Afficher les moyennes SentriesReachedByIdtyPerCert -->
-			<tr>
-				<td align='center'>${LANG["MEAN_SENTRIES_REACHED"]}</td>
-				<td><font color="${(meanSentriesReachedByIdtyPerCert[0]<xpercent) ? 'DarkRed' : 'blue' }"><b>${meanSentriesReachedByIdtyPerCert[0]}%</b></font></td>
-				<td><font color="${(meanSentriesReachedByIdtyPerCert[1]<xpercent) ? 'DarkRed' : 'blue' }"><b>${meanSentriesReachedByIdtyPerCert[1]}%</b></font></td>
-				<td><font color="${(meanSentriesReachedByIdtyPerCert[2]<xpercent) ? 'DarkRed' : 'blue' }"><b>${meanSentriesReachedByIdtyPerCert[2]}%</b></font></td>
-				<td><font color="${(meanSentriesReachedByIdtyPerCert[3]<xpercent) ? 'DarkRed' : 'blue' }"><b>${meanSentriesReachedByIdtyPerCert[3]}%</b></font></td>
-				<td><font color="${(meanSentriesReachedByIdtyPerCert[4]<xpercent) ? 'DarkRed' : 'blue' }"><b>${meanSentriesReachedByIdtyPerCert[4]}%</b></font></td>
-				${(nbMaxCertifs>5) ? `<td><font color="${(meanSentriesReachedByIdtyPerCert[5]<xpercent) ? 'DarkRed' : 'blue' }"><b>${meanSentriesReachedByIdtyPerCert[5]}%</b></font></td>`:``}
-				${(nbMaxCertifs>6) ? `<td><font color="${(meanSentriesReachedByIdtyPerCert[6]<xpercent) ? 'DarkRed' : 'blue' }"><b>${meanSentriesReachedByIdtyPerCert[6]}%</b></font></td>`:``}
-				${(nbMaxCertifs>7) ? `<td><font color="${(meanSentriesReachedByIdtyPerCert[7]<xpercent) ? 'DarkRed' : 'blue' }"><b>${meanSentriesReachedByIdtyPerCert[7]}%</b></font></td>`:``}
-				${(nbMaxCertifs>8) ? `<td><font color="${(meanSentriesReachedByIdtyPerCert[8]<xpercent) ? 'DarkRed' : 'blue' }"><b>${meanSentriesReachedByIdtyPerCert[8]}%</b></font></td>`:``}
-				${(nbMaxCertifs>9) ? `<td><font color="${(meanSentriesReachedByIdtyPerCert[9]<xpercent) ? 'DarkRed' : 'blue' }"><b>${meanSentriesReachedByIdtyPerCert[9]}%</b></font></td>`:``}
-			</tr>
-			<!-- Afficher les qualités moyennes -->
-			<tr>
-				<td align='center'>${LANG["MEAN_QUALITY_CERTS"]}</td>
-				<td align='center'><font color="${(meanSentriesReachedByIdtyPerCert[0]<xpercent) ? 'DarkRed' : 'blue' }"><b>${(meanSentriesReachedByIdtyPerCert[0]/(xpercent*100)).toFixed(2)}</b></font></td>
-				<td align='center'><font color="${(meanSentriesReachedByIdtyPerCert[1]<xpercent) ? 'DarkRed' : 'blue' }"><b>${(meanSentriesReachedByIdtyPerCert[1]/(xpercent*100)).toFixed(2)}</b></font></td>
-				<td align='center'><font color="${(meanSentriesReachedByIdtyPerCert[2]<xpercent) ? 'DarkRed' : 'blue' }"><b>${(meanSentriesReachedByIdtyPerCert[2]/(xpercent*100)).toFixed(2)}</b></font></td>
-				<td align='center'><font color="${(meanSentriesReachedByIdtyPerCert[3]<xpercent) ? 'DarkRed' : 'blue' }"><b>${(meanSentriesReachedByIdtyPerCert[3]/(xpercent*100)).toFixed(2)}</b></font></td>
-				<td align='center'><font color="${(meanSentriesReachedByIdtyPerCert[4]<xpercent) ? 'DarkRed' : 'blue' }"><b>${(meanSentriesReachedByIdtyPerCert[4]/(xpercent*100)).toFixed(2)}</b></font></td>
-				${(nbMaxCertifs>5) ? `<td align='center'><font color="${(meanSentriesReachedByIdtyPerCert[5]<xpercent) ? 'DarkRed' : 'blue' }"><b>${(meanSentriesReachedByIdtyPerCert[5]/(xpercent*100)).toFixed(2)}</b></font></td>`:``}
-				${(nbMaxCertifs>6) ? `<td align='center'><font color="${(meanSentriesReachedByIdtyPerCert[6]<xpercent) ? 'DarkRed' : 'blue' }"><b>${(meanSentriesReachedByIdtyPerCert[6]/(xpercent*100)).toFixed(2)}</b></font></td>`:``}
-				${(nbMaxCertifs>7) ? `<td align='center'><font color="${(meanSentriesReachedByIdtyPerCert[7]<xpercent) ? 'DarkRed' : 'blue' }"><b>${(meanSentriesReachedByIdtyPerCert[7]/(xpercent*100)).toFixed(2)}</b></font></td>`:``}
-				${(nbMaxCertifs>8) ? `<td align='center'><font color="${(meanSentriesReachedByIdtyPerCert[8]<xpercent) ? 'DarkRed' : 'blue' }"><b>${(meanSentriesReachedByIdtyPerCert[8]/(xpercent*100)).toFixed(2)}</b></font></td>`:``}
-				${(nbMaxCertifs>9) ? `<td align='center'><font color="${(meanSentriesReachedByIdtyPerCert[9]<xpercent) ? 'DarkRed' : 'blue' }"><b>${(meanSentriesReachedByIdtyPerCert[9]/(xpercent*100)).toFixed(2)}</b></font></td>`:``}
-			</tr>
-			<!-- Afficher les moyennes MembersReachedByIdtyPerCert -->
-			<tr>
-				<td align='center'>${LANG["MEAN_MEMBERS_REACHED"]}</td>
-				<td><b>${meanMembersReachedByIdtyPerCert[0]}%</b></td>
-				<td><b>${meanMembersReachedByIdtyPerCert[1]}%</b></td>
-				<td><b>${meanMembersReachedByIdtyPerCert[2]}%</b></td>
-				<td><b>${meanMembersReachedByIdtyPerCert[3]}%</b></td>
-				<td><b>${meanMembersReachedByIdtyPerCert[4]}%</b></td>
-				${(nbMaxCertifs>5) ? `<td><b>${meanMembersReachedByIdtyPerCert[5]}%</b></td>`:``}
-				${(nbMaxCertifs>6) ? `<td><b>${meanMembersReachedByIdtyPerCert[6]}%</b></td>`:``}
-				${(nbMaxCertifs>7) ? `<td><b>${meanMembersReachedByIdtyPerCert[7]}%</b></td>`:``}
-				${(nbMaxCertifs>8) ? `<td><b>${meanMembersReachedByIdtyPerCert[8]}%</b></td>`:``}
-				${(nbMaxCertifs>9) ? `<td><b>${meanMembersReachedByIdtyPerCert[9]}%</b></td>`:``}
-			</tr>
-			</table>
-		</div>
-	</div>
-
-<!-- Afficher le currentBlockchainTimestamp et le nombre d'identités au dossier complet -->
-  ${LANG["BLOCKCHAIN_TIME"]} : <b>${timestampToDatetime(currentBlockchainTimestamp)}</b> (#<b>${currentBlockNumber}</b>).<br>
-  ${LANG["COUNT_READY_MEMBERS"]} : <b>${countMembersWithSigQtyValidCert}</b>.<br>
-
-<!-- Tableau de toutes les identités en piscine -->
-<table id="table" border="1">
-  <tr><td colspan="${nbMaxCertifs+4}" align='center'>${LANG["TABLE_TITLE1"]} <b>${days}</b> ${LANG["TABLE_TITLE2"]}</td></tr>
-  <!-- Printer les nom des colonnes -->
-  <tr>
-		<td align="center" style="display :none"></td>
-    <td align='center'>${LANG['IDENTITY']}</td><td align='center'>${LANG['MEMBERSHIP_CASE_FULL']}</td><td align='center'>${LANG['DISTANCE_RULE']}</td>
-    <td style="background:#000000">-</td>
-    <td align='center' colspan="${nbMaxCertifs}">${sortSig == "Availability" 
-                                                  ? LANG['COL_4_WITH_AVAIlABILITY_SORT']
-                                                  : LANG['COL_4']}</td>
-  </tr>
-  
-  ${idtysListFiltered
-    .map( (idty,nbPrintMembers)=> `
-      
-      <!--Printer la ligne-->
-      <tr>
-				<td align="center" style="display :none">${idty['uid']}</td>
-        <td align="center" style="background:${(idty.validBlockStamp) ? ((idty.expires_on > 0) ? idty.colorPending=color(idty.expires_on,idtyWindow,250):idty.colorPending='#FF0000'): idty.colorPending='#FF8000'}">
-					<a href="wotex?lg=${MENU_LANG['LG']}${(typeof(help) != 'undefined' && help == 'no') ? '&help=no':''}&to=${idty['uid']}${idty['wotexId']}&pending=on&mode=undefined">${idty['uid'].substring(0, 25)}</a>
-					<br><span data-tip="${LANG['PUBKEY_PART']} ">${idty['pubkey'].substring(0, 16)}</span>
-          <br><b><span data-tip="${LANG['EMITTED_ON']} ${timestampToDatetime(idty['creationTimestamp'])}">#${idty['BlockNumber']}</span></b>
-          ${(idty.expires_on > 0) ? '<br><b><span data-tip="'+LANG['EXPIRE_TIME']+'">'+timestampToDatetime(idty.expires_on)+'</span></b>':``}
-        ${(!idty.validBlockStamp) ? `
-          <br><font color="DarkRed">[${LANG['INVALID_BLOCKSTAMP']}]</font>
-        `:``}
-        </td>
-        ${(idty.expires_on && !idty.idtyRevoked > 0) ? `
-					<td align='center' style="background:${idty.colorPending}">
-						${(idty.membership && !idty.detailedDistance.isOutdistanced && idty.nbValidPendingCert >= sigQty) ? `
-							<font color="green">${LANG['YES']}
-						`:`
-							<font color="DarkRed">${LANG['NO']}
-								${!idty.membership? `<br>${LANG['MEMBERSHIP_NOT_ASKED']}`:``}
-								${(idty.nbValidPendingCert < sigQty) ? `<br>${LANG['MISS']} <b>${(sigQty-idty.nbValidPendingCert)}</b> ${LANG['CERTS']}`:``}
-								${idty.detailedDistance.isOutdistanced? `<br>${LANG['DISTANCE']} ${LANG['KO']}`:``}
-							</font>
-						`}
-					</td>
-					<td align='center' style="background:${idty.colorPending}">
-							<font color="${idty.detailedDistance.isOutdistanced ? 'DarkRed' : 'blue' }">${idty.percentSentriesReached}% (${idty.detailedDistance.nbSuccess}/${idty.detailedDistance.nbSentries})
-							<br>${LANG['QUALITY_CERTIFIERS']} : <b>${(idty.validBlockStamp) ? ((idty.detailedDistance.nbSuccess/idty.detailedDistance.nbSentries)/xpercent).toFixed(2):`0.00`}</b></font>
-					</td>
-				`:`
-					<td align='center' colspan=2 style="background:#FF0000"><b>${LANG['IDTY_REVOKED']}</b></td>
-				`}
-        <td style="background:#000000">-</td>
-        
-        <!--printer les certifications-->
-        ${idty.pendingCertifications.map( (cert,j)=> `
-          ${ (j<nbMaxCertifs) ? `
-              <td align="center" style="background:${(cert.validBlockStamp) ? color(cert.timestampExpire,sigWindow,250) : '#FF8000'}">
-							${cert.issuerIsSentry ? '<b>':''}
-								<a href="wotex?lg=${MENU_LANG['LG']}${(typeof(help) != 'undefined' && help == 'no') ? '&help=no':''}&to=${cert['from']}&pending=on&mode=undefined">${cert['from']}</a>
-							${cert.issuerIsSentry ? '</b>':''}
-								<br>${LANG['QUALITY']} : <b>${(typeof(membersQualityExt[cert.from])=='undefined' || !cert.validBlockStamp) ? `0.00`:membersQualityExt[cert.from]}</b>
-							<br><b><span data-tip="${LANG['EMITTED_ON']}  ${timestampToDatetime(cert['creationTimestamp'])}">#${cert['blockNumber']}</span></b>
-							<br><span data-tip="${LANG['EXPIRE_TIME']}">${timestampToDatetime(cert.timestampExpire)}</span>
-							${j==(4+idty.pendingCertifications.length-idty.nbValidPendingCert)?'<b>':''}
-							${ ( !cert.validBlockStamp || cert['timestampWritable'] > currentBlockchainTimestamp ) ? `
-								<br><font color="DarkRed">[${ (cert.validBlockStamp) ? timestampToDatetime(cert['timestampWritable']):LANG['INVALID_BLOCKSTAMP']}]</font>
-							` : `
-								<br><font color='green'>[${LANG['SIG_PERIOD_OK']}]</font>
-							`}
-							${j==(4+idty.pendingCertifications.length-idty.nbValidPendingCert)?'</b>':''}
-						</td>
-          `:''}
-        `).join('')}
-      
-      </tr>
-      
-  `).join('')}
-  
-  <tr>
-    <td colspan="${nbMaxCertifs+4}" align="center">
-      ${LANG['LAST_TR1']} : <b>${idtysListFiltered.length}</b> ${LANG['LAST_TR2']}.
-    </td>
-  </tr>
-</table><br>
-
-<hr>
diff --git a/views/wotex.html b/views/wotex.html
deleted file mode 100755
index a697e76a13549e6127f3c8e2c2666e0875fad06b..0000000000000000000000000000000000000000
--- a/views/wotex.html
+++ /dev/null
@@ -1,157 +0,0 @@
-<!-- Inclure l'en-tête commun -->
-${(host.substr(host.length-6,6) == '.onion') ? HTML_TOR_HEAD:HTML_HEAD}
-  <title>${currencyName}-monit : ${MENU_LANG['WOTEX']}</title>
-		<!-- Style css spécifique de wotex -->
-                <style>
-                .sentry {
-                  float: left;
-                  width: 200px;
-                  height: 21px;
-                  overflow: hidden;
-                }
-                .arrow {
-                  width: 50px;
-                }
-                .isMax {
-                  border-right: 1px dashed gray;
-                }
-                .isSentry, .isSentry a {
-                  text-decoration: none;
-                  color: blue;
-                }
-                .isSentry, .isSentry a:visited {
-                  text-decoration: none;
-                  color: blue;
-                }
-                .isPending, .isPending a {
-                  text-decoration: none;
-                  color: orange !important;
-                  font-weight: bold;
-                }
-                .isMember, .isMember a {
-                  text-decoration: none;
-                  color: black !important;
-                }
-                .isNonMember, .isNonMember a {
-                  text-decoration: none;
-                  color: red !important;
-                }
-                .isPendingCert, .isPendingCert a {
-                  text-decoration: none;
-                  color: orange;
-                  font-weight: bold;
-                }
-                .isPending, .isPending a:visited {
-                  text-decoration: none;
-                  color: orange !important;
-                  font-weight: bold;
-                }
-                .isMember, .isMember a:visited {
-                  text-decoration: none;
-                  color: black !important;
-                }
-                .isNonMember, .isNonMember a:visited {
-                  text-decoration: none;
-                  color: red !important;
-                }
-                .isPendingCert, .isPendingCert a:visited {
-                  text-decoration: none;
-                  color: orange;
-                  font-weight: bold;
-                }
-                td {
-                  text-align: center;
-                }
-              </style>
-              <script type="text/javascript">
-              
-                function onLoadedPage() {
-                  var to = decodeURIComponent(querySt("to") || '');
-                  var pending = querySt("pending") == 'on' ? 'checked' : '';
-                  var mode = querySt("mode");
-                  
-                  document.getElementById('to').value = to || '';
-                  if (window.location.search) {
-                    document.getElementById('pending').checked = pending;
-                  } else {
-                    // Default checked
-                    document.getElementById('pending').checked = 'checked';
-                  }
-                  
-                  if (mode == "u2w") {
-                    document.getElementById('modeu2w').checked = 'checked';
-                  } else {
-                    document.getElementById('modew2u').checked = 'checked';
-                  }
-                  
-                  var params = [
-                    "pending=" + (pending == 'checked' ? 'on' : (!window.location.search ? 'on' : '')),
-                    "mode=" + mode
-                  ];
-                  
-                  var links = document.getElementsByTagName('a');
-                  for (var i = 0; i < links.length; i++) {
-                    links[i].href += '&' + params.join('&');                    
-                  }
-                }
-                
-                function querySt(ji) {
-  
-                    var hu = window.location.search.substring(1);
-                    var gy = hu.split("&");
-                
-                    for (i=0;i<gy.length;i++) {
-                        ft = gy[i].split("=");
-                        if (ft[0] == ji) {
-                            return ft[1];
-                        }
-                    }
-                }
-                
-                function resetAll() {
-                  window.location = '/';
-                  return false;
-                }
-              </script>
-</head>
-  <body onload="onLoadedPage()">
-
-    <!-- Afficher le menu -->
-    ${printMenu(MENU_LANG, help, "WOTEX")}
-
-    <!-- Afficher le titre et le formulaire -->
-    <h1>${LANG['TITLE']}</h1>
-              <form method="GET" action="" onreset="resetAll()">
-                <div>
-                  <label for="to">${LANG['TEST_UID']} :</label>
-                  <input type="text" name="to" id="to">
-                  <br>
-                  <input type="checkbox" name="pending" id="pending" checked="checked">
-                  <label for="pending">${LANG['CHECKBOX_PENDING_DATA']}</label>
-                  <br>
-                  <input type="radio" name="mode" id="modew2u" value="w2u" checked="checked">${LANG['MODE_W2U']}</div>
-                  <input type="radio" name="mode" id="modeu2w" value="u2w">${LANG['MODE_U2W']}</div>
-                  <br>
-                  <input type="submit"/>
-                  <input type="reset" value="Reset"/>
-                </div>
-              </form>
-      <hr/>
-      <!-- Afficher la légende -->
-      ${(typeof(help) == 'undefined' || help != 'no') ? `
-      <p>${LANG['LEGEND_TITLE']} :</p>
-
-  <span class="isMember">${LANG['LEGEND_BLACK']}</span></br>
-  <span class="isSentry">${LANG['LEGEND_BLUE']}</span></br>
-	<span class="isPending">${LANG['LEGEND_ORANGE']}</span></br>
-	<span class="isNonMember">${LANG['LEGEND_RED']}</span></br>
-
-      <hr/>
-      `:``}
-    <!-- Afficher tout les plus courts chemins -->
-    ${searchResult}
-    <!-- Afficher les membres référents -->
-    <h2>${LANG['CURRENT_SENTRIES']} :</h2>
-    ${sentriesHTML}
-  </body>
-</html>
\ No newline at end of file