diff --git a/src/graphql/schema.js b/src/graphql/schema.js
index 2bbf77ac1cbea1d10d437560e5aeb8343a52cdf3..4ed74cb141dfa85beade5462cde9801801763c3b 100644
--- a/src/graphql/schema.js
+++ b/src/graphql/schema.js
@@ -8,67 +8,8 @@ import { makeExecutableSchema } from 'graphql-tools';
 import { request } from 'https';
 import { assertBinaryExpression } from 'babel-types';
 
-import { Group, User, Post, Event as schemaEvent } from './typeDefs';
+import typeDefs from './typeDefs';
 
-const RootTypes = `
-    # Requêtes
-    type Query {
-        allGroups: [Group]
-        group(uid: ID) : Group
-        user(uid: ID) : [User]
-        allEvents: [Event]
-    }
-
-    type Mutation {
-        asAdmin(groupid: String): AdminMutation
-        asMember(groupid: String): MemberMutation
-        asViewer(groupid: String): ViewerMutation
-
-        createGroup(
-            uid: ID = null
-            name: String
-            website: String
-            description: String
-            school: String
-            parentuid : String
-        ): Group
-    }
-
-    type AdminMutation {
-
-        test: Boolean
-
-        createSubgroup(
-            uid: ID = null, 
-            name: String,
-            website: String,
-            description: String,
-            school: String,
-        ): Group
-
-        addUser(userid : String): User
-        removeUser(userid : String): User
-        addAdmin(userid : String): User
-        removeAdmin(userid : String): User
-
-        editGroup(
-            name: String,
-            website: String,
-            description: String,
-            school: String,
-        ): Group
-
-    }
-
-    type MemberMutation {
-        leave: Group
-    }
-
-    type ViewerMutation {
-        requestJoin: Group
-    }
-
-`;
 
 /**
  * @summary Renvoie tous les utilisateurs ayant des droits d'administrateur sur un groupe.
@@ -87,7 +28,7 @@ const getUsersWithAdminRights = (user, groupUID) => {
                         return adminList.concat(parentAdmins);
                     });
                 else
-                    return adminList;
+                    return adminList.concat(['anatole.romon']); // pour les besoins des tests, anatole romon a tout les droits
             });
     });
 };
@@ -98,8 +39,8 @@ const getUsersWithAdminRights = (user, groupUID) => {
  * @arg {Object} user - Objet contenant un attribut *uid* de type *string*. User représente l'utilisateur qui a effectué la requête. 
  * @return {Promise} Retour de requête knex. Liste de tous les groupes que l'utilisateur a le droit de voire.
  */
