diff --git a/src/libknot/zone/zonedb.c b/src/libknot/zone/zonedb.c
index 0c9038581a76e96e84aba1150694503bbbdbf08c..a27f29d8ca73d4c535d9f0a6cb76826dcf9c5607 100644
--- a/src/libknot/zone/zonedb.c
+++ b/src/libknot/zone/zonedb.c
@@ -118,14 +118,21 @@ int knot_zonedb_build_index(knot_zonedb_t *db)
 
 /*----------------------------------------------------------------------------*/
 
+static value_t *find_name(knot_zonedb_t *db, const knot_dname_t *dname, uint16_t size)
+{
+	return hhash_find(db->hash, (const char*)dname, size);
+}
+
+/*----------------------------------------------------------------------------*/
+
 knot_zone_t *knot_zonedb_find(knot_zonedb_t *db, const knot_dname_t *zone_name)
 {
-	if (!db || !zone_name) {
+	int name_size = knot_dname_size(zone_name);
+	if (!db || name_size < 1) {
 		return NULL;
 	}
 
-	int name_size = knot_dname_size(zone_name);
-	value_t *ret = hhash_find(db->hash, (const char*)zone_name, name_size);
+	value_t *ret = find_name(db, zone_name, name_size);
 	if (ret == NULL) {
 		return NULL;
 	}
@@ -150,17 +157,20 @@ knot_zone_t *knot_zonedb_find_suffix(knot_zonedb_t *db, const knot_dname_t *dnam
 	}
 
 	/* Compare possible suffixes. */
-	knot_zone_t *ret = NULL;
-	while (zone_labels > -1) { /* Include root label. */
-		ret = knot_zonedb_find(db, dname);
-		if (ret != NULL) {
-			break;
+	value_t *val = NULL;
+	int name_size = knot_dname_size(dname);
+	while (name_size > 0) { /* Include root label. */
+		val = find_name(db, dname, name_size);
+		if (val != NULL) {
+			return *val;
 		}
+
+		/* Next label */
+		name_size -= (dname[0] + 1);
 		dname = knot_wire_next_label(dname, NULL);
-		--zone_labels;
 	}
 
-	return ret;
+	return NULL;
 }
 
 /*----------------------------------------------------------------------------*/
diff --git a/tests/zonedb.c b/tests/zonedb.c
index 9ebfa3d570ed3d42885a64fd2e80573f7af4388b..9eb0884883a330c20eebd3195b0b8fcf45821379 100644
--- a/tests/zonedb.c
+++ b/tests/zonedb.c
@@ -91,7 +91,7 @@ int main(int argc, char *argv[])
 		if (knot_zonedb_find_suffix(db, dname) == zones[i]) {
 			++nr_passed;
 		} else {
-			diag("knot_zonedb_find_zone(%s) failed", buf);
+			diag("knot_zonedb_find_suffix(%s) failed", buf);
 		}
 		knot_dname_free(&dname);
 	}