diff --git a/migrations/versions/310d9ab321b8_.py b/migrations/versions/310d9ab321b8_.py
new file mode 100644
index 0000000000000000000000000000000000000000..1ebf1e1b726413f66fdee5cd862c355cdfa04e3e
--- /dev/null
+++ b/migrations/versions/310d9ab321b8_.py
@@ -0,0 +1,32 @@
+"""empty message
+
+Revision ID: 310d9ab321b8
+Revises: 0131d5776f8d
+Create Date: 2017-02-25 17:26:34.663460
+
+"""
+from alembic import op
+import sqlalchemy as sa
+
+
+# revision identifiers, used by Alembic.
+revision = '310d9ab321b8'
+down_revision = '0131d5776f8d'
+branch_labels = None
+depends_on = None
+
+
+def upgrade():
+    # ### commands auto generated by Alembic - please adjust! ###
+    op.add_column('protocols', sa.Column('plain_text_private', sa.String(), nullable=True))
+    op.add_column('protocols', sa.Column('plain_text_public', sa.String(), nullable=True))
+    op.drop_column('todos', 'is_id_fixed')
+    # ### end Alembic commands ###
+
+
+def downgrade():
+    # ### commands auto generated by Alembic - please adjust! ###
+    op.add_column('todos', sa.Column('is_id_fixed', sa.BOOLEAN(), autoincrement=False, nullable=True))
+    op.drop_column('protocols', 'plain_text_public')
+    op.drop_column('protocols', 'plain_text_private')
+    # ### end Alembic commands ###
diff --git a/migrations/versions/495509e8f49a_.py b/migrations/versions/495509e8f49a_.py
new file mode 100644
index 0000000000000000000000000000000000000000..61fb9dc21c504f31dcab372d02e6e8b9c0d88d3f
--- /dev/null
+++ b/migrations/versions/495509e8f49a_.py
@@ -0,0 +1,34 @@
+"""empty message
+
+Revision ID: 495509e8f49a
+Revises: 310d9ab321b8
+Create Date: 2017-02-25 17:34:03.830014
+
+"""
+from alembic import op
+import sqlalchemy as sa
+
+
+# revision identifiers, used by Alembic.
+revision = '495509e8f49a'
+down_revision = '310d9ab321b8'
+branch_labels = None
+depends_on = None
+
+
+def upgrade():
+    # ### commands auto generated by Alembic - please adjust! ###
+    op.add_column('protocols', sa.Column('content_private', sa.String(), nullable=True))
+    op.add_column('protocols', sa.Column('content_public', sa.String(), nullable=True))
+    op.drop_column('protocols', 'plain_text_private')
+    op.drop_column('protocols', 'plain_text_public')
+    # ### end Alembic commands ###
+
+
+def downgrade():
+    # ### commands auto generated by Alembic - please adjust! ###
+    op.add_column('protocols', sa.Column('plain_text_public', sa.VARCHAR(), autoincrement=False, nullable=True))
+    op.add_column('protocols', sa.Column('plain_text_private', sa.VARCHAR(), autoincrement=False, nullable=True))
+    op.drop_column('protocols', 'content_public')
+    op.drop_column('protocols', 'content_private')
+    # ### end Alembic commands ###
diff --git a/models/database.py b/models/database.py
index 75fbf0feaddd701c7c902e767da7a2a7163027ef..bb0aa02cbe5a0af284c81077f0f75fef1f0dbc9d 100644
--- a/models/database.py
+++ b/models/database.py
@@ -93,7 +93,9 @@ class Protocol(db.Model):
     __tablename__ = "protocols"
     id = db.Column(db.Integer, primary_key=True)
     protocoltype_id = db.Column(db.Integer, db.ForeignKey("protocoltypes.id"))
-    source = db.Column(db.String, nullable=True)
+    source = db.Column(db.String)
+    content_public = db.Column(db.String)
+    content_private = db.Column(db.String)
     date = db.Column(db.Date)
     start_time = db.Column(db.Time)
     end_time = db.Column(db.Time)
