diff --git a/src/knot/events/handlers/expire.c b/src/knot/events/handlers/expire.c
index 1e096f47b86f681652794e03cbe085ec09cf65b4..d7deedd66c3eb6e5675c561415589fe1f7fde984 100644
--- a/src/knot/events/handlers/expire.c
+++ b/src/knot/events/handlers/expire.c
@@ -1,4 +1,4 @@
-/*  Copyright (C) 2019 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+/*  Copyright (C) 2022 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
 
     This program is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
@@ -38,8 +38,8 @@ int event_expire(conf_t *conf, zone_t *zone)
 
 	zone->zonefile.exists = false;
 
-	// NOTE: must preserve zone->timers.soa_expire
-	zone->timers.next_refresh = time(NULL);
+	zone->timers.next_expire = time(NULL);
+	zone->timers.next_refresh = zone->timers.next_expire;
 	replan_from_timers(conf, zone);
 
 	return KNOT_EOK;
diff --git a/src/knot/zone/zone.c b/src/knot/zone/zone.c
index e456ac678c1999232b8005b72f9c8fbb7144c6ab..18bd80ed99a3d4eebc9374b7b4abc0cdd76c0a34 100644
--- a/src/knot/zone/zone.c
+++ b/src/knot/zone/zone.c
@@ -278,7 +278,9 @@ int selective_zone_purge(conf_t *conf, zone_t *zone, purge_flag_t params)
 
 	// Purge the zone timers.
 	if (params & PURGE_ZONE_TIMERS) {
-		memset(&zone->timers, 0, sizeof(zone->timers));
+		zone->timers = (zone_timers_t) {
+			.catalog_member = zone->timers.catalog_member
+		};
 		ret = zone_timers_sweep(&zone->server->timerdb,
 		                        (sweep_cb)knot_dname_cmp, zone->name);
 		RETURN_IF_FAILED("timers", KNOT_ENOENT);
@@ -314,6 +316,7 @@ int selective_zone_purge(conf_t *conf, zone_t *zone, purge_flag_t params)
 
 	// Purge Catalog.
 	if (params & PURGE_ZONE_CATALOG) {
+		zone->timers.catalog_member = 0;
 		ret = catalog_zone_purge(zone->server, conf, zone->name);
 		RETURN_IF_FAILED("catalog", KNOT_EOK);
 	}
diff --git a/src/knot/zone/zonedb-load.c b/src/knot/zone/zonedb-load.c
index 5126a4ca2bedc5a0901138b643b5edfe38fdd217..cf8e3986446af1f9dfd5a99bb1553319911a36a7 100644
--- a/src/knot/zone/zonedb-load.c
+++ b/src/knot/zone/zonedb-load.c
@@ -251,7 +251,8 @@ static void zone_purge(conf_t *conf, zone_t *zone)
 
 static zone_contents_t *zone_expire(zone_t *zone)
 {
-	zone->timers.next_refresh = time(NULL);
+	zone->timers.next_expire = time(NULL);
+	zone->timers.next_refresh = zone->timers.next_expire;
 	return zone_switch_contents(zone, NULL);
 }