diff --git a/tests-extra/tests/catalog/rapid_updates/data/catalog1.zone b/tests-extra/tests/catalog/rapid_updates/data/catalog1.zone
new file mode 100644
index 0000000000000000000000000000000000000000..1d497600d45da1b377adbc675268766e4a28f857
--- /dev/null
+++ b/tests-extra/tests/catalog/rapid_updates/data/catalog1.zone
@@ -0,0 +1,7 @@
+$ORIGIN catalog1.
+$TTL 0
+
+@ SOA ns admin 1 25 25 80 600
+  NS ns
+ns AAAA ::0
+version TXT "2"
diff --git a/tests-extra/tests/catalog/rapid_updates/data/generic.zone b/tests-extra/tests/catalog/rapid_updates/data/generic.zone
new file mode 100644
index 0000000000000000000000000000000000000000..b9c65e2de2cc0bd0daacc4879514f1d8b513cd23
--- /dev/null
+++ b/tests-extra/tests/catalog/rapid_updates/data/generic.zone
@@ -0,0 +1,15 @@
+$TTL 3600
+
+@	SOA	dns1 hostmaster 2010111201 10800 3600 1209600 7200
+	NS	dns1
+	NS	dns2
+	MX	10 mail
+
+dns1	A	192.0.2.1
+	AAAA	2001:DB8::1
+
+dns2	A	192.0.2.2
+	AAAA	2001:DB8::2
+
+mail	A	192.0.2.3
+	AAAA	2001:DB8::3
diff --git a/tests-extra/tests/catalog/rapid_updates/test.py b/tests-extra/tests/catalog/rapid_updates/test.py
new file mode 100644
index 0000000000000000000000000000000000000000..2cf23c08f80492ca32ae8d740e599a71af9d21cc
--- /dev/null
+++ b/tests-extra/tests/catalog/rapid_updates/test.py
@@ -0,0 +1,67 @@
+#!/usr/bin/env python3
+
+'''Test of frequent updates to catalog, processed in batches.'''
+
+from dnstest.test import Test
+from dnstest.utils import set_err, detail_log
+
+import os
+import random
+import time
+import hashlib
+import threading
+import shutil
+
+UPDATES = 132
+
+t = Test(stress=False)
+
+knot = t.server("knot")
+
+catz = t.zone("catalog1.", storage=".")
+
+t.link(catz, knot)
+knot.zones[catz[0].name].catalog = True
+
+t.start()
+
+knot.zone_wait(catz, udp=False, tsig=True)
+
+check_names = list()
+
+def send_update(up):
+    try:
+        up.try_send()
+    except:
+        pass
+
+def send_up_bg(up):
+    threading.Thread(target=send_update, args=[up]).start()
+
+for i in range(UPDATES):
+    zone_add = "member%d." % i
+    name_hash = hashlib.md5(zone_add.encode()).hexdigest()
+
+    shutil.copyfile(t.data_dir + "generic.zone" , knot.dir + "/master/" + zone_add + "zone")
+
+    up = knot.update(catz)
+    up.add(name_hash + ".zones", 0, "PTR", zone_add)
+    send_up_bg(up)
+
+    if i % 2 == 1:
+        t.sleep(random.choice([1.5, 2, 2.5]))
+    else:
+        t.sleep(random.choice([0.1, 0.15, 0.25]))
+
+    check_names += [ zone_add ]
+
+t.sleep(4)
+
+for n in check_names:
+    resp = knot.dig(n, "SOA", udp=False, tsig=True)
+    resp.check(rcode="NOERROR") # not REFUSED
+
+if knot.log_search("catalog, interpreting 2 updates"):
+    set_err("LOST UPD SIGNAL")
+
+t.end()