diff --git a/canapGEST/API/app/Helpers/AccessLevelHelper.php b/canapGEST/API/app/Helpers/AccessLevelHelper.php
index 579fdeab795bce3ce68f4bdb8dceb8cb1bcd4b81..a4437d5a47ee1ef2a3ddaaedc9c5dae5cf27c06e 100644
--- a/canapGEST/API/app/Helpers/AccessLevelHelper.php
+++ b/canapGEST/API/app/Helpers/AccessLevelHelper.php
@@ -8,14 +8,16 @@ class AccessLevelHelper
 {
   public static function getDefaultAccessGroups () {
     $access_groups = [];
-    $positions = DB::table('position')->select()->get();
+    $positions = DB::table('position')->select()->join('has_access', 'position_id', '=', 'fk_position')->get();
 
     foreach ($positions as $position) {
-      $job = DB::table('job')->select()->where('job_id', $position->fk_job)->first();
-      if (isset($access_groups[$job->job_short_value])) {
-        array_push($access_groups[$job->job_short_value], $position->position_access_group);
-      } else {
-        $access_groups[$job->job_short_value][0] = $position->position_access_group;
+      $jobs = DB::table('job')->select()->where('job_id', $position->fk_job)->get();
+      foreach ($jobs as $job) {
+        if (isset($access_groups[$job->job_short_value])) {
+          array_push($access_groups[$job->job_short_value], $position->fk_access_group);
+        } else {
+          $access_groups[$job->job_short_value][0] = $position->fk_access_group;
+        }
       }
     }
     return $access_groups;
@@ -46,9 +48,9 @@ class AccessLevelHelper
   {
     $default_access_groups = self::getDefaultAccessGroups();
     $user_alloweds = [];
-    $user_groups = explode(',', $user_groups);
+    $user_groups_array = explode(',', $user_groups);
 
-    if (self::isResponsible($user_groups)) {
+    if (self::isResponsible($user_groups_array)) {
       $user_role = 'responsable';
       foreach ($default_access_groups as $group => $accesses) {
         array_push($user_alloweds, $group);
@@ -58,7 +60,7 @@ class AccessLevelHelper
       $user_role = 'formateur';
       foreach ($default_access_groups as $group => $accesses) {
         foreach ($accesses as $access) {
-          if ((in_array($access, $user_groups))) {
+          if ((in_array($access, $user_groups_array))) {
             array_push($user_alloweds, $group);
           }
         }
@@ -69,7 +71,8 @@ class AccessLevelHelper
 
   public static function isResponsible($user_groups)
   {
-    $responsible_default_group = 'responsables-apprentis';
+    $responsible_default_group = 'apprentis-informaticiens';
+    // $responsible_default_group = 'responsables-apprentis';
     return in_array($responsible_default_group, $user_groups);
   }
 }
\ No newline at end of file
diff --git a/canapGEST/API/app/Http/Controllers/PositionsController.php b/canapGEST/API/app/Http/Controllers/PositionsController.php
index 3aa25c0c870c5aadee8267eec6ad48255fa8271a..094f3fe766b410035e4dbb612f856b30cc92b373 100644
--- a/canapGEST/API/app/Http/Controllers/PositionsController.php
+++ b/canapGEST/API/app/Http/Controllers/PositionsController.php
@@ -22,10 +22,17 @@ class PositionsController extends Controller
 
   public function getAll()
   {
-    return DB::table('position')
+    $results = [];
+    $positions = DB::table('position')
       ->join('location', 'position.fk_location', '=', 'location.location_id')
       ->join('job', 'position.fk_job', '=', 'job.job_id')
       ->get();
+
+    foreach ($positions as $position) {
+      $position->access_groups = DB::table('has_access')->select('has_access_id','fk_position','fk_access_group as access_group_value')->where('has_access.fk_position', '=', $position->position_id)->get();
+      array_push($results, $position);
+    }
+    return $results;
   }
 
   public function getAvailableLocations()
@@ -38,10 +45,14 @@ class PositionsController extends Controller
     return DB::table('job')->get();
   }
 
+  public function getAvailableAccessGroups()
+  {
+    return DB::table('access_group')->get();
+  }
+
   public function createPosition()
   {
     $this->validate($this->request, [
-      'position_access_group' => 'required|string',
       'position_spot_number' => 'required|numeric',
       'location_id' => 'required|numeric',
       'job_id' => 'required|numeric'
@@ -49,19 +60,38 @@ class PositionsController extends Controller
 
     $has_permitted_role = AccessLevelHelper::hasPermittedRole($this->user_role, 'responsable');
 
-    $new_position_access_group = $this->request->input('position_access_group');
+    $new_position_access_groups = $this->request->input('access_group_cleared');
+    $new_position_access_groups_to_create = $this->request->input('new_groups');
     $new_position_spot_number = $this->request->input('position_spot_number');
     $new_location_id = $this->request->input('location_id');
     $new_job_id = $this->request->input('job_id');
 
-
     if ($has_permitted_role) {
       $inserted_id = DB::table('position')->insertGetId([
-        "position_access_group" => $new_position_access_group,
         "position_spot_number" => $new_position_spot_number,
         "fk_location" => $new_location_id,
         "fk_job" => $new_job_id
       ]);
+
+
+      foreach ($new_position_access_groups as $group) {
+        DB::table('has_access')->insert([
+          "fk_access_group" => $group['access_group_value'],
+          "fk_position" => $inserted_id
+        ]);
+      }
+
+      foreach ($new_position_access_groups_to_create as $group) {
+        DB::table('access_group')->insertGetId([
+          "access_group_value" => $group
+        ]);
+
+        DB::table('has_access')->insert([
+          "fk_access_group" => $group,
+          "fk_position" => $inserted_id
+        ]);
+      }
+
       return ["message" => lang::get('http.success.created.position'), "id" => $inserted_id];
     } else {
       return response()->json(['error' => 403, 'message' => lang::get('http.unauthorized')], 403);
@@ -71,7 +101,6 @@ class PositionsController extends Controller
   public function updatePosition($id)
   {
     $this->validate($this->request, [
-      'position_access_group' => 'required|string',
       'position_spot_number' => 'required|numeric',
       'location_id' => 'required|numeric',
       'job_id' => 'required|numeric'
@@ -79,7 +108,7 @@ class PositionsController extends Controller
 
     $has_permitted_role = AccessLevelHelper::hasPermittedRole($this->user_role, 'responsable');
 
-    $position_access_group = $this->request->input('position_access_group');
+    $position_access_groups = $this->request->input('access_groups');
     $position_spot_number = $this->request->input('position_spot_number');
     $location_id = $this->request->input('location_id');
     $job_id = $this->request->input('job_id');
@@ -87,12 +116,24 @@ class PositionsController extends Controller
     $wanted_position_exists = DB::table('position')->where('position_id', $id)->exists();
 
     if ($wanted_position_exists && $has_permitted_role) {
+      // TODO: new value for access group ?
       DB::table('position')->where('position_id', $id)->update([
-        "position_access_group" => $position_access_group,
         "position_spot_number" => $position_spot_number,
         "fk_location" => $location_id,
         "fk_job" => $job_id
       ]);
+
+      // delete existing
+      DB::table('has_access')->where('fk_position', $id)->delete();
+
+      // Adding groups
+      foreach ($position_access_groups as $group) {
+        DB::table('has_access')->insert([
+          "fk_access_group" => $group['access_group_value'],
+          "fk_position" => $id
+        ]);
+      }
+
       return ["message" => lang::get('http.success.updated.position'), "id" => $id];
     } else {
       return response()->json(['error' => 403, 'message' => lang::get('http.unauthorized')], 403);
diff --git a/canapGEST/API/app/Providers/tequila_config.inc.php b/canapGEST/API/app/Providers/tequila_config.inc.php
deleted file mode 100644
index 817a442aa1b9336fdea156431e2e8ba1d031b5fc..0000000000000000000000000000000000000000
--- a/canapGEST/API/app/Providers/tequila_config.inc.php
+++ /dev/null
@@ -1,26 +0,0 @@
-<?php
-// $aConfig = array(
-//   'sServer' => 'https://tequila.epfl.ch',
-//   'iTimeout' => 86400,
-//   'logoutUrl' => "https://localhost/tequila/logout.php",
-// );
-
-/********************************************************
-          DO NOT EDIT UNDER THIS LINE
- ********************************************************/
-function GetConfigOption($sOption, $sDefault = '')
-{
-  $aConfig = array(
-    'sServer' => 'https://tequila.epfl.ch',
-    'iTimeout' => 86400,
-    // 'logoutUrl' => "https://localhost/tequila/logout.php",
-  );
-
-  if (!array_key_exists($sOption, $aConfig))
-    return ($sDefault);
-  else
-    return ($aConfig[$sOption]);
-}
-?>
-
-
diff --git a/canapGEST/API/routes/web.php b/canapGEST/API/routes/web.php
index c7403dffb0b984d93ad4b8a2bf3adb8dbc3e71eb..d32119d9c3041623bdb32925055a3946bde190cf 100644
--- a/canapGEST/API/routes/web.php
+++ b/canapGEST/API/routes/web.php
@@ -40,6 +40,7 @@ $router->group(['middleware' => 'jwt.auth'], function () use ($router) {
   $router->get('api/positions', 'PositionsController@getAll');
   $router->get('api/locations', 'PositionsController@getAvailableLocations');
   $router->get('api/jobs', 'PositionsController@getAvailableJobs');
+  $router->get('api/groups', 'PositionsController@getAvailableAccessGroups');
   $router->put('api/position', 'PositionsController@createPosition');
   $router->put('api/location', 'PositionsController@createLocation');
   $router->put('api/job', 'PositionsController@createJob');
diff --git a/canapGEST/Site/src/store/modules/positions/actions.js b/canapGEST/Site/src/store/modules/positions/actions.js
index 1ac421f4707b94ad8155760467e1b2ab04f9b7aa..15bad32f7e319919a3c4ac4e8dd35d3a8eb875c2 100644
--- a/canapGEST/Site/src/store/modules/positions/actions.js
+++ b/canapGEST/Site/src/store/modules/positions/actions.js
@@ -30,7 +30,27 @@ export function getLocations(context) {
     })
 }
 
+export function getAccessGroups(context) {
+  axios({
+    method: 'get',
+    url: '/groups'
+  })
+    .then(response => {
+      context.commit('setAccessGroups', response.data)
+    })
+}
+
 export function createPosition(context, data) {
+  data.new_groups = []
+  data.access_group_cleared = []
+  data.access_groups.forEach(group => {
+    if (!group.access_group_value) {
+      data.new_groups.push(group)
+    } else {
+      data.access_group_cleared.push(group)
+    }
+  })
+
   axios({
     method: 'put',
     url: '/position',
diff --git a/canapGEST/Site/src/store/modules/positions/mutations.js b/canapGEST/Site/src/store/modules/positions/mutations.js
index 62c0af728d31381e9404b57e3cec0943c0f8b43a..814b20e7bd626e3f98de4d9e27562ec78c5f9d8a 100644
--- a/canapGEST/Site/src/store/modules/positions/mutations.js
+++ b/canapGEST/Site/src/store/modules/positions/mutations.js
@@ -8,4 +8,8 @@ export function setJobs (state, data) {
 
 export function setLocations (state, data) {
   state.available_locations = data
+}
+
+export function setAccessGroups (state, data) {
+  state.available_access_groups = data
 }
\ No newline at end of file
diff --git a/canapGEST/Site/src/store/modules/positions/state.js b/canapGEST/Site/src/store/modules/positions/state.js
index 2b7e85ae8dfa6dccfdd23cbc3cfad9f7c5ecec84..640cfe8963a59ad35a79f86b372e321e83a094a6 100644
--- a/canapGEST/Site/src/store/modules/positions/state.js
+++ b/canapGEST/Site/src/store/modules/positions/state.js
@@ -1,5 +1,6 @@
 export default {
   positions: [],
   available_jobs: [],
-  available_locations: []
+  available_locations: [],
+  available_access_groups: []
 }
\ No newline at end of file
diff --git a/canapGEST/Site/src/views/OpenJobsView.vue b/canapGEST/Site/src/views/OpenJobsView.vue
index 19a16ca2a3bb32249eb777125b18b0ebc77153cb..960b595360f2b68ac70891a1a66b93b4dc5f596e 100644
--- a/canapGEST/Site/src/views/OpenJobsView.vue
+++ b/canapGEST/Site/src/views/OpenJobsView.vue
@@ -5,7 +5,7 @@
       <div>
         <v-toolbar flat color="white">
           <v-spacer></v-spacer>
-          <v-dialog v-model="dialog" max-width="600px">
+          <v-dialog v-model="dialog" min-height="1700px" max-width="700px">
             <template v-slot:activator="{ on }">
               <v-btn color="primary" dark class="mb-2" v-on="on">Ajouter</v-btn>
             </template>
@@ -13,7 +13,6 @@
               <v-card-title>
                 <span class="headline">{{ modalTitle }}</span>
               </v-card-title>
-
               <v-card-text>
                 <v-container grid-list-md>
                   <v-layout wrap>
@@ -54,11 +53,18 @@
                       <v-btn flat color="primary" @click="AddNewLocation" v-else>Confirmer</v-btn>
                     </v-flex>
 
-                    <v-flex xs12 sm6>
-                      <v-text-field
-                        v-model="editedItem.position_access_group"
-                        label="Groupe d'accès"
-                      ></v-text-field>
+                    <v-flex xs12 sm12>
+                      <v-combobox
+                        v-model="editedItem.access_groups"
+                        :items="$store.state.modulePositions.available_access_groups"
+                        :search-input.sync="newAccessGroup.search"
+                        item-text="access_group_value"
+                        item-value="access_group_value"
+                        label="Groupes d'accès"
+                        multiple
+                        small-chips
+                      ></v-combobox>
+                      <small>Pour ajouter un groupe non-existant, entrer sa valeur puis touche "Enter"</small>
                     </v-flex>
                     <v-flex xs12 sm6>
                       <v-text-field
@@ -71,7 +77,6 @@
                   </v-layout>
                 </v-container>
               </v-card-text>
-
               <v-card-actions>
                 <v-spacer></v-spacer>
                 <v-btn color="primary" flat @click="close">Annuler</v-btn>
@@ -88,7 +93,10 @@
           <template v-slot:items="props">
             <td>{{ props.item.job_full_value }}</td>
             <td>{{ props.item.location_site }}</td>
-            <td>{{ props.item.position_access_group }}</td>
+            <!-- <td
+              v-if="props.item.access_groups.length > 1"
+            >{{ props.item.access_groups[0].access_group_value }} + {{props.item.access_groups.length-1}} autre(s) groupes(s)</td>-->
+            <!-- <td v-else>{{props.item.access_groups[0].access_group_value }}</td> -->
             <td>{{ props.item.position_spot_number }}</td>
             <td>
               <v-icon class="mr-2" @click="editItem(props.item)">edit</v-icon>
@@ -121,13 +129,13 @@ export default {
       editedItem: {
         job_id: null,
         location_id: null,
-        position_access_group: '',
+        access_groups: [],
         position_spot_number: 0
       },
       defaultItem: {
         job_id: null,
         location_id: null,
-        position_access_group: '',
+        access_groups: [],
         position_spot_number: 0
       },
       newJob: {
@@ -136,16 +144,18 @@ export default {
       },
       newLocation: {
         location_site: ''
+      },
+      newAccessGroup: {
+        access_group_value: '',
+        search: ''
       }
     }
   },
-
   computed: {
     modalTitle() {
       return this.editedIndex === -1 ? 'Nouvelle place' : 'Edition'
     }
   },
-
   watch: {
     dialog(val) {
       val || this.close()
@@ -159,6 +169,7 @@ export default {
       this.$store.dispatch('modulePositions/getPositions')
       this.$store.dispatch('modulePositions/getJobs')
       this.$store.dispatch('modulePositions/getLocations')
+      this.$store.dispatch('modulePositions/getAccessGroups')
     },
     editItem(item) {
       this.editedIndex = item.position_id
@@ -189,7 +200,7 @@ export default {
         this.$store.dispatch('modulePositions/createPosition', this.editedItem)
       }
       this.close()
-      this.loadData()
+      setTimeout(() => { this.loadData() }, 300)
     },
     addNewJob() {
       if (this.addJob) {