diff --git a/.gitignore b/.gitignore
index 545926a614494a725d11601335c9357513fa76db..60d510b52ff8b053920a23621c1da43590b12f62 100644
--- a/.gitignore
+++ b/.gitignore
@@ -74,7 +74,7 @@ src/libknot/libknot.h
 /src/knsec3hash
 /src/knsupdate
 /src/kzonecheck
-/src/xdp-gun
+/src/knot-xdp-gun
 
 # Generated tarballs
 /knot-*.tar.xz
diff --git a/Knot.files b/Knot.files
index c7cbeeb34694afb9b668f4596de46d36d1316ff1..fb7f10aa32cca5dd01168319bc5ac25c64039b36 100644
--- a/Knot.files
+++ b/Knot.files
@@ -480,9 +480,9 @@ src/utils/knsupdate/knsupdate_params.h
 src/utils/kzonecheck/main.c
 src/utils/kzonecheck/zone_check.c
 src/utils/kzonecheck/zone_check.h
-src/utils/xdp-gun/load_queries.c
-src/utils/xdp-gun/load_queries.h
-src/utils/xdp-gun/main.c
+src/utils/knot-xdp-gun/load_queries.c
+src/utils/knot-xdp-gun/load_queries.h
+src/utils/knot-xdp-gun/main.c
 tests-fuzz/fuzz_dname_from_str.c
 tests-fuzz/fuzz_dname_to_str.c
 tests-fuzz/fuzz_packet.c
diff --git a/distro/deb/knot-dnsutils.install b/distro/deb/knot-dnsutils.install
index e673039afc1488d95ff05a1a09d96a233809ae9f..b8e09c58d68f76adce78d9fe50083f0ef5ad78dd 100644
--- a/distro/deb/knot-dnsutils.install
+++ b/distro/deb/knot-dnsutils.install
@@ -1,6 +1,6 @@
 usr/bin/kdig
 usr/bin/knsupdate
-usr/bin/xdp-gun
+usr/sbin/knot-xdp-gun
 usr/share/man/man1/kdig.1
 usr/share/man/man1/knsupdate.1
-usr/share/man/man8/xdp-gun.1
+usr/share/man/man8/knot-xdp-gun.8
diff --git a/distro/deb/rules b/distro/deb/rules
index b50650f23a6134a7a6afa080370dd1a598644ac3..6da22f04803685d00894fe50acc9b902a7bf5bee 100755
--- a/distro/deb/rules
+++ b/distro/deb/rules
@@ -66,15 +66,17 @@ override_dh_auto_install-arch:
 	# rename knot.sample.conf to knot.conf
 	mv $(CURDIR)/debian/tmp/etc/knot/knot.sample.conf $(CURDIR)/debian/tmp/etc/knot/knot.conf
 	# Some workarounds for Debian Stretch and Ubuntu Xenial
-	@if [ -f "$(CURDIR)/debian/tmp/usr/bin/xdp-gun" ]; then \
+	@if [ -f "$(CURDIR)/debian/tmp/usr/sbin/knot-xdp-gun" ]; then \
 	  echo "Embedded XDP enabled"; \
 	elif [ -f "$(LIBKNOT_SYMBOLS)" ]; then \
 	  echo "No XDP"; \
-	  printf '#!/bin/sh\n\necho "xdp-gun not available"\n' > $(CURDIR)/debian/tmp/usr/bin/xdp-gun; \
+	  touch $(CURDIR)/debian/tmp/usr/share/man/man8/knot-xdp-gun.8; \
+	  printf '#!/bin/sh\n\necho "knot-xdp-gun not available"\n' > $(CURDIR)/debian/tmp/usr/sbin/knot-xdp-gun; \
 	  sed -i -E '/knot_xdp_|knot_eth_/d' $(LIBKNOT_SYMBOLS); \
 	else \
 	  echo "No XDP, no libknot symbols"; \
-	  printf '#!/bin/sh\n\necho "xdp-gun not available"\n' > $(CURDIR)/debian/tmp/usr/bin/xdp-gun; \
+	  touch $(CURDIR)/debian/tmp/usr/share/man/man8/knot-xdp-gun.8; \
+	  printf '#!/bin/sh\n\necho "knot-xdp-gun not available"\n' > $(CURDIR)/debian/tmp/usr/sbin/knot-xdp-gun; \
 	fi
 
 override_dh_auto_install-indep:
