diff --git a/arkindex/process/serializers/imports.py b/arkindex/process/serializers/imports.py
index e5742e15eb77bd88ce276f738b718da7cde4f6db..13ec204aa42f2169d6d19afe53ccb159a931e4c1 100644
--- a/arkindex/process/serializers/imports.py
+++ b/arkindex/process/serializers/imports.py
@@ -582,7 +582,8 @@ class ApplyProcessTemplateSerializer(ProcessACLMixin, serializers.Serializer):
 
         # The template's worker runs have already been prefetched, so we can use them to validate directly
         if any(
-            run.version.state != WorkerVersionState.Available or run.version.docker_image_id is None
+            run.version.state != WorkerVersionState.Available
+            or (run.version.docker_image_id is None and not run.version.docker_image_iid)
             for run in template_process.worker_runs.all()
         ):
             raise ValidationError(detail='This template contains one or more unavailable worker versions and cannot be applied.')
diff --git a/arkindex/process/tests/test_templates.py b/arkindex/process/tests/test_templates.py
index 899f9771a1d69ae399bd86b437cb6961e6021cfa..94d19ef369c9b914e4853bafbcb07af18b0b20d6 100644
--- a/arkindex/process/tests/test_templates.py
+++ b/arkindex/process/tests/test_templates.py
@@ -301,6 +301,7 @@ class TestTemplates(FixtureAPITestCase):
         self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
 
     def test_apply(self):
+        self.assertIsNotNone(self.version_2.docker_image_id)
         self.client.force_login(self.user)
         with self.assertNumQueries(18):
             response = self.client.post(
@@ -325,6 +326,25 @@ class TestTemplates(FixtureAPITestCase):
         self.assertIsNone(child_run.configuration_id)
         self.assertListEqual(child_run.parents, [parent_run.id])
 
+    def test_apply_docker_image_iid(self):
+        """
+        Either docker_image_id or docker_image_iid attribute can be set
+        """
+
+        self.version_2.docker_image_id = None
+        self.version_2.docker_image_iid = 'test'
+        self.version_2.save()
+
+        self.client.force_login(self.user)
+        with self.assertNumQueries(18):
+            response = self.client.post(
+                reverse('api:apply-process-template', kwargs={'pk': str(self.template.id)}),
+                data=json.dumps({"process_id": str(self.process.id)}),
+                content_type='application/json',
+            )
+            self.assertEqual(response.status_code, status.HTTP_200_OK)
+        self.assertEqual(response.json()['template_id'], str(self.template.id))
+
     def test_apply_delete_previous_worker_runs(self):
         self.client.force_login(self.user)
         # Create a process with one worker run already