@@ -107,10 +109,12 @@ class Protocol(db.Model):
     documents = relationship("Document", backref=backref("protocol"), cascade="all, delete-orphan", order_by="Document.is_compiled")
     errors = relationship("Error", backref=backref("protocol"), cascade="all, delete-orphan", order_by="Error.id")
 
-    def __init__(self, protocoltype_id, date, source=None, start_time=None, end_time=None, author=None, participants=None, location=None, done=False):
+    def __init__(self, protocoltype_id, date, source=None, content_public=None, content_private=None, start_time=None, end_time=None, author=None, participants=None, location=None, done=False):
         self.protocoltype_id = protocoltype_id
         self.date = date
         self.source = source
+        self.content_private = content_private
+        self.content_public = content_public
         self.start_time = start_time
         self.end_time = end_time
         self.author = author
diff --git a/parser.py b/parser.py
index 80b35f0cf68df7f98cb8f6b0f39a88dd9c9f07fc..f451d2d70c42d9739f436925db97dd038f37b339 100644
--- a/parser.py
+++ b/parser.py
@@ -160,7 +160,7 @@ class Text:
             return escape_tex(self.text)
         elif render_type == RenderType.wikitext:
             return self.text
-        elif render_Type == RenderType.plaintext:
+        elif render_type == RenderType.plaintext:
             return self.text
         else:
             raise _not_implemented(self, render_type)
@@ -195,6 +195,8 @@ class Tag:
             elif self.name == "todo":
                 return self.todo.render_latex(current_protocol=protocol)
             return r"\textbf{{{}:}} {}".format(escape_tex(self.name.capitalize()), escape_tex(self.values[0]))
+        elif render_type == RenderType.plaintext:
+            return "{}: {}".format(self.name.capitalize(), self.values[0])
         else:
             raise _not_implemented(self, render_type)
 
@@ -331,7 +333,7 @@ class Fork(Element):
             title_line = "{} {}".format("#" * (level + 1), name_line)
             content_parts = []
             for child in self.children:
-                part = child.render(render_Type, show_private, level=level+1, protocol=protocol)
+                part = child.render(render_type, show_private, level=level+1, protocol=protocol)
                 if len(part.strip()) == 0:
                     continue
                 content_parts.append(part)
diff --git a/server.py b/server.py
index 6c1b428e97f82bc02a20218bab3c4fc4aff42aa2..05a1cd8f00e0242be1687c66fa8b698363361ea6 100755
--- a/server.py
+++ b/server.py
@@ -14,7 +14,7 @@ from datetime import datetime
 import math
 
 import config
-from shared import db, date_filter, datetime_filter, date_filter_long, time_filter, ldap_manager, security_manager, current_user, check_login, login_required, group_required
+from shared import db, date_filter, datetime_filter, date_filter_long, time_filter, ldap_manager, security_manager, current_user, check_login, login_required, group_required, class_filter
 from utils import is_past, mail_manager, url_manager, get_first_unused_int, set_etherpad_text, get_etherpad_text
 from models.database import ProtocolType, Protocol, DefaultTOP, TOP, Document, Todo, Decision, MeetingReminder, Error
 from views.forms import LoginForm, ProtocolTypeForm, DefaultTopForm, MeetingReminderForm, NewProtocolForm, DocumentUploadForm, KnownProtocolSourceUploadForm, NewProtocolSourceUploadForm, ProtocolForm, TopForm, SearchForm
@@ -45,6 +45,7 @@ app.jinja_env.filters["datetimify"] = datetime_filter
 app.jinja_env.filters["timify"] = time_filter
 app.jinja_env.filters["datify_long"] = date_filter_long
 app.jinja_env.filters["url_complete"] = url_manager.complete
