diff --git a/lg/members_en.txt b/lg/members_en.txt
index 84d2f38affce5880c8eaf082d95872f130c96fc6..57165ed491e34a300e22a40555233d0b87057e10 100755
--- a/lg/members_en.txt
+++ b/lg/members_en.txt
@@ -67,4 +67,7 @@ NEXT_YN Feign the following Y[n] landing
 MEMBER_FILTER search a member
 EXPIRE_TIME expiration datetime
 RANDOM_LIST Draw lots
-MEMBERS members
\ No newline at end of file
+RANDOM_LIST_END membres (max. 100)
+MEMBERS members
+UID_OR_PUB_LIST Whose pseudo or key contains
+UID_OR_PUB_LIST_END (3 chars. min.)
diff --git a/lg/members_fr.txt b/lg/members_fr.txt
index 5a13228d6573952715dd1a83e33b72894b36d739..3843d5a52dad7a2558fa09b7dbe0d0309b0aa7cc 100755
--- a/lg/members_fr.txt
+++ b/lg/members_fr.txt
@@ -67,4 +67,7 @@ NEXT_YN Simuler le palier Y[n] suivant
 MEMBER_FILTER rechercher un membre
 EXPIRE_TIME date et heure d'expiration
 RANDOM_LIST Tirer au sort
-MEMBERS membres
\ No newline at end of file
+RANDOM_LIST_END membres (max. 100)
+MEMBERS membres
+UID_OR_PUB_LIST Dont le pseudo ou la clé contient
+UID_OR_PUB_LIST_END (3 car. min.)
diff --git a/lib/constants2.ts b/lib/constants2.ts
index 80530f207c94cd82bcc138b4b859b3efb393b4af..32ddf69e2e45554303807dadf8a81821a2c45f31 100755
--- a/lib/constants2.ts
+++ b/lib/constants2.ts
@@ -13,5 +13,9 @@ export const MonitConstants = {
     INIT: 2,
     GET_SENTRIES_COUNT: 3,
     GET_D_SEN: 3
-  }
+  },
+  MEMBERS_VIEW: {
+    DEFAULT_MEMBERS_RANDOM_NUMBER: 10,
+    MEMBERS_DISPLAY_MAX: 100,
+  },
 };
diff --git a/routes/members2.ts b/routes/members2.ts
index aa761d5a556d0584001ba5bb87149b754452c3e3..84923a90cb422238c21d996f011e702842c3a937 100755
--- a/routes/members2.ts
+++ b/routes/members2.ts
@@ -69,15 +69,36 @@ module.exports = async (req: any, res: any, next: any) => {
 	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
+    let uidOrPubList = req.query.uidOrPubList === 'yes';
+    let uidOrPubValue = req.query.uidOrPubValue;
 	let nextYn = (req.query.nextYn=="yes") ? "yes":"no";
-	let randomList = (req.query.randomList=="yes") ? "yes":"no";
-	let numberOfRandomMembers = req.query.randomCounts || 10
+	let randomList = req.query.randomList === 'no' ? 'no' : 'yes';
+	let numberOfRandomMembers = parseInt(req.query.randomCounts) || MonitConstants.MEMBERS_VIEW.DEFAULT_MEMBERS_RANDOM_NUMBER
+
+		// Recherche aléatoire
+		if (randomList === 'yes') {
+			if (isNaN(numberOfRandomMembers)) {
+				numberOfRandomMembers = MonitConstants.MEMBERS_VIEW.DEFAULT_MEMBERS_RANDOM_NUMBER
+			}
+			numberOfRandomMembers = Math.min(numberOfRandomMembers, MonitConstants.MEMBERS_VIEW.MEMBERS_DISPLAY_MAX)
+		}
+
 
 	// Vérifier la valeur de nextYn dans le cache
 	let lastUpgradeTimeDatas = membersQuality(MonitConstants.QUALITY_CACHE_ACTION.INIT);
 	let dSenCache = membersQuality(MonitConstants.QUALITY_CACHE_ACTION.GET_D_SEN);
 	if (lastUpgradeTimeDatas > 0 && dSenCache > dSen) { previousNextYn == "yes"; }
-    
+
+    // Recherche par pseudo/pubkey
+    if (uidOrPubList) {
+      // UID/PUB > random
+      randomList = 'no'
+      if (!uidOrPubValue || uidOrPubValue.length < 3) {
+        // Recherche trop large
+        uidOrPubList = false
+        randomList = 'yes' // A la place
+      }
+    }
     // Alimenter wotb avec la toile actuelle
 	const wotbInstance = duniterServer.dal.wotb;
 		
@@ -85,7 +106,8 @@ module.exports = async (req: any, res: any, next: any) => {
 	let reinitCache = (Math.floor(Date.now() / 1000) > (membersLastUptime + MonitConstants.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 || previousRandomList != randomList || numberOfRandomMembers != previousRandomCounts)
+		// Si recherche par UID ou pubkey => recharger systématiquement
+		if (uidOrPubList || previousMode != mode || previousCentrality != centrality || previousNextYn != nextYn || previousRandomList != randomList || numberOfRandomMembers != previousRandomCounts)
 		{
 			if (!lockMembers)
 			{
@@ -175,6 +197,12 @@ module.exports = async (req: any, res: any, next: any) => {
 				}
 				membersList = randomMembers
 			}
+			else if (uidOrPubList) {
+				// Rerchercher les membres qui matchent par l'UID ou la pubkey
+				membersList = membersList.filter(m => {
+					return m.uid.toLocaleLowerCase().includes(uidOrPubValue) || m.pub.toLocaleLowerCase().includes(uidOrPubValue)
+				})
+			}
     
 			// 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
@@ -581,7 +609,9 @@ module.exports = async (req: any, res: any, next: any) => {
 				// get parameters
         		days, mode, sort_by, order,
 				pendingSigs, centrality, nextYn,
-				numberOfRandomMembers, randomList,
+				numberOfRandomMembers: numberOfRandomMembers, randomList,
+				// Formulaire de recherche par UID ou PUB
+				uidOrPubList, uidOrPubValue,
 				
 				// page data
         		currentBlockchainTimestamp,
diff --git a/views/members.html b/views/members.html
index 462045c5c590858926962919ed65c154f8b0655a..ace782a41130bdaa4eabc2074727052aef6e73dc 100755
--- a/views/members.html
+++ b/views/members.html
@@ -47,8 +47,10 @@ ${printMenu(MENU_LANG, help, "MEMBERS")}
 <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>
-<input type="checkbox" name="randomList" value="yes" ${randomList == 'yes' ? 'checked' : ''}> ${LANG["RANDOM_LIST"]} 
-<input type="number" name="randomCounts" value="${numberOfRandomMembers}"/> ${LANG["MEMBERS"]}.<br>
+<input type="checkbox" name="randomList" value="yes" ${randomList == 'yes' ? 'checked' : ''}> ${LANG["RANDOM_LIST"]}
+<input type="number" name="randomCounts" value="${numberOfRandomMembers}"/> ${LANG["RANDOM_LIST_END"]}.<br>
+<input type="checkbox" name="uidOrPubList" value="yes" ${uidOrPubList ? 'checked' : ''}> ${LANG["UID_OR_PUB_LIST"]}
+<input type="search" name="uidOrPubValue" value="${uidOrPubValue || ''}"/> ${LANG["UID_OR_PUB_LIST_END"]}.<br>
 <hr>
 
 <!-- Afficher la légende et l'aide -->