diff --git a/.github/workflows/issues.yml b/.github/workflows/issues.yml
index 7d1d5a9f0eeca9feea493f121c37541ad0d177ea..b24d192a1fbdcb0419e2d1d3c2bec7ff731e3b4b 100644
--- a/.github/workflows/issues.yml
+++ b/.github/workflows/issues.yml
@@ -10,14 +10,14 @@ jobs:
     steps:
       - name: "notify: new"
         if: github.event.issue.state == 'open'
-        uses: calamares/actions/matrix-notify@v1
+        uses: calamares/actions/matrix-notify@v2
         with:
           token: ${{ secrets.MATRIX_TOKEN }}
           room: ${{ secrets.MATRIX_ROOM }}
           message: "OPENED ${{ github.event.issue.html_url }} by ${{ github.actor }} ${{ github.event.issue.title }}"
       - name: "notify: closed"
         if: github.event.issue.state != 'open'
-        uses: calamares/actions/matrix-notify@v1
+        uses: calamares/actions/matrix-notify@v2
         with:
           token: ${{ secrets.MATRIX_TOKEN }}
           room: ${{ secrets.MATRIX_ROOM }}
diff --git a/.github/workflows/nightly-debian.yml b/.github/workflows/nightly-debian.yml
index 7b56c8f760e281bb6027f0ea044eb3d1df6c25e4..02b5fe38625458f89cc5c908c1eba2a32ee01593 100644
--- a/.github/workflows/nightly-debian.yml
+++ b/.github/workflows/nightly-debian.yml
@@ -22,77 +22,23 @@ jobs:
       options: --tmpfs /build:rw --user 0:0
     steps:
       - name: "prepare env"
-        run: |
-          apt-get update
-          apt-get -y install git-core jq
-          apt-get -y install \
-            build-essential \
-            cmake \
-            extra-cmake-modules \
-            gettext \
-            kio-dev \
-            libatasmart-dev \
-            libboost-python-dev \
-            libkf5config-dev \
-            libkf5coreaddons-dev \
-            libkf5i18n-dev \
-            libkf5iconthemes-dev \
-            libkf5parts-dev \
-            libkf5service-dev \
-            libkf5solid-dev \
-            libparted-dev \
-            libpolkit-qt5-1-dev \
-            libqt5svg5-dev \
-            libqt5webkit5-dev \
-            libyaml-cpp-dev \
-            os-prober \
-            pkg-config \
-            python3-dev \
-            qtbase5-dev \
-            qtdeclarative5-dev \
-            qttools5-dev \
-            qttools5-dev-tools
-          # Same name as on KDE neon, different version
-          apt-get -y install libkpmcore-dev
-          # Additional dependencies
-          apt-get -y install \
-            libappstreamqt-dev \
-            libicu-dev \
-            libkf5crash-dev \
-            libkf5package-dev \
-            libkf5plasma-dev \
-            libpwquality-dev \
-            libqt5webenginewidgets5 \
-            qtwebengine5-dev
+        uses: calamares/actions/prepare-debian@v2
       - name: "prepare source"
         uses: actions/checkout@v2
-      - name: "prepare build"
-        id: pre_build
-        run: |
-          test -n "$BUILDDIR" || { echo "! \$BUILDDIR not set" ; exit 1 ; }
-          mkdir -p $BUILDDIR
-          test -f $SRCDIR/CMakeLists.txt || { echo "! Missing $SRCDIR/CMakeLists.txt" ; exit 1 ; }
-          echo "::set-output name=message::"`git log -1 --abbrev-commit --pretty=oneline --no-decorate ${{ github.event.head_commit.id }}`
-      - name: "Calamares: cmake"
-        working-directory: ${{ env.BUILDDIR }}
-        run: cmake $CMAKE_ARGS $SRCDIR
-      - name: "Calamares: make"
-        working-directory: ${{ env.BUILDDIR }}
-        run: make -j2 VERBOSE=1
-      - name: "Calamares: install"
-        working-directory: ${{ env.BUILDDIR }}
-        run: make install VERBOSE=1
+      - name: "build"
+        id: build
+        uses: calamares/actions/generic-build@v2
       - name: "notify: ok"
         if: ${{ success() && github.repository == 'calamares/calamares' }}
-        uses: calamares/actions/matrix-notify@v1
+        uses: calamares/actions/matrix-notify@v2
         with:
           token: ${{ secrets.MATRIX_TOKEN }}
           room: ${{ secrets.MATRIX_ROOM }}
-          message: "OK ${{ github.workflow }} in ${{ github.repository }} ${{ steps.pre_build.outputs.message }}"
+          message: "OK ${{ github.workflow }} in ${{ github.repository }} ${{ steps.build.outputs.git-summary }}"
       - name: "notify: fail"
         if: ${{ failure() && github.repository == 'calamares/calamares' }}
-        uses: calamares/actions/matrix-notify@v1
+        uses: calamares/actions/matrix-notify@v2
         with:
           token: ${{ secrets.MATRIX_TOKEN }}
           room: ${{ secrets.MATRIX_ROOM }}
