diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index ca2ec5a629f2a70b1ea1e31412691b479a137e43..c58015fa048d18a3d520bd6ae5142764e5d62978 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -11,7 +11,7 @@ include:
 
 # For jobs that run backend scripts directly
 .backend-setup:
-  image: registry.gitlab.teklia.com/arkindex/backend/base:gitlab-teklia
+  image: registry.gitlab.teklia.com/arkindex/backend/base:django-4.2
 
   cache:
     paths:
diff --git a/Dockerfile b/Dockerfile
index 29185f9b0d4c36622dbc9171bf22c329505e4891..591f81dd54dd465832f8e0497f3895677af12bdb 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,11 +1,11 @@
 # syntax=docker/dockerfile:1
-FROM registry.gitlab.teklia.com/arkindex/backend/base:gitlab-teklia as build
+FROM registry.gitlab.teklia.com/arkindex/backend/base:django-4.2 as build
 
 RUN mkdir build
 ADD . build
 RUN cd build && python3 setup.py sdist
 
-FROM registry.gitlab.teklia.com/arkindex/backend/base:gitlab-teklia
+FROM registry.gitlab.teklia.com/arkindex/backend/base:django-4.2
 
 # Install arkindex and its deps
 # Uses a source archive instead of full local copy to speedup docker build