diff --git a/distro/rpm/knot.spec b/distro/rpm/knot.spec
index 7751362bd13ad582f4c4a327ab01fa4552a3b480..e82f6e264ba4941d7db88b406574c0717635b780 100644
--- a/distro/rpm/knot.spec
+++ b/distro/rpm/knot.spec
@@ -246,8 +246,8 @@ systemd-tmpfiles --create %{_tmpfilesdir}/knot.conf &>/dev/null || :
 %{_bindir}/knsec3hash
 %{_bindir}/knsupdate
 %if 0%{?rhel} >= 8 || 0%{?suse_version} || 0%{?fedora} >= 31
-%{_sbindir}/xdp-gun
-%{_mandir}/man8/xdp-gun.*
+%{_sbindir}/knot-xdp-gun
+%{_mandir}/man8/knot-xdp-gun.*
 %endif
 %{_mandir}/man1/kdig.*
 %{_mandir}/man1/khost.*
diff --git a/doc/.gitignore b/doc/.gitignore
index fa7777e3da62d10b13a7a7325c53805f9ce438b8..18b90cf057991f05e13f094acb5872388d23be9b 100644
--- a/doc/.gitignore
+++ b/doc/.gitignore
@@ -15,4 +15,4 @@
 /man/knsec3hash.1
 /man/knsupdate.1
 /man/kzonecheck.1
-/man/xdp-gun.8
+/man/knot-xdp-gun.8
diff --git a/doc/Makefile.am b/doc/Makefile.am
index 3f09426c0686d6053c516c96c02ab28fb58ca13b..dd4dc9abf4c1a513ee55ec914efb6ae9d31beafe 100644
--- a/doc/Makefile.am
+++ b/doc/Makefile.am
@@ -9,7 +9,7 @@ MANPAGES_IN = \
 	man/knsupdate.1in	\
 	man/knsec3hash.1in	\
 	man/kzonecheck.1in	\
-	man/xdp-gun.8in
+	man/knot-xdp-gun.8in
 
 MANPAGES_RST = \
 	man_knotc.rst		\
@@ -21,7 +21,7 @@ MANPAGES_RST = \
 	man_knsupdate.rst	\
 	man_knsec3hash.rst	\
 	man_kzonecheck.rst	\
-	man_xdp-gun.rst
+	man_knot-xdp-gun.rst
 
 EXTRA_DIST = \
 	conf.py			\
@@ -104,7 +104,7 @@ man_MANS += \
 	man/knsec3hash.1
 
 if ENABLE_XDP
-man_MANS += man/xdp-gun.8
+man_MANS += man/knot-xdp-gun.8
 endif # ENABLE_XDP
 endif # HAVE_UTILS
 
@@ -118,7 +118,7 @@ man/khost.1:		man/khost.1in
 man/knsupdate.1:	man/knsupdate.1in
 man/knsec3hash.1:	man/knsec3hash.1in
 man/kzonecheck.1:	man/kzonecheck.1in
-man/xdp-gun.8:		man/xdp-gun.8in
+man/knot-xdp-gun.8:	man/knot-xdp-gun.8in
 
 man_SUBST = $(AM_V_GEN)mkdir -p man; \
             sed -e 's,[@]VERSION@,$(VERSION),' \
diff --git a/doc/conf.py b/doc/conf.py
index c776cb5f8e7452f2a65492e218c7f7e6f9a0f702..f6a3c9d859eb6ee2704fc7a64e30d2be08a6b21e 100644
--- a/doc/conf.py
+++ b/doc/conf.py
@@ -233,7 +233,7 @@ man_pages = [
     ('man_knsec3hash',    'knsec3hash',    'Simple utility to compute NSEC3 hash',      author, 1),
     ('man_knsupdate',     'knsupdate',     'Dynamic DNS update utility',                author, 1),
     ('man_kzonecheck',    'kzonecheck',    'Knot DNS zone check tool',                  author, 1),
-    ('man_xdp-gun',       'xdp-gun',       'XDP-powered DNS benchmarking tool',         author, 8),
+    ('man_knot-xdp-gun',  'knot-xdp-gun',  'XDP-powered DNS benchmarking tool',         author, 8),
 ]
 
 # If true, show URL addresses after external links.
