diff --git a/server.py b/server.py
index 0697ed814070fcee49485c9e459e4f167e9d9a6f..640a19dec06a8efdbaf582072f5f1088d907285b 100755
--- a/server.py
+++ b/server.py
@@ -24,7 +24,7 @@ from shared import db, date_filter, datetime_filter, date_filter_long, date_filt
 from utils import is_past, mail_manager, url_manager, get_first_unused_int, set_etherpad_text, get_etherpad_text, split_terms, optional_int_arg
 from decorators import db_lookup, require_public_view_right, require_private_view_right, require_modify_right, require_admin_right
 from models.database import ProtocolType, Protocol, DefaultTOP, TOP, Document, Todo, Decision, MeetingReminder, Error, TodoMail, DecisionDocument, TodoState, Meta, DefaultMeta, DecisionCategory
-from views.forms import LoginForm, ProtocolTypeForm, DefaultTopForm, MeetingReminderForm, NewProtocolForm, DocumentUploadForm, KnownProtocolSourceUploadForm, NewProtocolSourceUploadForm, ProtocolForm, TopForm, SearchForm, DecisionSearchForm, NewProtocolFileUploadForm, NewTodoForm, TodoForm, TodoMailForm, DefaultMetaForm, MetaForm, MergeTodosForm, DecisionCategoryForm
+from views.forms import LoginForm, ProtocolTypeForm, DefaultTopForm, MeetingReminderForm, NewProtocolForm, DocumentUploadForm, KnownProtocolSourceUploadForm, NewProtocolSourceUploadForm, ProtocolForm, TopForm, SearchForm, DecisionSearchForm, ProtocolSearchForm, NewProtocolFileUploadForm, NewTodoForm, TodoForm, TodoMailForm, DefaultMetaForm, MetaForm, MergeTodosForm, DecisionCategoryForm
 from views.tables import ProtocolsTable, ProtocolTypesTable, ProtocolTypeTable, DefaultTOPsTable, MeetingRemindersTable, ErrorsTable, TodosTable, DocumentsTable, DecisionsTable, TodoTable, ErrorTable, TodoMailsTable, DefaultMetasTable, DecisionCategoriesTable
 from legacy import import_old_todos, import_old_protocols, import_old_todomails
 
@@ -351,12 +351,19 @@ def list_protocols():
         protocoltype_id = int(request.args.get("protocoltype_id"))
     except (ValueError, TypeError):
         pass
+    open = -1
+    try:
+        open = int(request.args.get("open"))
+    except (ValueError, TypeError):
+        pass
     search_term = request.args.get("search")
     protocoltypes = ProtocolType.get_public_protocoltypes(user)
-    search_form = SearchForm(protocoltypes)
+    search_form = ProtocolSearchForm(protocoltypes)
     if protocoltype_id is not None:
         search_form.protocoltype_id.data = protocoltype_id
         protocoltype = ProtocolType.query.filter_by(id=protocoltype_id).first()
+    if open is not None:
+        search_form.open.data = open
     if search_term is not None:
         search_form.search.data = search_term
     protocol_query = Protocol.query
@@ -391,6 +398,12 @@ def list_protocols():
             protocol for protocol in protocols
             if protocol.protocoltype.id == protocoltype_id
         ]
+    if open is not None and open != -1:
+        protocol_done = bool(open)
+        protocols = [
+            protocol for protocol in protocols
+            if protocol.is_done() == protocol_done
+        ]
     if shall_search:
         protocols = [
             protocol for protocol in protocols
diff --git a/views/forms.py b/views/forms.py
index d03016f8886e87d17aebf93984988605020172f9..cd5b55f1e589d821f7c7ac0b6d9443260cc1963f 100644
--- a/views/forms.py
+++ b/views/forms.py
@@ -205,6 +205,9 @@ class DecisionSearchForm(SearchForm):
         super().__init__(protocoltypes=protocoltypes, **kwargs)
         self.decisioncategory_id.choices = get_category_choices(categories)
 
+class ProtocolSearchForm(SearchForm):
+    open = SelectField("Offen", choices=[(-1, "Alle"), (0, "Geplant"), (1, "Fertig")], coerce=int)
+
 class NewTodoForm(FlaskForm):
     protocoltype_id = SelectField("Typ", choices=[], coerce=int)
     who = StringField("Person", validators=[InputRequired("Bitte gib an, wer das Todo erledigen soll.")])