diff --git a/src/ldap/export/group.ts b/src/ldap/export/group.ts
index 4a2652c1971e72e551d132e6958fce7a711a505b..2fb7c682f40333cc45a09cbbab8a4ae776402798 100644
--- a/src/ldap/export/group.ts
+++ b/src/ldap/export/group.ts
@@ -198,7 +198,6 @@ export class Group {
         
         // Certains champs nécessitent de petits calculs
         let vals2={};
-
         // ?!
         vals2[ldapConfig.group['password']] = "{CRYPT}"+data['password'];
 
@@ -211,17 +210,15 @@ export class Group {
         }
 
         // Inscription des valeurs calculées par effet de bord
-        if (!await Basics.change("group", gid, "add", vals2)) {
-            throw "Erreur lors de l'ajout des valeurs intelligentes du nouveau groupe.";
-        }
+        if (!await Basics.change("group", gid, "add", vals2)) throw "Erreur lors de l'ajout des valeurs intelligentes du nouveau groupe.";
 
         ["posixGroup", "brGroup"].forEach(cst => {
             let vals3={};
             vals3[ldapConfig.group['classes']]=cst;
             Basics.change("group", gid, "add", vals3).then(res => {
                 if (!res) throw "Erreur lors de l'ajout des valeurs constantes du nouveau groupe.";
-            });         });
-
+            });
+        });
         // Ajout groupes parents et fils
         for (let rel of ["childs","parents"]) {
             data[rel].forEach(gid => {
@@ -231,7 +228,6 @@ export class Group {
                 });
             });
         }
