diff --git a/AKModel/models.py b/AKModel/models.py
index 979f005f70ed48e2bd73daad4d21dbe2160b9aff..5c359610bf4a09979df568cc4eacaa8a80b47645 100644
--- a/AKModel/models.py
+++ b/AKModel/models.py
@@ -2,6 +2,7 @@ import itertools
 from datetime import timedelta
 
 from django.db import models
+from django.urls import reverse_lazy
 from django.utils import timezone
 from django.utils.datetime_safe import datetime
 from django.utils.text import slugify
@@ -529,7 +530,7 @@ class ConstraintViolation(models.Model):
         # Stringify all other fields
         for field in self.fields:
             a = getattr(self, field, None)
-            if a is not None:
+            if a is not None and str(a) != '':
                 output.append(f"{field}: {a}")
         return ", ".join(output)
 
@@ -539,6 +540,10 @@ class ConstraintViolation(models.Model):
     def details(self):
         return self.get_details()
 
+    @property
+    def edit_url(self):
+        return reverse_lazy('admin:AKModel_constraintviolation_change', kwargs={'object_id': self.pk})
+
     @property
     def level_display(self):
         return self.get_level_display()
diff --git a/AKScheduling/api.py b/AKScheduling/api.py
index b7ab7fbd1adb2290c79ac0d59e06ccbb7fd19b72..2e065b467427c3c70a7175e43aacc9695d2dac34 100644
--- a/AKScheduling/api.py
+++ b/AKScheduling/api.py
@@ -114,7 +114,7 @@ class EventsViewSet(EventSlugMixin, viewsets.ModelViewSet):
 class ConstraintViolationSerializer(serializers.ModelSerializer):
     class Meta:
         model = ConstraintViolation
-        fields = ['pk', 'type_display', 'aks', 'ak_slots', 'ak_owner', 'room', 'requirement', 'category', 'comment', 'timestamp_display', 'manually_resolved', 'level_display', 'details']
+        fields = ['pk', 'type_display', 'aks', 'ak_slots', 'ak_owner', 'room', 'requirement', 'category', 'comment', 'timestamp_display', 'manually_resolved', 'level_display', 'details', 'edit_url']
 
 
 class ConstraintViolationsViewSet(EventSlugMixin, viewsets.ModelViewSet):
diff --git a/AKScheduling/templates/admin/AKScheduling/constraint_violations.html b/AKScheduling/templates/admin/AKScheduling/constraint_violations.html
index 8645c192829c9bc58f91b45e78d1be2819b2892e..c987f3119284f551f5f74d06eba1c10f6faffdf6 100644
--- a/AKScheduling/templates/admin/AKScheduling/constraint_violations.html
+++ b/AKScheduling/templates/admin/AKScheduling/constraint_violations.html
@@ -63,7 +63,7 @@
 
                                // Update violations table
                                for(let i=0;i<response.length;i++) {
-                                   table_html += "<tr><td>" + response[i].level_display + "</td><td>" + response[i].type_display + "</td><td>" + response[i].details + "</td><td>" + response[i].timestamp_display + "</td><td></td></tr>";
+                                   table_html += "<tr><td>" + response[i].level_display + "</td><td>" + response[i].type_display + "</td><td>" + response[i].details + "</td><td class='nowrap'>" + response[i].timestamp_display + "</td><td><a href='" + response[i].edit_url + "'><i class='btn btn-primary fa fa-pen'></i></a></td></tr>";
                                }
                            }
                            else {