diff --git a/src/graphql/resolvers/groups.ts b/src/graphql/resolvers/groups.ts
index 0e0885c206433fa34abb9be4998d094fc59d7e6e..bced15a11d592f5946dc26afa3608d7ac40b73a3 100644
--- a/src/graphql/resolvers/groups.ts
+++ b/src/graphql/resolvers/groups.ts
@@ -30,6 +30,7 @@ export abstract class Group {
      * @memberof GraphQL.Group#
      * @function fetchData
      * @summary Fonction qui va chercher toutes les données sur ce groupe dans le stockage approprié, si ce n'est pas déja fait.
+     * @throws {Not_found} Les données n'ont pas pu etre trouvées.
      * @async
      * @protected
      * @abstract
@@ -340,44 +341,74 @@ export class SimpleGroup extends Group {
      * @summary Resolvers des groupes simples
      * @classdesc Une classe représentant le type SimpleGroup du schéma.
      * Comme Apollo Server, par défaut, appelle la propriété / fonction avec le nom a résoudre, il n'y a pas besoin d'écrire les resolvers explicitement.
-     * @arg {string} gid - Identifiant du groupe simple
+     * @arg {string} gid - Identifiant du groupe simple, supposé valide.
      * @rights connectedOrOnplatal
      */
     constructor(gid: string) {
         super(gid);
     }
 
+    /**
+     * @memberof GraphQL.SimpleGroup#
+     * @function tryCreate
+     * @summary Fonction qui va essayer de créer le groupe simple correspondant
+     * @arg {string} gid - Identifiant du groupe simple, sans hypothese sur la validité.
+     * @returns {Promise(SimpleGroup)} - Renvoie le groupe simple créé, ou null en cas d'erreur.
+     * @rights connectedOrOnplatal
+     * @async
+     * @static
+     */
+    static async tryCreate(gid: string): Promise<SimpleGroup> {
+        let g = new SimpleGroup(gid);
+        try {
+            await g.fetchData();
+            return g;
+        }
+        catch {
+            return null;
+        }
+    }
+
     /**
      * @memberof GraphQL.SimpleGroup#
      * @function fetchData
      * @summary Fonction qui va chercher toutes les données sur ce groupe simple dans le LDAP, si ce n'est pas déja fait.
+     * @throws {Not_found} Les données n'ont pas pu etre trouvées.
      * @async
      * @protected
      */
     protected async fetchData(): Promise<void> {
         if(!this.m_dataLoaded) {
-            let data = await LDAP_Group.peek(this.gid);
-
-            //this.m_createdAt = data.createdAt;
-            //this.m_updatedAt = data.updatedAt;
-            this.m_name = data.name;
-            this.m_description = data.description;
-            //this.m_mail = data.mail;
-            //this.m_website = data.website;
-
-            this.m_members = data.members;
-            //this.m_speakers = data.speakers;
-            this.m_admins = data.admins;
-            //this.m_likers = data.likers;
+            try {
+                let data = await LDAP_Group.peek(this.gid);
+                if(data.gid !== this.gid) {
+                    throw "Error in search";
+                }
+
+                //this.m_createdAt = data.createdAt;
+                //this.m_updatedAt = data.updatedAt;
+                this.m_name = data.name;
+                this.m_description = data.description;
+                //this.m_mail = data.mail;
+                //this.m_website = data.website;
+
+                this.m_members = data.members;
+                //this.m_speakers = data.speakers;
+                this.m_admins = data.admins;
+                //this.m_likers = data.likers;
+
+                //this.m_frontPage = data.frontPage;
+                //this.m_postsSummary = data.postsSummary;
+
+                //this.m_parent = data.parent;
+                //this.m_children = data.children;
+                //this.m_school = ???;
 
-            //this.m_frontPage = data.frontPage;
-            //this.m_postsSummary = data.postsSummary;
-
-            //this.m_parent = data.parent;
-            //this.m_children = data.children;
-            //this.m_school = ???;
-
-            this.m_dataLoaded = true;
+                this.m_dataLoaded = true;
+            }
+            catch {
+                throw "Not_found";
+            }
         }
     }
 
@@ -553,32 +584,54 @@ export class MetaGroup extends Group {
      * @summary Resolvers des méta-groupes
      * @classdesc Une classe représentant le type MetaGroup du schéma.
      * Comme Apollo Server, par défaut, appelle la propriété / fonction avec le nom a résoudre, il n'y a pas besoin d'écrire les resolvers explicitement.
-     * @arg {string} gid - Identifiant du méta-groupe
+     * @arg {string} gid - Identifiant du méta-groupe, supposé valide
      * @rights connectedOrOnplatal
      */
     constructor(gid: string) {
         super(gid);
     }
 
+    /**
+     * @memberof GraphQL.MetaGroup#
+     * @function tryCreate
+     * @summary Fonction qui va essayer de créer le méta-groupe correspondant
+     * @arg {string} gid - Identifiant du méta-groupe, sans hypothese sur la validité.
+     * @returns {Promise(MetaGroup)} - Renvoie le méta-groupe créé, ou null en cas d'erreur.
+     * @rights connectedOrOnplatal
+     * @async
+     * @static
+     */
+    static async tryCreate(gid: string): Promise<MetaGroup> {
+        let g = new MetaGroup(gid);
+        try {
+            await g.fetchData();
+            return g;
+        }
+        catch {
+            return null;
+        }
+    }
+
     /**
      * @memberof GraphQL.MetaGroup#
      * @function fetchData
      * @summary Fonction qui va chercher toutes les données sur ce méta-groupe dans la BDD, si ce n'est pas déja fait.
+     * @throws {Not_found} Les données n'ont pas pu etre trouvées.
      * @async
      * @protected
      */
     protected async fetchData(): Promise<void> {
         if (!this.m_dataLoaded) {
             let data = await knex.select('created_at',
-                                         'updated_at', 
-                                         'name', 
-                                         'description',
-                                         //'mail', 
-                                         //'posts_summary', 
-                                         //'front_page', 
-                                         'website').from('groups').where('gid', this.gid);
-
-            if(data.length() > 0) {
+                'updated_at', 
+                'name', 
+                'description',
+                //'mail', 
+                //'posts_summary', 
+                //'front_page', 
+                'website').from('groups').where('gid', this.gid);
+
+            if(data.length > 0) {
                 let g = data[0];
 
                 this.m_createdAt = g.created_at;
@@ -593,6 +646,9 @@ export class MetaGroup extends Group {
 
                 this.m_dataLoaded = true;
             }
+            else {
+                throw "Not_found";
+            }
         }
     }
 
diff --git a/src/graphql/resolvers/messages.ts b/src/graphql/resolvers/messages.ts
index 01c81e4a4b55103c72f46f675692d7f595e9801e..7feb59a1bf4dbdc43b6a2457560f7616cf60915b 100644
--- a/src/graphql/resolvers/messages.ts
+++ b/src/graphql/resolvers/messages.ts
@@ -28,6 +28,7 @@ export abstract class Message {
      * @memberof GraphQL.Message#
      * @function fetchData
      * @summary Fonction qui va chercher toutes les données sur ce message dans la BDD, si ce n'est pas déja fait.
+     * @throws {Not_found} Les données n'ont pas pu etre trouvées.
      * @async
      * @protected
      * @abstract
@@ -152,10 +153,32 @@ export class Announcement extends Message {
         super(mid);
     }
 
+    /**
+     * @memberof GraphQL.Announcement#
+     * @function tryCreate
+     * @summary Fonction qui va essayer de créer l'annonce correspondante
+     * @arg {number} mid - Identifiant du message, sans hypothese sur la validité.
+     * @returns {Promise(Announcement)} - Renvoie le Announcement créé, ou null en cas d'erreur.
+     * @rights membre d'un groupe author ou d'un groupe recipient
+     * @async
+     * @static
+     */
+    static async tryCreate(mid: number): Promise<Announcement> {
+        let m = new Announcement(mid);
+        try {
+            await m.fetchData();
+            return m;
+        }
+        catch {
+            return null;
+        }
+    }
+
     /**
      * @memberof GraphQL.Announcement#
      * @function fetchData
      * @summary Fonction qui va chercher toutes les données sur cet announcement dans la BDD, si ce n'est pas déja fait.
+     * @throws {Not_found} Les données n'ont pas pu etre trouvées.
      * @async
      * @protected
      */
@@ -168,7 +191,7 @@ export class Announcement extends Message {
                 //'importance', 
                 'views').from('messages_announcements').where('mid', this.mid);
 
-            if (data.length() > 0) {
+            if (data.length > 0) {
                 let m = data[0];
 
                 this.m_createdAt = m.created_at;
@@ -180,6 +203,9 @@ export class Announcement extends Message {
 
                 this.m_dataLoaded = true;
             }
+            else {
+                throw "Not_found";
+            }
         }
     }
 
@@ -257,7 +283,7 @@ export class Announcement extends Message {
      */
     async forEvent(args, context, info): Promise<Event> {
         let data = await knex.select('mid').from('messages_events').where('for_announcement', this.mid);
-        if(data.length() > 0) {
+        if(data.length > 0) {
             return new Event(data[0].mid);
         }
         return null;
@@ -280,10 +306,32 @@ export class Event extends Message {
         super(mid);
     }
 
+    /**
+     * @memberof GraphQL.Event#
+     * @function tryCreate
+     * @summary Fonction qui va essayer de créer l'evenement correspondant
+     * @arg {number} mid - Identifiant du message, sans hypothese sur la validité.
+     * @returns {Promise(Event)} - Renvoie le Event créé, ou null en cas d'erreur.
+     * @rights membre d'un groupe author ou d'un groupe recipient
+     * @async
+     * @static
+     */
+    static async tryCreate(mid: number): Promise<Event> {
+        let m = new Event(mid);
+        try {
+            await m.fetchData();
+            return m;
+        }
+        catch {
+            return null;
+        }
+    }
+
     /**
      * @memberof GraphQL.Event#
      * @function fetchData
      * @summary Fonction qui va chercher toutes les données sur cet event dans la BDD, si ce n'est pas déja fait.
+     * @throws {Not_found} Les données n'ont pas pu etre trouvées.
      * @async
      * @protected
      */
@@ -298,7 +346,7 @@ export class Event extends Message {
                 'end_time', 
                 'for_announcement').from('messages_events').where('mid', this.mid);
 
-            if (data.length() > 0) {
+            if (data.length > 0) {
                 let m = data[0];
 
                 this.m_createdAt = m.created_at;
@@ -312,6 +360,9 @@ export class Event extends Message {
 
                 this.m_dataLoaded = true;
             }
+            else {
+                throw "Not_found";
+            }
         }
     }
 
@@ -453,10 +504,32 @@ export class PrivatePost extends Message {
         super(mid);
     }
 
+    /**
+     * @memberof GraphQL.PrivatePost#
+     * @function tryCreate
+     * @summary Fonction qui va essayer de créer le post privé correspondant
+     * @arg {number} mid - Identifiant du message, sans hypothese sur la validité.
+     * @returns {Promise(PrivatePost)} - Renvoie le PrivatePost créé, ou null en cas d'erreur.
+     * @rights membre du groupe recipient
+     * @async
+     * @static
+     */
+    static async tryCreate(mid: number): Promise<PrivatePost> {
+        let m = new PrivatePost(mid);
+        try {
+            await m.fetchData();
+            return m;
+        }
+        catch {
+            return null;
+        }
+    }
+
     /**
      * @memberof GraphQL.PrivatePost#
      * @function fetchData
      * @summary Fonction qui va chercher toutes les données sur ce post privé dans la BDD, si ce n'est pas déja fait.
+     * @throws {Not_found} Les données n'ont pas pu etre trouvées.
      * @async
      * @protected
      */
@@ -469,7 +542,7 @@ export class PrivatePost extends Message {
                 'author',
                 'recipient').from('messages_private_posts').where('mid', this.mid);
 
-            if (data.length() > 0) {
+            if (data.length > 0) {
                 let m = data[0];
 
                 this.m_createdAt = m.created_at;
@@ -481,6 +554,9 @@ export class PrivatePost extends Message {
 
                 this.m_dataLoaded = true;
             }
+            else {
+                throw "Not_found";
+            }
         }
     }
 
@@ -541,10 +617,32 @@ export class Question extends Message {
         super(mid);
     }
 
+    /**
+     * @memberof GraphQL.Question#
+     * @function tryCreate
+     * @summary Fonction qui va essayer de créer la question correspondante
+     * @arg {number} mid - Identifiant du message, sans hypothese sur la validité.
+     * @returns {Promise(Question)} - Renvoie la Question créée, ou null en cas d'erreur.
+     * @rights viewer du groupe recipient
+     * @async
+     * @static
+     */
+    static async tryCreate(mid: number): Promise<Question> {
+        let m = new Question(mid);
+        try {
+            await m.fetchData();
+            return m;
+        }
+        catch {
+            return null;
+        }
+    }
+
     /**
      * @memberof GraphQL.Question#
      * @function fetchData
      * @summary Fonction qui va chercher toutes les données sur ce post privé dans la BDD, si ce n'est pas déja fait.
+     * @throws {Not_found} Les données n'ont pas pu etre trouvées.
      * @async
      * @protected
      */
@@ -557,7 +655,7 @@ export class Question extends Message {
                 'author',
                 'recipient').from('messages_questions').where('mid', this.mid);
 
-            if (data.length() > 0) {
+            if (data.length > 0) {
                 let m = data[0];
 
                 this.m_createdAt = m.created_at;
@@ -569,6 +667,9 @@ export class Question extends Message {
 
                 this.m_dataLoaded = true;
             }
+            else {
+                throw "Not_found";
+            }
         }
     }
 
@@ -622,7 +723,7 @@ export class Question extends Message {
      */
     async forAnswer(args, context, info): Promise<Answer> {
         let data = await knex.select('mid').from('messages_answers').where('for_question', this.mid);
-        if (data.length() > 0) {
+        if (data.length > 0) {
             return new Answer(data[0].mid);
         }
         return null;
@@ -645,10 +746,32 @@ export class Answer extends Message {
         super(mid);
     }
 
+    /**
+     * @memberof GraphQL.Answer#
+     * @function tryCreate
+     * @summary Fonction qui va essayer de créer la réponse correspondante
+     * @arg {number} mid - Identifiant du message, sans hypothese sur la validité.
+     * @returns {Promise(Answer)} - Renvoie la Answer créée, ou null en cas d'erreur.
+     * @rights viewer du groupe author
+     * @async
+     * @static
+     */
+    static async tryCreate(mid: number): Promise<Answer> {
+        let m = new Answer(mid);
+        try {
+            await m.fetchData();
+            return m;
+        }
+        catch {
+            return null;
+        }
+    }
+
     /**
      * @memberof GraphQL.Answer#
      * @function fetchData
      * @summary Fonction qui va chercher toutes les données sur ce post privé dans la BDD, si ce n'est pas déja fait.
+     * @throws {Not_found} Les données n'ont pas pu etre trouvées.
      * @async
      * @protected
      */
@@ -661,7 +784,7 @@ export class Answer extends Message {
                 'recipient', //<--- WTF ????
                 'for_question').from('messages_answers').where('mid', this.mid);
 
-            if (data.length() > 0) {
+            if (data.length > 0) {
                 let m = data[0];
 
                 this.m_createdAt = m.created_at;
@@ -673,6 +796,9 @@ export class Answer extends Message {
 
                 this.m_dataLoaded = true;
             }
+            else {
+                throw "Not_found";
+            }
         }
     }
 
diff --git a/src/graphql/resolvers/users.ts b/src/graphql/resolvers/users.ts
index 4a856aacd04a9f5e00b707d670656b113ad29f36..2011194980c7c6628380ca7721a3a11760727421 100644
--- a/src/graphql/resolvers/users.ts
+++ b/src/graphql/resolvers/users.ts
@@ -24,34 +24,64 @@ export class User {
         this.m_dataLoaded = false;
     }
 
+    /**
+     * @memberof GraphQL.User#
+     * @function tryCreate
+     * @summary Fonction qui va essayer de créer le user correspondant
+     * @arg {string} uid - Identifiant du user, sans hypothese sur la validité.
+     * @returns {Promise(User)} - Renvoie le user créé, ou null en cas d'erreur.
+     * @rights connectedOrOnplatal
+     * @async
+     * @static
+     */
+    static async tryCreate(uid: string): Promise<User> {
+        let u = new User(uid);
+        try {
+            await u.fetchData();
+            return u;
+        }
+        catch {
+            return null;
+        }
+    }
+
     /**
      * @memberof GraphQL.User#
      * @function fetchData
      * @summary Fonction qui va chercher toutes les données sur ce user dans le LDAP, si ce n'est pas déja fait.
+     * @throws {Not_found} Les données n'ont pas pu etre trouvées.
      * @async
      * @protected
      */
     protected async fetchData(): Promise<void> {
         if(!this.m_dataLoaded) {
-            let data = await LDAP_User.peek(this.uid);
-
-            this.m_givenName = data.givenName;
-            this.m_lastName = data.lastName;
-            this.m_nickname = data.nickname;
-            this.m_nationality = data.nationality;
-            this.m_birthdate = data.birthdate;
-            this.m_promotion = data.promotion;
-
-            this.m_mail = data.mail;
-            this.m_phone = data.phone;
-            this.m_addresses = [data.address];
-
-            this.m_memberOf = data.groups;
-            //this.m_speakerOf = data.groupsIsSpeaker;
-            this.m_adminOf = data.groupsIsAdmin;
-            //this.m_likes = data.likes;
-
-            this.m_dataLoaded = true;
+            try {
+                let data = await LDAP_User.peek(this.uid);
+                if(data.uid !== this.uid) {
+                    throw "Error in search";
+                }
+
+                this.m_givenName = data.givenName;
+                this.m_lastName = data.lastName;
+                this.m_nickname = data.nickname;
+                this.m_nationality = data.nationality;
+                this.m_birthdate = data.birthdate;
+                this.m_promotion = data.promotion;
+
+                this.m_mail = data.mail;
+                this.m_phone = data.phone;
+                this.m_addresses = [data.address];
+
+                this.m_memberOf = data.groups;
+                //this.m_speakerOf = data.groupsIsSpeaker;
+                this.m_adminOf = data.groupsIsAdmin;
+                //this.m_likes = data.likes;
+
+                this.m_dataLoaded = true;
+            }
+            catch {
+                throw "Not_found";
+            }
         }
     }