-
         // Utilisation des fonctions adaptées pour assurer la cohérence de l'ensemble
         for (let cat of categories) {
             for (let uid of data[cat]) Tools.add(uid, gid, cat).then(res => {
diff --git a/src/ldap/internal/config.ts b/src/ldap/internal/config.ts
index 3b00495644370c4c05267190703c4a55afb2af8d..3ee7a9b97c7c0cf89b7efdba9548273dbe3badd2 100644
--- a/src/ldap/internal/config.ts
+++ b/src/ldap/internal/config.ts
@@ -98,7 +98,6 @@ export class userData extends partUserData {
  * @var {string?} site - Site web du groupe (URL)
  * @var {string} category - Statut du groupe ; binet, section sportive... (actuellement juste 'binet' ou 'free')
  * @var {string[]} parents - Liste des groupes directement parents de celui-ci
- * @var {string[]} childs - Liste des groupes directement enfants de celui-ci
  * @var {string[]} admins - Liste des admins du groupe
  * @var {string[]} speakers - Liste des porte-parole du groupe
  * @var {string[]} members - Liste des membres du groupe
@@ -113,7 +112,6 @@ export class groupData {
     site?: string;
 	category: string;
     parents: string[] = [];
-    //childs: string[] = [];
     admins: string[] = [];
     speakers: string[] = [];
     members: string[] = [];
diff --git a/src/ldap/internal/tools.ts b/src/ldap/internal/tools.ts
index 2500bbc88851f600fdc6f6f60ca6e7c5f1ac2bba..007aec83c5e49d6879bdcfaedf84d604d330ff07 100644
--- a/src/ldap/internal/tools.ts
+++ b/src/ldap/internal/tools.ts
@@ -85,7 +85,7 @@ export class Tools {
                     // Escape user input
                     val = ldapEscape.filter("${fil}", { fil: val });
                     // Gestion des dns
-                    if (categories.concat(["parents", "child"]).includes(attribute)) {
+                    if (categories.concat(["parents"]).includes(attribute)) {
                         if (domain == "group")  var id = ldapConfig.group.gid;
                         else                    var id = ldapConfig.user.uid;
                         val = id + '=' + val + ',' + ldapConfig[domain].dn;
@@ -122,8 +122,7 @@ export class Tools {
         let dirtyData = {};
         Object.keys(data).forEach(function(key: string) {
             // Some values edit can't change
-            if (![  'admins','speakers','members','followers',
-                    'directory','classes','id','cleanFullName'].includes(key)) dirtyData[dirtyKeys.key]=data[key];
+            if (!categories.concat(['directory','classes','id','cleanFullName']).includes(key)) dirtyData[dirtyKeys.key]=data[key];
         });
         return Basics.change(domain, id, "replace", dirtyData);
     }
@@ -221,22 +220,26 @@ export class Tools {
      * @static
      */
     static async addDFS(uid: string, gid: string, direction: boolean): Promise<boolean> {
+        // Classic DFS
+        var to_visit = [gid];
         // Cas récursif ascendant (admins)
-        if (direction) {
-            var rol = "admins";
-            var tov = ldapConfig.group.childs;
-        }
+        var rol = "admins";
+        async function next_visit(cur_gid) { to_visit.concat(await Basics.searchSingle("group", ldapConfig.group.gid, null, "parents="+cur_gid)); }
         // Cas récursif descendant (membres)
-        else {
+        if (!direction) {
             var rol = "members";
-            var tov = ldapConfig.group.parents;
+            async function next_visit(cur_gid) {
+                // Lecture du champ parents
+                let dns = await Basics.searchSingle("group", ldapConfig.group.parents, cur_gid);
+                // Reformattage DNs en gids de groupes
+                dns.map(dn => dn.split(',')[0].split('=')[1]);
+                to_visit.concat(dns);
+            }
         }
-        // Classic DFS
-        var to_visit = [gid];
         while (to_visit.length > 0) {
             let cur_gid = to_visit.pop();
             Tools.addIfAbsent(uid, "user", cur_gid, "group", rol);
-            to_visit.concat(await Basics.searchSingle("group", tov, cur_gid));
+            await next_visit(cur_gid);
         }
         return true;
     }
@@ -351,27 +354,31 @@ export class Tools {
      * @static
      */
     static async remDFS(uid: string, gid: string, direction: boolean): Promise<boolean> {
+        // Classic DFS
+        var to_visit = [gid];
         // Cas récursif ascendant (admins)
-        if (direction) {
-            var rol = "admins";
-            var tov = ldapConfig.group.childs;
-            var checks = ["admins"];
-        }
-        // Cas récursif descendant (members)
-        else {
-            var rol = "members";
-            var tov = ldapConfig.group.parents;
+        var checks = ["admins"];
+        // Recherche des groupes avec parents qui correspondent (efficace car index)
+        async function next_visit(cur_gid) { to_visit.concat(await Basics.searchSingle("group", ldapConfig.group.gid, null, "parents="+cur_gid)); }
+        // Cas récursif descendant (membres)
+        if (!direction) {
             var checks = ["admins","speakers","members"];
+            async function next_visit(cur_gid) {
+                // Lecture du champ parents
+                let dns = await Basics.searchSingle("group", ldapConfig.group.parents, cur_gid);
+                // Reformattage des dns en gids
+                dns.map(dn => dn.split(',')[0].split('=')[1]);
+                to_visit.concat(dns);
+            }
         }
-        // Classic DFS
-        var to_visit = [gid];
+        var rol = checks[checks.length-1];
         while (to_visit.length > 0) {
             let cur_gid = to_visit.pop();
             // Si le statut de uid dans cur_gid est un statut strict on arrête de boucler
-            for (let cat of checks) if ((await Tools.get(gid, "group", cat)).includes(uid)) continue;
+            for (let cat of checks) if ((await Tools.get(cur_gid, "group", cat)).includes(uid)) continue;
             // Sinon on le tue et on boucle
             Tools.remIfPresent(uid, "user", cur_gid, "group", rol);
-            to_visit.concat(await Basics.searchSingle("group", tov, cur_gid));
+            await next_visit(cur_gid);
         }
         return true;
     }