diff --git a/Jenkinsfile b/Jenkinsfile
index 08c453d6f71fe60be244269e1a8a1798af4ee730..8494fcf02d2f6d804e9a26b5b649237821e57445 100644
--- a/Jenkinsfile
+++ b/Jenkinsfile
@@ -3,46 +3,100 @@
 // Note: To work on this script without having to push a commit each
 // time, use the jenkins-cli command (see:
 // https://wiki.savoirfairelinux.com/wiki/Jenkins.jami.net#Usage_CLI_de_Jenkins).
+//
+// Requirements:
+// 1. gerrit-trigger plugin
+// 2. ws-cleanup plugin
+// 3. ansicolor plugin
+
+// Configuration globals.
+def SUBMODULES = ['daemon', 'lrc', 'client-gnome', 'client-qt']
+def TARGETS = [:]
+def SSH_PRIVATE_KEY = '/var/lib/jenkins/.ssh/gplpriv'
+def REMOTE_HOST = env.SSH_HOST_DL_RING_CX
+def REMOTE_BASE_DIR = '/srv/repository/ring'
+def RING_PUBLIC_KEY_FINGERPRINT = 'A295D773307D25A33AE72F2F64CD5FA175348F84'
+def SNAPCRAFT_KEY = '/var/lib/jenkins/.snap/key'
+
 pipeline {
     agent {
         label 'guix'
     }
 
+    triggers {
+        gerrit customUrl: '',
+        gerritProjects: [
+            [branches: [[compareType: 'PLAIN', pattern: 'master']],
+             compareType: 'PLAIN',
+             disableStrictForbiddenFileVerification: false,
+             pattern: 'ring-project']],
+        triggerOnEvents: [
+            commentAddedContains('!build'),
+            patchsetCreated(excludeDrafts: true, excludeNoCodeChange: true,
+                            excludeTrivialRebase: true)]
+    }
+
+    options {
+        ansiColor('xterm')
+    }
+
     parameters {
         string(name: 'GERRIT_REFSPEC',
                defaultValue: 'refs/heads/master',
                description: 'The Gerrit refspec to fetch.')
-
-        booleanParam(name: 'BUILD_OWN_QT',
+        booleanParam(name: 'WITH_MANUAL_SUBMODULES',
                      defaultValue: false,
-                     description: 'Whether to build our own Qt packages.')
+                     description: 'Checkout the ' + SUBMODULES.join(', ') +
+                     ' submodules at their Git-recorded commit.  When left ' +
+                     'unticked (the default), checkout the submodules at ' +
+                     'their latest commit from their main remote branch.')
         booleanParam(name: 'BUILD_ARM',
                      defaultValue: false,
                      description: 'Whether to build ARM packages.')
+        booleanParam(name: 'DEPLOY',
+                     defaultValue: false,
+                     description: 'Whether and where to deploy packages.')
+        choice(name: 'CHANNEL',
+               choices: 'internal\nnightly\nstable',
+               description: 'The repository channel to deploy to. ' +
+               'Defaults to "internal".')
+        string(name: 'PACKAGING_TARGETS',
+               defaultValue: '',
+               description: 'A whitespace-separated list of packaging ' +
+               'targets, e.g. "debian_10 snap". ' +
+               'When left unspecified, all the packaging targets are built.')
     }
 
     environment {
-        TARBALLS = '/opt/ring-contrib' // set the cache directory
-    }
-
-    options {
-        ansiColor('xterm')
+        TARBALLS = '/var/cache/jami' // set the cache directory
     }
 
     stages {
         stage('Check configuration') {
-            when { not { expression { fileExists TARBALLS } } }
             steps {
-                error "The ${TARBALLS} directory does not exist. \
+                script {
+                    if (!fileExists(TARBALLS)) {
+                        error "The ${TARBALLS} directory does not exist. \
 See https://wiki.savoirfairelinux.com/wiki/Jenkins.jami.net#Configuration"
+                    }
+
+                    mountType = sh(script: "findmnt ${TARBALLS} -o fstype -n",
+                                   returnStdout: true)
+                    if (!(mountType =~ /^nfs/)) {
+                        error "The ${TARBALLS} directory is not mounted on NFS storage. \
+See https://wiki.savoirfairelinux.com/wiki/Jenkins.jami.net#Configuration_client_NFS"
+                    }
+                }
             }
         }
 
         stage('Fetch submodules') {
             steps {
-                echo 'Updating relevant submodules to their latest commit'
-                sh 'git submodule update --init --recursive --remote ' +
-                   'daemon lrc client-gnome client-qt'
+                echo 'Initializing submodules ' + SUBMODULES.join(', ') +
+                    (params.WITH_MANUAL_SUBMODULES ? '.' : ' to their latest commit.')
+                sh 'git submodule update --init --recursive' +
+                    (params.WITH_MANUAL_SUBMODULES ? ' ' : ' --remote ') +
+                    SUBMODULES.join(' ')
             }
         }
 
@@ -62,36 +116,41 @@ See https://wiki.savoirfairelinux.com/wiki/Jenkins.jami.net#Configuration"
         stage('Build packages') {
             environment {
                 DISABLE_CONTRIB_DOWNLOADS = 'TRUE'
-                // The following password is used to register with the
-                // RHEL subscription-manager tool, required to build on RHEL.
-                PASS = credentials('developers-redhat-com')
             }
             steps {
                 script {
-                    def targetsText = sh(script: 'make -s list-package-targets',
-                                         returnStdout: true)
-                    def targets = targetsText.split('\n')
-                    if (!params.BUILD_OWN_QT) {
-                        targets = targets.findAll { !it.endsWith('_qt') }
+                    def targetsText = params.PACKAGING_TARGETS.trim()
+                    if (!targetsText) {
+                        targetsText = sh(script: 'make -s list-package-targets',
+                                         returnStdout: true).trim()
                     }
+
+                    TARGETS = targetsText.split(/\s/)
                     if (!params.BUILD_ARM) {
-                        targets = targets.findAll { !(it =~ /_(armhf|arm64)$/) }
+                        TARGETS = TARGETS.findAll { !(it =~ /_(armhf|arm64)$/) }
                     }
+
                     def stages = [:]
 
-                    targets.each { target ->
+                    TARGETS.each { target ->
                         // Note: The stage calls are wrapped in closures, to
                         // delay their execution.
-                        stages["${target}"] =  {
-                            stage("${target}") {
+                        stages[target] =  {
+                            stage(target) {
                                 // Offload builds to different agents.
                                 node('linux-builder') {
                                     cleanWs()
                                     unstash 'release-tarball'
-                                    sh """
-                                       tar xf *.tar.gz --strip-components=1
-                                       make ${target}
-                                       """
+                                    catchError(buildResult: 'FAILURE',
+                                               stageResult: 'FAILURE') {
+                                        sh """
+                                           echo Building on node \$NODE_NAME
+                                           tar xf *.tar.gz --strip-components=1
+                                           make ${target}
+                                           """
+                                        stash(includes: 'packages/**',
+                                              name: target)
+                                    }
                                 }
                             }
                         }
@@ -100,5 +159,38 @@ See https://wiki.savoirfairelinux.com/wiki/Jenkins.jami.net#Configuration"
                 }
             }
         }
+        stage('Sign & deploy packages') {
+            agent {
+                label 'ring-buildmachine-02.mtl.sfl'
+            }
+
+            when {
+                expression {
+                    params.DEPLOY
+                }
+            }
+
+            steps {
+                script {
+                    TARGETS.each { target ->
+                        try {
+                            unstash target
+                        } catch (err) {
+                            echo "Failed to unstash ${target}, skipping..."
+                            return
+                        }
+                        echo "Deploying packages for ${target}..."
+                        sh """scripts/deploy-packages.sh \
+  --distribution=${target} \
+  --keyid="${RING_PUBLIC_KEY_FINGERPRINT}" \
+  --snapcraft-login="${SNAPCRAFT_KEY}" \
+  --remote-ssh-identity-file="${SSH_PRIVATE_KEY}" \
+  --remote-repository-location="${REMOTE_HOST}:${REMOTE_BASE_DIR}/${params.CHANNEL}" \
+  --remote-manual-download-location="${REMOTE_HOST}:${REMOTE_BASE_DIR}/manual-${params.CHANNEL}"
+"""
+                    }
+                }
+            }
+        }
     }
 }
diff --git a/Makefile b/Makefile
index d44c594058eb35b5b16c99c83419805972cafa0a..5e8cee2a09554c23a64a12892f66d1d1e8898e5e 100644
--- a/Makefile
+++ b/Makefile
@@ -16,6 +16,9 @@
 #
 .DEFAULT_GOAL := package-all
 
+# Default caching directory
+export TARBALLS ?= /var/cache/jami
+
 ##############################
 ## Version number variables ##
 ##############################
@@ -46,13 +49,13 @@ DEBIAN_VERSION:=$(RELEASE_VERSION)~dfsg1-1
 DEBIAN_DSC_FILENAME:=jami_$(DEBIAN_VERSION).dsc
 
 # Qt versions
-QT_MAJOR:=5
-QT_MINOR:=15
-QT_PATCH:=2
-QT_TARBALL_CHECKSUM:="3a530d1b243b5dec00bc54937455471aaa3e56849d2593edb8ded07228202240"
-DEBIAN_QT_VERSION:=$(QT_MAJOR).$(QT_MINOR).$(QT_PATCH)-1
-DEBIAN_QT_DSC_FILENAME:=libqt-jami_$(DEBIAN_QT_VERSION).dsc
-QT_JAMI_PREFIX:="/usr/lib/libqt-jami"
+QT_MAJOR := 5
+QT_MINOR := 15
+QT_PATCH := 2
+QT_TARBALL_CHECKSUM := 3a530d1b243b5dec00bc54937455471aaa3e56849d2593edb8ded07228202240
+DEBIAN_QT_VERSION := $(QT_MAJOR).$(QT_MINOR).$(QT_PATCH)-1
+DEBIAN_QT_DSC_FILENAME := libqt-jami_$(DEBIAN_QT_VERSION).dsc
+QT_JAMI_PREFIX := /usr/lib/libqt-jami
 
 #####################
 ## Other variables ##
@@ -65,6 +68,12 @@ CURRENT_GID:=$(shell id -g)
 ## Release tarball targets ##
 #############################
 .PHONY: release-tarball purge-release-tarballs portable-release-tarball
+# See: https://reproducible-builds.org/docs/archives/
+TAR_REPRODUCIBILITY_OPTIONS = \
+	--format=gnu \
+	--mtime=@1 \
+	--owner=root:0 \
+	--group=root:0
 
 # This file can be used when not wanting to invoke the tarball
 # producing machinery (which depends on the Git checkout), nor its
@@ -91,7 +100,7 @@ portable-release-tarball:
 	guix environment --container --network \
           --preserve=TARBALLS $(guix-share-tarball-arg) \
           --expose=/usr/bin/env \
-          --expose=$$SSL_CERT_FILE \
+          --expose=$$SSL_CERT_DIR=/etc/ssl/certs \
           --manifest=$(CURDIR)/guix/minimal-manifest.scm \
           -- $(MAKE) release-tarball
 
@@ -122,13 +131,15 @@ $(RELEASE_TARBALL_FILENAME): tarballs.manifest
 			| tar xf - -C $(TMPDIR)/ring-project); \
 	done
 # Create the base archive.
-	tar --create --file $(TMPDIR)/ring-project.tar $(TMPDIR)/ring-project \
-		--transform 's,.*/ring-project,ring-project,'
+	tar -cf $(TMPDIR)/ring-project.tar $(TMPDIR)/ring-project \
+	  --transform 's,.*/ring-project,ring-project,' \
+	  $(TAR_REPRODUCIBILITY_OPTIONS)
 # Append the cached tarballs listed in the manifest.
 	tar --append --file $(TMPDIR)/ring-project.tar \
-		--files-from $< \
-		--transform 's,^.*/,ring-project/daemon/contrib/tarballs/,'
-	gzip $(TMPDIR)/ring-project.tar
+	  --files-from $< \
+	  --transform 's,^.*/,ring-project/daemon/contrib/tarballs/,' \
+          $(TAR_REPRODUCIBILITY_OPTIONS)
+	gzip --no-name $(TMPDIR)/ring-project.tar
 	mv $(TMPDIR)/ring-project.tar.gz "$@"
 	rm -rf $(TMPDIR)
 else
@@ -141,10 +152,87 @@ endif
 ## Packaging targets ##
 #######################
 
-# Append the output of make-packaging-target to this Makefile
-# see Makefile.packaging.distro_targets
-$(shell scripts/make-packaging-target.py --generate-all > Makefile.packaging.distro_targets)
-include Makefile.packaging.distro_targets
+
+#
+# Traditionally built packages (in Docker containers).
+#
+DISTRIBUTIONS := \
+	debian_10 \
+	debian_11 \
+	debian_testing \
+	debian_unstable \
+	raspbian_10_armhf \
+	ubuntu_18.04 \
+	ubuntu_20.04 \
+	ubuntu_21.04 \
+	fedora_33 \
+	fedora_34 \
+	opensuse-leap_15.2 \
+	opensuse-leap_15.3 \
+	opensuse-tumbleweed \
+	snap
+
+IS_SHELL_INTERACTIVE := $(shell [ -t 0 ] && echo yes)
+
+# The following Make variable can be used to provide extra arguments
+# used with the 'docker run' commands invoked to build the packages.
+DOCKER_RUN_EXTRA_ARGS =
+
+# This function is used to produce the rules of the packaging targets
+# that rely on Docker.
+# Arg1: The name-version string of the distribution (e.g., ubuntu-18.04).
+# Arg2: Extra arguments to pass to 'docker build'.
+# Arg3: Extra arguments to pass to 'docker run'.
+define make-docker-package-target
+$(1)-docker-image-name := jami-packaging-$(1)
+$(1)-docker-image-file := .docker-image-$$($(1)-docker-image-name)
+$(1)-docker-run-command := docker run \
+  --rm --privileged --security-opt apparmor=docker-default \
+  -e RELEASE_VERSION="$(RELEASE_VERSION)" \
+  -e RELEASE_TARBALL_FILENAME="$(RELEASE_TARBALL_FILENAME)" \
+  -e DEBIAN_VERSION="$(DEBIAN_VERSION)" \
+  -e DEBIAN_QT_VERSION="$(DEBIAN_QT_VERSION)" \
+  -e CURRENT_UID="$(CURRENT_UID)" \
+  -e CURRENT_GID="$(CURRENT_GID)" \
+  -e DISTRIBUTION="$(1)" \
+  -e QT_JAMI_PREFIX="$(QT_JAMI_PREFIX)" \
+  -e QT_MAJOR="$(QT_MAJOR)" \
+  -e QT_MINOR="$(QT_MINOR)" \
+  -e QT_PATCH="$(QT_PATCH)" \
+  -e QT_TARBALL_CHECKSUM="$(QT_TARBALL_CHECKSUM)" \
+  -e FORCE_REBUILD_QT="$(FORCE_REBUILD_QT)" \
+  -e SNAP_PKG_NAME="$(or $(SNAP_PKG_NAME),jami)" \
+  -e TARBALLS="$(TARBALLS)" \
+  -v '$(TARBALLS)':'$(TARBALLS)' \
+  -v '$(CURDIR)/$(RELEASE_TARBALL_FILENAME)':'/src/$(RELEASE_TARBALL_FILENAME)' \
+  -v '$(CURDIR)/packages/$(1)':/opt/output \
+  -t $(and $(IS_SHELL_INTERACTIVE),-i) \
+  $(3) \
+  "$$($(1)-docker-image-name)"
+
+$$($(1)-docker-image-file): docker/Dockerfile_$(1)
+	docker build \
+	  -t $$($(1)-docker-image-name) \
+	  -f docker/Dockerfile_$(1) $(2) $(CURDIR) && \
+	touch "$$@"
+
+packages/$(1)/.packages-built: $(RELEASE_TARBALL_FILENAME) $$($(1)-docker-image-file)
+	mkdir -p "$$$$(dirname "$$@")" && \
+	$$($(1)-docker-run-command) && \
+	touch "$$@"
+
+.PHONY: $(1)
+$(1): packages/$(1)/.packages-built
+PACKAGE-TARGETS += $(1)
+
+.PHONY: $(1)-interactive
+$(1)-interactive: $(RELEASE_TARBALL_FILENAME) $$($(1)-docker-image-file)
+	$$($(1)-docker-run-command) bash
+
+endef
+
+$(foreach target,$(DISTRIBUTIONS),\
+	$(eval $(call make-docker-package-target,$(target))))
 
 package-all: $(PACKAGE-TARGETS)
 
diff --git a/build.py b/build.py
index d05a7298408dd3713f2962793e8e48b369de12ba..f0adde1d1733c348abd18fd8568c37275bf3d5a9 100755
--- a/build.py
+++ b/build.py
@@ -469,17 +469,17 @@ def run_run(args):
         'LD_LIBRARY_PATH', '') + ":install/lrc/lib"
 
     try:
-        dring_log = open("daemon.log", 'a')
-        dring_log.write('=== Starting daemon (%s) ===' %
+        jamid_log = open("daemon.log", 'a')
+        jamid_log.write('=== Starting daemon (%s) ===' %
                         time.strftime("%d/%m/%Y %H:%M:%S"))
-        dring_process = subprocess.Popen(
-            ["./install/daemon/lib/ring/dring", "-c", "-d"],
-            stdout=dring_log,
-            stderr=dring_log
+        jamid_process = subprocess.Popen(
+            ["./install/daemon/libexec/jamid", "-c", "-d"],
+            stdout=jamid_log,
+            stderr=jamid_log
         )
 
         with open('daemon.pid', 'w') as f:
-            f.write(str(dring_process.pid)+'\n')
+            f.write(str(jamid_process.pid)+'\n')
 
         client_suffix = ""
         if args.qt is not None:
@@ -501,10 +501,10 @@ def run_run(args):
             f.write(str(client_process.pid)+'\n')
 
         if args.debug:
-            subprocess.call(['gdb', './install/daemon/lib/ring/dring'])
+            subprocess.call(['gdb', './install/daemon/libexec/jamid'])
 
         if not args.background:
-            dring_process.wait()
+            jamid_process.wait()
             client_process.wait()
 
     except KeyboardInterrupt:
@@ -516,9 +516,9 @@ def run_run(args):
                 # Only kill the processes if they are running, as they could
                 # have been closed by the user.
                 print("Killing processes...")
-                dring_log.close()
-                if dring_process.poll() is None:
-                    dring_process.kill()
+                jamid_log.close()
+                if jamid_process.poll() is None:
+                    jamid_process.kill()
                 client_log.close()
                 if client_process.poll() is None:
                     client_process.kill()
diff --git a/client-android b/client-android
index 195212d0b3a9351a7ca9808cf0ec987c22d8f96f..0ba9cfd7f836af17ca6872e9e689b58b472b8427 160000
--- a/client-android
+++ b/client-android
@@ -1 +1 @@
-Subproject commit 195212d0b3a9351a7ca9808cf0ec987c22d8f96f
+Subproject commit 0ba9cfd7f836af17ca6872e9e689b58b472b8427
diff --git a/client-gnome b/client-gnome
index a3ae9fd07f296b282abdbaf5338750af583675a8..6dcd20b4489d303e8fcae996a4d83ab7c2e5d875 160000
--- a/client-gnome
+++ b/client-gnome
@@ -1 +1 @@
-Subproject commit a3ae9fd07f296b282abdbaf5338750af583675a8
+Subproject commit 6dcd20b4489d303e8fcae996a4d83ab7c2e5d875
diff --git a/client-ios b/client-ios
index a68931d4c1281c74c86d43a60714fc06a87fb010..ba96ab4f0d1529ad5386f8542d3d20f2ba0ea98a 160000
--- a/client-ios
+++ b/client-ios
@@ -1 +1 @@
-Subproject commit a68931d4c1281c74c86d43a60714fc06a87fb010
+Subproject commit ba96ab4f0d1529ad5386f8542d3d20f2ba0ea98a
diff --git a/client-macosx b/client-macosx
index 812d5506c3bcae5b9d184ead81e707bf97dc1268..c35095bb31662e5655e591f31ce1c85bb9ba29c2 160000
--- a/client-macosx
+++ b/client-macosx
@@ -1 +1 @@
-Subproject commit 812d5506c3bcae5b9d184ead81e707bf97dc1268
+Subproject commit c35095bb31662e5655e591f31ce1c85bb9ba29c2
diff --git a/client-qt b/client-qt
index 1f91576a0bf33c9d632595cf433d547d1f1d1e06..1ab4edb6cc510ce15d7965823ecc5b879d946a96 160000
--- a/client-qt
+++ b/client-qt
@@ -1 +1 @@
-Subproject commit 1f91576a0bf33c9d632595cf433d547d1f1d1e06
+Subproject commit 1ab4edb6cc510ce15d7965823ecc5b879d946a96
diff --git a/client-uwp b/client-uwp
index f15a1224786a83b507cbcab624fc41e9ea1bfb67..4b639e9a903931bab09292b4d93a4de6d531ae4c 160000
--- a/client-uwp
+++ b/client-uwp
@@ -1 +1 @@
-Subproject commit f15a1224786a83b507cbcab624fc41e9ea1bfb67
+Subproject commit 4b639e9a903931bab09292b4d93a4de6d531ae4c
diff --git a/daemon b/daemon
index 9ff4cf0b9ccc9e044ece2d6796612ef5eed53c5d..e8dbf2af93be10869bbc2688ccd09ef3f927f430 160000
--- a/daemon
+++ b/daemon
@@ -1 +1 @@
-Subproject commit 9ff4cf0b9ccc9e044ece2d6796612ef5eed53c5d
+Subproject commit e8dbf2af93be10869bbc2688ccd09ef3f927f430
diff --git a/docker/Dockerfile_debian_10 b/docker/Dockerfile_debian_10
index a96b009b769197a95e448747843ed1ac50c7cfe1..558458dd8630924a592ad5227396e5096f4df045 100644
--- a/docker/Dockerfile_debian_10
+++ b/docker/Dockerfile_debian_10
@@ -5,29 +5,17 @@ ENV DEBIAN_FRONTEND=noninteractive
 RUN apt-get clean
 RUN apt-get update && \
     apt-get install -y -o Acquire::Retries=10 \
-        ca-certificates \
         devscripts \
-        dirmngr \
-        gnupg \
+        equivs \
         wget
 
-RUN wget -O - https://dl.jami.net/public-key.gpg | \
-    tee /usr/share/keyrings/jami-archive-keyring.gpg > /dev/null
-RUN sh -c "echo 'deb [signed-by=/usr/share/keyrings/jami-archive-keyring.gpg] https://dl.jami.net/nightly/debian_10_qt/ jami main' > /etc/apt/sources.list.d/libqt-jami.list"
+ADD scripts/prebuild-package-debian.sh /opt/prebuild-package-debian.sh
 
-# add deb-src entries (needed for next step)
-RUN sed -n '/^deb\s/s//deb-src /p' /etc/apt/sources.list > /etc/apt/sources.list.d/deb-src.list
-RUN apt-get clean && apt-get update
+COPY packaging/rules/debian-qt/control /tmp/builddeps/debian/control
+RUN /opt/prebuild-package-debian.sh qt-deps
 
-COPY packaging/rules/debian/* /tmp/builddeps/debian/
-RUN cd /tmp/builddeps && \
-    apt-get update; \
-    mk-build-deps \
-        --remove --install \
-        --tool "apt-get -y --no-install-recommends -o Acquire::Retries=10" \
-        "debian/control"; \
-    cd / && rm -rf /tmp/builddeps
+COPY packaging/rules/debian/control /tmp/builddeps/debian/control
+RUN /opt/prebuild-package-debian.sh jami-deps
 
 ADD scripts/build-package-debian.sh /opt/build-package-debian.sh
-
-CMD /opt/build-package-debian.sh
+CMD ["/opt/build-package-debian.sh"]
diff --git a/docker/Dockerfile_debian_10_qt b/docker/Dockerfile_debian_10_qt
deleted file mode 100644
index 54e6b082072c2728eb26050b2bfe4118f6036f68..0000000000000000000000000000000000000000
--- a/docker/Dockerfile_debian_10_qt
+++ /dev/null
@@ -1,26 +0,0 @@
-FROM debian:buster
-
-ENV DEBIAN_FRONTEND=noninteractive
-
-RUN apt-get clean
-RUN apt-get update && \
-    apt-get install -y -o Acquire::Retries=10 \
-        devscripts \
-        wget
-
-# add/enable src repos (needed for next step)
-RUN sed -n '/^deb\s/s//deb-src /p' /etc/apt/sources.list > /etc/apt/sources.list.d/deb-src.list
-
-RUN apt-get clean && apt-get update
-COPY packaging/rules/debian-qt/* /tmp/builddeps/debian/
-RUN cd /tmp/builddeps && \
-    apt-get update; \
-    mk-build-deps \
-        --remove --install \
-        --tool "apt-get -y --no-install-recommends -o Acquire::Retries=10" \
-        "debian/control"; \
-    cd / && rm -rf /tmp/builddeps
-
-ADD scripts/build-package-debian-qt.sh /opt/build-package-debian-qt.sh
-
-CMD /opt/build-package-debian-qt.sh
diff --git a/docker/Dockerfile_debian_11 b/docker/Dockerfile_debian_11
new file mode 100644
index 0000000000000000000000000000000000000000..2169be2c718b67ca8c2c54ff01866eace85be7af
--- /dev/null
+++ b/docker/Dockerfile_debian_11
@@ -0,0 +1,21 @@
+FROM debian:bullseye
+
+ENV DEBIAN_FRONTEND=noninteractive
+
+RUN apt-get clean
+RUN apt-get update && \
+    apt-get install -y -o Acquire::Retries=10 \
+        devscripts \
+        equivs \
+        wget
+
+ADD scripts/prebuild-package-debian.sh /opt/prebuild-package-debian.sh
+
+COPY packaging/rules/debian-qt/control /tmp/builddeps/debian/control
+RUN /opt/prebuild-package-debian.sh qt-deps
+
+COPY packaging/rules/debian/control /tmp/builddeps/debian/control
+RUN /opt/prebuild-package-debian.sh jami-deps
+
+ADD scripts/build-package-debian.sh /opt/build-package-debian.sh
+CMD ["/opt/build-package-debian.sh"]
diff --git a/docker/Dockerfile_debian_testing b/docker/Dockerfile_debian_testing
index 9ddb8efed616babe032b1ff5055bdfed0e8a4325..f051e12f82908803b98b7573ca5514f66267d866 100644
--- a/docker/Dockerfile_debian_testing
+++ b/docker/Dockerfile_debian_testing
@@ -5,29 +5,17 @@ ENV DEBIAN_FRONTEND=noninteractive
 RUN apt-get clean
 RUN apt-get update && \
     apt-get install -y -o Acquire::Retries=10 \
-        ca-certificates \
         devscripts \
-        dirmngr \
-        gnupg \
+        equivs \
         wget
 
-RUN wget -O - https://dl.jami.net/public-key.gpg | \
-    tee /usr/share/keyrings/jami-archive-keyring.gpg > /dev/null
-RUN sh -c "echo 'deb [signed-by=/usr/share/keyrings/jami-archive-keyring.gpg] https://dl.jami.net/nightly/debian_testing_qt/ jami main' > /etc/apt/sources.list.d/libqt-jami.list"
+ADD scripts/prebuild-package-debian.sh /opt/prebuild-package-debian.sh
 
-# add deb-src entries (needed for next step)
-RUN sed -n '/^deb\s/s//deb-src /p' /etc/apt/sources.list > /etc/apt/sources.list.d/deb-src.list
-RUN apt-get clean && apt-get update
+COPY packaging/rules/debian-qt/control /tmp/builddeps/debian/control
+RUN /opt/prebuild-package-debian.sh qt-deps
 
-COPY packaging/rules/debian/* /tmp/builddeps/debian/
-RUN cd /tmp/builddeps && \
-    apt-get update; \
-    mk-build-deps \
-        --remove --install \
-        --tool "apt-get -y --no-install-recommends -o Acquire::Retries=10" \
-        "debian/control"; \
-    cd / && rm -rf /tmp/builddeps
+COPY packaging/rules/debian/control /tmp/builddeps/debian/control
+RUN /opt/prebuild-package-debian.sh jami-deps
 
 ADD scripts/build-package-debian.sh /opt/build-package-debian.sh
-
-CMD /opt/build-package-debian.sh
+CMD ["/opt/build-package-debian.sh"]
diff --git a/docker/Dockerfile_debian_testing_qt b/docker/Dockerfile_debian_testing_qt
deleted file mode 100644
index e06d03da21c636e75f39d0fc5dab3f6dd7426fa2..0000000000000000000000000000000000000000
--- a/docker/Dockerfile_debian_testing_qt
+++ /dev/null
@@ -1,26 +0,0 @@
-FROM debian:testing
-
-ENV DEBIAN_FRONTEND=noninteractive
-
-RUN apt-get clean
-RUN apt-get update && \
-    apt-get install -y -o Acquire::Retries=10 \
-        devscripts \
-        wget
-
-# add/enable src repos (needed for next step)
-RUN sed -n '/^deb\s/s//deb-src /p' /etc/apt/sources.list > /etc/apt/sources.list.d/deb-src.list
-
-RUN apt-get clean && apt-get update
-COPY packaging/rules/debian-qt/* /tmp/builddeps/debian/
-RUN cd /tmp/builddeps && \
-    apt-get update; \
-    mk-build-deps \
-        --remove --install \
-        --tool "apt-get -y --no-install-recommends -o Acquire::Retries=10" \
-        "debian/control"; \
-    cd / && rm -rf /tmp/builddeps
-
-ADD scripts/build-package-debian-qt.sh /opt/build-package-debian-qt.sh
-
-CMD /opt/build-package-debian-qt.sh
diff --git a/docker/Dockerfile_debian_unstable b/docker/Dockerfile_debian_unstable
index d7c23b4c701be3a2856abf8a3cbc1b427f913fff..766e6bb2cc0e06b40b74867b20f66a7a61214576 100644
--- a/docker/Dockerfile_debian_unstable
+++ b/docker/Dockerfile_debian_unstable
@@ -5,29 +5,17 @@ ENV DEBIAN_FRONTEND=noninteractive
 RUN apt-get clean
 RUN apt-get update && \
     apt-get install -y -o Acquire::Retries=10 \
-        ca-certificates \
         devscripts \
-        dirmngr \
-        gnupg \
+        equivs \
         wget
 
-RUN wget -O - https://dl.jami.net/public-key.gpg | \
-    tee /usr/share/keyrings/jami-archive-keyring.gpg > /dev/null
-RUN sh -c "echo 'deb [signed-by=/usr/share/keyrings/jami-archive-keyring.gpg] https://dl.jami.net/nightly/debian_unstable_qt/ jami main' > /etc/apt/sources.list.d/libqt-jami.list"
+ADD scripts/prebuild-package-debian.sh /opt/prebuild-package-debian.sh
 
-# add deb-src entries (needed for next step)
-RUN sed -n '/^deb\s/s//deb-src /p' /etc/apt/sources.list > /etc/apt/sources.list.d/deb-src.list
-RUN apt-get clean && apt-get update
+COPY packaging/rules/debian-qt/control /tmp/builddeps/debian/control
+RUN /opt/prebuild-package-debian.sh qt-deps
 
-COPY packaging/rules/debian/* /tmp/builddeps/debian/
-RUN cd /tmp/builddeps && \
-    apt-get update; \
-    mk-build-deps \
-        --remove --install \
-        --tool "apt-get -y --no-install-recommends -o Acquire::Retries=10" \
-        "debian/control"; \
-    cd / && rm -rf /tmp/builddeps
+COPY packaging/rules/debian/control /tmp/builddeps/debian/control
+RUN /opt/prebuild-package-debian.sh jami-deps
 
 ADD scripts/build-package-debian.sh /opt/build-package-debian.sh
-
-CMD /opt/build-package-debian.sh
+CMD ["/opt/build-package-debian.sh"]
diff --git a/docker/Dockerfile_debian_unstable_qt b/docker/Dockerfile_debian_unstable_qt
deleted file mode 100644
index 0412961dc4ecf8efd4362f3409f2ff478c589f10..0000000000000000000000000000000000000000
--- a/docker/Dockerfile_debian_unstable_qt
+++ /dev/null
@@ -1,26 +0,0 @@
-FROM debian:unstable
-
-ENV DEBIAN_FRONTEND=noninteractive
-
-RUN apt-get clean
-RUN apt-get update && \
-    apt-get install -y -o Acquire::Retries=10 \
-        devscripts \
-        wget
-
-# add/enable src repos (needed for next step)
-RUN sed -n '/^deb\s/s//deb-src /p' /etc/apt/sources.list > /etc/apt/sources.list.d/deb-src.list
-
-RUN apt-get clean && apt-get update
-COPY packaging/rules/debian-qt/* /tmp/builddeps/debian/
-RUN cd /tmp/builddeps && \
-    apt-get update; \
-    mk-build-deps \
-        --remove --install \
-        --tool "apt-get -y --no-install-recommends -o Acquire::Retries=10" \
-        "debian/control"; \
-    cd / && rm -rf /tmp/builddeps
-
-ADD scripts/build-package-debian-qt.sh /opt/build-package-debian-qt.sh
-
-CMD /opt/build-package-debian-qt.sh
diff --git a/docker/Dockerfile_fedora_32 b/docker/Dockerfile_fedora_32
deleted file mode 100644
index 14435f3ec9bc62da5ed9b928f793cabf97d8022e..0000000000000000000000000000000000000000
--- a/docker/Dockerfile_fedora_32
+++ /dev/null
@@ -1,79 +0,0 @@
-FROM fedora:32
-
-RUN dnf clean all
-
-RUN dnf install -y dnf-command\(builddep\) rpmdevtools && \
-    dnf install -y mock
-
-RUN dnf install -y \
-        git \
-        rpm-build \
-        tar \
-        make \
-        autoconf \
-        automake \
-        nasm \
-        cmake \
-        speexdsp-devel \
-        pulseaudio-libs-devel \
-        libcanberra-devel \
-        libcurl-devel \
-        libtool \
-        mesa-libgbm-devel \
-        mesa-dri-drivers \
-        dbus-devel \
-        expat-devel \
-        pcre-devel \
-        yaml-cpp-devel \
-        dbus-c++-devel \
-        dbus-devel \
-        libXext-devel \
-        libXfixes-devel \
-        yasm \
-        speex-devel \
-        gsm-devel \
-        chrpath \
-        check \
-        astyle \
-        uuid-c++-devel \
-        gettext-devel \
-        gcc-c++ \
-        which \
-        alsa-lib-devel \
-        systemd-devel \
-        libuuid-devel \
-        uuid-devel \
-        gnutls-devel \
-        nettle-devel \
-        opus-devel \
-        patch \
-        jsoncpp-devel \
-        libnatpmp-devel \
-        webkitgtk4-devel \
-        cryptopp-devel \
-        libva-devel \
-        libvdpau-devel \
-        msgpack-devel \
-        NetworkManager-libnm-devel \
-        openssl-devel \
-        openssl-static \
-        clutter-devel \
-        clutter-gtk-devel \
-        libappindicator-gtk3-devel \
-        libnotify-devel \
-        libupnp-devel \
-        qrencode-devel \
-        qt5-qtbase-devel \
-        qt5-qttools-devel \
-        qt5-qtdeclarative-devel \
-        qt5-qtquickcontrols \
-        qt5-qtquickcontrols2-devel \
-        qt5-qtmultimedia-devel \
-        qt5-qtsvg-devel \
-        qt5-qtwebengine-devel \
-        libargon2-devel \
-        sqlite-devel
-
-ADD scripts/build-package-rpm.sh /opt/build-package-rpm.sh
-
-CMD /opt/build-package-rpm.sh
diff --git a/docker/Dockerfile_fedora_33 b/docker/Dockerfile_fedora_33
index d207e97c1f44b7f13c43c89a0bae62b966fb582d..6a918fc21958507d09d7ff961dc7ba08e766e2c6 100644
--- a/docker/Dockerfile_fedora_33
+++ b/docker/Dockerfile_fedora_33
@@ -5,6 +5,8 @@ RUN dnf clean all
 RUN dnf install -y dnf-command\(builddep\) rpmdevtools && \
     dnf install -y mock
 
+RUN dnf groupinstall -y "X Software Development"
+
 RUN dnf install -y \
         git \
         rpm-build \
@@ -63,17 +65,29 @@ RUN dnf install -y \
         libnotify-devel \
         libupnp-devel \
         qrencode-devel \
-        qt5-qtbase-devel \
-        qt5-qttools-devel \
-        qt5-qtdeclarative-devel \
-        qt5-qtquickcontrols \
-        qt5-qtquickcontrols2-devel \
-        qt5-qtmultimedia-devel \
-        qt5-qtsvg-devel \
-        qt5-qtwebengine-devel \
         libargon2-devel \
+        libsndfile-devel \
+        libdrm \
+        gperf \
+        clang \
+        clang-devel \
+        nodejs \
+        bison \
+        flex \
+        nss-devel \
+        libxcb* \
+        libxkb* \
+        libXrender-devel \
+        xcb-util-* \
+        libX11-devel \
+        python2.7 \
+        xz \
+        xkeyboard-config \
+        libnotify \
+        wget \
+        libstdc++-static \
         sqlite-devel
 
 ADD scripts/build-package-rpm.sh /opt/build-package-rpm.sh
 
-CMD /opt/build-package-rpm.sh
+CMD ["/opt/build-package-rpm.sh"]
diff --git a/docker/Dockerfile_fedora_34 b/docker/Dockerfile_fedora_34
index 6a3fc2e520848b933011d32575a9b9c29d723980..b2529035d591bf5f300a1a416c0b050903046e9d 100644
--- a/docker/Dockerfile_fedora_34
+++ b/docker/Dockerfile_fedora_34
@@ -5,6 +5,8 @@ RUN dnf clean all
 RUN dnf install -y dnf-command\(builddep\) rpmdevtools && \
     dnf install -y mock
 
+RUN dnf groupinstall -y "X Software Development"
+
 RUN dnf install -y \
         git \
         rpm-build \
@@ -63,17 +65,29 @@ RUN dnf install -y \
         libnotify-devel \
         libupnp-devel \
         qrencode-devel \
-        qt5-qtbase-devel \
-        qt5-qttools-devel \
-        qt5-qtdeclarative-devel \
-        qt5-qtquickcontrols \
-        qt5-qtquickcontrols2-devel \
-        qt5-qtmultimedia-devel \
-        qt5-qtsvg-devel \
-        qt5-qtwebengine-devel \
         libargon2-devel \
+        libsndfile-devel \
+        libdrm \
+        gperf \
+        bison \
+        clang \
+        clang-devel \
+        nodejs \
+        flex \
+        nss-devel \
+        libxcb* \
+        libxkb* \
+        libX11-devel \
+        libXrender-devel \
+        xcb-util-* \
+        python2.7 \
+        xz \
+        xkeyboard-config \
+        libnotify \
+        wget \
+        libstdc++-static \
         sqlite-devel
 
 ADD scripts/build-package-rpm.sh /opt/build-package-rpm.sh
 
-CMD /opt/build-package-rpm.sh
+CMD ["/opt/build-package-rpm.sh"]
diff --git a/docker/Dockerfile_opensuse-leap_15.2 b/docker/Dockerfile_opensuse-leap_15.2
index a97e217003349f1138e245956e0bad67f776e42d..a334372a2c4d1d4b4ef34d4f2fc348ac7b0d8f52 100644
--- a/docker/Dockerfile_opensuse-leap_15.2
+++ b/docker/Dockerfile_opensuse-leap_15.2
@@ -96,4 +96,4 @@ RUN update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-8 50
 
 ADD scripts/build-package-rpm.sh  /opt/build-package-rpm.sh
 
-CMD /opt/build-package-rpm.sh
+CMD ["/opt/build-package-rpm.sh"]
diff --git a/docker/Dockerfile_opensuse-leap_15.3 b/docker/Dockerfile_opensuse-leap_15.3
new file mode 100644
index 0000000000000000000000000000000000000000..ca5bd38a407f5695794e1230e5f6260f8f08478b
--- /dev/null
+++ b/docker/Dockerfile_opensuse-leap_15.3
@@ -0,0 +1,99 @@
+FROM opensuse/leap:15.3
+
+RUN zypper --non-interactive install -y \
+        dnf \
+        dnf-command\(builddep\) \
+        rpmdevtools \
+        Mesa-dri-devel Mesa-dri \
+        git \
+        gcc8 \
+        gcc8-c++ \
+        rpm-build \
+        tar \
+        make \
+        autoconf \
+        automake \
+        cmake \
+        nasm \
+        speexdsp-devel \
+        libpulse-devel \
+        libcanberra-devel \
+        libcurl-devel \
+        libtool \
+        pcre-devel \
+        yaml-cpp-devel \
+        libdbus-c++-devel \
+        libXext-devel \
+        libXfixes-devel \
+        yasm \
+        speex-devel \
+        libgsm-devel \
+        chrpath \
+        check \
+        astyle \
+        gettext-devel \
+        gcc-c++ \
+        which \
+        alsa-lib-devel \
+        systemd-devel \
+        libuuid-devel \
+        uuid-devel \
+        gnutls-devel \
+        libopus-devel \
+        patch \
+        jsoncpp-devel \
+        webkit2gtk3-devel \
+        libcryptopp-devel \
+        libva-devel \
+        libvdpau-devel \
+        msgpack-devel \
+        clutter-devel \
+        openssl-devel \
+        clutter-gtk-devel \
+        libnma-devel \
+        libcryptopp-devel \
+        libdbus-c++-devel \
+        libexpat-devel \
+        gnome-icon-theme-symbolic \
+        libgsm-devel \
+        gtk3-devel \
+        libappindicator-devel \
+        sqlite-devel \
+        ffmpeg-4-libavutil-devel \
+        gtk3-devel\
+        qrencode-devel \
+        python3-python-dateutil \
+        libsndfile-devel \
+        libdrm \
+        gperf \
+        bison \
+        flex \
+        nodejs12 \
+        mozilla-nss-devel \
+        python-xml \
+        libxcb* \
+        libxkb* \
+        libX11-devel \
+        libXrender-devel \
+        libfreetype6 \
+        xcb-util-image-devel \
+        xcb-util-keysyms-devel \
+        xcb-util-renderutil-devel \
+        xcb-util-wm-devel \
+        xorg-x11-devel \
+        xz \
+        xkeyboard-config \
+        libnotify \
+        libQt5Sql-devel \
+        libQt5Gui-devel \
+        libqt5-qtbase-devel \
+        libqt5-qttools \
+        argon2-devel \
+        wget
+
+RUN update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-8 50
+RUN update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-8 50
+
+ADD scripts/build-package-rpm.sh  /opt/build-package-rpm.sh
+
+CMD ["/opt/build-package-rpm.sh"]
diff --git a/docker/Dockerfile_opensuse-tumbleweed b/docker/Dockerfile_opensuse-tumbleweed
index 606511f7a2283a5a85f657e73a1a1262938980d7..52a3b332d300a0eebf3b9a09331af5bb44b42832 100644
--- a/docker/Dockerfile_opensuse-tumbleweed
+++ b/docker/Dockerfile_opensuse-tumbleweed
@@ -101,4 +101,4 @@ RUN zypper --non-interactive install -y \
 
 ADD scripts/build-package-rpm.sh  /opt/build-package-rpm.sh
 
-CMD /opt/build-package-rpm.sh
+CMD ["/opt/build-package-rpm.sh"]
diff --git a/docker/Dockerfile_raspbian_10_armhf b/docker/Dockerfile_raspbian_10_armhf
index 44a6e26c16d92261b4583c7770e381b254b13325..b0cb8cf903f72fa69afd896504a0bdcb61b2b18a 100644
--- a/docker/Dockerfile_raspbian_10_armhf
+++ b/docker/Dockerfile_raspbian_10_armhf
@@ -79,4 +79,4 @@ RUN apt update && \
 
 ADD scripts/build-package-debian.sh /opt/build-package-debian.sh
 
-CMD /opt/build-package-debian.sh
+CMD ["/opt/build-package-debian.sh"]
diff --git a/docker/Dockerfile_rhel_8 b/docker/Dockerfile_rhel_8
deleted file mode 100644
index db5566d84f99d7bd179923630654b33a9f0a3928..0000000000000000000000000000000000000000
--- a/docker/Dockerfile_rhel_8
+++ /dev/null
@@ -1,85 +0,0 @@
-FROM docker.io/roboxes/rhel8
-
-ARG PASS
-ENV PASS=$PASS
-
-RUN subscription-manager register --username=jamisfl --password=$PASS
-RUN subscription-manager attach --auto
-RUN subscription-manager repos  --enable=codeready-builder-for-rhel-8-x86_64-rpms
-
-RUN dnf clean all
-RUN dnf install -y dnf-command\(builddep\) rpmdevtools  && \
-    dnf install -y mock
-
-RUN dnf install -y \
-        git \
-        rpm-build \
-        tar \
-        make \
-        autoconf \
-        automake \
-        nasm \
-        cmake \
-        speexdsp-devel \
-        pulseaudio-libs-devel \
-        libcanberra-devel \
-        libcurl-devel \
-        libtool \
-        mesa-libgbm-devel \
-        mesa-dri-drivers \
-        dbus-devel \
-        expat-devel \
-        pcre-devel \
-        yaml-cpp-devel \
-        dbus-c++-devel \
-        dbus-devel \
-        libXext-devel \
-        libXfixes-devel \
-        yasm \
-        speex-devel \
-        gsm-devel \
-        chrpath \
-        check \
-        astyle \
-        gettext-devel \
-        gcc-c++ \
-        libstdc++-static \
-        which \
-        alsa-lib-devel \
-        systemd-devel \
-        libuuid-devel \
-        uuid-devel \
-        gnutls-devel \
-        nettle-devel \
-        opus-devel \
-        patch \
-        jsoncpp-devel \
-        libnatpmp-devel \
-        webkitgtk4-devel \
-        cryptopp-devel \
-        libva-devel \
-        libvdpau-devel \
-        msgpack-devel \
-        NetworkManager-libnm-devel \
-        openssl-devel \
-        clutter-devel \
-        clutter-gtk-devel \
-        libappindicator-gtk3-devel \
-        libnotify-devel \
-        libupnp-devel \
-        qrencode-devel \
-        sqlite-devel \
-        libdrm \
-        gperf \
-        bison \
-        flex \
-        nodejs \
-        nss-devel \
-        kernel-headers \
-        python2 \
-        libargon2-devel \
-        wget
-
-ADD scripts/build-package-rpm.sh /opt/build-package-rpm.sh
-
-CMD /opt/build-package-rpm.sh
\ No newline at end of file
diff --git a/docker/Dockerfile_ubuntu_18.04 b/docker/Dockerfile_ubuntu_18.04
index b7d2ede170ebb5bb412f38ef92da6d13d77b9f6a..7eaec5585fa128a3237eea546233940041f9d0cf 100644
--- a/docker/Dockerfile_ubuntu_18.04
+++ b/docker/Dockerfile_ubuntu_18.04
@@ -5,35 +5,22 @@ ENV DEBIAN_FRONTEND=noninteractive
 RUN apt-get clean
 RUN apt-get update && \
     apt-get install -y -o Acquire::Retries=10 \
-        ca-certificates \
         devscripts \
-        dirmngr \
         equivs \
         gcc-8 \
         g++-8 \
-        gnupg \
         wget
 
-RUN wget -O - https://dl.jami.net/public-key.gpg | \
-    tee /usr/share/keyrings/jami-archive-keyring.gpg > /dev/null
-RUN sh -c "echo 'deb [signed-by=/usr/share/keyrings/jami-archive-keyring.gpg] https://dl.jami.net/nightly/ubuntu_18.04_qt/ jami main' > /etc/apt/sources.list.d/libqt-jami.list"
+ADD scripts/prebuild-package-debian.sh /opt/prebuild-package-debian.sh
 
-# add deb-src entries (needed for next step)
-RUN sed -n '/^deb\s/s//deb-src /p' /etc/apt/sources.list > /etc/apt/sources.list.d/deb-src.list
-RUN apt-get clean && apt-get update
+COPY packaging/rules/debian-qt/control /tmp/builddeps/debian/control
+RUN /opt/prebuild-package-debian.sh qt-deps
 
-COPY packaging/rules/debian/* /tmp/builddeps/debian/
-RUN cd /tmp/builddeps && \
-    apt-get update; \
-    mk-build-deps \
-        --remove --install \
-        --tool "apt-get -y --no-install-recommends -o Acquire::Retries=10" \
-        "debian/control"; \
-    cd / && rm -rf /tmp/builddeps
+COPY packaging/rules/debian/control /tmp/builddeps/debian/control
+RUN /opt/prebuild-package-debian.sh jami-deps
 
 RUN update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-8 50
 RUN update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-8 50
 
 ADD scripts/build-package-debian.sh /opt/build-package-debian.sh
-
-CMD /opt/build-package-debian.sh
+CMD ["/opt/build-package-debian.sh"]
diff --git a/docker/Dockerfile_ubuntu_18.04_qt b/docker/Dockerfile_ubuntu_18.04_qt
deleted file mode 100644
index 774f56f3afb4efe02501d98c272cf9c6b599e49c..0000000000000000000000000000000000000000
--- a/docker/Dockerfile_ubuntu_18.04_qt
+++ /dev/null
@@ -1,27 +0,0 @@
-FROM ubuntu:18.04
-
-ENV DEBIAN_FRONTEND=noninteractive
-
-RUN apt-get clean
-RUN apt-get update && \
-    apt-get install -y -o Acquire::Retries=10 \
-        devscripts \
-        equivs \
-        wget
-
-# add/enable src repos (needed for next step)
-RUN sed -n '/^deb\s/s//deb-src /p' /etc/apt/sources.list > /etc/apt/sources.list.d/deb-src.list
-
-RUN apt-get clean && apt-get update
-COPY packaging/rules/debian-qt/* /tmp/builddeps/debian/
-RUN cd /tmp/builddeps && \
-    apt-get update; \
-    mk-build-deps \
-        --remove --install \
-        --tool "apt-get -y --no-install-recommends -o Acquire::Retries=10" \
-        "debian/control"; \
-    cd / && rm -rf /tmp/builddeps
-
-ADD scripts/build-package-debian-qt.sh /opt/build-package-debian-qt.sh
-
-CMD /opt/build-package-debian-qt.sh
diff --git a/docker/Dockerfile_ubuntu_20.04 b/docker/Dockerfile_ubuntu_20.04
index e3adb9b7453b5b021ef81a9e86c9bda7a863a13c..a53807113e56104760a08582c71893f7033db88e 100644
--- a/docker/Dockerfile_ubuntu_20.04
+++ b/docker/Dockerfile_ubuntu_20.04
@@ -5,30 +5,17 @@ ENV DEBIAN_FRONTEND=noninteractive
 RUN apt-get clean
 RUN apt-get update && \
     apt-get install -y -o Acquire::Retries=10 \
-        ca-certificates \
         devscripts \
-        dirmngr \
         equivs \
-        gnupg \
         wget
 
-RUN wget -O - https://dl.jami.net/public-key.gpg | \
-    tee /usr/share/keyrings/jami-archive-keyring.gpg > /dev/null
-RUN sh -c "echo 'deb [signed-by=/usr/share/keyrings/jami-archive-keyring.gpg] https://dl.jami.net/nightly/ubuntu_20.04_qt/ jami main' > /etc/apt/sources.list.d/libqt-jami.list"
+ADD scripts/prebuild-package-debian.sh /opt/prebuild-package-debian.sh
 
-# add deb-src entries (needed for next step)
-RUN sed -n '/^deb\s/s//deb-src /p' /etc/apt/sources.list > /etc/apt/sources.list.d/deb-src.list
-RUN apt-get clean && apt-get update
+COPY packaging/rules/debian-qt/control /tmp/builddeps/debian/control
+RUN /opt/prebuild-package-debian.sh qt-deps
 
-COPY packaging/rules/debian/* /tmp/builddeps/debian/
-RUN cd /tmp/builddeps && \
-    apt-get update; \
-    mk-build-deps \
-        --remove --install \
-        --tool "apt-get -y --no-install-recommends -o Acquire::Retries=10" \
-        "debian/control"; \
-    cd / && rm -rf /tmp/builddeps
+COPY packaging/rules/debian/control /tmp/builddeps/debian/control
+RUN /opt/prebuild-package-debian.sh jami-deps
 
 ADD scripts/build-package-debian.sh /opt/build-package-debian.sh
-
-CMD /opt/build-package-debian.sh
+CMD ["/opt/build-package-debian.sh"]
diff --git a/docker/Dockerfile_ubuntu_20.04_qt b/docker/Dockerfile_ubuntu_20.04_qt
deleted file mode 100644
index 12b5fc510b7ddce6ec9a88935e65ae886e4d0957..0000000000000000000000000000000000000000
--- a/docker/Dockerfile_ubuntu_20.04_qt
+++ /dev/null
@@ -1,27 +0,0 @@
-FROM ubuntu:20.04
-
-ENV DEBIAN_FRONTEND=noninteractive
-
-RUN apt-get clean
-RUN apt-get update && \
-    apt-get install -y -o Acquire::Retries=10 \
-        devscripts \
-        equivs \
-        wget
-
-# add/enable src repos (needed for next step)
-RUN sed -n '/^deb\s/s//deb-src /p' /etc/apt/sources.list > /etc/apt/sources.list.d/deb-src.list
-
-RUN apt-get clean && apt-get update
-COPY packaging/rules/debian-qt/* /tmp/builddeps/debian/
-RUN cd /tmp/builddeps && \
-    apt-get update; \
-    mk-build-deps \
-        --remove --install \
-        --tool "apt-get -y --no-install-recommends -o Acquire::Retries=10" \
-        "debian/control"; \
-    cd / && rm -rf /tmp/builddeps
-
-ADD scripts/build-package-debian-qt.sh /opt/build-package-debian-qt.sh
-
-CMD /opt/build-package-debian-qt.sh
diff --git a/docker/Dockerfile_ubuntu_20.10 b/docker/Dockerfile_ubuntu_20.10
deleted file mode 100644
index db33b2937fb360396723c762a46e338b4a4f8270..0000000000000000000000000000000000000000
--- a/docker/Dockerfile_ubuntu_20.10
+++ /dev/null
@@ -1,34 +0,0 @@
-FROM ubuntu:20.10
-
-ENV DEBIAN_FRONTEND=noninteractive
-
-RUN apt-get clean
-RUN apt-get update && \
-    apt-get install -y -o Acquire::Retries=10 \
-        ca-certificates \
-        devscripts \
-        dirmngr \
-        equivs \
-        gnupg \
-        wget
-
-RUN wget -O - https://dl.jami.net/public-key.gpg | \
-    tee /usr/share/keyrings/jami-archive-keyring.gpg > /dev/null
-RUN sh -c "echo 'deb [signed-by=/usr/share/keyrings/jami-archive-keyring.gpg] https://dl.jami.net/nightly/ubuntu_20.10_qt/ jami main' > /etc/apt/sources.list.d/libqt-jami.list"
-
-# add deb-src entries (needed for next step)
-RUN sed -n '/^deb\s/s//deb-src /p' /etc/apt/sources.list > /etc/apt/sources.list.d/deb-src.list
-RUN apt-get clean && apt-get update
-
-COPY packaging/rules/debian/* /tmp/builddeps/debian/
-RUN cd /tmp/builddeps && \
-    apt-get update; \
-    mk-build-deps \
-        --remove --install \
-        --tool "apt-get -y --no-install-recommends -o Acquire::Retries=10" \
-        "debian/control"; \
-    cd / && rm -rf /tmp/builddeps
-
-ADD scripts/build-package-debian.sh /opt/build-package-debian.sh
-
-CMD /opt/build-package-debian.sh
diff --git a/docker/Dockerfile_ubuntu_20.10_qt b/docker/Dockerfile_ubuntu_20.10_qt
deleted file mode 100644
index 46adee1df9f87226dfc5723b0cfd31a10cd12cf5..0000000000000000000000000000000000000000
--- a/docker/Dockerfile_ubuntu_20.10_qt
+++ /dev/null
@@ -1,27 +0,0 @@
-FROM ubuntu:20.10
-
-ENV DEBIAN_FRONTEND=noninteractive
-
-RUN apt-get clean
-RUN apt-get update && \
-    apt-get install -y -o Acquire::Retries=10 \
-        devscripts \
-        equivs \
-        wget
-
-# add/enable src repos (needed for next step)
-RUN sed -n '/^deb\s/s//deb-src /p' /etc/apt/sources.list > /etc/apt/sources.list.d/deb-src.list
-
-RUN apt-get clean && apt-get update
-COPY packaging/rules/debian-qt/* /tmp/builddeps/debian/
-RUN cd /tmp/builddeps && \
-    apt-get update; \
-    mk-build-deps \
-        --remove --install \
-        --tool "apt-get -y --no-install-recommends -o Acquire::Retries=10" \
-        "debian/control"; \
-    cd / && rm -rf /tmp/builddeps
-
-ADD scripts/build-package-debian-qt.sh /opt/build-package-debian-qt.sh
-
-CMD /opt/build-package-debian-qt.sh
diff --git a/docker/Dockerfile_ubuntu_21.04 b/docker/Dockerfile_ubuntu_21.04
index cf604f3cd5702ca18a0ad47f9b19f44ba3bd2624..00615d45626deb0c9319e3dc059f9d3f961f5b1b 100644
--- a/docker/Dockerfile_ubuntu_21.04
+++ b/docker/Dockerfile_ubuntu_21.04
@@ -5,30 +5,17 @@ ENV DEBIAN_FRONTEND=noninteractive
 RUN apt-get clean
 RUN apt-get update && \
     apt-get install -y -o Acquire::Retries=10 \
-        ca-certificates \
         devscripts \
-        dirmngr \
         equivs \
-        gnupg \
         wget
 
-RUN wget -O - https://dl.jami.net/public-key.gpg | \
-    tee /usr/share/keyrings/jami-archive-keyring.gpg > /dev/null
-RUN sh -c "echo 'deb [signed-by=/usr/share/keyrings/jami-archive-keyring.gpg] https://dl.jami.net/nightly/ubuntu_21.04_qt/ jami main' > /etc/apt/sources.list.d/libqt-jami.list"
+ADD scripts/prebuild-package-debian.sh /opt/prebuild-package-debian.sh
 
-# add deb-src entries (needed for next step)
-RUN sed -n '/^deb\s/s//deb-src /p' /etc/apt/sources.list > /etc/apt/sources.list.d/deb-src.list
-RUN apt-get clean && apt-get update
+COPY packaging/rules/debian-qt/control /tmp/builddeps/debian/control
+RUN /opt/prebuild-package-debian.sh qt-deps
 
-COPY packaging/rules/debian/* /tmp/builddeps/debian/
-RUN cd /tmp/builddeps && \
-    apt-get update; \
-    mk-build-deps \
-        --remove --install \
-        --tool "apt-get -y --no-install-recommends -o Acquire::Retries=10" \
-        "debian/control"; \
-    cd / && rm -rf /tmp/builddeps
+COPY packaging/rules/debian/control /tmp/builddeps/debian/control
+RUN /opt/prebuild-package-debian.sh jami-deps
 
 ADD scripts/build-package-debian.sh /opt/build-package-debian.sh
-
-CMD /opt/build-package-debian.sh
\ No newline at end of file
+CMD ["/opt/build-package-debian.sh"]
diff --git a/docker/Dockerfile_ubuntu_21.04_qt b/docker/Dockerfile_ubuntu_21.04_qt
deleted file mode 100644
index 0ea99c89f26cf15874dca2239ddfc3b108d11cfa..0000000000000000000000000000000000000000
--- a/docker/Dockerfile_ubuntu_21.04_qt
+++ /dev/null
@@ -1,27 +0,0 @@
-FROM ubuntu:21.04
-
-ENV DEBIAN_FRONTEND=noninteractive
-
-RUN apt-get clean
-RUN apt-get update && \
-    apt-get install -y -o Acquire::Retries=10 \
-        devscripts \
-        equivs \
-        wget
-
-# add/enable src repos (needed for next step)
-RUN sed -n '/^deb\s/s//deb-src /p' /etc/apt/sources.list > /etc/apt/sources.list.d/deb-src.list
-
-RUN apt-get clean && apt-get update
-COPY packaging/rules/debian-qt/* /tmp/builddeps/debian/
-RUN cd /tmp/builddeps && \
-    apt-get update; \
-    mk-build-deps \
-        --remove --install \
-        --tool "apt-get -y --no-install-recommends -o Acquire::Retries=10" \
-        "debian/control"; \
-    cd / && rm -rf /tmp/builddeps
-
-ADD scripts/build-package-debian-qt.sh /opt/build-package-debian-qt.sh
-
-CMD /opt/build-package-debian-qt.sh
diff --git a/docker/profile-seccomp-fedora_28.json b/docker/profile-seccomp-fedora_28.json
deleted file mode 100644
index 3eee93129b1ecb61330e3ef9529cb1b101f1bf49..0000000000000000000000000000000000000000
--- a/docker/profile-seccomp-fedora_28.json
+++ /dev/null
@@ -1,751 +0,0 @@
-{
-	"defaultAction": "SCMP_ACT_ERRNO",
-	"archMap": [
-		{
-			"architecture": "SCMP_ARCH_X86_64",
-			"subArchitectures": [
-				"SCMP_ARCH_X86",
-				"SCMP_ARCH_X32"
-			]
-		},
-		{
-			"architecture": "SCMP_ARCH_AARCH64",
-			"subArchitectures": [
-				"SCMP_ARCH_ARM"
-			]
-		},
-		{
-			"architecture": "SCMP_ARCH_MIPS64",
-			"subArchitectures": [
-				"SCMP_ARCH_MIPS",
-				"SCMP_ARCH_MIPS64N32"
-			]
-		},
-		{
-			"architecture": "SCMP_ARCH_MIPS64N32",
-			"subArchitectures": [
-				"SCMP_ARCH_MIPS",
-				"SCMP_ARCH_MIPS64"
-			]
-		},
-		{
-			"architecture": "SCMP_ARCH_MIPSEL64",
-			"subArchitectures": [
-				"SCMP_ARCH_MIPSEL",
-				"SCMP_ARCH_MIPSEL64N32"
-			]
-		},
-		{
-			"architecture": "SCMP_ARCH_MIPSEL64N32",
-			"subArchitectures": [
-				"SCMP_ARCH_MIPSEL",
-				"SCMP_ARCH_MIPSEL64"
-			]
-		},
-		{
-			"architecture": "SCMP_ARCH_S390X",
-			"subArchitectures": [
-				"SCMP_ARCH_S390"
-			]
-		}
-	],
-	"syscalls": [
-		{
-			"names": [
-				"accept",
-				"accept4",
-				"access",
-				"adjtimex",
-				"alarm",
-				"bind",
-				"brk",
-				"capget",
-				"capset",
-				"chdir",
-				"chmod",
-				"chown",
-				"chown32",
-				"clock_getres",
-				"clock_gettime",
-				"clock_nanosleep",
-				"close",
-				"connect",
-				"copy_file_range",
-				"creat",
-				"dup",
-				"dup2",
-				"dup3",
-				"epoll_create",
-				"epoll_create1",
-				"epoll_ctl",
-				"epoll_ctl_old",
-				"epoll_pwait",
-				"epoll_wait",
-				"epoll_wait_old",
-				"eventfd",
-				"eventfd2",
-				"execve",
-				"execveat",
-				"exit",
-				"exit_group",
-				"faccessat",
-				"fadvise64",
-				"fadvise64_64",
-				"fallocate",
-				"fanotify_mark",
-				"fchdir",
-				"fchmod",
-				"fchmodat",
-				"fchown",
-				"fchown32",
-				"fchownat",
-				"fcntl",
-				"fcntl64",
-				"fdatasync",
-				"fgetxattr",
-				"flistxattr",
-				"flock",
-				"fork",
-				"fremovexattr",
-				"fsetxattr",
-				"fstat",
-				"fstat64",
-				"fstatat64",
-				"fstatfs",
-				"fstatfs64",
-				"fsync",
-				"ftruncate",
-				"ftruncate64",
-				"futex",
-				"futimesat",
-				"getcpu",
-				"getcwd",
-				"getdents",
-				"getdents64",
-				"getegid",
-				"getegid32",
-				"geteuid",
-				"geteuid32",
-				"getgid",
-				"getgid32",
-				"getgroups",
-				"getgroups32",
-				"getitimer",
-				"getpeername",
-				"getpgid",
-				"getpgrp",
-				"getpid",
-				"getppid",
-				"getpriority",
-				"getrandom",
-				"getresgid",
-				"getresgid32",
-				"getresuid",
-				"getresuid32",
-				"getrlimit",
-				"get_robust_list",
-				"getrusage",
-				"getsid",
-				"getsockname",
-				"getsockopt",
-				"get_thread_area",
-				"gettid",
-				"gettimeofday",
-				"getuid",
-				"getuid32",
-				"getxattr",
-				"inotify_add_watch",
-				"inotify_init",
-				"inotify_init1",
-				"inotify_rm_watch",
-				"io_cancel",
-				"ioctl",
-				"io_destroy",
-				"io_getevents",
-				"ioprio_get",
-				"ioprio_set",
-				"io_setup",
-				"io_submit",
-				"ipc",
-				"kill",
-				"lchown",
-				"lchown32",
-				"lgetxattr",
-				"link",
-				"linkat",
-				"listen",
-				"listxattr",
-				"llistxattr",
-				"_llseek",
-				"lremovexattr",
-				"lseek",
-				"lsetxattr",
-				"lstat",
-				"lstat64",
-				"madvise",
-				"memfd_create",
-				"mincore",
-				"mkdir",
-				"mkdirat",
-				"mknod",
-				"mknodat",
-				"mlock",
-				"mlock2",
-				"mlockall",
-				"mmap",
-				"mmap2",
-				"mprotect",
-				"mq_getsetattr",
-				"mq_notify",
-				"mq_open",
-				"mq_timedreceive",
-				"mq_timedsend",
-				"mq_unlink",
-				"mremap",
-				"msgctl",
-				"msgget",
-				"msgrcv",
-				"msgsnd",
-				"msync",
-				"munlock",
-				"munlockall",
-				"munmap",
-				"nanosleep",
-				"newfstatat",
-				"_newselect",
-				"open",
-				"openat",
-				"pause",
-				"pipe",
-				"pipe2",
-				"poll",
-				"ppoll",
-				"prctl",
-				"pread64",
-				"preadv",
-				"preadv2",
-				"prlimit64",
-				"pselect6",
-				"pwrite64",
-				"pwritev",
-				"pwritev2",
-				"read",
-				"readahead",
-				"readlink",
-				"readlinkat",
-				"readv",
-				"recv",
-				"recvfrom",
-				"recvmmsg",
-				"recvmsg",
-				"remap_file_pages",
-				"removexattr",
-				"rename",
-				"renameat",
-				"renameat2",
-				"restart_syscall",
-				"rmdir",
-				"rt_sigaction",
-				"rt_sigpending",
-				"rt_sigprocmask",
-				"rt_sigqueueinfo",
-				"rt_sigreturn",
-				"rt_sigsuspend",
-				"rt_sigtimedwait",
-				"rt_tgsigqueueinfo",
-				"sched_getaffinity",
-				"sched_getattr",
-				"sched_getparam",
-				"sched_get_priority_max",
-				"sched_get_priority_min",
-				"sched_getscheduler",
-				"sched_rr_get_interval",
-				"sched_setaffinity",
-				"sched_setattr",
-				"sched_setparam",
-				"sched_setscheduler",
-				"sched_yield",
-				"seccomp",
-				"select",
-				"semctl",
-				"semget",
-				"semop",
-				"semtimedop",
-				"send",
-				"sendfile",
-				"sendfile64",
-				"sendmmsg",
-				"sendmsg",
-				"sendto",
-				"setfsgid",
-				"setfsgid32",
-				"setfsuid",
-				"setfsuid32",
-				"setgid",
-				"setgid32",
-				"setgroups",
-				"setgroups32",
-				"setitimer",
-				"setpgid",
-				"setpriority",
-				"setregid",
-				"setregid32",
-				"setresgid",
-				"setresgid32",
-				"setresuid",
-				"setresuid32",
-				"setreuid",
-				"setreuid32",
-				"setrlimit",
-				"set_robust_list",
-				"setsid",
-				"setsockopt",
-				"set_thread_area",
-				"set_tid_address",
-				"setuid",
-				"setuid32",
-				"setxattr",
-				"shmat",
-				"shmctl",
-				"shmdt",
-				"shmget",
-				"shutdown",
-				"sigaltstack",
-				"signalfd",
-				"signalfd4",
-				"sigreturn",
-				"socket",
-				"socketcall",
-				"socketpair",
-				"splice",
-        "stat",
-				"stat64",
-				"statfs",
-				"statfs64",
-        "statx",
-				"symlink",
-				"symlinkat",
-				"sync",
-				"sync_file_range",
-				"syncfs",
-				"sysinfo",
-				"syslog",
-				"tee",
-				"tgkill",
-				"time",
-				"timer_create",
-				"timer_delete",
-				"timerfd_create",
-				"timerfd_gettime",
-				"timerfd_settime",
-				"timer_getoverrun",
-				"timer_gettime",
-				"timer_settime",
-				"times",
-				"tkill",
-				"truncate",
-				"truncate64",
-				"ugetrlimit",
-				"umask",
-				"uname",
-				"unlink",
-				"unlinkat",
-				"utime",
-				"utimensat",
-				"utimes",
-				"vfork",
-				"vmsplice",
-				"wait4",
-				"waitid",
-				"waitpid",
-				"write",
-				"writev"
-			],
-			"action": "SCMP_ACT_ALLOW",
-			"args": [],
-			"comment": "",
-			"includes": {},
-			"excludes": {}
-		},
-		{
-			"names": [
-				"personality"
-			],
-			"action": "SCMP_ACT_ALLOW",
-			"args": [
-				{
-					"index": 0,
-					"value": 0,
-					"valueTwo": 0,
-					"op": "SCMP_CMP_EQ"
-				}
-			],
-			"comment": "",
-			"includes": {},
-			"excludes": {}
-		},
-		{
-			"names": [
-				"personality"
-			],
-			"action": "SCMP_ACT_ALLOW",
-			"args": [
-				{
-					"index": 0,
-					"value": 8,
-					"valueTwo": 0,
-					"op": "SCMP_CMP_EQ"
-				}
-			],
-			"comment": "",
-			"includes": {},
-			"excludes": {}
-		},
-		{
-			"names": [
-				"personality"
-			],
-			"action": "SCMP_ACT_ALLOW",
-			"args": [
-				{
-					"index": 0,
-					"value": 131072,
-					"valueTwo": 0,
-					"op": "SCMP_CMP_EQ"
-				}
-			],
-			"comment": "",
-			"includes": {},
-			"excludes": {}
-		},
-		{
-			"names": [
-				"personality"
-			],
-			"action": "SCMP_ACT_ALLOW",
-			"args": [
-				{
-					"index": 0,
-					"value": 131080,
-					"valueTwo": 0,
-					"op": "SCMP_CMP_EQ"
-				}
-			],
-			"comment": "",
-			"includes": {},
-			"excludes": {}
-		},
-		{
-			"names": [
-				"personality"
-			],
-			"action": "SCMP_ACT_ALLOW",
-			"args": [
-				{
-					"index": 0,
-					"value": 4294967295,
-					"valueTwo": 0,
-					"op": "SCMP_CMP_EQ"
-				}
-			],
-			"comment": "",
-			"includes": {},
-			"excludes": {}
-		},
-		{
-			"names": [
-				"sync_file_range2"
-			],
-			"action": "SCMP_ACT_ALLOW",
-			"args": [],
-			"comment": "",
-			"includes": {
-				"arches": [
-					"ppc64le"
-				]
-			},
-			"excludes": {}
-		},
-		{
-			"names": [
-				"arm_fadvise64_64",
-				"arm_sync_file_range",
-				"sync_file_range2",
-				"breakpoint",
-				"cacheflush",
-				"set_tls"
-			],
-			"action": "SCMP_ACT_ALLOW",
-			"args": [],
-			"comment": "",
-			"includes": {
-				"arches": [
-					"arm",
-					"arm64"
-				]
-			},
-			"excludes": {}
-		},
-		{
-			"names": [
-				"arch_prctl"
-			],
-			"action": "SCMP_ACT_ALLOW",
-			"args": [],
-			"comment": "",
-			"includes": {
-				"arches": [
-					"amd64",
-					"x32"
-				]
-			},
-			"excludes": {}
-		},
-		{
-			"names": [
-				"modify_ldt"
-			],
-			"action": "SCMP_ACT_ALLOW",
-			"args": [],
-			"comment": "",
-			"includes": {
-				"arches": [
-					"amd64",
-					"x32",
-					"x86"
-				]
-			},
-			"excludes": {}
-		},
-		{
-			"names": [
-				"s390_pci_mmio_read",
-				"s390_pci_mmio_write",
-				"s390_runtime_instr"
-			],
-			"action": "SCMP_ACT_ALLOW",
-			"args": [],
-			"comment": "",
-			"includes": {
-				"arches": [
-					"s390",
-					"s390x"
-				]
-			},
-			"excludes": {}
-		},
-		{
-			"names": [
-				"open_by_handle_at"
-			],
-			"action": "SCMP_ACT_ALLOW",
-			"args": [],
-			"comment": "",
-			"includes": {
-				"caps": [
-					"CAP_DAC_READ_SEARCH"
-				]
-			},
-			"excludes": {}
-		},
-		{
-			"names": [
-				"bpf",
-				"clone",
-				"fanotify_init",
-				"lookup_dcookie",
-				"mount",
-				"name_to_handle_at",
-				"perf_event_open",
-				"quotactl",
-				"setdomainname",
-				"sethostname",
-				"setns",
-				"umount",
-				"umount2",
-				"unshare"
-			],
-			"action": "SCMP_ACT_ALLOW",
-			"args": [],
-			"comment": "",
-			"includes": {
-				"caps": [
-					"CAP_SYS_ADMIN"
-				]
-			},
-			"excludes": {}
-		},
-		{
-			"names": [
-				"clone"
-			],
-			"action": "SCMP_ACT_ALLOW",
-			"args": [
-				{
-					"index": 0,
-					"value": 2080505856,
-					"valueTwo": 0,
-					"op": "SCMP_CMP_MASKED_EQ"
-				}
-			],
-			"comment": "",
-			"includes": {},
-			"excludes": {
-				"caps": [
-					"CAP_SYS_ADMIN"
-				],
-				"arches": [
-					"s390",
-					"s390x"
-				]
-			}
-		},
-		{
-			"names": [
-				"clone"
-			],
-			"action": "SCMP_ACT_ALLOW",
-			"args": [
-				{
-					"index": 1,
-					"value": 2080505856,
-					"valueTwo": 0,
-					"op": "SCMP_CMP_MASKED_EQ"
-				}
-			],
-			"comment": "s390 parameter ordering for clone is different",
-			"includes": {
-				"arches": [
-					"s390",
-					"s390x"
-				]
-			},
-			"excludes": {
-				"caps": [
-					"CAP_SYS_ADMIN"
-				]
-			}
-		},
-		{
-			"names": [
-				"reboot"
-			],
-			"action": "SCMP_ACT_ALLOW",
-			"args": [],
-			"comment": "",
-			"includes": {
-				"caps": [
-					"CAP_SYS_BOOT"
-				]
-			},
-			"excludes": {}
-		},
-		{
-			"names": [
-				"chroot"
-			],
-			"action": "SCMP_ACT_ALLOW",
-			"args": [],
-			"comment": "",
-			"includes": {
-				"caps": [
-					"CAP_SYS_CHROOT"
-				]
-			},
-			"excludes": {}
-		},
-		{
-			"names": [
-				"delete_module",
-				"init_module",
-				"finit_module",
-				"query_module"
-			],
-			"action": "SCMP_ACT_ALLOW",
-			"args": [],
-			"comment": "",
-			"includes": {
-				"caps": [
-					"CAP_SYS_MODULE"
-				]
-			},
-			"excludes": {}
-		},
-		{
-			"names": [
-				"acct"
-			],
-			"action": "SCMP_ACT_ALLOW",
-			"args": [],
-			"comment": "",
-			"includes": {
-				"caps": [
-					"CAP_SYS_PACCT"
-				]
-			},
-			"excludes": {}
-		},
-		{
-			"names": [
-				"kcmp",
-				"process_vm_readv",
-				"process_vm_writev",
-				"ptrace"
-			],
-			"action": "SCMP_ACT_ALLOW",
-			"args": [],
-			"comment": "",
-			"includes": {
-				"caps": [
-					"CAP_SYS_PTRACE"
-				]
-			},
-			"excludes": {}
-		},
-		{
-			"names": [
-				"iopl",
-				"ioperm"
-			],
-			"action": "SCMP_ACT_ALLOW",
-			"args": [],
-			"comment": "",
-			"includes": {
-				"caps": [
-					"CAP_SYS_RAWIO"
-				]
-			},
-			"excludes": {}
-		},
-		{
-			"names": [
-				"settimeofday",
-				"stime",
-				"clock_settime"
-			],
-			"action": "SCMP_ACT_ALLOW",
-			"args": [],
-			"comment": "",
-			"includes": {
-				"caps": [
-					"CAP_SYS_TIME"
-				]
-			},
-			"excludes": {}
-		},
-		{
-			"names": [
-				"vhangup"
-			],
-			"action": "SCMP_ACT_ALLOW",
-			"args": [],
-			"comment": "",
-			"includes": {
-				"caps": [
-					"CAP_SYS_TTY_CONFIG"
-				]
-			},
-			"excludes": {}
-		}
-	]
-}
diff --git a/docs/source/dev/compiling_and_installing/daemon.rst b/docs/source/dev/compiling_and_installing/daemon.rst
index 79548a92ef6c2d0b6854c6d49b0521446884b3cd..2f0e9798e2b6c58d0b281fe0ef18d23f5284814e 100644
--- a/docs/source/dev/compiling_and_installing/daemon.rst
+++ b/docs/source/dev/compiling_and_installing/daemon.rst
@@ -15,7 +15,7 @@ Linux
     ../bootstrap
     make
 
-2. Compiling dring
+2. Compiling jamid
 ------------------
 
 .. code-block:: bash
@@ -25,7 +25,7 @@ Linux
     ./configure
     make
 
-3. Installing dring
+3. Installing jamid
 -------------------
 
 .. code-block:: bash
@@ -96,7 +96,7 @@ Run: ``brew link --force gettext`` to fix it.
 Clang compatibility (developers only)
 -------------------------------------
 
-It is possible to compile dring with Clang by setting CC and CXX variables
+It is possible to compile jamid with Clang by setting CC and CXX variables
 to 'clang' and 'clang++' respectively when calling ./configure.
 
 Currently it is not possible to use the DBus interface mechanism, and the
diff --git a/guix/manifest.scm b/guix/manifest.scm
index 7e66817555c8a3737c1cba0190e18044590a30a3..c20c580a8c87cd739bc08f44f204499c8fb4e36c 100644
--- a/guix/manifest.scm
+++ b/guix/manifest.scm
@@ -35,6 +35,7 @@
   "python"
   "sed"
   "tar"
+  "util-linux"
   "wget"
   "xz"
 
@@ -69,6 +70,7 @@
   "http-parser"
   "jsoncpp"
   "libarchive"
+  "libgit2"
   "libnatpmp"
   "libupnp"
   "libsecp256k1"
diff --git a/guix/minimal-manifest.scm b/guix/minimal-manifest.scm
index f9c1f14a26dd6aa067e5f104006b0bcefc8bdd38..c970c696b098c87987f0f0484edb15e9a64a0ff5 100644
--- a/guix/minimal-manifest.scm
+++ b/guix/minimal-manifest.scm
@@ -10,6 +10,7 @@
 
 (specifications->manifest
  (list
+  "bash"
   "coreutils"
   "gcc-toolchain"
   "git-minimal"
@@ -21,5 +22,6 @@
   "python"
   "sed"
   "tar"
+  "util-linux"
   "wget"
   "xz"))
diff --git a/lrc b/lrc
index 82f8718fd21a7d310ac170f69a7683db74ca9f64..26ad683c133d1604a082c7743a6d7d3b2d20fdff 160000
--- a/lrc
+++ b/lrc
@@ -1 +1 @@
-Subproject commit 82f8718fd21a7d310ac170f69a7683db74ca9f64
+Subproject commit 26ad683c133d1604a082c7743a6d7d3b2d20fdff
diff --git a/packaging/rules/debian-qt/rules b/packaging/rules/debian-qt/rules
index 9f76fa9ee5a21df8a58cfcf0048cb788a3d439ab..e4a325860ab322b0e745822281cc7a784db9a292 100755
--- a/packaging/rules/debian-qt/rules
+++ b/packaging/rules/debian-qt/rules
@@ -3,23 +3,43 @@
 
 # export DH_VERBOSE = 1
 
-# Number of CPUS
-NO_CPUS=$(shell nproc)
-ifeq ($(NO_CPUS),0)
-NO_CPUS=1
-endif
+# Return the minimum value of two integer arguments.
+min = $(shell echo $$(( $(1) < $(2) ? $(1) : $(2) )))
+max = $(shell echo $$(( $(1) > $(2) ? $(1) : $(2) )))
+
+# Number of CPUs to build Qt.
+NO_CPUS := $(call max,$(shell nproc),1)
+
+# There can be multiple builds of Qt in parallel.  The following
+# should match the maximum number of per-machine workers used in the
+# CI.
+MAX_PARALLEL_BUILDS := 4
+
+# qtwebengine (aka chromium) takes a ton of memory per build process,
+# up to 2.3 GiB.  Cap the number of jobs based on the amount of
+# available memory to try to guard against OOM build failures.
+AVAILABLE_MEMORY := $(shell free -g | grep -E '^Mem:' | awk '{print $$7}')
+MEMORY_REQUIRED_PER_CORE := 2	# in GiB
+COMPUTED_JOB_COUNT := \
+  $(call max,$(shell echo $$(( $(AVAILABLE_MEMORY) \
+                               / $(MEMORY_REQUIRED_PER_CORE) \
+                               / $(MAX_PARALLEL_BUILDS) ))),1)
+JOB_COUNT = $(call min,$(NO_CPUS),$(COMPUTED_JOB_COUNT))
 
 %:
 	dh $@
 
 override_dh_auto_configure:
-	MAKEFLAGS="-j$(NO_CPUS) V=1" \
-		./configure \
-			-opensource \
-			-confirm-license \
-			-nomake examples \
-			-nomake tests \
-			-prefix "${QT_JAMI_PREFIX}"
+	./configure \
+	  -opensource \
+	  -confirm-license \
+	  -nomake examples \
+	  -nomake tests \
+	  -prefix "${QT_JAMI_PREFIX}"
+
+override_dh_auto_build:
+	@echo Building Qt using $(JOB_COUNT) parallel jobs
+	$(MAKE) -j$(JOB_COUNT) V=1 NINJAFLAGS="-j$(JOB_COUNT)"
 
 override_dh_auto_install:
 	dh_auto_install -Smakefile -- INSTALL_ROOT=$(CURDIR)/debian/tmp/
diff --git a/packaging/rules/debian/control b/packaging/rules/debian/control
index 43a666c2b14f288f50eaae244aad3b06033765e1..a3d4a4b713f8dc3acff64e6f528ebc0c02ef069b 100644
--- a/packaging/rules/debian/control
+++ b/packaging/rules/debian/control
@@ -139,4 +139,4 @@ Description: Secure and distributed voice, video and chat platform - daemon
  platform that requires no centralized server and leaves the power of privacy
  in the hands of the user.
  .
- This package contains the Jami daemon: dring.
+ This package contains the Jami daemon: jamid.
diff --git a/packaging/rules/debian/copyright b/packaging/rules/debian/copyright
index 094997c7e3fd10e3d5d2803e224535aeacabb2d2..43aecf3bf04aeadd7029b9333a86a23ddfc58815 100644
--- a/packaging/rules/debian/copyright
+++ b/packaging/rules/debian/copyright
@@ -73,8 +73,8 @@ Copyright: 2008 Benjamin Kosnik <bkoz@redhat.com>
            2007-2010 Josh Triplett <josh@joshtriplett.org>
 License: GNUAllPermissive
 
-Files: daemon/tools/dringctrl/sippwrap.py
-       daemon/tools/dringctrl/test_dring_dbus_interface.py
+Files: daemon/tools/jamidctrl/sippwrap.py
+       daemon/tools/jamidctrl/test_jamid_dbus_interface.py
 Copyright: 2012 Free Software Foundation, Inc.
 License: GPL-2+
 
diff --git a/packaging/rules/debian/jami-all.manpages b/packaging/rules/debian/jami-all.manpages
index 5e0fefce5bde9b8f11ae15738a73d25d271474c0..a2e889dda716131b3ec84970ca47088c617614f1 100644
--- a/packaging/rules/debian/jami-all.manpages
+++ b/packaging/rules/debian/jami-all.manpages
@@ -1,2 +1,2 @@
 client-gnome/doc/jami-gnome.1
-daemon/dring.1
+daemon/jamid.1
diff --git a/packaging/rules/debian/jami-all.postinst b/packaging/rules/debian/jami-all.postinst
index dfdd0902c9849aaf217af8dd672a0578eb28725d..31ad8b6ecf96b4b34121abbb71b7f4f47cd4be84 100755
--- a/packaging/rules/debian/jami-all.postinst
+++ b/packaging/rules/debian/jami-all.postinst
@@ -94,16 +94,16 @@ if [ -f /etc/os-release ]; then
     . /etc/os-release
 
     # Set-up Jami repository end tag
-    if [ "${DEBIAN_CODENAME}" = "buster" ] || [ "${ID}_${VERSION_ID}" = "debian_10" ]; then
+    if [ "${VERSION_CODENAME}" = "buster" ] || [ "${ID}_${VERSION_ID}" = "debian_10" ]; then
         ENDTAG="debian_10"
+    elif [ "${VERSION_CODENAME}" = "bullseye" ] || [ "${ID}_${VERSION_ID}" = "debian_11" ]; then
+        ENDTAG="debian_11"
     elif [ "${ID}_${VERSION_ID}" = "trisquel_9.0" ]; then
         ENDTAG="ubuntu_18.04"
     elif [ "${UBUNTU_CODENAME}" = "bionic" ] || [ "${ID}_${VERSION_ID}" = "ubuntu_18.04" ]; then
         ENDTAG="ubuntu_18.04"
     elif [ "${UBUNTU_CODENAME}" = "focal" ] || [ "${ID}_${VERSION_ID}" = "ubuntu_20.04" ]; then
         ENDTAG="ubuntu_20.04"
-    elif [ "${UBUNTU_CODENAME}" = "groovy" ] || [ "${ID}_${VERSION_ID}" = "ubuntu_20.10" ]; then
-        ENDTAG="ubuntu_20.10"
     elif [ "${UBUNTU_CODENAME}" = "hirsute" ] || [ "${ID}_${VERSION_ID}" = "ubuntu_21.04" ]; then
         ENDTAG="ubuntu_21.04"
     elif [ "${ID}" = "debian" ] && \
diff --git a/packaging/rules/debian/jami-daemon.manpages b/packaging/rules/debian/jami-daemon.manpages
index 69e23e278d06cdced40aa35501275873cf7d1dcf..857be47ff4fcc76d264fb29fb67ea607b54b8013 100644
--- a/packaging/rules/debian/jami-daemon.manpages
+++ b/packaging/rules/debian/jami-daemon.manpages
@@ -1 +1 @@
-daemon/dring.1
+daemon/jamid.1
diff --git a/packaging/rules/debian/rules b/packaging/rules/debian/rules
index b0b992106a508af3ce5fb31493a66edb738e3b98..276f2f875260797c86d9245e408f91794c0a2ad5 100755
--- a/packaging/rules/debian/rules
+++ b/packaging/rules/debian/rules
@@ -6,6 +6,15 @@ export DEB_BUILD_MAINT_OPTIONS = hardening=+all
 DPKG_EXPORT_BUILDFLAGS = 1
 include /usr/share/dpkg/buildflags.mk
 
+# Ubuntu defaults to use -Bsymbolic-functions, which breaks linking
+# shared objects with static FFmpeg archives (see:
+# https://bugs.launchpad.net/ubuntu/+source/ffmpeg/+bug/1942352).
+ifeq ($(shell dpkg-vendor --derives-from Ubuntu && echo yes),yes)
+ifneq (,$(LDFLAGS))
+  LDFLAGS := $(filter-out %-Bsymbolic-functions,$(LDFLAGS))
+endif
+endif
+
 # Number of CPUS
 NO_CPUS=$(shell nproc)
 ifeq ($(NO_CPUS),0)
@@ -26,14 +35,10 @@ ifeq (raspbian_10_armhf,$(findstring raspbian_10_armhf, $(DISTRIBUTION)))
 BUNDLED_PKGS="--enable-ffmpeg --enable-yaml-cpp"
 # Add host environment variables
 CMAKE_OPTIONS=-DCHOST=${HOST_ARCH} \
-		-DCMAKE_C_COMPILER=${HOST_ARCH}-gcc \
-		-DCMAKE_CXX_COMPILER=${HOST_ARCH}-g++ \
-		-DCMAKE_FIND_ROOT_PATH=/usr/${HOST_ARCH} \
-		-DPKG_CONFIG_EXECUTABLE=/usr/bin/${HOST_ARCH}-pkg-config
-else
-ifneq (ubuntu_21.04,$(findstring ubuntu_21.04, $(DISTRIBUTION)))
-BUNDLED_PKGS="--enable-ffmpeg" # For ubuntu 21.04 it seems there is massive issues with linking for swscale
-endif
+  -DCMAKE_C_COMPILER=${HOST_ARCH}-gcc \
+  -DCMAKE_CXX_COMPILER=${HOST_ARCH}-g++ \
+  -DCMAKE_FIND_ROOT_PATH=/usr/${HOST_ARCH} \
+  -DPKG_CONFIG_EXECUTABLE=/usr/bin/${HOST_ARCH}-pkg-config
 endif
 
 # Qt-related variables
@@ -56,40 +61,40 @@ override_dh_auto_configure:
 	mkdir -p daemon/contrib/native
 	cd daemon/contrib/native && \
         ../bootstrap \
-				--host=${HOST_ARCH} \
-				--disable-downloads \
-				--no-checksums \
-				--disable-ogg \
-				--disable-flac \
-				--disable-vorbis \
-				--disable-vorbisenc \
-				--disable-speex \
-				--disable-sndfile \
-				--disable-gsm \
-				--disable-speexdsp \
-				--disable-natpmp  \
-				--enable-gnutls $(BUNDLED_PKGS) && \
-		make list && \
-		make -j$(NO_CPUS) V=1
+	  --host=${HOST_ARCH} \
+	  --disable-downloads \
+	  --no-checksums \
+	  --disable-ogg \
+	  --disable-flac \
+	  --disable-vorbis \
+	  --disable-vorbisenc \
+	  --disable-speex \
+	  --disable-sndfile \
+	  --disable-gsm \
+	  --disable-speexdsp \
+	  --disable-natpmp  \
+	  --enable-gnutls $(BUNDLED_PKGS) && \
+	make list && \
+	make -j$(NO_CPUS) V=1
 	cd daemon && \
-		./autogen.sh && \
-		./configure \
-				--prefix=/usr \
-				--disable-shared \
-				--host=${HOST_ARCH}
+	./autogen.sh && \
+	./configure \
+          --disable-shared \
+	  --prefix=/usr \
+	  --host=${HOST_ARCH}
 
 	#############################
 	## libringclient configure ##
 	#############################
 	cd lrc && \
-		mkdir build && \
-		cd build && \
-		cmake  \
-			-DRING_BUILD_DIR=$(CURDIR)/daemon/src \
-			-DCMAKE_INSTALL_PREFIX=/usr \
-			-DCMAKE_INSTALL_LIBDIR=lib \
-			$(CMAKE_OPTIONS) \
-			..
+	mkdir build && \
+	cd build && \
+	cmake  \
+	  -DRING_BUILD_DIR=$(CURDIR)/daemon/src \
+	  -DENABLE_LIBWRAP=false \
+	  -DCMAKE_INSTALL_PREFIX=/usr \
+	  -DCMAKE_INSTALL_LIBDIR=lib \
+	  $(CMAKE_OPTIONS) ..
 
 	############################
 	## gnome client configure ##
@@ -117,7 +122,7 @@ override_dh_auto_build:
 	## Daemon build      ##
 	#######################
 	make -C daemon -j$(NO_CPUS) V=1
-	pod2man daemon/man/dring.pod > daemon/dring.1
+	pod2man daemon/man/jamid.pod > daemon/jamid.1
 
 	#########################
 	## libringclient build ##
@@ -133,49 +138,49 @@ override_dh_auto_build:
 	## qt client configure and build ##
 	###################################
 	cd client-qt && \
-		mkdir build && \
-		cd build && \
-		cmake \
-			-DCMAKE_INSTALL_PREFIX=/usr \
-			-DLRC=$(CURDIR)/lrc \
-			$(CMAKE_OPTIONS) \
-			..
+	mkdir build && \
+	cd build && \
+	cmake \
+	  -DCMAKE_INSTALL_PREFIX=/usr \
+	  -DLRC=$(CURDIR)/lrc \
+	  $(CMAKE_OPTIONS) ..
 	make -C client-qt/build -j$(NO_CPUS) V=1
 
 override_dh_auto_clean:
 	#######################
 	## Daemon clean      ##
 	#######################
-	if [ -f daemon/contrib/native/Makefile ]; then make -C daemon/contrib/native distclean; fi
+	[ -f daemon/contrib/native/Makefile ] && \
+	  make -C daemon/contrib/native distclean || true
 	rm -rfv daemon/contrib/native
-	rm -rfv daemon/dring.1
+	rm -rfv daemon/jamid.1
 
 	#########################
 	## libringclient clean ##
 	#########################
 	# CMake build system has no distclean target, so use clean.
-	if [ -f lrc/build/Makefile ]; then make -C lrc/build clean; fi
+	[ -f lrc/build/Makefile ] && make -C lrc/build clean || true
 	rm -rfv lrc/build
 
 	########################
 	## gnome client clean ##
 	########################
 	# CMake build system has no distclean target, so use clean.
-	if [ -f client-gnome/build/Makefile ]; then make -C client-gnome/build clean; fi
+	[ -f client-gnome/build/Makefile ] && \
+	  make -C client-gnome/build clean || true
 	rm -rfv client-gnome/build
 
 	#####################
 	## qt client clean ##
 	#####################
 	# CMake build system has no distclean target, so use clean.
-	if [ -f client-qt/build/Makefile ]; then make -C client-qt/build clean; fi
+	[ -f client-qt/build/Makefile ] && make -C client-qt/build clean || true
 	rm -rfv client-qt/build
 
 override_dh_auto_install:
 	#########################
 	## Daemon install      ##
 	#########################
-
 	cd daemon && make DESTDIR=$(CURDIR)/debian/$(JAMI_DAEMON_PKG_NAME) install
 	rm -rfv $(CURDIR)/debian/$(JAMI_DAEMON_PKG_NAME)/usr/include
 	rm -rfv $(CURDIR)/debian/$(JAMI_DAEMON_PKG_NAME)/usr/lib/*.a
@@ -184,7 +189,6 @@ override_dh_auto_install:
 	#########################
 	## Jami client install ##
 	#########################
-
         ## LibRingClient
 	cd lrc/build && make DESTDIR=$(CURDIR)/debian/$(JAMI_LIB_CLIENT_PKG_NAME) install
 	rm -rfv $(CURDIR)/debian/$(JAMI_LIB_CLIENT_PKG_NAME)/usr/include
@@ -202,9 +206,7 @@ override_dh_auto_install:
 
 	## Qt client
 	cd client-qt/build && \
-		make DESTDIR=$(CURDIR)/debian/$(JAMI_CLIENT_PKG_NAME) install
-
-	ln -sf /usr/bin/jami $(CURDIR)/debian/jami/usr/bin/ring.cx
+	make DESTDIR=$(CURDIR)/debian/$(JAMI_CLIENT_PKG_NAME) install
 
 	## Custom Qt package for Jami (libqt-jami)
 	## Copy our own Qt library package content into the OCI package.
@@ -217,7 +219,6 @@ override_dh_auto_install:
 	######################
 	## Jami AiO install ##
 	######################
-
         ## daemon
 	cd daemon && make DESTDIR=$(CURDIR)/debian/$(JAMI_ALL_IN_ONE_PKG_NAME) install
 	rm -rfv $(CURDIR)/debian/$(JAMI_ALL_IN_ONE_PKG_NAME)/usr/include
@@ -236,9 +237,7 @@ override_dh_auto_install:
 
 	## Qt client
 	cd client-qt/build && \
-		make DESTDIR=$(CURDIR)/debian/$(JAMI_ALL_IN_ONE_PKG_NAME) install
-
-	ln -sf /usr/bin/jami $(CURDIR)/debian/$(JAMI_ALL_IN_ONE_PKG_NAME)/usr/bin/ring.cx
+	make DESTDIR=$(CURDIR)/debian/$(JAMI_ALL_IN_ONE_PKG_NAME) install
 
 override_dh_shlibdeps:
 	dh_shlibdeps -- -x$(JAMI_ALL_IN_ONE_PKG_NAME)
diff --git a/packaging/rules/rpm/jami-all.postinst b/packaging/rules/rpm/jami-all.postinst
index 3c6d2d5a414d62b16b75606925591a563caa044e..f1b9dbef2bf351ad9402fa5430e6f1889d56824c 100755
--- a/packaging/rules/rpm/jami-all.postinst
+++ b/packaging/rules/rpm/jami-all.postinst
@@ -77,68 +77,62 @@ is_distribution_supported() {
     # This defines variables such as NAME, ID, VERSION_ID, etc.
     . /etc/os-release
 
-    case ${ID}_${VERSION_ID%.*} in
-        rhel_8|fedora_32|fedora_33|fedora_34|opensuse-leap_15.2|opensuse-tumbleweed)
+    case ${ID} in
+        rhel*|fedora*|opensuse*)
             return 0
     esac
 
     return 1
 }
 
+has_rpm() {
+    command -v rpm > /dev/null
+}
+
+is_opensuse() {
+    case ${ID} in
+        opensuse*)
+            return 0
+    esac
+    return 1
+}
+
 ###############################################################################
 # [3] Maintainer script main switch                                           #
 ###############################################################################
 
-if is_distribution_supported; then
-    CAN_ADD_REPO_SOURCE=true
-else
-    CAN_ADD_REPO_SOURCE=false
-fi
+# Exit unless the following conditions are met.
+is_distribution_supported && has_rpm || exit 0
+
+# Note: the NAME and ID variables are set as a side-effect of sourcing
+# the /etc/os-release file in the above is_distribution_supported
+# call.
 
-if command -v rpm > /dev/null; then
-    # RPM is required to add the key.
-    CAN_ADD_REPO_SOURCE=false
+# SUSE specifics.
+if is_opensuse; then
+    REPO_FILE=/etc/zypp/repos.d/jami-main.repo
+    GPG_FILE="/tmp/RPM-GPG-KEY-JAMI"
 fi
 
-JAMI_REPO='
-[jami]
-name='"${NAME}"' $releasever - $basearch - Jami
-baseurl='"${JAMI_REPO_BASE}"/"${ID}"'_$releasever
-gpgcheck=1
-gpgkey=https://dl.jami.net/jami.pub.key
-enabled=1'
+# Add the key to the trusted keyring.
+echo "$JAMI_KEY" > "$GPG_FILE"
+rm -f /var/lib/rpm/.rpm.lock > /dev/null 2>&1
+rpm --import "$GPG_FILE"  > /dev/null 2>&1
+
+jami_repo_name="$NAME \$releasever - \$basearch - Jami"
+jami_repo_base_url="$JAMI_REPO_BASE/$ID_\$releasever"
+# Remove releasever for tumbleweed as it's a rolling release.
+if [ "$ID" = "opensuse-tumbleweed" ]; then
+    jami_repo_name="$NAME \$basearch - Jami"
+    jami_repo_base_url=$JAMI_REPO_BASE/$ID
+fi
 
-# Set-up Jami repository end tag
-if [ "${PLATFORM_ID}" = "opensuse-leap:15.2" ]; then
-    ENDTAG="opensuse-leap_15.2"
-    REPO_FILE="/etc/zypp/repos.d/jami-main.repo"
-    GPG_FILE="/tmp/RPM-GPG-KEY-JAMI"
-elif [ "${PLATFORM_ID}" = "opensuse-tumbleweed" ]; then
-    ENDTAG="opensuse-tumbleweed"
-    REPO_FILE="/etc/zypp/repos.d/jami-main.repo"
-    GPG_FILE="/tmp/RPM-GPG-KEY-JAMI"
-    # Remove releasever for tumbleweed as it's a rolling release
-    JAMI_REPO='
+# Add an entry for the package repository to the trusted package.
+cat > "$REPO_FILE" <<EOF
 [jami]
-name='"${NAME}"' $basearch - Jami
-baseurl='"${JAMI_REPO_BASE}"/"${ID}"'
+name=$jami_repo_name
+baseurl=$jami_repo_base_url
 gpgcheck=1
 gpgkey=https://dl.jami.net/jami.pub.key
-enabled=1'
-fi
-
-if [ "${CAN_ADD_REPO_SOURCE}" = "true" ]; then
-    # Add the key to the trusted keyring.
-    echo "$JAMI_KEY" > "$GPG_FILE"
-
-    rm -f /var/lib/rpm/.rpm.lock > /dev/null 2>&1
-    rpm --import "$GPG_FILE"  > /dev/null 2>&1
-
-    # Add an entry for the package repository to the trusted package.
-    # XXX: The NAME and ID variables are set as a side-effect of
-    # sourcing the /etc/os-release file in the above
-    # is_distribution_supported call.
-    cat > $REPO_FILE <<EOF
-$JAMI_REPO
+enabled=1
 EOF
-fi
diff --git a/packaging/rules/rpm/jami-daemon.spec b/packaging/rules/rpm/jami-daemon.spec
index 634b51dc5859792faacc8eca064a481f775555b1..c7a6a1d5f9f0da176ed7812f464e5d144253dc42 100644
--- a/packaging/rules/rpm/jami-daemon.spec
+++ b/packaging/rules/rpm/jami-daemon.spec
@@ -90,23 +90,25 @@ cd %{_builddir}/ring-project/daemon && \
 
 # Build the daemon.
 make -C %{_builddir}/ring-project/daemon %{_smp_mflags} V=1
-pod2man %{_builddir}/ring-project/daemon/man/dring.pod \
-        > %{_builddir}/ring-project/daemon/dring.1
+pod2man %{_builddir}/ring-project/daemon/man/jamid.pod \
+        > %{_builddir}/ring-project/daemon/jamid.1
 
 %install
 DESTDIR=%{buildroot} make -C daemon install
-cp %{_builddir}/ring-project/daemon/dring.1 \
-   %{buildroot}/%{_mandir}/man1/dring.1
+cp %{_builddir}/ring-project/daemon/jamid.1 \
+   %{buildroot}/%{_mandir}/man1/jamid.1
 rm -rfv %{buildroot}/%{_libdir}/*.a
 rm -rfv %{buildroot}/%{_libdir}/*.la
 
 %files
 %defattr(-,root,root,-)
-%{_libdir}/ring/dring
-%{_datadir}/ring/ringtones
+# XXX: Use %%{_libexecdir}/jamid after there's no more OpenSUSE Leap
+# < 16 (see https://en.opensuse.org/openSUSE:Specfile_guidelines).
+/usr/libexec/jamid
+%{_datadir}/jami/ringtones
 %{_datadir}/dbus-1/services/*
 %{_datadir}/dbus-1/interfaces/*
-%doc %{_mandir}/man1/dring*
+%doc %{_mandir}/man1/jamid*
 
 %package devel
 Summary: Development files of the Jami daemon
@@ -115,7 +117,7 @@ Summary: Development files of the Jami daemon
 This package contains the header files for using the Jami daemon as a library.
 
 %files devel
-%{_includedir}/dring
+%{_includedir}/jami
 %{_includedir}/jami_contact.h
 
 %post
diff --git a/packaging/rules/rpm/jami-gnome.spec b/packaging/rules/rpm/jami-gnome.spec
index 170bdd5552e015591ae6a3e8a6aa5f540d03c318..3006b0a5f0e2ecc9f08fbbbb0923709c081a37b6 100644
--- a/packaging/rules/rpm/jami-gnome.spec
+++ b/packaging/rules/rpm/jami-gnome.spec
@@ -65,7 +65,6 @@ make -C %{_builddir}/ring-project/client-gnome/build \
 DESTDIR=%{buildroot} make -C %{_builddir}/ring-project/client-gnome/build install
 # Only keep /bin/jami-gnome for the GNOME client.
 rm -rfv %{buildroot}/%{_bindir}/jami
-rm -rfv %{buildroot}/%{_bindir}/ring.cx
 
 %files
 %defattr(-,root,root,-)
@@ -73,6 +72,7 @@ rm -rfv %{buildroot}/%{_bindir}/ring.cx
 %{_datadir}/applications/jami-gnome.desktop
 %{_datadir}/glib-2.0/schemas/net.jami.Jami.gschema.xml
 %{_datadir}/icons/hicolor/scalable/apps/jami-gnome.svg
+%{_datadir}/icons/hicolor/scalable/apps/jami-gnome-new.svg
 %{_datadir}/jami-gnome
 %{_datadir}/locale/*
 %{_datadir}/metainfo/jami-gnome.appdata.xml
diff --git a/packaging/rules/rpm/jami-libclient.spec b/packaging/rules/rpm/jami-libclient.spec
index aa54c06f25797bbb29cdd514c695213bc1796c98..55556bc31728f93a56deca1e7b75fdbbff9283da 100644
--- a/packaging/rules/rpm/jami-libclient.spec
+++ b/packaging/rules/rpm/jami-libclient.spec
@@ -20,8 +20,6 @@ BuildRequires: jami-daemon-devel = %{version}
 BuildRequires: make
 %if 0%{?fedora} >= 32
 BuildRequires: NetworkManager-libnm-devel
-BuildRequires: qt5-qtbase-devel
-BuildRequires: qt5-qttools-devel
 %endif
 
 %description
diff --git a/packaging/rules/rpm/jami-libqt.spec b/packaging/rules/rpm/jami-libqt.spec
index f7534b1869c0527081fb90b27cbc6c7f8ae40955..0bd11578e63e7f089d6a10778712228a296b93fe 100644
--- a/packaging/rules/rpm/jami-libqt.spec
+++ b/packaging/rules/rpm/jami-libqt.spec
@@ -2,6 +2,21 @@
 %define version     RELEASE_VERSION
 %define release     0
 
+# qtwebengine (aka chromium) takes a ton of memory per build process,
+# up to 2.3 GiB.  Cap the number of jobs based on the amount of
+# available memory to try to guard against OOM build failures.
+%define min(a,b) %(echo $(( %1 < %2 ? %1 : %2 )))
+%define max(a,b) %(echo $(( %1 > %2 ? %1 : %2 )))
+
+%define cpu_count %max %(nproc) 1
+%define available_memory %(free -g | grep -E '^Mem:' | awk '{print $7}')
+# Required memory in GiB.
+%define max_parallel_builds 4
+%define memory_required_per_core 2
+%define computed_job_count_ %(echo $(( %available_memory / %memory_required_per_core / %max_parallel_builds )))
+%define computed_job_count %max %computed_job_count_ 1
+%define job_count %min %cpu_count %computed_job_count
+
 Name:          %{name}
 Version:       %{version}
 Release:       %{release}%{?dist}
@@ -31,18 +46,30 @@ This package contains Qt libraries for Jami.
 %setup -n qt-everywhere-src-%{version}
 
 %build
-	./configure \
-		-opensource \
-		-confirm-license \
-		-nomake examples \
-		-nomake tests \
-		-prefix "%{_libdir}/qt-jami"
-	sed -i 's,bin/python,bin/env python3,g' qtbase/mkspecs/features/uikit/devices.py
-	make -j8 V=1
+echo "Building Qt using %{job_count} parallel jobs"
+# https://bugs.gentoo.org/768261 (Qt 5.15)
+sed -i 's,#include "absl/base/internal/spinlock.h"1,#include "absl/base/internal/spinlock.h"1\n#include <limits>,g' qtwebengine/src/3rdparty/chromium/third_party/abseil-cpp/absl/synchronization/internal/graphcycles.cc
+sed -i 's,#include <stdint.h>,#include <stdint.h>\n#include <limits>,g' qtwebengine/src/3rdparty/chromium/third_party/perfetto/src/trace_processor/containers/string_pool.h
+# https://bugreports.qt.io/browse/QTBUG-93452 (Qt 5.15)
+sed -i 's,#  include <utility>,#  include <utility>\n#  include <limits>,g' qtbase/src/corelib/global/qglobal.h
+sed -i 's,#include <string.h>,#include <string.h>\n#include <limits>,g' qtbase/src/corelib/global/qendian.h
+cat qtbase/src/corelib/global/qendian.h
+sed -i 's,#include <string.h>,#include <string.h>\n#include <limits>,g' qtbase/src/corelib/global/qfloat16.h
+sed -i 's,#include <QtCore/qbytearray.h>,#include <QtCore/qbytearray.h>\n#include <limits>,g' qtbase/src/corelib/text/qbytearraymatcher.h
+./configure \
+  -opensource \
+  -confirm-license \
+  -nomake examples \
+  -nomake tests \
+  -prefix "%{_libdir}/qt-jami"
+sed -i 's,bin/python,bin/env python3,g' qtbase/mkspecs/features/uikit/devices.py
+
+# Chromium is built using Ninja, which doesn't honor MAKEFLAGS.
+make -j%{job_count} V=1 NINJAFLAGS="-j%{job_count}"
 
 %install
-make -j8 INSTALL_ROOT=%{buildroot} V=1 install
+make -j%{job_count} INSTALL_ROOT=%{buildroot} V=1 install
 
 %files
 %defattr(-,root,root,-)
-%{_libdir}/qt-jami
\ No newline at end of file
+%{_libdir}/qt-jami
diff --git a/packaging/rules/rpm/jami-qt.spec b/packaging/rules/rpm/jami-qt.spec
index 92f5d471873c16bcc3ad76fd97fc447588929a81..d53a29975cb4a450210e884254062b3ed5268212 100644
--- a/packaging/rules/rpm/jami-qt.spec
+++ b/packaging/rules/rpm/jami-qt.spec
@@ -12,6 +12,9 @@ Vendor:        Savoir-faire Linux
 URL:           https://jami.net/
 Source:        jami_%{version}.tar.gz
 Requires:      jami-libclient = %{version}
+%if 0%{?fedora} >= 32
+Requires:      jami-libqt
+%endif
 Provides:      jami
 Obsoletes:     jami < %{version}-%{release}
 
@@ -22,19 +25,6 @@ BuildRequires: make
 
 # Build and runtime dependencies.
 BuildRequires: qrencode-devel
-%if 0%{?fedora} >= 32
-BuildRequires: qt5-qttools-devel
-BuildRequires: qt5-qtbase-devel
-BuildRequires: qt5-qtdeclarative-devel
-BuildRequires: qt5-qtmultimedia-devel
-BuildRequires: qt5-qtquickcontrols
-BuildRequires: qt5-qtquickcontrols2-devel
-BuildRequires: qt5-qtsvg-devel
-BuildRequires: qt5-qtwebengine-devel
-# Runtime dependencies not automatically registered by RPM.
-Requires: qt5-qtquickcontrols
-Requires: qt5-qtgraphicaleffects
-%endif
 
 %description
 This package contains the Qt desktop client of Jami. Jami is a free
diff --git a/patches/docker-snap-build-scripts.patch b/patches/docker-snap-build-scripts.patch
index 4dcc0f93e1497bedd8f693b9612c9364e2587cc9..82838f15f9f97ea6426261943b3ef89ae49e8489 100644
--- a/patches/docker-snap-build-scripts.patch
+++ b/patches/docker-snap-build-scripts.patch
@@ -27,4 +27,4 @@ Author: Amin Bandali <amin.bandali@savoirfairelinux.com>
 +
 +ADD scripts/build-package-snap.sh /opt/build-package-snap.sh
 +
-+CMD /opt/build-package-snap.sh
++CMD ["/opt/build-package-snap.sh"]
diff --git a/plugins b/plugins
index 7bfad26ae4eeb656733d409aa88cf0fcae69d7a5..17c0bc64a374d601012943a0a79ace65734dd922 160000
--- a/plugins
+++ b/plugins
@@ -1 +1 @@
-Subproject commit 7bfad26ae4eeb656733d409aa88cf0fcae69d7a5
+Subproject commit 17c0bc64a374d601012943a0a79ace65734dd922
diff --git a/scripts/build-package-debian-qt.sh b/scripts/build-package-debian-qt.sh
deleted file mode 100755
index 2852cbf74e2952a87405d141b4dc6b24372618f8..0000000000000000000000000000000000000000
--- a/scripts/build-package-debian-qt.sh
+++ /dev/null
@@ -1,82 +0,0 @@
-#!/usr/bin/env bash
-#
-# Copyright (C) 2021 Savoir-faire Linux Inc.
-#
-# Author: Amin Bandali <amin.bandali@savoirfairelinux.com>
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
-#
-# This script is used in the packaging containers to build a snap
-# package on an ubuntu base distro.
-
-
-set -e
-
-PKG_DIR="packaging/rules/debian-qt"
-
-cache_dir=/opt/ring-contrib
-temp_dir=$(mktemp -d)
-
-mkdir /opt/libqt-jami-build
-cd /opt/libqt-jami-build
-
-qt_version=${QT_MAJOR}.${QT_MINOR}.${QT_PATCH}
-tarball_name=qt-everywhere-src-${qt_version}.tar.xz
-cached_tarball=$cache_dir/$tarball_name
-qt_base_url=https://download.qt.io/archive/qt/${QT_MAJOR}.${QT_MINOR}/${qt_version}/single
-
-if ! [[ -d $cache_dir && -w $cache_dir ]]; then
-    echo "error: $cache_dir does not exist or is not writable"
-    exit 1
-fi
-
-if ! [ -f "$cached_tarball" ]; then
-    (
-        cd "$temp_dir"
-        wget "$qt_base_url/$tarball_name"
-        echo -n "${QT_TARBALL_CHECKSUM}  $tarball_name" | sha256sum -c - || \
-            (echo "Qt tarball checksum mismatch; quitting" && exit 1)
-        flock "${cached_tarball}.lock" mv "$tarball_name" "$cached_tarball"
-    )
-    rm -rf "$temp_dir"
-fi
-
-cp "$cached_tarball" libqt-jami_${qt_version}.orig.tar.xz
-tar xvf libqt-jami_${qt_version}.orig.tar.xz
-mv qt-everywhere-src-${qt_version} libqt-jami-${qt_version}
-cd libqt-jami-${qt_version}
-
-# import the debian folder
-cp --verbose -r /opt/ring-project-ro/${PKG_DIR} debian
-
-# create changelog file
-DEBEMAIL="The Jami project <jami@gnu.org>" dch --create --package libqt-jami --newversion ${DEBIAN_VERSION} "New libqt-jami release"
-DEBEMAIL="The Jami project <jami@gnu.org>" dch --release --distribution "unstable" debian/changelog
-
-DPKG_BUILD_OPTIONS=""
-# Set the host architecture as armhf and add some specific architecture
-# options to the package builder.
-if grep -q "raspbian_10_qt_armhf" <<< "${DISTRIBUTION}"; then
-    echo "Adding armhf as the host architecture."
-    export HOST_ARCH=arm-linux-gnueabihf
-    DPKG_BUILD_OPTIONS="${DPKG_BUILD_OPTIONS} -a armhf"
-fi
-
-# build and package qt
-dpkg-buildpackage -uc -us ${DPKG_BUILD_OPTIONS}
-
-# move the artifacts to output
-cd ..
-mv *.orig.tar* *.debian.tar* *deb *changes *dsc /opt/output
-chown -R ${CURRENT_UID}:${CURRENT_GID} /opt/output/
diff --git a/scripts/build-package-debian.sh b/scripts/build-package-debian.sh
index 71d6fb8acfcac1d7c2326cc3f163c175a8361862..4a0fb62b40e0f66a9716bee2eee97beb66ac481f 100755
--- a/scripts/build-package-debian.sh
+++ b/scripts/build-package-debian.sh
@@ -3,6 +3,8 @@
 # Copyright (C) 2016-2021 Savoir-faire Linux Inc.
 #
 # Author: Alexandre Viau <alexandre.viau@savoirfairelinux.com>
+# Author: Amin Bandali <amin.bandali@savoirfairelinux.com>
+# Author: Maxim Cournoyer <maxim.cournoyer@savoirfairelinux.com>
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -31,13 +33,87 @@ if grep -q "raspbian_10_armhf" <<< "${DISTRIBUTION}"; then
     DPKG_BUILD_OPTIONS="${DPKG_BUILD_OPTIONS} -a armhf"
 fi
 
-# Setup work directory.
+cache_packaging=$TARBALLS/$DISTRIBUTION
+mkdir -p "$cache_packaging"
+
+deb_arch=$(dpkg --print-architecture)
+qt_deb_name=libqt-jami_${DEBIAN_QT_VERSION}_${deb_arch}.deb
+qt_deb_path=${cache_packaging}/${qt_deb_name}
+
+if [ ! -f "${qt_deb_path}" ] || [ "${FORCE_REBUILD_QT}" = "true" ]; then
+    (
+        flock 9                 # block until the lock file is gone
+        test -f "${qt_deb_path}" && exit 0 # check again
+
+        # Build Qt.
+        mkdir /opt/libqt-jami-build
+        cd /opt/libqt-jami-build
+
+        qt_version=${QT_MAJOR}.${QT_MINOR}.${QT_PATCH}
+        tarball_name=qt-everywhere-src-${qt_version}.tar.xz
+        cached_tarball=$TARBALLS/$tarball_name
+        qt_base_url=https://download.qt.io/archive/qt/\
+${QT_MAJOR}.${QT_MINOR}/${qt_version}/single
+
+        if [ ! -d "${TARBALLS}" ] || [ ! -w "${TARBALLS}" ]; then
+            echo "error: $TARBALLS does not exist or is not writable"
+            exit 1
+        fi
+
+        if [ ! -f "${cached_tarball}" ]; then
+            (
+                flock 8         # block until the lock file is gone
+                test -f "${cached_tarball}" && exit 0 # check again
+
+                temp_dir=$(mktemp -d)
+                cd "${temp_dir}"
+                wget "${qt_base_url}/${tarball_name}"
+                echo -n "${QT_TARBALL_CHECKSUM}  ${tarball_name}" | sha256sum -c - || \
+                    (echo "Qt tarball checksum mismatch; quitting" && exit 1)
+                mv "${tarball_name}" "${cached_tarball}"
+                rm -rf "${temp_dir}"
+            ) 8>"${cached_tarball}.lock"
+
+        fi
+
+        cp "${cached_tarball}" "libqt-jami_${qt_version}.orig.tar.xz"
+        tar xvf "libqt-jami_${qt_version}.orig.tar.xz"
+        mv "qt-everywhere-src-${qt_version}" "libqt-jami-${qt_version}"
+        cd "libqt-jami-${qt_version}"
+
+        # Extract the debian folder
+        tar xf "/src/$RELEASE_TARBALL_FILENAME" ring-project/packaging/rules/debian-qt \
+            --strip-components=3 && mv debian-qt debian
+
+        # Create the changelog file.
+        DEBEMAIL="The Jami project <jami@gnu.org>" dch --create \
+                --package libqt-jami \
+                --newversion "${DEBIAN_QT_VERSION}" "New libqt-jami release"
+        DEBEMAIL="The Jami project <jami@gnu.org>" dch --release \
+                --distribution "unstable" debian/changelog
+
+        # Build and package Qt.
+        dpkg-buildpackage -uc -us ${DPKG_BUILD_OPTIONS}
+
+        # Cache the built .deb.
+        mv "../${qt_deb_name}" "${qt_deb_path}"
+
+    ) 9>"${qt_deb_path}.lock"
+fi
+
+# install libqt-jami from cache
+apt-get install -y "${qt_deb_path}"
+
+# copy libqt-jami to output
+cp "${qt_deb_path}" /opt/output/
+
+# Set up work directory.
 mkdir -p /jami/work && cd /jami/work
 
 # Create a changelog file, required by dpkg-buildpackage.
 mkdir debian
 DEBEMAIL="The Jami project <jami@gnu.org>" dch --create --package jami \
-        --newversion ${DEBIAN_VERSION} "Automatic nightly release"
+        --newversion "${DEBIAN_VERSION}" "Automatic nightly release"
 DEBEMAIL="The Jami project <jami@gnu.org>" dch --release \
         --distribution "unstable" debian/changelog
 
@@ -53,5 +129,5 @@ ln -s packaging/rules/debian .
 dpkg-buildpackage -b -uc -us ${DPKG_BUILD_OPTIONS}
 
 # Move the artifacts to the output.
-mv ../*.deb /opt/output
-chown -R ${CURRENT_UID}:${CURRENT_UID} /opt/output
+mv ../*deb /opt/output        # .deb and .ddeb packages
+chown -R "${CURRENT_UID}:${CURRENT_UID}" /opt/output
diff --git a/scripts/build-package-rpm.sh b/scripts/build-package-rpm.sh
index ade22271dd42f3ca3066eb03511966026155d10f..fd8226a7c93c29cd925d28fb2b25a4974dd6b274 100755
--- a/scripts/build-package-rpm.sh
+++ b/scripts/build-package-rpm.sh
@@ -21,20 +21,20 @@
 # This script is used in the packaging containers to build packages on
 # rpm-based distros.
 #
-
 set -e
 
 # Import the spec file.
 mkdir -p /opt/ring-project
 cd /opt/ring-project
-cp /opt/ring-project-ro/packaging/rules/rpm/* .
+tar xf "/src/$RELEASE_TARBALL_FILENAME" ring-project/packaging/rules/rpm \
+    --strip-components=3 && mv rpm/* . && rmdir rpm
 rm jami-libqt.spec
 
 # Prepare the build tree.
 rpmdev-setuptree
 
 # Copy the source tarball.
-cp /opt/ring-project-ro/jami_*.tar.gz /root/rpmbuild/SOURCES
+cp --reflink=auto "/src/$RELEASE_TARBALL_FILENAME" /root/rpmbuild/SOURCES
 
 QT_JAMI_PREFIX="/usr/lib64/qt-jami"
 PATH="${QT_JAMI_PREFIX}/bin:${PATH}"
@@ -45,51 +45,82 @@ QT_MAJOR=5
 QT_MINOR=15
 QT_PATCH=2
 
-if [[ "${DISTRIBUTION:0:4}" == "rhel" \
-   || "${DISTRIBUTION:0:13}" == "opensuse-leap" ]]; then
+QT_MAJOR_MINOR=${QT_MAJOR}.${QT_MINOR}
+QT_MAJOR_MINOR_PATCH=${QT_MAJOR}.${QT_MINOR}.${QT_PATCH}
+
+QT_TARBALL_URL=https://download.qt.io/archive/qt/$QT_MAJOR_MINOR/\
+$QT_MAJOR_MINOR_PATCH/single/qt-everywhere-src-$QT_MAJOR_MINOR_PATCH.tar.xz
+
+QT_TARBALL_SHA256="3a530d1b243b5dec00bc54937455471aaa3e56849d2593edb8ded07228202240"
+QT_TARBALL_FILE_NAME=$(basename "$QT_TARBALL_URL")
+CACHED_QT_TARBALL=$TARBALLS/$QT_TARBALL_FILE_NAME
+
+if [[ "${DISTRIBUTION}" != "opensuse-tumbleweed" ]]; then
 
-    RPM_PATH=/opt/cache-packaging/${DISTRIBUTION}/jami-libqt-${QT_MAJOR}.${QT_MINOR}.${QT_PATCH}-1.x86_64.rpm
+    mkdir -p "$TARBALLS/$DISTRIBUTION"
+    RPM_PATH=$TARBALLS/$DISTRIBUTION/jami-libqt-$QT_MAJOR_MINOR_PATCH-1.x86_64.rpm
     if [[ "${DISTRIBUTION:0:4}" == "rhel" ]]; then
-        RPM_PATH=/opt/cache-packaging/${DISTRIBUTION}/jami-libqt-${QT_MAJOR}.${QT_MINOR}.${QT_PATCH}-1.el8.x86_64.rpm
+        RPM_PATH=$TARBALLS/${DISTRIBUTION}/jami-libqt-$QT_MAJOR_MINOR_PATCH-1.el8.x86_64.rpm
     fi
 
     if [ ! -f "${RPM_PATH}" ]; then
-        mkdir /opt/qt-jami-build
-        cd /opt/qt-jami-build
-        cp /opt/ring-project-ro/packaging/rules/rpm/jami-libqt.spec .
-
-        QT_TARBALL_CHECKSUM="3a530d1b243b5dec00bc54937455471aaa3e56849d2593edb8ded07228202240"
-        wget https://download.qt.io/archive/qt/${QT_MAJOR}.${QT_MINOR}/${QT_MAJOR}.${QT_MINOR}.${QT_PATCH}/single/qt-everywhere-src-${QT_MAJOR}.${QT_MINOR}.${QT_PATCH}.tar.xz
-
-        if ! echo -n ${QT_TARBALL_CHECKSUM} qt-everywhere-src-*.tar.xz | sha256sum -c -
-        then
-            echo "qt tarball checksum mismatch; quitting"
-            exit 1
-        fi
-
-        mv qt-everywhere-src-${QT_MAJOR}.${QT_MINOR}.${QT_PATCH}.tar.xz /root/rpmbuild/SOURCES/jami-qtlib_${QT_MAJOR}.${QT_MINOR}.${QT_PATCH}.tar.xz
-        sed -i "s/RELEASE_VERSION/${QT_MAJOR}.${QT_MINOR}.${QT_PATCH}/g" jami-libqt.spec
-        rpmdev-bumpspec --comment="Automatic nightly release" \
-                        --userstring="Jenkins <jami@lists.savoirfairelinux.net>" jami-libqt.spec
-
-        rpmbuild -ba jami-libqt.spec
-        mkdir -p /opt/cache-packaging/${DISTRIBUTION}/
-
-        if [[ "${DISTRIBUTION:0:4}" == "rhel" ]]; then
-            cp /root/rpmbuild/RPMS/x86_64/jami-libqt-${QT_MAJOR}.${QT_MINOR}.${QT_PATCH}-1.el8.x86_64.rpm ${RPM_PATH}
-        else
-            cp /root/rpmbuild/RPMS/x86_64/jami-libqt-*.rpm ${RPM_PATH}
-        fi
+        # The following block will only run on one build machine at a
+        # time, thanks to flock.
+        (
+            flock 9             # block until the lock is available
+            test -f "$RPM_PATH" && exit 0 # check again
+
+            mkdir /opt/qt-jami-build
+            cd /opt/qt-jami-build
+            tar xf "/src/$RELEASE_TARBALL_FILENAME" \
+                ring-project/packaging/rules/rpm/jami-libqt.spec \
+                --strip-components=4
+
+            # Fetch and cache the tarball, if not already available.
+            if [ ! -f "$CACHED_QT_TARBALL" ]; then
+                (
+                    flock 8     # block until the lock file is gone
+                    test -f "$CACHED_QT_TARBALL" && exit 0 # check again
+
+                    wget "$QT_TARBALL_URL"
+                    if ! echo -n ${QT_TARBALL_SHA256} "$QT_TARBALL_FILE_NAME" | sha256sum -c -
+                    then
+                        echo "qt tarball checksum mismatch; quitting"
+                        exit 1
+                    fi
+                    mv "$QT_TARBALL_FILE_NAME" "$CACHED_QT_TARBALL"
+                ) 8>"${CACHED_QT_TARBALL}.lock"
+            fi
+
+            cp "$CACHED_QT_TARBALL" "/root/rpmbuild/SOURCES/jami-qtlib_$QT_MAJOR_MINOR_PATCH.tar.xz"
+            sed -i "s/RELEASE_VERSION/$QT_MAJOR_MINOR_PATCH/g" jami-libqt.spec
+            rpmdev-bumpspec --comment="Automatic nightly release" \
+                            --userstring="Jenkins <jami@lists.savoirfairelinux.net>" jami-libqt.spec
+
+            rpmbuild -ba jami-libqt.spec
+            mkdir -p "$TARBALLS/${DISTRIBUTION}"
+
+            # Cache the built Qt RPM package.
+            if [[ "${DISTRIBUTION:0:4}" == "rhel" ]]; then
+                cp "/root/rpmbuild/RPMS/x86_64/jami-libqt-$QT_MAJOR_MINOR_PATCH-1.el8.x86_64.rpm" "${RPM_PATH}"
+            elif [[ "${DISTRIBUTION}" == "fedora_33" ]]; then
+                cp "/root/rpmbuild/RPMS/x86_64/jami-libqt-$QT_MAJOR_MINOR_PATCH-1.fc33.x86_64.rpm" "${RPM_PATH}"
+            elif [[ "${DISTRIBUTION}" == "fedora_34" ]]; then
+                cp "/root/rpmbuild/RPMS/x86_64/jami-libqt-$QT_MAJOR_MINOR_PATCH-1.fc34.x86_64.rpm" "${RPM_PATH}"
+            else
+                cp /root/rpmbuild/RPMS/x86_64/jami-libqt-*.rpm "${RPM_PATH}"
+            fi
+        ) 9>"${RPM_PATH}.lock"
     fi
-    rpm --install ${RPM_PATH}
-    cp ${RPM_PATH} /opt/output
+    rpm --install "${RPM_PATH}"
+    cp "${RPM_PATH}" /opt/output
     cd /opt/ring-project
 fi
 
 # Set the version and associated comment.
-sed -i "s/RELEASE_VERSION/${RELEASE_VERSION}/g" *.spec
+sed -i "s/RELEASE_VERSION/${RELEASE_VERSION}/g" ./*.spec
 rpmdev-bumpspec --comment="Automatic nightly release" \
-                --userstring="Jenkins <jami@lists.savoirfairelinux.net>" *.spec
+                --userstring="Jenkins <jami@lists.savoirfairelinux.net>" ./*.spec
 
 # Build the daemon and install it.
 rpmbuild -ba jami-daemon.spec
@@ -105,7 +136,7 @@ rpmbuild -ba jami-gnome.spec jami-qt.spec
 # Move the built packages to the output directory.
 mv /root/rpmbuild/RPMS/*/* /opt/output
 touch /opt/output/.packages-built
-chown -R ${CURRENT_UID}:${CURRENT_UID} /opt/output
+chown -R "$CURRENT_UID:$CURRENT_UID" /opt/output
 
 # TODO: One click install: create a package that combines the already
 # built package into one.
diff --git a/scripts/build-package-snap.sh b/scripts/build-package-snap.sh
index ebad3cb6f728185c3132df7751f9ca6c25294de4..c7035560605432d1e15ea958162d83410677f275 100755
--- a/scripts/build-package-snap.sh
+++ b/scripts/build-package-snap.sh
@@ -23,7 +23,7 @@
 
 set -e
 
-cp -rp /opt/ring-project-ro /opt/ring-project
+tar xf "/src/$RELEASE_TARBALL_FILENAME" -C /opt
 cd /opt/ring-project/packaging/rules/snap/${SNAP_PKG_NAME}/
 
 # set the version and tarball filename
diff --git a/scripts/deploy-packages.sh b/scripts/deploy-packages.sh
index ef82d8d82509bf9c10d26a70771bfb4017d8f669..3847840bb097638ea5ae9e4a9b200d4265e0221a 100755
--- a/scripts/deploy-packages.sh
+++ b/scripts/deploy-packages.sh
@@ -23,6 +23,13 @@
 # This script syncs and deploys packages from packages/distro.
 # It should be run from the project root directory.
 #
+# Requirements
+# - createrepo-c
+# - dpkg
+# - reprepro
+# - rpm
+# - rsync
+# - snapcraft
 
 # Exit immediately if a command exits with a non-zero status
 set -e
@@ -31,39 +38,10 @@ set -e
 ## Debian / Ubuntu packaging ##
 ###############################
 
-function fetch_qt_deb()
-{
-    if [ -f "${SSH_IDENTITY_FILE}" ];
-    then
-        export RSYNC_RSH="ssh -i ${SSH_IDENTITY_FILE}"
-    fi
-
-    echo "#####################"
-    echo "## fetching qt deb ##"
-    echo "#####################"
-    echo "Using RSYNC_RSH='${RSYNC_RSH}'"
-    rsync --archive --verbose \
-          ${REMOTE_REPOSITORY_LOCATION}/${DISTRIBUTION}_qt/pool/main/libq/libqt-jami/*.deb \
-          ${DISTRIBUTION_REPOSITORY_FOLDER}_qt/
-}
-
-# True if $DISTRIBUTION ends by _qt
-is_distribution_qt() {
-    [[ $DISTRIBUTION =~ _qt$ ]]
-}
-
 function package_deb()
 {
     DISTRIBUTION_REPOSITORY_FOLDER=$(realpath repositories)/${DISTRIBUTION}
     mkdir -p ${DISTRIBUTION_REPOSITORY_FOLDER}
-    mkdir -p ${DISTRIBUTION_REPOSITORY_FOLDER}_qt
-
-    ###########################################################
-    ## fetch qt deb (if not currently building a qt package) ##
-    ###########################################################
-    if ! is_distribution_qt; then
-        fetch_qt_deb
-    fi
 
     ##################################################
     ## Create local repository for the given distro ##
@@ -97,17 +75,17 @@ EOF
     ####################################
     ## Add packages to the repository ##
     ####################################
-    packages="packages/${DISTRIBUTION}*/*.deb"
-    if ! is_distribution_qt; then
-        packages+=" ${DISTRIBUTION_REPOSITORY_FOLDER}_qt/*.deb"
-    fi
-
-    for package in ${packages}; do
-        # Sign the deb
+    # Note: reprepro currently only accepts .deb files as input, but
+    # Ubuntu generates their debug symbol packages as .ddeb (see:
+    # https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=730572).  As
+    # these are just regular Debian packages, simply append the .deb
+    # extension to their file name to work around this.
+    find ./packages -type f -name '*.ddeb' -print0 | xargs -0 -I{} mv {} {}.deb
+
+    for package in packages/${DISTRIBUTION}*/*.deb; do
         echo "## signing: ${package} ##"
         dpkg-sig -k ${KEYID} --sign builder ${package}
 
-        # Include the deb
         echo "## including ${package} ##"
         package_name=$(dpkg -I ${package} | grep -m 1 Package: | awk '{print $2}')
         package_arch=$(dpkg -I ${package} | grep -m 1 Architecture: | awk '{print $2}')
@@ -212,7 +190,7 @@ EOF
     done
 
     # Create the repo
-    createrepo --update ${DISTRIBUTION_REPOSITORY_FOLDER}
+    createrepo_c --update ${DISTRIBUTION_REPOSITORY_FOLDER}
 
     #######################################
     ## create the manual download folder ##
diff --git a/scripts/install.sh b/scripts/install.sh
index 0481ac9e8af6f91ef668302e9c202bb917f4033e..5c2b8020986f8d431ee45711a946ad8b8d1b9223 100755
--- a/scripts/install.sh
+++ b/scripts/install.sh
@@ -183,7 +183,7 @@ else
     else
         client_cmake_flags+=(
             -DCMAKE_INSTALL_PREFIX="${INSTALL}/${client}"
-            -DRINGTONE_DIR="${INSTALL}/daemon/share/ring/ringtones"
+            -DRINGTONE_DIR="${INSTALL}/daemon/share/jami/ringtones"
             -DLibRingClient_DIR="${INSTALL}/lrc/lib/cmake/LibRingClient")
     fi
 fi
diff --git a/scripts/make-packaging-target.py b/scripts/make-packaging-target.py
deleted file mode 100755
index 60a3f136cb18d32b0c32805420b12b9f64473c57..0000000000000000000000000000000000000000
--- a/scripts/make-packaging-target.py
+++ /dev/null
@@ -1,303 +0,0 @@
-#!/usr/bin/env python3
-#
-# Copyright (C) 2016-2021 Savoir-faire Linux Inc.
-#
-# Author: Alexandre Viau <alexandre.viau@savoirfairelinux.com>
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
-#
-# Creates packaging targets for a distribution and architecture.
-# This helps reduce the length of the top Makefile.
-#
-
-import argparse
-
-template_header = """\
-# -*- mode: makefile -*-
-# This file was auto-generated by: scripts/make-packaging-target.py.
-#
-# We don't simply use jami-packaging-distro as the docker image name because
-# we want to be able to build multiple versions of the same distro at the
-# same time and it could result in race conditions on the machine as we would
-# overwrite the docker image of other builds.
-#
-# This does not impact caching as the docker daemon does not care about the image
-# names, just about the contents of the Dockerfile.
-"""
-
-target_template = """\
-##
-## Distro: %(distribution)s
-##
-
-PACKAGE_%(distribution)s_DOCKER_IMAGE_NAME:=jami-packaging-%(distribution)s$(RING_PACKAGING_IMAGE_SUFFIX)
-PACKAGE_%(distribution)s_DOCKER_IMAGE_FILE:=.docker-image-$(PACKAGE_%(distribution)s_DOCKER_IMAGE_NAME)
-DOCKER_EXTRA_ARGS =
-
-
-PACKAGE_%(distribution)s_DOCKER_RUN_COMMAND = docker run \\
-    --rm \\
-    -e RELEASE_VERSION=$(RELEASE_VERSION) \\
-    -e RELEASE_TARBALL_FILENAME=$(RELEASE_TARBALL_FILENAME) \\
-    -e DEBIAN_VERSION=%(version)s \\
-    -e CURRENT_UID=$(CURRENT_UID) \\
-    -e CURRENT_GID=$(CURRENT_GID) \\
-    -e DISTRIBUTION=%(distribution)s \\
-    -v $(CURDIR)/$(RELEASE_TARBALL_FILENAME):/src/$(RELEASE_TARBALL_FILENAME) \\
-    -v $(CURDIR):/opt/ring-project-ro:ro \\
-    -v $(CURDIR)/packages/%(distribution)s:/opt/output \\
-    -v /opt/cache-packaging:/opt/cache-packaging \\
-    -t $(DOCKER_EXTRA_ARGS) %(options)s \\
-    $(PACKAGE_%(distribution)s_DOCKER_IMAGE_NAME)
-
-$(PACKAGE_%(distribution)s_DOCKER_IMAGE_FILE): docker/Dockerfile_%(docker_image)s
-	docker build \\
-        -t $(PACKAGE_%(distribution)s_DOCKER_IMAGE_NAME) \\
-        -f docker/Dockerfile_%(docker_image)s %(docker_build_args)s \\
-        $(CURDIR)
-	touch $(PACKAGE_%(distribution)s_DOCKER_IMAGE_FILE)
-
-packages/%(distribution)s:
-	mkdir -p packages/%(distribution)s
-
-packages/%(distribution)s/%(output_file)s: $(RELEASE_TARBALL_FILENAME) packages/%(distribution)s $(PACKAGE_%(distribution)s_DOCKER_IMAGE_FILE)
-	$(PACKAGE_%(distribution)s_DOCKER_RUN_COMMAND)
-	touch packages/%(distribution)s/*
-
-.PHONY: package-%(distribution)s
-package-%(distribution)s: packages/%(distribution)s/%(output_file)s
-PACKAGE-TARGETS += package-%(distribution)s
-
-.PHONY: package-%(distribution)s-interactive
-package-%(distribution)s-interactive: DOCKER_EXTRA_ARGS = -i
-package-%(distribution)s-interactive: $(RELEASE_TARBALL_FILENAME) packages/%(distribution)s $(PACKAGE_%(distribution)s_DOCKER_IMAGE_FILE)
-	$(PACKAGE_%(distribution)s_DOCKER_RUN_COMMAND) bash
-"""
-
-
-RPM_BASED_SYSTEMS_DOCKER_RUN_OPTIONS = (
-    '--security-opt seccomp=./docker/profile-seccomp-fedora_28.json '
-    '--privileged')
-
-DPKG_BASED_SYSTEMS_DOCKER_RUN_OPTIONS = (
-    '-e QT_JAMI_PREFIX=$(QT_JAMI_PREFIX) '
-    '--privileged '
-    '--security-opt apparmor=docker-default ')
-
-DPKG_BASED_SYSTEMS_DOCKER_RUN_OPTIONS_QT = (
-    '-e QT_JAMI_PREFIX=$(QT_JAMI_PREFIX) '
-    '-e QT_MAJOR=$(QT_MAJOR) '
-    '-e QT_MINOR=$(QT_MINOR) '
-    '-e QT_PATCH=$(QT_PATCH) '
-    '-e QT_TARBALL_CHECKSUM=$(QT_TARBALL_CHECKSUM) '
-    '-v /opt/ring-contrib:/opt/ring-contrib '
-    '--privileged --security-opt apparmor=docker-default')
-
-
-def generate_target(distribution, output_file, options='', docker_image='',
-                    version='', docker_build_args=''):
-    if (docker_image == ''):
-        docker_image = distribution
-    if (version == ''):
-        version = "$(DEBIAN_VERSION)"
-    return target_template % {
-        "distribution": distribution,
-        "docker_image": docker_image,
-        "output_file": output_file,
-        "options": options,
-        "version": version,
-        "docker_build_args": docker_build_args,
-    }
-
-
-def run_generate(parsed_args):
-    print(generate_target(parsed_args.distribution,
-                          parsed_args.output_file,
-                          parsed_args.options,
-                          parsed_args.docker_image,
-                          parsed_args.version))
-
-
-def run_generate_all(parsed_args):
-    targets = [
-        # Debian
-        {
-            "distribution": "debian_10",
-            "output_file": "$(DEBIAN_DSC_FILENAME)",
-            "options": DPKG_BASED_SYSTEMS_DOCKER_RUN_OPTIONS,
-        },
-        {
-            "distribution": "debian_10_qt",
-            "output_file": "$(DEBIAN_QT_DSC_FILENAME)",
-            "options": DPKG_BASED_SYSTEMS_DOCKER_RUN_OPTIONS_QT,
-            "version": "$(DEBIAN_QT_VERSION)",
-        },
-        {
-            "distribution": "debian_testing",
-            "output_file": "$(DEBIAN_DSC_FILENAME)",
-            "options": DPKG_BASED_SYSTEMS_DOCKER_RUN_OPTIONS,
-        },
-        {
-            "distribution": "debian_testing_qt",
-            "output_file": "$(DEBIAN_QT_DSC_FILENAME)",
-            "options": DPKG_BASED_SYSTEMS_DOCKER_RUN_OPTIONS_QT,
-            "version": "$(DEBIAN_QT_VERSION)",
-        },
-        {
-            "distribution": "debian_unstable",
-            "output_file": "$(DEBIAN_DSC_FILENAME)",
-            "options": DPKG_BASED_SYSTEMS_DOCKER_RUN_OPTIONS,
-        },
-        {
-            "distribution": "debian_unstable_qt",
-            "output_file": "$(DEBIAN_QT_DSC_FILENAME)",
-            "options": DPKG_BASED_SYSTEMS_DOCKER_RUN_OPTIONS_QT,
-            "version": "$(DEBIAN_QT_VERSION)",
-        },
-        # Raspbian
-        {
-            "distribution": "raspbian_10_armhf",
-            "output_file": "$(DEBIAN_DSC_FILENAME)",
-            "options": "--privileged --security-opt apparmor=docker-default",
-        },
-        # Ubuntu
-        {
-            "distribution": "ubuntu_18.04",
-            "output_file": "$(DEBIAN_DSC_FILENAME)",
-            "options": "-e QT_JAMI_PREFIX=$(QT_JAMI_PREFIX)",
-        },
-        {
-            "distribution": "ubuntu_18.04_qt",
-            "output_file": "$(DEBIAN_QT_DSC_FILENAME)",
-            "options": DPKG_BASED_SYSTEMS_DOCKER_RUN_OPTIONS_QT,
-            "version": "$(DEBIAN_QT_VERSION)",
-        },
-        {
-            "distribution": "ubuntu_20.04",
-            "output_file": "$(DEBIAN_DSC_FILENAME)",
-            "options": DPKG_BASED_SYSTEMS_DOCKER_RUN_OPTIONS,
-        },
-        {
-            "distribution": "ubuntu_20.04_qt",
-            "output_file": "$(DEBIAN_QT_DSC_FILENAME)",
-            "options": DPKG_BASED_SYSTEMS_DOCKER_RUN_OPTIONS_QT,
-            "version": "$(DEBIAN_QT_VERSION)",
-        },
-        {
-            "distribution": "ubuntu_20.10",
-            "output_file": "$(DEBIAN_DSC_FILENAME)",
-            "options": DPKG_BASED_SYSTEMS_DOCKER_RUN_OPTIONS,
-        },
-        {
-            "distribution": "ubuntu_20.10_qt",
-            "output_file": "$(DEBIAN_QT_DSC_FILENAME)",
-            "options": DPKG_BASED_SYSTEMS_DOCKER_RUN_OPTIONS_QT,
-            "version": "$(DEBIAN_QT_VERSION)",
-        },
-        {
-            "distribution": "ubuntu_21.04",
-            "output_file": "$(DEBIAN_DSC_FILENAME)",
-            "options": DPKG_BASED_SYSTEMS_DOCKER_RUN_OPTIONS,
-        },
-        {
-            "distribution": "ubuntu_21.04_qt",
-            "output_file": "$(DEBIAN_QT_DSC_FILENAME)",
-            "options": DPKG_BASED_SYSTEMS_DOCKER_RUN_OPTIONS_QT,
-            "version": "$(DEBIAN_QT_VERSION)",
-        },
-        # Fedora
-        {
-            "distribution": "fedora_32",
-            "output_file": ".packages-built",
-            "options": RPM_BASED_SYSTEMS_DOCKER_RUN_OPTIONS
-        },
-        {
-            "distribution": "fedora_33",
-            "output_file": ".packages-built",
-            "options": RPM_BASED_SYSTEMS_DOCKER_RUN_OPTIONS
-        },
-        {
-            "distribution": "fedora_34",
-            "output_file": ".packages-built",
-            "options": RPM_BASED_SYSTEMS_DOCKER_RUN_OPTIONS
-        },
-        # Disabled 2021/05/21 because it's broken.
-        # {
-        #     "distribution": "rhel_8",
-        #     "output_file": ".packages-built",
-        #     "options": RPM_BASED_SYSTEMS_DOCKER_RUN_OPTIONS,
-        #     "docker_build_args": "--build-arg PASS=$${PASS}"
-        # },
-        # OpenSUSE
-        {
-            "distribution": "opensuse-leap_15.2",
-            "output_file": ".packages-built",
-            "options": RPM_BASED_SYSTEMS_DOCKER_RUN_OPTIONS
-        },
-        {
-            "distribution": "opensuse-tumbleweed",
-            "output_file": ".packages-built",
-            "options": RPM_BASED_SYSTEMS_DOCKER_RUN_OPTIONS
-        },
-        # Snap
-        {
-            "distribution": "snap",
-            "output_file": ".packages-built",
-            "options": "-e SNAP_PKG_NAME=$(or $(SNAP_PKG_NAME),jami)",
-        },
-
-    ]
-
-    for target in targets:
-        print(generate_target(**target))
-
-
-def parse_args():
-    ap = argparse.ArgumentParser(
-        description="Packaging targets generation tool"
-    )
-
-    ga = ap.add_mutually_exclusive_group(required=True)
-
-    # Action arguments
-    ga.add_argument('--generate',
-                    action='store_true',
-                    help='Generate a single packaging target')
-    ga.add_argument('--generate-all',
-                    action='store_true',
-                    help='Generates all packaging targets')
-
-    # Parameters
-    ap.add_argument('--distribution')
-    ap.add_argument('--output_file')
-    ap.add_argument('--options', default='')
-    ap.add_argument('--docker_image', default='')
-    ap.add_argument('--version', default='')
-
-    parsed_args = ap.parse_args()
-
-    return parsed_args
-
-
-def main():
-    parsed_args = parse_args()
-
-    print(template_header)
-    if parsed_args.generate:
-        run_generate(parsed_args)
-    elif parsed_args.generate_all:
-        run_generate_all(parsed_args)
-
-if __name__ == "__main__":
-    main()
diff --git a/scripts/prebuild-package-debian.sh b/scripts/prebuild-package-debian.sh
new file mode 100755
index 0000000000000000000000000000000000000000..ba0bce80f1771c875043df1d55fb55800de3e075
--- /dev/null
+++ b/scripts/prebuild-package-debian.sh
@@ -0,0 +1,86 @@
+#!/usr/bin/env bash
+#
+# Copyright (C) 2021 Savoir-faire Linux Inc.
+#
+# Author: Amin Bandali <amin.bandali@savoirfairelinux.com>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+# This script is used in the packaging containers to build packages on
+# debian-based distros.
+
+set -e
+
+DPKG_BUILD_OPTIONS=""
+# Set the host architecture as armhf and add some specific architecture
+# options to the package builder.
+if grep -q "raspbian_10_armhf" <<< "${DISTRIBUTION}"; then
+    echo "Adding armhf as the host architecture."
+    export HOST_ARCH=arm-linux-gnueabihf
+    DPKG_BUILD_OPTIONS="${DPKG_BUILD_OPTIONS} -a armhf"
+fi
+
+install_deps()
+{
+    apt-get update
+    mk-build-deps \
+        --remove --install \
+        --tool "apt-get -y --no-install-recommends -o Acquire::Retries=10" \
+        "debian/control"
+}
+
+install_dummy()
+{
+    cat <<EOF > dummy-libqt-jami.equivs
+Package: libqt-jami
+Version: 1.0
+Maintainer: The Jami project <jami@gnu.org>
+Architecture: all
+Description: Dummy libqt-jami package
+EOF
+    equivs-build dummy-libqt-jami.equivs
+    dpkg -i libqt-jami_1.0_all.deb
+}
+
+remove_dummy()
+{
+    dpkg -r libqt-jami
+}
+
+case "$1" in
+    qt-deps)
+        (
+            cd /tmp/builddeps
+            install_deps
+            dpkg -r libqt-jami-build-deps
+        )
+        rm -rf /tmp/builddeps
+        exit 0
+        ;;
+    jami-deps)
+        (
+            cd /tmp/builddeps
+            install_dummy
+            install_deps
+            dpkg -r jami-build-deps
+            remove_dummy
+        )
+        rm -rf /tmp/builddeps
+        exit 0
+        ;;
+    *)
+        printf "Usage: %s {qt-deps|jami-deps}\n" "$0"
+        exit 1
+        ;;
+esac