diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..c9a6fd37ea168680978ecc71b7b181c1fffe224e
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,52 @@
+# Byte-compiled / optimized / DLL files
+__pycache__/
+*.py[cod]
+*$py.class
+
+# Distribution / packaging
+.Python
+build/
+develop-eggs/
+dist/
+downloads/
+eggs/
+.eggs/
+lib/
+lib64/
+parts/
+sdist/
+var/
+wheels/
+*.egg-info/
+.installed.cfg
+*.egg
+
+# Installer logs
+pip-log.txt
+pip-delete-this-directory.txt
+
+# Translations
+*.mo
+*.pot
+
+# Django stuff:
+*.log
+local_settings.py
+
+# pyenv
+.python-version
+
+# Environments
+.env
+.venv
+env/
+venv/
+ENV/
+
+# Editors
+*~
+DEADJOE
+\#*#
+
+# Database
+db.sqlite3
diff --git a/biscuit/apps/chronos/models.py b/biscuit/apps/chronos/models.py
index 3b27ed81a79dafb02241f1588901eb3836eb7296..b11824974a37a6fdac121cd946acbfd9d65391ae 100644
--- a/biscuit/apps/chronos/models.py
+++ b/biscuit/apps/chronos/models.py
@@ -24,6 +24,14 @@ class TimePeriod(models.Model):
     def __str__(self):
         return '%s, %d. period (%s - %s)' % (self.weekday, self.period, self.time_start, self.time_end)
 
