diff --git a/aleksis/core/admin.py b/aleksis/core/admin.py
index 0725c0aa5545797317a3bfac955cd854d28f227e..bdcda1e35e4bbd427e35e32b414e6931cba00ae6 100644
--- a/aleksis/core/admin.py
+++ b/aleksis/core/admin.py
@@ -1,6 +1,6 @@
 from django.contrib import admin
 
-from .models import Group, Person, School, SchoolTerm, Activity, Notification
+from .models import Group, Person, School, SchoolTerm, Activity, Notification, Announcement
 
 admin.site.register(Person)
 admin.site.register(Group)
@@ -8,3 +8,4 @@ admin.site.register(School)
 admin.site.register(SchoolTerm)
 admin.site.register(Activity)
 admin.site.register(Notification)
+admin.site.register(Announcement)
diff --git a/aleksis/core/models.py b/aleksis/core/models.py
index ad40d171e660cd7a666edb7f4322d4de98dbed58..79933d4007b6afff751b3dde0b950f7ffd6ce33a 100644
--- a/aleksis/core/models.py
+++ b/aleksis/core/models.py
@@ -1,4 +1,4 @@
-from datetime import date, datetime
+from datetime import date, datetime, timedelta
 from typing import Optional, Iterable, Union, Sequence
 
 from django.contrib.auth import get_user_model
@@ -8,6 +8,7 @@ from django.contrib.contenttypes.models import ContentType
 from django.db import models
 from django.db.models import QuerySet
 from django.forms.widgets import Media
+from django.utils import timezone
 from django.utils.translation import ugettext_lazy as _
 from image_cropping import ImageCropField, ImageRatioField
 from phonenumber_field.modelfields import PhoneNumberField
@@ -281,11 +282,16 @@ class Notification(models.Model):
 
 class Announcement(models.Model):
     title = models.CharField(max_length=150, verbose_name=_("Title"))
-    description = models.TextField(max_length=500, verbose_name=_("Description"))
+    description = models.TextField(max_length=500, verbose_name=_("Description"), blank=True)
     link = models.URLField(blank=True, verbose_name=_("Link"))
 
-    valid_from = models.DateTimeField(verbose_name=_("Date and time from when to show"), default=datetime.now)
-    valid_until = models.DateTimeField(verbose_name=_("Date and time until when to show"), null=True, blank=True)
+    valid_from = models.DateTimeField(
+        verbose_name=_("Date and time from when to show"), default=timezone.datetime.now
+    )
+    valid_until = models.DateTimeField(
+        verbose_name=_("Date and time until when to show"),
+        default=lambda: timezone.datetime.now() + timedelta(days=1),
+    )
 
     content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
     recipient_id = models.PositiveIntegerField()
@@ -319,11 +325,12 @@ class Announcement(models.Model):
         else:
             return getattr(self.recipient, "announcement_recipients", [])
 
-    def save(self, **kwargs):
-        if not self.valid_until:
-            self.valid_until = self.valid_from
+    def __str__(self):
+        return self.title
 
-        super().save(**kwargs)
+    class Meta:
+        verbose_name = _("Announcement")
+        verbose_name_plural = _("Announcements")
 
 
 class DashboardWidget(PolymorphicModel):