diff --git a/aleksis/core/mixins.py b/aleksis/core/mixins.py
index 2fcab29dac2250ad3fcc5dd70df67cea4ea8d8cd..3d6dc3c3684131527666dee61259efd63163975f 100644
--- a/aleksis/core/mixins.py
+++ b/aleksis/core/mixins.py
@@ -19,7 +19,6 @@ from django.views.generic import CreateView, UpdateView
 from django.views.generic.edit import DeleteView, ModelFormMixin
 
 import reversion
-from easyaudit.models import CRUDEvent
 from guardian.admin import GuardedModelAdmin
 from jsonstore.fields import IntegerField, JSONFieldMixin
 from material.base import Layout, LayoutNode
@@ -54,8 +53,7 @@ class ExtensibleModel(models.Model, metaclass=_ExtensibleModelBase):
     This base model ensures all objects in AlekSIS apps fulfill the
     following properties:
 
-     * crud_events property to retrieve easyaudit's CRUD event log
-     * created_at and updated_at properties based n CRUD events
+     * _versions property to retrieve all versions of the model from reversion
      * Allow injection of fields and code from AlekSIS apps to extend
        model functionality.
 
@@ -109,50 +107,30 @@ class ExtensibleModel(models.Model, metaclass=_ExtensibleModelBase):
         pass
 
     @property
-    def crud_events(self) -> QuerySet:
-        """Get all CRUD events connected to this object from easyaudit."""
-        content_type = ContentType.objects.get_for_model(self)
+    def _versions(self) -> List[Tuple[str, Tuple[Any, Any]]]:
+        """Get all versions of this object from django-reversion.
 
-        return CRUDEvent.objects.filter(
-            object_id=self.pk, content_type=content_type
-        ).select_related("user", "user__person")
+        Includes diffs to previous version.
+        """
+        versions = reversion.models.Version.objects.get_for_object(self)
 
-    @property
-    def crud_event_create(self) -> Optional[CRUDEvent]:
-        """Return create event of this object."""
-        return self.crud_events.filter(event_type=CRUDEvent.CREATE).latest("datetime")
+        versions_with_changes = []
+        for i, version in enumerate(versions):
+            diff = {}
+            if i > 0:
+                prev_version = versions[i-1]
 
-    @property
-    def crud_event_update(self) -> Optional[CRUDEvent]:
-        """Return last event of this object."""
-        return self.crud_events.latest("datetime")
+                for k, val in version.field_dict.items():
+                    prev_val = prev_version.get(k, None)
+                    if prev_val != val:
+                        diff[k] = (prev_val, val)
 
-    @property
-    def created_at(self) -> Optional[datetime]:
-        """Determine creation timestamp from CRUD log."""
-        if self.crud_event_create:
-            return self.crud_event_create.datetime
+            versions_with_changes.append((version, diff))
 
-    @property
-    def updated_at(self) -> Optional[datetime]:
-        """Determine last timestamp from CRUD log."""
-        if self.crud_event_update:
-            return self.crud_event_update.datetime
+        return versions_with_changes
 
     extended_data = JSONField(default=dict, editable=False)
 
-    @property
-    def created_by(self) -> Optional[models.Model]:
-        """Determine user who created this object from CRUD log."""
-        if self.crud_event_create:
-            return self.crud_event_create.user
-
-    @property
-    def updated_by(self) -> Optional[models.Model]:
-        """Determine user who last updated this object from CRUD log."""
-        if self.crud_event_update:
-            return self.crud_event_update.user
-
     extended_data = JSONField(default=dict, editable=False)
 
     @classmethod
