diff --git a/src/graphql/connectors/messageModel.ts b/src/graphql/connectors/messageModel.ts
new file mode 100644
index 0000000000000000000000000000000000000000..843a192dde3b9a0eb96d51d42c5dfd1154e7b25b
--- /dev/null
+++ b/src/graphql/connectors/messageModel.ts
@@ -0,0 +1,463 @@
+/**
+ * @file Fonctions qui implémentent les requetes relatives aux messages
+ * @author ofacklam
+ * @memberof GraphQL
+ */
+
+import { Announcement, Event, PrivatePost, Question, Answer, Message } from "../resolvers/messages";
+import knex from "../../../db/knex_router"
+import { GroupCollection, GroupSet } from "./tools";
+
+export class GroupModel {
+
+    /**
+     * @memberof GraphQL
+     * @class MessageModel
+     * @summary Requetes relatives aux messages.
+     * @classdesc Cette classe contient les méthodes implémentant les requetes relatives aux messages.
+     * @arg {string} contextUser - L'identifiant de l'utilisateur du 'context'
+     */
+    constructor(contextUser: string) {
+        this.contextUser = contextUser;
+    }
+
+    protected contextUser: string;
+
+    /**
+     * @memberof GraphQL.MessageModel#
+     * @function getAnnouncement
+     * @summary Fonction qui renvoie une annonce donnée.
+     * @arg {number} mid - Identifiant demandé.
+     * @return {Promise(Announcement)} Renvoie l'annonce dont l'identifiant est 'mid'
+     * @async
+     * @rights membre d'un groupe author ou d'un groupe recipient
+     */
+    async getAnnouncement(mid: number): Promise<Announcement> {
+        return Announcement.tryCreate(mid);
+    }
+
+    /**
+     * @memberof GraphQL.MessageModel#
+     * @function getEvent
+     * @summary Fonction qui renvoie un evenement donné.
+     * @arg {number} mid - Identifiant demandé.
+     * @return {Promise(Event)} Renvoie l'évenement dont l'identifiant est 'mid'
+     * @async
+     * @rights membre d'un groupe author ou d'un groupe recipient
+     */
+    async getEvent(mid: number): Promise<Event> {
+        return Event.tryCreate(mid);
+    }
+
+    /**
+     * @memberof GraphQL.MessageModel#
+     * @function getPrivatePost
+     * @summary Fonction qui renvoie un post privé donné.
+     * @arg {number} mid - Identifiant demandé.
+     * @return {Promise(PrivatePost)} Renvoie le post privé dont l'identifiant est 'mid'
+     * @async
+     * @rights membre du groupe recipient
+     */
+    async getPrivatePost(mid: number): Promise<PrivatePost> {
+        return PrivatePost.tryCreate(mid);
+    }
+
+    /**
+     * @memberof GraphQL.MessageModel#
+     * @function getQuestion
+     * @summary Fonction qui renvoie une question donnée.
+     * @arg {number} mid - Identifiant demandé.
+     * @return {Promise(Question)} Renvoie la question dont l'identifiant est 'mid'
+     * @async
+     * @rights viewer du groupe recipient
+     */
+    async getQuestion(mid: number): Promise<Question> {
+        return Question.tryCreate(mid);
+    }
+
+    /**
+     * @memberof GraphQL.MessageModel#
+     * @function getAnswer
+     * @summary Fonction qui renvoie une réponse donnée.
+     * @arg {number} mid - Identifiant demandé.
+     * @return {Promise(Answer)} Renvoie la réponse dont l'identifiant est 'mid'
+     * @async
+     * @rights viewer du groupe author
+     */
+    async getAnswer(mid: number): Promise<Answer> {
+        return Answer.tryCreate(mid);
+    }
+
+    /**
+     * @memberof GraphQL.MessageModel#
+     * @function getAllMessages
+     * @summary Fonction qui renvoie tous les messages visibles.
+     * @arg {GroupCollection} groups - Un ensemble d'identifiants, supposés valides.
+     * @return {Promise(Message[])} Renvoie tous les messages émis ou reçus par ces groupes
+     * @async
+     * @rights member of groups
+     */
+    async getAllMessages(groups: GroupCollection): Promise<Message[]> {
+        throw "Not implemented";
+    }
+
+    /**
+     * @memberof GraphQL.MessageModel#
+     * @function getAllAnnouncements
+     * @summary Fonction qui renvoie toutes les annonces visibles.
+     * @arg {GroupCollection} groups - Un ensemble d'identifiants, supposés valides.
+     * @return {Promise(Announcement[])} Renvoie toutes les annonces émises ou reçues par ces groupes
+     * @async
+     * @rights member of groups
+     */
+    async getAllAnnouncements(groups: GroupCollection): Promise<Announcement[]> {
+        throw "Not implemented";
+    }
+
+    /**
+     * @memberof GraphQL.MessageModel#
+     * @function getAllEvents
+     * @summary Fonction qui renvoie tous les évenements visibles.
+     * @arg {GroupCollection} groups - Un ensemble d'identifiants, supposés valides.
+     * @return {Promise(Event[])} Renvoie tous les évenements émis ou reçus par ces groupes
+     * @async
+     * @rights member of groups
+     */
+    async getAllEvents(groups: GroupCollection): Promise<Event[]> {
+        throw "Not implemented";
+    }
+
+    /**
+     * @memberof GraphQL.MessageModel#
+     * @function getAllPrivatePosts
+     * @summary Fonction qui renvoie tous les posts privés visibles.
+     * @arg {GroupCollection} groups - Un ensemble d'identifiants, supposés valides.
+     * @return {Promise(PrivatePost[])} Renvoie tous les posts privés de ces groupes
+     * @async
+     * @rights member of groups
+     */
+    async getAllPrivatePosts(groups: GroupCollection): Promise<PrivatePost[]> {
+        throw "Not implemented";
+    }
+
+    /**
+     * @memberof GraphQL.MessageModel#
+     * @function userParticipate
+     * @summary Fonction pour participer a un evenement.
+     * @arg {string} uid - Identifiant de l'utilisateur.
+     * @arg {number} mid - Identifiant de l'évenement.
+     * @return {Promise(boolean)} Renvoie true si modification réussie
+     * @async
+     * @rights member d'un groupe author ou recipient
+     */
+    async userParticipate(uid: string, mid: number): Promise<boolean> {
+        throw "Not implemented";
+    }
+
+    /**
+     * @memberof GraphQL.MessageModel#
+     * @function userUnparticipate
+     * @summary Fonction pour ne plus participer a un evenement.
+     * @arg {string} uid - Identifiant de l'utilisateur.
+     * @arg {number} mid - Identifiant de l'évenement.
+     * @return {Promise(boolean)} Renvoie true si modification réussie
+     * @async
+     * @rights member d'un groupe author ou recipient
+     */
+    async userUnparticipate(uid: string, mid: number): Promise<boolean> {
+        throw "Not implemented";
+    }
+
+    /**
+     * @memberof GraphQL.MessageModel#
+     * @function createQuestion
+     * @summary Fonction pour créer une question.
+     * @arg {string} gid - Identifiant du groupe.
+     * @arg {string} title - Titre.
+     * @arg {string} content - Contenu.
+     * @return {Promise(Question)} Renvoie la question créée.
+     * @async
+     * @rights viewer du groupe
+     */
+    async createQuestion(gid: string, title: string, content: string): Promise<Question> {
+        throw "Not implemented";
+    }
+
+    /**
+     * @memberof GraphQL.MessageModel#
+     * @function editQuestion
+     * @summary Fonction pour modifier une question.
+     * @arg {number} mid - Identifiant de la question.
+     * @arg {string} title - Titre.
+     * @arg {string} content - Contenu.
+     * @return {Promise(Question)} Renvoie la question modifiée.
+     * @async
+     * @rights viewer du groupe et author de la question
+     */
+    async editQuestion(mid: number, title: string, content: string): Promise<Question> {
+        throw "Not implemented";
+    }
+
+    /**
+     * @memberof GraphQL.MessageModel#
+     * @function removeQuestion
+     * @summary Fonction pour supprimer une question.
+     * @arg {number} mid - Identifiant de la question.
+     * @return {Promise(boolean)} Renvoie true si suppression réussie.
+     * @async
+     * @rights viewer du groupe et author de la question
+     */
+    async removeQuestion(mid: number): Promise<boolean> {
+        throw "Not implemented";
+    }
+
+    /**
+     * @memberof GraphQL.MessageModel#
+     * @function createPrivatePost
+     * @summary Fonction pour créer un post privé.
+     * @arg {string} gid - Identifiant du groupe.
+     * @arg {string} title - Titre.
+     * @arg {string} content - Contenu.
+     * @return {Promise(PrivatePost)} Renvoie le post créé.
+     * @async
+     * @rights member du groupe
+     */
+    async createPrivatePost(gid: string, title: string, content: string): Promise<PrivatePost> {
+        throw "Not implemented";
+    }
+
+    /**
+     * @memberof GraphQL.MessageModel#
+     * @function editPrivatePost
+     * @summary Fonction pour modifier un post privé.
+     * @arg {number} mid - Identifiant du post.
+     * @arg {string} title - Titre.
+     * @arg {string} content - Contenu.
+     * @return {Promise(PrivatePost)} Renvoie le post modifié.
+     * @async
+     * @rights member du groupe et author du post
+     */
+    async editPrivatePost(mid: number, title: string, content: string): Promise<PrivatePost> {
+        throw "Not implemented";
+    }
+
+    /**
+     * @memberof GraphQL.MessageModel#
+     * @function removePrivatePost
+     * @summary Fonction pour supprimer un post privé.
+     * @arg {number} mid - Identifiant du post.
+     * @return {Promise(boolean)} Renvoie true si suppression réussie.
+     * @async
+     * @rights member du groupe et author du post
+     */
+    async removePrivatePost(mid: number): Promise<boolean> {
+        throw "Not implemented";
+    }
+
+    /**
+     * @memberof GraphQL.MessageModel#
+     * @function createAnnouncement
+     * @summary Fonction pour créer une annonce.
+     * @arg {string} from_gid - Identifiant du groupe émetteur.
+     * @arg {GroupSet} to_groups - Les groupes destinataires.
+     * @arg {string} title - Titre.
+     * @arg {string} content - Contenu.
+     * @arg {number} event_mid - Identifiant de l'évenement.
+     * @return {Promise(Announcement)} Renvoie l'annonce créée.
+     * @async
+     * @rights speaker du groupe émetteur
+     */
+    async createAnnouncement(from_gid: string, to_groups: GroupSet, title: string, content: string, event_mid: number): Promise<Announcement> {
+        throw "Not implemented";
+    }
+
+    /**
+     * @memberof GraphQL.MessageModel#
+     * @function editAnnouncement
+     * @summary Fonction pour modifier une annonce.
+     * @arg {number} mid - Identifiant de l'annonce.
+     * @arg {string} title - Titre.
+     * @arg {string} content - Contenu.
+     * @arg {number} event_mid - Identifiant de l'évenement.
+     * @return {Promise(Announcement)} Renvoie l'annonce modifiée.
+     * @async
+     * @rights speaker du groupe émetteur
+     */
+    async editAnnouncement(mid: number, title: string, content: string, event_mid: number): Promise<Announcement> {
+        throw "Not implemented";
+    }
+
+    /**
+     * @memberof GraphQL.MessageModel#
+     * @function removeAnnouncement
+     * @summary Fonction pour supprimer une annonce.
+     * @arg {number} mid - Identifiant de l'annonce.
+     * @return {Promise(boolean)} Renvoie true si suppression réussie.
+     * @async
+     * @rights speaker du groupe
+     */
+    async removeAnnouncement(mid: number): Promise<boolean> {
+        throw "Not implemented";
+    }
+
+    /**
+     * @memberof GraphQL.MessageModel#
+     * @function createEvent
+     * @summary Fonction pour créer un évenement.
+     * @arg {string} from_gid - Identifiant du groupe émetteur.
+     * @arg {GroupSet} to_groups - Les groupes destinataires.
+     * @arg {string} title - Titre.
+     * @arg {string} content - Contenu.
+     * @arg {string} location - Lieu.
+     * @arg {string} startTime - Date de début.
+     * @arg {string} endTime - Date de fin.
+     * @arg {number} announcement_mid - Identifiant de l'annonce.
+     * @return {Promise(Event)} Renvoie l'évenement créé.
+     * @async
+     * @rights speaker du groupe émetteur
+     */
+    async createEvent(from_gid: string, to_groups: GroupSet, title: string, content: string, location: string, startTime: string, endTime: string, announcement_mid: number): Promise<Event> {
+        throw "Not implemented";
+    }
+
+    /**
+     * @memberof GraphQL.MessageModel#
+     * @function editEvent
+     * @summary Fonction pour modifier un evenement.
+     * @arg {number} mid - Identifiant de l'évenement.
+     * @arg {string} title - Titre.
+     * @arg {string} content - Contenu.
+     * @arg {string} location - Lieu.
+     * @arg {string} startTime - Date de début.
+     * @arg {string} endTime - Date de fin.
+     * @arg {number} announcement_mid - Identifiant de l'annonce.
+     * @return {Promise(Event)} Renvoie l'evenement modifié.
+     * @async
+     * @rights speaker du groupe émetteur
+     */
+    async editEvent(mid: number, title: string, content: string, location: string, startTime: string, endTime: string, announcement_mid: number): Promise<Event> {
+        throw "Not implemented";
+    }
+
+    /**
+     * @memberof GraphQL.MessageModel#
+     * @function removeEvent
+     * @summary Fonction pour supprimer un évenement.
+     * @arg {number} mid - Identifiant de l'évenement.
+     * @return {Promise(boolean)} Renvoie true si suppression réussie.
+     * @async
+     * @rights speaker du groupe
+     */
+    async removeEvent(mid: number): Promise<boolean> {
+        throw "Not implemented";
+    } 
+
+    /**
+     * @memberof GraphQL.MessageModel#
+     * @function createAnswer
+     * @summary Fonction pour créer une réponse.
+     * @arg {number} mid - Identifiant de la question.
+     * @arg {string} title - Titre.
+     * @arg {string} content - Contenu.
+     * @return {Promise(Answer)} Renvoie la réponse créée.
+     * @async
+     * @rights speaker du groupe
+     */
+    async createAnswer(mid: number, title: string, content: string): Promise<Answer> {
+        throw "Not implemented";
+    }
+
+    /**
+     * @memberof GraphQL.MessageModel#
+     * @function editAnswer
+     * @summary Fonction pour modifier une réponse.
+     * @arg {number} mid - Identifiant de la réponse.
+     * @arg {string} title - Titre.
+     * @arg {string} content - Contenu.
+     * @return {Promise(Answer)} Renvoie la réponse modifiée.
+     * @async
+     * @rights speaker du groupe
+     */
+    async editAnswer(mid: number, title: string, content: string): Promise<Answer> {
+        throw "Not implemented";
+    }
+
+    /**
+     * @memberof GraphQL.MessageModel#
+     * @function removeAnswer
+     * @summary Fonction pour supprimer une réponse.
+     * @arg {number} mid - Identifiant de la réponse.
+     * @return {Promise(boolean)} Renvoie true si suppression réussie.
+     * @async
+     * @rights speaker du groupe
+     */
+    async removeAnswer(mid: number): Promise<boolean> {
+        throw "Not implemented";
+    }
+
+    /**
+     * @memberof GraphQL.MessageModel#
+     * @function censorQuestion
+     * @summary Fonction pour censurer une question.
+     * @arg {number} mid - Identifiant du message.
+     * @return {Promise(boolean)} Renvoie true si suppression réussie.
+     * @async
+     * @rights admin du groupe
+     */
+    async censorQuestion(mid: number): Promise<boolean> {
+        throw "Not implemented";
+    }
+
+    /**
+     * @memberof GraphQL.MessageModel#
+     * @function censorAnswer
+     * @summary Fonction pour censurer une réponse.
+     * @arg {number} mid - Identifiant du message.
+     * @return {Promise(boolean)} Renvoie true si suppression réussie.
+     * @async
+     * @rights admin du groupe
+     */
+    async censorAnswer(mid: number): Promise<boolean> {
+        throw "Not implemented";
+    }
+
+    /**
+     * @memberof GraphQL.MessageModel#
+     * @function censorPrivatePost
+     * @summary Fonction pour censurer un post privé.
+     * @arg {number} mid - Identifiant du message.
+     * @return {Promise(boolean)} Renvoie true si suppression réussie.
+     * @async
+     * @rights admin du groupe
+     */
+    async censorPrivatePost(mid: number): Promise<boolean> {
+        throw "Not implemented";
+    }
+
+    /**
+     * @memberof GraphQL.MessageModel#
+     * @function censorAnnouncement
+     * @summary Fonction pour censurer une annonce.
+     * @arg {number} mid - Identifiant du message.
+     * @return {Promise(boolean)} Renvoie true si suppression réussie.
+     * @async
+     * @rights admin du groupe ???? (lequel ??? -> le groupe author?)
+     */
+    async censorAnnouncement(mid: number): Promise<boolean> {
+        throw "Not implemented";
+    }
+
+    /**
+     * @memberof GraphQL.MessageModel#
+     * @function censorEvent
+     * @summary Fonction pour censurer un évenement.
+     * @arg {number} mid - Identifiant du message.
+     * @return {Promise(boolean)} Renvoie true si suppression réussie.
+     * @async
+     * @rights admin du groupe ???? (lequel ??? -> le groupe author?)
+     */
+    async censorEvent(mid: number): Promise<boolean> {
+        throw "Not implemented";
+    }
+
+}
\ No newline at end of file
diff --git a/src/graphql/connectors/tools.ts b/src/graphql/connectors/tools.ts
index 895964ed64755e7e7fe2ac9371846cf7489a4714..9feb00e52f59afe912c25e5955ea5717da390461 100644
--- a/src/graphql/connectors/tools.ts
+++ b/src/graphql/connectors/tools.ts
@@ -245,6 +245,8 @@ export class Tools {
             return elt.simple_group_gid;
         }));
 
