diff --git a/models/database.py b/models/database.py
index 9c511e3df9dad627138e1a06d9d7a450bc4623dd..87b9f1d20eb7a998073ae8c591f0494c088636fe 100644
--- a/models/database.py
+++ b/models/database.py
@@ -210,6 +210,8 @@ class Todo(db.Model):
 
     def get_state(self):
         return "[Erledigt]" if self.done else "[Offen]"
+    def get_state_tex(self):
+        return "Erledigt" if self.done else "Aktiv"
 
     def render_html(self):
         parts = [
diff --git a/parser.py b/parser.py
index f5cf680349e3bfd4c66ff761c63f25f140c3408b..57424eb2216e356013ddea1eed5e4724ee752f74 100644
--- a/parser.py
+++ b/parser.py
@@ -2,6 +2,8 @@ import regex as re
 import sys
 from collections import OrderedDict
 
+from shared import escape_tex
+
 class ParserException(Exception):
     name = "Parser Exception"
     has_explanation = False
@@ -143,7 +145,7 @@ class Text:
         self.linenumber = linenumber
 
     def render(self):
-        return self.text
+        return escape_tex(self.text)
 
     def dump(self, level=None):
         if level is None:
@@ -169,7 +171,10 @@ class Tag:
         self.linenumber = linenumber
 
     def render(self):
-        return r"\textbf{{{}:}} {}".format(self.name, "; ".join(self.values));
+        if self.name == "url":
+            return r"\url{{{}}}".format(self.values[0])
+        #return r"\textbf{{{}:}} {}".format(escape_tex(self.name.capitalize()), "; ".join(map(escape_tex, self.values)));
+        return r"\textbf{{{}:}} {}".format(escape_tex(self.name.capitalize()), escape_tex(self.values[0]))
 
     def dump(self, level=None):
         if level is None:
@@ -255,8 +260,8 @@ class Fork(Element):
         for child in self.children:
             child.dump(level + 1)
 
-    def render(self):
-        return ((self.name if self.name is not None and len(self.name) > 0 else "")
+    def render(self, toplevel=False):
+        return ((self.name if self.name is not None and len(self.name) > 0 and not toplevel else "")
             + r"\begin{itemize}" + "\n"
             + "\n".join(map(lambda e: r"\item {}".format(e.render()), self.children)) + "\n"
             + r"\end{itemize}" + "\n")
diff --git a/shared.py b/shared.py
index 9db6902009e882d6a34adeb44e86cf39af617b3f..a54521eee1ae8eca6e2cce0effb93acb096db4aa 100644
--- a/shared.py
+++ b/shared.py
@@ -72,6 +72,9 @@ def date_filter_long(date):
 def time_filter(time):
     return time.strftime("%H:%m")
 
+def class_filter(obj):
+    return obj.__class__.__name__
+
 from auth import LdapManager, SecurityManager
 ldap_manager = LdapManager(config.LDAP_PROVIDER_URL, config.LDAP_BASE)
 security_manager = SecurityManager(config.SECURITY_KEY)
diff --git a/static/tex/protokoll2.cls b/static/tex/protokoll2.cls
index d12c78fbbf96ed21fcc7a9a317cf8881905dbc24..d5f32ea6c16a33f5489f374f84696ea77bb30260 100644
--- a/static/tex/protokoll2.cls
+++ b/static/tex/protokoll2.cls
@@ -14,15 +14,34 @@
 \LoadClass[a4paper]{article}
 
 % so ein paar sachen die wir eh immer brauchen
-\RequirePackage{ngerman}
-\RequirePackage[T1]{fontenc}
-\RequirePackage[utf8]{inputenc}
+%\RequirePackage[T1]{fontenc}
+%\RequirePackage{ngerman}
+\RequirePackage[ngerman]{babel}
+%\RequirePackage[utf8]{inputenc}
 \RequirePackage[vmargin=1.5cm,hmargin={1.5cm,1.2cm},bindingoffset=8mm]{geometry}
 %\RequirePackage{lineno}
 \RequirePackage{longtable}
 \RequirePackage{framed}
 \RequirePackage{eurosym}
-\RequirePackage{csquotes}
+\RequirePackage[babel]{csquotes}
+%\RequirePackage{fontspec}
+\RequirePackage{polyglossia}
+
+\setmainlanguage[babelshorthands=true]{german}
+
+\RequirePackage{fontspec}
+%\setromanfont[Scale=0.925]{DejaVu Serif}
+%\setsansfont[Scale=0.925]{DejaVu Sans}
+%\setmonofont[Scale=0.925]{DejaVu Sans Mono}
+%\setmainfont[Scale=0.925]{DejaVu Sans}
+\setromanfont{Nimbus Roman}
+\setsansfont{Nimbus Sans}
+\setmonofont{Nimbus Mono PS}
+\setmainfont[
+    BoldFont={NimbusSans},
+    ItalicFont={NimbusSans},
+    BoldItalicFont={NimbusSans}
+]{Nimbus Sans} % TODO: make configurable
 
 
 % nicht einr�cken und benutzerinnendefinierte kopfzeile
@@ -30,8 +49,8 @@
 \setlength{\parskip}{1ex}
 \pagestyle{myheadings}
 
-\renewcommand*{\rmdefault}{phv}
-\renewcommand*{\sfdefault}{phv}
+%\renewcommand*{\rmdefault}{phv}
+%\renewcommand*{\sfdefault}{phv}
 
 % Titel
 \newcommand{\Kopf}[1]{\markboth{#1}{#1}}
diff --git a/tasks.py b/tasks.py
index 52dfac1112bd4bc42264a99392b0f2f55a14ee70..eb30dba5839e4079ae367327562d57fc54991fd8 100644
--- a/tasks.py
+++ b/tasks.py
@@ -7,7 +7,7 @@ import tempfile
 
 from models.database import Document, Protocol, Error, Todo, Decision, TOP, DefaultTOP
 from server import celery, app
-from shared import db, escape_tex, unhyphen, date_filter, datetime_filter, date_filter_long, time_filter
+from shared import db, escape_tex, unhyphen, date_filter, datetime_filter, date_filter_long, time_filter, class_filter
 from utils import mail_manager, url_manager, encode_kwargs, decode_kwargs
 from parser import parse, ParserException, Element, Content, Text, Tag, Remark, Fork
 
@@ -29,6 +29,7 @@ texenv.filters["datify"] = date_filter
 texenv.filters["datify_long"] = date_filter_long
 texenv.filters["datetimify"] = datetime_filter
 texenv.filters["timify"] = time_filter
+texenv.filters["class"] = class_filter
 
 mailenv = app.create_jinja_environment()
 mailenv.trim_blocks = True
@@ -177,7 +178,7 @@ def compile_async(content, protocol_id):
         try:
             current = os.getcwd()
             protocol_source_filename = "protocol.tex"
-            protocol_target_filename = "protocol.tex"
+            protocol_target_filename = "protocol.pdf"
             log_filename = "protocol.log"
             with open(os.path.join(compile_dir, protocol_source_filename), "w") as source_file:
                 source_file.write(content)
@@ -192,6 +193,9 @@ def compile_async(content, protocol_id):
             subprocess.check_call(command, universal_newlines=True, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
             subprocess.check_call(command, universal_newlines=True, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
             os.chdir(current)
+            for old_document in [document for document in protocol.documents if document.is_compiled]:
+                protocol.documents.remove(old_document)
+            db.session.commit()
             document = Document(protocol.id, name="protokoll_{}_{}.pdf".format(protocol.protocoltype.short_name, date_filter(protocol.date)), filename="", is_compiled=True)
             db.session.add(document)
             db.session.commit()
@@ -199,6 +203,7 @@ def compile_async(content, protocol_id):
             document.filename = target_filename
             shutil.copy(os.path.join(compile_dir, protocol_target_filename), os.path.join("documents", target_filename))
             db.session.commit()
+            shutil.copy(os.path.join(compile_dir, log_filename), "/tmp")
         except subprocess.SubprocessError:
             log = ""
             total_log_filename = os.path.join(compile_dir, log_filename)
diff --git a/templates/protocol.tex b/templates/protocol.tex
index 1bf29fd5e8cd2c4ac5df68a13ad1461a8138205b..17f4236dc8b774798744d140d331641e70834252 100644
--- a/templates/protocol.tex
+++ b/templates/protocol.tex
@@ -4,9 +4,9 @@
 %\usepackage{palatino}
 \usepackage{pdfpages}
 \usepackage{eurosym}
-\usepackage[utf8]{inputenc}
+%\usepackage[utf8]{inputenc}
 \usepackage[pdfborder={0 0 0}]{hyperref}
-\usepackage{ngerman}
+%\usepackage{ngerman}
 % \usepackage[left]{lineno}
 %\usepackage{footnote}
 %\usepackage{times}
@@ -15,17 +15,18 @@
 %\renewcommand{\familydefault}{\sfdefault}
 \newcommand{\einrueck}[1]{\hfill\begin{minipage}{0.95\linewidth}#1\end{minipage}}
 
+
 \begin{document}
 %\thispagestyle{plain}   %ggf kommentarzeichen entfernen
 \Titel{
 \large Protokoll: \VAR{protocol.protocoltype.name|escape_tex}
 \\\normalsize \VAR{protocol.protocoltype.organization|escape_tex}
 }{}
-\begin{tabular}{rp{15.5cm}}
+\begin{tabular}{rp{14cm}}
 {\bf Datum:} & \VAR{protocol.date|datify_long|escape_tex}\\
 {\bf Ort:} & \VAR{protocol.location|escape_tex}\\
 {\bf Protokollant:} & \VAR{protocol.author|escape_tex}\\
-{\bf Anwesend:} & \VAR{protocol.participants|join(", ")|escape_tex}\\
+{\bf Anwesend:} & \VAR{protocol.participants|escape_tex}\\
 \end{tabular}
 \normalsize
 
@@ -43,8 +44,20 @@
 Beginn der Sitzung: \VAR{protocol.start_time|timify}
 
 \ENV{for top in tree.children}
-    \TOP{\VAR{top.name|escape_tex}} % here we probably have information doubly
-    \VAR{top.render()|escape_tex}
+    \ENV{if top|class == "Fork"}
+        \TOP{\VAR{top.name|escape_tex}} % here we probably have information doubly
+        \ENV{if top.name == "Todos"}
+            \ENV{if protocol.todos|length > 0}
+                \begin{itemize}
+                    \ENV{for todo in protocol.todos}
+                        \item \VAR{todo.who}: \VAR{todo.description} -- \VAR{todo.get_state_tex()}
+                    \ENV{endfor}
+                \end{itemize}
+            \ENV{endif}
+        \ENV{else}
+            \VAR{top.render(toplevel=True)}
+        \ENV{endif}
+    \ENV{endif}
 \ENV{endfor}
 
 Ende der Sitzung: \VAR{protocol.end_time|timify}