-          message: "FAIL ${{ github.workflow }} in ${{ github.repository }} ${{ steps.pre_build.outputs.message }}"
+          message: "FAIL ${{ github.workflow }} in ${{ github.repository }} ${{ steps.build.outputs.git-summary }}"
diff --git a/.github/workflows/nightly-neon.yml b/.github/workflows/nightly-neon.yml
index 05f23beb8850267493bea1f1059e003214481eb2..51a2b3fc6749c48aae08161595f4c5530eb840d1 100644
--- a/.github/workflows/nightly-neon.yml
+++ b/.github/workflows/nightly-neon.yml
@@ -22,59 +22,16 @@ jobs:
       options: --tmpfs /build:rw --user 0:0
     steps:
       - name: "prepare env"
-        run: |
-          sudo apt-get update
-          sudo apt-get -y install git-core jq
-          sudo apt-get -y install \
-            build-essential \
-            cmake \
-            extra-cmake-modules \
-            gettext \
-            kio-dev \
-            libatasmart-dev \
-            libboost-python-dev \
-            libkf5config-dev \
-            libkf5coreaddons-dev \
-            libkf5i18n-dev \
-            libkf5iconthemes-dev \
-            libkf5parts-dev \
-            libkf5service-dev \
-            libkf5solid-dev \
-            libkpmcore-dev \
-            libparted-dev \
-            libpolkit-qt5-1-dev \
-            libqt5svg5-dev \
-            libqt5webkit5-dev \
-            libyaml-cpp-dev \
-            os-prober \
-            pkg-config \
-            python3-dev \
-            qtbase5-dev \
-            qtdeclarative5-dev \
-            qttools5-dev \
-            qttools5-dev-tools
+        uses: calamares/actions/prepare-neon@v2
       - name: "prepare source"
         uses: actions/checkout@v2
-      - name: "prepare build"
-        id: pre_build
-        run: |
-          test -n "$BUILDDIR" || { echo "! \$BUILDDIR not set" ; exit 1 ; }
-          mkdir -p $BUILDDIR
-          test -f $SRCDIR/CMakeLists.txt || { echo "! Missing $SRCDIR/CMakeLists.txt" ; exit 1 ; }
-          echo "::set-output name=message::"`git log -1 --abbrev-commit --pretty=oneline --no-decorate ${{ github.event.head_commit.id }}`
-      - name: "Calamares: cmake"
-        working-directory: ${{ env.BUILDDIR }}
-        run: cmake $CMAKE_ARGS $SRCDIR
-      - name: "Calamares: make"
-        working-directory: ${{ env.BUILDDIR }}
-        run: make -j2 VERBOSE=1
-      - name: "Calamares: install"
-        working-directory: ${{ env.BUILDDIR }}
-        run: make install VERBOSE=1 DESTDIR=${{ env.BUILDDIR }}/stage
+      - name: "build"
+        id: build
+        uses: calamares/actions/generic-build@v2
       - name: "Calamares: archive"
         working-directory: ${{ env.BUILDDIR }}
         run: tar czf calamares.tar.gz stage
-      - name: "upload"
+      - name: "Calamares: upload"
         uses: actions/upload-artifact@v2
         with:
           name: calamares-tarball
@@ -83,15 +40,15 @@ jobs:
           retention-days: 3
       - name: "notify: ok"
         if: ${{ success() && github.repository == 'calamares/calamares' }}
-        uses: calamares/actions/matrix-notify@v1
+        uses: calamares/actions/matrix-notify@v2
         with:
           token: ${{ secrets.MATRIX_TOKEN }}
           room: ${{ secrets.MATRIX_ROOM }}
-          message: "OK ${{ github.workflow }} in ${{ github.repository }} ${{ steps.pre_build.outputs.message }}"
+          message: "OK ${{ github.workflow }} in ${{ github.repository }} ${{ steps.build.outputs.git-summary }}"
       - name: "notify: fail"
         if: ${{ failure() && github.repository == 'calamares/calamares' }}
-        uses: calamares/actions/matrix-notify@v1
+        uses: calamares/actions/matrix-notify@v2
         with:
           token: ${{ secrets.MATRIX_TOKEN }}
           room: ${{ secrets.MATRIX_ROOM }}
-          message: "FAIL ${{ github.workflow }} in ${{ github.repository }} ${{ steps.pre_build.outputs.message }}"
+          message: "FAIL ${{ github.workflow }} in ${{ github.repository }} ${{ steps.build.outputs.git-summary }}"
diff --git a/.github/workflows/nightly-opensuse.yml b/.github/workflows/nightly-opensuse.yml
index 24987cc7c900016f288580da18df412429153a01..ff395d5fb8b9c1bf58c26b7689fb443a8213ddd6 100644
--- a/.github/workflows/nightly-opensuse.yml
+++ b/.github/workflows/nightly-opensuse.yml
@@ -22,75 +22,23 @@ jobs:
       options: --tmpfs /build:rw --user 0:0
     steps:
       - name: "prepare env"
