diff --git a/src/knot/nameserver/update.c b/src/knot/nameserver/update.c
index 0809dbd900a44ddfe6f3d348d6071c528802b41a..aee4ca9115bde276ef03076ddfcaad7098de5123 100644
--- a/src/knot/nameserver/update.c
+++ b/src/knot/nameserver/update.c
@@ -153,6 +153,7 @@ static int process_normal(conf_t *conf, zone_t *zone, list_t *requests)
 
 	// Apply changes.
 	ret = zone_update_commit(conf, &up);
+	zone_update_clear(&up);
 	if (ret != KNOT_EOK) {
 		if (ret == KNOT_ETTL || ret == KNOT_EZONESIZE) {
 			set_rcodes(requests, KNOT_RCODE_REFUSED);
@@ -162,8 +163,6 @@ static int process_normal(conf_t *conf, zone_t *zone, list_t *requests)
 		return ret;
 	}
 
-	zone_update_clear(&up);
-
 	/* Sync zonefile immediately if configured. */
 	conf_val_t val = conf_zone_get(conf, C_ZONEFILE_SYNC, zone->name);
 	if (conf_int(&val) == 0) {
diff --git a/src/knot/updates/zone-update.c b/src/knot/updates/zone-update.c
index 3af1d28ce50cbaecd960d512d3ac54ed745ce6ce..afe094afea5da363d8f29a8e631a858b988dc256 100644
--- a/src/knot/updates/zone-update.c
+++ b/src/knot/updates/zone-update.c
@@ -716,6 +716,7 @@ int zone_update_commit(conf_t *conf, zone_update_t *update)
 		/* Sync RCU. */
 		synchronize_rcu();
 		if (update->flags & UPDATE_FULL) {
+			zone_contents_deep_free(&old_contents);
 			update->new_cont = NULL;
 		} else if (update->flags & UPDATE_INCREMENTAL) {
 			update_cleanup(&update->a_ctx);