diff --git a/src/Controller/ApiBaseController.php b/src/Controller/ApiBaseController.php
index d5afdd9e73c7da99f5f8723415b03864000d6133..f14817729cc89ae9a2cf960c33dd6d22976e8869 100644
--- a/src/Controller/ApiBaseController.php
+++ b/src/Controller/ApiBaseController.php
@@ -54,7 +54,14 @@ class ApiBaseController extends AbstractController
         return ltrim($this->warning . ' ' . $this->success);
     }
 
-    protected function createJsonResponse(int $code, array $data = []): Response
+    /**
+     * Si pas de data, on récupère les messages logués dans success et warning
+     *
+     * @param int $code
+     * @param array $data
+     * @return Response
+     */
+    protected function createJsonResponse(int $code = 200, array $data = []): Response
     {
         $data = $data ? : $this->getResponseMessage();
 
@@ -66,6 +73,15 @@ class ApiBaseController extends AbstractController
         return $response;
     }
 
+    public function addSuccessMessage($message)
+    {
+        $this->success[] = $message;
+    }
+    public function addWarningMessage($message)
+    {
+        $this->warning[] = $message;
+    }
+
     /**
      * @param $lexiconsIds array
      */
diff --git a/src/Controller/ApiEntryController.php b/src/Controller/ApiEntryController.php
index 7c7ac61952947c6919044723bf0189ff18d636cc..22fb564871f819eaaebf6386f76f33eb0c6abfa8 100644
--- a/src/Controller/ApiEntryController.php
+++ b/src/Controller/ApiEntryController.php
@@ -406,7 +406,7 @@ class ApiEntryController extends ApiBaseController
     }
 
     /**
-     * @Route("/remove", name="api_entry_delete", methods={"DELETE"})
+     * @Route("/delete", name="api_entry_delete", methods={"DELETE"})
      *
      * @OA\Response(
      *     response=200,
diff --git a/src/Controller/ApiGraphyController.php b/src/Controller/ApiGraphyController.php
index 1d913c5c56ff9832e3da4d3d075bf3673c5d8172..013b477f0395fc57bc7749cf42be06e82110ba72 100644
--- a/src/Controller/ApiGraphyController.php
+++ b/src/Controller/ApiGraphyController.php
@@ -79,7 +79,7 @@ class ApiGraphyController extends ApiBaseController
     }
 
     /**
-     * @Route("/remove", name="graphy_delete", methods={"DELETE"})
+     * @Route("/delete", name="graphy_delete", methods={"DELETE"})
      *
      * @OA\Response(
      *     response=200,
diff --git a/src/Controller/ApiGraphyListController.php b/src/Controller/ApiGraphyListController.php
index fc29e5f930788ef4e30a29e6453963f743781769..a3b37ad7dd129bfa036da870971f5bb4efe998f2 100644
--- a/src/Controller/ApiGraphyListController.php
+++ b/src/Controller/ApiGraphyListController.php
@@ -249,7 +249,7 @@ class ApiGraphyListController extends ApiBaseController
     }
 
     /**
-     * @Route("/remove/{id}", name="api_graphy_list_delete", methods={"DELETE"})
+     * @Route("/delete/{id}", name="api_graphy_list_delete", methods={"DELETE"})
      *
      * @OA\Response(
      *     response=200,
diff --git a/src/Controller/ApiHeadwordController.php b/src/Controller/ApiHeadwordController.php
index 05611b538dd0fda466693b375144716a7e2a3bf4..4135c5aa13a797e1da051cfbfee512f50eec4a8c 100644
--- a/src/Controller/ApiHeadwordController.php
+++ b/src/Controller/ApiHeadwordController.php
@@ -86,7 +86,7 @@ class ApiHeadwordController extends ApiBaseController
     }
 
     /**
-     * @Route("/remove", name="headword_delete", methods={"DELETE"})
+     * @Route("/delete", name="headword_delete", methods={"DELETE"})
      *
      * @OA\Response(
      *     response=200,
diff --git a/src/Controller/ApiLabelController.php b/src/Controller/ApiLabelController.php
index 27b03bc11db6d98b29224416ae359c071696a0e4..f68ae4b54825fc1abe6385b94390c42c250aed45 100644
--- a/src/Controller/ApiLabelController.php
+++ b/src/Controller/ApiLabelController.php
@@ -4,7 +4,10 @@ namespace App\Controller;
 
 use App\Entity\Entry;
 use App\Entity\Graphy;
+use App\Entity\Headword;
 use App\Entity\Label;
+use App\Entity\Lexicon;
+use App\Manager\WiktionaryManager;
 use App\Repository\LabelRepository;
 use Doctrine\Persistence\ManagerRegistry;
 use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
@@ -223,7 +226,9 @@ class ApiLabelController extends ApiBaseController
     }
 
     /**
-     * @Route("/remove/{id}", name="api_label_delete", methods={"DELETE"})
+     * Supprime le label
+     *
+     * @Route("/delete/{id}", name="api_label_delete", methods={"DELETE"})
      *
      * @OA\Response(
      *     response=200,
@@ -249,4 +254,99 @@ class ApiLabelController extends ApiBaseController
 
         return $this->createJsonResponse(200, ['success' => sprintf("Label %s (id: %s) supprimé", $label->getName(), $label->getId())]);
     }
+
+    /**
+     * Retire le label aux graphies spécifiées
+     *
+     * @Route("/remove/{id}", name="api_label_remove", methods={"DELETE"})
+     *
+     * @OA\Response(response=200, description="success", @OA\JsonContent(type="string"))
+     * @OA\Response(response=401, description="error", @OA\JsonContent(type="string"))
+     * @OA\Response(response=403, description="error", @OA\JsonContent(type="string"))
+     * @OA\Response(response=500, description="error", @OA\JsonContent(type="string"))
+     *
+     * @OA\Parameter(
+     *     name="id",
+     *     in="path",
+     *     description="id of the label to be removed",
+     *     @OA\Schema(type="integer")
+     * )
+     * @OA\RequestBody(
+     *     required=true,
+     *     @OA\JsonContent(
+     *       required={"graphies"},
+     *       @OA\Property(property="graphies", type="array",
+     *         example={"hi", "friends"},
+     *         @OA\Items(
+     *           type="string"
+     *         )
+     *       )
+     *     )
+     * )
+     *
+     * @OA\Tag(name="Labels")
+     * @Security(name="OAuth2")
+     */
+    public function remove(Label $label, Request $request)
+    {
+        $data = json_decode($request->getContent(), true);
+        if (!$data) {
+            return $this->createJsonResponse(401, ['error' => sprintf("Json non valide")]);
+        }
+        if ($missingFields = $this->getMissingFields($data, ['graphies'])) {
+            return $this->createJsonResponse(401, ['error' => sprintf("Veuillez fournir une valeur pour: %s", implode(', ', $missingFields))]);
+        }
+
+        $headwords = $this->doctrine->getRepository(Headword::class)->getByGraphyValues($data['graphies']);
+        $count = 0;
+        foreach ($headwords as $headword) {
+            if ($headword->hasLabel($label)) {
+                $headword->removeLabel($label);
+                $count++;
+            }
+        }
+        $this->doctrine->getManager()->flush();
+        $this->addSuccessMessage(sprintf("Le label «%s» (id %s) a été retiré de %s mots-vedettes", $label, $label->getId(), $count));
+
+        return $this->createJsonResponse();
+    }
+
+    /**
+     * Récupère un nombre n de graphies à partir des mot-vedettes possédant un label donné
+     *
+     * @Route("/{id}/extract/{nb}", name="api_label_extract_graphies", methods={"GET"})
+     * @OA\Parameter(name="id", in="path", description="id du label que doivent posséder les graphies (leur mot-vedette)", @OA\Schema(type="integer"))
+     * @OA\Parameter(name="nb", in="path", description="nb de graphies retournées", @OA\Schema(type="integer"))
+     *
+     * @OA\Response(response=200, description="success", @OA\JsonContent(type="string"))
+     * @OA\Response(response=401, description="error", @OA\JsonContent(type="string"))
+     * @OA\Response(response=403, description="error", @OA\JsonContent(type="string"))
+     * @OA\Response(response=500, description="error", @OA\JsonContent(type="string"))
+     *
+     * @OA\Tag(name="Labels")
+     * @Security(name="OAuth2")
+     */
+    public function extractGraphies(Request $request, WiktionaryManager$wiktionaryManager, Label $label, $nb): Response
+    {
+//        $labelId = $request->get('labelId');
+//        if (!$labelId) {
+//            return $this->createJsonResponse(401, ['error' => sprintf("Le paramètre labelId ets obligatoire")]);
+//        }
+//        $label = $this->doctrine->getRepository(Label::class)->find($labelId);
+//        if (!$label) {
+//            return $this->createJsonResponse(401, ['error' => sprintf("Pas de label trouvé pour cette Id")]);
+//        }
+
+        $headwords = $label->getHeadwords()->toArray();
+        $graphies = [];
+        foreach ($headwords as $headword) {
+            foreach ($headword->getGraphies() as $graphy) {
+                $graphies[] = $graphy->getValue();
+            }
+        }
+        shuffle($graphies);
+        $selectedGraphies = array_slice($graphies, 0, $nb);
+
+        return $this->createJsonResponse(200, $selectedGraphies);
+    }
 }
