diff --git a/src/UnicaenPrivilege/Entity/Db/Mapping/UnicaenPrivilege.Entity.Db.Privilege.dcm.xml b/src/UnicaenPrivilege/Entity/Db/Mapping/UnicaenPrivilege.Entity.Db.Privilege.dcm.xml
index cc97470a986000846c9635454169b8bd098d14cc..ab58cbeb075ccca2f5a49faed9f5f9507d268f8c 100644
--- a/src/UnicaenPrivilege/Entity/Db/Mapping/UnicaenPrivilege.Entity.Db.Privilege.dcm.xml
+++ b/src/UnicaenPrivilege/Entity/Db/Mapping/UnicaenPrivilege.Entity.Db.Privilege.dcm.xml
@@ -2,7 +2,10 @@
 <doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping"
                   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                   xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping http://doctrine-project.org/schemas/orm/doctrine-mapping.xsd">
-    <entity name="UnicaenPrivilege\Entity\Db\Privilege" table="UNICAEN_PRIVILEGE_PRIVILEGE">
+    <entity name="UnicaenPrivilege\Entity\Db\Privilege"
+            table="UNICAEN_PRIVILEGE_PRIVILEGE"
+            repository-class="UnicaenPrivilege\Entity\Db\Repository\PrivilegeRepository"
+    >
 
         <indexes>
             <index name="ix_unicaen_privilege_categorie" columns="CATEGORIE_ID"/>
diff --git a/src/UnicaenPrivilege/Entity/Db/Repository/PrivilegeRepository.php b/src/UnicaenPrivilege/Entity/Db/Repository/PrivilegeRepository.php
new file mode 100644
index 0000000000000000000000000000000000000000..78476ed8388eea626d1790a5e1ab1ea5c490ee92
--- /dev/null
+++ b/src/UnicaenPrivilege/Entity/Db/Repository/PrivilegeRepository.php
@@ -0,0 +1,38 @@
+<?php
+
+namespace UnicaenPrivilege\Entity\Db\Repository;
+
+use Doctrine\ORM\EntityRepository;
+use Doctrine\ORM\QueryBuilder;
+use UnicaenApp\Service\EntityManagerAwareTrait;
+
+class PrivilegeRepository extends EntityRepository
+{
+    use EntityManagerAwareTrait;
+
+    public function createQueryBuilder($alias, $indexBy = null): QueryBuilder
+    {
+        $qb = parent::createQueryBuilder($alias, $indexBy);
+        $qb
+            ->leftjoin($alias . '.roles', 'role')->addSelect('role')
+            ->leftJoin($alias . '.categorie', 'categorie')->addSelect('categorie');
+        return $qb;
+    }
+
+    public function find($id, $lockMode = null, $lockVersion = null)
+    {
+        $qb = $this->createQueryBuilder('privilege')
+            ->andWhere('privilege.id = :id')->setParameter('id', $id)
+        ;
+        $result = $qb->getQuery()->getOneOrNullResult();
+        return $result;
+    }
+
+    public function findAll()
+    {
+        $qb = $this->createQueryBuilder('privilege')
+        ;
+        $result = $qb->getQuery()->getResult();
+        return $result;
+    }
+}
\ No newline at end of file
diff --git a/src/UnicaenPrivilege/Service/Privilege/PrivilegeService.php b/src/UnicaenPrivilege/Service/Privilege/PrivilegeService.php
index 8fc38cfaac330aaf36d0164cbe9132318ff12a7c..9963f05dcf876ace2389d6590caac5211f9e326e 100644
--- a/src/UnicaenPrivilege/Service/Privilege/PrivilegeService.php
+++ b/src/UnicaenPrivilege/Service/Privilege/PrivilegeService.php
@@ -6,6 +6,7 @@ use BjyAuthorize\Provider\Resource\ProviderInterface as ResourceProviderInterfac
 use Doctrine\ORM\NonUniqueResultException;
 use Doctrine\ORM\NoResultException;
 use Doctrine\ORM\ORMException;
+use UnicaenApp\Controller\Plugin\Exception\InvalidArgumentException;
 use UnicaenPrivilege\Entity\Db\PrivilegeCategorieInterface;
 use UnicaenPrivilege\Entity\Db\PrivilegeInterface;
 use UnicaenPrivilege\Exception\RuntimeException;
@@ -26,24 +27,75 @@ class PrivilegeService extends CommonService implements PrivilegeProviderInterfa
 
 
     /**
-     * @param string $privilegeEntityClass
+     * @param string $entityClass
      * @return void
      */
