diff --git a/lib/lib.mk b/lib/lib.mk
index b8569a3d2cf45d8d4571fe8063cff079ea1f92a0..84935ef0545a4a2998dae427a65b9dbd8654582e 100644
--- a/lib/lib.mk
+++ b/lib/lib.mk
@@ -65,6 +65,10 @@ libkres_HEADERS += \
 libkres_LIBS += $(nettle_LIBS)
 endif
 
+lib/zonecut.c: lib/root-hints.inc
+lib/root-hints.inc: scripts/gen-root-hints.sh scripts/inet_pton.py
+	scripts/gen-root-hints.sh > $@
+
 # Make library
 ifeq ($(BUILDMODE), static)
 $(eval $(call make_static,libkres,lib,yes))
diff --git a/lib/root-hints.inc b/lib/root-hints.inc
new file mode 100644
index 0000000000000000000000000000000000000000..2cf1f656372f1405644b101a57e15ce783401043
--- /dev/null
+++ b/lib/root-hints.inc
@@ -0,0 +1,27 @@
+/* generated root hints */
+#define HINT_a_A "\xc6\x29\x00\x04"
+#define HINT_b_A "\xc0\xe4\x4f\xc9"
+#define HINT_c_A "\xc0\x21\x04\x0c"
+#define HINT_d_A "\xc7\x07\x5b\x0d"
+#define HINT_e_A "\xc0\xcb\xe6\x0a"
+#define HINT_f_A "\xc0\x05\x05\xf1"
+#define HINT_g_A "\xc0\x70\x24\x04"
+#define HINT_h_A "\xc6\x61\xbe\x35"
+#define HINT_i_A "\xc0\x24\x94\x11"
+#define HINT_j_A "\xc0\x3a\x80\x1e"
+#define HINT_k_A "\xc1\x00\x0e\x81"
+#define HINT_l_A "\xc7\x07\x53\x2a"
+#define HINT_m_A "\xca\x0c\x1b\x21"
+#define HINT_a_AAAA "\x20\x01\x05\x03\xba\x3e\x00\x00\x00\x00\x00\x00\x00\x02\x00\x30"
+#define HINT_b_AAAA "\x20\x01\x05\x00\x00\x84\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0b"
+#define HINT_c_AAAA "\x20\x01\x05\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0c"
+#define HINT_d_AAAA "\x20\x01\x05\x00\x00\x2d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0d"
+#define HINT_e_AAAA "\x20\x01\x05\x00\x00\xa8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0e"
+#define HINT_f_AAAA "\x20\x01\x05\x00\x00\x2f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f"
+#define HINT_g_AAAA "\x20\x01\x05\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x0d\x0d"
+#define HINT_h_AAAA "\x20\x01\x05\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53"
+#define HINT_i_AAAA "\x20\x01\x07\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53"
+#define HINT_j_AAAA "\x20\x01\x05\x03\x0c\x27\x00\x00\x00\x00\x00\x00\x00\x02\x00\x30"
+#define HINT_k_AAAA "\x20\x01\x07\xfd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01"
+#define HINT_l_AAAA "\x20\x01\x05\x00\x00\x9f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42"
+#define HINT_m_AAAA "\x20\x01\x0d\xc3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x35"
diff --git a/lib/zonecut.c b/lib/zonecut.c
index 2ec4d684e88b1fa242c5ea9e1c59dc7cb6a2d976..4ec4cdc314298c4784f8509a643b2dbdbfdbc1dc 100644
--- a/lib/zonecut.c
+++ b/lib/zonecut.c
@@ -34,39 +34,49 @@ struct hint_info {
 	const uint8_t *addr;
 };
 
-/* Initialize with SBELT name servers. */
 #define U8(x) (const uint8_t *)(x)