diff --git a/arkindex/documents/migrations/0003_initial.py b/arkindex/documents/migrations/0003_initial.py
index bae7596a20b60e587058f283515abe7628e32064..7a59f33418a604b88eb369a6c09a738d9cafc65d 100644
--- a/arkindex/documents/migrations/0003_initial.py
+++ b/arkindex/documents/migrations/0003_initial.py
@@ -287,7 +287,7 @@ class Migration(migrations.Migration):
         ),
         migrations.AddConstraint(
             model_name="element",
-            constraint=models.CheckConstraint(check=models.Q(models.Q(("image_id", None), ("polygon", None)), models.Q(models.Q(("image_id", None), ("polygon", None), _connector="OR"), _negated=True), _connector="OR"), name="element_image_and_polygon"),
+            constraint=models.CheckConstraint(check=models.Q(models.Q(("image_id", None), ("polygon", None)), models.Q(("image_id", None), ("polygon", None), _connector="OR", _negated=True), _connector="OR"), name="element_image_and_polygon"),
         ),
         migrations.AddConstraint(
             model_name="element",
diff --git a/arkindex/documents/serializers/elements.py b/arkindex/documents/serializers/elements.py
index b7d70eb7852d42b9023af21f01e714b19b54d1be..f1de6db990c54cdbecdcd1562245d686e1bf7639 100644
--- a/arkindex/documents/serializers/elements.py
+++ b/arkindex/documents/serializers/elements.py
@@ -883,9 +883,11 @@ class ElementTypeSerializer(ElementTypeLightSerializer):
     """
     corpus = serializers.PrimaryKeyRelatedField(queryset=Corpus.objects.none())
 
-    class Meta:
-        model = ElementType
+    class Meta(ElementTypeLightSerializer.Meta):
         fields = ElementTypeLightSerializer.Meta.fields + ("corpus", )
+        # Skip the default UniqueTogetherValidator that gets added because the serializer has both the corpus and slug,
+        # as we do our own validation in the ElementTypeLightSerializer.
+        validators = []
 
     def __init__(self, *args, **kwargs):
         super().__init__(*args, **kwargs)
diff --git a/arkindex/documents/tests/tasks/test_add_parent_selection.py b/arkindex/documents/tests/tasks/test_add_parent_selection.py
index d4b500c73569d9ba14d1d31e445b3280343aee88..85664b510acfbfaa7428919aa6cb09fab7cd59c8 100644
--- a/arkindex/documents/tests/tasks/test_add_parent_selection.py
+++ b/arkindex/documents/tests/tasks/test_add_parent_selection.py
@@ -47,17 +47,17 @@ class TestMoveSelection(FixtureTestCase):
             call(.5),
         ])
 
-        self.assertQuerysetEqual(
+        self.assertQuerySetEqual(
             Element.objects.get_ascending(self.page1.id),
             [self.parent1, self.parent2],
             ordered=False,
         )
-        self.assertQuerysetEqual(
+        self.assertQuerySetEqual(
             Element.objects.get_ascending(self.page2.id),
             [self.parent1, self.parent2],
             ordered=False,
         )
-        self.assertQuerysetEqual(
+        self.assertQuerySetEqual(
             Element.objects.get_ascending(self.page3.id),
             [self.parent1],
             ordered=False,
diff --git a/arkindex/documents/tests/test_bulk_transcription_entities.py b/arkindex/documents/tests/test_bulk_transcription_entities.py
index fc6b747da335aabf97e8f0c20826808aa1a9c626..9dddf4bde8c95a948a197c69264278c9cdbad9e9 100644
--- a/arkindex/documents/tests/test_bulk_transcription_entities.py
+++ b/arkindex/documents/tests/test_bulk_transcription_entities.py
@@ -275,7 +275,7 @@ class TestBulkTranscriptionEntities(FixtureAPITestCase):
         trancription using a WorkerRun of their own local process.
         """
         self.client.force_login(self.user)
-        self.assertQuerysetEqual(
+        self.assertQuerySetEqual(
             self.corpus.entities.values_list("name", "type", "worker_run_id").order_by("name", "type", "worker_run_id"),
             [("Paris", self.location_ent_type.id, None)],
         )
@@ -314,7 +314,7 @@ class TestBulkTranscriptionEntities(FixtureAPITestCase):
             )
             self.assertEqual(response.status_code, status.HTTP_201_CREATED)
 
-        self.assertQuerysetEqual(
+        self.assertQuerySetEqual(
             self.corpus.entities.values_list("name", "type", "worker_run_id").order_by("name", "type", "worker_run_id"),
             [
                 ("Knight", self.person_ent_type.id, self.local_worker_run.id),
@@ -324,7 +324,7 @@ class TestBulkTranscriptionEntities(FixtureAPITestCase):
             ],
         )
 
-        self.assertQuerysetEqual(
+        self.assertQuerySetEqual(
             self.transcription.transcription_entities
             .values_list("entity__name", "entity__type", "offset", "length", "confidence", "worker_run_id")
             .order_by("entity__name", "offset"),
@@ -383,7 +383,7 @@ class TestBulkTranscriptionEntities(FixtureAPITestCase):
             )
             self.assertEqual(response.status_code, status.HTTP_201_CREATED)
 
-        self.assertQuerysetEqual(
+        self.assertQuerySetEqual(
             self.transcription.transcription_entities.values_list(
                 "entity__name", "entity__type", "offset", "length", "confidence", "worker_run_id", "entity__worker_run_id"
             ),
@@ -418,7 +418,7 @@ class TestBulkTranscriptionEntities(FixtureAPITestCase):
             )
             self.assertEqual(response.status_code, status.HTTP_201_CREATED)
 
-        self.assertQuerysetEqual(
+        self.assertQuerySetEqual(
             self.transcription.transcription_entities.values_list(
                 "entity__name", "entity__type", "offset", "length", "confidence", "worker_run_id", "entity__worker_run_id"
             ),
diff --git a/arkindex/documents/tests/test_destroy_worker_results.py b/arkindex/documents/tests/test_destroy_worker_results.py
index ee5b35614b928cc7d251954c2640f925ea3a01db..89eb4f5bace02e2a107a12feb7d7c14542959400 100644
--- a/arkindex/documents/tests/test_destroy_worker_results.py
+++ b/arkindex/documents/tests/test_destroy_worker_results.py
@@ -61,7 +61,7 @@ class TestDestroyWorkerResults(FixtureAPITestCase):
             self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
         self.assertDictEqual(
             response.json(),
-            {"detail": "Not found."}
+            {"detail": "No Corpus matches the given query."}
         )
 
     @patch("arkindex.project.triggers.documents_tasks.worker_results_delete.delay")
diff --git a/arkindex/documents/tests/test_entities_api.py b/arkindex/documents/tests/test_entities_api.py
index 23c898525498a9f0762dce10a5875418bfeb3c41..a949b6e74dcc6a2af3be28b69472f1feb1725ae7 100644
--- a/arkindex/documents/tests/test_entities_api.py
+++ b/arkindex/documents/tests/test_entities_api.py
@@ -106,7 +106,9 @@ class TestEntitiesAPI(FixtureAPITestCase):
 
     @patch("arkindex.users.managers.BaseACLManager.filter_rights", return_value=Corpus.objects.none())
     def test_get_entity_elements_corpus_acl(self, filter_rights_mock):
-        with self.assertNumQueries(0):
+        # One query runs because Django >=4.2 no longer ignores unions that are known to be empty
+        # https://code.djangoproject.com/ticket/35559
+        with self.assertNumQueries(1):
             response = self.client.get(reverse("api:entity-elements", kwargs={"pk": str(self.entity.id)}))
             self.assertEqual(response.status_code, status.HTTP_200_OK)
 
diff --git a/arkindex/documents/tests/test_entity_types.py b/arkindex/documents/tests/test_entity_types.py
index 80522fc451a73b6cd7a6867ad7c96260232cd00d..9348ee6dcce7e8d4b384d9da94728d74cc16cc19 100644
--- a/arkindex/documents/tests/test_entity_types.py
+++ b/arkindex/documents/tests/test_entity_types.py
@@ -365,7 +365,7 @@ class TestEntityTypesAPI(FixtureAPITestCase):
 
         self.assertDictEqual(
             response.json(),
-            {"detail": "Not found."}
+            {"detail": "No EntityType matches the given query."}
         )
 
         self.assertEqual(filter_rights_mock.call_count, 1)
diff --git a/arkindex/documents/tests/test_search_api.py b/arkindex/documents/tests/test_search_api.py
index 2fe56cd2fe22fbf09f8c694c1d450e84f8da4ab7..9aacaf4d34af09a2817daf16e51ba0868f37113c 100644
--- a/arkindex/documents/tests/test_search_api.py
+++ b/arkindex/documents/tests/test_search_api.py
@@ -68,7 +68,7 @@ class TestSearchApi(FixtureAPITestCase):
     def test_corpus_not_found(self):
         response = self.client.get(reverse("api:corpus-search", kwargs={"pk": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"}))
         self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
-        self.assertEqual(response.json(), {"detail": "Not found."})
+        self.assertEqual(response.json(), {"detail": "No Corpus matches the given query."})
 
     @override_settings(ARKINDEX_FEATURES={"search": True})
     @patch("arkindex.project.mixins.has_access", return_value=False)
diff --git a/arkindex/documents/tests/test_selection_api.py b/arkindex/documents/tests/test_selection_api.py
index 36970acf11db753ba11684eea97bf8862c913f72..d2fc1d7bda25f8561c1c55895950aabdba46a089 100644
--- a/arkindex/documents/tests/test_selection_api.py
+++ b/arkindex/documents/tests/test_selection_api.py
@@ -252,7 +252,7 @@ class TestSelectionAPI(FixtureAPITestCase):
         with self.assertNumQueries(3):
             response = self.client.delete(reverse("api:elements-selection"), data={"corpus": bad_id})
         self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
-        self.assertEqual(response.json(), {"detail": "Not found."})
+        self.assertEqual(response.json(), {"detail": "No Corpus matches the given query."})
 
     def test_delete_selection_filter_corpus_not_an_uuid(self):
         bad_id = "melon"
@@ -362,7 +362,7 @@ class TestSelectionAPI(FixtureAPITestCase):
         with self.assertNumQueries(3):
             response = self.client.get(reverse("api:elements-selection"), data={"corpus": bad_id})
         self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
-        self.assertEqual(response.json(), {"detail": "Not found."})
+        self.assertEqual(response.json(), {"detail": "No Corpus matches the given query."})
 
     def test_list_selection_filter_corpus_not_an_uuid(self):
         self.user.selected_elements.add(self.page, self.vol)
diff --git a/arkindex/documents/tests/test_transcriptions.py b/arkindex/documents/tests/test_transcriptions.py
index 618f9aa9eee3ba2405e0e68be69c60212be4d232..f884be9df2d491ab45e79f2e96c76a538657ea72 100644
--- a/arkindex/documents/tests/test_transcriptions.py
+++ b/arkindex/documents/tests/test_transcriptions.py
@@ -305,7 +305,9 @@ class TestTranscriptions(FixtureAPITestCase):
 
         self.client.force_login(self.user)
 
-        with self.assertNumQueries(4):
+        # There should be one less query, but Django >=4.2 no longer ignores unions that are known to be empty
+        # https://code.djangoproject.com/ticket/35559
+        with self.assertNumQueries(5):
             response = self.client.get(
                 reverse("api:element-transcriptions", kwargs={"pk": str(self.page.id)}),
                 data={
diff --git a/arkindex/ponos/tests/test_api.py b/arkindex/ponos/tests/test_api.py
index d7663b63f4618322bbda48379e5a50032b855a27..5b9b3914fe2e655bc97817e55155d7e4fba32551 100644
--- a/arkindex/ponos/tests/test_api.py
+++ b/arkindex/ponos/tests/test_api.py
@@ -846,10 +846,10 @@ class TestAPI(FixtureAPITestCase):
                 "requires_gpu": True,
             },
         )
-        self.assertQuerysetEqual(self.task2.children.all(), Task.objects.none())
+        self.assertQuerySetEqual(self.task2.children.all(), Task.objects.none())
         self.task2.refresh_from_db()
         self.assertEqual(self.task2.slug, f"{task_2_slug}_old2")
-        self.assertQuerysetEqual(
+        self.assertQuerySetEqual(
             restarted_task.children.all(),
             Task.objects.filter(id__in=[self.task3.id, task4.id]),
         )
@@ -912,10 +912,10 @@ class TestAPI(FixtureAPITestCase):
                 "requires_gpu": False,
             },
         )
-        self.assertQuerysetEqual(self.task2.children.all(), Task.objects.none())
+        self.assertQuerySetEqual(self.task2.children.all(), Task.objects.none())
         self.task2.refresh_from_db()
         self.assertEqual(self.task2.slug, f"{task_2_slug}_old1")
-        self.assertQuerysetEqual(
+        self.assertQuerySetEqual(
             restarted_task.children.all(),
             Task.objects.filter(id__in=[self.task3.id, task4.id]),
         )
diff --git a/arkindex/process/tests/commands/test_cache_worker_runs.py b/arkindex/process/tests/commands/test_cache_worker_runs.py
index 6d9e2ee6a2c3f74561f89394324dbdd1f3e004da..b8f6c60f3e2a3ef59238a0392ee0283196317a2a 100644
--- a/arkindex/process/tests/commands/test_cache_worker_runs.py
+++ b/arkindex/process/tests/commands/test_cache_worker_runs.py
@@ -47,13 +47,13 @@ class TestCacheWorkerRuns(FixtureTestCase):
         )
 
     def test_run(self):
-        self.assertQuerysetEqual(
+        self.assertQuerySetEqual(
             WorkerRun.objects.order_by("summary").values_list("id", "has_results"),
             [(self.run_1.id, False), (self.run_2.id, False), (self.run_3.id, True), (self.run_4.id, True), (self.run_5.id, False)]
         )
         with self.assertNumQueries(2):
             call_command("cache_worker_runs")
-        self.assertQuerysetEqual(
+        self.assertQuerySetEqual(
             WorkerRun.objects.order_by("summary").values_list("id", "has_results"),
             [(self.run_1.id, False), (self.run_2.id, True), (self.run_3.id, False), (self.run_4.id, True), (self.run_5.id, False)]
         )
diff --git a/arkindex/process/tests/test_process_dataset_sets.py b/arkindex/process/tests/test_process_dataset_sets.py
index f314f3e1a04e2d9ddd0ff51115a3a5bb886e4037..373dc6dc0a4e04b1fb0d9e72512637b12f24413c 100644
--- a/arkindex/process/tests/test_process_dataset_sets.py
+++ b/arkindex/process/tests/test_process_dataset_sets.py
@@ -293,7 +293,7 @@ class TestProcessDatasetSets(FixtureAPITestCase):
             self.assertEqual(response.status_code, status.HTTP_201_CREATED)
         self.assertEqual(ProcessDatasetSet.objects.count(), 10)
         self.assertTrue(ProcessDatasetSet.objects.filter(process=self.dataset_process.id, set=test_set.id).exists())
-        self.assertQuerysetEqual(self.dataset_process.sets.order_by("dataset__name", "name"), [
+        self.assertQuerySetEqual(self.dataset_process.sets.order_by("dataset__name", "name"), [
             *self.private_dataset.sets.order_by("name"),
             *self.dataset1.sets.order_by("name"),
             test_set,
diff --git a/arkindex/process/tests/test_process_elements.py b/arkindex/process/tests/test_process_elements.py
index ddb62ef3d3bd3cd06d77df0ca3bf242000308210..dc69c9734f620296462c965b3e41ddf9368680aa 100644
--- a/arkindex/process/tests/test_process_elements.py
+++ b/arkindex/process/tests/test_process_elements.py
@@ -574,7 +574,7 @@ class TestProcessElements(FixtureAPITestCase):
         with self.assertNumQueries(3):
             response = self.client.get(reverse("api:process-elements-list", kwargs={"pk": process.id}))
             self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
-        self.assertDictEqual(response.json(), {"detail": "Not found."})
+        self.assertEqual(response.json(), {"detail": "No Process matches the given query."})
 
     def test_workers_mode(self):
         # The Workers mode returns some elements
diff --git a/arkindex/process/tests/test_processes.py b/arkindex/process/tests/test_processes.py
index 802e11c757343a3cbdcf90fed70e9633f957424c..5033161fac9846353985d19fe2c4fedc58f63676 100644
--- a/arkindex/process/tests/test_processes.py
+++ b/arkindex/process/tests/test_processes.py
@@ -1755,7 +1755,7 @@ class TestProcesses(FixtureAPITestCase):
         process.refresh_from_db()
         self.assertEqual(process.state, State.Unscheduled)
         self.assertIsNone(process.finished)
-        self.assertQuerysetEqual(
+        self.assertQuerySetEqual(
             process.tasks.filter(run=1).values_list("slug", flat=True),
             ["import_files"],
         )
@@ -1791,7 +1791,7 @@ class TestProcesses(FixtureAPITestCase):
         process.refresh_from_db()
         self.assertEqual(process.state, State.Unscheduled)
         self.assertIsNone(process.finished)
-        self.assertQuerysetEqual(
+        self.assertQuerySetEqual(
             process.tasks.filter(run=1).values_list("slug", flat=True),
             ["import_s3"],
         )
@@ -1898,7 +1898,7 @@ class TestProcesses(FixtureAPITestCase):
         data = response.json()
         process = Process.objects.get(id=data["id"])
         self.assertEqual(process.mode, ProcessMode.Files)
-        self.assertQuerysetEqual(
+        self.assertQuerySetEqual(
             process.files.all(), [
                 self.img_df,
                 self.pdf_df,
@@ -2063,7 +2063,7 @@ class TestProcesses(FixtureAPITestCase):
             reverse("api:process-start", kwargs={"pk": "12341234-1234-1234-1234-123412341234"})
         )
         self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
-        self.assertEqual(response.json(), {"detail": "Not found."})
+        self.assertEqual(response.json(), {"detail": "No Process matches the given query."})
 
     def test_start_process_wrong_process_mode(self):
         self.assertFalse(self.user_img_process.mode in (ProcessMode.Workers, ProcessMode.Dataset))
@@ -2375,7 +2375,7 @@ class TestProcesses(FixtureAPITestCase):
         self.assertEqual(process2.tasks.count(), 1)
         task = process2.tasks.get()
         self.assertEqual(task.slug, run.task_slug)
-        self.assertQuerysetEqual(process2.sets.order_by("dataset__name"), [
+        self.assertQuerySetEqual(process2.sets.order_by("dataset__name"), [
             test_set_2, test_set_1
         ])
 
@@ -2685,8 +2685,8 @@ class TestProcesses(FixtureAPITestCase):
         task_1 = process.tasks.get(slug=run_1.task_slug)
         task_2 = process.tasks.get(slug=run_2.task_slug)
 
-        self.assertQuerysetEqual(task_1.parents.all(), [init_task])
-        self.assertQuerysetEqual(task_2.parents.all(), [task_1])
+        self.assertQuerySetEqual(task_1.parents.all(), [init_task])
+        self.assertQuerySetEqual(task_2.parents.all(), [task_1])
 
     @override_settings(PONOS_DEFAULT_ENV={"ARKINDEX_API_TOKEN": "testToken"})
     @override_settings(ARKINDEX_TASKS_IMAGE="registry.teklia.com/tasks")
@@ -3137,7 +3137,7 @@ class TestProcesses(FixtureAPITestCase):
             "activity_state": "disabled",
             "use_cache": False
         })
-        self.assertQuerysetEqual(
+        self.assertQuerySetEqual(
             Process.objects.get(id=new_id).elements.all(),
             [volume],
         )
diff --git a/arkindex/process/tests/test_signals.py b/arkindex/process/tests/test_signals.py
index 3719074bad7d53449539e6179dd46a562b3127ac..ecc6f86160753e32daac2557625c78d27bf95b5d 100644
--- a/arkindex/process/tests/test_signals.py
+++ b/arkindex/process/tests/test_signals.py
@@ -248,7 +248,7 @@ class TestSignals(FixtureAPITestCase):
         )
 
         self.assertEqual(len(self.process_1.worker_runs.all()), 2)
-        self.assertQuerysetEqual(
+        self.assertQuerySetEqual(
             self.process_1.worker_runs.all(),
             [self.run_1, run_2],
             ordered=False,
diff --git a/arkindex/process/tests/test_workerruns.py b/arkindex/process/tests/test_workerruns.py
index efd8b2a4e1ec1ab62d19553723577fa2c82b05be..a69e3b1ed4cd7b89b98443eb4493e8b7662143ee 100644
--- a/arkindex/process/tests/test_workerruns.py
+++ b/arkindex/process/tests/test_workerruns.py
@@ -328,7 +328,7 @@ class TestWorkerRuns(FixtureAPITestCase):
             )
             self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
 
-        self.assertEqual(response.json(), {"detail": "Not found."})
+        self.assertEqual(response.json(), {"detail": "No Process matches the given query."})
 
     def test_create_invalid_process_mode(self):
         self.client.force_login(self.user)
diff --git a/arkindex/process/tests/test_workers.py b/arkindex/process/tests/test_workers.py
index 3ca0775144b31712cf9d01fed8c168bcfa28b284..ac749492b81df2cec7414bd43c623db4d19531e1 100644
--- a/arkindex/process/tests/test_workers.py
+++ b/arkindex/process/tests/test_workers.py
@@ -546,7 +546,7 @@ class TestWorkersWorkerVersions(FixtureAPITestCase):
             response = self.client.get(reverse("api:worker-retrieve", kwargs={"pk": str(self.worker_reco.id)}))
             self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
 
-        self.assertEqual(response.json(), {"detail": "Not found."})
+        self.assertEqual(response.json(), {"detail": "No Worker matches the given query."})
 
         self.assertListEqual(filter_rights_mock.call_args_list, [
             call(self.user, Worker, Role.Contributor.value),
@@ -605,7 +605,7 @@ class TestWorkersWorkerVersions(FixtureAPITestCase):
         worker = Worker.objects.get(id=data["id"])
         self.assertEqual(worker.type, self.worker_type_dla)
         self.assertIsNone(worker.repository)
-        self.assertQuerysetEqual(worker.memberships.values_list("user_id", "level"), [
+        self.assertQuerySetEqual(worker.memberships.values_list("user_id", "level"), [
             (self.user.id, Role.Admin.value)
         ])
         self.assertDictEqual(data, {
@@ -639,7 +639,7 @@ class TestWorkersWorkerVersions(FixtureAPITestCase):
             self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
 
         self.assertFalse(WorkerType.objects.filter(slug="new_type").exists())
-        self.assertQuerysetEqual(self.worker_custom.memberships.values_list("user_id", "level"), [
+        self.assertQuerySetEqual(self.worker_custom.memberships.values_list("user_id", "level"), [
             (self.user.id, Role.Guest.value)
         ])
         self.assertDictEqual(response.json(), {"slug": ["You cannot use this value."]})
@@ -758,7 +758,7 @@ class TestWorkersWorkerVersions(FixtureAPITestCase):
             )
             self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
 
-        self.assertEqual(response.json(), {"detail": "Not found."})
+        self.assertEqual(response.json(), {"detail": "No Worker matches the given query."})
         self.assertListEqual(filter_rights_mock.call_args_list, [
             call(self.user, Worker, Role.Contributor.value),
             call(self.user, Repository, Role.Contributor.value),
@@ -990,7 +990,7 @@ class TestWorkersWorkerVersions(FixtureAPITestCase):
             )
             self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
 
-        self.assertEqual(response.json(), {"detail": "Not found."})
+        self.assertEqual(response.json(), {"detail": "No Worker matches the given query."})
 
         self.assertListEqual(filter_rights_mock.call_args_list, [
             call(self.user, Worker, Role.Contributor.value),
@@ -1007,7 +1007,7 @@ class TestWorkersWorkerVersions(FixtureAPITestCase):
             Repository.objects.none(),
         ]
 
-        with self.assertNumQueries(6):
+        with self.assertNumQueries(5):
             response = self.client.patch(
                 reverse("api:worker-retrieve", kwargs={"pk": str(self.worker_reco.id)}),
                 {
@@ -1143,7 +1143,7 @@ class TestWorkersWorkerVersions(FixtureAPITestCase):
                 self.worker_reco.archived = current_value
                 self.worker_reco.save()
 
-                with self.assertNumQueries(5):
+                with self.assertNumQueries(4):
                     response = self.client.patch(
                         reverse("api:worker-retrieve", kwargs={"pk": str(self.worker_reco.id)}),
                         {
@@ -1333,7 +1333,7 @@ class TestWorkersWorkerVersions(FixtureAPITestCase):
             )
             self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
 
-        self.assertEqual(response.json(), {"detail": "Not found."})
+        self.assertDictEqual(response.json(), {"detail": "No Worker matches the given query."})
 
     def test_create_version_available_requires_docker_image(self):
         with self.assertNumQueries(4):
@@ -2467,7 +2467,7 @@ class TestWorkersWorkerVersions(FixtureAPITestCase):
             response = self.client.get(reverse("api:corpus-versions", kwargs={"pk": self.corpus.id}))
             self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
 
-        self.assertDictEqual(response.json(), {"detail": "Not found."})
+        self.assertDictEqual(response.json(), {"detail": "No Corpus matches the given query."})
 
     def test_corpus_worker_version_not_verified(self):
         self.user.verified_email = False
diff --git a/arkindex/process/utils.py b/arkindex/process/utils.py
index ef58ba9c33eff9aa2d6be4912a4c6cea74013a87..95a03e4c36ca62a1f412f6301d68a9426c37133c 100644
--- a/arkindex/process/utils.py
+++ b/arkindex/process/utils.py
@@ -2,8 +2,8 @@ import json
 from hashlib import md5
 
 from django.conf import settings
-from django.db.models import CharField, Value
-from django.db.models.functions import Cast, Concat, NullIf
+from django.db.models import ExpressionWrapper, F, TextField, Value
+from django.db.models.functions import Concat, NullIf
 from django.utils.module_loading import import_string
 
 from arkindex.project.tools import RTrimChr
@@ -27,11 +27,12 @@ def annotate_image_url(field="image"):
     so we strip any trailing slashes and add our own.
     This uses NullIf as this concatenation will return '/' if there is no zone on the element.
     """
+    slash = Value("/", output_field=TextField())
     return NullIf(
         Concat(
-            RTrimChr(f"{field}__server__url", Value("/")),
-            Value("/"),
-            Cast(f"{field}__path", CharField()),
+            RTrimChr(f"{field}__server__url", slash),
+            slash,
+            ExpressionWrapper(F(f"{field}__path"), output_field=TextField()),
         ),
-        Value("/"),
+        slash,
     )
diff --git a/arkindex/project/tests/test_argparse.py b/arkindex/project/tests/test_argparse.py
index afeaeaf25f68b6b6750494f2ed2524e2233d67bb..b4b40ee64d8d131e71680887ae6a25c129aebf0d 100644
--- a/arkindex/project/tests/test_argparse.py
+++ b/arkindex/project/tests/test_argparse.py
@@ -26,7 +26,7 @@ class TestArgparseHelpers(FixtureTestCase):
     def test_corpus_argument_many(self):
         arg = CorpusArgument(many=True)
         result = arg("tests")
-        self.assertQuerysetEqual(result, [self.corpus, ])
+        self.assertQuerySetEqual(result, [self.corpus, ])
 
     def test_corpus_argument_not_found(self):
         arg = CorpusArgument()
@@ -61,7 +61,7 @@ class TestArgparseHelpers(FixtureTestCase):
     def test_element_argument_many(self):
         arg = ElementArgument(type__folder=True, many=True)
         result = arg("volume 1")
-        self.assertQuerysetEqual(result, [self.vol, ])
+        self.assertQuerySetEqual(result, [self.vol, ])
 
     def test_element_argument_multiple(self):
         arg = ElementArgument()
diff --git a/arkindex/project/tools.py b/arkindex/project/tools.py
index ab448463f8b008537077603e579814aea024c477..989e1aeb96fd6be8299035b1d0c227a996604612 100644
--- a/arkindex/project/tools.py
+++ b/arkindex/project/tools.py
@@ -2,7 +2,7 @@ from collections.abc import Iterable, Iterator, Sized
 from datetime import datetime, timezone
 from urllib.parse import urlparse
 
-from django.db.models import Aggregate, CharField, Func
+from django.db.models import Aggregate, Func, TextField
 from django.db.models.expressions import BaseExpression, OrderByList
 from django.urls import reverse
 
@@ -151,7 +151,7 @@ class RTrimChr(Func):
     """
     function = "RTRIM"
     arity = 2
-    output_field = CharField()
+    output_field = TextField()
 
 
 class OrderedSetAggregate(Aggregate):
diff --git a/arkindex/sql_validation/add_first_parent.sql b/arkindex/sql_validation/add_first_parent.sql
index 94369ab03b01498afecf35e500cb54d8c81bbf84..755f1b3fba9910e0f10aa7928806985768a33b4b 100644
--- a/arkindex/sql_validation/add_first_parent.sql
+++ b/arkindex/sql_validation/add_first_parent.sql
@@ -18,10 +18,10 @@ SELECT EXISTS
      LIMIT 1), EXISTS
     (SELECT 1
      FROM child_paths
-     WHERE path @ > ARRAY['{A}'::uuid]), EXISTS
+     WHERE path @> ARRAY['{A}'::uuid]), EXISTS
     (SELECT 1
      FROM parent_paths
-     WHERE path @ > ARRAY['{B}'::uuid]),
+     WHERE path @> ARRAY['{B}'::uuid]),
     (SELECT COUNT(*)
      FROM parent_paths),
     (SELECT path
@@ -29,7 +29,7 @@ SELECT EXISTS
      LIMIT 1),
     (SELECT COALESCE(MAX(ordering) + 1, 0)
      FROM documents_elementpath
-     WHERE path @ > ARRAY['{A}'::uuid]
+     WHERE path @> ARRAY['{A}'::uuid]
 	AND path[array_length(path, 1)] = '{A}'::uuid ) ;
 
 INSERT INTO documents_elementpath (id, element_id, path, ordering)
@@ -45,7 +45,7 @@ UPDATE "documents_elementpath"
 SET "path" = ARRAY['{first_parent}'::uuid,
                    '{A}'::uuid]::uuid[], "ordering" = 1
 WHERE ("documents_elementpath"."element_id" = '{B}'::uuid
-       AND "documents_elementpath"."path" = (ARRAY[])::uuid[]);
+       AND "documents_elementpath"."path" = '{{}}'::uuid[]);
 
 UPDATE "documents_elementpath"
 SET "path" = array_cat(ARRAY['{first_parent}'::uuid, '{A}'::uuid], "documents_elementpath"."path")::uuid[]
@@ -58,7 +58,7 @@ SELECT uuid_generate_v4(),
        child_paths.ordering
 FROM documents_elementpath child_paths,
      documents_elementpath new_parent_paths
-WHERE child_paths.path @ > ARRAY['{first_parent}'::uuid,
+WHERE child_paths.path @> ARRAY['{first_parent}'::uuid,
                                  '{A}'::uuid,
                                  '{B}'::uuid]
     AND new_parent_paths.element_id = '{A}'::uuid
diff --git a/arkindex/sql_validation/add_second_parent.sql b/arkindex/sql_validation/add_second_parent.sql
index ba4374ad9b9d833fc176ee9ed2c7f8d9d6e0c8a6..0d8691022ae2be762d6e99705a4321f2915617e4 100644
--- a/arkindex/sql_validation/add_second_parent.sql
+++ b/arkindex/sql_validation/add_second_parent.sql
@@ -18,10 +18,10 @@ SELECT EXISTS
      LIMIT 1), EXISTS
     (SELECT 1
      FROM child_paths
-     WHERE path @ > ARRAY['{A}'::uuid]), EXISTS
+     WHERE path @> ARRAY['{A}'::uuid]), EXISTS
     (SELECT 1
      FROM parent_paths
-     WHERE path @ > ARRAY['{B}'::uuid]),
+     WHERE path @> ARRAY['{B}'::uuid]),
     (SELECT COUNT(*)
      FROM parent_paths),
     (SELECT path
@@ -29,7 +29,7 @@ SELECT EXISTS
      LIMIT 1),
     (SELECT COALESCE(MAX(ordering) + 1, 0)
      FROM documents_elementpath
-     WHERE path @ > ARRAY['{A}'::uuid]
+     WHERE path @> ARRAY['{A}'::uuid]
 	AND path[array_length(path, 1)] = '{A}'::uuid ) ;
 
 INSERT INTO documents_elementpath (id, element_id, path, ordering)
@@ -47,7 +47,7 @@ SELECT uuid_generate_v4(),
        child_paths.ordering
 FROM documents_elementpath child_paths,
      documents_elementpath new_parent_paths
-WHERE child_paths.path @ > ARRAY['{K}'::uuid,
+WHERE child_paths.path @> ARRAY['{K}'::uuid,
                                  '{B}'::uuid]
     AND new_parent_paths.element_id = '{A}'::uuid ;
 
diff --git a/arkindex/sql_validation/element_move_with_children.sql b/arkindex/sql_validation/element_move_with_children.sql
index 5bd41790a3b95dffce1f82660d6e1523d816eae9..354e208d6070f14d16b1290e5228ee07924927c4 100644
--- a/arkindex/sql_validation/element_move_with_children.sql
+++ b/arkindex/sql_validation/element_move_with_children.sql
@@ -21,7 +21,7 @@ WHERE element_id = '{source_id}'::uuid ;
 
 UPDATE documents_elementpath
 SET path = path[2:]
-WHERE path @ > ARRAY['{parent_id}'::uuid,
+WHERE path @> ARRAY['{parent_id}'::uuid,
                      '{source_id}'::uuid]
     AND path[0:2] = ARRAY['{parent_id}'::uuid,
                           '{source_id}'::uuid] ;
@@ -53,10 +53,10 @@ SELECT EXISTS
      LIMIT 1), EXISTS
     (SELECT 1
      FROM child_paths
-     WHERE path @ > ARRAY['{destination_id}'::uuid]), EXISTS
+     WHERE path @> ARRAY['{destination_id}'::uuid]), EXISTS
     (SELECT 1
      FROM parent_paths
-     WHERE path @ > ARRAY['{source_id}'::uuid]),
+     WHERE path @> ARRAY['{source_id}'::uuid]),
     (SELECT COUNT(*)
      FROM parent_paths),
     (SELECT path
@@ -64,13 +64,13 @@ SELECT EXISTS
      LIMIT 1),
     (SELECT COALESCE(MAX(ordering) + 1, 0)
      FROM documents_elementpath
-     WHERE path @ > ARRAY['{destination_id}'::uuid]
+     WHERE path @> ARRAY['{destination_id}'::uuid]
        AND path[array_length(path, 1)] = '{destination_id}'::uuid ) ;
 
 UPDATE "documents_elementpath"
 SET "path" = ARRAY['{destination_id}'::uuid]::uuid[], "ordering" = 3
 WHERE ("documents_elementpath"."element_id" = '{source_id}'::uuid
-       AND "documents_elementpath"."path" = (ARRAY[])::uuid[]);
+       AND "documents_elementpath"."path" = '{{}}'::uuid[]);
 
 UPDATE "documents_elementpath"
 SET "path" = array_cat(ARRAY['{destination_id}'::uuid], "documents_elementpath"."path")::uuid[]
diff --git a/arkindex/sql_validation/element_move_without_child.sql b/arkindex/sql_validation/element_move_without_child.sql
index 5bd41790a3b95dffce1f82660d6e1523d816eae9..354e208d6070f14d16b1290e5228ee07924927c4 100644
--- a/arkindex/sql_validation/element_move_without_child.sql
+++ b/arkindex/sql_validation/element_move_without_child.sql
@@ -21,7 +21,7 @@ WHERE element_id = '{source_id}'::uuid ;
 
 UPDATE documents_elementpath
 SET path = path[2:]
-WHERE path @ > ARRAY['{parent_id}'::uuid,
+WHERE path @> ARRAY['{parent_id}'::uuid,
                      '{source_id}'::uuid]
     AND path[0:2] = ARRAY['{parent_id}'::uuid,
                           '{source_id}'::uuid] ;
@@ -53,10 +53,10 @@ SELECT EXISTS
      LIMIT 1), EXISTS
     (SELECT 1
      FROM child_paths
-     WHERE path @ > ARRAY['{destination_id}'::uuid]), EXISTS
+     WHERE path @> ARRAY['{destination_id}'::uuid]), EXISTS
     (SELECT 1
      FROM parent_paths
-     WHERE path @ > ARRAY['{source_id}'::uuid]),
+     WHERE path @> ARRAY['{source_id}'::uuid]),
     (SELECT COUNT(*)
      FROM parent_paths),
     (SELECT path
@@ -64,13 +64,13 @@ SELECT EXISTS
      LIMIT 1),
     (SELECT COALESCE(MAX(ordering) + 1, 0)
      FROM documents_elementpath
-     WHERE path @ > ARRAY['{destination_id}'::uuid]
+     WHERE path @> ARRAY['{destination_id}'::uuid]
        AND path[array_length(path, 1)] = '{destination_id}'::uuid ) ;
 
 UPDATE "documents_elementpath"
 SET "path" = ARRAY['{destination_id}'::uuid]::uuid[], "ordering" = 3
 WHERE ("documents_elementpath"."element_id" = '{source_id}'::uuid
-       AND "documents_elementpath"."path" = (ARRAY[])::uuid[]);
+       AND "documents_elementpath"."path" = '{{}}'::uuid[]);
 
 UPDATE "documents_elementpath"
 SET "path" = array_cat(ARRAY['{destination_id}'::uuid], "documents_elementpath"."path")::uuid[]
diff --git a/arkindex/sql_validation/element_trash_children.sql b/arkindex/sql_validation/element_trash_children.sql
index 0ad34d8158a14e83173c689578007cae862219be..180543969b7f03f13feacdc75d18440d104e2062 100644
--- a/arkindex/sql_validation/element_trash_children.sql
+++ b/arkindex/sql_validation/element_trash_children.sql
@@ -18,7 +18,7 @@ WHERE "documents_transcriptionentity"."id" IN
                  (SELECT V0."id"
                   FROM "documents_element" V0
                   INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-                  WHERE V1."path"[2] IN
+                  WHERE (V1."path")[2] IN
                           (SELECT U0."id"
                            FROM "documents_element" U0
                            WHERE U0."id" = '{id}'::uuid)));
@@ -29,7 +29,7 @@ WHERE "documents_transcription"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[2] IN
+         WHERE (V1."path")[2] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE U0."id" = '{id}'::uuid));
@@ -40,7 +40,7 @@ WHERE "process_workeractivity"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[2] IN
+         WHERE (V1."path")[2] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE U0."id" = '{id}'::uuid));
@@ -51,7 +51,7 @@ WHERE "documents_metadata"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[2] IN
+         WHERE (V1."path")[2] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE U0."id" = '{id}'::uuid));
@@ -62,7 +62,7 @@ WHERE "documents_classification"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[2] IN
+         WHERE (V1."path")[2] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE U0."id" = '{id}'::uuid));
@@ -73,7 +73,7 @@ WHERE "documents_selection"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[2] IN
+         WHERE (V1."path")[2] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE U0."id" = '{id}'::uuid));
@@ -84,7 +84,7 @@ WHERE "process_processelement"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[2] IN
+         WHERE (V1."path")[2] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE U0."id" = '{id}'::uuid));
@@ -95,7 +95,7 @@ WHERE "process_process"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[2] IN
+         WHERE (V1."path")[2] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE U0."id" = '{id}'::uuid));
@@ -107,7 +107,7 @@ WITH element_ids (id) AS
              (SELECT "documents_element"."id"
               FROM "documents_element"
               INNER JOIN "documents_elementpath" ON ("documents_element"."id" = "documents_elementpath"."element_id")
-              WHERE "documents_elementpath"."path"[2] IN
+              WHERE ("documents_elementpath"."path")[2] IN
                       (SELECT U0."id"
                        FROM "documents_element" U0
                        WHERE U0."id" = '{id}'::uuid)) RETURNING element_id)
@@ -118,7 +118,7 @@ WHERE element.id = element_ids.id ;
 SELECT "documents_element"."id"
 FROM "documents_element"
 INNER JOIN "documents_elementpath" ON ("documents_element"."id" = "documents_elementpath"."element_id")
-WHERE "documents_elementpath"."path"[2] IN
+WHERE ("documents_elementpath"."path")[2] IN
         (SELECT U0."id"
          FROM "documents_element" U0
          WHERE U0."id" = '{id}'::uuid);
@@ -133,7 +133,7 @@ WHERE "documents_transcriptionentity"."id" IN
                  (SELECT V0."id"
                   FROM "documents_element" V0
                   INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-                  WHERE V1."path"[1] IN
+                  WHERE (V1."path")[1] IN
                           (SELECT U0."id"
                            FROM "documents_element" U0
                            WHERE U0."id" = '{id}'::uuid)));
@@ -144,7 +144,7 @@ WHERE "documents_transcription"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[1] IN
+         WHERE (V1."path")[1] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE U0."id" = '{id}'::uuid));
@@ -155,7 +155,7 @@ WHERE "process_workeractivity"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[1] IN
+         WHERE (V1."path")[1] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE U0."id" = '{id}'::uuid));
@@ -166,7 +166,7 @@ WHERE "documents_metadata"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[1] IN
+         WHERE (V1."path")[1] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE U0."id" = '{id}'::uuid));
@@ -177,7 +177,7 @@ WHERE "documents_classification"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[1] IN
+         WHERE (V1."path")[1] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE U0."id" = '{id}'::uuid));
@@ -188,7 +188,7 @@ WHERE "documents_selection"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[1] IN
+         WHERE (V1."path")[1] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE U0."id" = '{id}'::uuid));
@@ -199,7 +199,7 @@ WHERE "process_processelement"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[1] IN
+         WHERE (V1."path")[1] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE U0."id" = '{id}'::uuid));
@@ -210,7 +210,7 @@ WHERE "process_process"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[1] IN
+         WHERE (V1."path")[1] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE U0."id" = '{id}'::uuid));
@@ -222,7 +222,7 @@ WITH element_ids (id) AS
              (SELECT "documents_element"."id"
               FROM "documents_element"
               INNER JOIN "documents_elementpath" ON ("documents_element"."id" = "documents_elementpath"."element_id")
-              WHERE "documents_elementpath"."path"[1] IN
+              WHERE ("documents_elementpath"."path")[1] IN
                       (SELECT U0."id"
                        FROM "documents_element" U0
                        WHERE U0."id" = '{id}'::uuid)) RETURNING element_id)
