diff --git a/.gitignore b/.gitignore
index 45bfe2e316b51e6fde2ed6a968cb0183be917aa9..8fcef1cc80e3ef3ce1c7281bc5372dc7b3415d62 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1,5 @@
 *.iso
 grub_target.cfg
+iso-content
+manjaro-dependencies/pkg
+manjaro-dependencies/*.tar.zst
diff --git a/README.md b/README.md
index 6ffd0f5db1b202239f4e28070256345f568d8dae..ce7c70fa2d434ba9ecdd02ae471f3c0e8784247c 100644
--- a/README.md
+++ b/README.md
@@ -5,17 +5,20 @@ Its name could mean at least one of:
 - **T**ARDIS **a**ssisted **R**e**d**istribution of L**i**nux **S**ystems
 - **T**ARDIS **a**ssisted **R**edistribution **D**evice for L**i**nux **S**ystems
 - **T**ARDIS **a**ugmented **r**eliable **d**istribution **i**nstaller **s**tick
+- **T**he **a**utomated **r**eproducible **d**istribution **i**nstallation **s**ystem
 
 # How to use it
-1. Install the dependencies. On ubuntu you can do that by going to [ubuntu-dependencies](ubuntu-dependencies), executing [build.sh](ubuntu-dependencies/build.sh) and then installing the created `tardis.deb`. For other systems you can view the dependency list in [debian package control file](ubuntu-dependencies/tardisDev/DEBIAN/control).
-2. Download the kubuntu version, that is mentioned at the start of [assemble\_image.sh](assemble_image.sh)
-3. Create a directory `/workspace`, that is owned by your regular non-root user
-4. (OPTIONAL) Set `USE_OFFLINE_REPO` in [assemble\_image.sh](assemble_image.sh) to `1`, to create an offline repo on the stick
-5. You call [assemble\_image.sh](assemble_image.sh). This takes some time.
-6. The compiled image is at `/workspace/output.img`. It is an MBR/DOS-partitioned image, that can be copied byte-by-byte onto a stick (for example with `sudo dd if=/workspace/output.img of=/dev/sdX bs=4M conv=fsync oflag=direct status=progress` replacing `/dev/sdX`, with your stick's device-file and sudo with the privilege elevation tool of your choice).
+1. Setup a manjaro system, either a virtual machine or preferably directly on hardware. Manjaro in docker doesn't work.
+2. Install the dependencies. You can do that by going to [manjaro-dependencies](manjaro-dependencies), executing `makepkg` and then installing the created pavkage with `sudo pacman -U ./tardis-dev-dependencies-1.0-1-x86_64.pkg.tar.zst`.
+3. You call [assemble\_image.sh](assemble_image.sh). This takes some time.
+4. The compiled image is at `workspace/output.img`. It is an MBR/DOS-partitioned image, that can be copied byte-by-byte onto a stick (for example with `sudo dd if=/workspace/output.img of=/dev/sdX bs=4M conv=fsync oflag=direct status=progress` replacing `/dev/sdX`, with your stick's device-file and sudo with the privilege elevation tool of your choice).
 
 # How it works internally
+We use the [well documented](https://github.com/calamares/calamares/wiki/Deploy-Guide) [calamares](https://github.com/calamares/calamares) installer and the [somewhat documented](https://wiki.manjaro.org/index.php?title=Build_Manjaro_ISOs_with_buildiso) [buildiso manjaro-tool](https://gitlab.manjaro.org/tools/development-tools/manjaro-tools).
 
-We use the preseed mechanism of debian-installer to start scripts before and after the regular installation and to set the language.
-Information about preseeding can be found in the [debian manual](https://www.debian.org/releases/stable/amd64/apb.en.html).
-Information about the ubuntu specific options can be found in the [ubuntu wiki](https://wiki.ubuntu.com/UbiquityAutomation).
+# How to update to new Manjaro versions?
+1. Update the `ISO` variable in [extract\_iso\_fs.sh](extract_iso_fs.sh) to the path to the newest image.
+1. Extract new iso-content with [extract\_iso\_fs.sh](extract_iso_fs.sh)
+1. Look what changed in iso-content/livefs/etc/calamares/settings.conf and merge with [own calamares config](calamares-settings.conf)
+1. Look what changed in iso-content/livefs/usr/share/grub/cfg and merge with [own grub config](grub-cfg)
+1. Update linux kernel reference of the two `buildiso` commands in [assemble\_image.sh](assemble_image.sh) to the newest supported LTS release.
diff --git a/assemble_image.sh b/assemble_image.sh
index 16e64c5901bdbd7c2afe44157ba4f0e443d6572f..5aecfa8a63af6d687cdad37d0555f8269b0341b7 100755
--- a/assemble_image.sh
+++ b/assemble_image.sh
@@ -3,63 +3,125 @@
 set -e
 set -x
 
-image_size="3600M"
-img1="kubuntu-22.04-desktop-amd64.iso"
-bootimg="$img1"
-: ${workspace:="/workspace"}
-: ${USE_OFFLINE_REPO:=0}
-if [[ "$USE_OFFLINE_REPO" -eq 1 ]]
-then
-    offlinerepo1='archives-jammy'
-    image_size='7300M'
-fi
-
-# mtools, ddrescure, fdisk, grub, 7z
-rm -rf "$workspace/part_files"
-mkdir -p "$workspace/part_files"
-# copy only relevant files
-git -C "$workspace/part_files" clone --depth 1 --single-branch --branch tardis https://git.fsmpi.rwth-aachen.de/osak/lipstick.git .
-rsync -av /usr/lib/grub/i386-efi "$workspace/part_files"/grub
-rsync -av /usr/lib/grub/i386-pc "$workspace/part_files"/grub
-rsync -av /usr/share/grub/themes "$workspace/part_files"/grub
-mkdir -p "$workspace/part_files"/grub/fonts/
-rsync -av /usr/share/grub/unicode.pf2 "$workspace/part_files"/grub/fonts/
-
-7z x "$bootimg" -o"$workspace/part_files" EFI/
-7z x "$bootimg" -o"$workspace/part_files" boot/grub/x86_64-efi
-
-mv "$workspace/part_files"/grub/* "$workspace/part_files"/boot/grub/
-rm -rf "$workspace/part_files"/grub
-
-7z x "$img1" /preseed/kubuntu.seed -o"$workspace/part_files"
-cat "$workspace/part_files/preseed/lip.seed" >> "$workspace/part_files/preseed/kubuntu.seed"
-mv -f "$workspace/part_files/preseed/kubuntu.seed" "$workspace/part_files/preseed/lip.seed"
-xorriso -indev "$img1" -outdev "$workspace/part_files/$img1" -map "$workspace/part_files/preseed" /preseed -rm /preseed/kubuntu.seed -- -chown_r 0 /preseed -- -chgrp_r 0 /preseed -- -chmod_r a+rwx /preseed
-
-source ./grub_config.sh # functions to fill grub_template.cfg
-cp grub_template.cfg "$workspace/part_files/boot/grub/grub.cfg"
-fill_grub_config_template "$img1" "$workspace/part_files/boot/grub/grub.cfg"
-
-if [[ "$USE_OFFLINE_REPO" -eq 1 ]]
-then
-    # Note: in practice you might still want to create the offline repo separately and just copy or move the directories here.
-    # Creating the offline repo requires root privileges and can be quite slow.
-    ./create_offlinerepo.sh "$workspace/part_files/$offlinerepo1" "$img1" $(grep '^[^#]' packages | cut -d'|' -f 2)
-fi
-
-cp packages "$workspace/part_files/packages"
-# The following command is dangerous: If offline repo is missing and "download updates while installing" is selected (default), this will install ALL listed packages during the installation.
-#echo "ubiquity ubiquity/keep-installed string $(grep '^[^#]' packages | cut -d'|' -f 2 | tr '\n' ' ')" >> "$workspace/part_files/preseed/lip.seed"
-
-rm -f "$workspace/part.img"
-truncate -s "$image_size" "$workspace/part.img"
-mkfs.vfat -n "LIPSTICK" "$workspace/part.img"
-# Note: in *ubuntu 21.10 mcopy has a bug and option "-b" should be removed.
-MTOOLS_SKIP_CHECK=1 mcopy -i "$workspace/part.img" -b -s -v "$workspace/part_files"/* "$workspace/part_files"/.git ::
-rm -rf "$workspace/part_files"
-grub-mkimage --prefix "(hd0,msdos1)/boot/grub" --output "$workspace/grub.i386-pc.img" --format "i386-pc" part_msdos fat ext2 biosdisk
-dd if=/usr/lib/grub/i386-pc/boot.img of="$workspace/output.img" bs=446 count=1
-dd if="$workspace/grub.i386-pc.img" of="$workspace/output.img" bs=512 seek=1
-ddrescue --output-position=2048s --sparse "$workspace/part.img" "$workspace/output.img"
-printf "label: dos\nunit: sectors\n2048,+,b,*\n" | sfdisk "$workspace/output.img"
-echo "Used $(du -s -h "$workspace/output.img" | cut -f1) of ${image_size}"
+# Params
+WORKSPACE="workspace"
+
+# Helpers
+REGULAR_USER="${SUDO_USER:-${USER}}"
+REGULAR_USER_HOME=$(getent passwd "$REGULAR_USER" | cut -d: -f6)
+ISO_PROFILES_REPO="$REGULAR_USER_HOME/iso-profiles"
+PROFILE="$ISO_PROFILES_REPO/osak/lip"
+
+# https://stackoverflow.com/questions/1527049/how-can-i-join-elements-of-an-array-in-bash
+function join_by {
+  local d=${1-} f=${2-}
+  if shift 2; then
+    printf %s "$f" "${@/#/$d}"
+  fi
+}
+
+rm -rf "$ISO_PROFILES_REPO"
+rm -rf workspace
+mkdir workspace
+chmod a+rx workspace
+git clone --depth 1 https://gitlab.manjaro.org/profiles-and-settings/iso-profiles.git "$ISO_PROFILES_REPO"
+mkdir -p "$PROFILE"
+rsync -a --copy-links "$ISO_PROFILES_REPO/manjaro/kde/" "$PROFILE"
+grep '^[^|#]*L[^|]*|' packages | cut -d'|' -f 2 >> "$PROFILE/Packages-Live"
+grep '^[^|#]*D[^|]*|' packages | cut -d'|' -f 2 >> "$PROFILE/Packages-Desktop"
+
+remove_live_package() {
+  pkg="${1:?}"
+  cat "$PROFILE/Packages-Live" | grep --invert-match "$pkg" > "$PROFILE/Packages-Live.tmp"
+  mv "$PROFILE/Packages-Live.tmp" "$PROFILE/Packages-Live"
+}
+
+remove_desktop_package() {
+  pkg="${1:?}"
+  cat "$PROFILE/Packages-Desktop" | grep --invert-match "$pkg" > "$PROFILE/Packages-Desktop.tmp"
+  mv "$PROFILE/Packages-Desktop.tmp" "$PROFILE/Packages-Desktop"
+}
+
+remove_live_package "manjaro-hello"
+remove_desktop_package "manjaro-hello"
+
+LIVE="$PROFILE/live-overlay"
+mkdir -p "$LIVE/usr/share/applications"
+ETC_CAL="$LIVE/etc/calamares"
+mkdir -p "$ETC_CAL/modules"
+
+mkdir -p "$LIVE/usr/share/grub/cfg"
+rsync --recursive grub-cfg/ "$LIVE/usr/share/grub/cfg"
+cp "calamares.desktop" "$LIVE/usr/share/applications/calamares.desktop"
+
+configure_package_chooser() {
+  local ID="${1:?}"
+  local WILDCARD="${2:?}"
+  local EN="${3:?}"
+  local DE="${4:?}"
+cat > "$ETC_CAL/modules/packages_$ID.conf" << EOF
+mode: optionalmultiple
+method: packages
+labels:
+  step: "$EN"
+  step[de]: "$DE"
+
+default: id0
+
+items:
+EOF
+  local i=0
+  while read -r line; do
+    name="$(echo "$line" | cut -d'|' -f 3)"
+    packages="$(echo "$line" | cut -d'|' -f 2)"
+    id="id$i"
+    i="$((i + 1))"
+    echo "- id: $id" >> "$ETC_CAL/modules/packages_$ID.conf"
+    echo "  name: \"$name\"" >> "$ETC_CAL/modules/packages_$ID.conf"
+    echo "  packages: [$(join_by ", " $packages)]" >> "$ETC_CAL/modules/packages_$ID.conf"
+  done < <(grep "^[^|#]*[$WILDCARD][^|]*|" packages)
+}
+
+configure_package_chooser common "cC" "Common Packages" "Allgemeine Software"
+configure_package_chooser mathe "mM" "Mathematics Packages" "Mathematik-Software"
+configure_package_chooser physik "pP" "Physics Packages" "Physik-Software"
+configure_package_chooser informatik "iI" "Computer Science Packages" "Informatik-Software"
+cp calamares-packages.conf "$ETC_CAL/modules/packages.conf"
+
+chown "$REGULAR_USER:$REGULAR_USER" -R "$ISO_PROFILES_REPO"
+
+create_offline_repo() {
+  local DESKTOPFS="/var/lib/manjaro-tools/buildiso/lip/x86_64/desktopfs"
+  local PACMAN_DB="$DESKTOPFS/var/lib/pacman"
+  mkdir -p "$PACMAN_DB"
+  local PACMAN_CACHE="$DESKTOPFS/var/cache/pacman/pkg"
+  mkdir -p "$PACMAN_CACHE"
+  grep '^[^|#][cCmMpPiI][^|]*|' packages | cut -d'|' -f 2 | tr '\n' ' ' > "$WORKSPACE/offline_packages.txt"
+  CACHE="${XDG_CACHE_HOME:-"$HOME/.cache"}/lip-build/pacman"
+  mkdir -p "$CACHE/db"
+  mkdir -p "$CACHE/pkg"
+  pacman -Sy --dbpath "$CACHE/db"
+  rsync -a "$CACHE/db/" "$PACMAN_DB"
+  pacman -S --dbpath "$PACMAN_DB" --cachedir "$CACHE/pkg" --downloadonly --noconfirm $(cat "$WORKSPACE/offline_packages.txt")
+  rsync -a "$CACHE/pkg/" "$PACMAN_CACHE"
+}
+
+set +e # buildiso returns a 1 on partial builds
+buildiso -p lip -x -k linux515 # build only filesystems, but not the iso
+BO="$?"
+set -e
+[[ 1 -eq "$BO" ]]
+
+# override some of the generated files
+cp -f calamares-settings.conf /var/lib/manjaro-tools/buildiso/lip/x86_64/livefs/etc/calamares/settings.conf
+create_offline_repo
+
+set +e # buildiso returns a 1 on partial builds
+buildiso -p lip -zc -k linux515 # and then build the iso
+BO="$?"
+set -e
+[[ 1 -eq "$BO" ]]
+
+mv /var/cache/manjaro-tools/iso/osak/lip/*/*.iso "$WORKSPACE"
+
+# vim: tabstop=2 shiftwidth=2 expandtab number
diff --git a/calamares-packages.conf b/calamares-packages.conf
new file mode 100644
index 0000000000000000000000000000000000000000..09f7418d2148abd5678a820e7c81c03340d30d66
--- /dev/null
+++ b/calamares-packages.conf
@@ -0,0 +1,4 @@
+backend: pacman
+skip_if_no_internet: false
+update_db: false
+update_system: false
diff --git a/calamares-settings.conf b/calamares-settings.conf
new file mode 100644
index 0000000000000000000000000000000000000000..1b72ce351f64149bfbf96b1ddea9578cfc8d54f0
--- /dev/null
+++ b/calamares-settings.conf
@@ -0,0 +1,65 @@
+---
+modules-search: [ local ]
+
+instances:
+- id: common
+  module: packagechooser
+  config: packages_common.conf
+- id: mathe
+  module: packagechooser
+  config: packages_mathe.conf
+- id: physik
+  module: packagechooser
+  config: packages_physik.conf
+- id: informatik
+  module: packagechooser
+  config: packages_informatik.conf
+
+sequence:
+    - show:
+        - welcome
+        - locale
+        - keyboard
+        - packagechooser@common
+        - packagechooser@mathe
+        - packagechooser@physik
+        - packagechooser@informatik
+        - partition
+        - users
+        - summary
+    - exec:
+        - partition
+        - mount
+        - unpackfs
+        - networkcfg
+        - machineid
+        - fstab
+        - locale
+        - keyboard
+        - localecfg
+        - luksopenswaphookcfg
+        - luksbootkeyfile
+        - initcpiocfg
+        - initcpio
+        - users
+        - displaymanager
+        - mhwdcfg
+        - hwclock
+        - services
+        - grubcfg
+        - bootloader
+        - postcfg
+        - packages
+        - umount
+    - show:
+        - finished
+
+branding: manjaro
+
+prompt-install: true
+
+dont-chroot: false
+oem-setup: false
+disable-cancel: false
+disable-cancel-during-exec: true
+quit-at-end: false
diff --git a/calamares.desktop b/calamares.desktop
new file mode 100644
index 0000000000000000000000000000000000000000..23b8c15357c8e25530967d4e6a8483629169e008
--- /dev/null
+++ b/calamares.desktop
@@ -0,0 +1,16 @@
+[Desktop Entry]
+Type=Application
+Version=1.0
+Name=Install Manjaro Linux
+Name[da]=Installer Manjaro Linux
+GenericName=Live Installer
+GenericName[da]=Live-installationsprogram
+Comment=Install the operating system to disk
+Comment[da]=Installer styresystemet på disk
+Comment[de]=Manjaro Linux installieren
+Exec=/usr/bin/calamares_polkit -d %f
+Icon=calamares
+Terminal=false
+StartupNotify=true
+Type=Application
+Categories=Qt;System;
diff --git a/cleanup.sh b/cleanup.sh
new file mode 100755
index 0000000000000000000000000000000000000000..ba75e246cb63e907eed8d246d9efedbfb51a3345
--- /dev/null
+++ b/cleanup.sh
@@ -0,0 +1,16 @@
+#!/bin/bash
+
+set -e
+set -x
+
+# Params
+WORKSPACE="workspace"
+
+# Helpers
+MOUNTED_ISO="$WORKSPACE/iso"
+
+umount "$MOUNTED_ISO"
+losetup -d /dev/loop0
+rm -rf workspace
+
+# vim: tabstop=2 shiftwidth=2 expandtab nu
diff --git a/extract_iso_fs.sh b/extract_iso_fs.sh
new file mode 100755
index 0000000000000000000000000000000000000000..c5e340cceb825ab33c993279313fe5b87c131ee6
--- /dev/null
+++ b/extract_iso_fs.sh
@@ -0,0 +1,18 @@
+#!/bin/bash
+
+ISO="/mnt/osiris/distros/manjaro/manjaro-kde-22.0.0-220816-linux515.iso"
+MOUNTED_ISO="/tmp/manjaro-iso"
+DEST="iso-content"
+rm -rf "$MOUNTED_ISO" "$DEST"
+mkdir "$MOUNTED_ISO"
+mkdir "$DEST"
+
+LOOP=$(losetup --partscan --find --show "$ISO")
+mount /dev/loop0p1 "$MOUNTED_ISO"
+unsquashfs -dest "$DEST/livefs" "$MOUNTED_ISO/manjaro/x86_64/livefs.sfs"
+unsquashfs -dest "$DEST/desktopfs" "$MOUNTED_ISO/manjaro/x86_64/desktopfs.sfs"
+unsquashfs -dest "$DEST/mhwdfs" "$MOUNTED_ISO/manjaro/x86_64/mhwdfs.sfs"
+unsquashfs -dest "$DEST/rootfs" "$MOUNTED_ISO/manjaro/x86_64/rootfs.sfs"
+umount "$MOUNTED_ISO"
+losetup --detach "$LOOP"
+rm -d "$MOUNTED_ISO"
diff --git a/grub-cfg/defaults.cfg b/grub-cfg/defaults.cfg
new file mode 100644
index 0000000000000000000000000000000000000000..ea6ab8d3dd8db9043621f77efbee58924b270ac4
--- /dev/null
+++ b/grub-cfg/defaults.cfg
@@ -0,0 +1,10 @@
+if [ -z "${def_bootlang}" ]; then
+    def_bootlang="de_DE"
+    def_keyboard="de"
+    def_timezone="Europe/Berlin"
+fi
+if [ -z "${bootlang}" ]; then
+    bootlang="lang=${def_bootlang}"
+    keyboard="keytable=${def_keyboard}"
+    timezone="tz=${def_timezone}"
+fi
diff --git a/grub-cfg/grub.cfg b/grub-cfg/grub.cfg
new file mode 100644
index 0000000000000000000000000000000000000000..b387ceee3aa1fcb13e953ff6732ea38139254f57
--- /dev/null
+++ b/grub-cfg/grub.cfg
@@ -0,0 +1,545 @@
+insmod font
+insmod keylayouts
+insmod part_msdos
+insmod part_gpt
+
+export loaded
+export koptsok
+export disable_gfxterm
+export bootarch
+export firmware
+export firmware_found
+export from
+export fromiso
+export bootlang
+export keyboard
+export timezone
+export hwclock
+export def_bootlang
+export def_keyboard
+export def_timezone
+export menu_color_normal
+export menu_color_highlight
+export pager
+
+function menu_help {
+    check_help
+    grub_help
+}
+
+function check_help {
+    if [ -z "${koptsok}" ]; then
+        echo $"WARNING: nothing set"
+        echo $" System will use defaults"
+        echo  "  American English <> utc clock <> us "$"keyboard <> free drivers"
+        echo ""
+    fi
+}
+
+function kopts_help {
+    echo $"Example boot command line arguments:"
+    echo $" Setup"
+    echo  "  lang=<language>_<variant> keytable=<layout>         tz=<region>/<city>"
+    echo  "  hostname=<name>           username=<name>"
+    echo $" Kernel"
+    echo  "  blacklist=<module>"
+    echo $" Video"
+    echo  "  <module>.modeset=0"
+    echo  "  radeon.modeset=0          nouveau.modeset=0         i915.modeset=0"
+    echo  "  video=VGA-1:1920x1080e    DVI-0:800x600"
+    echo ""
+}
+
+function grub_help {
+    echo $"To use the menu:"
+    echo $" press up or down to move between items"
+    echo $" press enter or right to select the item"
+    echo $" press e to edit the current item"
+    echo $" press c to go to the grub command line"
+    echo ""
+    echo $"Simply edit the first line of most menus to control them"
+    echo $"Select or edit the blank line to enter command line arguments"
+    echo ""
+}
+
+function menu_reload {
+    configfile /boot/grub/grub.cfg
+}
+
+function menu_continue {
+    echo -n $"Press Enter to continue"
+    read mcont
+}
+
+function prompt {
+    echo -n "> "
+}
+
+function is_efi {
+    if [ "${grub_platform}" = "efi" ]; then
+        return 0
+    fi
+    return 1
+}
+
+function efi_detect {
+    if is_efi ; then
+        submenu --class=find.efi --hotkey=f "Detect EFI bootloaders" {
+            efi_found=false
+
+            for efi in (*,gpt*)/efi/*/*.efi (*,gpt*)/efi/*/*/*.efi (*,gpt*)/*.efi (*,gpt*)/*/*.efi ; do
+                regexp --set=1:efi_device '^\((.*)\)/' "${efi}"
+                if [ -e "${efi}" ]; then
+                    efi_found=true
+
+                    menuentry --class=efi "${efi}" "${efi_device}" {
+                        root="${2}"
+                        chainloader "${1}"
+                    }
+                fi
+            done
+
+            if [ "${efi_found}" != true ]; then
+                menuentry --hotkey=q --class=find.none "No EFI files detected." {menu_reload}
+            else
+                menuentry --hotkey=q --class=cancel "Cancel" {menu_reload}
+            fi
+        }
+    fi
+}
+
+function memtest_detect {
+    if ! is_efi; then
+        if [ -f /boot/memtest ]; then
+            menuentry --class=memtest --hotkey=m "Memory Test" {linux16 /boot/$1}
+        fi
+    fi
+}
+
+function lang_setup {
+    source /boot/grub/locales/${1}
+    menu_reload
+}
+
+function lang_menu {
+    menuentry --class=lang.${ll} "lang=${ll}" "${ll}" {lang_setup "${2}"}
+}
+
+function show_timezones {
+    submenu --class=tz --hotkey=t "tz=${def_timezone}" {# set the timezone above with the editor
+        if [ -n "$1" ];then
+            if [ "$1" = "tz=${def_timezone}" ]; then
+                default=0
+                menuentry --class=cancel --hotkey=q "Cancel (${def_timezone})" {menu_reload}
+                for tt in Africa America Asia Atlantic Australia Etc Europe Pacific; do
+                    submenu --class=tz.${tt} "${tt}" {
+                        menuentry --class=cancel --hotkey=q "Cancel (${def_timezone})" {menu_reload}
+                        source "/boot/grub/tz/${1}"
+                    }
+                done
+            else
+                regexp -s newtz '^tz=(.*)' "$1"
+                if [ -z "$newtz" ]; then
+                    def_timezone="$1"
+                else
+                    def_timezone="$newtz"
+                fi
+                timezone="tz=$def_timezone"
+                menu_reload
+            fi
+        fi
+    }
+}
+
+function show_keymaps {
+    submenu --class=kbd --hotkey=k "keytable=${def_keyboard}" {# set the timezone above with the editor
+        if [ -n "$1" ]; then
+            if [ "$1" = "keytable=${def_keyboard}" ]; then
+                default=0
+                menuentry --class=cancel --hotkey=q "Cancel (${def_keyboard})" {menu_reload}
+                source /boot/grub/locales/keyboards
+            else
+                regexp -s newkey '^keytable=(.*)' "$1"
+                if [ -z "$newkey" ]; then
+                    def_keyboard="$1"
+                else
+                    def_keyboard="$newkey"
+                fi
+                keyboard="keytable=$def_keyboard"
+                menu_reload
+            fi
+        fi
+    }
+}
+
+function show_languages {
+    submenu --hotkey=l --class=lang "lang=${def_bootlang}" {# set the timezone above with the editor
+        if [ -n "$1" ]; then
+            if [ "$1" = "lang=${def_bootlang}" ]; then
+                default=0
+                menuentry --class=lang.${def_bootlang} "lang=${def_bootlang}" {menu_reload}
+                menuentry --class=lang.cs "Čeština" {lang_setup "cs_CZ"}
+                menuentry --class=lang.da "Dansk" {lang_setup "da_DK"}
+                submenu --class=lang.de "Deutsch" {
+                    for ll in de_DE de_AT de_BE de_CH de_LI de_LU; do
+                        lang_menu ${ll}
+                    done
+                }
+                submenu --class=lang.el "Ελληνικά" {
+                    for ll in el_GR el_CY; do
+                        lang_menu ${ll}
+                    done
+                }
+                submenu --class=lang.en "English" {
+                    for ll in en_US en_AG en_AU en_BW en_CA en_DK en_GB en_HK en_IE en_IN en_NG en_NZ en_PH en_SG en_ZA en_ZW; do
+                        lang_menu ${ll}
+                    done
+                }
+                submenu --class=lang.es "Español" {
+                    for ll in es_ES es_AR es_BO es_CL es_CO es_CR es_DO es_EC es_GT es_HN es_MX es_NI es_PA es_PE es_PR es_PY es_SV es_US es_UY es_VE; do
+                        lang_menu ${ll}
+                    done
+                }
+                submenu --class=lang.fr "Français" {
+                    for ll in fr_FR fr_BE fr_CA fr_CH fr_LU fr_NC; do
+                        lang_menu ${ll}
+                    done
+                }
+                menuentry --class=lang.he "עִבְרִית" {lang_setup "he_IL"}
+                submenu --class=lang.it "Italiano" {
+                    for ll in it_IT it_CH; do
+                        lang_menu ${ll}
+                    done
+                }
+                menuentry --class=lang.ja "日本語" {lang_setup "ja_JP"}
+                submenu --class=lang.nl "Nederlands" {
+                    for ll in nl_NL nl_AW nl_BE; do
+                        lang_menu ${ll}
+                    done
+                }
+                menuentry --class=lang.pl "Polski" {lang_setup "pl_PL"}
+                submenu --class=lang.pt "Português" {
+                    for ll in pt_BR pt_PT; do
+                        lang_menu ${ll}
+                    done
+                }
+                menuentry --class=lang.ro "Română" {lang_setup "ro_RO"}
+                submenu --class=lang.ru "Русский" {
+                    for ll in ru_RU ru_UA;do
+                        lang_menu ${ll}
+                    done
+                }
+                submenu --class=lang.zh "中文" {
+                    for ll in zh_CN zh_TW; do
+                        lang_menu ${ll}
+                    done
+                }
+            else
+                regexp -s newlang '^lang=(.*)' "$1"
+                if [ -z "$newlang" ]; then
+                    def_bootlang="$1"
+                else
+                    def_bootlang="$newlang"
+                fi
+                bootlang="lang=$def_bootlang"
+                if [ -f /boot/grub/locales/${def_bootlang} ]; then
+                    source /boot/grub/locales/${def_bootlang}
+                fi
+                menu_reload
+            fi
+        fi
+    }
+}
+
+function boot_menu {
+    if [ "${hwclock}" = "utc=yes" ]; then
+        class="utc"
+        title="utc"
+        clockset=""
+    elif [ "${timezone}${bootlang}" = "" ]; then
+        class="unset"
+        title="utc"
+        clockset=""
+    else
+        title="${def_timezone}"
+        class="tz.${def_timezone}"
+        clockset="utc=yes"
+    fi
+    min2d="$MINUTE"
+    if regexp '(^.$)' "$min2d"; then
+        min2d="0${min2d}"
+    fi
+    hour2d="$HOUR"
+    if regexp '(^.$)' "$hour2d"; then
+        hour2d="0${hour2d}"
+    fi
+    menuentry --class=tz.$class --hotkey=u "$hour2d:$min2d $title" "$clockset" {
+        hwclock="$2"
+        menu_reload
+    }
+    show_timezones
+    show_keymaps
+    # show_languages
+    default=3
+}
+
+function boot_defaults {
+    source /boot/grub/defaults.cfg
+}
+
+function grub_reboot {
+    menuentry " " {true}
+    menuentry --class=reboot "Reboot!" {reboot}
+}
+
+function grub_bios_installed {
+    if ! is_efi;  then
+        menuentry "" {true}
+        menuentry --class=manjaro "Installed BIOS-System on $installed" {exit}
+    fi
+}
+
+function grub_efi_installed {
+    if is_efi; then
+        menu "" {true}
+        menu --class=manjaro "Installed EFI-System on $installed" {exit}
+    fi
+}
+
+
+function check {
+    cliname="$1"
+    varname="$2"
+    if [ "${optname}" != "${cliname}" ]; then
+        return 1
+    fi
+    if [ -z "$varname" ]; then
+        varname="${cliname}"
+    fi
+    if [ -z "${optval}" ]; then
+        eval ${varname}="${cliname}"
+    else
+        eval ${varname}="${cliname}=${optval}"
+        if [ "${optname}" = "lang" ]; then
+            lang_setup ${optval}
+        elif [ "${optname}" = "keytable" ]; then
+            def_keyboard="${optval}"
+        elif [ "${optname}" = "tz" ]; then
+            def_timezone="${optval}"
+        fi
+    fi
+    return 0
+}
+
+function checkinput {
+    newinput="$1"
+    newoutput=""
+    for newcli in ${newinput} ; do
+    optname=""
+    optval=""
+    optdone=""
+    regexp -s optname '^(.+)=.*$' "${newcli}"
+    if [ -z "${optname}" ]; then
+        optname="${newcli}"
+    else
+        regexp -s optval '^.+=(.*)$' "${newcli}"
+    fi
+    for tocheck in "lang bootlang" "keytable keyboard" "tz timezone" "utc hwclock"; do
+        if check $tocheck ; then
+            optdone="Y"
+            break
+        fi
+    done
+    if [ -z "${optdone}" ]; then
+        if [ -z "${newoutput}" ]; then
+            newoutput="${newcli}"
+        else
+            newoutput="${newoutput} ${newcli}"
+        fi
+    fi
+    done
+}
+
+function new2cli {
+    newinput="$1"
+    if [ -n "$newinput" ]; then
+        checkinput "$newinput"
+        if [ -n "${newoutput}" ]; then
+            newinput="${newoutput}"
+            if [ -n "$clinput" ]; then
+                clinput="$clinput $newinput"
+            else
+                clinput="$newinput"
+            fi
+            export clinput
+        fi
+    fi
+}
+
+function getargs {
+    args=""
+    for a in $@; do
+        if [ -n "${a}" ]; then
+            args="${args} ${a}"
+        fi
+    done
+}
+
+function bootcheck {
+    getargs
+}
+
+pager=1
+
+insmod regexp
+insmod datehook
+if ! is_efi; then
+    insmod part_gpt
+fi
+
+if is_efi; then
+    insmod efi_gop
+    insmod efi_uga
+fi
+
+if [ -z "${loaded}" ]; then
+    iscd=""
+    auto=""
+    regexp -s iscd '^(cd)' "${root}"
+    if [ "${iscd}" != "cd" -a -e (cd) ]; then
+        probe -s cdp -u cd
+        probe -s hdp -u $root
+        if [ -n "$cdp" -a "$cdp" = "$hdp" ]; then
+            iscd="cd"
+        fi
+    fi
+    if [ "${root}" != "hd96" -a "${iscd}" != "cd" ]; then
+        auto="${auto}"
+    fi
+    source /boot/grub/variable.cfg
+    loaded=true
+
+    if keystatus --shift; then
+        disable_gfxterm=true
+    fi
+
+    if [ "${disable_gfxterm}" != "true" ]; then
+        if loadfont /boot/grub/unicode.pf2 ; then
+            if [ -z "$gfxmode" ] ; then
+                gfxmode=1024x768,auto # 1280x1024,1024x768,800x600,640x480 possible value
+                gfxpayload=keep
+            fi
+            if keystatus --ctrl; then
+                gfxok=""
+                pager=0
+                while [ -z "$gfxok" ]; do
+                    echo "gfxmode=$gfxmode"
+                    echo "Input new mode or Enter to confirm"
+                    prompt
+                    read gfxmodein
+                    if [ -n "$gfxmodein" ]; then
+                        gfxmode="$gfxmodein"
+                        echo ""
+                    else
+                        gfxok="true"
+                    fi
+                done
+            fi
+            insmod all_video
+            insmod gfxterm
+            if terminal_output --append gfxterm; then
+                terminal_output --remove console
+            else
+                disable_gfxterm=true
+            fi
+        else
+            disable_gfxterm=true
+        fi
+    fi
+
+    if [ "${disable_gfxterm}" != "true"  -a -f "${grub_theme}" ]; then
+        insmod gfxmenu
+        themedir=""
+        regexp -s themedir '^(.*)/.*$' "${grub_theme}"
+        for themefont in $themedir/*.pf2 $themedir/f/*.pf2; do
+            if [ -f "${themefont}" ]; then
+                loadfont "${themefont}"
+            fi
+        done
+        for imagetype in jpg jpeg png tga; do
+            for themeimage in ${themedir}/*.${imagetype}; do
+                if [ -f "${themeimage}" ]; then
+                    if [ "${imagetype}" = "jpg" ]; then
+                        insmod jpeg
+                    else
+                        insmod $imagetype
+                    fi
+                fi
+            done
+        done
+        theme=${grub_theme}
+        export theme
+    fi
+
+    menu_color_normal=cyan/blue
+    menu_color_highlight=white/blue
+
+    if [ -n "${iso_path}" ]; then
+        auto="img_dev=/dev/disk/by-uuid/${rootuuid} img_loop=${iso_path}"
+    fi
+    
+    export auto
+fi
+
+boot_defaults
+
+for kopt in "${clinput}" "${bootlang}" "${keyboard}" "${timezone}" "${hwclock}" "${auto}"; do
+    if [ -n "${kopt}" ]; then
+        kopts="${kopts} ${kopt}"
+    fi
+done
+if [ -n "${bootlang}${keyboard}${timezone}" ]; then
+    koptsok="true"
+fi
+
+boot_menu
+
+source /boot/grub/kernels.cfg
+if [ -n "$clinput" ]; then
+    menuentry --class=edit "$clinput" {
+        if [ -n "$1" ]; then
+            clinput="$@"
+        else
+            unset clinput
+        fi
+        menu_reload
+    }
+fi
+menuentry --class=type --hotkey=tab "" {# set arguments above with the editor
+    getargs $@
+    pager=0
+    if [ -z "$args" ]; then
+        check_help
+        kopts_help
+        echo $"Input command line options, press Enter to continue"
+        prompt
+        read newinput
+    else
+        newinput="$args"
+    fi
+    new2cli "$newinput"
+    pager=1
+    menu_reload
+}
+menuentry --hotkey=h --class=help "Help" {
+    pager=0
+    menu_help
+    menu_continue
+    pager=1
+}
+efi_detect
+memtest_detect
+search --no-floppy --file /etc/issue --set installed
+grub_bios_installed
+grub_efi_installed
+grub_reboot
diff --git a/grub-cfg/kernels.cfg b/grub-cfg/kernels.cfg
new file mode 100644
index 0000000000000000000000000000000000000000..88394d3e526e0e6c7e6230f4a811fae35db29038
--- /dev/null
+++ b/grub-cfg/kernels.cfg
@@ -0,0 +1,62 @@
+for kk in /boot/vmlinu*-*64; do
+if [ "$kk" != "/boot/vmlinu*-*64" ]; then
+    have64="true"
+    if cpuid -l; then
+        have_kernel="true"
+    else
+        have_kernel="false"
+    fi
+fi
+done
+for kk in /boot/vmlinu*-*86; do
+if [ "$kk" != "/boot/vmlinu*-*86" ]; then
+    have32="true"
+    have_kernel="true"
+fi
+done
+if [ "${have_kernel}" != "true" ]; then
+    menuentry --class=find.none "NO SUITABLE KERNELS AVAILABLE" {echo $@  echo "There are no kernels suitable for this machine available."
+        echo ""
+        if ! cpuid -l; then
+            echo "This machine is NOT 64bit capable."
+            echo ""
+        fi
+        echo "There are no suitable kernels available"
+        if [ "${have64}" == "true" ]; then
+            echo ""
+            echo "It appears you are trying to boot a 64bit release on a 32bit machine"
+            echo "This cannot work!"
+        fi
+        echo ""
+        echo "Press Escape to return to the main menu"
+        sleep --interruptible 9999
+        menu_reload
+    }
+else
+    title=""
+    for kopt in @ARCH@ $kopts  @DEFAULT_ARGS@ @BOOT_ARGS@; do
+        if [ -n "$title" ] ; then
+            title="$title $kopt";
+        else
+            title="$kopt";
+        fi;
+    done
+    menuentry "Mit Open-Source Treibern starten" --class=@DIST_NAME@.@ARCH@ "$title" {# set arguments above with the editor
+        source /boot/grub/locales/de_DE
+        linux /boot/vmlinuz-$2 driver=free nouveau.modeset=1 i915.modeset=1 radeon.modeset=1
+        initrd /boot/amd_ucode.img /boot/intel_ucode.img /boot/initramfs-@ARCH@.img
+    }
+    menuentry "Mit proprietären Treibern starten" --class=@DIST_NAME@.@ARCH@ "$title" {# set arguments above with the editor
+        source /boot/grub/locales/de_DE
+        linux /boot/vmlinuz-$2 driver=nonfree nouveau.modeset=0 i915.modeset=1 radeon.modeset=1
+        initrd /boot/amd_ucode.img /boot/intel_ucode.img /boot/initramfs-@ARCH@.img
+    }
+    menuentry "Boot with open source drivers" --class=@DIST_NAME@.@ARCH@ "$title" {# set arguments above with the editor
+        linux /boot/vmlinuz-$2 driver=free nouveau.modeset=1 i915.modeset=1 radeon.modeset=1
+        initrd /boot/amd_ucode.img /boot/intel_ucode.img /boot/initramfs-@ARCH@.img
+    }
+    menuentry "Boot with proprietary drivers" --class=@DIST_NAME@.@ARCH@ "$title" {# set arguments above with the editor
+        linux /boot/vmlinuz-$2 driver=nonfree nouveau.modeset=0 i915.modeset=1 radeon.modeset=1
+        initrd /boot/amd_ucode.img /boot/intel_ucode.img /boot/initramfs-@ARCH@.img
+    }
+fi
diff --git a/grub-cfg/loopback.cfg b/grub-cfg/loopback.cfg
new file mode 100644
index 0000000000000000000000000000000000000000..e94c44d2f719c5cabb592b6395ffda77d0981ff0
--- /dev/null
+++ b/grub-cfg/loopback.cfg
@@ -0,0 +1 @@
+source /boot/grub/grub.cfg
diff --git a/grub-cfg/variable.cfg b/grub-cfg/variable.cfg
new file mode 100644
index 0000000000000000000000000000000000000000..6246584d66ad6ee98afdf954edcb15dc8de0da6c
--- /dev/null
+++ b/grub-cfg/variable.cfg
@@ -0,0 +1,2 @@
+grub_theme=/boot/grub/themes/@ISO_NAME@-live/theme.txt
+timeout=-1
diff --git a/manjaro-dependencies/PKGBUILD b/manjaro-dependencies/PKGBUILD
new file mode 100644
index 0000000000000000000000000000000000000000..6edbf14fd0f723950f36790850fbd659f654e677
--- /dev/null
+++ b/manjaro-dependencies/PKGBUILD
@@ -0,0 +1,10 @@
+# Maintainer OSAK <osak@fsmpi.rwth-aachen.de>
+
+pkgname=tardis-dev-dependencies
+pkgver=1.0
+pkgrel=1
+pkgdesc="LIP automation tool dependencies"
+arch=(x86_64)
+url="https://git.fsmpi.rwth-aachen.de/osak/tardis"
+license=('GPL3')
+depends=(bash coreutils git rsync grep pacman wget squashfs-tools manjaro-tools-iso util-linux)
diff --git a/manjaro.txt b/manjaro.txt
new file mode 100644
index 0000000000000000000000000000000000000000..386902676cb137a79a85e89c331185e15bdac8cf
--- /dev/null
+++ b/manjaro.txt
@@ -0,0 +1,20 @@
+Pro:
+- installer ist viel einfacher (geht auch super mit verschlüsseln der root-partition, Konkurenz wegen Bitlocker)
+
+Neutral:
+- Lass mal gemeinsam die pamac defaults durchgehen, ob das so sinnvoll ist
+- Im Gegensatz zur früheren XFCE Version wird nur noch Firefox installiert und nicht Chromium + Firefox. Das hab ich zwar auf meinem Ubuntu selbst so, aber als default 2 Browser zu installieren war schon seltsam
+- Auf bestehendes lvm on LUKS installieren geht nicht, aber das hab ich bei GUI installer auch nicht erwartet
+
+Contra:
+- Das man aus der gestarteten Live-Umgebung keine Pakete mehr installieren wirkt nicht so vertrauenserweckend. Vor allem weil die GUI dir nur sagt, dass es einen Fehler gibt. Um herauszufinden, welche Fehlermeldung es denn gab, musste man doch wieder die CLI benutzten. Das wiederspricht der Idee, das Manjaro für bessere Einsteigerfreundlichkeit alles per GUI ermöglicht. Die gleiche Abwesenheit an Fehlermeldungen gibt es auch beim installieren von Sprachpaketen.
+- Die fehlenden Fehlermeldung ziehen sich in Manjaro durch alle GUIs.
+
+TODO:
+- compile own package chooser to use QAbstractItemView::MultiSelection instead of QAbstractItemView::ExtendedSelection and to allow multiple default selections
+- oder man nehme das alte Skript via https://github.com/calamares/calamares/blob/calamares/src/modules/shellprocess/shellprocess.conf
+- offline repo?
+- manjaro-hello im Live-Image deaktivieren und stattdessen den Installer per autostart ausführen
+- manjaro-news und weitere plasma-browser-integration deaktivieren?
+- Use remmina (https://wiki.archlinux.org/title/Remmina) instead of x2goclient to avoid AUR? (Also update docs in that case)
+- add Doku for preinstalled programs like the music player Elisa.
diff --git a/packages b/packages
index cff4d20c7d8a6e7f6809861225f1a188c768877f..0283ade5d8eb114b3b4c5234427fe99eaebef1ad 100644
--- a/packages
+++ b/packages
@@ -14,7 +14,7 @@
  C   |gimp|gimp: Bildbearbeitung (Pixelbasiert)
  c   |zsh zsh-doc|zsh: Alternative Shell
  c   |fish|fish: The Friendly Interactive Shell
- cM  |x2goclient|x2go: Remote Desktop Client (z.B. für den RBI-Pool)
+ cM  |remmina|x2go: Remote Desktop Client (z.B. für den RBI-Pool)
   m  |singular|singular: Tool für die Vorlesung Computeralgebra
   m  |gap gap-*|gap: Groups, Algorithms, Programming - ein System für diskrete Mathematik
   M  |codeblocks|codeblocks: IDE für das C++-Praktikum
@@ -38,9 +38,6 @@
    Pi|valgrind|valgrind: Debugging- und Profilingtool, welches bei der Entwicklung von Programmen hilft
    Pi|gdb|GNU Debugger: Anderes Debugging-Tool
 
-# Update installer if possible
-L    |ubiquity|
-
 #Desktop stuff for Kubuntu
  D   |thunderbird|Thunderbird: E-Mail-Client
  C   |texstudio|texstudio: Graphischer LaTeX-Editor
@@ -49,8 +46,8 @@ L    |ubiquity|
  D   |hunspell|
  D   |vlc|
  c   |mpv|mpv: Minimalistischer Mediaplayer
- D   |p7zip-full|
- D   |unrar-free|
+ D   |p7zip|
+ D   |unrar|
 
 #Zenity for Linuxparty.sh
      |zenity|
@@ -58,16 +55,15 @@ L    |ubiquity|
 #System stuff, e.g. gcc and efibootmgr
  D   |automake|
  D   |cmake|
- D   |build-essential|
  D   |lvm2|
  D   |screen|
  D   |tmux|
- D   |tofrodos|
+ # D   |tofrodos| # doesn't exist on manjaro?
  D   |efibootmgr|
  D   |gdisk|
- D   |fdisk|
- D   |linux-headers-generic|
- D   |network-manager-vpnc|
+ # D   |fdisk| # preinstalled in utils-linux
+ # D   |linux-headers-generic| # preinstalled in linux-api-headers
+ # D   |network-manager-vpnc| # doesn't exist in manjaro?
 LD   |efivar|
 LD   |vim|
 LD   |htop|
@@ -75,22 +71,16 @@ LD   |git|
 LD   |gparted|
 
 #texlive
- C   |texlive-lang-english texlive-bibtex-extra tipa texlive-latex-extra texlive-xetex texlive-latex-base chktex texlive-latex-recommended texlive-lang-german texlive-fonts-recommended psutils texlive-extra-utils texlive-font-utils latexmk texlive-pstricks feynmf texlive-science texlive-pictures texlive-metapost latexdiff tex-gyre texlive-publishers texlive-base lmodern texlive-luatex texlive-binaries|LaTeX mit vielen Paketen für wissenschaftliche Arbeiten
- C   |dvidvi dvipng texlive-music tex4ht lcdf-typetools cm-super latex-cjk-all texlive-games context t1utils texlive-fonts-extra lacheck prerex purifyeps texlive-formats-extra texinfo texlive-humanities fragmaster|Zusätzliche Fonts und Pakete für LaTeX
- c   |texlive-metapost-doc texlive-science-doc texlive-latex-recommended-doc texlive-humanities-doc texlive-latex-base-doc texlive-fonts-recommended-doc texlive-pictures-doc info|Dokumentation für LaTeX
-# c   |texlive-fonts-extra-doc texlive-publishers-doc texlive-latex-extra-doc texlive-pstricks-doc info|Dokumentation für LaTeX
+ C   |texlive-bibtexextra texlive-latexextra texlive-fontsextra psutils texlive-pstricks texlive-science texlive-pictures git-latexdiff tex-gyre-fonts texlive-publishers texlive-core texlive-bin texinfo|LaTeX mit vielen Paketen für wissenschaftliche Arbeiten
+ C   |texlive-music texlive-games t1utils texlive-formatsextra texinfo texlive-humanities|Zusätzliche Fonts und Pakete für LaTeX
 
 #german language support
- D   |hunspell-de-de|
-LD   |language-pack-de|
- D   |wngerman|
- D   |wogerman|
- D   |wswiss|
+ D   |hunspell-de|
+ D   |libreoffice-still-de|
+ D   |man-pages-de|
  D   |poppler-data|
- D   |libreoffice-l10n-de|
- D   |libreoffice-help-de|
  D   |hyphen-de|
  D   |mythes-de|
  D   |aspell-de|
- D   |thunderbird-locale-de|
- D   |firefox-locale-de|
+ D   |thunderbird-i18n-de|
+ D   |firefox-i18n-de|