-const hasAdminRights = (user, groupuid) => {
-    return getUsersWithAdminRights(user, groupuid).then(adminList => {
+const hasAdminRights = (user, groupUID) => {
+    return getUsersWithAdminRights(user, groupUID).then(adminList => {
         return (typeof adminList != "undefined"  && adminList.indexOf(user.uid) != -1);
     });
 };
@@ -111,6 +52,7 @@ const hasAdminRights = (user, groupuid) => {
  * @return {Promise} Retour de requête knex. Liste de tous les groupes que l'utilisateur a le droit de voire.
  */
 const getAllVisibleGroups = (user) => {
+    console.log(user);
 
     return listerGroupes(user, user.uid).then(group_ids => {
         if(typeof group_ids == "undefined")
@@ -149,17 +91,50 @@ const getGroupIfVisible = (user, uid) => {
  * @arg {String} uid - L'uid du groupe dont on veut les administrateurs. 
  * @return {Promise} Retour de requête knex. Promise qui renvera une liste de tous les utilisateurs ayant droit d'admin sur le groupe
  */
-const getAvailableGroupUID = (initialUID) => {
+const getAvailablegroupUID = (initialUID) => {
     let rasUID = initialUID.replace(' ', '_').replace(/\W/g, '').toLowerCase();
     return knex.from('groups').where('uid', rasUID).then(res =>{
         if(res.length == 0){
             return(rasUID);
         }else{
-            return(getAvailableGroupUID(rasUID + 'n'));
+            return(getAvailablegroupUID(rasUID + 'n'));
         }
     });
 };
 
+/**
+ * @summary Créé un groupe si les arguments sont tous valides
+ * @desc Les arguments doivent être valides, sauf pour uid. Une clé uid valide sera générée dans tous les cas. 
+ * Les authorisations de l'utilisateur ne sont pas vérifiées
+ * On teste si l'utilisateur qui envoie la requête a des droits d'admin sur le parent du groupe qui doit être créé, avec la fonction *getUsersWithAdminRights*
+ * Si un argument est invalide ou si l'utilisateur n'a pas les droits, la fonction renvoie une erreur
+ * @arg {Object} user - L'utilisateur qui effectue la requête. 
+ * @arg {Object} args - Les arguments envoyés à la mutation. Cf le schéma GraphQL 
+ * @return {Promise} Retour de requête knex. Le groupe qui vient d'être créé. En cas d'echec, renvoie une erreur.
+ */
+const createSubgroup = (user, args) => {
+    if(typeof args.parentuid != 'string')
+        throw "Illegal argument : parentuid must be a non null string";
+    if(typeof args.name != 'string')
+        throw "Illegal argument : name must be a non null string";
+    
+    return(getAvailablegroupUID(args.uid).then(rasUID => {
+        // TODO : appeller une fonction de ldap_data pour y créer un groupe.
+        return knex('groups').insert({
+            uid : rasUID,
+            parentuid : args.parentuid,
+            createdAt : knex.fn.now(),
+            updatedAt : this.createdAt,
+            name : args.name,
+            website : args.website,
+            description : args.description,
+            school : args.school
+        }).then( res => {
+            return getGroupIfVisible(user, rasUID);
+        });
+    })); 
+}
+
 /**
  * @summary Créé un groupe si les arguments sont tous valides et l'utilisateur est authorisé
  * @desc Les arguments doivent être valides, sauf pour uid. Une clé uid valide sera générée dans tous les cas. 
@@ -170,31 +145,10 @@ const getAvailableGroupUID = (initialUID) => {
  * @return {Promise} Retour de requête knex. Le groupe qui vient d'être créé. En cas d'echec, renvoie une erreur.
  */
 const createGroupIfLegal = (user, args) => {
-    if(typeof args.parentuid != 'string')
-        throw "Illegal argument : parentuid must be a string";
-    return getUsersWithAdminRights(user, args.parentuid).then( admin_list => {
-        if(typeof admin_list == undefined) //Cela arrive si arg.parentuid n'est pas un id de groupe valable (ou éventuellement si Chevalier fait de la merde)
-            throw "invalid argument : no group with id " + args.parentuid;
-        admin_list = admin_list.concat(['anatole.romon']); // pour les besoins des tests, anatole romon a tout les droits
-        if(admin_list.indexOf(user.uid) == -1)
+    return hasAdminRights(user, args.parentuid).then( answer => {
+        if( !answer )
             throw "illegal request : you must have admin rights over a group to create a subgroup of that group";
-        if(typeof args.uid != "string")
-            args.uid = args.name;
-        return(getAvailableGroupUID(args.uid).then(rasUID => {
-            // TODO : appeller une fonction de ldap_data pour y créer un groupe.
-            return knex('groups').insert({
-                uid : rasUID,
-                parentuid : args.parentuid,
-                createdAt : knex.fn.now(),
-                updatedAt : this.createdAt,
-                name : args.name,
-                website : args.website,
-                description : args.description,
-                school : args.school
-            }).then( res => {
-                return getGroupIfVisible(user, rasUID);
-            });
-        })); 
+        return createSubgroup(user, args);
     });
 };
 
@@ -231,16 +185,35 @@ const resolvers = {
             });
 
             return result;
+        },
+
+        searchTOL: (obj, args, context) => {
+            console.log(args);
+            return repliquerTOLdesIds(context.user, {
+                givenName: args.givenName,
+                lastName: args.lastName,
+                nickname: args.nickname,
+                nationality: args.nationality,
+                school: args.school,
+                promotion: args.promotion,
+                groups: args.groups,
+                studies: args.studies,
+                sport: args.sport,
+                phone: args.phone,
+                mail: args.mail,
+                adress: args.adress,
+                ip: args.ip
+            });
         }
     },
 
     Mutation: {
         asAdmin: (obj, args, context) => {
-            return hasAdminRights(context.user, args.groupid).then(res => {
+            return hasAdminRights(context.user, args.groupUID).then(res => {
                 if(res)
-                    return {hasAdminRights : true};
+                    return {groupUID : args.groupUID};
                 else
-                    return {hasAdminRights : false};
+                    throw "You do not have admin rights over this group";
             });
         },
         createGroup: (obj, args, context) => {
@@ -249,18 +222,25 @@ const resolvers = {
     },
 
     AdminMutation: {
-        test: (obj, args, context) => {
-            console.log(obj);
-            console.log(typeof obj);
+    
+        isAdmin: (obj, args, context) => {
+        return true;
+        },
+
+        createSubgroup: (obj, args, context) => {
+            args.parentuid = obj.groupUID;
+            return createSubgroup(context.user, args);
+        },
+
+        editGroup: (obj, args, context) => {
             return null;
-            
         }
     }
 
 };
 
 const schema = makeExecutableSchema({
-    typeDefs: [RootTypes, Group, User, Post, schemaEvent],
+    typeDefs,
     resolvers
 });
 
diff --git a/src/graphql/typeDefs.js b/src/graphql/typeDefs.js
index 3e5592835a093084185cbe8911aa492311b2b460..dd8bd9329f48cd79670dfea859cda4a3474bff05 100644
--- a/src/graphql/typeDefs.js
+++ b/src/graphql/typeDefs.js
@@ -1,3 +1,78 @@
+const RootTypes = `
+    # Requêtes
+    type Query {
+        allGroups: [Group]
+        group(uid: ID) : Group
+        user(uid: ID) : [User]
+        allEvents: [Event]
+        searchTOL(
+            givenName: String
+            lastName: String
+            nickname: String
+            nationality: String
+            school: String
+            promotion: String
+            groups: String
+            studies: String
+            sport: String
+            phone: String
+            mail: String
+            adress: String
+            ip: String
+        ): [String]
+    }
+
+    type Mutation {
+        asAdmin(groupUID: String): AdminMutation
+        asMember(groupUID: String): MemberMutation
+        asViewer(groupUID: String): ViewerMutation
+
+        createGroup(
+            uid: ID = null
+            name: String
+            website: String
+            description: String
+            school: String
+            parentuid : String
+        ): Group
+    }
+
+    type AdminMutation {
+
+        isAdmin: Boolean
+
+        createSubgroup(
+            uid: ID = null,
+            name: String,
+            website: String,
+            description: String,
+            school: String,
+        ): Group
+
+        addUser(userid : String): User
+        removeUser(userid : String): User
+        addAdmin(userid : String): User
+        removeAdmin(userid : String): User
+
+        editGroup(
+            name: String,
+            website: String,
+            description: String,
+            school: String,
+        ): Group
+
+    }
+
+    type MemberMutation {
+        leave: Group
+    }
+
+    type ViewerMutation {
+        requestJoin: Group
+    }
+
+`;
+
 const User = `
     # Utilisateurs
     type User {
@@ -31,7 +106,7 @@ const Group = `
     }
 `;
 
-const Event = `
+const Events = `
     # Événements
     type Event {
         # Intitulé de l'événement
@@ -56,4 +131,7 @@ const Post = `
     }
 `;
 
-export { Group, User, Event, Post };
\ No newline at end of file
+
+const typeDefs = [RootTypes, Group, User, Post, Events];
+
+export default typeDefs;
\ No newline at end of file
diff --git a/src/server.js b/src/server.js
index 023691da29cd84065e09c0f4d4a2ed017808fea3..bb26e721d5ee2d4ce0ebbee6e405e4782beec49e 100644
--- a/src/server.js
+++ b/src/server.js
@@ -50,7 +50,6 @@ server.use('/graphql', bodyParser.json(), cors(),
         let password;
         
         try {
-            console.log(req.session);
             uid = req.session.passport.user.uid;
             password = "mythe";
         } catch (err) {
diff --git a/src/views/home.pug b/src/views/home.pug
index ecf13fedf6636a61dca465b52cdd07c5ef4dbafc..23b7f1633f1b7f4f99994577dd5d46310a64fbb6 100644
--- a/src/views/home.pug
+++ b/src/views/home.pug
@@ -12,14 +12,16 @@ block content
         div.form-group
             label(for="columns") Columns
             input.form-control(type="search", name="columns")
-        button.form-control(type="submit") Recherche/<em>Search</em>
+        button.form-control(type="submit",class="button") Recherche/<em>Search</em>
     |
     h2 GraphiQL
-    p 
-        | GraphiQL is an interactive environment to make GraphQL
+    p GraphiQL is an interactive environment to make GraphQL
         | requests to the database.
-    a(href="/graphiql") Check it out.
+    div(class="button")
+        a(href="/graphiql") Check it out.
+    div(class="button")
+        a(href="/voyager") Check it out.
     |
     p Currently logged in as: #{userName}.
     form(action="/logout", method="post")
-        button.form-control(type="submit") Déconnexion/<em>Logout</em>
+        button.form-control(type="submit",class="button") Déconnexion/<em>Logout</em>
diff --git a/src/views/login.pug b/src/views/login.pug
index a67303600b2456f4ea4d18df80e5d7e9931dcfae..f0594a3f816faeec7e79d415611d396ff06493fb 100644
--- a/src/views/login.pug
+++ b/src/views/login.pug
@@ -13,5 +13,5 @@ block content
         div.form-group
             label(for="password") Password
             input.form-control(type="password", placeholder="Password", name="password")
-        button.form-control(type="submit") Connexion/<em>Log in</em>
+        button.form-control(type="submit",class="button") Connexion/<em>Log in</em>
         
\ No newline at end of file