diff --git a/lib/dnssec/nsec.c b/lib/dnssec/nsec.c
index 56d6aa271a5222925851bb54b4880bc769d862d6..ea64678ea2ee2378e8f3642b6975982e8a5d3d96 100644
--- a/lib/dnssec/nsec.c
+++ b/lib/dnssec/nsec.c
@@ -237,7 +237,14 @@ static int no_data_response_check_rrtype(int *flags, const knot_rrset_t *nsec,
 
 	if (!kr_nsec_bitmap_contains_type(bm, bm_size, type)) {
 		/* The type is not listed in the NSEC bitmap. */
-		*flags |= FLG_NOEXIST_RRTYPE;
+		/* Security feature: in case of DS also check for SOA
+		 * non-existence to be more certain that we don't hold
+		 * a child-side NSEC by some mistake (e.g. when forwarding).
+		 * See RFC4035 5.2, next-to-last paragraph. */
+		if (type != KNOT_RRTYPE_DS
+		    || !kr_nsec_bitmap_contains_type(bm, bm_size, KNOT_RRTYPE_SOA)) {
+			*flags |= FLG_NOEXIST_RRTYPE;
+		}
 	}
 
 	return kr_ok();