diff --git a/greg/migrations/0001_initial.py b/greg/migrations/0001_initial.py
index fddea6eade9e3f3a9b3ddbedea4cecc4cb3d8f2b..b9ba63b87241f1a03191aeb51224b21c08dbffa8 100644
--- a/greg/migrations/0001_initial.py
+++ b/greg/migrations/0001_initial.py
@@ -1,4 +1,4 @@
-# Generated by Django 3.2.5 on 2021-08-06 10:47
+# Generated by Django 3.2.5 on 2021-08-06 13:28
 
 import datetime
 import dirtyfields.dirtyfields
@@ -150,7 +150,7 @@ class Migration(migrations.Migration):
                 ('contact_person_unit', models.TextField()),
                 ('comments', models.TextField(blank=True)),
                 ('available_in_search', models.BooleanField(default=False)),
-                ('person', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='person_roles', to='greg.person')),
+                ('person', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='person_roles', to='greg.person')),
                 ('registered_by', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='sponsor_role', to='greg.sponsor')),
                 ('role', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='person_roles', to='greg.role')),
                 ('unit', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='unit_person_role', to='greg.organizationalunit')),
@@ -171,7 +171,7 @@ class Migration(migrations.Migration):
                 ('value', models.CharField(max_length=256)),
                 ('verified', models.CharField(blank=True, choices=[('AUTOMATIC', 'Automatic'), ('MANUAL', 'Manual')], max_length=9)),
                 ('verified_when', models.DateField(null=True)),
-                ('person', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='person', to='greg.person')),
+                ('person', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='person', to='greg.person')),
                 ('verified_by', models.ForeignKey(null=True, on_delete=django.db.models.deletion.PROTECT, related_name='sponsor', to='greg.sponsor')),
             ],
             options={
@@ -187,7 +187,7 @@ class Migration(migrations.Migration):
                 ('updated', models.DateTimeField(auto_now=True)),
                 ('consent_given_at', models.DateField(null=True)),
                 ('consent', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='link_person_consent', to='greg.consent')),
-                ('person', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='link_person_consent', to='greg.person')),
+                ('person', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='link_person_consent', to='greg.person')),
             ],
             bases=(dirtyfields.dirtyfields.DirtyFieldsMixin, models.Model),
         ),
diff --git a/greg/models.py b/greg/models.py
index a0db3da1a55c194ed4d5b04f52af2c7ed3c37239..81ccc1e058381702b8904405e1289b0e896e7d38 100644
--- a/greg/models.py
+++ b/greg/models.py
@@ -85,7 +85,7 @@ class PersonRole(BaseModel):
     """The relationship between a person and a role."""
 
     person = models.ForeignKey(
-        "Person", on_delete=models.PROTECT, related_name="person_roles"
+        "Person", on_delete=models.CASCADE, related_name="person_roles"
     )
     role = models.ForeignKey(
         "Role", on_delete=models.PROTECT, related_name="person_roles"
@@ -145,7 +145,7 @@ class PersonIdentity(BaseModel):
         MANUAL = "MANUAL"
 
     person = models.ForeignKey(
-        "Person", on_delete=models.PROTECT, related_name="person"
+        "Person", on_delete=models.CASCADE, related_name="person"
     )
     type = models.CharField(max_length=16, choices=IdentityType.choices)
     source = models.CharField(max_length=256)
@@ -201,7 +201,7 @@ class PersonConsent(BaseModel):
     """
 
     person = models.ForeignKey(
-        "Person", on_delete=models.PROTECT, related_name="link_person_consent"
+        "Person", on_delete=models.CASCADE, related_name="link_person_consent"
     )
     consent = models.ForeignKey(
         "Consent", on_delete=models.PROTECT, related_name="link_person_consent"
diff --git a/greg/tests/api/test_person.py b/greg/tests/api/test_person.py
index a81e383fd2f1c75cd3d35d899195a2ead12be997..b56c4a4b35411cbef616b231e0d7f16099c2be9a 100644
--- a/greg/tests/api/test_person.py
+++ b/greg/tests/api/test_person.py
@@ -5,7 +5,14 @@ from rest_framework import status
 from rest_framework.reverse import reverse
 from rest_framework.status import HTTP_200_OK
 
-from greg.models import Person, PersonIdentity, Sponsor, Role, OrganizationalUnit
+from greg.models import (
+    Person,
+    PersonIdentity,
+    Sponsor,
+    Role,
+    OrganizationalUnit,
+    Consent,
+)
 
 
 @pytest.fixture
@@ -105,6 +112,21 @@ def role_data_guest(
     }
 
 
+@pytest.fixture
+def consent_foo() -> Consent:
+    return Consent.objects.create(
+        type="test_consent",
+        consent_name_en="Test1",
+        consent_name_nb="Test2",
+        consent_description_en="Test description",
+        consent_description_nb="Test beskrivelse",
+        consent_link_en="https://example.org",
+        consent_link_nb="https://example.org",
+        valid_from="2018-01-20",
+        user_allowed_to_change=True,
+    )
+
+
 @pytest.mark.django_db
 def test_get_person(client, person_foo):
     resp = client.get(reverse("person-detail", kwargs={"id": person_foo.id}))
@@ -362,3 +384,30 @@ def test_identity_update(client, person_foo):
     assert results[0]["type"] == data_updated["type"]
     assert results[0]["source"] == data_updated["source"]
     assert results[0]["value"] == data_updated["value"]
+
+
+@pytest.mark.django_db
+def test_remove_person(
+    client, person_foo, role_data_guest, person_foo_verified, person_foo_not_verified
+):
+    url = reverse("person_role-list", kwargs={"person_id": person_foo.id})
+    client.post(url, role_data_guest)
+
+    roles_for_person = client.get(url).json()["results"]
+    assert len(roles_for_person) == 1
+
+    response = client.get(
+        reverse("person_identity-list", kwargs={"person_id": person_foo.id})
+    )
+    assert len(response.json()["results"]) == 2
+
+    # Delete the person and check that the data has been removed
+    client.delete(reverse("person-detail", kwargs={"id": person_foo.id}))
+
+    updated_role_data = client.get(url)
+    assert len(updated_role_data.json()["results"]) == 0
+
+    response = client.get(
+        reverse("person_identity-list", kwargs={"person_id": person_foo.id})
+    )
+    assert len(response.json()["results"]) == 0
diff --git a/greg/tests/models/test_person.py b/greg/tests/models/test_person.py
index fb851f06594a6aa9e9e5996c52cb794f9ff3622d..f4aeba5820a90b2ce592f87e6cf1e124b81c2d12 100644
--- a/greg/tests/models/test_person.py
+++ b/greg/tests/models/test_person.py
@@ -2,8 +2,6 @@ from functools import partial
 
 import pytest
 
-from django.db.models import ProtectedError
-
 from greg.models import (
     OrganizationalUnit,
     Person,
@@ -12,7 +10,6 @@ from greg.models import (
     Sponsor,
 )
 
-
 person_role_with = partial(
     PersonRole.objects.create,
     start_date="2020-03-05",
@@ -65,12 +62,3 @@ def test_add_multiple_roles_to_person(person, role_foo, role_bar):
     assert len(person_roles) == 2
     assert role_foo in person_roles
     assert role_bar in person_roles
-
-
-@pytest.mark.django_db
-def test_delete_person_with_roles(person):
-    # it is not clear what cleanup needs to be done when removing a person,
-    # so for now it is prohibited to delete a person with role relationships
-    # attached in other tables
-    with pytest.raises(ProtectedError):
-        person.delete()