@@ -233,7 +233,7 @@ WHERE element.id = element_ids.id ;
 SELECT "documents_element"."id"
 FROM "documents_element"
 INNER JOIN "documents_elementpath" ON ("documents_element"."id" = "documents_elementpath"."element_id")
-WHERE "documents_elementpath"."path"[1] IN
+WHERE ("documents_elementpath"."path")[1] IN
         (SELECT U0."id"
          FROM "documents_element" U0
          WHERE U0."id" = '{id}'::uuid);
diff --git a/arkindex/sql_validation/element_trash_deep.sql b/arkindex/sql_validation/element_trash_deep.sql
index b63124f7c229b37bf6460ea2202a729b9f785f9d..7372e92cfe80826f4cb7386d23dbc070c965cbde 100644
--- a/arkindex/sql_validation/element_trash_deep.sql
+++ b/arkindex/sql_validation/element_trash_deep.sql
@@ -18,7 +18,7 @@ WHERE "documents_transcriptionentity"."id" IN
                  (SELECT V0."id"
                   FROM "documents_element" V0
                   INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-                  WHERE V1."path"[4] IN
+                  WHERE (V1."path")[4] IN
                           (SELECT U0."id"
                            FROM "documents_element" U0
                            WHERE U0."id" = '{id}'::uuid)));