diff --git a/doc/man/xdp-gun.8in b/doc/man/knot-xdp-gun.8in
similarity index 89%
rename from doc/man/xdp-gun.8in
rename to doc/man/knot-xdp-gun.8in
index 762f447f78d79c3bd2ac9eb838b28c3076140736..0090bc4545887e2edf2cc4315a4357e996fbe86b 100644
--- a/doc/man/xdp-gun.8in
+++ b/doc/man/knot-xdp-gun.8in
@@ -1,8 +1,8 @@
 .\" Man page generated from reStructuredText.
 .
-.TH "XDP-GUN" "8" "@RELEASE_DATE@" "@VERSION@" "Knot DNS"
+.TH "KNOT-XDP-GUN" "8" "@RELEASE_DATE@" "@VERSION@" "Knot DNS"
 .SH NAME
-xdp-gun \- XDP-powered DNS benchmarking tool
+knot-xdp-gun \- XDP-powered DNS benchmarking tool
 .
 .nr rst2man-indent-level 0
 .
@@ -32,7 +32,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
 ..
 .SH SYNOPSIS
 .sp
-\fBxdp\-gun\fP [\fIoptions\fP] \fB\-i\fP \fIfilename\fP \fItargetIP\fP
+\fBknot\-xdp\-gun\fP [\fIoptions\fP] \fB\-i\fP \fIfilename\fP \fItargetIP\fP
 .SH DESCRIPTION
 .sp
 Powerful generator of DNS traffic, sending and receving packets through XDP.
@@ -94,7 +94,7 @@ Exit status of 0 means successful operation. Any other exit status indicates
 an error.
 .SH EXAMPLES
 .sp
-Queries file example:
+Queries file:
 .INDENT 0.0
 .INDENT 3.5
 .sp
@@ -111,13 +111,13 @@ abcd.example.com. DS D
 .UNINDENT
 .UNINDENT
 .sp
-xdp\-gun examples:
+Program usage:
 .INDENT 0.0
 .INDENT 3.5
 .sp
 .nf
 .ft C
-# xdp\-gun \-i ~/queries.txt 2001:1489:fffe:10::16
+# knot\-xdp\-gun \-i ~/queries.txt 2001:1489:fffe:10::16
 .ft P
 .fi
 .UNINDENT
@@ -127,7 +127,7 @@ xdp\-gun examples:
 .sp
 .nf
 .ft C
-# xdp\-gun \-t 120 \-Q 6000000 \-i ~/queries.txt \-b 5 \-r \-p 8853 192.168.101.2
+# knot\-xdp\-gun \-t 120 \-Q 6000000 \-i ~/queries.txt \-b 5 \-r \-p 8853 192.168.101.2
 .ft P
 .fi
 .UNINDENT
diff --git a/doc/man_xdp-gun.rst b/doc/man_knot-xdp-gun.rst
similarity index 86%
rename from doc/man_xdp-gun.rst
rename to doc/man_knot-xdp-gun.rst
index 82c22ef15d9fa8df8f60a4b379584280211dfc12..b53869fc308a1b4ad2e2266dd1c87d2512849e8e 100644
--- a/doc/man_xdp-gun.rst
+++ b/doc/man_knot-xdp-gun.rst
@@ -1,12 +1,12 @@
 .. highlight:: console
 
-xdp-gun – DNS benchmarking tool
-===============================
+knot-xdp-gun – DNS benchmarking tool
+====================================
 
 Synopsis
 --------
 
-:program:`xdp-gun` [*options*] **-i** *filename* *targetIP*
+:program:`knot-xdp-gun` [*options*] **-i** *filename* *targetIP*
 
 Description
 -----------
@@ -76,7 +76,7 @@ an error.
 Examples
 --------
 
-Queries file example::
+Queries file::
 
   abc6.example.com. AAAA
   nxdomain.example.com. A
@@ -85,13 +85,13 @@ Queries file example::
   ab.example.com. A D
   abcd.example.com. DS D
 
-xdp-gun examples::
+Program usage::
 
-  # xdp-gun -i ~/queries.txt 2001:1489:fffe:10::16
+  # knot-xdp-gun -i ~/queries.txt 2001:1489:fffe:10::16
 
 ::
 
-  # xdp-gun -t 120 -Q 6000000 -i ~/queries.txt -b 5 -r -p 8853 192.168.101.2
+  # knot-xdp-gun -t 120 -Q 6000000 -i ~/queries.txt -b 5 -r -p 8853 192.168.101.2
 
 See Also
 --------
