diff --git a/aleksis/core/models.py b/aleksis/core/models.py
index 79933d4007b6afff751b3dde0b950f7ffd6ce33a..e1dae558196ec24093496f7ccdd588bdcdcbca43 100644
--- a/aleksis/core/models.py
+++ b/aleksis/core/models.py
@@ -1,5 +1,5 @@
 from datetime import date, datetime, timedelta
-from typing import Optional, Iterable, Union, Sequence
+from typing import Optional, Iterable, Union, Sequence, List
 
 from django.contrib.auth import get_user_model
 from django.contrib.auth.models import User
@@ -312,6 +312,22 @@ class Announcement(models.Model):
 
         return cls.objects.filter(content_type=ct, recipient_id__in=pks)
 
+    @classmethod
+    def for_person_at_time(cls, person: Person, when: Optional[datetime] = None) -> List:
+        """ Get all announcements for one person at a certain time """
+        when = when or timezone.datetime.now()
+
+        # Get announcements by time
+        announcements = cls.objects.filter(valid_from__lte=when, valid_until__gte=when)
+
+        # Filter by person
+        announcements_for_person = []
+        for announcement in announcements:
+            if person in announcement.recipient_persons:
+                announcements_for_person.append(announcement)
+
+        return announcements_for_person
+
     @property
     def recipient_persons(self) -> Union[models.QuerySet, Sequence[models.Model]]:
         """ Return a list of Persons this announcement is relevant for
diff --git a/aleksis/core/templates/core/announcements.html b/aleksis/core/templates/core/announcements.html
new file mode 100644
index 0000000000000000000000000000000000000000..3e1925536a12bb3824a5b5bb11adb636fcfc9bf2
--- /dev/null
+++ b/aleksis/core/templates/core/announcements.html
@@ -0,0 +1,41 @@
+{% load i18n humanize %}
+
+{% for announcement in announcements %}
+  <div class="alert primary">
+    <div>
+      {% if show_interval %}
+        <em class="right hide-on-small-and-down">
+          {% if announcement.valid_from.date == announcement.valid_until.date %}
+            {% blocktrans with from=announcement.valid_from|naturalday %}
+              Valid for {{ from }}
+            {% endblocktrans %}
+          {% else %}
+            {% blocktrans with from=announcement.valid_from|naturalday until=announcement.valid_until|naturalday %}
+              Valid for {{ from }} – {{ until }}
+            {% endblocktrans %}
+          {% endif %}
+        </em>
+      {% endif %}
+
+      <i class="material-icons left">announcement</i>
+      <p>
+        <strong>{{ announcement.title }}</strong> <br/>
+        {{ announcement.description }}
+      </p>
+
+      {% if show_interval %}
+        <em class="hide-on-med-and-up">
+          {% if announcement.valid_from.date == announcement.valid_until.date %}
+            {% blocktrans with from=announcement.valid_from|naturalday %}
+              Valid for {{ from }}
+            {% endblocktrans %}
+          {% else %}
+            {% blocktrans with from=announcement.valid_from|naturalday until=announcement.valid_until|naturalday %}
+              Valid for {{ from }} – {{ until }}
+            {% endblocktrans %}
+          {% endif %}
+        </em>
+      {% endif %}
+    </div>
+  </div>
+{% endfor %}
diff --git a/aleksis/core/templates/core/index.html b/aleksis/core/templates/core/index.html
index 9e8e19ac71dd20e17ca690c560a81767975e85aa..2ace14e98652ded4e56c840c180b10690b1fb7d6 100644
--- a/aleksis/core/templates/core/index.html
+++ b/aleksis/core/templates/core/index.html
@@ -28,6 +28,8 @@
       </div>
     {% endfor %}
 
+    {% include "core/announcements.html" with announcements=announcements %}
+
     <div class="row" id="live_load">
         {% for widget in widgets %}
           <div class="col s12 m12 l6 xl4">
diff --git a/aleksis/core/views.py b/aleksis/core/views.py
index 2e1946de401b866e0adbc4aa3ee8463b5f1b94af..98db80da4a5d30df58f6bc2a8d3d037f226a0044 100644
--- a/aleksis/core/views.py
+++ b/aleksis/core/views.py
@@ -16,7 +16,7 @@ from .forms import (
     EditTermForm,
     PersonsAccountsFormSet,
 )
-from .models import Activity, Group, Notification, Person, School, DashboardWidget
+from .models import Activity, Group, Notification, Person, School, DashboardWidget, Announcement
 from .tables import GroupsTable, PersonsTable
 from .util import messages
 
@@ -33,6 +33,9 @@ def index(request: HttpRequest) -> HttpResponse:
     context["notifications"] = notifications
     context["unread_notifications"] = unread_notifications
 
+    announcements = Announcement.for_person_at_time(request.user.person)
+    context["announcements"] = announcements
+
     widgets = DashboardWidget.objects.filter(active=True)
     media = DashboardWidget.get_media(widgets)