diff --git a/src/Entity/Headword.php b/src/Entity/Headword.php
index 5e47cf15dfc15173c6de237f21616b415170accf..5fff1a73f13b5589d32f5eafde7436078dc98636 100644
--- a/src/Entity/Headword.php
+++ b/src/Entity/Headword.php
@@ -277,4 +277,9 @@ class Headword
 
         return $this;
     }
+
+    public function hasLabel(Label $label)
+    {
+        return $this->getLabels()->contains($label);
+    }
 }
diff --git a/src/Entity/Label.php b/src/Entity/Label.php
index 052b7ea92435b4b878c7fced6beaf90425dfdecc..60f32262d016c8e551fe56f3bea1cfe2d67e5c31 100644
--- a/src/Entity/Label.php
+++ b/src/Entity/Label.php
@@ -233,9 +233,9 @@ class Label
     }
 
     /**
-     * @return Collection<int, Headword>
-     */
-    public function getHeadwords(): Collection
+      * @return Collection|Headword[]
+      */
+    public function getHeadwords()
     {
         return $this->headwords;
     }
diff --git a/src/Repository/HeadwordRepository.php b/src/Repository/HeadwordRepository.php
index 297a0dacce2630ddf0d2c9211464b2f233be07dd..48a3d62e2758d87deff80f7d9d4aac56e046ada1 100644
--- a/src/Repository/HeadwordRepository.php
+++ b/src/Repository/HeadwordRepository.php
@@ -57,6 +57,22 @@ class HeadwordRepository extends ServiceEntityRepository
         return $result ? reset($result) : null;
     }
 
+    /**
+     * @return Headword[]
+     */
+    public function getByGraphyValues($values)
+    {
+        $result =  $this->createQueryBuilder('h')
+            ->innerJoin('h.graphies', 'g')
+            ->andWhere('g.value IN (:values)')
+            ->setParameter('values', $values)
+            ->getQuery()
+            ->getResult()
+        ;
+
+        return $result;
+    }
+
 //    public function findOneBySomeField($value): ?Headword
 //    {
 //        return $this->createQueryBuilder('l')