diff --git a/arkindex/documents/api/elements.py b/arkindex/documents/api/elements.py
index b461bb16ad05441abfeb6b3c4f2b46cd125d93b3..94b8486df5fe5f3ca184babe7306b8c6a3775f56 100644
--- a/arkindex/documents/api/elements.py
+++ b/arkindex/documents/api/elements.py
@@ -360,7 +360,9 @@ class ElementsListBase(CorpusACLMixin, DestroyModelMixin, ListAPIView):
         return context
 
     def get_prefetch(self):
-        prefetch = {'zone__image__server'}
+        # Select the zone, image and server in one separate query
+        prefetch = {Prefetch('zone', queryset=Zone.objects.select_related('image__server'))}
+
         with_best_classes = self.clean_params.get('with_best_classes')
         if with_best_classes and with_best_classes.lower() not in ('false', '0'):
             prefetch.add(best_classifications_prefetch)
@@ -375,7 +377,7 @@ class ElementsListBase(CorpusACLMixin, DestroyModelMixin, ListAPIView):
         queryset = queryset \
             .filter(**self.get_filters()) \
             .prefetch_related(*self.get_prefetch()) \
-            .select_related('type', 'corpus', 'zone') \
+            .select_related('type', 'corpus') \
             .order_by(*self.get_order_by())
 
         class_filters = self.get_classifications_filters()
diff --git a/arkindex/documents/tests/test_children_elements.py b/arkindex/documents/tests/test_children_elements.py
index 9a01b442fe7eb4482f50a897bebad22ad5f7e6a4..da2bff818bb884cfe6d4c27e91725116c7ea2979 100644
--- a/arkindex/documents/tests/test_children_elements.py
+++ b/arkindex/documents/tests/test_children_elements.py
@@ -232,7 +232,7 @@ class TestChildrenElements(FixtureAPITestCase):
     def test_element_children_worker_version(self):
         self.corpus.elements.filter(name__contains='page 1r').update(worker_version=self.worker_version)
 
-        with self.assertNumQueries(7):
+        with self.assertNumQueries(6):
             response = self.client.get(
                 reverse('api:elements-children', kwargs={'pk': str(self.vol.id)}),
                 data={'worker_version': str(self.worker_version.id)}
@@ -291,7 +291,7 @@ class TestChildrenElements(FixtureAPITestCase):
         )
         element.add_parent(self.vol)
 
-        with self.assertNumQueries(8):
+        with self.assertNumQueries(7):
             response = self.client.get(
                 reverse('api:elements-children', kwargs={'pk': str(self.vol.id)}),
                 data={'with_has_children': True},
@@ -331,7 +331,7 @@ class TestChildrenElements(FixtureAPITestCase):
 
     def test_children_modified_since(self):
         self.corpus.elements.filter(name='Volume 1, page 1r').update(updated='2099-04-02T13:37:43Z')
-        with self.assertNumQueries(7):
+        with self.assertNumQueries(6):
             response = self.client.get(
                 reverse('api:elements-children', kwargs={'pk': str(self.vol.id)}),
                 HTTP_IF_MODIFIED_SINCE='Thu, 02 Apr 2099 13:37:42 GMT',
diff --git a/arkindex/documents/tests/test_classes.py b/arkindex/documents/tests/test_classes.py
index b9ecef256ae37ef2a6514b54683d9105152a2057..fa35887709d1721da2370cbad0f52e7dc2f92d91 100644
--- a/arkindex/documents/tests/test_classes.py
+++ b/arkindex/documents/tests/test_classes.py
@@ -215,7 +215,7 @@ class TestClasses(FixtureAPITestCase):
         })
 
     def test_list_elements_db_queries(self):
