diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index ccd59ed378298f139c5998a7aa46df6e37a6bbdf..2ddef347eedc3dd8550623aa112b9fa039518f5e 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -634,4 +634,11 @@ obs:ubuntu1910:x86_64:
     OBS_REPO: knot-resolver-latest
     DISTROTEST_NAME: ubuntu1910
     DISTROTEST_REPO: xUbuntu_19.10
+
+obs:ubuntu2004:x86_64:
+  <<: *distrotest
+  variables:
+    OBS_REPO: knot-resolver-latest
+    DISTROTEST_NAME: ubuntu2004
+    DISTROTEST_REPO: xUbuntu_20.04
 # }}}
diff --git a/distro/tests/ubuntu2004/Vagrantfile b/distro/tests/ubuntu2004/Vagrantfile
new file mode 100644
index 0000000000000000000000000000000000000000..3b358b4c51541234e75492e8517229420befcb87
--- /dev/null
+++ b/distro/tests/ubuntu2004/Vagrantfile
@@ -0,0 +1,31 @@
+# SPDX-License-Identifier: GPL-3.0-or-later
+# -*- mode: ruby -*-
+# vi: set ft=ruby :
+#
+
+Vagrant.configure(2) do |config|
+
+    # TODO switch to generic/ubuntu2004 once available (has libvirt box as well)
+    config.vm.box = "ubuntu/focal64"
+    config.vm.synced_folder ".", "/vagrant", disabled: true
+
+    config.vm.define "ubuntu2004_knot-resolver"  do |machine|
+        machine.vm.provision "ansible" do |ansible|
+            ansible.playbook = "../knot-resolver-pkgtest.yaml"
+            ansible.extra_vars = {
+                ansible_python_interpreter: "/usr/bin/python3"
+            }
+        end
+    end
+
+    config.vm.provider :libvirt do |libvirt|
+      libvirt.cpus = 1
+      libvirt.memory = 1024
+    end
+
+    config.vm.provider :virtualbox do |vbox|
+      vbox.cpus = 1
+      vbox.memory = 1024
+    end
+
+end
diff --git a/distro/tests/ubuntu2004/ansible.cfg b/distro/tests/ubuntu2004/ansible.cfg
new file mode 120000
index 0000000000000000000000000000000000000000..f80698e88760a360f2336c04736a3ea261cc511d
--- /dev/null
+++ b/distro/tests/ubuntu2004/ansible.cfg
@@ -0,0 +1 @@
+../.ansible.cfg
\ No newline at end of file