--- a
+++ b/tests/test_reducers.py
@@ -0,0 +1,64 @@
+import copy
+import pickle
+
+import dill
+import pytest
+from spacy.tokens import Doc
+
+import edsnlp
+
+if not hasattr(Doc, "custom_test_reducers"):
+    Doc.set_extension("custom_test_reducers", default=None)
+
+
+@pytest.mark.parametrize("pickler_module", ["pickle", "dill"])
+def test_reducers(pickler_module):
+    pickler = pickle if pickler_module == "pickle" else dill
+    doc = edsnlp.blank("eds")("This is a test.")
+    doc.spans["test"] = [doc[0:1]]
+    span = doc.spans["test"][0]
+    token = doc[0]
+    data = [
+        doc,  # data[0]
+        token,  # data[1]
+        token,  # data[2]
+        span,  # data[3]
+        span,  # data[4]
+    ]
+    doc._.custom_test_reducers = data
+    doc_bytes = pickler.dumps(doc)
+
+    doc_bis = pickler.loads(doc_bytes)
+    data_bis = doc_bis._.custom_test_reducers
+    assert data_bis[0] is doc_bis
+    assert data_bis[1] == doc_bis[0]
+    assert data_bis[1] is data_bis[2]
+    assert data_bis[3] is data_bis[4]
+
+    doc_ter = pickler.loads(doc_bytes)
+    data_ter = doc_ter._.custom_test_reducers
+    assert data_ter[0] is not data_bis[0]
+
+
+def test_deep_copy():
+    doc = edsnlp.blank("eds")("This is a test.")
+    doc.spans["test"] = [doc[0:1]]
+    span = doc.spans["test"][0]
+    token = doc[0]
+    data = [
+        doc,  # data[0]
+        token,  # data[1]
+        token,  # data[2]
+        span,  # data[3]
+        span,  # data[4]
+    ]
+
+    bis = copy.deepcopy(data)
+    ter = copy.deepcopy(data)
+    assert bis[1].doc is bis[0]
+    assert bis[3].doc is bis[0]
+    assert bis[1] is bis[2]
+    assert bis[3] is bis[4]
+
+    assert bis[0] is not doc
+    assert bis[0] is not ter[0]