-        with self.assertNumQueries(3):
+        with self.assertNumQueries(4):
             response = self.client.get(
                 reverse('api:corpus-elements', kwargs={'corpus': self.corpus.id}),
                 data={'type': self.classified.slug}
@@ -224,7 +224,7 @@ class TestClasses(FixtureAPITestCase):
         self.assertEqual(response.json()['count'], 12)
 
     def test_list_elements_best_classes(self):
-        with self.assertNumQueries(4):
+        with self.assertNumQueries(5):
             response = self.client.get(
                 reverse('api:corpus-elements', kwargs={'corpus': self.corpus.id}),
                 data={'type': self.classified.slug, 'with_best_classes': True}
@@ -239,7 +239,7 @@ class TestClasses(FixtureAPITestCase):
             )
 
     def test_list_elements_best_classes_false(self):
-        with self.assertNumQueries(3):
+        with self.assertNumQueries(4):
             response = self.client.get(
                 reverse('api:corpus-elements', kwargs={'corpus': self.corpus.id}),
                 data={
@@ -252,7 +252,7 @@ class TestClasses(FixtureAPITestCase):
             self.assertIsNone(elt['best_classes'])
 
     def test_element_parents_best_classes(self):
-        with self.assertNumQueries(4):
+        with self.assertNumQueries(5):
             response = self.client.get(
                 reverse('api:elements-parents', kwargs={'pk': str(self.common_children.id)}),
                 data={'type': self.classified.slug, 'with_best_classes': 1}
@@ -267,7 +267,7 @@ class TestClasses(FixtureAPITestCase):
             )
 
     def test_element_children_best_classes(self):
-        with self.assertNumQueries(5):
+        with self.assertNumQueries(6):
             response = self.client.get(
                 reverse('api:elements-children', kwargs={'pk': str(self.parent.id)}),
                 data={'type': self.classified.slug, 'with_best_classes': 'yes'}
@@ -287,7 +287,7 @@ class TestClasses(FixtureAPITestCase):
         """
         child = Element.objects.filter(type=self.classified.id).first()
         child.classifications.all().update(state=ClassificationState.Rejected)
-        with self.assertNumQueries(5):
+        with self.assertNumQueries(6):
             response = self.client.get(
                 reverse('api:elements-children', kwargs={'pk': str(self.parent.id)}),
                 data={'type': self.classified.slug, 'with_best_classes': 'yes'}
@@ -382,7 +382,7 @@ class TestClasses(FixtureAPITestCase):
             confidence=.1337,
             high_confidence=True,
         )
-        with self.assertNumQueries(3):
+        with self.assertNumQueries(4):
             response = self.client.get(
                 reverse('api:corpus-elements', kwargs={'corpus': self.corpus.id}),
                 data={'type': self.classified.slug, 'best_class': str(self.text.id)}
@@ -396,7 +396,7 @@ class TestClasses(FixtureAPITestCase):
         parent = Element.objects.get_ascending(self.common_children.id).get(name='elt_1')
         self.assertEqual(parent.classifications.filter(ml_class=self.text).count(), 2)
         parent.classifications.filter(ml_class=self.text).update(state=ClassificationState.Validated)
-        with self.assertNumQueries(3):
+        with self.assertNumQueries(4):
             response = self.client.get(
                 reverse('api:elements-parents', kwargs={'pk': str(self.common_children.id)}),
                 data={'type': self.classified.slug, 'best_class': str(self.text.id)}
@@ -409,7 +409,7 @@ class TestClasses(FixtureAPITestCase):
     def test_class_filter_list_children(self):
         child = Element.objects.filter(type=self.classified.id).first()
         child.classifications.all().filter(confidence=.7).update(state=ClassificationState.Validated)
-        with self.assertNumQueries(4):
+        with self.assertNumQueries(5):
             response = self.client.get(
                 reverse('api:elements-children', kwargs={'pk': str(self.parent.id)}),
                 data={'type': self.classified.slug, 'best_class': str(self.text.id)}
@@ -422,7 +422,7 @@ class TestClasses(FixtureAPITestCase):
     def test_class_filter_list_elements_distinct(self):
         self.assertEqual(Classification.objects.filter(high_confidence=True).count(), 24)
         self.assertEqual(Classification.objects.filter(high_confidence=True).distinct('element_id').count(), 12)
-        with self.assertNumQueries(3):
+        with self.assertNumQueries(4):
             response = self.client.get(
                 reverse('api:corpus-elements', kwargs={'corpus': self.corpus.id}),
                 data={'type': self.classified.slug, 'best_class': str(self.cover.id)}
@@ -437,7 +437,7 @@ class TestClasses(FixtureAPITestCase):
     def test_class_filter_list_parents_distinct(self):
         self.assertEqual(Classification.objects.filter(high_confidence=True).count(), 24)
         self.assertEqual(Classification.objects.filter(high_confidence=True).distinct('element_id').count(), 12)
-        with self.assertNumQueries(3):
+        with self.assertNumQueries(4):
             response = self.client.get(
                 reverse('api:elements-parents', kwargs={'pk': str(self.common_children.id)}),
                 data={'type': self.classified.slug, 'best_class': str(self.cover.id)}
@@ -452,7 +452,7 @@ class TestClasses(FixtureAPITestCase):
     def test_class_filter_list_children_distinct(self):
         self.assertEqual(Classification.objects.filter(high_confidence=True).count(), 24)
         self.assertEqual(Classification.objects.filter(high_confidence=True).distinct('element_id').count(), 12)
-        with self.assertNumQueries(4):
+        with self.assertNumQueries(5):
             response = self.client.get(
                 reverse('api:elements-children', kwargs={'pk': str(self.parent.id)}),
                 data={'type': self.classified.slug, 'best_class': str(self.cover.id)}
@@ -473,7 +473,7 @@ class TestClasses(FixtureAPITestCase):
             confidence=.1337,
             high_confidence=True,
         )
-        with self.assertNumQueries(4):
+        with self.assertNumQueries(5):
             response = self.client.get(
                 reverse('api:corpus-elements', kwargs={'corpus': self.corpus.id}),
                 data={'type': self.classified.slug, 'best_class': 'true', 'with_best_classes': 'true'},
@@ -497,7 +497,7 @@ class TestClasses(FixtureAPITestCase):
             confidence=.1337,
             high_confidence=False,
         )
-        with self.assertNumQueries(4):
+        with self.assertNumQueries(5):
             response = self.client.get(
                 reverse('api:corpus-elements', kwargs={'corpus': self.corpus.id}),
                 data={'type': self.classified.slug, 'best_class': 'false', 'with_best_classes': 'true'},
diff --git a/arkindex/documents/tests/test_corpus_elements.py b/arkindex/documents/tests/test_corpus_elements.py
index 67fed9174c05392eabcc812233e0be23cd0898f4..c5335c47219b08a2b2bcd1aadc09fec95e9607c3 100644
--- a/arkindex/documents/tests/test_corpus_elements.py
+++ b/arkindex/documents/tests/test_corpus_elements.py
@@ -18,7 +18,7 @@ class TestListElements(FixtureAPITestCase):
 
     def test_list_elements_filter_name(self):
         nameSelected = 'ol'
-        with self.assertNumQueries(5):
+        with self.assertNumQueries(4):
             response = self.client.get(
                 reverse('api:corpus-elements', kwargs={'corpus': self.corpus.id}),
                 data={'name': nameSelected}
@@ -63,7 +63,7 @@ class TestListElements(FixtureAPITestCase):
             self.assertEqual(result['type'], 'act')
 
     def test_list_with_has_children(self):
-        with self.assertNumQueries(7):
+        with self.assertNumQueries(6):
             response = self.client.get(
                 reverse('api:corpus-elements', kwargs={'corpus': self.corpus.id}),
                 data={'with_has_children': True}
@@ -108,7 +108,7 @@ class TestListElements(FixtureAPITestCase):
         self.assertTrue(str(query).endswith('AND "documents_elementpath"."id" IS NULL)'))
 
     def test_list_top_level(self):
-        with self.assertNumQueries(3):
+        with self.assertNumQueries(4):
             response = self.client.get(
                 reverse('api:corpus-elements', kwargs={'corpus': self.corpus.id}),
                 data={'top_level': True},
@@ -129,7 +129,7 @@ class TestListElements(FixtureAPITestCase):
         self.corpus.top_level_type = element_type
         self.corpus.save()
 
-        with self.assertNumQueries(3):
+        with self.assertNumQueries(4):
             response = self.client.get(
                 reverse('api:corpus-elements', kwargs={'corpus': self.corpus.id}),
                 data={'top_level': True},
@@ -143,7 +143,7 @@ class TestListElements(FixtureAPITestCase):
     def test_list_elements_filter_worker_version(self):
         self.corpus.elements.filter(name__contains='Volume 2').update(worker_version=self.worker_version)
 
-        with self.assertNumQueries(6):
+        with self.assertNumQueries(5):
             response = self.client.get(
                 reverse('api:corpus-elements', kwargs={'corpus': self.corpus.id}),
                 data={'worker_version': str(self.worker_version.id)},
@@ -190,7 +190,7 @@ class TestListElements(FixtureAPITestCase):
 
     def test_list_elements_filter_modified_since(self):
         self.corpus.elements.filter(name='Volume 1').update(updated='2099-04-02T13:37:43Z')
-        with self.assertNumQueries(6):
+        with self.assertNumQueries(5):
             response = self.client.get(
                 reverse('api:corpus-elements', kwargs={'corpus': self.corpus.id}),
                 HTTP_IF_MODIFIED_SINCE='Thu, 02 Apr 2099 13:37:42 GMT',
@@ -199,7 +199,7 @@ class TestListElements(FixtureAPITestCase):
         self.assertEqual(response.json()['count'], self.corpus.elements.count())
 
     def test_list_elements_with_corpus_false(self):
-        with self.assertNumQueries(5):
+        with self.assertNumQueries(4):
             response = self.client.get(
                 reverse('api:corpus-elements', kwargs={'corpus': self.corpus.id})
                 + '?with_corpus=false'
diff --git a/arkindex/documents/tests/test_parents_elements.py b/arkindex/documents/tests/test_parents_elements.py
index d7ef86c05a0b323e3460424d5eb12503872a6299..08e25dc9a41dcd97cbeffca05d8a93d53e624476 100644
--- a/arkindex/documents/tests/test_parents_elements.py
+++ b/arkindex/documents/tests/test_parents_elements.py
@@ -93,7 +93,7 @@ class TestParentsElements(FixtureAPITestCase):
         """
         self.corpus.elements.filter(name__contains='Volume 1').update(worker_version=self.worker_version)
 
-        with self.assertNumQueries(4):
+        with self.assertNumQueries(5):
             response = self.client.get(
                 reverse('api:elements-parents', kwargs={'pk': str(self.page.id)}),
                 data={'worker_version': str(self.worker_version.id)},
@@ -124,7 +124,7 @@ class TestParentsElements(FixtureAPITestCase):
 
     def test_parents_with_has_children(self):
         surface = Element.objects.get(name='Surface A')
-        with self.assertNumQueries(5):
+        with self.assertNumQueries(6):
             response = self.client.get(
                 reverse('api:elements-parents', kwargs={'pk': str(surface.id)}),
                 data={'recursive': True, 'with_has_children': True},
@@ -157,7 +157,7 @@ class TestParentsElements(FixtureAPITestCase):
 
     def test_parents_modified_since(self):
         self.corpus.elements.filter(name='Volume 1').update(updated='2099-04-02T13:37:43Z')
-        with self.assertNumQueries(4):
+        with self.assertNumQueries(5):
             response = self.client.get(
                 reverse('api:elements-parents', kwargs={'pk': str(self.page.id)}),
                 HTTP_IF_MODIFIED_SINCE='Thu, 02 Apr 2099 13:37:42 GMT',