diff --git a/arkindex/documents/serializers/elements.py b/arkindex/documents/serializers/elements.py
index e3fd059dc721d2f84fd35efe4acb32c6a24b4e81..3c00f5019f071e349a32aec425fa62ede9477686 100644
--- a/arkindex/documents/serializers/elements.py
+++ b/arkindex/documents/serializers/elements.py
@@ -9,7 +9,7 @@ from django.contrib.gis.geos import LinearRing
 from django.core.exceptions import ValidationError as DjangoValidationError
 from django.core.validators import URLValidator
 from django.db import transaction
-from drf_spectacular.utils import extend_schema_field, extend_schema_serializer
+from drf_spectacular.utils import extend_schema_field
 from rest_framework import serializers
 from rest_framework.exceptions import ValidationError
 
@@ -27,10 +27,9 @@ from arkindex.images.serializers import ZoneSerializer
 from arkindex.process.models import WorkerVersion
 from arkindex.project.fields import Array
 from arkindex.project.mixins import SelectionMixin
-from arkindex.project.serializer_fields import ForbiddenField, LinearRingField, WorkerRunIDField
+from arkindex.project.serializer_fields import LinearRingField, WorkerRunIDField
 from arkindex.project.tools import polygon_outside_image
 from arkindex.project.triggers import add_parent_selection, move_selection
-from arkindex.project.validators import ForbiddenValidator
 from arkindex.users.models import Group, Right, Role
 from arkindex.users.utils import get_max_level
 
@@ -411,7 +410,6 @@ class ElementTinySerializer(serializers.ModelSerializer):
         )
 
 
-@extend_schema_serializer(deprecate_fields=("worker_version_id", ))
 class ElementListSerializer(ElementTinySerializer):
     created = serializers.DateTimeField(read_only=True)
     classes = ClassificationSerializer(
@@ -453,7 +451,6 @@ class ElementListSerializer(ElementTinySerializer):
             "classes",
             "metadata",
             "has_children",
-            "worker_version_id",
             "worker_run",
             "confidence",
         )
@@ -513,7 +510,6 @@ class ElementParentSerializer(serializers.Serializer):
         parent.remove_child(child)
 
 
-@extend_schema_serializer(deprecate_fields=("worker_version", ))
 class ElementSerializer(ElementTinySerializer):
     """
     Serialize an element with its metadata and classifications
@@ -562,7 +558,6 @@ class ElementSerializer(ElementTinySerializer):
             "classifications",
             "image",
             "polygon",
-            "worker_version",
             "confidence",
             "worker_run",
             "thumbnail_put_url",
@@ -573,7 +568,6 @@ class ElementSerializer(ElementTinySerializer):
             "rights",
             "metadata_count",
             "classifications",
-            "worker_version",
             "worker_run",
             "thumbnail_put_url",
         )
@@ -670,7 +664,6 @@ class ElementNeighborsSerializer(serializers.ModelSerializer):
         read_only_fields = fields
 
 
-@extend_schema_serializer(deprecate_fields=("worker_version", ))
 class ElementCreateSerializer(ElementLightSerializer):
     """
     Serialize an Element with a possible parent and image
@@ -700,19 +693,6 @@ class ElementCreateSerializer(ElementLightSerializer):
     )
     rotation_angle = serializers.IntegerField(min_value=0, max_value=359, required=False)
     mirrored = serializers.BooleanField(required=False)
-    worker_version = serializers.UUIDField(
-        required=False,
-        allow_null=True,
-        source="worker_version_id",
-        validators=[
-            ForbiddenValidator(),
-        ],
-        help_text=dedent("""
-            ID of a WorkerVersion that created this element.
-
-            Creating new elements with a WorkerVersion is forbidden. Use `worker_run_id` instead.
-        """),
-    )
     worker_run_id = WorkerRunIDField(
         required=False,
         allow_null=True,
@@ -734,7 +714,6 @@ class ElementCreateSerializer(ElementLightSerializer):
             "polygon",
             "rotation_angle",
             "mirrored",
-            "worker_version",
             "worker_run_id",
             "confidence",
         )
