diff --git a/mysql.js b/mysql.js
index 13f8f840a70a778912e0e5d2621554fe85965800..e1b3dd3574d2702e6652439f8ebd84dedad94590 100644
--- a/mysql.js
+++ b/mysql.js
@@ -109,7 +109,7 @@ function removeAllGroups(chatId) {
     DELETE FROM groups WHERE chatId = ${chatId}`)
 }
 
-function getGroups(chatId) {
+function getCompos(chatId) {
     return query(`
     SELECT grp
     FROM groups
@@ -128,4 +128,4 @@ function getSchedules() {
 }
 
 
-module.exports = { query, getChanByChatId, createChan, deleteChanByChatId, modifyChan, getChanByState, addGroup, removeGroup, removeAllGroups, getGroups, getSchedules };
\ No newline at end of file
+module.exports = { query, getChanByChatId, createChan, deleteChanByChatId, modifyChan, getChanByState, addGroup, removeGroup, removeAllGroups, getCompos, getSchedules };
\ No newline at end of file
diff --git a/requests.js b/requests.js
index 2f7c09988a40129fa320a5249e7d3cb47b216426..1c21c9465518a0e8ef3217dda06be5215dc1bdb8 100644
--- a/requests.js
+++ b/requests.js
@@ -21,8 +21,8 @@ async function sendRequest(req, chan) {
             json: true
         }
         const url = 'https://gateway.linkcs.fr/v1/graphql';
-    
-        return rp(`${url}?query=${req}`, options)    
+
+        return rp(`${url}?query=${req}`, options)
     })
 }
 