diff --git a/doc/utilities.rst b/doc/utilities.rst
index 2cd34e36ad3059952b8e6721398fe6e6e971d590..3baf85c4690d27185ed6aa396ce9c32e670cecbd 100644
--- a/doc/utilities.rst
+++ b/doc/utilities.rst
@@ -19,4 +19,4 @@ the server. This section collects manual pages for all provided binaries:
    man_knsec3hash
    man_knsupdate
    man_kzonecheck
-   man_xdp-gun
+   man_knot-xdp-gun
diff --git a/src/utils/Makefile.inc b/src/utils/Makefile.inc
index 2f51ce5ca0aeb366dda133bf8e29d9d5aa62db49..33c4caf1c3edf0ffdcbb449504781931630c40d0 100644
--- a/src/utils/Makefile.inc
+++ b/src/utils/Makefile.inc
@@ -1,3 +1,6 @@
+bin_PROGRAMS =
+sbin_PROGRAMS =
+
 if HAVE_LIBUTILS
 noinst_LTLIBRARIES += libknotus.la
 
@@ -33,7 +36,7 @@ libknotus_la_SOURCES = \
 endif HAVE_LIBUTILS
 
 if HAVE_UTILS
-bin_PROGRAMS = kdig khost knsec3hash knsupdate
+bin_PROGRAMS += kdig khost knsec3hash knsupdate
 
 kdig_SOURCES = \
 	utils/kdig/kdig_exec.c			\
@@ -78,14 +81,14 @@ khost_LDADD            += $(DNSTAP_LIBS) libdnstap.la
 endif HAVE_DNSTAP
 
 if ENABLE_XDP
-bin_PROGRAMS += xdp-gun
-xdp_gun_SOURCES = \
-	utils/xdp-gun/load_queries.c		\
-	utils/xdp-gun/load_queries.h		\
-	utils/xdp-gun/main.c
-
-xdp_gun_CPPFLAGS       = $(AM_CPPFLAGS)
-xdp_gun_LDADD          = libcontrib.la libknot.la $(pthread_LIBS)
+sbin_PROGRAMS += knot-xdp-gun
+knot_xdp_gun_SOURCES = \
+	utils/knot-xdp-gun/load_queries.c	\
+	utils/knot-xdp-gun/load_queries.h	\
+	utils/knot-xdp-gun/main.c
+
+knot_xdp_gun_CPPFLAGS  = $(AM_CPPFLAGS)
+knot_xdp_gun_LDADD     = libcontrib.la libknot.la $(pthread_LIBS)
 endif ENABLE_XDP
 endif HAVE_UTILS
 
@@ -96,7 +99,7 @@ install-data-hook:
 	$(INSTALL) -d $(DESTDIR)/@run_dir@
 	$(INSTALL) -d $(DESTDIR)/@storage_dir@
 
-sbin_PROGRAMS = knotc knotd
+sbin_PROGRAMS += knotc knotd
 
 knotc_SOURCES = \
 	utils/knotc/commands.c			\
diff --git a/src/utils/xdp-gun/load_queries.c b/src/utils/knot-xdp-gun/load_queries.c
similarity index 100%
rename from src/utils/xdp-gun/load_queries.c
rename to src/utils/knot-xdp-gun/load_queries.c
diff --git a/src/utils/xdp-gun/load_queries.h b/src/utils/knot-xdp-gun/load_queries.h
similarity index 100%
rename from src/utils/xdp-gun/load_queries.h
rename to src/utils/knot-xdp-gun/load_queries.h
diff --git a/src/utils/xdp-gun/main.c b/src/utils/knot-xdp-gun/main.c
similarity index 96%
rename from src/utils/xdp-gun/main.c
rename to src/utils/knot-xdp-gun/main.c
index 0ddaec05ec5b536a29a7afedbe66f8f9f22f7f09..9797e0bbccd96d5b7b74772aecd18b6472b654ba 100644
--- a/src/utils/xdp-gun/main.c
+++ b/src/utils/knot-xdp-gun/main.c
@@ -41,9 +41,9 @@
 
 #include "load_queries.h"
 
-#define PROGRAM_NAME "xdp-gun"
+#define PROGRAM_NAME "knot-xdp-gun"
 