+    @classmethod
+    def get_times_dict(cls):
+        periods = {}
+        for period in cls.objects.all():
+            periods[period.period] = (period.time_start, period.time_end)
+
+        return periods
+
 
 class Subject(models.Model):
     abbrev = models.CharField(verbose_name=_(
diff --git a/biscuit/apps/chronos/templates/chronos/tt_day.html b/biscuit/apps/chronos/templates/chronos/tt_day.html
new file mode 100644
index 0000000000000000000000000000000000000000..97aea6a0c71e2cf25aaeee8e6d4963f5c34fabe2
--- /dev/null
+++ b/biscuit/apps/chronos/templates/chronos/tt_day.html
@@ -0,0 +1,16 @@
+<div class="col-sm">
+ <ul class="list-group">
+  <li class="list-group-item active">
+   {{ lesson_periods.0.period.get_weekday_display }}
+  </li>
+ </ul>
+ <div class="container">
+  {% for lesson_period in lesson_periods %}
+   <div class="row">
+    <div class="col-sm">
+     {% include "chronos/tt_lesson.html" with lesson_period=lesson_period %}
+    </div>
+   </div>
+  {% endfor %}
+ </div>
+</div>
diff --git a/biscuit/apps/chronos/templates/chronos/tt_lesson.html b/biscuit/apps/chronos/templates/chronos/tt_lesson.html
new file mode 100644
index 0000000000000000000000000000000000000000..bd58b5cb110e50274c54eca82b63a2f0ca5073d2
--- /dev/null
+++ b/biscuit/apps/chronos/templates/chronos/tt_lesson.html
@@ -0,0 +1,32 @@
+<div class="card chronos-lesson"
+ style="
+  {% if lesson_period.lesson.subject.colour_fg %}
+   color: {{ lesson_period.lesson.subject.colour_fg }};
+  {% endif %}
+  {% if lesson_period.lesson.subject.colour_bg %}
+   background-color: {{ lesson_period.lesson.subject.colour_bg }};
+  {% endif %}
+ ">
+ <div class="card-body">
+  <div class="row">
+   <div class="col-sm">
+    <span class="card-title">{{ lesson_period.lesson.subject.abbrev }}</span>
+   </div>
+  </div>
+  <div class="row">
+   <div class="col-sm">
+    {% for group in lesson_period.lesson.groups.all %}
+     <span class="card-text">{{ group.short_name }}</span>
+    {% endfor %}
+   </div>
+   <div class="col-sm">
+    {% for teacher in lesson_period.lesson.teachers.all %}
+     <span class="card-text">{{ teacher.short_name }}</span>
+    {% endfor %}
+   </div>
+   <div class="col-sm">
+    <span class="card-text">{{ lesson_period.room.short_name }}</span>
+   </div>
+  </div>
+ </div>
+</div>
diff --git a/biscuit/apps/chronos/templates/chronos/tt_week.html b/biscuit/apps/chronos/templates/chronos/tt_week.html
new file mode 100644
index 0000000000000000000000000000000000000000..dc9052adcace27643e2f5927e82e7cc2b6bec5cd
--- /dev/null
+++ b/biscuit/apps/chronos/templates/chronos/tt_week.html
@@ -0,0 +1,54 @@
+{# -*- engine:django -*- #}
+{% extends "core/base.html" %}
+{% load bootstrap4 i18n %}
+
+{% block page_title %}Timetable{% endblock %}
+
+{% block content %}
+ <p>
+  {{ filter_descs }}
+ </p>
+
+ <div class="row">
+  <div class="col-sm">
+   <ul class="list-group">
+    <li class="list-group-item active">
+     {% blocktrans %}Times{% endblocktrans %}
+    </li>
+   </ul>
+   <div class="container">
+    {% for num, times in periods.items %}
+     <div class="row">
+      <div class="col-sm">
+       <div class="card chronos-lesson">
+        <div class="card-body">
+         <div class="row">
+          <div class="col-sm">
+           <span class="card-title">{{ num }}.</span>
+          </div>
+         </div>
+         <div class="row">
+          <div class="col-sm">
+           <span class="card-text">{{ times.0}}</span>
+          </div>
+          <div class="col-sm">
+           <span class="card-text">-</span>
+          </div>
+          <div class="col-sm">
+           <span class="card-text">{{ times.1 }}</span>
+          </div>
+         </div>
+        </div>
+       </div>
+      </div>
+     </div>
+    {% endfor %}
+   </div>
+  </div>
+ 
+  {% for weekday, lesson_periods_day in lesson_periods.items %}
+   {% include "chronos/tt_day.html" with lesson_periods=lesson_periods_day %}
+  {% endfor %}
+ </div>
+{% endblock %}
+ 
\ No newline at end of file
diff --git a/biscuit/apps/chronos/views.py b/biscuit/apps/chronos/views.py
index 43e81eb33ba9a50fbb52c3636abe63c6a3e50967..776f7e923da39883ccb496588cd5e8d99626a8f0 100644
--- a/biscuit/apps/chronos/views.py
+++ b/biscuit/apps/chronos/views.py
@@ -1,9 +1,47 @@
+from collections import OrderedDict
+
 from django.contrib.auth.decorators import login_required
+from django.shortcuts import render
+from django.utils.translation import gettext_lazy as _
 
+from biscuit.apps.cambro.models import Room
 from biscuit.core.decorators import admin_required
+from biscuit.core.models import Group, Person
+
+from .models import LessonPeriod, TimePeriod
 
 
 @login_required
 @admin_required
 def timetable(request):
-    pass
+    context = {}
+
+    lesson_periods = LessonPeriod.objects.all()
+    filter_descs = []
+
+    if 'group' in request.GET:
+        lesson_periods = lesson_periods.filter(
+            lesson__groups__pk__contains=int(request.GET['group']))
+        filter_descs.append(_('Group: %s') % Group.objects.get(
+            pk=int(request.GET['group'])).name)
+    if 'teacher' in request.GET:
+        lesson_periods = lesson_periods.filter(
+            lesson__teachers__pk__contains=int(request.GET['teacher']))
+        filter_descs.append(_('Teacher: %s') % Person.objects.get(
+            pk=int(request.GET['teacher'])).name)
+    if 'room' in request.GET:
+        lesson_periods = lesson_periods.filter(
+            room__pk=int(request.GET['room']))
+        filter_descs.append(_('Room: %s') % Room.objects.get(
+            pk=int(request.GET['room'])).name)
+
+    per_day = {}
+    for lesson_period in lesson_periods:
+        per_day.setdefault(lesson_period.period.weekday,
+                           []).append(lesson_period)
+
+    context['lesson_periods'] = OrderedDict(sorted(per_day.items()))
+    context['filter_descs'] = ', '.join(filter_descs)
+    context['periods'] = TimePeriod.get_times_dict()
+
+    return render(request, 'chronos/tt_week.html', context)