@@ -29,7 +29,7 @@ WHERE "documents_transcription"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[4] IN
+         WHERE (V1."path")[4] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE U0."id" = '{id}'::uuid));
@@ -40,7 +40,7 @@ WHERE "process_workeractivity"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[4] IN
+         WHERE (V1."path")[4] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE U0."id" = '{id}'::uuid));
@@ -51,7 +51,7 @@ WHERE "documents_metadata"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[4] IN
+         WHERE (V1."path")[4] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE U0."id" = '{id}'::uuid));
@@ -62,7 +62,7 @@ WHERE "documents_classification"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[4] IN
+         WHERE (V1."path")[4] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE U0."id" = '{id}'::uuid));
@@ -73,7 +73,7 @@ WHERE "documents_selection"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[4] IN
+         WHERE (V1."path")[4] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE U0."id" = '{id}'::uuid));
@@ -84,7 +84,7 @@ WHERE "process_processelement"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[4] IN
+         WHERE (V1."path")[4] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE U0."id" = '{id}'::uuid));
@@ -95,7 +95,7 @@ WHERE "process_process"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[4] IN
+         WHERE (V1."path")[4] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE U0."id" = '{id}'::uuid));
@@ -107,7 +107,7 @@ WITH element_ids (id) AS
              (SELECT "documents_element"."id"
               FROM "documents_element"
               INNER JOIN "documents_elementpath" ON ("documents_element"."id" = "documents_elementpath"."element_id")
-              WHERE "documents_elementpath"."path"[4] IN
+              WHERE ("documents_elementpath"."path")[4] IN
                       (SELECT U0."id"
                        FROM "documents_element" U0
                        WHERE U0."id" = '{id}'::uuid)) RETURNING element_id)
@@ -118,7 +118,7 @@ WHERE element.id = element_ids.id ;
 SELECT "documents_element"."id"
 FROM "documents_element"
 INNER JOIN "documents_elementpath" ON ("documents_element"."id" = "documents_elementpath"."element_id")
-WHERE "documents_elementpath"."path"[4] IN
+WHERE ("documents_elementpath"."path")[4] IN
         (SELECT U0."id"
          FROM "documents_element" U0
          WHERE U0."id" = '{id}'::uuid);
@@ -133,7 +133,7 @@ WHERE "documents_transcriptionentity"."id" IN
                  (SELECT V0."id"
                   FROM "documents_element" V0
                   INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-                  WHERE V1."path"[3] IN
+                  WHERE (V1."path")[3] IN
                           (SELECT U0."id"
                            FROM "documents_element" U0
                            WHERE U0."id" = '{id}'::uuid)));
@@ -144,7 +144,7 @@ WHERE "documents_transcription"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[3] IN
+         WHERE (V1."path")[3] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE U0."id" = '{id}'::uuid));
@@ -155,7 +155,7 @@ WHERE "process_workeractivity"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[3] IN
+         WHERE (V1."path")[3] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE U0."id" = '{id}'::uuid));
@@ -166,7 +166,7 @@ WHERE "documents_metadata"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[3] IN
+         WHERE (V1."path")[3] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE U0."id" = '{id}'::uuid));
@@ -177,7 +177,7 @@ WHERE "documents_classification"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[3] IN
+         WHERE (V1."path")[3] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE U0."id" = '{id}'::uuid));
@@ -188,7 +188,7 @@ WHERE "documents_selection"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[3] IN
+         WHERE (V1."path")[3] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE U0."id" = '{id}'::uuid));
@@ -199,7 +199,7 @@ WHERE "process_processelement"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[3] IN
+         WHERE (V1."path")[3] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE U0."id" = '{id}'::uuid));
@@ -210,7 +210,7 @@ WHERE "process_process"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[3] IN
+         WHERE (V1."path")[3] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE U0."id" = '{id}'::uuid));
@@ -222,7 +222,7 @@ WITH element_ids (id) AS
              (SELECT "documents_element"."id"
               FROM "documents_element"
               INNER JOIN "documents_elementpath" ON ("documents_element"."id" = "documents_elementpath"."element_id")
-              WHERE "documents_elementpath"."path"[3] IN
+              WHERE ("documents_elementpath"."path")[3] IN
                       (SELECT U0."id"
                        FROM "documents_element" U0
                        WHERE U0."id" = '{id}'::uuid)) RETURNING element_id)
@@ -233,7 +233,7 @@ WHERE element.id = element_ids.id ;
 SELECT "documents_element"."id"
 FROM "documents_element"
 INNER JOIN "documents_elementpath" ON ("documents_element"."id" = "documents_elementpath"."element_id")
-WHERE "documents_elementpath"."path"[3] IN
+WHERE ("documents_elementpath"."path")[3] IN
         (SELECT U0."id"
          FROM "documents_element" U0
          WHERE U0."id" = '{id}'::uuid);
@@ -248,7 +248,7 @@ WHERE "documents_transcriptionentity"."id" IN
                  (SELECT V0."id"
                   FROM "documents_element" V0
                   INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-                  WHERE V1."path"[2] IN
+                  WHERE (V1."path")[2] IN
                           (SELECT U0."id"
                            FROM "documents_element" U0
                            WHERE U0."id" = '{id}'::uuid)));
@@ -259,7 +259,7 @@ WHERE "documents_transcription"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[2] IN
+         WHERE (V1."path")[2] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE U0."id" = '{id}'::uuid));
@@ -270,7 +270,7 @@ WHERE "process_workeractivity"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[2] IN
+         WHERE (V1."path")[2] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE U0."id" = '{id}'::uuid));
@@ -281,7 +281,7 @@ WHERE "documents_metadata"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[2] IN
+         WHERE (V1."path")[2] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE U0."id" = '{id}'::uuid));
@@ -292,7 +292,7 @@ WHERE "documents_classification"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[2] IN
+         WHERE (V1."path")[2] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE U0."id" = '{id}'::uuid));
@@ -303,7 +303,7 @@ WHERE "documents_selection"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[2] IN
+         WHERE (V1."path")[2] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE U0."id" = '{id}'::uuid));
@@ -314,7 +314,7 @@ WHERE "process_processelement"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[2] IN
+         WHERE (V1."path")[2] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE U0."id" = '{id}'::uuid));
@@ -325,7 +325,7 @@ WHERE "process_process"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[2] IN
+         WHERE (V1."path")[2] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE U0."id" = '{id}'::uuid));
@@ -337,7 +337,7 @@ WITH element_ids (id) AS
              (SELECT "documents_element"."id"
               FROM "documents_element"
               INNER JOIN "documents_elementpath" ON ("documents_element"."id" = "documents_elementpath"."element_id")
-              WHERE "documents_elementpath"."path"[2] IN
+              WHERE ("documents_elementpath"."path")[2] IN
                       (SELECT U0."id"
                        FROM "documents_element" U0
                        WHERE U0."id" = '{id}'::uuid)) RETURNING element_id)
@@ -348,7 +348,7 @@ WHERE element.id = element_ids.id ;
 SELECT "documents_element"."id"
 FROM "documents_element"
 INNER JOIN "documents_elementpath" ON ("documents_element"."id" = "documents_elementpath"."element_id")
-WHERE "documents_elementpath"."path"[2] IN
+WHERE ("documents_elementpath"."path")[2] IN
         (SELECT U0."id"
          FROM "documents_element" U0
          WHERE U0."id" = '{id}'::uuid);
@@ -363,7 +363,7 @@ WHERE "documents_transcriptionentity"."id" IN
                  (SELECT V0."id"
                   FROM "documents_element" V0
                   INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-                  WHERE V1."path"[1] IN
+                  WHERE (V1."path")[1] IN
                           (SELECT U0."id"
                            FROM "documents_element" U0
                            WHERE U0."id" = '{id}'::uuid)));
@@ -374,7 +374,7 @@ WHERE "documents_transcription"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[1] IN
+         WHERE (V1."path")[1] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE U0."id" = '{id}'::uuid));
@@ -385,7 +385,7 @@ WHERE "process_workeractivity"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[1] IN
+         WHERE (V1."path")[1] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE U0."id" = '{id}'::uuid));
@@ -396,7 +396,7 @@ WHERE "documents_metadata"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[1] IN
+         WHERE (V1."path")[1] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE U0."id" = '{id}'::uuid));
@@ -407,7 +407,7 @@ WHERE "documents_classification"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[1] IN
+         WHERE (V1."path")[1] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE U0."id" = '{id}'::uuid));
@@ -418,7 +418,7 @@ WHERE "documents_selection"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[1] IN
+         WHERE (V1."path")[1] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE U0."id" = '{id}'::uuid));
@@ -429,7 +429,7 @@ WHERE "process_processelement"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[1] IN
+         WHERE (V1."path")[1] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE U0."id" = '{id}'::uuid));
@@ -440,7 +440,7 @@ WHERE "process_process"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[1] IN
+         WHERE (V1."path")[1] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE U0."id" = '{id}'::uuid));
@@ -452,7 +452,7 @@ WITH element_ids (id) AS
              (SELECT "documents_element"."id"
               FROM "documents_element"
               INNER JOIN "documents_elementpath" ON ("documents_element"."id" = "documents_elementpath"."element_id")
-              WHERE "documents_elementpath"."path"[1] IN
+              WHERE ("documents_elementpath"."path")[1] IN
                       (SELECT U0."id"
                        FROM "documents_element" U0
                        WHERE U0."id" = '{id}'::uuid)) RETURNING element_id)
