diff --git a/seminar/templates/seminar/treenode.html b/seminar/templates/seminar/treenode.html
new file mode 100644
index 00000000..0fd734ef
--- /dev/null
+++ b/seminar/templates/seminar/treenode.html
@@ -0,0 +1,10 @@
+{% extends "seminar/archiv/base_ulohy.html" %}
+
+{% load comments %}
+
+{% block content %}
+
+{%with obj=tnldata depth=1 template_name="seminar/treenode_recursive.html" %}
+ {%include template_name%}
+{%endwith%}
+{% endblock content %}
diff --git a/seminar/templates/seminar/treenode_recursive.html b/seminar/templates/seminar/treenode_recursive.html
new file mode 100644
index 00000000..0cf37d9a
--- /dev/null
+++ b/seminar/templates/seminar/treenode_recursive.html
@@ -0,0 +1,28 @@
+{% load treenodes %}
+{# {{depth}} #}
+
+{% if obj.node|isRocnik %}
+
Ročník {{obj.node.rocnik}}
+{% elif obj.node|isCislo %}
+
Číslo {{obj.node.cislo}}
+{% elif obj.node|isTemaVCisle %}
+
Téma {{obj.node.tema.nazev}}
+{% elif obj.node|isUlohaZadani %}
+
Úloha {{obj.node.uloha.kod_v_rocniku}} ({{obj.node.uloha.max_body}} b)
+{% elif obj.node|isUlohaVzorak %}
+
Řešení: {{obj.node.uloha.kod_v_rocniku}}
+{% elif obj.node|isText %}
+{{obj.node.text.na_web}}
+{% else %}
+Objekt jiného typu {{obj.node}}
+{% endif %}
+ {%if obj.children %}
+
+ {%for ch in obj.children %}
+ {%with obj=ch depth=depth|add:"1" template_name="seminar/treenode_recursive.html" %}
+ {%include template_name%}
+ {%endwith%}
+ {%endfor%}
+
+ {%endif%}
+
diff --git a/seminar/templatetags/treenodes.py b/seminar/templatetags/treenodes.py
new file mode 100644
index 00000000..0d60765e
--- /dev/null
+++ b/seminar/templatetags/treenodes.py
@@ -0,0 +1,49 @@
+from django import template
+import seminar.models as m
+
+register = template.Library()
+
+@register.filter
+def isRocnik(value):
+ return isinstance(value, m.RocnikNode)
+
+@register.filter
+def isCislo(value):
+ return isinstance(value, m.CisloNode)
+
+@register.filter
+def isCast(value):
+ return isinstance(value, m.CastNode)
+
+@register.filter
+def isText(value):
+ return isinstance(value, m.TextNode)
+
+@register.filter
+def isTemaVCisle(value):
+ return isinstance(value, m.TemaVCisleNode)
+
+@register.filter
+def isKonfera(value):
+ return isinstance(value, m.KonferaNode)
+
+@register.filter
+def isClanek(value):
+ return isinstance(value, m.ClanekNode)
+
+@register.filter
+def isUlohaVzorak(value):
+ return isinstance(value, m.UlohaVzorakNode)
+
+@register.filter
+def isUlohaZadani(value):
+ return isinstance(value, m.UlohaZadaniNode)
+
+@register.filter
+def isPohadka(value):
+ return isinstance(value, m.PohadkaNode)
+
+#@register.filter
+#def isOtisteneReseniNode(value):
+# return isinstance(value, m.OtisteneReseniNode)
+
diff --git a/seminar/urls.py b/seminar/urls.py
index 1d5348da..002170c4 100644
--- a/seminar/urls.py
+++ b/seminar/urls.py
@@ -25,6 +25,7 @@ urlpatterns = [
path('rocnik/