diff --git a/migrations/versions/da846db78ff9_.py b/migrations/versions/da846db78ff9_.py
new file mode 100644
index 0000000000000000000000000000000000000000..a569337c48e509669c15edb7f012d44008f4cd4d
--- /dev/null
+++ b/migrations/versions/da846db78ff9_.py
@@ -0,0 +1,28 @@
+"""empty message
+
+Revision ID: da846db78ff9
+Revises: 7834767242e8
+Create Date: 2022-10-29 19:24:42.934124
+
+"""
+from alembic import op
+import sqlalchemy as sa
+
+
+# revision identifiers, used by Alembic.
+revision = 'da846db78ff9'
+down_revision = '7834767242e8'
+branch_labels = None
+depends_on = None
+
+
+def upgrade():
+    # ### commands auto generated by Alembic - please adjust! ###
+    op.add_column('protocoltypes', sa.Column('recurrence', sa.Integer(), nullable=True))
+    # ### end Alembic commands ###
+
+
+def downgrade():
+    # ### commands auto generated by Alembic - please adjust! ###
+    op.drop_column('protocoltypes', 'recurrence')
+    # ### end Alembic commands ###
diff --git a/models/database.py b/models/database.py
index a7c5ebf7e249c382ad01ed00555d25d896d7e893..6d98e438eb843b9d6e789706878938375b6e32d4 100644
--- a/models/database.py
+++ b/models/database.py
@@ -78,6 +78,7 @@ class ProtocolType(DatabaseModel):
     restrict_networks = db.Column(db.Boolean)
     allowed_networks = db.Column(db.Text)
     latex_template = db.Column(db.Text)
+    recurrence = db.Column(db.Integer)
 
     protocols = relationship(
         "Protocol", backref=backref("protocoltype"),
diff --git a/tasks.py b/tasks.py
index 5976b989bd2dd2dab85dc33e2e8f1d9ead76d407..d894769faa617cef4fe44395e9aaadc48960ec90 100644
--- a/tasks.py
+++ b/tasks.py
@@ -4,7 +4,7 @@ import os
 import subprocess
 import shutil
 import tempfile
-from datetime import datetime
+from datetime import datetime, timedelta
 import time
 import traceback
 from copy import copy
@@ -500,6 +500,11 @@ def parse_protocol_async_inner(protocol, ignore_old_date=False):
         if not protocol.protocoltype.get_protocols_on_date(new_protocol_date):
             Protocol.create_new_protocol(
                 protocol.protocoltype, new_protocol_date, new_protocol_time)
+    if not protocol_tags and protocol.protocoltype.recurrence:
+        new_protocol_date = protocol.date + timedelta(
+            days=protocol.protocoltype.recurrence)
+        if new_protocol_date > datetime.now().date():
+            Protocol.create_new_protocol(protocol.protocoltype, new_protocol_date)
 
     # TOPs
     old_tops = list(protocol.tops)
diff --git a/views/forms.py b/views/forms.py
index b5b85b25acd5582e3162facb4d421c93fc691636..551763351d47a69676f8140da6f7b72b64bc8fa3 100644
--- a/views/forms.py
+++ b/views/forms.py
@@ -174,6 +174,7 @@ class ProtocolTypeForm(FlaskForm):
     wiki_only_public = BooleanField("Wiki ist öffentlich")
     printer = SelectField("Drucker", choices=[])
     calendar = SelectField("Kalender", choices=[])
+    recurrence = IntegerField("Turnus (in Tagen)", validators=[Optional()])
     restrict_networks = BooleanField("Netzwerke einschränken")
     allowed_networks = IPNetworkField("Erlaubte Netzwerke")
     latex_template = SelectField("LaTeX Vorlage", choices=[])
diff --git a/views/tables.py b/views/tables.py
index 1009957ad1dd7eed3367af1a123453385378ada3..9db9c096196a4a44bfa230bc4e05d2e4dcbef47d 100644
--- a/views/tables.py
+++ b/views/tables.py
@@ -237,6 +237,7 @@ class ProtocolTypeTable(SingleValueTable):
         calendar_headers = ["Kalender"]
         if not config.CALENDAR_ACTIVE:
             calendar_headers = []
+        recurrence_headers = ["Turnus"]
         network_headers = ["Netzwerke einschränken", "Erlaubte Netzwerke"]
         action_headers = ["Aktion"]
         feed_headers = []
@@ -249,8 +250,8 @@ class ProtocolTypeTable(SingleValueTable):
         return (
             general_headers + etherpad_headers + mail_headers
             + printing_headers + wiki_headers + calendar_headers
-            + network_headers + latex_template_headers + feed_headers
-            + action_headers)
+            + recurrence_headers + network_headers + latex_template_headers
+            + feed_headers + action_headers)
 
     def row(self):
         user = current_user()
@@ -297,6 +298,7 @@ class ProtocolTypeTable(SingleValueTable):
             if self.value.calendar is not None else ""]
         if not config.CALENDAR_ACTIVE:
             calendar_part = []
+        recurrence_part = [f"{self.value.recurrence} Tage" if self.value.recurrence is not None else ""]
         network_part = [Table.bool(self.value.restrict_networks)]
         if self.value.allowed_networks is not None:
             network_part.append(
@@ -344,8 +346,8 @@ class ProtocolTypeTable(SingleValueTable):
             action_part = [""]
         return (
             general_part + etherpad_part + mail_part + printing_part
-            + wiki_part + calendar_part + network_part + latex_template_part
-            + feed_part + action_part)
+            + wiki_part + calendar_part + recurrence_part + network_part
+            + latex_template_part + feed_part + action_part)
 
 
 class DefaultTOPsTable(Table):