diff --git a/server.py b/server.py
index c98b62008f6dd04848854f048e9f6b6f2ef4e6fc..e42c6f9bb726abc10b0104d4cebbdccda87f017e 100755
--- a/server.py
+++ b/server.py
@@ -7,7 +7,7 @@ import os
 import hashlib
 import locale
 
-locale.setlocale(locale.LC_ALL, 'de_DE')
+locale.setlocale(locale.LC_ALL, 'de_DE.UTF-8')
 
 app = Flask(__name__)
 
@@ -94,8 +94,20 @@ def handle_not_found(e):
 	return render_endpoint('index', 'Diese Seite existiert nicht!'), 404
 
 @app.template_filter(name='semester')
-def human_semester(s):
-	return s
+def human_semester(s, long=False):
+	if not s or s == 'zeitlos' or len(s) != 6:
+		return 'Zeitlos'
+	year = s[0:4]
+	semester = s[4:6].upper()
+	if not year.isdigit() or semester not in ['SS', 'WS']:
+		print('Invalid semester string "%s"'%s)
+		return '??'
+	if not long:
+		return semester+year[2:]
+	elif semester == 'SS':
+		return 'Sommersemester %s'%year
+	else:
+		return 'Wintersemester %s/%s'%(year, str(int(year)+1)[2:])
 
 @app.template_filter(name='date')
 def human_date(d):
diff --git a/templates/course.html b/templates/course.html
index 61c93b5b20083448973904e8c4ee4d8d86300e1c..196946a939adf5efeca299c6e5b0d98ea6edafbc 100644
--- a/templates/course.html
+++ b/templates/course.html
@@ -20,7 +20,11 @@
 <div class="row panel-group">
 	<div class="col-xs-12"><div class="panel panel-default">
 		<div class="panel-heading">
+			{% if groupedby == 'semester' %}
+			<h1 class="panel-title">{{g.grouper|semester(long=True)}}</h1>
+			{% else %}
 			<h1 class="panel-title">{{g.grouper}}</h1>
+			{% endif %}
 		</div>
 		<ul class="{% if not ismod() %}courses-list {% endif %}list-group">
 			{% for i in g.list %}