diff --git a/arkindex/process/tests/test_process_dataset_sets.py b/arkindex/process/tests/test_process_dataset_sets.py
index 07e0b808f955e3a11d0cdef22c1913eb5d20bb30..2e4f841c5acba86503a5ae385e480790afc22c00 100644
--- a/arkindex/process/tests/test_process_dataset_sets.py
+++ b/arkindex/process/tests/test_process_dataset_sets.py
@@ -112,6 +112,7 @@ class TestProcessDatasetSets(FixtureAPITestCase):
                     "corpus_id": str(self.private_corpus.id),
                     "state": "open",
                     "task_id": None,
+                    "unique_elements": True,
                     "created": FAKE_CREATED,
                     "updated": FAKE_CREATED
                 },
@@ -137,6 +138,7 @@ class TestProcessDatasetSets(FixtureAPITestCase):
                     "corpus_id": str(self.corpus.id),
                     "state": "open",
                     "task_id": None,
+                    "unique_elements": True,
                     "created": FAKE_CREATED,
                     "updated": FAKE_CREATED
                 },
@@ -315,6 +317,7 @@ class TestProcessDatasetSets(FixtureAPITestCase):
                 "corpus_id": str(self.corpus.id),
                 "state": "open",
                 "task_id": None,
+                "unique_elements": True,
                 "created": FAKE_CREATED,
                 "updated": FAKE_CREATED
             },
diff --git a/arkindex/training/tests/test_datasets_api.py b/arkindex/training/tests/test_datasets_api.py
index 4446928dd0ec6ab25e5e41b2f8ba3f5b89b25441..8a6060ea2cdf960c2051ec44b059ac78d334e76a 100644
--- a/arkindex/training/tests/test_datasets_api.py
+++ b/arkindex/training/tests/test_datasets_api.py
@@ -99,6 +99,7 @@ class TestDatasetsAPI(FixtureAPITestCase):
                 "creator": "Test user",
                 "task_id": None,
                 "corpus_id": str(self.corpus.id),
+                "unique_elements": True,
                 "created": FAKE_CREATED,
                 "updated": FAKE_CREATED,
             },
@@ -118,6 +119,7 @@ class TestDatasetsAPI(FixtureAPITestCase):
                 "creator": "Test user",
                 "task_id": None,
                 "corpus_id": str(self.corpus.id),
+                "unique_elements": True,
                 "created": FAKE_CREATED,
                 "updated": FAKE_CREATED,
             }
@@ -298,6 +300,7 @@ class TestDatasetsAPI(FixtureAPITestCase):
             "creator": "Test user",
             "task_id": None,
             "corpus_id": str(self.corpus.id),
+            "unique_elements": True,
             "created": created_dataset.created.isoformat().replace("+00:00", "Z"),
             "updated": created_dataset.updated.isoformat().replace("+00:00", "Z"),
         })
@@ -333,6 +336,7 @@ class TestDatasetsAPI(FixtureAPITestCase):
             "creator": "Test user",
             "task_id": None,
             "corpus_id": str(self.corpus.id),
+            "unique_elements": True,
             "created": created_dataset.created.isoformat().replace("+00:00", "Z"),
             "updated": created_dataset.updated.isoformat().replace("+00:00", "Z"),
         })
@@ -363,6 +367,7 @@ class TestDatasetsAPI(FixtureAPITestCase):
             "creator": "Test user",
             "task_id": None,
             "corpus_id": str(self.corpus.id),
+            "unique_elements": True,
             "created": created_dataset.created.isoformat().replace("+00:00", "Z"),
             "updated": created_dataset.updated.isoformat().replace("+00:00", "Z"),
         })
@@ -489,7 +494,7 @@ class TestDatasetsAPI(FixtureAPITestCase):
 
     def test_update_name_too_long(self):
         self.client.force_login(self.user)