-        run: |
-          zypper --non-interactive up
-          zypper --non-interactive in git-core jq curl
-          # From deploycala.py
-          zypper --non-interactive in \
-            "autoconf" \
-            "automake" \
-            "bison" \
-            "flex" \
-            "git" \
-            "libtool" \
-            "m4" \
-            "make" \
-            "cmake" \
-            "extra-cmake-modules" \
-            "gcc-c++" \
-            "libqt5-qtbase-devel" \
-            "libqt5-linguist-devel" \
-            "libqt5-qtsvg-devel" \
-            "libqt5-qtdeclarative-devel" \
-            "libqt5-qtwebengine-devel" \
-            "yaml-cpp-devel" \
-            "libpolkit-qt5-1-devel" \
-            "kservice-devel" \
-            "kpackage-devel" \
-            "kparts-devel" \
-            "kcrash-devel" \
-            "kpmcore-devel" \
-            "plasma5-workspace-devel" \
-            "plasma-framework-devel" \
-            "libpwquality-devel" \
-            "parted-devel" \
-            "python3-devel" \
-            "boost-devel" \
-            "libboost_python-py3-*-devel"
-          # Additional dependencies
-          zypper --non-interactive in \
-            libicu-devel \
-            libAppStreamQt-devel \
-            libatasmart-devel
+        uses: calamares/actions/prepare-opensuse@v2
       - name: "prepare source"
         uses: actions/checkout@v2
-      - name: "prepare build"
-        id: pre_build
-        run: |
-          test -n "$BUILDDIR" || { echo "! \$BUILDDIR not set" ; exit 1 ; }
-          mkdir -p $BUILDDIR
-          test -f $SRCDIR/CMakeLists.txt || { echo "! Missing $SRCDIR/CMakeLists.txt" ; exit 1 ; }
-          echo "::set-output name=message::"`git log -1 --abbrev-commit --pretty=oneline --no-decorate ${{ github.event.head_commit.id }}`
-      - name: "Calamares: cmake"
-        working-directory: ${{ env.BUILDDIR }}
-        run: cmake $CMAKE_ARGS $SRCDIR
-      - name: "Calamares: make"
-        working-directory: ${{ env.BUILDDIR }}
-        run: make -j2 VERBOSE=1
-      - name: "Calamares: install"
-        working-directory: ${{ env.BUILDDIR }}
-        run: make install VERBOSE=1
+      - name: "build"
+        id: build
+        uses: calamares/actions/generic-build@v2
       - name: "notify: ok"
         if: ${{ success() && github.repository == 'calamares/calamares' }}
-        uses: calamares/actions/matrix-notify@v1
+        uses: calamares/actions/matrix-notify@v2
         with:
           token: ${{ secrets.MATRIX_TOKEN }}
           room: ${{ secrets.MATRIX_ROOM }}
-          message: "OK ${{ github.workflow }} in ${{ github.repository }} ${{ steps.pre_build.outputs.message }}"
+          message: "OK ${{ github.workflow }} in ${{ github.repository }} ${{ steps.build.outputs.git-summary }}"
       - name: "notify: fail"
         if: ${{ failure() && github.repository == 'calamares/calamares' }}
-        uses: calamares/actions/matrix-notify@v1
+        uses: calamares/actions/matrix-notify@v2
         with:
           token: ${{ secrets.MATRIX_TOKEN }}
           room: ${{ secrets.MATRIX_ROOM }}
-          message: "FAIL ${{ github.workflow }} in ${{ github.repository }} ${{ steps.pre_build.outputs.message }}"
+          message: "FAIL ${{ github.workflow }} in ${{ github.repository }} ${{ steps.build.outputs.git-summary }}"
diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml
index 23d4b91e2da55ec77754050eb14a431b5ad65a41..8d67f1865f63aa7872e4c4239183ea4fb594de6e 100644
--- a/.github/workflows/push.yml
+++ b/.github/workflows/push.yml
@@ -36,7 +36,7 @@ jobs:
         uses: calamares/actions/generic-build@v2
       - name: "notify: ok"
         if: ${{ success() && github.repository == 'calamares/calamares' }}
-        uses: calamares/actions/matrix-notify@v1
+        uses: calamares/actions/matrix-notify@v2
         with:
           token: ${{ secrets.MATRIX_TOKEN }}
           room: ${{ secrets.MATRIX_ROOM }}
@@ -45,7 +45,7 @@ jobs:
             .. ${{ steps.build.outputs.git-summary }}
       - name: "notify: fail"
         if: ${{ failure() && github.repository == 'calamares/calamares' }}
-        uses: calamares/actions/matrix-notify@v1
+        uses: calamares/actions/matrix-notify@v2
         with:
           token: ${{ secrets.MATRIX_TOKEN }}
           room: ${{ secrets.MATRIX_ROOM }}