diff --git a/aleksis/core/data_checks.py b/aleksis/core/data_checks.py
index f7152686f61fb63997eb9e0a6af9e23b47237f66..a7d43d293a34e69f329cf9506116cd36d8a5103c 100644
--- a/aleksis/core/data_checks.py
+++ b/aleksis/core/data_checks.py
@@ -9,7 +9,7 @@ import reversion
 from reversion import set_comment
 from templated_email import send_templated_mail
 
-from .celery import app
+from .util.celery_progress import ProgressRecorder, recorded_task
 from .util.core_helpers import get_site_preferences
 
 
@@ -208,10 +208,10 @@ class DataCheckRegistry:
         return [(check.name, check.verbose_name) for check in cls.data_checks]
 
 
-@app.task
-def check_data():
+@recorded_task
+def check_data(recorder: ProgressRecorder):
     """Execute all registered data checks and send email if activated."""
-    for check in DataCheckRegistry.data_checks:
+    for check in recorder.iterate(DataCheckRegistry.data_checks):
         logging.info(f"Run check: {check.verbose_name}")
         check.check_data()
 
diff --git a/aleksis/core/views.py b/aleksis/core/views.py
index 2ee83523ca49c5b112579a98b49147dbf3afcff8..0eb64c62cdc8368e664d3a2a031d7d6dc5d003f2 100644
--- a/aleksis/core/views.py
+++ b/aleksis/core/views.py
@@ -8,7 +8,7 @@ from django.db.models import QuerySet
 from django.forms.models import BaseModelForm, modelform_factory
 from django.http import HttpRequest, HttpResponse, HttpResponseNotFound
 from django.shortcuts import get_object_or_404, redirect, render
-from django.urls import reverse_lazy
+from django.urls import reverse, reverse_lazy
 from django.utils.decorators import method_decorator
 from django.utils.translation import gettext_lazy as _
 from django.views.decorators.cache import never_cache
@@ -756,17 +756,19 @@ class RunDataChecks(PermissionRequiredMixin, View):
     permission_required = "core.run_data_checks"
 
     def get(self, request: HttpRequest, *args, **kwargs) -> HttpResponse:
-        if not check_data()[1]:
-            messages.success(
-                request,
-                _(
-                    "The data check has been started. Please note that it may take "
-                    "a while before you are able to fetch the data on this page."
-                ),
-            )
-        else:
-            messages.success(request, _("The data check has finished."))
-        return redirect("check_data")
+        result = check_data.delay()
+
+        context = {
+            "title": _("Progress: Run data checks"),
+            "back_url": reverse("check_data"),
+            "progress": {
+                "task_id": result.task_id,
+                "title": _("Run data checks …"),
+                "success": _("The data checks were run successfully."),
+                "error": _("There was a problem while running data checks."),
+            },
+        }
+        return render(request, "core/pages/progress.html", context)
 
 
 class SolveDataCheckView(PermissionRequiredMixin, RevisionMixin, DetailView):