diff --git a/src/graphql/connectors/groupModel.ts b/src/graphql/connectors/groupModel.ts
index cccc616c1336a140905063a4dbd0157e8444a76f..37b35654aa4cf700bc3eb7fab66d309753594da0 100644
--- a/src/graphql/connectors/groupModel.ts
+++ b/src/graphql/connectors/groupModel.ts
@@ -146,6 +146,7 @@ export class GroupModel {
      * @rights viewer du groupe
      */
     async likeGroup(gid: string): Promise<boolean> {
+        // Pour l'instant, ce n'est pas a implémenter...
         throw "Not implemented";
     }
 
@@ -159,6 +160,7 @@ export class GroupModel {
      * @rights viewer du groupe
      */
     async unlikeGroup(gid: string): Promise<boolean> {
+        // Pour l'instant, ce n'est pas a implémenter...
         throw "Not implemented";
     }
 
diff --git a/src/graphql/connectors/messageModel.ts b/src/graphql/connectors/messageModel.ts
index bfb9070ba7931ac8b75414461dd260d1fa2b9f74..79d9525f8450829261a289cd17df2a543eafc0ce 100644
--- a/src/graphql/connectors/messageModel.ts
+++ b/src/graphql/connectors/messageModel.ts
@@ -189,6 +189,34 @@ export class MessageModel {
         throw "Not implemented";
     }
 
+    /**
+     * @memberof GraphQL.MessageModel#
+     * @function groupParticipate
+     * @summary Fonction pour participer a un evenement.
+     * @arg {string} gid - Identifiant du groupe.
+     * @arg {number} forEvent - Identifiant de l'évenement.
+     * @return {Promise(boolean)} Renvoie true si modification réussie
+     * @async
+     * @rights member d'un groupe author ou recipient
+     */
+    async groupParticipate(gid: string, forEvent: number): Promise<boolean> {
+        throw "Not implemented";
+    }
+
+    /**
+     * @memberof GraphQL.MessageModel#
+     * @function groupUnparticipate
+     * @summary Fonction pour ne plus participer a un evenement.
+     * @arg {string} gid - Identifiant du groupe.
+     * @arg {number} forEvent - Identifiant de l'évenement.
+     * @return {Promise(boolean)} Renvoie true si modification réussie
+     * @async
+     * @rights member d'un groupe author ou recipient
+     */
+    async groupUnparticipate(gid: string, forEvent: number): Promise<boolean> {
+        throw "Not implemented";
+    }
+
     /**
      * @memberof GraphQL.MessageModel#
      * @function createQuestion
diff --git a/src/graphql/connectors/requestModel.ts b/src/graphql/connectors/requestModel.ts
index 5435ae0584afc1891826edd600b52a0801ec1d91..e8ea6c0736ed048ea4f1bd2d02175d2ab9d489a5 100644
--- a/src/graphql/connectors/requestModel.ts
+++ b/src/graphql/connectors/requestModel.ts
@@ -202,6 +202,7 @@ export class RequestModel {
      * @rights admin du groupe destinataire
      */
     async acceptUserJoinRequest(req: UserJoinGroup, comment: string): Promise<boolean> {
+        //"comment" a envoyer par mail automatique
         throw "Not implemented";
     }
 
@@ -216,6 +217,7 @@ export class RequestModel {
      * @rights admin du groupe destinataire
      */
     async refuseUserJoinRequest(req: UserJoinGroup, comment: string): Promise<boolean> {
+        //"comment" a envoyer par mail automatique
         throw "Not implemented";
     }
 
@@ -230,6 +232,7 @@ export class RequestModel {
      * @rights admin du groupe destinataire
      */
     async acceptGroupJoinRequest(req: GroupJoinMetagroup, comment: string): Promise<boolean> {
+        //"comment" a envoyer par mail automatique
         throw "Not implemented";
     }
 
@@ -244,6 +247,7 @@ export class RequestModel {
      * @rights admin du groupe destinataire
      */
     async refuseGroupJoinRequest(req: GroupJoinMetagroup, comment: string): Promise<boolean> {
+        //"comment" a envoyer par mail automatique
         throw "Not implemented";
     }
 
@@ -258,6 +262,7 @@ export class RequestModel {
      * @rights admin du groupe destinataire
      */
     async acceptGroupCoauthorEventRequest(req: GroupCoauthorEvent, comment: string): Promise<boolean> {
+        //"comment" a envoyer par mail automatique
         throw "Not implemented";
 
         /*let request = await knex('group_join_event').select().where('id', requestID);
@@ -286,6 +291,7 @@ export class RequestModel {
      * @rights admin du groupe destinataire
      */
     async refuseGroupCoauthorEventRequest(req: GroupCoauthorEvent, comment: string): Promise<boolean> {
+        //"comment" a envoyer par mail automatique
         throw "Not implemented";
 
         /*await knex('group_join_event').where('id', requestID).del();
diff --git a/src/graphql/resolvers.ts b/src/graphql/resolvers.ts
index 5fa111621c73cab2114c93e384c86b47acfc5e07..4951b0bcb393a2d16130a4dc98e74223bc77f994 100644
--- a/src/graphql/resolvers.ts
+++ b/src/graphql/resolvers.ts
@@ -364,6 +364,22 @@ export const resolvers = {
             throw new AuthenticationError("Not a speaker");
         },
 
+        // @rights speaker
+        groupParticipate: async function (root, args, context: Context): Promise<boolean> {
+            if (context.models.auth.isSpeaker(args.gid)) {
+                return context.models.message.groupParticipate(args.gid, args.forEvent);
+            }
+            throw new AuthenticationError("Not a speaker");
+        },
+
+        // @rights speaker
+        groupUnparticipate: async function (root, args, context: Context): Promise<boolean> {
+            if (context.models.auth.isSpeaker(args.gid)) {
+                return context.models.message.groupUnparticipate(args.gid, args.forEvent);
+            }
+            throw new AuthenticationError("Not a speaker");
+        },
+
         // @rights speaker du groupe émetteur
         groupRequestCoauthorEvent: async function (root, args, context: Context): Promise<GroupCoauthorEvent> {
             if (context.models.auth.isSpeaker(args.fromGroup)) {
@@ -564,6 +580,7 @@ export const resolvers = {
 
         // @rights admin du groupe destinataire
         acceptGroupCoauthorEventRequest: async function (root, args, context: Context): Promise<boolean> {
+            // Pour l'instant, ce n'est pas a implémenter...
             let req = await GroupCoauthorEvent.tryCreate(args.request);
             throw "Not implemented";
             //TODO : Vérifier les autorisations
@@ -574,6 +591,7 @@ export const resolvers = {
 
         // @rights admin du groupe destinataire
         refuseGroupCoauthorEventRequest: async function (root, args, context: Context): Promise<boolean> {
+            // Pour l'instant, ce n'est pas a implémenter...
             let req = await GroupCoauthorEvent.tryCreate(args.request);
             throw "Not implemented";
             //TODO : Vérifier les autorisations
@@ -606,7 +624,7 @@ export const resolvers = {
             throw new AuthenticationError("Not an admin");
         },
 
-        // @rights admin du groupe
+        // @rights admin d'un groupe author
         censorAnnouncement: async function (root, args, context: Context): Promise<boolean> {
             throw "Not implemented";
             //TODO : Vérifier les autorisations
@@ -614,7 +632,7 @@ export const resolvers = {
             throw new AuthenticationError("Not an admin");
         },
 
-        // @rights admin du groupe
+        // @rights admin d'un groupe author
         censorEvent: async function (root, args, context: Context): Promise<boolean> {
             throw "Not implemented";
             //TODO : Vérifier les autorisations
diff --git a/src/graphql/typeDefs/actions.graphql b/src/graphql/typeDefs/actions.graphql
index 42395a204c51cd0b881e99bacd1e2a710b7337b1..9deef7c3d4d7179b2ae736e0b89c1ff7502f91dd 100644
--- a/src/graphql/typeDefs/actions.graphql
+++ b/src/graphql/typeDefs/actions.graphql
@@ -13,7 +13,6 @@ type Query {
     metaGroup(gid:ID!): MetaGroup
 
     # Message queries de base
-    #message(mid:ID!): Message
     announcement(mid:ID!): Announcement
     event(mid:ID!): Event
     privatePost(mid:ID!): PrivatePost
@@ -21,7 +20,6 @@ type Query {
     answer(mid:ID!): Answer
 
     # Request queries de base
-    #request(rid:ID!): Request
     userJoinGroupRequest(rid:ID!): UserJoinGroup
     groupJoinMetagroupRequest(rid:ID!): GroupJoinMetagroup
     groupCoauthorEventRequest(rid:ID!): GroupCoauthorEvent
@@ -36,15 +34,6 @@ type Query {
     allGroups: [Group]
     allSimpleGroups: [SimpleGroup]
 
-
-    # Toutes les Requests auxquelles un groupe doit répondre
-    requestsToGroup(gid:ID!): [Request]
-    userJoinGroupRequestsToGroup(gid:ID!): [UserJoinGroup]
-    groupJoinMetagroupRequestsToGroup(gid:ID!): [GroupJoinMetagroup]
-    groupCoauthorEventRequestsToGroup(gid:ID!): [GroupCoauthorEvent]
-
-
-
     # TOL
     searchTOL(
         givenName: String,
@@ -167,6 +156,9 @@ type Mutation {
     # Speaker mutations
     writePostsSummary(forGroup: ID!, content: String): Boolean
 
+    groupParticipate(gid: ID!, forEvent: ID!): Boolean
+    groupUnparticipate(gid: ID!, forEvent: ID!): Boolean
+
     groupRequestCoauthorEvent(
         fromGroup: ID!, 
         toGroup: ID!, 
diff --git a/src/graphql/typeDefs/objects.graphql b/src/graphql/typeDefs/objects.graphql
index 05dc650ace078ee2a511d782b3577da4ae19d9de..e304fe2b6b8d30ed3d48aaef354a513eb6bf3252 100644
--- a/src/graphql/typeDefs/objects.graphql
+++ b/src/graphql/typeDefs/objects.graphql
@@ -76,13 +76,24 @@ interface Group {
     answers: [Answer] # permet d'obtenir les questions qui ont eu une réponse
     
     # Activité interne
-    announcementsFromGroup: [Announcement] # annonces écrites par le groupe
+    # Viewer pour voir les events/annonces adressés au groupe
     announcementsToGroup: [Announcement] # annonces adressées au groupe
-    eventsFromGroup: [Event]
     eventsToGroup: [Event]
+
+    # Member pour voir les events/annonces créés par le groupe
+    announcementsFromGroup: [Announcement] # annonces écrites par le groupe
+    eventsFromGroup: [Event]
+    
+    # Member pour voir les posts privés
     privatePosts: [PrivatePost]
     postsSummary: String # récapitulatif de l'activité interne du groupe, en markdown
 
+    # Toutes les Requests auxquelles un groupe doit répondre (admin)
+    requestsToGroup: [Request]
+    userJoinGroupRequestsToGroup: [UserJoinGroup]
+    groupJoinMetagroupRequestsToGroup: [GroupJoinMetagroup]
+    groupCoauthorEventRequestsToGroup: [GroupCoauthorEvent]
+
     # Graphe organique
     visibilityEdges: [Group] # se rendre visible par des groupes en plus du graphe organique
 }
@@ -109,12 +120,23 @@ type SimpleGroup implements Group {
     answers: [Answer] # permet d'obtenir les questions qui ont eu une réponse
     
     # Activité interne
-    announcementsFromGroup: [Announcement] # annonces écrites par le groupe
+    # Viewer pour voir les events/annonces adressés au groupe
     announcementsToGroup: [Announcement] # annonces adressées au groupe
-    eventsFromGroup: [Event]
     eventsToGroup: [Event]
+
+    # Member pour voir les events/annonces créés par le groupe
+    announcementsFromGroup: [Announcement] # annonces écrites par le groupe
+    eventsFromGroup: [Event]
+    
+    # Member pour voir les posts privés
     privatePosts: [PrivatePost]
     postsSummary: String # récapitulatif de l'activité interne du groupe, en markdown
+
+    # Toutes les Requests auxquelles un groupe doit répondre (admin)
+    requestsToGroup: [Request]
+    userJoinGroupRequestsToGroup: [UserJoinGroup]
+    groupJoinMetagroupRequestsToGroup: [GroupJoinMetagroup]
+    groupCoauthorEventRequestsToGroup: [GroupCoauthorEvent]
     
     # Graphe organique des groupes
     parent: SimpleGroup # Groupe parent
@@ -145,13 +167,24 @@ type MetaGroup implements Group {
     answers: [Answer] # permet d'obtenir les questions qui ont eu une réponse
     
     # Activité interne
-    announcementsFromGroup: [Announcement] # annonces écrites par le groupe
+    # Viewer pour voir les events/annonces adressés au groupe
     announcementsToGroup: [Announcement] # annonces adressées au groupe
-    eventsFromGroup: [Event]
     eventsToGroup: [Event]
+
+    # Member pour voir les events/annonces créés par le groupe
+    announcementsFromGroup: [Announcement] # annonces écrites par le groupe
+    eventsFromGroup: [Event]
+    
+    # Member pour voir les posts privés
     privatePosts: [PrivatePost]
     postsSummary: String # récapitulatif de l'activité interne du groupe, en markdown
 
+    # Toutes les Requests auxquelles un groupe doit répondre (admin)
+    requestsToGroup: [Request]
+    userJoinGroupRequestsToGroup: [UserJoinGroup]
+    groupJoinMetagroupRequestsToGroup: [GroupJoinMetagroup]
+    groupCoauthorEventRequestsToGroup: [GroupCoauthorEvent]
+
     # Graphe organique
     visibilityEdges: [Group] # se rendre visible par des groupes en plus du graphe organique
 }