diff --git a/aleksis/core/settings.py b/aleksis/core/settings.py
index 8d3212f3740e34469281e622456153a0fa5f83e6..c550a0421567c521a494f19124ac59542e83946a 100644
--- a/aleksis/core/settings.py
+++ b/aleksis/core/settings.py
@@ -65,7 +65,6 @@ INSTALLED_APPS = [
     "dbbackup",
     "settings_context_processor",
     "sass_processor",
-    "easyaudit",
     "django_any_js",
     "django_yarnpkg",
     "django_tables2",
@@ -131,7 +130,6 @@ MIDDLEWARE = [
     "impersonate.middleware.ImpersonateMiddleware",
     "django.contrib.messages.middleware.MessageMiddleware",
     "django.middleware.clickjacking.XFrameOptionsMiddleware",
-    "easyaudit.middleware.easyaudit.EasyAuditMiddleware",
     "maintenance_mode.middleware.MaintenanceModeMiddleware",
     "aleksis.core.util.middlewares.EnsurePersonMiddleware",
     "django_prometheus.middleware.PrometheusAfterMiddleware",
diff --git a/aleksis/core/templates/core/partials/crud_events.html b/aleksis/core/templates/core/partials/crud_events.html
index 50e4f73cab492804b163b7ddfe0dda08b9e267b7..dff0662f24c3b97fdeafbcaf766e99998b304dc4 100644
--- a/aleksis/core/templates/core/partials/crud_events.html
+++ b/aleksis/core/templates/core/partials/crud_events.html
@@ -1,62 +1,33 @@
 {% load i18n data_helpers %}
 
 <ul class="collection">
-  {% for event in obj.crud_events %}
-    {% if no_m2m and event.event_type == event.M2M_CHANGE or event.event_type == event.M2M_CHANGE_REV %}
-    {% else %}
-      <li class="collection-item">
-        <strong>
-          {% if event.event_type == event.CREATE %}
-            {% blocktrans with person=event.user.person %}
-              Created by {{ person }}
-            {% endblocktrans %}
-          {% elif event.event_type == event.UPDATE %}
-            {% blocktrans with person=event.user.person %}
-              Updated by {{ person }}
-            {% endblocktrans %}
-          {% elif event.event_type == event.DELETE %}
-            {% blocktrans with person=event.user.person %}
-              Deleted by {{ person }}
-            {% endblocktrans %}
-          {% elif event.event_type == event.M2M_CHANGE %}
-            {% blocktrans with person=event.user.person %}
-              Updated by {{ person }}
-            {% endblocktrans %}
-          {% elif event.event_type == event.M2M_CHANGE_REV %}
-            {% blocktrans with person=event.user.person %}
-              Updated by {{ person }}
-            {% endblocktrans %}
-          {% endif %}
-        </strong>
+  {% for version in obj._versions %}
+    <li class="collection-item">
+      <strong>
+        {{ version.0.revision.get_comment }}
+        {{ version.0.revision.user.person }}
+      </strong>
 
-        <div class="left" style="margin-right: 10px;">
-          {% if event.event_type == event.CREATE %}
-            <i class="material-icons">add_circle</i>
-          {% elif event.event_type == event.UPDATE %}
-            <i class="material-icons">edit</i>
-          {% elif event.event_type == event.DELETE %}
-            <i class="material-icons">delete</i>
-          {% elif event.event_type == event.M2M_CHANGE %}
-            <i class="material-icons">edit</i>
-          {% elif event.event_type == event.M2M_CHANGE_REV %}
-            <i class="material-icons">edit</i>
-          {% endif %}
-        </div>
-        <div class="right">
-          {{ event.datetime }}
-        </div>
-        {% parse_json event.changed_fields as changed_fields %}
-        {% if changed_fields %}
-          <ul>
-            {% for field, change in changed_fields.items %}
-              {% verbose_name event.content_type.app_label event.content_type.model field as verbose_name %}
-              <li>
-                {{ verbose_name }}: <s>{{ change.0 }}</s> → {{ change.1 }}
-              </li>
-            {% endfor %}
-          </ul>
+      <div class="left" style="margin-right: 10px;">
+        {% if forloop.first %}
+          <i class="material-icons">add_circle</i>
+        {% else %}
+          <i class="material-icons">edit</i>
         {% endif %}
-      </li>
-    {% endif %}
+      </div>
+      <div class="right">
+        {{ version.0.revision.date_created }}
+      </div>
+      {% if version.1 %}
+        <ul>
+          {% for field, change in version.1.items %}
+            {% verbose_name version.0.revision.content_type.app_label version.0.revision.content_type.model field as verbose_name %}
+            <li>
+              {{ verbose_name }}: <s>{{ change.0 }}</s> → {{ change.1 }}
+            </li>
+          {% endfor %}
+        </ul>
+      {% endif %}
+    </li>
   {% endfor %}
 </ul>
diff --git a/pyproject.toml b/pyproject.toml
index 9828956638a9e66c7f0c260f82c1673e29300701..48f3b0fa4f1ded56d02f851be33bb2f33213cc94 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -32,7 +32,6 @@ python = "^3.7"
 Django = "^3.0"
 django-any-js = "^1.0"
 django-debug-toolbar = "^2.0"
-django-easy-audit = {version ="^1.2rc1", allow-prereleases = true}
 django-middleware-global-request = "^0.1.2"
 django-menu-generator = "^1.0.4"
 django-tables2 = "^2.1"