+app.jinja_env.filters["class"] = class_filter
 app.jinja_env.tests["auth_valid"] = security_manager.check_user
 
 import tasks
diff --git a/tasks.py b/tasks.py
index 8aee9d21825bc682b409d2b08f64588d850d1dac..a14bf0fd6e2d7906cbc79e030f778e6055415408 100644
--- a/tasks.py
+++ b/tasks.py
@@ -190,15 +190,23 @@ def parse_protocol_async(protocol_id, encoded_kwargs):
                 db.session.add(top)
             db.session.commit()
 
-            private_states = [False]
-
-            latex_source_private = texenv.get_template("protocol.tex").render(protocol=protocol, tree=tree, show_private=True, render_type=RenderType.latex)
-            latex_source_public = texenv.get_template("protocol.tex").render(protocol=protocol, tree=tree, show_private=False, render_type=RenderType.latex)
-            compile(latex_source_public, protocol, show_private=False)
-            if latex_source_private != latex_source_public:
-                compile(latex_source_private, protocol, show_private=True)
-                # TODO compare something that may actually be equal
+            render_kwargs = {
+                "protocol": protocol,
+                "tree": tree
+            }
+            privacy_states = [False]
+            content_private = render_template("protocol.txt", render_type=RenderType.plaintext, show_private=True, **render_kwargs)
+            content_public = render_template("protocol.txt", render_type=RenderType.plaintext, show_private=False, **render_kwargs)
+            if content_private != content_public:
+                print("different")
+                privacy_states.append(True)
+            protocol.content_private = content_private
+            protocol.content_public = content_public
 
+            for show_private in privacy_states:
+                latex_source = texenv.get_template("protocol.tex").render(render_type=RenderType.latex, show_private=show_private, **render_kwargs)
+                compile(latex_source, protocol, show_private=show_private)
+                # TODO render and push wiki
             protocol.done = True
             db.session.commit()
 
diff --git a/templates/protocol-show.html b/templates/protocol-show.html
index 2f9a02ee8fb15034a5974cf81b3a0b22a84d72c6..bc3a703dd970381d4af2cfccb69c10dfa5c3472e 100644
--- a/templates/protocol-show.html
+++ b/templates/protocol-show.html
@@ -55,9 +55,13 @@
             {% if protocol.is_done() %}
             <h3>Beschlüsse</h3>
             <ul>
-                {% for decision in protocol.decisions %}
-                    <li>{{decision.content}}</li>
-                {% endfor %}
+                {% if protocol.decisions|length > 0 %}
+                    {% for decision in protocol.decisions %}
+                        <li>{{decision.content}}</li>
+                    {% endfor %}
+                {% else %}
+                    <li>Keine Beschlüsse</li>
+                {% endif %}
             </ul>
             {% endif %}
         </div>
diff --git a/templates/protocol.txt b/templates/protocol.txt
new file mode 100644
index 0000000000000000000000000000000000000000..50a816d6d0c3c14dc93ead27b5e15a24d027f4aa
--- /dev/null
+++ b/templates/protocol.txt
@@ -0,0 +1,5 @@
+{% for top in tree.children %}
+{% if top|class == "Fork" %}
+{{top.render(render_type=render_type, level=0, show_private=show_private, protocol=protocol)}}
+{% endif %}
+{% endfor %}
diff --git a/views/forms.py b/views/forms.py
index 24afb7bc1cfbd38d7b29375cd6526ac105e31a8e..ebec93eeb41776a797eb2848e3ffc71576410eb5 100644
--- a/views/forms.py
+++ b/views/forms.py
@@ -68,5 +68,5 @@ class SearchForm(FlaskForm):
     def __init__(self, protocoltypes, **kwargs):
         super().__init__(**kwargs)
         choices = [(protocoltype.id, protocoltype.short_name) for protocoltype in protocoltypes]
-        choices.insert(0, (-1, ""))
+        choices.insert(0, (-1, "Alle"))
         self.protocoltype.choices = choices