diff --git a/biscuit/apps/chronos/migrations/0010_auto_20190818_0910.py b/biscuit/apps/chronos/migrations/0010_auto_20190818_0910.py
new file mode 100644
index 0000000000000000000000000000000000000000..4b387263b8ab0466decbc59b48f215f23a886a11
--- /dev/null
+++ b/biscuit/apps/chronos/migrations/0010_auto_20190818_0910.py
@@ -0,0 +1,18 @@
+# Generated by Django 2.2.1 on 2019-08-18 07:10
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('timetable', '0009_hint_classes_formatted'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='hintclass',
+            name='class_id',
+            field=models.IntegerField(),
+        ),
+    ]
diff --git a/biscuit/apps/chronos/pdf.py b/biscuit/apps/chronos/pdf.py
index 08f7dc3d0b010c23ee3b02c2d58c4182eebb96f1..4bc3902eac9e9dbd5e399f484ecc190a1656a232 100644
--- a/biscuit/apps/chronos/pdf.py
+++ b/biscuit/apps/chronos/pdf.py
@@ -1,12 +1,12 @@
 import os
 import subprocess
+import inspect # delete this line
 
 from django.template.loader import render_to_string
 
 from schoolapps.settings import BASE_DIR
 from debug.models import register_log_with_filename
 
-
 LOGO_FILENAME = os.path.join(BASE_DIR, "static", "common", "logo.png")
 
 
diff --git a/biscuit/apps/chronos/templates/timetable/latex/hints.tex b/biscuit/apps/chronos/templates/timetable/latex/hints.tex
index 7fc99548ea406d1aa500dbdad485b32cbe2a4323..dcf77041f49e612f5a708bfafbf7cbe1c8fae801 100644
--- a/biscuit/apps/chronos/templates/timetable/latex/hints.tex
+++ b/biscuit/apps/chronos/templates/timetable/latex/hints.tex
@@ -1,6 +1,6 @@
 {% load martortags %}
 {% if hints %}
-\subsection*{Hinweise}
+\subsection*{\hspace{0.7em}Hinweise}
 \vspace{-0.7em}
 \begin{itemize}
     \setlength\itemsep{0.1em}
@@ -12,5 +12,4 @@
 {{ hint.text_as_latex|safe }}
 {% endfor %}
 \end{itemize}
-\vspace{-1em}
 {% endif %}
\ No newline at end of file
diff --git a/biscuit/apps/chronos/templates/timetable/latex/substitutions.tex b/biscuit/apps/chronos/templates/timetable/latex/substitutions.tex
index 48d001e5ae5a9a52ec4b6a2138eaeb5ad7de2350..05c7a1aef7388eeafe1486ba2f49451bf2fbf383 100644
--- a/biscuit/apps/chronos/templates/timetable/latex/substitutions.tex
+++ b/biscuit/apps/chronos/templates/timetable/latex/substitutions.tex
@@ -5,7 +5,7 @@
 \usepackage[ngerman]{babel}
 \usepackage[sfdefault]{cabin}
 \usepackage[utf8]{inputenc}
-\usepackage[a4paper,left=1cm,right=1cm,top=2cm,bottom=2cm,bindingoffset=0mm]{geometry}
+\usepackage[a4paper,left=1cm,right=1cm,top=1.5cm,bottom=1.5cm,bindingoffset=0mm]{geometry}
 
 % Packages
 \usepackage{fancyhdr}
@@ -24,12 +24,12 @@
 
 % Badge box
 \usepackage{tcolorbox}
-\newtcbox{\badge}{nobeforeafter,colframe=green,colback=green,boxrule=0.5pt,arc=4pt,
-boxsep=0pt,left=4pt,right=4pt,top=4pt,bottom=4pt,tcbox raise base,
+\newtcbox{\badge}{nobeforeafter,colframe=green,colback=green,boxrule=0pt,arc=2pt,
+boxsep=0pt,left=4pt,right=4pt,top=2pt,bottom=3pt,tcbox raise base,
 grow to left by=0pt,
 grow to right by=-3pt,
-enlarge top by=3pt,
-enlarge bottom by=3pt,coltext=white}
+enlarge top by=1pt,
+enlarge bottom by=1pt,coltext=white}
 
 % Define colors
 \definecolor{grey}{RGB}{208, 208, 208}
