diff --git a/db_schema.sql b/db_schema.sql
index 921b1daa1b871a8d58f2a915e9c1dda83e234714..29ef180941be4bbab1a96f5a93ec1bccabb7ee2f 100644
--- a/db_schema.sql
+++ b/db_schema.sql
@@ -183,6 +183,18 @@ CREATE TABLE IF NOT EXISTS `videos_data` (
   `video_format` INTEGER NOT NULL,
   `hash` varchar(32) NOT NULL
 );
+CREATE TABLE IF NOT EXISTS `announcements` (
+`id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
+	`text` text NOT NULL,
+	`internal` text NOT NULL,
+	`level` INTEGER NOT NULL DEFAULT 0,
+	`visible` INTEGER NOT NULL DEFAULT 0,
+	`deleted` INTEGER NOT NULL DEFAULT 0,
+  `time_created` datetime NOT NULL,
+  `time_updated` datetime NOT NULL,
+  `created_by` INTEGER NOT NULL
+);
+
 CREATE VIEW IF NOT EXISTS `courses` AS select * from `courses_data` where (not(`courses_data`.`deleted`));
 CREATE VIEW IF NOT EXISTS `lectures` AS select * from `lectures_data` where (not(`lectures_data`.`deleted`));
 CREATE VIEW IF NOT EXISTS `videos` AS select * from `videos_data` where (not(`videos_data`.`deleted`));
diff --git a/server.py b/server.py
index 6f17c6ecad8e339a3a12c3bc14edea2f5eb34395..c8ccaef1967493194342a9232c6ebae70fd0cd37 100755
--- a/server.py
+++ b/server.py
@@ -115,6 +115,10 @@ def human_date(d):
 def rfc3339(d):
 	return d.strftime('%Y-%m-%dT%H:%M:%S+02:00')
 
+@app.template_global()
+def get_announcements(minlevel=0):
+	return query('SELECT * FROM announcements WHERE NOT deleted AND (? OR visible) AND level >= ? ORDER BY level DESC', ismod(), minlevel)
+
 @app.route('/')
 @register_navbar('Home', icon='home')
 def index():
diff --git a/templates/base.html b/templates/base.html
index 25be41a15919b5880265d552721b43f339697200..7ebceab9cd377cd2c075a3d5908686fad5d2e3d0 100644
--- a/templates/base.html
+++ b/templates/base.html
@@ -1,4 +1,6 @@
-{% set page_border = page_border|default(1) -%}
+{% set page_border = page_border|default(1) %}
+{% set min_announcement_level = min_announcement_level|default(1) %}
+{% set announcement_levels = {0: 'info', 1: 'info', 2: 'warning', 3: 'danger'} %}
 
 <!DOCTYPE html>
 <html>
@@ -102,6 +104,9 @@
 					{% for msg in get_flashed_messages() %}
 					<div class="alert alert-danger" role="alert">{{ msg }}</div>
 					{% endfor %}
+					{% for msg in get_announcements(min_announcement_level) %}
+					<div class="alert alert-{{announcement_levels.get(msg.level, 'info')}}" role="alert">{{ msg.text|safe }}</div>
+					{% endfor %}
 					{% block content %}
 					<h1>This is a Heading</h1>
 					<p>This is a paragraph.</p>
diff --git a/templates/index.html b/templates/index.html
index 794011503a715fbd5a0288bac6e3f15ade2305e5..2a341700cf8e3d233df808d136f78d56a5c799a0 100644
--- a/templates/index.html
+++ b/templates/index.html
@@ -1,6 +1,7 @@
 {% from 'macros.html' import preview %}
 {% extends "base.html" %}
 {% set page_border = 0 %}
+{% set min_announcement_level = 0 %}
 {% block content %}
 <div class="row">
 	<div class="col-md-6 panel-group">