@@ -463,7 +463,7 @@ WHERE element.id = element_ids.id ;
 SELECT "documents_element"."id"
 FROM "documents_element"
 INNER JOIN "documents_elementpath" ON ("documents_element"."id" = "documents_elementpath"."element_id")
-WHERE "documents_elementpath"."path"[1] IN
+WHERE ("documents_elementpath"."path")[1] IN
         (SELECT U0."id"
          FROM "documents_element" U0
          WHERE U0."id" = '{id}'::uuid);
diff --git a/arkindex/sql_validation/element_trash_ml_class.sql b/arkindex/sql_validation/element_trash_ml_class.sql
index f8d72615855a09982e74956399d2a610398db8cd..3a3158045e2a82b71bc3dc7626dcf4a4c7033ab4 100644
--- a/arkindex/sql_validation/element_trash_ml_class.sql
+++ b/arkindex/sql_validation/element_trash_ml_class.sql
@@ -19,7 +19,7 @@ WHERE "documents_transcriptionentity"."id" IN
                  (SELECT V0."id"
                   FROM "documents_element" V0
                   INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-                  WHERE V1."path"[2] IN
+                  WHERE (V1."path")[2] IN
                           (SELECT U0."id"
                            FROM "documents_element" U0
                            INNER JOIN "documents_classification" U1 ON (U0."id" = U1."element_id")
@@ -31,7 +31,7 @@ WHERE "documents_transcription"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[2] IN
+         WHERE (V1."path")[2] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   INNER JOIN "documents_classification" U1 ON (U0."id" = U1."element_id")
@@ -43,7 +43,7 @@ WHERE "process_workeractivity"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[2] IN
+         WHERE (V1."path")[2] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   INNER JOIN "documents_classification" U1 ON (U0."id" = U1."element_id")
@@ -55,7 +55,7 @@ WHERE "documents_metadata"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[2] IN
+         WHERE (V1."path")[2] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   INNER JOIN "documents_classification" U1 ON (U0."id" = U1."element_id")
@@ -67,7 +67,7 @@ WHERE "documents_classification"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[2] IN
+         WHERE (V1."path")[2] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   INNER JOIN "documents_classification" U1 ON (U0."id" = U1."element_id")
@@ -79,7 +79,7 @@ WHERE "documents_selection"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[2] IN
+         WHERE (V1."path")[2] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   INNER JOIN "documents_classification" U1 ON (U0."id" = U1."element_id")
@@ -91,7 +91,7 @@ WHERE "process_processelement"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[2] IN
+         WHERE (V1."path")[2] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   INNER JOIN "documents_classification" U1 ON (U0."id" = U1."element_id")
@@ -103,7 +103,7 @@ WHERE "process_process"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[2] IN
+         WHERE (V1."path")[2] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   INNER JOIN "documents_classification" U1 ON (U0."id" = U1."element_id")
@@ -116,7 +116,7 @@ WITH element_ids (id) AS
              (SELECT "documents_element"."id"
               FROM "documents_element"
               INNER JOIN "documents_elementpath" ON ("documents_element"."id" = "documents_elementpath"."element_id")
-              WHERE "documents_elementpath"."path"[2] IN
+              WHERE ("documents_elementpath"."path")[2] IN
                       (SELECT U0."id"
                        FROM "documents_element" U0
                        INNER JOIN "documents_classification" U1 ON (U0."id" = U1."element_id")
@@ -128,7 +128,7 @@ WHERE element.id = element_ids.id ;
 SELECT "documents_element"."id"
 FROM "documents_element"
 INNER JOIN "documents_elementpath" ON ("documents_element"."id" = "documents_elementpath"."element_id")
-WHERE "documents_elementpath"."path"[2] IN
+WHERE ("documents_elementpath"."path")[2] IN
         (SELECT U0."id"
          FROM "documents_element" U0
          INNER JOIN "documents_classification" U1 ON (U0."id" = U1."element_id")
diff --git a/arkindex/sql_validation/indexer_prefetch.sql b/arkindex/sql_validation/indexer_prefetch.sql
index 2777d0d4ef7c99d0105c994f6521d3fbfd690b2c..65f43b8174dbb8d66c406862ef62c4adeec110d6 100644
--- a/arkindex/sql_validation/indexer_prefetch.sql
+++ b/arkindex/sql_validation/indexer_prefetch.sql
@@ -42,7 +42,7 @@ FROM
      FROM parent
      LIMIT 10000
      OFFSET 0) AS parent_chunk
-INNER JOIN documents_elementpath as elementpath ON (elementpath.path @ > ARRAY[parent_chunk.id])
+INNER JOIN documents_elementpath as elementpath ON (elementpath.path @> ARRAY[parent_chunk.id])
 INNER JOIN documents_element as element ON (elementpath.element_id = element.id)
 INNER JOIN documents_elementtype elementtype ON (element.type_id = elementtype.id) ;
 
diff --git a/arkindex/sql_validation/process_elements_filter_type.sql b/arkindex/sql_validation/process_elements_filter_type.sql
index 6710d5e0f85a9237dae975069b430d4d7d7e96fc..a9a497c321403265231ce8392bfd126651d32f4b 100644
--- a/arkindex/sql_validation/process_elements_filter_type.sql
+++ b/arkindex/sql_validation/process_elements_filter_type.sql
@@ -65,7 +65,7 @@ SELECT "documents_element"."id",
 FROM "documents_element"
 INNER JOIN "documents_elementpath" ON ("documents_element"."id" = "documents_elementpath"."element_id")
 WHERE ("documents_element"."corpus_id" = '{corpus_id}'::uuid
-       AND "documents_elementpath"."path" = (ARRAY[])::uuid[]
+       AND "documents_elementpath"."path" = '{{}}'::uuid[]
        AND "documents_element"."corpus_id" = '{corpus_id}'::uuid
        AND "documents_element"."type_id" = '{type_id}'::uuid)
 ORDER BY "documents_element"."id" ASC
diff --git a/arkindex/sql_validation/process_elements_top_level.sql b/arkindex/sql_validation/process_elements_top_level.sql
index 3087532fd0d1af1d4ba9ccc640a4c043230453ea..03c040152c5e3f753d5617b4c972f783eeed3e00 100644
--- a/arkindex/sql_validation/process_elements_top_level.sql
+++ b/arkindex/sql_validation/process_elements_top_level.sql
@@ -65,7 +65,7 @@ SELECT "documents_element"."id",
 FROM "documents_element"
 INNER JOIN "documents_elementpath" ON ("documents_element"."id" = "documents_elementpath"."element_id")
 WHERE ("documents_element"."corpus_id" = '{corpus_id}'::uuid
-       AND "documents_elementpath"."path" = (ARRAY[])::uuid[]
+       AND "documents_elementpath"."path" = '{{}}'::uuid[]
        AND "documents_element"."corpus_id" = '{corpus_id}'::uuid)
 ORDER BY "documents_element"."id" ASC
 LIMIT 21
diff --git a/arkindex/sql_validation/process_elements_with_image.sql b/arkindex/sql_validation/process_elements_with_image.sql
index 9d89dc7c0ec86556af2927dece2c53a23268d167..7a689853ec57350c081348192797ac83ed0b8d8d 100644
--- a/arkindex/sql_validation/process_elements_with_image.sql
+++ b/arkindex/sql_validation/process_elements_with_image.sql
@@ -68,7 +68,7 @@ SELECT "documents_element"."id",
        "documents_element"."polygon"::bytea,
        "documents_element"."rotation_angle",
        "documents_element"."mirrored",
-       NULLIF(CONCAT(RTRIM("images_imageserver"."url", '/'), CONCAT('/', ("images_image"."path")::varchar)), '/') AS "image_url"
+       NULLIF(CONCAT((RTRIM("images_imageserver"."url", '/'))::text, (CONCAT(('/')::text, ("images_image"."path")::text))::text), '/') AS "image_url"
 FROM "documents_element"
 LEFT OUTER JOIN "images_image" ON ("documents_element"."image_id" = "images_image"."id")
 LEFT OUTER JOIN "images_imageserver" ON ("images_image"."server_id" = "images_imageserver"."id")
diff --git a/arkindex/sql_validation/remove_child.sql b/arkindex/sql_validation/remove_child.sql
index 0ec747fdade130f12190a588659ec2b85277028a..a757299fb87794f180b62d5be7b0aba79f792511 100644
--- a/arkindex/sql_validation/remove_child.sql
+++ b/arkindex/sql_validation/remove_child.sql
@@ -16,7 +16,7 @@ DELETE
 FROM documents_elementpath child_paths USING documents_elementpath old_parent_paths
 WHERE old_parent_paths.element_id = '{B}'::uuid
     AND old_parent_paths.path[array_length(old_parent_paths.path, 1)] = '{A}'::uuid
-    AND child_paths.path @ > (old_parent_paths.path || '{B}'::uuid) ;
+    AND child_paths.path @> (old_parent_paths.path || '{B}'::uuid) ;
 
 DELETE
 FROM "documents_elementpath"
diff --git a/arkindex/sql_validation/remove_child_last_parent.sql b/arkindex/sql_validation/remove_child_last_parent.sql
index 9dd30683ac5939138d87d59ff8b85a7763f0f5b1..fa81733d12fb29f028d5348cb35ed6d96794c7df 100644
--- a/arkindex/sql_validation/remove_child_last_parent.sql
+++ b/arkindex/sql_validation/remove_child_last_parent.sql
@@ -14,7 +14,7 @@ WHERE element_id = '{B}'::uuid ;
 
 UPDATE documents_elementpath
 SET path = path[3:]
-WHERE path @ > ARRAY['{first_parent}'::uuid,
+WHERE path @> ARRAY['{first_parent}'::uuid,
                      '{A}'::uuid,
                      '{B}'::uuid]
     AND path[0:3] = ARRAY['{first_parent}'::uuid,
@@ -31,7 +31,7 @@ DELETE
 FROM documents_elementpath child_paths USING documents_elementpath old_parent_paths
 WHERE old_parent_paths.element_id = '{B}'::uuid
     AND old_parent_paths.path[array_length(old_parent_paths.path, 1)] = '{A}'::uuid
-    AND child_paths.path @ > (old_parent_paths.path || '{B}'::uuid) ;
+    AND child_paths.path @> (old_parent_paths.path || '{B}'::uuid) ;
 
 DELETE
 FROM "documents_elementpath"
diff --git a/arkindex/sql_validation/remove_children_multiple_parents.sql b/arkindex/sql_validation/remove_children_multiple_parents.sql
index d5670523cb70f2af9441da7ff753b592161be2fa..c1565c51de3235b33068628fec68dd730438e3c6 100644
--- a/arkindex/sql_validation/remove_children_multiple_parents.sql
+++ b/arkindex/sql_validation/remove_children_multiple_parents.sql
@@ -11,7 +11,7 @@ DELETE
 FROM documents_elementpath child_paths USING documents_elementpath parent_paths
 WHERE parent_paths.element_id = '{A}'::uuid
     AND parent_paths.path <> ARRAY['{first_parent}'::uuid]
-    AND child_paths.path @ > (parent_paths.path || '{A}'::uuid) ;
+    AND child_paths.path @> (parent_paths.path || '{A}'::uuid) ;
 
 DELETE
 FROM documents_elementpath parent_paths USING documents_elementpath other_paths
@@ -21,7 +21,7 @@ WHERE parent_paths.path && ARRAY['{A}'::uuid]
 
 UPDATE documents_elementpath
 SET path = path[2 + 1:]
-WHERE path @ > ARRAY['{first_parent}'::uuid,
+WHERE path @> ARRAY['{first_parent}'::uuid,
                      '{A}'::uuid]
     AND path[:2] = ARRAY['{first_parent}'::uuid,
                          '{A}'::uuid] ;
diff --git a/arkindex/sql_validation/remove_children_no_parents.sql b/arkindex/sql_validation/remove_children_no_parents.sql
index 4d31a5ff820082b6dd3200c9cc501458aed6ca51..dba5386430e325efe67307007ec0b1af839f9177 100644
--- a/arkindex/sql_validation/remove_children_no_parents.sql
+++ b/arkindex/sql_validation/remove_children_no_parents.sql
@@ -15,7 +15,7 @@ WHERE parent_paths.path && ARRAY['{A}'::uuid]
 
 UPDATE documents_elementpath
 SET path = path[1 + 1:]
-WHERE path @ > ARRAY['{A}'::uuid]
+WHERE path @> ARRAY['{A}'::uuid]
     AND path[:1] = ARRAY['{A}'::uuid] ;
 
 RELEASE SAVEPOINT "{savepoint}"
diff --git a/arkindex/sql_validation/remove_children_single_parent.sql b/arkindex/sql_validation/remove_children_single_parent.sql
index c05f2af5dafc765f547ba9236ab10faffc24c08e..7d86e0d01945344eb36a0f4c88df5e20f5eaca33 100644
--- a/arkindex/sql_validation/remove_children_single_parent.sql
+++ b/arkindex/sql_validation/remove_children_single_parent.sql
@@ -15,7 +15,7 @@ WHERE parent_paths.path && ARRAY['{A}'::uuid]
 
 UPDATE documents_elementpath
 SET path = path[2 + 1:]
-WHERE path @ > ARRAY['{X}'::uuid,
+WHERE path @> ARRAY['{X}'::uuid,
                      '{A}'::uuid]
     AND path[:2] = ARRAY['{X}'::uuid,
                          '{A}'::uuid] ;
diff --git a/arkindex/sql_validation/worker_results_delete_all_versions.sql b/arkindex/sql_validation/worker_results_delete_all_versions.sql
index b0fe051fd7af7137ad8735bcc12187b4dba8908c..afbb1ee13b353ad86d4a0a1746799073eaf36f97 100644
--- a/arkindex/sql_validation/worker_results_delete_all_versions.sql
+++ b/arkindex/sql_validation/worker_results_delete_all_versions.sql
@@ -19,7 +19,7 @@ WHERE "documents_transcriptionentity"."id" IN
                  (SELECT V0."id"
                   FROM "documents_element" V0
                   INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-                  WHERE V1."path"[2] IN
+                  WHERE (V1."path")[2] IN
                           (SELECT U0."id"
                            FROM "documents_element" U0
                            WHERE (U0."corpus_id" = '{corpus_id}'::uuid
@@ -31,7 +31,7 @@ WHERE "documents_transcription"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[2] IN
+         WHERE (V1."path")[2] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE (U0."corpus_id" = '{corpus_id}'::uuid
@@ -43,7 +43,7 @@ WHERE "process_workeractivity"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[2] IN
+         WHERE (V1."path")[2] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE (U0."corpus_id" = '{corpus_id}'::uuid
@@ -55,7 +55,7 @@ WHERE "documents_metadata"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[2] IN
+         WHERE (V1."path")[2] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE (U0."corpus_id" = '{corpus_id}'::uuid
@@ -67,7 +67,7 @@ WHERE "documents_classification"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[2] IN
+         WHERE (V1."path")[2] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE (U0."corpus_id" = '{corpus_id}'::uuid
@@ -79,7 +79,7 @@ WHERE "documents_selection"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[2] IN
+         WHERE (V1."path")[2] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE (U0."corpus_id" = '{corpus_id}'::uuid
@@ -91,7 +91,7 @@ WHERE "process_processelement"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[2] IN
+         WHERE (V1."path")[2] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE (U0."corpus_id" = '{corpus_id}'::uuid
@@ -103,7 +103,7 @@ WHERE "process_process"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[2] IN
+         WHERE (V1."path")[2] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE (U0."corpus_id" = '{corpus_id}'::uuid
@@ -116,7 +116,7 @@ WITH element_ids (id) AS
              (SELECT "documents_element"."id"
               FROM "documents_element"
               INNER JOIN "documents_elementpath" ON ("documents_element"."id" = "documents_elementpath"."element_id")
-              WHERE "documents_elementpath"."path"[2] IN
+              WHERE ("documents_elementpath"."path")[2] IN
                       (SELECT U0."id"
                        FROM "documents_element" U0
                        WHERE (U0."corpus_id" = '{corpus_id}'::uuid
@@ -128,7 +128,7 @@ WHERE element.id = element_ids.id ;
 SELECT "documents_element"."id"
 FROM "documents_element"
 INNER JOIN "documents_elementpath" ON ("documents_element"."id" = "documents_elementpath"."element_id")
-WHERE "documents_elementpath"."path"[2] IN
+WHERE ("documents_elementpath"."path")[2] IN
         (SELECT U0."id"
          FROM "documents_element" U0
          WHERE (U0."corpus_id" = '{corpus_id}'::uuid
diff --git a/arkindex/sql_validation/worker_results_delete_in_corpus.sql b/arkindex/sql_validation/worker_results_delete_in_corpus.sql
index 1f7a8878f002212c850049203263228230e49233..3f7e78812071e184a6aa9a62d332b70dd4751789 100644
--- a/arkindex/sql_validation/worker_results_delete_in_corpus.sql
+++ b/arkindex/sql_validation/worker_results_delete_in_corpus.sql
@@ -19,7 +19,7 @@ WHERE "documents_transcriptionentity"."id" IN
                  (SELECT V0."id"
                   FROM "documents_element" V0
                   INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-                  WHERE V1."path"[2] IN
+                  WHERE (V1."path")[2] IN
                           (SELECT U0."id"
                            FROM "documents_element" U0
                            WHERE (U0."corpus_id" = '{corpus_id}'::uuid
@@ -31,7 +31,7 @@ WHERE "documents_transcription"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[2] IN
+         WHERE (V1."path")[2] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE (U0."corpus_id" = '{corpus_id}'::uuid
@@ -43,7 +43,7 @@ WHERE "process_workeractivity"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[2] IN
+         WHERE (V1."path")[2] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE (U0."corpus_id" = '{corpus_id}'::uuid
@@ -55,7 +55,7 @@ WHERE "documents_metadata"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[2] IN
+         WHERE (V1."path")[2] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE (U0."corpus_id" = '{corpus_id}'::uuid
@@ -67,7 +67,7 @@ WHERE "documents_classification"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[2] IN
+         WHERE (V1."path")[2] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE (U0."corpus_id" = '{corpus_id}'::uuid
@@ -79,7 +79,7 @@ WHERE "documents_selection"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[2] IN
+         WHERE (V1."path")[2] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE (U0."corpus_id" = '{corpus_id}'::uuid
@@ -91,7 +91,7 @@ WHERE "process_processelement"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[2] IN
+         WHERE (V1."path")[2] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE (U0."corpus_id" = '{corpus_id}'::uuid
@@ -103,7 +103,7 @@ WHERE "process_process"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[2] IN
+         WHERE (V1."path")[2] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE (U0."corpus_id" = '{corpus_id}'::uuid
@@ -116,7 +116,7 @@ WITH element_ids (id) AS
              (SELECT "documents_element"."id"
               FROM "documents_element"
               INNER JOIN "documents_elementpath" ON ("documents_element"."id" = "documents_elementpath"."element_id")
-              WHERE "documents_elementpath"."path"[2] IN
+              WHERE ("documents_elementpath"."path")[2] IN
                       (SELECT U0."id"
                        FROM "documents_element" U0
                        WHERE (U0."corpus_id" = '{corpus_id}'::uuid
@@ -128,7 +128,7 @@ WHERE element.id = element_ids.id ;
 SELECT "documents_element"."id"
 FROM "documents_element"
 INNER JOIN "documents_elementpath" ON ("documents_element"."id" = "documents_elementpath"."element_id")
-WHERE "documents_elementpath"."path"[2] IN
+WHERE ("documents_elementpath"."path")[2] IN
         (SELECT U0."id"
          FROM "documents_element" U0
          WHERE (U0."corpus_id" = '{corpus_id}'::uuid
diff --git a/arkindex/sql_validation/worker_results_delete_under_parent_included.sql b/arkindex/sql_validation/worker_results_delete_under_parent_included.sql
index 91623264d44c5dc3b5f08eb0425bc69ee0b36aae..522be37240fad985107954ddf49098be0c261c06 100644
--- a/arkindex/sql_validation/worker_results_delete_under_parent_included.sql
+++ b/arkindex/sql_validation/worker_results_delete_under_parent_included.sql
@@ -208,7 +208,7 @@ WHERE "documents_transcriptionentity"."id" IN
                  (SELECT V0."id"
                   FROM "documents_element" V0
                   INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-                  WHERE V1."path"[2] IN
+                  WHERE (V1."path")[2] IN
                           (SELECT U0."id"
                            FROM "documents_element" U0
                            WHERE (U0."corpus_id" = '{corpus_id}'::uuid
@@ -221,7 +221,7 @@ WHERE "documents_transcription"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[2] IN
+         WHERE (V1."path")[2] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE (U0."corpus_id" = '{corpus_id}'::uuid
@@ -234,7 +234,7 @@ WHERE "process_workeractivity"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[2] IN
+         WHERE (V1."path")[2] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE (U0."corpus_id" = '{corpus_id}'::uuid
@@ -247,7 +247,7 @@ WHERE "documents_metadata"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[2] IN
+         WHERE (V1."path")[2] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE (U0."corpus_id" = '{corpus_id}'::uuid
@@ -260,7 +260,7 @@ WHERE "documents_classification"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[2] IN
+         WHERE (V1."path")[2] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE (U0."corpus_id" = '{corpus_id}'::uuid
@@ -273,7 +273,7 @@ WHERE "documents_selection"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[2] IN
+         WHERE (V1."path")[2] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE (U0."corpus_id" = '{corpus_id}'::uuid
@@ -286,7 +286,7 @@ WHERE "process_processelement"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[2] IN
+         WHERE (V1."path")[2] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE (U0."corpus_id" = '{corpus_id}'::uuid
@@ -299,7 +299,7 @@ WHERE "process_process"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[2] IN
+         WHERE (V1."path")[2] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE (U0."corpus_id" = '{corpus_id}'::uuid
@@ -313,7 +313,7 @@ WITH element_ids (id) AS
              (SELECT "documents_element"."id"
               FROM "documents_element"
               INNER JOIN "documents_elementpath" ON ("documents_element"."id" = "documents_elementpath"."element_id")
-              WHERE "documents_elementpath"."path"[2] IN
+              WHERE ("documents_elementpath"."path")[2] IN
                       (SELECT U0."id"
                        FROM "documents_element" U0
                        WHERE (U0."corpus_id" = '{corpus_id}'::uuid
@@ -326,7 +326,7 @@ WHERE element.id = element_ids.id ;
 SELECT "documents_element"."id"
 FROM "documents_element"
 INNER JOIN "documents_elementpath" ON ("documents_element"."id" = "documents_elementpath"."element_id")
-WHERE "documents_elementpath"."path"[2] IN
+WHERE ("documents_elementpath"."path")[2] IN
         (SELECT U0."id"
          FROM "documents_element" U0
          WHERE (U0."corpus_id" = '{corpus_id}'::uuid
diff --git a/arkindex/sql_validation/worker_results_delete_under_parent_included_worker_run.sql b/arkindex/sql_validation/worker_results_delete_under_parent_included_worker_run.sql
index eec3d75ca84a3732c124497d61a0f16da46b75ff..073cd3dc98b317958739b6683c4bbfcbc63fe66e 100644
--- a/arkindex/sql_validation/worker_results_delete_under_parent_included_worker_run.sql
+++ b/arkindex/sql_validation/worker_results_delete_under_parent_included_worker_run.sql
@@ -197,7 +197,7 @@ WHERE "documents_transcriptionentity"."id" IN
                  (SELECT V0."id"
                   FROM "documents_element" V0
                   INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-                  WHERE V1."path"[2] IN
+                  WHERE (V1."path")[2] IN
                           (SELECT U0."id"
                            FROM "documents_element" U0
                            WHERE (U0."corpus_id" = '{corpus_id}'::uuid
@@ -210,7 +210,7 @@ WHERE "documents_transcription"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[2] IN
+         WHERE (V1."path")[2] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE (U0."corpus_id" = '{corpus_id}'::uuid
@@ -223,7 +223,7 @@ WHERE "process_workeractivity"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[2] IN
+         WHERE (V1."path")[2] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE (U0."corpus_id" = '{corpus_id}'::uuid
@@ -236,7 +236,7 @@ WHERE "documents_metadata"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[2] IN
+         WHERE (V1."path")[2] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE (U0."corpus_id" = '{corpus_id}'::uuid
@@ -249,7 +249,7 @@ WHERE "documents_classification"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[2] IN
+         WHERE (V1."path")[2] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE (U0."corpus_id" = '{corpus_id}'::uuid
@@ -262,7 +262,7 @@ WHERE "documents_selection"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[2] IN
+         WHERE (V1."path")[2] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE (U0."corpus_id" = '{corpus_id}'::uuid
@@ -275,7 +275,7 @@ WHERE "process_processelement"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[2] IN
+         WHERE (V1."path")[2] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE (U0."corpus_id" = '{corpus_id}'::uuid
@@ -288,7 +288,7 @@ WHERE "process_process"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[2] IN
+         WHERE (V1."path")[2] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE (U0."corpus_id" = '{corpus_id}'::uuid
@@ -302,7 +302,7 @@ WITH element_ids (id) AS
              (SELECT "documents_element"."id"
               FROM "documents_element"
               INNER JOIN "documents_elementpath" ON ("documents_element"."id" = "documents_elementpath"."element_id")
-              WHERE "documents_elementpath"."path"[2] IN
+              WHERE ("documents_elementpath"."path")[2] IN
                       (SELECT U0."id"
                        FROM "documents_element" U0
                        WHERE (U0."corpus_id" = '{corpus_id}'::uuid
@@ -315,7 +315,7 @@ WHERE element.id = element_ids.id ;
 SELECT "documents_element"."id"
 FROM "documents_element"
 INNER JOIN "documents_elementpath" ON ("documents_element"."id" = "documents_elementpath"."element_id")
-WHERE "documents_elementpath"."path"[2] IN
+WHERE ("documents_elementpath"."path")[2] IN
         (SELECT U0."id"
          FROM "documents_element" U0
          WHERE (U0."corpus_id" = '{corpus_id}'::uuid
diff --git a/arkindex/training/serializers.py b/arkindex/training/serializers.py
index 9cd60e6a34c0d2717e42a40329f09c50be7f94f7..96b73b3e13704e3c34371d865d137002fc4e7633 100644
--- a/arkindex/training/serializers.py
+++ b/arkindex/training/serializers.py
@@ -565,6 +565,9 @@ class DatasetSetSerializer(serializers.ModelSerializer):
         model = DatasetSet
         fields = ("id", "name", "dataset", )
         read_only_fields = ("id", )
+        # Remove the DRF-provided unique validator, which causes extra queries.
+        # We do our own unique validation using the already prefetched sets on the dataset.
+        validators = []
 
     def validate_name(self, name):
         if any(ds.name == name for ds in self.context["dataset"].sets.all()):
diff --git a/arkindex/training/tests/test_dataset_sets_api.py b/arkindex/training/tests/test_dataset_sets_api.py
index d5c3f630efd1c5ec7ae6a63b1c96251765a7a3d9..cafedafb83aba56654d34b3a7e5d6b835d8aec2b 100644
--- a/arkindex/training/tests/test_dataset_sets_api.py
+++ b/arkindex/training/tests/test_dataset_sets_api.py
@@ -66,7 +66,7 @@ class TestDatasetSetsAPI(FixtureAPITestCase):
                 format="json"
             )
             self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
-        self.assertDictEqual(response.json(), {"detail": "Not found."})
+        self.assertDictEqual(response.json(), {"detail": "No Dataset matches the given query."})
 
     @patch("arkindex.users.managers.BaseACLManager.filter_rights")
     def test_create_no_read_access(self, filter_rights_mock):
@@ -79,7 +79,7 @@ class TestDatasetSetsAPI(FixtureAPITestCase):
                 format="json"
             )
             self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
-        self.assertDictEqual(response.json(), {"detail": "Not found."})
+        self.assertDictEqual(response.json(), {"detail": "No Dataset matches the given query."})
 
         self.assertEqual(filter_rights_mock.call_count, 1)
         self.assertEqual(filter_rights_mock.call_args, call(self.user, Corpus, Role.Guest.value))
@@ -183,7 +183,7 @@ class TestDatasetSetsAPI(FixtureAPITestCase):
                 format="json"
             )
             self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
-        self.assertDictEqual(response.json(), {"detail": "Not found."})
+        self.assertDictEqual(response.json(), {"detail": "No Dataset matches the given query."})
 
     def test_update_set_doesnt_exist(self):
         self.client.force_login(self.user)
@@ -194,7 +194,7 @@ class TestDatasetSetsAPI(FixtureAPITestCase):
                 format="json"
             )
             self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
-        self.assertDictEqual(response.json(), {"detail": "Not found."})
+        self.assertDictEqual(response.json(), {"detail": "No DatasetSet matches the given query."})
 
     @patch("arkindex.users.managers.BaseACLManager.filter_rights")
     def test_update_no_read_access(self, filter_rights_mock):
@@ -207,7 +207,7 @@ class TestDatasetSetsAPI(FixtureAPITestCase):
                 format="json"
             )
             self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
-        self.assertDictEqual(response.json(), {"detail": "Not found."})
+        self.assertDictEqual(response.json(), {"detail": "No Dataset matches the given query."})
 
         self.assertEqual(filter_rights_mock.call_count, 1)
         self.assertEqual(filter_rights_mock.call_args, call(self.user, Corpus, Role.Guest.value))
@@ -312,7 +312,7 @@ class TestDatasetSetsAPI(FixtureAPITestCase):
                 format="json"
             )
             self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
-        self.assertDictEqual(response.json(), {"detail": "Not found."})
+        self.assertDictEqual(response.json(), {"detail": "No Dataset matches the given query."})
 
     def test_partial_update_set_doesnt_exist(self):
         self.client.force_login(self.user)
@@ -323,7 +323,7 @@ class TestDatasetSetsAPI(FixtureAPITestCase):
                 format="json"
             )
             self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
-        self.assertDictEqual(response.json(), {"detail": "Not found."})
+        self.assertDictEqual(response.json(), {"detail": "No DatasetSet matches the given query."})
 
     @patch("arkindex.users.managers.BaseACLManager.filter_rights")
     def test_partial_update_no_read_access(self, filter_rights_mock):
@@ -336,7 +336,7 @@ class TestDatasetSetsAPI(FixtureAPITestCase):
                 format="json"
             )
             self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
-        self.assertDictEqual(response.json(), {"detail": "Not found."})
+        self.assertDictEqual(response.json(), {"detail": "No Dataset matches the given query."})
 
         self.assertEqual(filter_rights_mock.call_count, 1)
         self.assertEqual(filter_rights_mock.call_args, call(self.user, Corpus, Role.Guest.value))
@@ -438,7 +438,7 @@ class TestDatasetSetsAPI(FixtureAPITestCase):
                 format="json"
             )
             self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
-        self.assertDictEqual(response.json(), {"detail": "Not found."})
+        self.assertDictEqual(response.json(), {"detail": "No Dataset matches the given query."})
 
     def test_destroy_set_doesnt_exist(self):
         self.client.force_login(self.user)
@@ -448,7 +448,7 @@ class TestDatasetSetsAPI(FixtureAPITestCase):
                 format="json"
             )
             self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
-        self.assertDictEqual(response.json(), {"detail": "Not found."})
+        self.assertDictEqual(response.json(), {"detail": "No DatasetSet matches the given query."})
 
     @patch("arkindex.users.managers.BaseACLManager.filter_rights")
     def test_destroy_no_read_access(self, filter_rights_mock):
@@ -460,7 +460,7 @@ class TestDatasetSetsAPI(FixtureAPITestCase):
                 format="json"
             )
             self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
-        self.assertDictEqual(response.json(), {"detail": "Not found."})
+        self.assertDictEqual(response.json(), {"detail": "No Dataset matches the given query."})
 
         self.assertEqual(filter_rights_mock.call_count, 1)
         self.assertEqual(filter_rights_mock.call_args, call(self.user, Corpus, Role.Guest.value))
diff --git a/arkindex/training/tests/test_datasets_api.py b/arkindex/training/tests/test_datasets_api.py
index 1bb2a5aa915b3263e7752fba027b9f7e37ac5b7b..5fab4af070552dec22fca1248b5c410bacf25023 100644
--- a/arkindex/training/tests/test_datasets_api.py
+++ b/arkindex/training/tests/test_datasets_api.py
@@ -63,7 +63,7 @@ class TestDatasetsAPI(FixtureAPITestCase):
         with self.assertNumQueries(3):
             response = self.client.get(reverse("api:corpus-datasets", kwargs={"pk": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"}))
             self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
-        self.assertDictEqual(response.json(), {"detail": "Not found."})
+        self.assertDictEqual(response.json(), {"detail": "No Corpus matches the given query."})
 
     @patch("arkindex.project.mixins.has_access", return_value=False)
     def test_list_private_corpus(self, has_access_mock):
@@ -158,7 +158,7 @@ class TestDatasetsAPI(FixtureAPITestCase):
                 format="json"
             )
             self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
-        self.assertDictEqual(response.json(), {"detail": "Not found."})
+        self.assertDictEqual(response.json(), {"detail": "No Corpus matches the given query."})
 
     @patch("arkindex.project.mixins.has_access", return_value=False)
     def test_create_private_corpus(self, has_access_mock):
@@ -490,7 +490,7 @@ class TestDatasetsAPI(FixtureAPITestCase):
                 format="json"
             )
             self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
-        self.assertDictEqual(response.json(), {"detail": "Not found."})
+        self.assertDictEqual(response.json(), {"detail": "No Dataset matches the given query."})
 
     def test_update_name_too_long(self):
         self.client.force_login(self.user)
@@ -822,7 +822,7 @@ class TestDatasetsAPI(FixtureAPITestCase):
 
     def test_partial_update(self):
         self.client.force_login(self.user)
-        with self.assertNumQueries(6):
+        with self.assertNumQueries(5):
             response = self.client.patch(
                 reverse("api:dataset-update", kwargs={"pk": self.dataset.pk}),
                 data={"description": "Omedeto!", "unique_elements": False},
@@ -870,7 +870,7 @@ class TestDatasetsAPI(FixtureAPITestCase):
 
     def test_partial_update_requires_ponos_auth(self):
         self.client.force_login(self.user)
-        with self.assertNumQueries(5):
+        with self.assertNumQueries(4):
             response = self.client.patch(
                 reverse("api:dataset-update", kwargs={"pk": self.dataset.pk}),
                 data={
@@ -884,7 +884,7 @@ class TestDatasetsAPI(FixtureAPITestCase):
         })
 
     def test_partial_update_ponos_task_state_update(self):
-        with self.assertNumQueries(6):
+        with self.assertNumQueries(5):
             response = self.client.patch(
                 reverse("api:dataset-update", kwargs={"pk": self.dataset.pk}),
                 HTTP_AUTHORIZATION=f"Ponos {self.task.token}",
@@ -899,7 +899,7 @@ class TestDatasetsAPI(FixtureAPITestCase):
 
     def test_partial_update_ponos_task_state_requires_dataset_in_process(self):
         self.process.process_sets.all().delete()
-        with self.assertNumQueries(5):
+        with self.assertNumQueries(4):
             response = self.client.patch(
                 reverse("api:dataset-update", kwargs={"pk": self.dataset.pk}),
                 HTTP_AUTHORIZATION=f"Ponos {self.task.token}",
@@ -1022,7 +1022,7 @@ class TestDatasetsAPI(FixtureAPITestCase):
             )
             self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
 
-        self.assertDictEqual(response.json(), {"detail": "Not found."})
+        self.assertDictEqual(response.json(), {"detail": "No Dataset matches the given query."})
 
         self.assertEqual(filter_rights_mock.call_count, 1)
         self.assertEqual(filter_rights_mock.call_args, call(self.user, Corpus, Role.Guest.value))
@@ -1034,7 +1034,7 @@ class TestDatasetsAPI(FixtureAPITestCase):
                 reverse("api:dataset-update", kwargs={"pk": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"})
             )
             self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
-        self.assertDictEqual(response.json(), {"detail": "Not found."})
+        self.assertDictEqual(response.json(), {"detail": "No Dataset matches the given query."})
 
     def test_retrieve(self):
         self.client.force_login(self.user)
@@ -1115,7 +1115,7 @@ class TestDatasetsAPI(FixtureAPITestCase):
                 reverse("api:dataset-update", kwargs={"pk": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"}),
             )
             self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
-        self.assertDictEqual(response.json(), {"detail": "Not found."})
+        self.assertDictEqual(response.json(), {"detail": "No Dataset matches the given query."})
 
     def test_delete_dataset_in_process_forbidden(self):
         self.client.force_login(self.user)
@@ -1568,7 +1568,7 @@ class TestDatasetsAPI(FixtureAPITestCase):
                 format="json",
             )
             self.assertEqual(response.status_code, status.HTTP_201_CREATED)
-        self.assertQuerysetEqual(
+        self.assertQuerySetEqual(
             train_set.set_elements.values_list("set__name", "element__name").order_by("element__name"),
             [("train", "Volume 1, page 1r")]
         )
@@ -1601,7 +1601,7 @@ class TestDatasetsAPI(FixtureAPITestCase):
                 format="json",
             )
             self.assertEqual(response.status_code, status.HTTP_201_CREATED)
-        self.assertQuerysetEqual(
+        self.assertQuerySetEqual(
             (
                 DatasetElement.objects
                 .filter(set__dataset=self.dataset)
@@ -1724,7 +1724,7 @@ class TestDatasetsAPI(FixtureAPITestCase):
     def test_add_from_selection(self):
         train_set = self.dataset.sets.get(name="train")
         train_set.set_elements.create(element=self.page1)
-        self.assertQuerysetEqual(
+        self.assertQuerySetEqual(
             train_set.set_elements.values_list("set__name", "element__name").order_by("element__name"),
             [("train", "Volume 1, page 1r")]
         )
@@ -1738,7 +1738,7 @@ class TestDatasetsAPI(FixtureAPITestCase):
                 format="json",
             )
             self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
-        self.assertQuerysetEqual(
+        self.assertQuerySetEqual(
             train_set.set_elements.values_list("set__name", "element__name").order_by("element__name"),
             [
                 ("train", "Volume 1"),
@@ -1780,7 +1780,7 @@ class TestDatasetsAPI(FixtureAPITestCase):
                 format="json",
             )
             self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
-        self.assertQuerysetEqual(
+        self.assertQuerySetEqual(
             (
                 DatasetElement.objects
                 .filter(set__dataset=self.dataset)
@@ -2268,7 +2268,7 @@ class TestDatasetsAPI(FixtureAPITestCase):
                 "id": str(dev_clone.id)
             }
         ])
-        self.assertQuerysetEqual(
+        self.assertQuerySetEqual(
             DatasetElement.objects.filter(set__dataset_id=clone.id).values_list("set__name", "element__name").order_by("element__name", "set__name"),
             [
                 ("dev", "Volume 1"),
@@ -2427,7 +2427,7 @@ class TestDatasetsAPI(FixtureAPITestCase):
                 + "?set=train"
             )
             self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
-        self.assertDictEqual(response.json(), {"detail": "Not found."})
+        self.assertDictEqual(response.json(), {"detail": "No DatasetElement matches the given query."})
 
     def test_destroy_dataset_element_set_doesnt_exist(self):
         self.client.force_login(self.user)
@@ -2438,7 +2438,7 @@ class TestDatasetsAPI(FixtureAPITestCase):
                 + "?set=match"
             )
             self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
-        self.assertDictEqual(response.json(), {"detail": "Not found."})
+        self.assertDictEqual(response.json(), {"detail": "No DatasetElement matches the given query."})
 
     def test_destroy_dataset_element_element_doesnt_exist(self):
         self.client.force_login(self.user)
@@ -2449,7 +2449,7 @@ class TestDatasetsAPI(FixtureAPITestCase):
                 + "?set=train"
             )
             self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
-        self.assertDictEqual(response.json(), {"detail": "Not found."})
+        self.assertDictEqual(response.json(), {"detail": "No DatasetElement matches the given query."})
 
     def test_destroy_dataset_element_element_not_in_dataset(self):
         train_set = self.dataset.sets.get(name="train")
@@ -2462,7 +2462,7 @@ class TestDatasetsAPI(FixtureAPITestCase):
                 + "?set=train"
             )
             self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
-        self.assertDictEqual(response.json(), {"detail": "Not found."})
+        self.assertDictEqual(response.json(), {"detail": "No DatasetElement matches the given query."})
 
     def test_destroy_dataset_element_wrong_set(self):
         dev_set, _, train_set = self.dataset.sets.all().order_by("name")
@@ -2476,7 +2476,7 @@ class TestDatasetsAPI(FixtureAPITestCase):
                 + "?set=train"
             )
             self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
-        self.assertDictEqual(response.json(), {"detail": "Not found."})
+        self.assertDictEqual(response.json(), {"detail": "No DatasetElement matches the given query."})
 
     def test_destroy_dataset_element(self):
         self.client.force_login(self.user)
diff --git a/arkindex/training/tests/test_model_api.py b/arkindex/training/tests/test_model_api.py
index 93038de206903844350e429ce057008736a82465..6a7fce49213e6e3e970893ff8b96bfb521db26f0 100644
--- a/arkindex/training/tests/test_model_api.py
+++ b/arkindex/training/tests/test_model_api.py
@@ -353,7 +353,7 @@ class TestModelAPI(FixtureAPITestCase):
         with self.assertNumQueries(1):
             response = self.client.get(reverse("api:model-version-download", kwargs={"pk": uuid4()}), {"token": "hehe_perhaps"})
         self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
-        self.assertDictEqual(response.json(), {"detail": "Not found."})
+        self.assertDictEqual(response.json(), {"detail": "No ModelVersion matches the given query."})
 
     def test_download_model_version_non_available(self):
         """
@@ -1301,7 +1301,7 @@ class TestModelAPI(FixtureAPITestCase):
         self.model_version3.parent = self.model_version2
         self.model_version3.save()
 
-        with self.assertNumQueries(5):
+        with self.assertNumQueries(4):
             response = self.client.patch(
                 reverse("api:model-version-retrieve", kwargs={"pk": str(self.model_version3.id)}),
                 {"parent": None},
@@ -1332,7 +1332,7 @@ class TestModelAPI(FixtureAPITestCase):
         s3_presigned_url.return_value = "http://s3/get_url"
         self.client.force_login(self.user2)
 
-        with self.assertNumQueries(6):
+        with self.assertNumQueries(5):
             response = self.client.patch(
                 reverse("api:model-version-retrieve", kwargs={"pk": str(self.model_version3.id)}),
                 # self.model_version3 is a version of self.model2, while self.model_version1 belongs to self.model1
@@ -1393,7 +1393,7 @@ class TestModelAPI(FixtureAPITestCase):
         self.client.force_login(self.user2)
         current_hash = self.model_version3.hash
 
-        with self.assertNumQueries(5):
+        with self.assertNumQueries(4):
             response = self.client.patch(
                 reverse("api:model-version-retrieve", kwargs={"pk": str(self.model_version3.id)}),
                 {"hash": self.model_version4.hash},
@@ -1463,7 +1463,7 @@ class TestModelAPI(FixtureAPITestCase):
         current_hash = self.model_version3.hash
 
         self.client.force_login(self.user1)
-        with self.assertNumQueries(6):
+        with self.assertNumQueries(5):
             response = self.client.patch(
                 reverse("api:model-version-retrieve", kwargs={"pk": str(self.model_version3.id)}),
                 {"archive_hash": "d" * 32, "hash": "e" * 32, "size": 32},
diff --git a/arkindex/training/tests/test_model_compatible_worker.py b/arkindex/training/tests/test_model_compatible_worker.py
index 20a19ff5b7ea233d6b306dc088aaa8ec97a3c4b9..a1d06e321d17944c1c5b3c053cd05650d2deb6ab 100644
--- a/arkindex/training/tests/test_model_compatible_worker.py
+++ b/arkindex/training/tests/test_model_compatible_worker.py
@@ -190,12 +190,12 @@ class TestModelCompatibleWorkerManage(FixtureAPITestCase):
             "model": str(self.model1.id),
             "worker": str(self.worker2.id),
         })
-        self.assertQuerysetEqual(
+        self.assertQuerySetEqual(
             self.model1.compatible_workers.all(),
             [self.worker1, self.worker2],
             ordered=False,
         )
-        self.assertQuerysetEqual(
+        self.assertQuerySetEqual(
             self.model2.compatible_workers.all(),
             [self.worker2],
             ordered=False,
@@ -220,12 +220,12 @@ class TestModelCompatibleWorkerManage(FixtureAPITestCase):
             "model": str(self.model1.id),
             "worker": str(self.worker2.id),
         })
-        self.assertQuerysetEqual(
+        self.assertQuerySetEqual(
             self.model1.compatible_workers.all(),
             [self.worker1, self.worker2],
             ordered=False,
         )
-        self.assertQuerysetEqual(
+        self.assertQuerySetEqual(
             self.model2.compatible_workers.all(),
             [self.worker2],
             ordered=False,
@@ -248,12 +248,12 @@ class TestModelCompatibleWorkerManage(FixtureAPITestCase):
             "model": str(self.model1.id),
             "worker": str(self.worker2.id),
         })
-        self.assertQuerysetEqual(
+        self.assertQuerySetEqual(
             self.model1.compatible_workers.all(),
             [self.worker1, self.worker2],
             ordered=False,
         )
-        self.assertQuerysetEqual(
+        self.assertQuerySetEqual(
             self.model2.compatible_workers.all(),
             [self.worker2],
             ordered=False,
@@ -275,12 +275,12 @@ class TestModelCompatibleWorkerManage(FixtureAPITestCase):
         self.assertEqual(response.json(), {
             "worker": ["This worker is already marked as compatible with this model."],
         })
-        self.assertQuerysetEqual(
+        self.assertQuerySetEqual(
             self.model1.compatible_workers.all(),
             [self.worker1, self.worker2],
             ordered=False,
         )
-        self.assertQuerysetEqual(
+        self.assertQuerySetEqual(
             self.model2.compatible_workers.all(),
             [self.worker2],
             ordered=False,
@@ -303,12 +303,12 @@ class TestModelCompatibleWorkerManage(FixtureAPITestCase):
         self.assertEqual(response.json(), {
             "model": ["This model is archived."],
         })
-        self.assertQuerysetEqual(
+        self.assertQuerySetEqual(
             self.model1.compatible_workers.all(),
             [self.worker1],
             ordered=False,
         )
-        self.assertQuerysetEqual(
+        self.assertQuerySetEqual(
             self.model2.compatible_workers.all(),
             [self.worker2],
             ordered=False,
@@ -473,12 +473,12 @@ class TestModelCompatibleWorkerManage(FixtureAPITestCase):
             )
             self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
 
-        self.assertQuerysetEqual(
+        self.assertQuerySetEqual(
             self.model1.compatible_workers.all(),
             [self.worker1],
             ordered=False,
         )
-        self.assertQuerysetEqual(
+        self.assertQuerySetEqual(
             self.model2.compatible_workers.all(),
             [self.worker2],
             ordered=False,
@@ -500,12 +500,12 @@ class TestModelCompatibleWorkerManage(FixtureAPITestCase):
             )
             self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
 
-        self.assertQuerysetEqual(
+        self.assertQuerySetEqual(
             self.model1.compatible_workers.all(),
             [self.worker2],
             ordered=False,
         )
-        self.assertQuerysetEqual(
+        self.assertQuerySetEqual(
             self.model2.compatible_workers.all(),
             [self.worker2],
             ordered=False,
@@ -525,12 +525,12 @@ class TestModelCompatibleWorkerManage(FixtureAPITestCase):
             )
             self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
 
-        self.assertQuerysetEqual(
+        self.assertQuerySetEqual(
             self.model1.compatible_workers.all(),
             [self.worker2],
             ordered=False,
         )
-        self.assertQuerysetEqual(
+        self.assertQuerySetEqual(
             self.model2.compatible_workers.all(),
             [self.worker2],
             ordered=False,
@@ -549,14 +549,14 @@ class TestModelCompatibleWorkerManage(FixtureAPITestCase):
             self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
 
         self.assertEqual(response.json(), {
-            "detail": "Not found.",
+            "detail": "No Model_compatible_workers matches the given query.",
         })
-        self.assertQuerysetEqual(
+        self.assertQuerySetEqual(
             self.model1.compatible_workers.all(),
             [self.worker1],
             ordered=False,
         )
-        self.assertQuerysetEqual(
+        self.assertQuerySetEqual(
             self.model2.compatible_workers.all(),
             [self.worker2],
             ordered=False,
@@ -580,12 +580,12 @@ class TestModelCompatibleWorkerManage(FixtureAPITestCase):
         self.assertEqual(response.json(), {
             "model": ["This model is archived."],
         })
-        self.assertQuerysetEqual(
+        self.assertQuerySetEqual(
             self.model1.compatible_workers.all(),
             [self.worker1, self.worker2],
             ordered=False,
         )
-        self.assertQuerysetEqual(
+        self.assertQuerySetEqual(
             self.model2.compatible_workers.all(),
             [self.worker2],
             ordered=False,
diff --git a/arkindex/users/api.py b/arkindex/users/api.py
index 6769b896330677403d23f39a0125ceb5ef7085eb..51789957e2f052da933f24ecf3fb1b790e7607e7 100644
--- a/arkindex/users/api.py
+++ b/arkindex/users/api.py
@@ -88,9 +88,6 @@ class UserCreate(CreateAPIView):
         serializer = self.get_serializer(data=request.data)
         serializer.is_valid(raise_exception=True)
 
-        if User.objects.filter(email=serializer.validated_data["email"]).exists():
-            raise ValidationError({"email": ["An user with this email address already exists."]})
-
         user = serializer.save()
         login(self.request, user)
 
diff --git a/arkindex/users/serializers.py b/arkindex/users/serializers.py
index c8060116eae68a406289dc03eb51fbe7d5f212d8..41ccf7d98b1864079140297123da71bd6a177163 100644
--- a/arkindex/users/serializers.py
+++ b/arkindex/users/serializers.py
@@ -7,6 +7,7 @@ from django.db import transaction
 from django.utils.http import urlsafe_base64_decode
 from drf_spectacular.utils import extend_schema_field, inline_serializer
 from rest_framework import serializers
+from rest_framework.validators import UniqueValidator
 
 from arkindex.documents.models import Corpus
 from arkindex.users.models import Group, Role, Scope, User, UserScope
@@ -99,6 +100,17 @@ class NewUserSerializer(serializers.ModelSerializer):
             "email",
             "password"
         )
+        extra_kwargs = {
+            "email": {
+                "validators": [
+                    # DRF automatically adds this validator, but we override it to change the error message
+                    UniqueValidator(
+                        queryset=User.objects.all(),
+                        message="A user with this email address already exists.",
+                    )
+                ]
+            },
+        }
 
     def validate(self, data):
         data = super().validate(data)
@@ -195,7 +207,9 @@ class UserEmailVerificationSerializer(UserSerializer):
             "is_admin",
             "auth_token",
         )
-        extra_kwargs = {}
+        extra_kwargs = {
+            "email": {"validators": []}
+        }
 
     def validate(self, data):
         error_msg = "There is no user with this email or the token is invalid."
diff --git a/arkindex/users/tests/test_registration.py b/arkindex/users/tests/test_registration.py
index 393d8724cf6eb27dae7663d137a921aff20a17e4..17de7a3a798df534b3eb4ed4ab07cbde833e95d1 100644
--- a/arkindex/users/tests/test_registration.py
+++ b/arkindex/users/tests/test_registration.py
@@ -407,9 +407,9 @@ class TestRegistration(FixtureAPITestCase):
             format="json",
         )
         self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
-        self.assertDictEqual(response.json(), {"email": ["An user with this email address already exists."]})
+        self.assertDictEqual(response.json(), {"email": ["A user with this email address already exists."]})
 
-        # Asserts that the check is insensitive on the email field
+    def test_register_existing_user_ignore_case(self):
         email = "eMaIL@adDreSs.cOm"
         self.assertTrue(User.objects.filter(email=email).exists())
         response = self.client.post(
@@ -418,7 +418,7 @@ class TestRegistration(FixtureAPITestCase):
             format="json",
         )
         self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
-        self.assertDictEqual(response.json(), {"email": ["An user with this email address already exists."]})
+        self.assertDictEqual(response.json(), {"email": ["A user with this email address already exists."]})
 
     def test_send_validation_email_requires_auth(self):
         response = self.client.post(reverse("api:send-verification-email"))
diff --git a/base/requirements.txt b/base/requirements.txt
index 45e9e466e9abcb9a5aa4b7469517f35f779b973e..7d6993362554d236d4b0745fc9461d585b9cc17f 100644
--- a/base/requirements.txt
+++ b/base/requirements.txt
@@ -1,6 +1,6 @@
 boto3==1.18.13
 cryptography==3.4.7
-Django==4.1.7
+Django==4.2.13
 ed25519==1.5
 lxml==4.9.2
 psycopg2-binary==2.9.1
diff --git a/requirements.txt b/requirements.txt
index afa3b928e3b1d091bb04b8180405e07bc155dfeb..ae31e0fe6f03fbb6442f81ebce6ec321a1c9e4f2 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -7,7 +7,7 @@ django-cors-headers==3.14.0
 django-enumfields==2.1.1
 django-pgtrigger==4.7.0
 django-rq==2.10.1
-djangorestframework==3.14.0
+djangorestframework==3.15.2
 djangorestframework-simplejwt==5.2.2
 docker==7.0.0
 drf-spectacular==0.27.2
diff --git a/tests-requirements.txt b/tests-requirements.txt
index a3d8fb5d32611c4abdb0b238a75f00d1eca6571c..a2566e14984fb1c6411f417754acc2ad5f00a35c 100644
--- a/tests-requirements.txt
+++ b/tests-requirements.txt
@@ -1,5 +1,6 @@
 coverage==7.2.3
 moto==4.1.8
 responses==0.23.1
+sqlparse==0.5.0
 tripoli==2.0.0
 unittest-xml-reporting==3.2.0