-    public function setEntityClass($privilegeEntityClass)
+    public function setEntityClass(string $entityClass) : void
     {
-        if (! class_exists($privilegeEntityClass) || ! in_array(PrivilegeInterface::class, class_implements($privilegeEntityClass))) {
+        if (! class_exists($entityClass) || ! in_array(PrivilegeInterface::class, class_implements($entityClass))) {
             throw new InvalidArgumentException("L'entité associée aux privilèges doit implémenter " . PrivilegeInterface::class);
         }
 
-        $this->entityClass = $privilegeEntityClass;
+        $this->entityClass = $entityClass;
     }
 
+    /** ENTITY MANAGMENT **********************************************************************************************/
+
+    /**
+     * @param PrivilegeInterface $privilege
+     * @return PrivilegeInterface
+     */
+    public function create(PrivilegeInterface $privilege) : PrivilegeInterface
+    {
+        try {
+            $this->getEntityManager()->persist($privilege);
+            $this->getEntityManager()->flush($privilege);
+        } catch(ORMException $e) {
+            throw new RuntimeException("Un problème est survenu lors de la création du privilège.", null, $e);
+        }
+
+        return $privilege;
+    }
+
+    /**
+     * @param PrivilegeInterface $privilege
+     * @return PrivilegeInterface
+     */
+    public function update(PrivilegeInterface $privilege) : PrivilegeInterface
+    {
+        try {
+            $this->getEntityManager()->flush($privilege);
+        } catch(ORMException $e) {
+            throw new RuntimeException("Un problème est survenu lors de la mise à jour du privilège \"" . $privilege->getLibelle() . "\"", null, $e);
+        }
+
+        return $privilege;
+    }
+
+    /**
+     * @param PrivilegeInterface $privilege
+     * @return PrivilegeInterface
+     */
+    public function delete(PrivilegeInterface $privilege) : PrivilegeInterface
+    {
+        try {
+            $this->getEntityManager()->remove($privilege);
+            $this->getEntityManager()->flush($privilege);
+        } catch(ORMException $e) {
+            throw new RuntimeException("Un problème est survenu lors de la suppression du privilège \"" . $privilege->getLibelle() . "\"", null, $e);
+        }
+
+        return $privilege;
+    }
+
+    /** REQUETAGE *****************************************************************************************************/
+
     /**
      * @param string $code
      * @param int|PrivilegeCategorieInterface $categorie
      * @return PrivilegeInterface|null
      */
-    public function findByCode(string $code, $categorie)
+    public function findByCode(string $code, $categorie) : ?PrivilegeInterface
     {
         return $this->getRepo()->findOneBy(['code' => $code, 'categorie' => $categorie]);
     }
@@ -66,7 +118,7 @@ class PrivilegeService extends CommonService implements PrivilegeProviderInterfa
      * @param int|PrivilegeCategorieInterface $categorie
      * @return PrivilegeInterface|null
      */
-    public function findByLibelle(string $libelle, $categorie)
+    public function findByLibelle(string $libelle, $categorie) : ?PrivilegeInterface
     {
         return $this->getRepo()->findOneBy(['libelle' => $libelle, 'categorie' => $categorie]);
     }
@@ -76,7 +128,7 @@ class PrivilegeService extends CommonService implements PrivilegeProviderInterfa
      * @param array $orderBy
      * @return array
      */
-    public function findByCategorie(PrivilegeCategorieInterface $categorie, array $orderBy = ['ordre' => 'ASC'])
+    public function findByCategorie(PrivilegeCategorieInterface $categorie, array $orderBy = ['ordre' => 'ASC']) : array
     {
         return $this->getRepo()->findBy(['categorie' => $categorie], $orderBy);
     }
@@ -102,52 +154,7 @@ class PrivilegeService extends CommonService implements PrivilegeProviderInterfa
         return $privilegesByCategorie;
     }
 
-    /**
-     * @param PrivilegeInterface $privilege
-     * @return PrivilegeInterface
-     */
-    public function create(PrivilegeInterface $privilege)
-    {
-        try {
-            $this->getEntityManager()->persist($privilege);
-            $this->getEntityManager()->flush($privilege);
-        } catch(ORMException $e) {
-            throw new RuntimeException("Un problème est survenu lors de la création du privilège.", null, $e);
-        }
-
-        return $privilege;
-    }
-
-    /**
-     * @param PrivilegeInterface $privilege
-     * @return PrivilegeInterface
-     */
-    public function update(PrivilegeInterface $privilege)
-    {
-        try {
-            $this->getEntityManager()->flush($privilege);
-        } catch(ORMException $e) {
-            throw new RuntimeException("Un problème est survenu lors de la mise à jour du privilège \"" . $privilege->getLibelle() . "\"", null, $e);
-        }
-
-        return $privilege;
-    }
-
-    /**
-     * @param PrivilegeInterface $privilege
-     * @return PrivilegeInterface
-     */
-    public function delete(PrivilegeInterface $privilege)
-    {
-        try {
-            $this->getEntityManager()->remove($privilege);
-            $this->getEntityManager()->flush($privilege);
-        } catch(ORMException $e) {
-            throw new RuntimeException("Un problème est survenu lors de la suppression du privilège \"" . $privilege->getLibelle() . "\"", null, $e);
-        }
 
-        return $privilege;
-    }
 
     /**
      * @param RoleInterface $role