-#define I4 sizeof(struct in_addr)
-#define I6 sizeof(struct in6_addr)
-#define HINT_COUNT 24
-static const struct hint_info SBELT[HINT_COUNT] = {
-        { U8("\x01""j""\x0c""root-servers""\x03""net"), I4, U8("\xc0:\x80\x1e")    }, /* 192.58.128.30 */
-        { U8("\x01""k""\x0c""root-servers""\x03""net"), I4, U8("\xc1\x00\x0e\x81") }, /* 193.0.14.129 */
-        { U8("\x01""d""\x0c""root-servers""\x03""net"), I4, U8("\xc7\x07[\r")      }, /* 199.7.91.13 */
-        { U8("\x01""e""\x0c""root-servers""\x03""net"), I4, U8("\xc0\xcb\xe6\n")   }, /* 192.203.230.10 */
-        { U8("\x01""f""\x0c""root-servers""\x03""net"), I4, U8("\xc0\x05\x05\xf1") }, /* 192.5.5.241 */
-        { U8("\x01""g""\x0c""root-servers""\x03""net"), I4, U8("\xc0p$\x04")       }, /* 192.112.36.4 */
-        { U8("\x01""h""\x0c""root-servers""\x03""net"), I4, U8("\xc6\x61\xbe\x35") }, /* 198.97.190.53 */
-        { U8("\x01""i""\x0c""root-servers""\x03""net"), I4, U8("\xc0$\x94\x11")    }, /* 192.36.148.17 */
-        { U8("\x01""l""\x0c""root-servers""\x03""net"), I4, U8("\xc7\x07S*")       }, /* 199.7.83.42 */
-        { U8("\x01""m""\x0c""root-servers""\x03""net"), I4, U8("\xca\x0c\x1b!")    }, /* 202.12.27.33 */
-        { U8("\x01""b""\x0c""root-servers""\x03""net"), I4, U8("\xc0\xe4O\xc9")    }, /* 192.228.79.201 */
-        { U8("\x01""c""\x0c""root-servers""\x03""net"), I4, U8("\xc6)\x00\x04")    }, /* 192.33.4.12 */
-        { U8("\x01""a""\x0c""root-servers""\x03""net"), I4, U8("\xc6)\x00\x04")    }, /* 198.41.0.4 */
-	{ U8("\x01""a""\x0c""root-servers""\x03""net"), I6, U8("\x20\x01\x05\x03\xba\x3e\x00\x00\x00\x00\x00\x00\x00\x02\x00\x30") }, /* 2001:503:ba3e::2:30 */
-	{ U8("\x01""b""\x0c""root-servers""\x03""net"), I6, U8("\x20\x01\x05\x00\x00\x84\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0b") }, /* 2001:500:84::b */
-	{ U8("\x01""c""\x0c""root-servers""\x03""net"), I6, U8("\x20\x01\x05\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0c") }, /* 2001:500:2::c */
-	{ U8("\x01""d""\x0c""root-servers""\x03""net"), I6, U8("\x20\x01\x05\x00\x00\x2d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0d") }, /* 2001:500:2d::d */
-	{ U8("\x01""f""\x0c""root-servers""\x03""net"), I6, U8("\x20\x01\x05\x00\x00\x2f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f") }, /* 2001:500:2f::f */
-	{ U8("\x01""h""\x0c""root-servers""\x03""net"), I6, U8("\x20\x01\x05\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53") }, /* 2001:500:1::53 */
-	{ U8("\x01""i""\x0c""root-servers""\x03""net"), I6, U8("\x20\x01\x07\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53") }, /* 2001:7fe::53 */
-	{ U8("\x01""j""\x0c""root-servers""\x03""net"), I6, U8("\x20\x01\x05\x03\x0c\x27\x00\x00\x00\x00\x00\x00\x00\x02\x00\x30") }, /* 2001:503:c27::2:30 */
-	{ U8("\x01""k""\x0c""root-servers""\x03""net"), I6, U8("\x20\x01\x07\xfd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01") }, /* 2001:7fd::1 */
-	{ U8("\x01""l""\x0c""root-servers""\x03""net"), I6, U8("\x20\x01\x05\x00\x00\x9f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42") }, /* 2001:500:9f::42 */
-	{ U8("\x01""m""\x0c""root-servers""\x03""net"), I6, U8("\x20\x01\x0d\xc3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x35") }, /* 2001:dc3::35 */
+
+/* Initialize with SBELT name servers. */
+#include "lib/root-hints.inc"
+#define HINT_LEN_A sizeof(struct in_addr)
+#define HINT_LEN_AAAA sizeof(struct in6_addr)
+#define SBELT_LEN (sizeof(SBELT) / sizeof(SBELT[0]))
+static const struct hint_info SBELT[] = {
+	#define HINT(name,type) { \
+		U8("\x01" #name "\x0c""root-servers""\x03""net"), \
+		HINT_LEN_##type, \
+		U8(HINT_##name##_##type), \
+      	}
+	HINT(j, A),
+	HINT(k, A),
+	HINT(d, A),
+	HINT(e, A),
+	HINT(f, A),
+	HINT(g, A),
+	HINT(h, A),
+	HINT(i, A),
+	HINT(l, A),
+	HINT(m, A),
+	HINT(b, A),
+	HINT(c, A),
+	HINT(a, A),
+	HINT(a, AAAA),
+	HINT(b, AAAA),
+	HINT(c, AAAA),
+	HINT(d, AAAA),
+	HINT(e, AAAA),
+	HINT(f, AAAA),
+	HINT(g, AAAA),
+	HINT(h, AAAA),
+	HINT(i, AAAA),
+	HINT(j, AAAA),
+	HINT(k, AAAA),
+	HINT(l, AAAA),
+	HINT(m, AAAA),
+	#undef HINT
 };
-#undef I4
-#undef I6
+#undef HINT_LEN_A
+#undef HINT_LEN_AAAA
 
 
 static void update_cut_name(struct kr_zonecut *cut, const knot_dname_t *name)
@@ -286,7 +296,7 @@ int kr_zonecut_set_sbelt(struct kr_context *ctx, struct kr_zonecut *cut)
 		ret = kr_zonecut_copy(cut, &ctx->root_hints);
 	} else {
 		/* Copy compiled-in root hints */
-		for (unsigned i = 0; i < HINT_COUNT; ++i) {
+		for (unsigned i = 0; i < SBELT_LEN; ++i) {
 			const struct hint_info *hint = &SBELT[i];
 			knot_rdata_init(rdata_arr, hint->len, hint->addr, 0);
 			ret = kr_zonecut_add(cut, hint->name, rdata_arr);
diff --git a/scripts/gen-root-hints.sh b/scripts/gen-root-hints.sh
new file mode 100755
index 0000000000000000000000000000000000000000..53c5c9af83b27139c3a5134f6b03c106cb11ad2f
--- /dev/null
+++ b/scripts/gen-root-hints.sh
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+echo "/* generated root hints */"
+
+for atype in A AAAA; do
+	for n in a b c d e f g h i j k l m; do
+		ip="$(kdig "$atype" "$n.root-servers.net." +dnssec +short)"
+		ip_hex="$("$(dirname "$0")"/inet_pton.py "$ip")"
+		echo "#define HINT_${n}_${atype} \"$ip_hex\""
+	done
+done
+
diff --git a/scripts/inet_pton.py b/scripts/inet_pton.py
index d16f03ef081bae31356167290e954608f1f5d092..30bf06af64fae59e8d98d903105c73d500d77ed3 100755
--- a/scripts/inet_pton.py
+++ b/scripts/inet_pton.py
@@ -1,13 +1,19 @@
-#!/usr/bin/python
+#!/usr/bin/env python
 
-from socket import inet_pton,AF_INET6
+from socket import inet_pton,AF_INET6,AF_INET
 import sys
 from binascii import hexlify
+from string import find
 
-x = hexlify(inet_pton(AF_INET6, sys.argv[1]))
+if find(sys.argv[1], ":") == -1:
+    addr_type = AF_INET
+else:
+    addr_type = AF_INET6
+
+x = hexlify(inet_pton(addr_type, sys.argv[1]))
 
 out = ""
-for i in range(0, 16):
+for i in range(0, len(x) / 2):
     out += "\\x" + x[i*2] + x[i*2+1]
 
 print out