diff --git a/src/libknot/dnssec/zone-nsec.c b/src/libknot/dnssec/zone-nsec.c
index 5a02c0a3b173b716032adad337b86b9b042c7980..21c6128a3ccfe34c7f034384a6534c046195759a 100644
--- a/src/libknot/dnssec/zone-nsec.c
+++ b/src/libknot/dnssec/zone-nsec.c
@@ -1099,6 +1099,9 @@ static int fix_nsec_chain(knot_dname_t *a, knot_dname_t *b, void *d)
 	                                                         a);
 	const knot_node_t *b_node = knot_zone_contents_find_node(fix_data->zone,
 	                                                         b);
+	if (b_node == NULL) {
+		return KNOT_EOK;
+	}
 	printf("FIX: a=%s b=%s next=%s\n", knot_dname_to_str(a), knot_dname_to_str(b),
 	       knot_dname_to_str(fix_data->next_dname));
 	// Handle removals
@@ -1167,11 +1170,11 @@ static int fix_nsec_chain(knot_dname_t *a, knot_dname_t *b, void *d)
 		// Previous node was not changed in DDNS, it has to have NSEC
 		const knot_rrset_t *nsec_rrset =
 			knot_node_rrset(prev_zone_node, KNOT_RRTYPE_NSEC);
-		assert(nsec_rrset && nsec_rrset->rdata_count == 1);
+		assert(nsec_rrset);
 		fix_data->next_dname = knot_rdata_nsec_next(nsec_rrset);
 		printf("FIX next_dname storing %s\n", knot_dname_to_str(fix_data->next_dname));
 		// Fix NSEC
-		const knot_node_t *next_node = node_deleted ? knot_zone_contents_find_node(fix_data->zone, knot_rdata_nsec_next(old_nsec)) : b_node;
+		const knot_node_t *next_node = node_deleted || knot_dname_is_equal(b, fix_data->next_dname) ? knot_zone_contents_find_node(fix_data->zone, knot_rdata_nsec_next(knot_node_rrset(b_node, KNOT_RRTYPE_NSEC))) : b_node;
 		printf("FIX OP: zone %s %s\n",
 		       knot_dname_to_str(prev_zone_node->owner),
 		       knot_dname_to_str(next_node->owner));