diff --git a/templates/timetable.html b/templates/timetable.html
index 319e322d1ca3b7d5ffe25773c80429e85ce379f6..5fb7badae82e2c3b12569ecb4270633d2c9d8565 100644
--- a/templates/timetable.html
+++ b/templates/timetable.html
@@ -19,18 +19,24 @@
 				<tr><th style="width: 30px;"></th>{% for d in days if (d.index < 5) or (d.lectures|length) > 0 %}<th style="min-width: 10em;" colspan="{{d.maxcol}}">{{ d.date.strftime("%A (%d.%m.%Y)") }}</th>{% endfor %}</tr>
 				{# iterating over each 15 min block #}
 				{% for t in times %}
-					{% set time_loop = loop %}
+					{% set time_index = loop.index %}
 					<tr height="12px" {% if t.strftime("%M") == "00" %} class="hourlytime" {% endif %}>
 						{# display time in first row if its a full hour #}
-						{% if ((loop.index - 1) is divisibleby 4)  %} <td rowspan="4" style="vertical-align: top;">{{ t.strftime("%H:%M") }}</td> {% endif %}
+						{% if ((time_index - 1) is divisibleby 4)  %} <td rowspan="4" style="vertical-align: top;">{{ t.strftime("%H:%M") }}</td> {% endif %}
 						{# iterate over days if if it is a working day or we have lectures on that day (optionaly skip weekends) #}
 						{% for d in days  if (d.index < 5) or (d.lectures|length) > 0 %}
 							{% for col in range(1,d.maxcol+1) %}
 
 								{# iterate over all lextures but only consider those that are in the current column and happen in the 15 min block #}
-								{% for l in d.lectures|selectattr('timetable_col','equalto',col) if (((l.time.time() > t) and (l.time.time() < times[time_loop.index+1])) != (l.time.time() == t ) ) %}
+								{# time_index starts at 0 so we use it directly and do not do +1 #}
+								{% for l in d.lectures|selectattr('timetable_col','equalto',col) if ((l.time.time() >= t) and (l.time.time() < times[time_index])) %}
 									{# handle the first column of a day specialy, set red background if hidden #}
-									<td {% if col == 1 %} class="newday"{% endif %} rowspan="{{ (l.duration / 15)|round(method="ceil") }}" style="background: {% if l.visible and l.course.visible %}lightgrey;{% else %}#f2dede{% endif %}">
+									<td
+										{% if col == 1 %} class="newday"{% endif %}
+										{# we have to take into account that we might have rounded the start to 15-min intervalls #}
+										rowspan="{{ ( (l.duration + ( ((t.minute + t.hour*60) - (l.time.time().minute + l.time.time().hour *60 )) |abs ) ) / 15)|round(method="ceil")|int }}"
+										style="background: {% if l.visible and l.course.visible %}lightgrey;{% else %}#f2dede{% endif %}"
+									>
 										{# print the lecture block #}
 										<p class="small">
 											<strong>
@@ -49,7 +55,7 @@
 									{% for l in d.lectures|selectattr('timetable_col','equalto',col) if (l.time.time() < t) and (l.time_end.time() > t) %}
 										{# this part is covered by another lecture using rowspan #}
 									{% else %}
-										{# no lecture right now, jsut end column #}
+										{# no lecture right now, just end column #}
 										<td {% if col == 1 %} class="newday"{% endif %}></td>
 									{% endfor %}
 								{% endfor %}