-volatile bool dns_xdp_trigger = false;
+volatile bool xdp_trigger = false;
 
 pthread_mutex_t global_mutex;
 uint64_t global_pkts_sent = 0;
@@ -64,9 +64,9 @@ typedef struct {
 	uint16_t	target_port;
 	uint32_t	listen_port; // KNOT_XDP_LISTEN_PORT_ALL, KNOT_XDP_LISTEN_PORT_DROP
 	unsigned	n_threads, thread_id;
-} dns_xdp_gun_ctx_t;
+} xdp_gun_ctx_t;
 
-const static dns_xdp_gun_ctx_t ctx_defaults = {
+const static xdp_gun_ctx_t ctx_defaults = {
 	.qps = 1000,
 	.duration = 5000000UL, // usecs
 	.at_once = 10,
@@ -124,7 +124,7 @@ static void next_payload(struct pkt_payload **payload, int increment)
 }
 
 static int alloc_pkts(knot_xdp_msg_t *pkts, int npkts, struct knot_xdp_socket *xsk,
-                      dns_xdp_gun_ctx_t *ctx, uint64_t tick, struct pkt_payload **payl)
+                      xdp_gun_ctx_t *ctx, uint64_t tick, struct pkt_payload **payl)
 {
 	uint64_t unique = (tick * ctx->n_threads + ctx->thread_id) * ctx->at_once;
 
@@ -157,9 +157,9 @@ static int alloc_pkts(knot_xdp_msg_t *pkts, int npkts, struct knot_xdp_socket *x
 	return KNOT_EOK;
 }
 
-void *dns_xdp_gun_thread(void *_ctx)
+void *xdp_gun_thread(void *_ctx)
 {
-	dns_xdp_gun_ctx_t *ctx = _ctx;
+	xdp_gun_ctx_t *ctx = _ctx;
 	struct knot_xdp_socket *xsk;
 	struct timespec timer;
 	knot_xdp_msg_t pkts[ctx->at_once];
@@ -176,7 +176,7 @@ void *dns_xdp_gun_thread(void *_ctx)
 
 	struct pollfd pfd = { knot_xdp_socket_fd(xsk), POLLIN, 0 };
 
-	while (!dns_xdp_trigger) {
+	while (!xdp_trigger) {
 		usleep(1000);
 	}
 
@@ -426,7 +426,7 @@ static int remoteIP2local(const char *ip_str, bool ipv6, char devname[], void *l
 	return ret;
 }
 
-static bool configure_target(char *target_str, dns_xdp_gun_ctx_t *ctx)
+static bool configure_target(char *target_str, xdp_gun_ctx_t *ctx)
 {
 	char *at = strrchr(target_str, '@');
 	int newport;
@@ -497,7 +497,7 @@ static void print_help(void) {
 	       "-i queries_file dest_ip\n", PROGRAM_NAME);
 }
 
-static bool get_opts(int argc, char *argv[], dns_xdp_gun_ctx_t *ctx)
+static bool get_opts(int argc, char *argv[], xdp_gun_ctx_t *ctx)
 {
 	struct option opts[] = {
 		{ "help",     no_argument,       NULL, 'h' },
@@ -585,7 +585,7 @@ static bool get_opts(int argc, char *argv[], dns_xdp_gun_ctx_t *ctx)
 
 int main(int argc, char *argv[])
 {
-	dns_xdp_gun_ctx_t ctx = ctx_defaults, *thread_ctxs = NULL;
+	xdp_gun_ctx_t ctx = ctx_defaults, *thread_ctxs = NULL;
 	pthread_t *threads = NULL;
 
 	if (!get_opts(argc, argv, &ctx)) {
@@ -620,13 +620,13 @@ int main(int argc, char *argv[])
 	pthread_mutex_init(&global_mutex, NULL);
 
 	for (size_t i = 0; i < ctx.n_threads; i++) {
-		pthread_create(&threads[i], NULL, dns_xdp_gun_thread, &thread_ctxs[i]);
+		pthread_create(&threads[i], NULL, xdp_gun_thread, &thread_ctxs[i]);
 		usleep((i + 1) * 10000);
 	}
 
-	dns_xdp_trigger = true;
+	xdp_trigger = true;
 	usleep(1000000);
-	dns_xdp_trigger = false;
+	xdp_trigger = false;
 
 	for (size_t i = 0; i < ctx.n_threads; i++) {
 		pthread_join(threads[i], NULL);