@@ -46,7 +46,7 @@ function getBirthdays(chan) {
 
 // Récupération de la recherche de groupe
 function searchGroups(chan, term) {
-    const req = `query {searchAssociations(term: "${term}") {id name code}}`
+    const req = `query {searchAssociations(term: "${term}") {name code compositions { id label beginningDate}}}`
     return sendRequest(req, chan).then(body => {
         if (!body.data) return;
         return body.data.searchAssociations;
@@ -62,6 +62,24 @@ function getGroupById(chan, id) {
     }).catch(err => { console.error(err) })
 }
 
+function getCompoGroupById(chan, id) {
+    const req = `query {composition(id: ${id}) {id label beginningDate association {id name}}}`
+    return sendRequest(req, chan).then(body => {
+        if (!body.data) return;
+        return {
+            compo: {
+                name: body.data.composition.label,
+                id: body.data.composition.id,
+                beginningDate: body.data.composition.beginningDate
+            },
+            group: {
+                name: body.data.composition.association.name,
+                id: body.data.composition.association.id
+            }
+        };
+    }).catch(err => { console.error(err) })
+}
+
 
 function getMe(chan) {
     return getNewTokenIfNecessary(chan).then(chan => {
@@ -69,8 +87,8 @@ function getMe(chan) {
             headers: { 'Authorization': `Bearer ${chan.token}` },
             json: true
         }
-    
-        return rp('https://auth.viarezo.fr/api/user/show/me', options)    
+
+        return rp('https://auth.viarezo.fr/api/user/show/me', options)
     })
 }
 
@@ -133,11 +151,11 @@ function getNewToken(chan) {
 
 // Récupère un nouveau token que si besoin
 function getNewTokenIfNecessary(chan) {
-    if (chan.expiration*1000 < Date.now()) {
+    if (chan.expiration * 1000 < Date.now()) {
         return getNewToken(chan)
     } else {
         return Promise.resolve(chan)
     }
 }
 
-module.exports = { getBirthdays, sendRequest, searchGroups, getGroupById, getMe, getFirstToken, getNewToken };
\ No newline at end of file
+module.exports = { getBirthdays, sendRequest, searchGroups, getGroupById, getCompoGroupById, getMe, getFirstToken, getNewToken };
\ No newline at end of file
diff --git a/schedule.js b/schedule.js
index 378607fd51338134ba0cf7757f642c7c88806a55..2dff4ca43b9e03fec32cc60290092d8b1e887d4d 100644
--- a/schedule.js
+++ b/schedule.js
@@ -4,7 +4,7 @@
 var schedule = require('node-schedule');
 
 // Modules propres
-var { modifyChan, getGroups } = require('./mysql');
+var { modifyChan, getCompos } = require('./mysql');
 var { getBirthdays, getNewToken } = require('./requests');
 
 // Création de variables
@@ -20,7 +20,7 @@ function addSchedule(chan, time, bot) {
             return getNewToken(chan).then(chan => {
                 return Promise.all([
                     getBirthdays(chan),
-                    getGroups(chan.chatId)
+                    getCompos(chan.chatId)
                 ])
             }).then(([users, groups]) => {
                 // récupère que les personnes du jour qui font partie des groupes ciblés
diff --git a/telegram.js b/telegram.js
index 568d96a5e0f64b51f83755e108df4b752c7ba787..39f9de160d030b93cc8b8af674b36e961c0ab3c5 100644
--- a/telegram.js
+++ b/telegram.js
@@ -6,8 +6,8 @@ process.env["NTBA_FIX_319"] = 1;
 var TelegramBot = require('node-telegram-bot-api');
 
 // Modules propres
-var { getChanByChatId, createChan, deleteChanByChatId, modifyChan, addGroup, removeGroup, removeAllGroups, getGroups } = require('./mysql');
-var { getBirthdays, searchGroups, getGroupById, getMe } = require('./requests');
+var { getChanByChatId, createChan, deleteChanByChatId, modifyChan, addGroup, removeGroup, removeAllGroups, getCompos } = require('./mysql');
+var { getBirthdays, searchGroups, getCompoGroupById, getMe } = require('./requests');
 var { schedules, addSchedule, deleteSchedule } = require('./schedule');
 
 // Configurations
@@ -115,7 +115,7 @@ bot.onText(/\/birthdays/, msg => {
     getChanByChatId(chatId).then(chan => {
         return Promise.all([
             getBirthdays(chan),
-            getGroups(chatId),
+            getCompos(chatId),
         ])
     }).then(([users, groups]) => {
         // récupère que les personnes du jour qui font partie des groupes ciblés
@@ -142,7 +142,15 @@ bot.onText(new RegExp(`/search (.+)|/search@${config.telegram.name} (.+)`), (msg
         if (groups.length == 20) resp += 'La recherche est limitée à 20 choix.'
         resp += '\n\n'
         groups.forEach(group => {
-            resp += `<a href="https://linkcs.fr/association/${group.code}">${group.name}</a> (id : ${group.id})\n`
+            resp += `<a href="https://linkcs.fr/association/${group.code}">${group.name}</a>\n`;
+            group.compositions.sort((compo1, compo2) => Date.parse(compo1.beginningDate) - Date.parse(compo2.beginningDate));
+            group.compositions.forEach((compo, index, array) => {
+                if (index !== array.length - 1) {
+                    resp += `├ ${compo.label} (id : ${compo.id})\n`
+                } else {
+                    resp += `└ ${compo.label} (id : ${compo.id})\n`
+                }
+            })
         })
         bot.sendMessage(chatId, resp, { parse_mode: 'HTML' });
     });
@@ -154,18 +162,18 @@ bot.onText(new RegExp(`/add (.+)|/add@${config.telegram.name} (.+)`), (msg, matc
     getChanByChatId(chatId).then(chan => {
         const id = parseInt(match[0].split(' ')[1]);
         return Promise.all([
-            getGroupById(chan, id),
-            getGroups(chatId),
+            getCompoGroupById(chan, id),
+            getCompos(chatId),
             id
         ]);
-    }).then(([group, groups, id]) => {
+    }).then(([cg, groups, id]) => {
         // si pas de groupe trouvé
-        if (!group) return bot.sendMessage(chatId, 'Pas de groupe trouvé ayant cette ID');
+        if (!cg) return bot.sendMessage(chatId, 'Pas de composition trouvé ayant cette ID');
         // si le groupe y est déjà
-        if (groups.indexOf(id) !== -1) return bot.sendMessage(chatId, 'Ce groupe est déjà est dans votre liste d\'anniversaire.');
+        if (groups.indexOf(id) !== -1) return bot.sendMessage(chatId, 'Cette composition est déjà est dans votre liste d\'anniversaire.');
         // sinon on le rajoute
         return addGroup(chatId, id).then(_ => {
-            bot.sendMessage(chatId, `Ajout du groupe \`${group}\` à la liste des anniversaires.`, { parse_mode: 'Markdown' });
+            bot.sendMessage(chatId, `Ajout de la composition \`${cg.compo.name}\` du groupe \`${cg.group.name}\` à la liste des anniversaires.`, { parse_mode: 'Markdown' });
         })
     })
 })
@@ -175,18 +183,18 @@ bot.onText(new RegExp(`/del (.+)|/del@${config.telegram.name} (.+)`), (msg, matc
     getChanByChatId(chatId).then(chan => {
         const id = parseInt(match[0].split(' ')[1]);
         return Promise.all([
-            getGroupById(chan, id),
-            getGroups(chatId),
+            getCompoGroupById(chan, id),
+            getCompos(chatId),
             id
         ]);
-    }).then(([group, groups, id]) => {
+    }).then(([cg, groups, id]) => {
         // si pas de groupe trouvé
-        if (!group) return bot.sendMessage(chatId, 'Pas de groupe trouvé ayant cette ID');
+        if (!cg) return bot.sendMessage(chatId, 'Pas de composition trouvé ayant cette ID');
         // si le groupe y est déjà
-        if (groups.indexOf(id) === -1) return bot.sendMessage(chatId, 'Ce groupe n\'est pas dans votre liste d\'anniversaire.');
+        if (groups.indexOf(id) === -1) return bot.sendMessage(chatId, 'Cette composition n\'est pas dans votre liste d\'anniversaire.');
         // sinon on le rajoute
         return removeGroup(chatId, id).then(_ => {
-            bot.sendMessage(chatId, `Retrait du groupe \`${group}\` de la liste des anniversaires.`, { parse_mode: 'Markdown' });
+            bot.sendMessage(chatId, `Retrait de la composition \`${cg.compo.name}\` du groupe \`${cg.group.name}\` à la liste des anniversaires.`, { parse_mode: 'Markdown' });
         })
     })
 })
@@ -230,11 +238,19 @@ bot.onText(/\/info/, msg => {
         if (chan.token.length === 0) return bot.sendMessage(chatId, `Une demande de connexion a été faite par @${chan.username} mais n'a toujours pas été acceptée.\n${config.website.protocol}://${config.website.hostname}/?state=${chan.state}`);
         return Promise.all([
             getMe(chan),
-            getGroups(chan.chatId),
-            getGroups(chan.chatId).then(groups => {
-                return Promise.all(groups.map(group => getGroupById(chan, group)))
+            getCompos(chan.chatId),
+            getCompos(chan.chatId).then(groups => {
+                return Promise.all(groups.map(group => getCompoGroupById(chan, group)))
+            })
+        ]).then(([me, groups, cgs]) => {
+            groups = {}
+            cgs.forEach(cg => {
+                if (!groups[cg.group.id]) {
+                    groups[cg.group.id] = { name: cg.group.name, compo: [] };
+                }
+                groups[cg.group.id].compo.push(cg.compo)
             })
-        ]).then(([me, groups, names]) => {
+
             // affiche qui s'est connecté
             var msg = `${me.firstName} ${me.lastName} (@${chan.username}) s'est connecté à l'OAuth.\n\n`;
 
@@ -249,13 +265,22 @@ bot.onText(/\/info/, msg => {
 
             // affiche la liste des associations à souhait
             if (groups.length === 0) {
-                msg += 'La liste des associations / groupes est vide.\n';
+                msg += 'La liste des compositions est vide.\n';
                 msg += 'Vous pouvez en chercher via /search sonNom, puis faire un /add sonID\n'
             } else {
-                msg += `Les personnes faisant parti de ces associations / groupes auront leur anniversaire rapellé :\n`;
-                for (i = 0; i < groups.length; i++) {
-                    msg += ` • ${names[i]} (id : ${groups[i]})\n`
-                }
+                msg += `Les personnes faisant parti de ces compositions auront leur anniversaire rapellé :\n`;
+                Object.keys(groups).forEach(key => {
+                    msg += `${groups[key].name}\n`
+                    groups[key].compo.sort((compo1, compo2) => Date.parse(compo1.beginningDate) - Date.parse(compo2.beginningDate));
+                    groups[key].compo.forEach((compo, index, array) => {
+                        if (index !== array.length - 1) {
+                            msg += `├ ${compo.name} (id : ${compo.id})\n`
+                        } else {
+                            msg += `└ ${compo.name} (id : ${compo.id})\n`
+                        }
+                    })
+
+                });
             }
             bot.sendMessage(chatId, msg);
         })