@@ -48,6 +48,7 @@ enlarge bottom by=3pt,coltext=white}
 
 % Define footer
 \lfoot{Katharineum zu Lübeck}
+\cfoot{}
 \rfoot{\small Umsetzung: © 2018--2019 by Computer-AG}
 \rhead{\textbf{
 Vertretungen {{ date|date:"j. F Y, \\K\\W W"}}}\\
@@ -63,7 +64,7 @@ Stand: {% now "j. F Y H:i" %}\\
     {%  include "timetable/latex/hints.tex" %}
 
     {% if header_info.is_box_needed %}
-    \begin{tabular}{p{0.22\linewidth}p{0.73\linewidth}}
+    \begin{tabular}{@{\hspace{-1em}}p{0.22\linewidth}p{0.73\linewidth}}
     {% for row in header_info.rows %}
         \textbf{ {{ row.0 }} } & {{ row.1 }} \\
     {% endfor %}
@@ -74,8 +75,8 @@ Stand: {% now "j. F Y H:i" %}\\
     {% set color_background = 1 %}
     {% set last_classes = "" %}
 
-    \def\arraystretch{1.5}
-    \begin{longtable}{p{20mm}p{8mm}p{32mm}p{25mm}p{30mm}p{45mm}}
+    \def\arraystretch{1.1}
+    \begin{longtable}{p{20mm}p{10mm}p{30mm}p{25mm}p{30mm}p{45mm}}
         \textbf{Klassen} &
         \textbf{Std.} &
         \textbf{Lehrer} &
@@ -125,7 +126,7 @@ Stand: {% now "j. F Y H:i" %}\\
 
         {# Display badge (for cancellations) #}     {# Display notice and new line #}
         {% if sub.badge %}
-        \normalsize\badge{ {{ sub.badge }} }
+        \footnotesize\badge{ {{ sub.badge }} }
         {% endif %} \color{ {{c}}} \large\textit{ {{sub.text|default:""|safe|texify|safe}} } \\
 
     {% endwith %}
diff --git a/biscuit/apps/chronos/templates/timetable/lesson.html b/biscuit/apps/chronos/templates/timetable/lesson.html
index c7a191a07f0427b1ef47f8989a9feadd1cadf2d6..41ba8ea146776666bbeefece918d4c59c8dba085 100644
--- a/biscuit/apps/chronos/templates/timetable/lesson.html
+++ b/biscuit/apps/chronos/templates/timetable/lesson.html
@@ -4,17 +4,24 @@
         {# Every element of the lesson #}
         {% for element_container in col.elements %}
             <div style="
-                    {# Display background color only if no badge exists and it is not the old room #}
+            
+                    {# Display background color only if no badge exists and it is not the old room and there are no holidays #}
                     {% if not element_container.substitution.table.badge %}
                         {% if not element_container.is_old or type != 1 %}
-                            background-color: {{ element_container.element.subject.hex_color }};
+                            {% if not element_container.is_hol %}
+                                background-color: {{ element_container.element.subject.hex_color }};
+                            {% endif %}
                         {% endif %}
                     {% endif %}"
 
                     {# Add CSS class for sub when it's a sub #}
                  class="{% if element_container.substitution %}{% if element_container.substitution.table.is_event %}lesson-with-event{% else %}lesson-with-sub{% endif %}{% endif %}">
                 <p>
-                    {% if element_container.substitution %}
+                    {% if element_container.is_hol %}
+
+                        {# <p><strong>{ element_container.element.holiday_reason }}</strong></p>span class="badge new blue darken-2">Schulfrei</span>#}
+
+                    {% elif element_container.substitution %}
                         {# SUBSTITUTION #}
                         {% if type == 1 and element_container.is_old %}
                             {# When it's the old room, let it empty #}
diff --git a/biscuit/apps/chronos/templates/timetable/myplan.html b/biscuit/apps/chronos/templates/timetable/myplan.html
index c2ae550c914935b62ddd77623a86cbeec67adee0..49385ff63350268bb81d24b31f0671580747e803 100644
--- a/biscuit/apps/chronos/templates/timetable/myplan.html
+++ b/biscuit/apps/chronos/templates/timetable/myplan.html
@@ -34,6 +34,9 @@
                         <div class="card-content">
                     <span class="card-title">
                         {% include "timetable/datepicker.html" %}
+                        {% if holiday %}
+                            <span class="badge new blue center-align holiday-badge">{{ holiday.0 }}</span>
+                        {% endif %}
                     </span>
                         </div>
                     </div>
diff --git a/biscuit/apps/chronos/templates/timetable/plan.html b/biscuit/apps/chronos/templates/timetable/plan.html
index 46c7f6655097cae0818c1f4f3277aca4ec93ebaf..481bdddfb07643b11ac37dfc3da315e3edabecb4 100755
--- a/biscuit/apps/chronos/templates/timetable/plan.html
+++ b/biscuit/apps/chronos/templates/timetable/plan.html
@@ -1,4 +1,5 @@
 {% include 'partials/header.html' %}
+{% load copy_filter %}
 <script type="text/javascript">
     {% if smart %}
         var week = {{ selected_week }};
@@ -118,7 +119,7 @@
     </div>
 
     {% include "timetable/hintsinplan.html" %}
-    
+
     {# show full timetable on tablets, laptops and pcs #}
     <div class="timetable-plan hide-on-small-and-down">
 
@@ -128,25 +129,31 @@
 
             </div>
             {# Show short weekdays on tablets #}
-            {% for short_week_day in short_week_days %}
+            {% for day in short_week_days|deepcopy %}
                 <div class="col s2 hide-on-large-only">
                     <div class="card timetable-title-card">
                         <div class="card-content">
                             <span class="card-title">
-                                {{ short_week_day }}
+                                {{ day.0 }}
                             </span>
+                            {% if day.1 %}
+                                <span class="badge new blue center-align holiday-badge">{{ day.1.0 }}</span>
+                            {% endif %}
                         </div>
                     </div>
                 </div>
             {% endfor %}
             {# Show long weekdays elsewere #}
-            {% for long_week_day in long_week_days %}
+            {% for day in long_week_days|deepcopy %}
                 <div class="col s2 hide-on-med-only">
                     <div class="card timetable-title-card">
                         <div class="card-content">
                             <span class="card-title">
-                                {{ long_week_day.0 }}
+                                {{ day.0.0 }}
                             </span>
+                            {% if day.1 %}
+                                <span class="badge new blue center-align holiday-badge">{{ day.1.0 }}</span>
+                            {% endif %}
                         </div>
                     </div>
                 </div>
@@ -154,7 +161,7 @@
         </div>
 
         {#  Lessons #}
-        {% for row, time in plan %}
+        {% for row, time in plan|deepcopy %}
             <div class="row">
                 <div class="col s2">
                     <div class="card timetable-title-card">
@@ -187,15 +194,15 @@
 
     {# show 5 seperate ones on mobiles #}
     <div class="timetable-plan hide-on-med-and-up">
-        {% for long_week_day in long_week_days %}
+        {% for day in long_week_days|deepcopy %}
             <div class="card timetable-mobile-title-card">
                 <div class="card-content">
                     <span class="card-title">
-                        {{ long_week_day.0 }}
+                        {{ day.0.0 }}
                     </span>
                 </div>
             </div>
-            {% for row, time in plan %}
+            {% for row, time in plan|deepcopy %}
                 <div class="row">
                     <div class="col s4">
                         <div class="card timetable-title-card">
@@ -216,8 +223,8 @@
                         </div>
 
                     </div>
-                    {% for col in row %}
-                        {% if forloop.counter0 == long_week_day.1 %}
+                    {% for col in row|deepcopy %}
+                        {% if forloop.counter0 == day.0.1 %}
                             <div class="col s8">
                                 {# A lesson #}
                                 {% include "timetable/lesson.html" %}
diff --git a/biscuit/apps/chronos/templates/timetable/substitution.html b/biscuit/apps/chronos/templates/timetable/substitution.html
index 715735e71815ce846fb165dacbad59c0eb95e685..ca5983743f6bd98297899fa2bba601e1b14e0a6f 100755
--- a/biscuit/apps/chronos/templates/timetable/substitution.html
+++ b/biscuit/apps/chronos/templates/timetable/substitution.html
@@ -52,7 +52,7 @@
 
     <h5 class="hide-on-small-and-down">{{ date|date:"l, j. F Y" }}</h5>
 
-    <table class="substitutions striped">
+    <table class="substitutions striped responsive-table">
         <thead>
         <tr>
             <th><i class="material-icons">people</i></th>
diff --git a/biscuit/apps/chronos/urls.py b/biscuit/apps/chronos/urls.py
index bf1757b108ba16e62722a904d4612819175ec13e..1a8f979a2854425a642fe53b460ef7db7dd60d99 100755
--- a/biscuit/apps/chronos/urls.py
+++ b/biscuit/apps/chronos/urls.py
@@ -23,8 +23,8 @@ try:
         path('substitutions/', views.substitutions, name='timetable_substitutions'),
         path('substitutions/<int:year>/<int:month>/<int:day>/', views.substitutions,
              name='timetable_substitutions_date'),
-        path('class.pdf', views.sub_pdf, name="timetable_substitutions_pdf"),
-        path('<str:plan_date>-class.pdf', views.sub_pdf, name="timetable_substitutions_pdf_date")
+        path('aktuell.pdf', views.sub_pdf, name="timetable_substitutions_pdf"),
+        path('<str:plan_date>-aktuell.pdf', views.sub_pdf, name="timetable_substitutions_pdf_date")
     ]
 
 except (Terms.DoesNotExist, Schoolyear.DoesNotExist, ProgrammingError, OperationalError):
@@ -46,5 +46,5 @@ except (Terms.DoesNotExist, Schoolyear.DoesNotExist, ProgrammingError, Operation
         path('substitutions/', fallback_view.fallback, name='timetable_substitutions'),
         path('substitutions/<int:year>/<int:month>/<int:day>/', fallback_view.fallback,
              name='timetable_substitutions_date'),
-        path('class.pdf', fallback_view.fallback, name="timetable_substitutions_pdf")
+        path('aktuell.pdf', fallback_view.fallback, name="timetable_substitutions_pdf")
     ]
diff --git a/biscuit/apps/chronos/views.py b/biscuit/apps/chronos/views.py
index 221a42e39c8316dc5dbecf00f25bd398462cced9..24593d83b1382d8fbf22f48443966f6ad8578bc9 100755
--- a/biscuit/apps/chronos/views.py
+++ b/biscuit/apps/chronos/views.py
@@ -2,6 +2,7 @@ import datetime
 import os
 import time
 import traceback
+from typing import List
 
 from PyPDF2 import PdfFileMerger
 from django.contrib.auth.decorators import login_required, permission_required
@@ -20,7 +21,7 @@ from timetable.hints import get_all_hints_by_time_period, get_all_hints_by_class
 from timetable.pdf import generate_class_tex, generate_pdf
 
 from untisconnect.plan import get_plan, TYPE_TEACHER, TYPE_CLASS, TYPE_ROOM, parse_lesson_times
-from untisconnect.sub import get_substitutions_by_date, generate_sub_table, get_header_information
+from untisconnect.sub import get_substitutions_by_date, generate_sub_table, get_header_information, SubRow
 from untisconnect.api import *
 from untisconnect.events import get_all_events_by_date
 from userinformation import UserInformation
@@ -129,9 +130,7 @@ def quicklaunch(request):
 @login_required
 @permission_required("timetable.show_plan")
 @cache_page(PLAN_VIEW_CACHE.expiration_time)
-def plan(request, plan_type, plan_id, regular="", year=timezone.datetime.now().year,
-         calendar_week=timezone.datetime.now().isocalendar()[1]):
-    start = time.time()
+def plan(request, plan_type, plan_id, regular="", year=None, calendar_week=None):
     """
     [DJANGO VIEW]
     Show a timetable (class, teacher, room, smart/regular)
@@ -143,6 +142,10 @@ def plan(request, plan_type, plan_id, regular="", year=timezone.datetime.now().y
     :param calendar_week: calendar week in year (only for smart plan)
     :return:
     """
+    if year is None or calendar_week is None:
+        date = get_next_weekday_with_time(timezone.datetime.now(), timezone.datetime.now().time())
+        year = date.year
+        calendar_week = date.isocalendar()[1]
 
     # Regular or smart plan?
     if regular == "regular":
@@ -185,7 +188,7 @@ def plan(request, plan_type, plan_id, regular="", year=timezone.datetime.now().y
         raise Http404('Plan not found.')
 
     # Get plan
-    plan = get_plan(_type, plan_id, smart=smart, monday_of_week=monday_of_week)
+    plan, holidays = get_plan(_type, plan_id, smart=smart, monday_of_week=monday_of_week)
 
     context = {
         "smart": smart,
@@ -198,14 +201,14 @@ def plan(request, plan_type, plan_id, regular="", year=timezone.datetime.now().y
         "weeks": get_calendar_weeks(year=year),
         "selected_week": calendar_week,
         "selected_year": year,
-        "short_week_days": SHORT_WEEK_DAYS,
-        "long_week_days": LONG_WEEK_DAYS,
+        "short_week_days": zip(SHORT_WEEK_DAYS, holidays),
+        "long_week_days": zip(LONG_WEEK_DAYS, holidays),
+        "holidays": holidays,
         "hints": hints,
         "hints_b": hints_b,
         "hints_b_mode": "week",
     }
-    stop = time.time()
-    print("TIME", stop - start)
+
     return render(request, 'timetable/plan.html', context)
 
 
@@ -261,7 +264,11 @@ def my_plan(request, year=None, month=None, day=None):
         return redirect("timetable_admin_all")
 
     # Get plan
-    plan = get_plan(_type, plan_id, smart=True, monday_of_week=monday_of_week)
+    plan, holidays = get_plan(_type, plan_id, smart=True, monday_of_week=monday_of_week)
+    # print(parse_lesson_times())
+
+    holiday_for_the_day = holidays[date.isoweekday() - 1]
+    # print(holiday_for_the_day)
 
     context = {
         "type": _type,
@@ -274,6 +281,7 @@ def my_plan(request, year=None, month=None, day=None):
         "date": date,
         "date_js": int(date.timestamp()) * 1000,
         "display_date_only": True,
+        "holiday": holiday_for_the_day,
         "hints": hints,
         "hints_b": hints_b,
         "hints_b_mode": "day",
@@ -300,6 +308,55 @@ def get_next_weekday_with_time(date, time):
 # SUBSTITUTIONS #
 #################
 
+# TODO: Move to own helper file later
+def equal(sub_row_1: SubRow, sub_row_2: SubRow) -> bool:
+    """
+    Checks the equality of two sub rows
+
+    :param sub_row_1: SubRow 1
+    :param sub_row_2: SubRow 2
+    :return: Equality
+    """
+    return sub_row_1.classes == sub_row_2.classes and sub_row_1.sub and sub_row_2.sub and \
+           sub_row_1.sub.teacher_old == sub_row_2.sub.teacher_old and \
+           sub_row_1.sub.teacher_new == sub_row_2.sub.teacher_new and \
+           sub_row_1.sub.subject_old == sub_row_2.sub.subject_old and \
+           sub_row_1.sub.subject_new == sub_row_2.sub.subject_new and \
+           sub_row_1.sub.room_old == sub_row_2.sub.room_old and \
+           sub_row_1.sub.room_new == sub_row_2.sub.room_new and \
+           sub_row_1.sub.text == sub_row_2.sub.text
+
+
+def merge_sub_rows(sub_table: List[SubRow]) -> List[SubRow]:
+    """
+    Merge equal sub rows with different lesson numbers to one
+
+    :param sub_table:
+    :return:
+    """
+    new_sub_table = []
+    i = 0
+    while i < len(sub_table) - 1:
+        j = 1
+
+        while equal(sub_table[i], sub_table[i + j]):
+            j += 1
+            if i + j > len(sub_table) - 1:
+                break
+        if j > 1:
+            new_sub_row = sub_table[i]
+            new_sub_row.lesson = sub_table[i].lesson + '-' + sub_table[i + j - 1].lesson
+            new_sub_table.append(new_sub_row)
+        else:
+            new_sub_table.append(sub_table[i])
+            # get last item
+            if i == len(sub_table) - 2:
+                new_sub_table.append(sub_table[i + 1])
+                break
+        i += j
+    return new_sub_table
+
+
 def sub_pdf(request, plan_date=None):
     """Show substitutions as PDF for the next weekday (specially for monitors)"""
 
@@ -323,6 +380,7 @@ def sub_pdf(request, plan_date=None):
         subs = get_substitutions_by_date(date)
 
         sub_table = generate_sub_table(subs, events)
+        sub_table = merge_sub_rows(sub_table)
 
         # Get header information and hints
         header_info = get_header_information(subs, date, events)
@@ -334,18 +392,18 @@ def sub_pdf(request, plan_date=None):
         tex = generate_class_tex(sub_table, date, header_info, hints)
 
         # Generate PDF
-        generate_pdf(tex, "class{}".format(i))
+        generate_pdf(tex, "aktuell{}".format(i))
 
     # Merge PDFs
     try:
         merger = PdfFileMerger()
-        class0 = open(os.path.join(BASE_DIR, "latex", "class0.pdf"), "rb")
-        class1 = open(os.path.join(BASE_DIR, "latex", "class1.pdf"), "rb")
+        class0 = open(os.path.join(BASE_DIR, "latex", "aktuell0.pdf"), "rb")
+        class1 = open(os.path.join(BASE_DIR, "latex", "aktuell1.pdf"), "rb")
         merger.append(fileobj=class0)
         merger.append(fileobj=class1)
 
-        # Write merged PDF to class.pdf
-        output = open(os.path.join(BASE_DIR, "latex", "class.pdf"), "wb")
+        # Write merged PDF to aktuell.pdf
+        output = open(os.path.join(BASE_DIR, "latex", "aktuell.pdf"), "wb")
         merger.write(output)
         output.close()
 
@@ -356,7 +414,7 @@ def sub_pdf(request, plan_date=None):
         register_traceback("merge_class", "pypdf2")
 
     # Read and response PDF
-    file = open(os.path.join(BASE_DIR, "latex", "class.pdf"), "rb")
+    file = open(os.path.join(BASE_DIR, "latex", "aktuell.pdf"), "rb")
     return FileResponse(file, content_type="application/pdf")
 
 
@@ -384,6 +442,9 @@ def substitutions(request, year=None, month=None, day=None):
 
     sub_table = generate_sub_table(subs, events)
 
+    # Merge Subs
+    sub_table = merge_sub_rows(sub_table)
+
     # Get header information and hints
     header_info = get_header_information(subs, date, events)
     hints = list(get_all_hints_by_time_period(date, date))