diff --git a/arkindex/documents/models.py b/arkindex/documents/models.py
index 046b66237cdce8f70938c3b9fac2968ff4a57651..5d0109d11b64ea98a14d67e3cf857785c2806376 100644
--- a/arkindex/documents/models.py
+++ b/arkindex/documents/models.py
@@ -1,6 +1,6 @@
 import re
 import uuid
-from urllib.parse import urljoin
+from urllib.parse import urljoin, urlparse
 
 from django.conf import settings
 from django.contrib.contenttypes.fields import GenericRelation
@@ -649,6 +649,11 @@ class Element(IndexableModel):
         from arkindex.project.tools import bounding_box
         x, y, width, height = bounding_box(self.polygon)
 
+        # Handle IIIF URLs with query parameters (cannot use urljoin as it will remove the query parameters)
+        parsed_url = urlparse(self.image.url)
+        if parsed_url.query:
+            return f"{self.image.url}/{x},{y},{width},{height}/full/0/default.jpg"
+
         return urljoin(
             self.image.url + "/",
             f"{x},{y},{width},{height}/full/0/default.jpg"
@@ -671,6 +676,12 @@ class Element(IndexableModel):
 
         # Do no attempt to upsize small images for thumbnails
         thumbnail_height = min(400, height)
+
+        # Handle IIIF URLs with query parameters (cannot use urljoin as it will remove the query parameters)
+        parsed_url = urlparse(self.image.url)
+        if parsed_url.query:
+            return f"{self.image.url}/{x},{y},{width},{height}/,{thumbnail_height}/{rotation_param}/default.jpg"
+
         return urljoin(
             self.image.url + "/",
             f"{x},{y},{width},{height}/,{thumbnail_height}/{rotation_param}/default.jpg"
diff --git a/arkindex/documents/tests/test_element.py b/arkindex/documents/tests/test_element.py
index a2e101144c4fa2d7a4c23c20a4e105145a36e9df..b0e0fef47c015fbfe2d16927bf598e144fa0bb91 100644
--- a/arkindex/documents/tests/test_element.py
+++ b/arkindex/documents/tests/test_element.py
@@ -36,23 +36,51 @@ class TestElement(FixtureTestCase):
                 )
                 self.assertEqual(element.iiif_url, "http://server/img1/10,20,30,40/full/0/default.jpg")
 
+    def test_iiif_url_query_params(self):
+        # Element.iiif_url can handles URLs with query parameters
+        test_image = self.imgsrv.images.create(path="blahblah-bin/something.something?IIIF=01/02/2020601/https___moon_prism__power/makeup.original.tif", width=1000, height=1000,)
+        element = Element(
+            name="Something",
+            type=self.element_type,
+            image=test_image,
+            polygon=[
+                [10, 20],
+                [40, 20],
+                [40, 60],
+                [10, 60],
+                [10, 20],
+            ],
+        )
+        self.assertEqual(element.iiif_url, "http://server/blahblah-bin/something.something?IIIF=01/02/2020601/https___moon_prism__power/makeup.original.tif/10,20,30,40/full/0/default.jpg")
+
     def test_iiif_thumbnail_url(self):
+        test_image = self.imgsrv.images.create(path="blahblah-bin/something.something?IIIF=01/02/2020601/https___moon_prism__power/makeup.original.tif", width=1000, height=1000,)
+
         cases = [
-            (0, False, [[500, 100], [650, 100], [650, 800], [500, 800], [500, 100]], "http://server/img1/500,100,150,700/,400/0/default.jpg"),
-            (0, True, [[500, 100], [650, 100], [650, 800], [500, 800], [500, 100]], "http://server/img1/500,100,150,700/,400/!0/default.jpg"),
-            (180, False, [[500, 580], [650, 580], [650, 700], [500, 700], [500, 580]], "http://server/img1/500,580,150,120/,120/180/default.jpg"),
-            (180, True, [[500, 580], [650, 580], [650, 700], [500, 700], [500, 580]], "http://server/img1/500,580,150,120/,120/!180/default.jpg"),
-            (0, False, [[10, 20], [40, 20], [40, 60], [10, 60], [10, 20]], "http://server/img1/10,20,30,40/,40/0/default.jpg"),
-            (0, True, [[10, 20], [40, 20], [40, 60], [10, 60], [10, 20]], "http://server/img1/10,20,30,40/,40/!0/default.jpg"),
-            (180, False, [[10, 20], [40, 20], [40, 60], [10, 60], [10, 20]], "http://server/img1/10,20,30,40/,40/180/default.jpg"),
-            (180, True, [[10, 20], [40, 20], [40, 60], [10, 60], [10, 20]], "http://server/img1/10,20,30,40/,40/!180/default.jpg"),
+            (self.image, 0, False, [[500, 100], [650, 100], [650, 800], [500, 800], [500, 100]], "http://server/img1/500,100,150,700/,400/0/default.jpg"),
+            (self.image, 0, True, [[500, 100], [650, 100], [650, 800], [500, 800], [500, 100]], "http://server/img1/500,100,150,700/,400/!0/default.jpg"),
+            (self.image, 180, False, [[500, 580], [650, 580], [650, 700], [500, 700], [500, 580]], "http://server/img1/500,580,150,120/,120/180/default.jpg"),
+            (self.image, 180, True, [[500, 580], [650, 580], [650, 700], [500, 700], [500, 580]], "http://server/img1/500,580,150,120/,120/!180/default.jpg"),
+            (self.image, 0, False, [[10, 20], [40, 20], [40, 60], [10, 60], [10, 20]], "http://server/img1/10,20,30,40/,40/0/default.jpg"),
+            (self.image, 0, True, [[10, 20], [40, 20], [40, 60], [10, 60], [10, 20]], "http://server/img1/10,20,30,40/,40/!0/default.jpg"),
+            (self.image, 180, False, [[10, 20], [40, 20], [40, 60], [10, 60], [10, 20]], "http://server/img1/10,20,30,40/,40/180/default.jpg"),
+            (self.image, 180, True, [[10, 20], [40, 20], [40, 60], [10, 60], [10, 20]], "http://server/img1/10,20,30,40/,40/!180/default.jpg"),
+            # Image with query parameters in the IIIF URL
+            (test_image, 0, False, [[500, 100], [650, 100], [650, 800], [500, 800], [500, 100]], "http://server/blahblah-bin/something.something?IIIF=01/02/2020601/https___moon_prism__power/makeup.original.tif/500,100,150,700/,400/0/default.jpg"),
+            (test_image, 0, True, [[500, 100], [650, 100], [650, 800], [500, 800], [500, 100]], "http://server/blahblah-bin/something.something?IIIF=01/02/2020601/https___moon_prism__power/makeup.original.tif/500,100,150,700/,400/!0/default.jpg"),
+            (test_image, 180, False, [[500, 580], [650, 580], [650, 700], [500, 700], [500, 580]], "http://server/blahblah-bin/something.something?IIIF=01/02/2020601/https___moon_prism__power/makeup.original.tif/500,580,150,120/,120/180/default.jpg"),
+            (test_image, 180, True, [[500, 580], [650, 580], [650, 700], [500, 700], [500, 580]], "http://server/blahblah-bin/something.something?IIIF=01/02/2020601/https___moon_prism__power/makeup.original.tif/500,580,150,120/,120/!180/default.jpg"),
+            (test_image, 0, False, [[10, 20], [40, 20], [40, 60], [10, 60], [10, 20]], "http://server/blahblah-bin/something.something?IIIF=01/02/2020601/https___moon_prism__power/makeup.original.tif/10,20,30,40/,40/0/default.jpg"),
+            (test_image, 0, True, [[10, 20], [40, 20], [40, 60], [10, 60], [10, 20]], "http://server/blahblah-bin/something.something?IIIF=01/02/2020601/https___moon_prism__power/makeup.original.tif/10,20,30,40/,40/!0/default.jpg"),
+            (test_image, 180, False, [[10, 20], [40, 20], [40, 60], [10, 60], [10, 20]], "http://server/blahblah-bin/something.something?IIIF=01/02/2020601/https___moon_prism__power/makeup.original.tif/10,20,30,40/,40/180/default.jpg"),
+            (test_image, 180, True, [[10, 20], [40, 20], [40, 60], [10, 60], [10, 20]], "http://server/blahblah-bin/something.something?IIIF=01/02/2020601/https___moon_prism__power/makeup.original.tif/10,20,30,40/,40/!180/default.jpg"),
         ]
-        for rotation_angle, mirrored, polygon, expected_url in cases:
+        for image, rotation_angle, mirrored, polygon, expected_url in cases:
             with self.subTest(rotation_angle=rotation_angle, mirrored=mirrored):
                 element = Element(
                     name="Something",
                     type=self.element_type,
-                    image=self.image,
+                    image=image,
                     polygon=polygon,
                     rotation_angle=rotation_angle,
                     mirrored=mirrored,