+        //TODO : rajouter les VisibilityEdges
+
         return { simpleGroups: simple, metaGroups: meta };
     }
 }
\ No newline at end of file
diff --git a/src/graphql/typeDefs/actions.graphql b/src/graphql/typeDefs/actions.graphql
index 784e0558e49d942be84521e14bd7d5e461e56a9c..08e40292aace3425bd2b27dce1e6d46d94aa6b72 100644
--- a/src/graphql/typeDefs/actions.graphql
+++ b/src/graphql/typeDefs/actions.graphql
@@ -13,7 +13,7 @@ type Query {
     metaGroup(gid:ID!): MetaGroup
 
     # Message queries de base
-    message(mid:ID!): Message
+    #message(mid:ID!): Message
     announcement(mid:ID!): Announcement
     event(mid:ID!): Event
     privatePost(mid:ID!): PrivatePost
@@ -30,6 +30,7 @@ type Query {
     allMessages: [Message]
     allAnnouncements: [Announcement]
     allEvents: [Event]
+    allPrivatePosts: [PrivatePost]
     # Tous les Groupes visibles par un utilisateur. 
     # Correspondrait au sous-champ "viewerOf" de User, volontairement non-défini comme tel. Tous les autres cas de figure sont couverts par les sous-champs "<permission>Of" de User
     allGroups: [Group]
@@ -144,7 +145,7 @@ type Mutation {
     ): Question
     removeQuestion(
         questionToRemove: ID!
-    ): Question
+    ): Boolean
 
     # Member mutations
     userLeaveGroup(groupId: ID!): Boolean
@@ -161,7 +162,7 @@ type Mutation {
     ): PrivatePost
     removePrivatePost(
         privatePostToRemove: ID!
-    ): PrivatePost
+    ): Boolean
 
     # Speaker mutations
     writePostsSummary(forGroup: ID!, content: String): Boolean
@@ -265,10 +266,10 @@ type Mutation {
     refuseGroupCoauthorEventRequest(request: ID!, comment: String): Boolean
 
     censorQuestion(questionToCensor: ID!): Boolean
+    censorAnswer(answerToCensor: ID!): Boolean
     censorPrivatePost(privatePostToCensor: ID!): Boolean
     censorAnnouncement(announcementToCensor: ID!): Boolean
     censorEvent(eventToCensor: ID!): Boolean
-    censorAnswer(answerToCensor: ID!): Boolean
 
     # Superviser mutations
     takeAdminRights(forGroup: ID!) : Boolean