-        with self.assertNumQueries(4):
+        with self.assertNumQueries(5):
             response = self.client.put(
                 reverse("api:dataset-update", kwargs={"pk": self.dataset.pk}),
                 data={
@@ -504,7 +509,7 @@ class TestDatasetsAPI(FixtureAPITestCase):
     def test_update_name_already_exists_in_corpus(self):
         Dataset.objects.create(name="Another Dataset", description="A set of data", corpus=self.corpus, creator=self.dataset_creator)
         self.client.force_login(self.user)
-        with self.assertNumQueries(5):
+        with self.assertNumQueries(6):
             response = self.client.put(
                 reverse("api:dataset-update", kwargs={"pk": self.dataset.pk}),
                 data={
@@ -518,7 +523,7 @@ class TestDatasetsAPI(FixtureAPITestCase):
 
     def test_update_requires_all_fields(self):
         self.client.force_login(self.user)
-        with self.assertNumQueries(4):
+        with self.assertNumQueries(5):
             response = self.client.put(
                 reverse("api:dataset-update", kwargs={"pk": self.dataset.pk}),
                 data={"name": "Shin Seiki Evangelion"},
@@ -530,7 +535,7 @@ class TestDatasetsAPI(FixtureAPITestCase):
     def test_update_sets_forbidden(self):
         self.client.force_login(self.user)
         self.assertIsNone(self.dataset.task_id)
-        with self.assertNumQueries(4):
+        with self.assertNumQueries(5):
             response = self.client.put(
                 reverse("api:dataset-update", kwargs={"pk": self.dataset.pk}),
                 data={
@@ -545,7 +550,7 @@ class TestDatasetsAPI(FixtureAPITestCase):
 
     def test_update_empty_or_blank_description_or_name(self):
         self.client.force_login(self.user)
-        with self.assertNumQueries(4):
+        with self.assertNumQueries(5):
             response = self.client.put(
                 reverse("api:dataset-update", kwargs={"pk": self.dataset.pk}),
                 data={
@@ -562,7 +567,7 @@ class TestDatasetsAPI(FixtureAPITestCase):
 
     def test_update_all_errors(self):
         self.client.force_login(self.user)
-        with self.assertNumQueries(4):
+        with self.assertNumQueries(5):
             response = self.client.put(
                 reverse("api:dataset-update", kwargs={"pk": self.dataset.pk}),
                 data={
@@ -583,7 +588,7 @@ class TestDatasetsAPI(FixtureAPITestCase):
         self.client.force_login(self.user)
         self.dataset.state = DatasetState.Building
         self.dataset.save()
-        with self.assertNumQueries(5):
+        with self.assertNumQueries(6):
             response = self.client.put(
                 reverse("api:dataset-update", kwargs={"pk": self.dataset.pk}),
                 data={
@@ -601,7 +606,7 @@ class TestDatasetsAPI(FixtureAPITestCase):
     def test_update_ponos_task_state_update(self):
         self.dataset.state = DatasetState.Building
         self.dataset.save()
-        with self.assertNumQueries(6):
+        with self.assertNumQueries(7):
             response = self.client.put(
                 reverse("api:dataset-update", kwargs={"pk": self.dataset.pk}),
                 HTTP_AUTHORIZATION=f"Ponos {self.task.token}",
@@ -684,7 +689,7 @@ class TestDatasetsAPI(FixtureAPITestCase):
 
     def test_update_ponos_task_state_requires_dataset_in_process(self):
         self.process.process_sets.all().delete()
-        with self.assertNumQueries(5):
+        with self.assertNumQueries(6):
             response = self.client.put(
                 reverse("api:dataset-update", kwargs={"pk": self.dataset.pk}),
                 HTTP_AUTHORIZATION=f"Ponos {self.task.token}",
@@ -701,7 +706,7 @@ class TestDatasetsAPI(FixtureAPITestCase):
         })
 
     def test_update_ponos_task_bad_state(self):
-        with self.assertNumQueries(3):
+        with self.assertNumQueries(4):
             response = self.client.put(
                 reverse("api:dataset-update", kwargs={"pk": self.dataset.pk}),
                 HTTP_AUTHORIZATION=f"Ponos {self.task.token}",
@@ -1005,6 +1010,7 @@ class TestDatasetsAPI(FixtureAPITestCase):
             "creator": "Test user",
             "task_id": None,
             "corpus_id": str(self.corpus.id),
+            "unique_elements": True,
             "created": FAKE_CREATED,
             "updated": FAKE_CREATED
         })
@@ -1464,7 +1470,7 @@ class TestDatasetsAPI(FixtureAPITestCase):
 
     def test_add_element_wrong_set(self):
         self.client.force_login(self.user)
-        with self.assertNumQueries(5):
+        with self.assertNumQueries(6):
             response = self.client.post(
                 reverse("api:dataset-elements", kwargs={"pk": self.dataset.id}),
                 data={"set": "aaaaaaaaaaa", "element_id": str(self.vol.id)},
@@ -1491,6 +1497,8 @@ class TestDatasetsAPI(FixtureAPITestCase):
     def test_add_element_already_exists(self):
         test_set = self.dataset.sets.order_by("name").first()
         test_set.set_elements.create(element=self.page1)
+        self.dataset.unique_elements = False
+        self.dataset.save()
         self.client.force_login(self.user)
         with self.assertNumQueries(6):
             response = self.client.post(
@@ -1504,7 +1512,7 @@ class TestDatasetsAPI(FixtureAPITestCase):
     def test_add_element(self):
         train_set = self.dataset.sets.get(name="training")
         self.client.force_login(self.user)
-        with self.assertNumQueries(11):
+        with self.assertNumQueries(12):
             response = self.client.post(
                 reverse("api:dataset-elements", kwargs={"pk": self.dataset.id}),
                 data={"set": "training", "element_id": str(self.page1.id)},
@@ -1633,7 +1641,7 @@ class TestDatasetsAPI(FixtureAPITestCase):
         self.user.selected_elements.set([self.vol, self.page1, self.page2])
 
         self.client.force_login(self.user)
-        with self.assertNumQueries(6):
+        with self.assertNumQueries(7):
             response = self.client.post(
                 reverse("api:dataset-elements-selection", kwargs={"pk": self.corpus.id}),
                 data={"set_id": str(train_set.id)},
@@ -1700,6 +1708,7 @@ class TestDatasetsAPI(FixtureAPITestCase):
                     "corpus_id": str(self.corpus.id),
                     "creator": "Test user",
                     "task_id": None,
+                    "unique_elements": True,
                     "created": self.dataset.created.isoformat().replace("+00:00", "Z"),
                     "updated": self.dataset.updated.isoformat().replace("+00:00", "Z"),
                 },
@@ -1741,6 +1750,7 @@ class TestDatasetsAPI(FixtureAPITestCase):
                     "corpus_id": str(self.corpus.id),
                     "creator": "Test user",
                     "task_id": None,
+                    "unique_elements": True,
                     "created": self.dataset.created.isoformat().replace("+00:00", "Z"),
                     "updated": self.dataset.updated.isoformat().replace("+00:00", "Z"),
                 },
@@ -1764,6 +1774,7 @@ class TestDatasetsAPI(FixtureAPITestCase):
                     "corpus_id": str(self.corpus.id),
                     "creator": "Test user",
                     "task_id": None,
+                    "unique_elements": True,
                     "created": self.dataset.created.isoformat().replace("+00:00", "Z"),
                     "updated": self.dataset.updated.isoformat().replace("+00:00", "Z"),
                 },
@@ -1787,6 +1798,7 @@ class TestDatasetsAPI(FixtureAPITestCase):
                     "corpus_id": str(self.corpus.id),
                     "creator": "Test user",
                     "task_id": None,
+                    "unique_elements": True,
                     "created": self.dataset2.created.isoformat().replace("+00:00", "Z"),
                     "updated": self.dataset2.updated.isoformat().replace("+00:00", "Z"),
                 },
@@ -1828,6 +1840,7 @@ class TestDatasetsAPI(FixtureAPITestCase):
                     "corpus_id": str(self.corpus.id),
                     "creator": "Test user",
                     "task_id": None,
+                    "unique_elements": True,
                     "created": self.dataset.created.isoformat().replace("+00:00", "Z"),
                     "updated": self.dataset.updated.isoformat().replace("+00:00", "Z"),
                 },
@@ -1851,6 +1864,7 @@ class TestDatasetsAPI(FixtureAPITestCase):
                     "corpus_id": str(self.corpus.id),
                     "creator": "Test user",
                     "task_id": None,
+                    "unique_elements": True,
                     "created": self.dataset.created.isoformat().replace("+00:00", "Z"),
                     "updated": self.dataset.updated.isoformat().replace("+00:00", "Z"),
                 },
@@ -1874,6 +1888,7 @@ class TestDatasetsAPI(FixtureAPITestCase):
                     "corpus_id": str(self.corpus.id),
                     "creator": "Test user",
                     "task_id": None,
+                    "unique_elements": True,
                     "created": self.dataset2.created.isoformat().replace("+00:00", "Z"),
                     "updated": self.dataset2.updated.isoformat().replace("+00:00", "Z"),
                 },
@@ -1926,6 +1941,7 @@ class TestDatasetsAPI(FixtureAPITestCase):
                     "corpus_id": str(self.corpus.id),
                     "creator": "Test user",
                     "task_id": None,
+                    "unique_elements": True,
                     "created": self.dataset.created.isoformat().replace("+00:00", "Z"),
                     "updated": self.dataset.updated.isoformat().replace("+00:00", "Z"),
                 },
@@ -1957,6 +1973,7 @@ class TestDatasetsAPI(FixtureAPITestCase):
                     "corpus_id": str(self.corpus.id),
                     "creator": "Test user",
                     "task_id": None,
+                    "unique_elements": True,
                     "created": self.dataset.created.isoformat().replace("+00:00", "Z"),
                     "updated": self.dataset.updated.isoformat().replace("+00:00", "Z"),
                 },
@@ -1980,6 +1997,7 @@ class TestDatasetsAPI(FixtureAPITestCase):
                     "corpus_id": str(self.corpus.id),
                     "creator": "Test user",
                     "task_id": None,
+                    "unique_elements": True,
                     "created": self.dataset2.created.isoformat().replace("+00:00", "Z"),
                     "updated": self.dataset2.updated.isoformat().replace("+00:00", "Z"),
                 },
@@ -2094,6 +2112,7 @@ class TestDatasetsAPI(FixtureAPITestCase):
                 "set_elements": {"test": 1, "training": 0, "validation": 2},
                 "state": DatasetState.Open.value,
                 "task_id": str(self.task.id),
+                "unique_elements": True,
             },
         )
         self.assertCountEqual(cloned_sets, [
@@ -2152,6 +2171,7 @@ class TestDatasetsAPI(FixtureAPITestCase):
                 "set_elements": {str(k.name): 0 for k in self.dataset.sets.all()},
                 "state": DatasetState.Open.value,
                 "task_id": None,
+                "unique_elements": True,
             },
         )
         self.assertCountEqual(cloned_sets, [