diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index cd2421bc35df3de3671347cd2c2403e4e946930c..8494fd639705f17353f56a2b57260fddd98cd968 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -57,7 +57,8 @@ b_bullseye_deb:
   script:
     - ./gradlew -Dorg.gradle.java.home=/usr/lib/jvm/java-11-openjdk-amd64 --no-daemon kaptKotlin
     - ./gradlew -Dorg.gradle.java.home=/usr/lib/jvm/java-17-openjdk-amd64 --no-daemon -PbuildType=nightly -x kaptKotlin packageDeb
-    - mv build/compose/binaries/main/deb/*.deb ./briar-desktop-debian-bullseye.deb
+    - utils/finalize-deb.sh
+    - mv build/compose/binaries/main/deb/briar-desktop.deb ./briar-desktop-debian-bullseye.deb
   artifacts:
     paths:
       - briar-desktop-debian-bullseye.deb
@@ -71,7 +72,8 @@ b_20_ubuntu_deb:
   script:
     - ./gradlew -Dorg.gradle.java.home=/usr/lib/jvm/java-11-openjdk-amd64 --no-daemon kaptKotlin
     - ./gradlew -Dorg.gradle.java.home=/usr/lib/jvm/java-17-openjdk-amd64 --no-daemon -PbuildType=nightly -x kaptKotlin packageDeb
-    - mv build/compose/binaries/main/deb/*.deb ./briar-desktop-ubuntu-20.04.deb
+    - utils/finalize-deb.sh
+    - mv build/compose/binaries/main/deb/briar-desktop.deb ./briar-desktop-ubuntu-20.04.deb
   artifacts:
     paths:
       - briar-desktop-ubuntu-20.04.deb
@@ -85,7 +87,8 @@ b_18_ubuntu_deb:
   script:
     - ./gradlew -Dorg.gradle.java.home=/usr/lib/jvm/java-11-openjdk-amd64 --no-daemon kaptKotlin
     - ./gradlew -Dorg.gradle.java.home=/usr/lib/jvm/java-17-openjdk-amd64 --no-daemon -PbuildType=nightly -x kaptKotlin packageDeb
-    - mv build/compose/binaries/main/deb/*.deb ./briar-desktop-ubuntu-18.04.deb
+    - utils/finalize-deb.sh
+    - mv build/compose/binaries/main/deb/briar-desktop.deb ./briar-desktop-ubuntu-18.04.deb
   artifacts:
     paths:
       - briar-desktop-ubuntu-18.04.deb
@@ -111,7 +114,8 @@ rb_bullseye_deb:
   script:
     - ./gradlew -Dorg.gradle.java.home=/usr/lib/jvm/java-11-openjdk-amd64 --no-daemon kaptKotlin
     - ./gradlew -Dorg.gradle.java.home=/usr/lib/jvm/java-17-openjdk-amd64 --no-daemon -PbuildType=beta -x kaptKotlin packageDeb
-    - mv build/compose/binaries/main/deb/*.deb ./briar-desktop-debian-bullseye.deb
+    - utils/finalize-deb.sh
+    - mv build/compose/binaries/main/deb/briar-desktop.deb ./briar-desktop-debian-bullseye.deb
   artifacts:
     paths:
       - briar-desktop-debian-bullseye.deb
@@ -125,7 +129,8 @@ rb_20_ubuntu_deb:
   script:
     - ./gradlew -Dorg.gradle.java.home=/usr/lib/jvm/java-11-openjdk-amd64 --no-daemon kaptKotlin
     - ./gradlew -Dorg.gradle.java.home=/usr/lib/jvm/java-17-openjdk-amd64 --no-daemon -PbuildType=beta -x kaptKotlin packageDeb
-    - mv build/compose/binaries/main/deb/*.deb ./briar-desktop-ubuntu-20.04.deb
+    - utils/finalize-deb.sh
+    - mv build/compose/binaries/main/deb/briar-desktop.deb ./briar-desktop-ubuntu-20.04.deb
   artifacts:
     paths:
       - briar-desktop-ubuntu-20.04.deb
@@ -139,7 +144,8 @@ rb_18_ubuntu_deb:
   script:
     - ./gradlew -Dorg.gradle.java.home=/usr/lib/jvm/java-11-openjdk-amd64 --no-daemon kaptKotlin
     - ./gradlew -Dorg.gradle.java.home=/usr/lib/jvm/java-17-openjdk-amd64 --no-daemon -PbuildType=beta -x kaptKotlin packageDeb
-    - mv build/compose/binaries/main/deb/*.deb ./briar-desktop-ubuntu-18.04.deb
+    - utils/finalize-deb.sh
+    - mv build/compose/binaries/main/deb/briar-desktop.deb ./briar-desktop-ubuntu-18.04.deb
   artifacts:
     paths:
       - briar-desktop-ubuntu-18.04.deb
diff --git a/build.gradle.kts b/build.gradle.kts
index 617395770e0d7cfabfccdc4bd6982eef53d02a06..c38d84864b7a3cb619efacc17f91497676fa30f9 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -126,6 +126,7 @@ compose.desktop {
             vendor = "The Briar Project"
             copyright = "2021-2022 The Briar Project"
             licenseFile.set(project.file("LICENSE.txt"))
+            appResourcesRootDir.set(project.layout.projectDirectory.dir("src/appResources"))
             // As described at https://github.com/JetBrains/compose-jb/tree/master/tutorials/Native_distributions_and_local_execution#configuring-included-jdk-modules
             // the Gradle plugin does not automatically determine necessary JDK modules to ship
             // so that we need to define required modules here:
diff --git a/src/appResources/linux/org.briarproject.Briar.metainfo.xml b/src/appResources/linux/org.briarproject.Briar.metainfo.xml
new file mode 100644
index 0000000000000000000000000000000000000000..30b56093125c405c963034e39d9c35df3960fffa
--- /dev/null
+++ b/src/appResources/linux/org.briarproject.Briar.metainfo.xml
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<component type="desktop-application">
+  <id>org.briarproject.Briar</id>
+  <metadata_license>CC-BY-4.0</metadata_license>
+  <project_license>AGPL-3.0-only</project_license>
+
+  <name>Briar</name>
+  <summary>Secure messaging, anywhere</summary>
+
+  <description>
+    <p>
+      Briar is a messaging app designed for activists, journalists, and anyone
+      else who needs a safe, easy and robust way to communicate. Unlike
+      traditional messaging apps, Briar doesn't rely on a central server -
+      messages are synchronized directly between the users' devices. If the
+      internet's down, Briar can sync via Bluetooth or Wi-Fi, keeping the
+      information flowing in a crisis. If the internet's up, Briar can sync via
+      the Tor network, protecting users and their relationships from
+      surveillance.
+    </p>
+  </description>
+
+  <launchable type="desktop-id">org.briarproject.Briar.desktop</launchable>
+
+  <url type="homepage">https://code.briarproject.org/briar/briar-desktop</url>
+  <url type="bugtracker">https://code.briarproject.org/briar/briar-desktop/-/issues</url>
+  <url type="faq">https://code.briarproject.org/briar/briar-desktop/blob/main/README.md#faq</url>
+  <url type="help">https://briarproject.org/manual/</url>
+  <url type="translate">https://www.transifex.com/otf/briar/</url>
+  <url type="donation">https://liberapay.com/Briar/donate</url>
+  <project_group>Briar</project_group>
+  <developer_name>The Briar Project</developer_name>
+  <update_contact>desktop@briarproject.org</update_contact>
+  
+  <content_rating type="oars-1.1">
+    <content_attribute id="social-chat">intense</content_attribute>
+  </content_rating>
+
+  <provides>
+    <binary>briar-desktop</binary>
+  </provides>
+
+  <custom>
+    <value key="Purism::form_factor">workstation</value>
+  </custom>
+
+  <releases>
+    <release version="0.2.0" date="2022-02-22">
+      <description>
+        <p>
+          See the changelog for more information on this release.
+        </p>
+      </description>
+      <url>https://code.briarproject.org/briar/briar-desktop/-/wikis/Changelog#anchor-020</url>
+    </release>
+  </releases>
+
+</component>
diff --git a/src/packagingResources/linux/postinst b/src/packagingResources/linux/postinst
new file mode 100755
index 0000000000000000000000000000000000000000..d3b38e2049c15100dbb4d3a8e9cf1156b1779088
--- /dev/null
+++ b/src/packagingResources/linux/postinst
@@ -0,0 +1,37 @@
+#!/bin/sh
+# postinst script for briar-desktop
+#
+# see: dh_installdeb(1)
+
+set -e
+
+# summary of how this script can be called:
+#        * <postinst> `configure' <most-recently-configured-version>
+#        * <old-postinst> `abort-upgrade' <new version>
+#        * <conflictor's-postinst> `abort-remove' `in-favour' <package>
+#          <new-version>
+#        * <postinst> `abort-remove'
+#        * <deconfigured's-postinst> `abort-deconfigure' `in-favour'
+#          <failed-install-package> <version> `removing'
+#          <conflicting-package> <version>
+# for details, see https://www.debian.org/doc/debian-policy/ or
+# the debian-policy package
+
+case "$1" in
+    configure)
+ln -nsf /opt/briar-desktop/lib/briar-desktop-Briar.desktop /opt/briar-desktop/lib/org.briarproject.Briar.desktop
+xdg-desktop-menu install --novendor /opt/briar-desktop/lib/org.briarproject.Briar.desktop
+ln -nsf /opt/briar-desktop/bin/Briar /usr/bin/briar-desktop
+ln -nsf /opt/briar-desktop/lib/app/resources/org.briarproject.Briar.metainfo.xml /usr/share/metainfo/org.briarproject.Briar.metainfo.xml
+    ;;
+
+    abort-upgrade|abort-remove|abort-deconfigure)
+    ;;
+
+    *)
+        echo "postinst called with unknown argument \`$1'" >&2
+        exit 1
+    ;;
+esac
+
+exit 0
diff --git a/src/packagingResources/linux/preinst b/src/packagingResources/linux/preinst
new file mode 100755
index 0000000000000000000000000000000000000000..cca697942440baa25eb8bc1112d0258de5660f97
--- /dev/null
+++ b/src/packagingResources/linux/preinst
@@ -0,0 +1,31 @@
+#!/bin/sh
+# preinst script for briar-desktop
+#
+# see: dh_installdeb(1)
+
+set -e
+
+# summary of how this script can be called:
+#        * <new-preinst> `install'
+#        * <new-preinst> `install' <old-version>
+#        * <new-preinst> `upgrade' <old-version>
+#        * <old-preinst> `abort-upgrade' <new-version>
+# for details, see https://www.debian.org/doc/debian-policy/ or
+# the debian-policy package
+
+
+case "$1" in
+    install|upgrade)
+mkdir -p /usr/share/desktop-directories/
+    ;;
+
+    abort-upgrade)
+    ;;
+
+    *)
+        echo "preinst called with unknown argument \`$1'" >&2
+        exit 1
+    ;;
+esac
+
+exit 0
diff --git a/src/packagingResources/linux/prerm b/src/packagingResources/linux/prerm
new file mode 100755
index 0000000000000000000000000000000000000000..124f009eadae9416d905f87d8fb3123b0efa3755
--- /dev/null
+++ b/src/packagingResources/linux/prerm
@@ -0,0 +1,39 @@
+#!/bin/sh
+# prerm script for briar-desktop
+#
+# see: dh_installdeb(1)
+
+set -e
+
+# summary of how this script can be called:
+#        * <prerm> `remove'
+#        * <old-prerm> `upgrade' <new-version>
+#        * <new-prerm> `failed-upgrade' <old-version>
+#        * <conflictor's-prerm> `remove' `in-favour' <package> <new-version>
+#        * <deconfigured's-prerm> `deconfigure' `in-favour'
+#          <package-being-installed> <version> `removing'
+#          <conflicting-package> <version>
+# for details, see https://www.debian.org/doc/debian-policy/ or
+# the debian-policy package
+
+
+
+
+case "$1" in
+    remove|upgrade|deconfigure)
+xdg-desktop-menu uninstall /opt/briar-desktop/lib/org.briarproject.Briar.desktop
+rm /usr/bin/briar-desktop
+rm /usr/share/metainfo/org.briarproject.Briar.metainfo.xml
+    ;;
+
+    failed-upgrade)
+    ;;
+
+    *)
+        echo "prerm called with unknown argument \`$1'" >&2
+        exit 1
+    ;;
+esac
+
+exit 0
+
diff --git a/utils/finalize-deb.sh b/utils/finalize-deb.sh
new file mode 100755
index 0000000000000000000000000000000000000000..43c9ec66b2f06b6527fd2baea00a73ef0c2719c4
--- /dev/null
+++ b/utils/finalize-deb.sh
@@ -0,0 +1,27 @@
+#!/bin/bash
+
+# A script for manually adding files to the produced .deb files.
+# https://unix.stackexchange.com/a/138190
+
+set -ex
+
+DIR=$(dirname $0)
+REPO="$DIR/.."
+OUTPUT="$REPO/deb"
+
+cd "$REPO/build/compose/binaries/main/deb"
+
+mkdir tmp
+cd tmp
+
+# Unpack control.tar.xz to tmp directory
+ar p ../*.deb control.tar.xz | tar -xJ
+ar d ../*.deb control.tar.xz
+
+# Replace preinst, postinst, prerm scripts
+#TODO
+
+# Repackage briar-desktop.deb
+cp ../*.deb ../briar-desktop.deb
+tar cfJ control.tar.xz ./*[!z]
+ar r ../briar-desktop.deb control.tar.xz