diff --git a/models/database.py b/models/database.py
index b9f64aa9f18016f9d3644b83a88f9b26f0964b26..11c68bf6189750b544c6d007e1d0cca4b1eb689c 100644
--- a/models/database.py
+++ b/models/database.py
@@ -105,6 +105,12 @@ class ProtocolType(DatabaseModel):
             return None
         return candidates[0]
 
+    def get_protocols_on_date(self, protocol_date):
+        return [
+            protocol for protocol in self.protocols
+            if protocol.date == protocol_date
+        ]
+
     def has_public_view_right(self, user, check_networks=True):
         return (
             self.has_public_anonymous_view_right(check_networks=check_networks)
@@ -423,7 +429,12 @@ class Protocol(DatabaseModel):
             tzinfo=tz.tzlocal())
 
     @staticmethod
-    def create_new_protocol(protocoltype, date, start_time=None):
+    def create_new_protocol(
+            protocoltype, date, start_time=None, allow_duplicate=False):
+        if not allow_duplicate:
+            duplicate_candidates = protocoltype.get_protocols_on_date(date)
+            if duplicate_candidates:
+                return duplicate_candidates[0]
         if start_time is None:
             start_time = protocoltype.usual_time
         protocol = Protocol(
diff --git a/tasks.py b/tasks.py
index 50d047684b23ee32a6e22e8cf71414cd8f05d8ba..1d142ed568a01422c8993f226540d1136bd13442 100644
--- a/tasks.py
+++ b/tasks.py
@@ -492,8 +492,9 @@ def parse_protocol_async_inner(protocol):
         if len(protocol_tag.values) > 1:
             new_protocol_time = datetime.strptime(
                 protocol_tag.values[1], "%H:%M")
-        Protocol.create_new_protocol(
-            protocol.protocoltype, new_protocol_date, new_protocol_time)
+        if not protocol.protocoltype.get_protocols_on_date(new_protocol_date):
+            Protocol.create_new_protocol(
+                protocol.protocoltype, new_protocol_date, new_protocol_time)
 
     # TOPs
     old_tops = list(protocol.tops)