@@ -899,7 +878,6 @@ class ElementBulkSerializer(serializers.Serializer):
     """
     Serialize child elements on a common parent
     """
-    worker_version = ForbiddenField()
     worker_run_id = WorkerRunIDField(
         help_text=dedent("""
             A WorkerRun ID that the new elements will refer to.
diff --git a/arkindex/documents/tests/test_bulk_elements.py b/arkindex/documents/tests/test_bulk_elements.py
index 21360cb42866b9e4b77c88071e245743c98af012..bd72c968d6a5dc89b84429976ceb960ab813d959 100644
--- a/arkindex/documents/tests/test_bulk_elements.py
+++ b/arkindex/documents/tests/test_bulk_elements.py
@@ -385,7 +385,6 @@ class TestBulkElements(FixtureAPITestCase):
             response = self.client.post(
                 reverse("api:elements-bulk-create", kwargs={"pk": str(self.element.id)}),
                 data={
-                    "worker_version": str(self.worker_version.id),
                     "elements": [
                         {
                             "name": "Blah",
@@ -398,8 +397,7 @@ class TestBulkElements(FixtureAPITestCase):
             )
             self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
         self.assertDictEqual(response.json(), {
-            "worker_run_id": ["This field is required."],
-            "worker_version": ["This field is forbidden."],
+            "worker_run_id": ["This field is required."]
         })
 
     def test_worker_run_non_local(self):
diff --git a/arkindex/documents/tests/test_children_elements.py b/arkindex/documents/tests/test_children_elements.py
index 66eb2dbc47611d6e423f9a4e541d32d22a19b100..74aad75eda2535a10a209c2b06a4a04956856882 100644
--- a/arkindex/documents/tests/test_children_elements.py
+++ b/arkindex/documents/tests/test_children_elements.py
@@ -93,7 +93,6 @@ class TestChildrenElements(FixtureAPITestCase):
                 "id": str(nested_volume.id),
                 "name": nested_volume.name,
                 "type": nested_volume.type.slug,
-                "worker_version_id": None,
                 "worker_run": None,
                 "confidence": None,
                 "zone": None,
@@ -112,6 +111,7 @@ class TestChildrenElements(FixtureAPITestCase):
             }
         ])
 
+        nested_volume.worker_run = self.worker_run
         nested_volume.worker_version = self.worker_version
         nested_volume.save()
         response = self.client.get(reverse("api:elements-children", kwargs={"pk": str(self.vol.id)}) + "?folder")
@@ -120,8 +120,10 @@ class TestChildrenElements(FixtureAPITestCase):
                 "id": str(nested_volume.id),
                 "name": nested_volume.name,
                 "type": nested_volume.type.slug,
-                "worker_version_id": str(self.worker_version.id),
-                "worker_run": None,
+                "worker_run": {
+                    "id": str(self.worker_run.id),
+                    "summary": "Worker Document layout analyser @ version 1"
+                },
                 "confidence": None,
                 "zone": None,
                 "rotation_angle": 0,
@@ -151,7 +153,6 @@ class TestChildrenElements(FixtureAPITestCase):
                 "id": str(lonely_element.id),
                 "name": lonely_element.name,
                 "type": lonely_element.type.slug,
-                "worker_version_id": None,
                 "worker_run": None,
                 "confidence": None,
                 "zone": {
@@ -201,7 +202,6 @@ class TestChildrenElements(FixtureAPITestCase):
                 "id": str(lonely_element.id),
                 "name": lonely_element.name,
                 "type": lonely_element.type.slug,
-                "worker_version_id": None,
                 "worker_run": None,
                 "confidence": None,
                 "corpus": {
@@ -231,7 +231,6 @@ class TestChildrenElements(FixtureAPITestCase):
                 "id": str(lonely_element.id),
                 "name": lonely_element.name,
                 "type": lonely_element.type.slug,
-                "worker_version_id": None,
                 "worker_run": None,
                 "confidence": None,
                 "zone": {
@@ -277,10 +276,9 @@ class TestChildrenElements(FixtureAPITestCase):
                 "id": str(worker_run_child.id),
                 "name": "bob",
                 "type": "page",
-                "worker_version_id": str(self.worker_version.id),
                 "worker_run": {
                     "id": str(self.worker_run.id),
-                    "summary": self.worker_run.summary
+                    "summary": "Worker Document layout analyser @ version 1"
                 },
                 "zone": None,
                 "confidence": None,
diff --git a/arkindex/documents/tests/test_corpus_elements.py b/arkindex/documents/tests/test_corpus_elements.py
index 5d5cc86e3b13785d9bffc6674cdeaff6bcf033b7..78c3929e91a392c430441dc05166347f676d26af 100644
--- a/arkindex/documents/tests/test_corpus_elements.py
+++ b/arkindex/documents/tests/test_corpus_elements.py
@@ -349,8 +349,9 @@ class TestListElements(FixtureAPITestCase):
         )
 
     def test_list_elements_filter_no_worker_version(self):
-        self.corpus.elements.update(worker_version=self.worker_version, worker_run=self.worker_run)
-        self.corpus.elements.filter(name__contains="Volume 2").update(worker_version=None, worker_run=None)
+        self.corpus.elements.update(worker_version=self.worker_version)
+        self.corpus.elements.update(worker_run=self.worker_run)
+        self.corpus.elements.filter(name__contains="Volume 2").update(worker_run=None, worker_version=None)
 
         with self.assertNumQueries(5):
             response = self.client.get(
diff --git a/arkindex/documents/tests/test_create_elements.py b/arkindex/documents/tests/test_create_elements.py
index 8fb81aed98e53bbd9e12fea1b42e3cb439e367da..d0baa1de54ce0e4684ef83cfc1745c6eda1a3752 100644
--- a/arkindex/documents/tests/test_create_elements.py
+++ b/arkindex/documents/tests/test_create_elements.py
@@ -94,7 +94,6 @@ class TestCreateElements(FixtureAPITestCase):
                 "name": volume.name,
                 "thumbnail_url": volume.thumbnail.s3_url,
                 "thumbnail_put_url": volume.thumbnail.s3_put_url,
-                "worker_version": None,
                 "confidence": None,
                 "creator": "Test user",
                 "rights": ["read", "write", "admin"],
@@ -141,7 +140,6 @@ class TestCreateElements(FixtureAPITestCase):
                 "created": page.created.isoformat().replace("+00:00", "Z"),
                 "creator": "Test user",
                 "rights": ["read", "write", "admin"],
-                "worker_version": None,
                 "confidence": None,
                 "classifications": [],
                 "corpus": {
@@ -263,7 +261,6 @@ class TestCreateElements(FixtureAPITestCase):
                 "type": page.type.slug,
                 "thumbnail_put_url": None,
                 "thumbnail_url": None,
-                "worker_version": None,
                 "confidence": None,
                 "creator": "Test user",
                 "rights": ["read", "write", "admin"],
@@ -575,7 +572,7 @@ class TestCreateElements(FixtureAPITestCase):
         self.assertIsNone(act.creator)
         self.assertDictEqual(response.json()["worker_run"], {
             "id": str(self.local_worker_run.id),
-            "summary": self.local_worker_run.summary,
+            "summary": "Worker Custom worker @ version 1",
         })
 
     def test_worker_run_task(self):
@@ -603,7 +600,7 @@ class TestCreateElements(FixtureAPITestCase):
         self.assertIsNone(act.creator)
         self.assertDictEqual(response.json()["worker_run"], {
             "id": str(self.worker_run.id),
-            "summary": self.worker_run.summary,
+            "summary": "Worker Document layout analyser @ version 1",
         })
 
     def test_worker_run_local_task_auth(self):
@@ -638,7 +635,7 @@ class TestCreateElements(FixtureAPITestCase):
         self.assertIsNone(act.creator)
         self.assertDictEqual(response.json()["worker_run"], {
             "id": str(self.local_worker_run.id),
-            "summary": self.local_worker_run.summary,
+            "summary": "Worker Custom worker @ version 1",
         })
 
     def test_worker_run_non_local(self):
@@ -729,36 +726,3 @@ class TestCreateElements(FixtureAPITestCase):
             self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
 
         self.assertDictEqual(response.json(), {"worker_run_id": [f'Invalid pk "{random_uuid}" - object does not exist.']})
-
-    def test_worker_run_and_version(self):
-        self.client.force_login(self.user)
-        request = self.make_create_request(
-            name="Castle story",
-            elt_type="act",
-            worker_version=str(self.worker_version.id),
-            worker_run_id=str(self.local_worker_run.id),
-        )
-        with self.assertNumQueries(5):
-            response = self.client.post(**request)
-            self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
-
-        self.assertDictEqual(response.json(), {
-            "worker_version": ["This field is forbidden."],
-        })
-
-    def test_worker_version(self):
-        # Create an element with a worker version
-        self.client.force_login(self.user)
-        request = self.make_create_request(
-            name="Castle story",
-            elt_type="act",
-            worker_version=str(self.worker_version.id),
-        )
-
-        with self.assertNumQueries(4):
-            response = self.client.post(**request)
-            self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
-
-        self.assertEqual(response.json(), {
-            "worker_version": ["This field is forbidden."],
-        })
diff --git a/arkindex/documents/tests/test_parents_elements.py b/arkindex/documents/tests/test_parents_elements.py
index cc0a9461f3d5f2b44b06f73dc58bae1363a2cf10..b24752640ce4561f6ec5aabc724539e35a5c847a 100644
--- a/arkindex/documents/tests/test_parents_elements.py
+++ b/arkindex/documents/tests/test_parents_elements.py
@@ -21,6 +21,7 @@ class TestParentsElements(FixtureAPITestCase):
         cls.private_corpus = Corpus.objects.create(name="private", public=False)
         cls.private_elt = cls.private_corpus.elements.create(type=cls.private_corpus.types.create(slug="type"))
         cls.worker_version = WorkerVersion.objects.get(worker__slug="reco")
+        cls.worker_run = cls.worker_version.worker_runs.first()
 
     def test_element_parents(self):
         response = self.client.get(reverse("api:elements-parents", kwargs={"pk": str(self.vol.id)}))
@@ -79,7 +80,6 @@ class TestParentsElements(FixtureAPITestCase):
                 "id": str(self.vol.id),
                 "name": self.vol.name,
                 "type": self.vol.type.slug,
-                "worker_version_id": None,
                 "worker_run": None,
                 "confidence": None,
                 "zone": None,
@@ -97,7 +97,7 @@ class TestParentsElements(FixtureAPITestCase):
         """
         List parents filtered by worker_version
         """
-        self.corpus.elements.filter(name__contains="Volume 1").update(worker_version=self.worker_version)
+        self.corpus.elements.filter(name__contains="Volume 1").update(worker_version=self.worker_version, worker_run=self.worker_run)
 
         with self.assertNumQueries(5):
             response = self.client.get(
@@ -649,7 +649,7 @@ class TestParentsElements(FixtureAPITestCase):
         self.surface.add_parent(other_act)
 
         dla = WorkerVersion.objects.get(worker__slug="dla")
-        act.transcriptions.create(text="blah", confidence=1, worker_version=self.worker_version)
+        act.transcriptions.create(text="blah", confidence=1, worker_version=self.worker_version, worker_run=self.worker_run)
         other_act.transcriptions.create(text="bloh", confidence=1, worker_version=dla)
         self.vol.transcriptions.create(text="bleh", confidence=1, worker_version=None)
 
diff --git a/arkindex/documents/tests/test_patch_elements.py b/arkindex/documents/tests/test_patch_elements.py
index 4a0bd1c6db80460c8a9535cc91d320c3e8c3676c..ce5d1f008b9a5087e51700ef4666948b2718b7d7 100644
--- a/arkindex/documents/tests/test_patch_elements.py
+++ b/arkindex/documents/tests/test_patch_elements.py
@@ -5,7 +5,7 @@ from rest_framework import status
 
 from arkindex.documents.models import Corpus, Element
 from arkindex.images.models import ImageServer
-from arkindex.process.models import WorkerVersion
+from arkindex.process.models import WorkerRun
 from arkindex.project.aws import S3FileStatus
 from arkindex.project.tests import FixtureAPITestCase
 from arkindex.users.models import Role, User
@@ -125,7 +125,7 @@ class TestPatchElements(FixtureAPITestCase):
                 "zone": 51,
                 "metadata": [],
                 "classifications": [],
-                "worker_version": str(WorkerVersion.objects.first().id),
+                "worker_run": str(WorkerRun.objects.first().id),
             },
             format="json",
         )
@@ -133,13 +133,14 @@ class TestPatchElements(FixtureAPITestCase):
         data = response.json()
         self.assertEqual(data["name"], "New name")
         self.assertEqual(data["type"], "xyzzy")
-        self.assertIsNone(data["worker_version"])
+        self.assertIsNone(data["worker_run"])
         self.vol.refresh_from_db()
         self.assertEqual(self.vol.name, "New name")
         self.assertEqual(self.vol.type, box_type)
         self.assertNotEqual(self.vol.id, "beef")
         self.assertNotEqual(self.vol.corpus_id, "something")
         self.assertIsNone(self.vol.worker_version_id)
+        self.assertIsNone(self.vol.worker_run_id)
 
     def test_patch_element_polygon(self):
         self.client.force_login(self.user)
diff --git a/arkindex/documents/tests/test_put_elements.py b/arkindex/documents/tests/test_put_elements.py
index c4d42407cb0e2bac4410f7ece70b4aaadabe85a3..22cb9fce4cd5e878b4599805f3137079e947fac0 100644
--- a/arkindex/documents/tests/test_put_elements.py
+++ b/arkindex/documents/tests/test_put_elements.py
@@ -5,7 +5,7 @@ from rest_framework import status
 
 from arkindex.documents.models import Corpus, Element
 from arkindex.images.models import ImageServer
-from arkindex.process.models import WorkerVersion
+from arkindex.process.models import WorkerRun
 from arkindex.project.aws import S3FileStatus
 from arkindex.project.tests import FixtureAPITestCase
 from arkindex.users.models import Role, User
@@ -120,7 +120,7 @@ class TestPutElements(FixtureAPITestCase):
                 "zone": 51,
                 "metadata": [],
                 "classifications": [],
-                "worker_version": str(WorkerVersion.objects.first().id),
+                "worker_run": str(WorkerRun.objects.first().id),
             },
             format="json",
         )
@@ -128,13 +128,14 @@ class TestPutElements(FixtureAPITestCase):
         data = response.json()
         self.assertEqual(data["name"], "New name")
         self.assertEqual(data["type"], "xyzzy")
-        self.assertIsNone(data["worker_version"])
+        self.assertIsNone(data["worker_run"])
         self.vol.refresh_from_db()
         self.assertEqual(self.vol.name, "New name")
         self.assertEqual(self.vol.type, box_type)
         self.assertNotEqual(self.vol.id, "beef")
         self.assertNotEqual(self.vol.corpus_id, "something")
         self.assertIsNone(self.vol.worker_version_id)
+        self.assertIsNone(self.vol.worker_run_id)
 
     def test_put_element_polygon(self):
         self.client.force_login(self.user)
diff --git a/arkindex/documents/tests/test_retrieve_elements.py b/arkindex/documents/tests/test_retrieve_elements.py
index ebd458883552d9ae31b18ee09120167a4113ca14..5632a510b69d8845cd1afbf6bfc3f7626476c06c 100644
--- a/arkindex/documents/tests/test_retrieve_elements.py
+++ b/arkindex/documents/tests/test_retrieve_elements.py
@@ -44,7 +44,6 @@ class TestRetrieveElements(FixtureAPITestCase):
             },
             "thumbnail_url": self.vol.thumbnail.s3_url,
             "thumbnail_put_url": None,
-            "worker_version": None,
             "confidence": None,
             "zone": None,
             "rotation_angle": 0,
@@ -61,7 +60,7 @@ class TestRetrieveElements(FixtureAPITestCase):
                     "state": "pending",
                     "worker_run": {
                         "id": str(self.worker_run.id),
-                        "summary": self.worker_run.summary
+                        "summary": "Worker Recognizer @ version 1"
                     },
                     "ml_class": {
                         "id": str(ml_class.id),
@@ -235,7 +234,6 @@ class TestRetrieveElements(FixtureAPITestCase):
             },
             "thumbnail_url": self.vol.thumbnail.s3_url,
             "thumbnail_put_url": None,
-            "worker_version": str(self.worker_version.id),
             "confidence": None,
             "zone": None,
             "rotation_angle": 0,
@@ -247,7 +245,7 @@ class TestRetrieveElements(FixtureAPITestCase):
             "classifications": [],
             "worker_run": {
                 "id": str(self.worker_run.id),
-                "summary": self.worker_run.summary
+                "summary": "Worker Recognizer @ version 1"
             }
         })
 
@@ -270,7 +268,6 @@ class TestRetrieveElements(FixtureAPITestCase):
             },
             "thumbnail_url": self.vol.thumbnail.s3_url,
             "thumbnail_put_url": None,
-            "worker_version": None,
             "confidence": None,
             "zone": None,
             "rotation_angle": 0,
@@ -287,7 +284,7 @@ class TestRetrieveElements(FixtureAPITestCase):
                     "state": "pending",
                     "worker_run": {
                         "id": str(self.worker_run.id),
-                        "summary": self.worker_run.summary
+                        "summary": "Worker Recognizer @ version 1"
                     },
                     "ml_class": {
                         "id": str(ml_class.id),
diff --git a/arkindex/training/tests/test_datasets_api.py b/arkindex/training/tests/test_datasets_api.py
index f06082757448935663ec0c28ba97df38f7f41c36..c2ebc9e14590439fd50899ae0e6b447b601fa441 100644
--- a/arkindex/training/tests/test_datasets_api.py
+++ b/arkindex/training/tests/test_datasets_api.py
@@ -1372,7 +1372,6 @@ class TestDatasetsAPI(FixtureAPITestCase):
                     "has_children": None,
                     "metadata": None,
                     "worker_run": None,
-                    "worker_version_id": None,
                     "thumbnail_url": None,
                     "created": FAKE_CREATED
                 },
@@ -1421,7 +1420,6 @@ class TestDatasetsAPI(FixtureAPITestCase):
                     "has_children": None,
                     "metadata": None,
                     "worker_run": None,
-                    "worker_version_id": None,
                     "thumbnail_url": None,
                     "created": FAKE_CREATED
                 },
@@ -1470,7 +1468,6 @@ class TestDatasetsAPI(FixtureAPITestCase):
                     "has_children": None,
                     "metadata": None,
                     "worker_run": None,
-                    "worker_version_id": None,
                     "thumbnail_url": None,
                     "created": FAKE_CREATED
                 },
@@ -1494,7 +1491,6 @@ class TestDatasetsAPI(FixtureAPITestCase):
                     "has_children": None,
                     "metadata": None,
                     "worker_run": None,
-                    "worker_version_id": None,
                     "thumbnail_url": "s3_url",
                     "created": FAKE_CREATED
                 },