diff --git a/Knot.files b/Knot.files
index e53688fee4c9b45a4f389425ba6ef348e0a3468b..613f302748008d6923e4cbad06aebf36d947eba3 100644
--- a/Knot.files
+++ b/Knot.files
@@ -353,3 +353,4 @@ tests/zone_events.c
 tests/zone_update.c
 tests/zonedb.c
 tests/ztree.c
+tests/zone_timers.c
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 53c18100ab60918b8d2043c7531b5bfac143a220..80beba65e8a70804d78b8931fb641b00256d83c4 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -46,6 +46,7 @@ check_PROGRAMS = \
 	worker_queue			\
 	zone_events			\
 	zone_update			\
+	zone_timers			\
 	namedb
 
 check-compile-only: $(check_PROGRAMS)
diff --git a/tests/zone_timers.c b/tests/zone_timers.c
index 0db14c90fb57d9d58318db316e62c5defdd85fa7..4ff75841458c49f0196ce8146cee64a070e4a804 100644
--- a/tests/zone_timers.c
+++ b/tests/zone_timers.c
@@ -36,11 +36,21 @@ int main(int argc, char *argv[])
 	// Temporary DB identifier.
 	char dbid_buf[] = "/tmp/timerdb.XXXXXX";
 	const char *dbid = mkdtemp(dbid_buf);
-	
-	// Mockup zone.
-	conf_zone_t zone_conf = { .name = "test." };
-	zone_t *zone = zone_new(&zone_conf);
-	assert(zone);
+
+	// Mockup zones.
+	conf_zone_t zone_conf = { .name = "test1." };
+	zone_t *zone_1 = zone_new(&zone_conf);
+	zone_conf.name = "test2.";
+	zone_t *zone_2 = zone_new(&zone_conf);
+	assert(zone_1 && zone_2);
+
+	// Mockup zonedb.
+	knot_zonedb_t *zone_db = knot_zonedb_new(2);
+	assert(zone_db);
+	int ret = knot_zonedb_insert(zone_db, zone_1);
+	assert(ret == KNOT_EOK);
+	ret = knot_zonedb_insert(zone_db, zone_2);
+	assert(ret == KNOT_EOK);
 
 	knot_namedb_t *db = open_timers_db(dbid);
 	ok(db != NULL, "zone timers: create");
@@ -52,25 +62,54 @@ int main(int argc, char *argv[])
 	const time_t FLUSH_TIME = now + FLUSH_SLIP;
 
 	// Refresh, expire and flush are the permanent events for now.
-	zone_events_schedule_at(zone, ZONE_EVENT_REFRESH, REFRESH_TIME);
-	zone_events_schedule_at(zone, ZONE_EVENT_EXPIRE, EXPIRE_TIME);
-	zone_events_schedule_at(zone, ZONE_EVENT_FLUSH, FLUSH_TIME);
+	zone_events_schedule_at(zone_1, ZONE_EVENT_REFRESH, REFRESH_TIME);
+	zone_events_schedule_at(zone_1, ZONE_EVENT_EXPIRE, EXPIRE_TIME);
+	zone_events_schedule_at(zone_1, ZONE_EVENT_FLUSH, FLUSH_TIME);
 
 	// Write the timers.
-	int ret = write_zone_timers(db, zone);
+	ret = write_zone_timers(db, zone_1);
 	ok(ret == KNOT_EOK, "zone timers: write");
 
 	// Read the timers.
 	time_t timers[ZONE_EVENT_COUNT];
-	ret = read_zone_timers(db, zone, timers);
+	ret = read_zone_timers(db, zone_1, timers);
 	ok(ret == KNOT_EOK &&
 	   timers[ZONE_EVENT_REFRESH] == REFRESH_TIME &&
 	   timers[ZONE_EVENT_EXPIRE] == EXPIRE_TIME &&
-	   timers[ZONE_EVENT_FLUSH] == FLUSH_TIME, "zone timers: read");
+	   timers[ZONE_EVENT_FLUSH] == FLUSH_TIME, "zone timers: read set");
+
+	// Sweep and read again - timers should stay the same.
+	int s_ret = sweep_timer_db(db, zone_db);
+	if (s_ret == KNOT_EOK) {
+		ret = read_zone_timers(db, zone_1, timers);
+	}
+	ok(s_ret == KNOT_EOK && ret == KNOT_EOK &&
+	   timers[ZONE_EVENT_REFRESH] == REFRESH_TIME &&
+	   timers[ZONE_EVENT_EXPIRE] == EXPIRE_TIME &&
+	   timers[ZONE_EVENT_FLUSH] == FLUSH_TIME, "zone timers: sweep no-op");
+
+	// Read timers for unset zone.
+	const time_t empty_timers[ZONE_EVENT_COUNT] = { '\0' };
+	ret = read_zone_timers(db, zone_2, timers);
+	ok(ret == KNOT_EOK &&
+	   memcmp(timers, empty_timers, sizeof(timers)) == 0, "zone timers: read unset");
+
+	// Remove first zone from db and sweep.
+	ret = knot_zonedb_del(zone_db, zone_1->name);
+	assert(ret == KNOT_EOK);
+
+	s_ret = sweep_timer_db(db, zone_db);
+	if (s_ret == KNOT_EOK) {
+		ret = read_zone_timers(db, zone_1, timers);
+	}
+	ok(s_ret == KNOT_EOK && ret == KNOT_EOK &&
+	   memcmp(timers, empty_timers, sizeof(timers)) == 0, "zone timers: sweep");
 
 	// Clean up.
-	zone->conf = NULL;
-	zone_free(&zone);
+	zone_1->conf = NULL;
+	zone_2->conf = NULL;
+	zone_free(&zone_1);
+	zone_free(&zone_2);
 	close_timers_db(db);
 
 	return EXIT_SUCCESS;