diff --git a/lib/yashchiki/fetch.sh b/lib/yashchiki/fetch.sh
index 4f0c825070cda7f5b441c77b7e07d10ac6567d33..dffe4dbdf6131c9d9eaddddefa5bbcbe18cb971e 100755
--- a/lib/yashchiki/fetch.sh
+++ b/lib/yashchiki/fetch.sh
@@ -138,6 +138,13 @@ if [ -n "${SPACK_ENVIRONMENT:-}" ]; then
     ${MY_SPACK_CMD} env create default
     # FIXME: via style config!
     rsync -a ${SPACK_ENVIRONMENT_REPO}/. ${YASHCHIKI_SPACK_PATH}/var/spack/environments/default
+    # SPACK_ENVIRONMENT_REPO="${YASHCHIKI_SPACK_PATH}/var/spack/repos/ebrains-spack-builds" # from env var; FIXME: add to opts
+    # SPACK_ENVIRONMENT_PATH="${YASHCHIKI_SPACK_PATH}/var/spack/environments/default" # from env var; FIXME: add to opts
+    # SYSTEMNAME via env var; FIXME: style-specific config...
+    # FIXME: via style
+    PATH=${MY_SPACK_FOLDER}/bin:$PATH ${MY_SPACK_PYTHON} ${SPACK_ENVIRONMENT_REPO}/site-config/ymerge.py ${SPACK_ENVIRONMENT_PATH}/spack.yaml ${SPACK_ENVIRONMENT_REPO}/site-config/${SYSTEMNAME}/spack.yaml > /tmp/spack.yaml
+    mv /tmp/spack.yaml ${SPACK_ENVIRONMENT_PATH} # FIXME proper tmpfile handling
+    cat ${SPACK_ENVIRONMENT_PATH}/spack.yaml
     echo "Created spack environment, now concretizing... "
     # FIXME: track concretizer errors here:
     (
diff --git a/share/yashchiki/styles/esd/config.yaml b/share/yashchiki/styles/esd/config.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..70e07141ecc1aae7bd855546d8cc640d9c764e56
--- /dev/null
+++ b/share/yashchiki/styles/esd/config.yaml
@@ -0,0 +1,16 @@
+docker_base_image: "debian:bookworm"
+build_base_sandbox: true
+spack_environment: true
+cache:
+  source:
+    type: "oci"
+  build:
+    type: "oci"
+dependency_python:
+  build: false
+  version: "3.11.2"
+spack_gcc:
+  # Whether to build the specified gcc via spack or assume existance.
+  build: false
+  # Version to use as compiler for spack build.
+  version: "12.2.0"
diff --git a/share/yashchiki/styles/esd/fetch_os-release b/share/yashchiki/styles/esd/fetch_os-release
new file mode 100644
index 0000000000000000000000000000000000000000..3320862178e5a63681c384aa77ab6998f5655b1c
--- /dev/null
+++ b/share/yashchiki/styles/esd/fetch_os-release
@@ -0,0 +1,9 @@
+PRETTY_NAME="Debian GNU/Linux 12 (bookworm)"
+NAME="Debian GNU/Linux"
+VERSION_ID="12"
+VERSION="12 (bookworm)"
+VERSION_CODENAME=bookworm
+ID=debian
+HOME_URL="https://www.debian.org/"
+SUPPORT_URL="https://www.debian.org/support"
+BUG_REPORT_URL="https://bugs.debian.org/"
diff --git a/share/yashchiki/styles/esd/install_prerequisites.sh b/share/yashchiki/styles/esd/install_prerequisites.sh
new file mode 100755
index 0000000000000000000000000000000000000000..d13ef5e9921f1127f3a870784cc72b0019103679
--- /dev/null
+++ b/share/yashchiki/styles/esd/install_prerequisites.sh
@@ -0,0 +1,44 @@
+#!/bin/bash
+
+set -euo pipefail
+shopt -s inherit_errexit
+
+# This file is to install all packages that are a pre-requisite for spack to be
+# installed.
+
+prerequisites=(
+    "bzip2"
+    "ca-certificates"
+    "ccache"
+    "curl"
+    "diffutils"
+    "file"
+    "g++"
+    "gawk"
+    "gcc"
+    "gfortran"
+    "git"
+    "gnupg2"
+    "lbzip2"
+    "less"
+    "libc6-dev"
+    "locales"
+    "make"
+    "netbase"
+    "parallel"
+    "patch"
+    "patchelf"
+    "procps"
+    "python3"
+    "python3-yaml"
+    "python-is-python3"
+    "rsync"
+    "openssh-client"
+    "sudo"
+    "udev"
+    "unzip"
+    "xz-utils"
+)
+
+apt-get update
+apt-get install -o DPkg::Options::=--force-confold --no-install-recommends -y "${prerequisites[@]}"
diff --git a/share/yashchiki/styles/esd/manual_system_level_patching_routine_called_in_post_as_root.sh b/share/yashchiki/styles/esd/manual_system_level_patching_routine_called_in_post_as_root.sh
new file mode 100755
index 0000000000000000000000000000000000000000..342d48951c77e523dd5ff52b26b188c38dd02d93
--- /dev/null
+++ b/share/yashchiki/styles/esd/manual_system_level_patching_routine_called_in_post_as_root.sh
@@ -0,0 +1,16 @@
+#!/bin/bash
+#
+# This script governs the whole spack install procedure.
+# It is needed because the post-install routine is executed in sh which has
+# limited capabilities of preserving built spack packages in case of an error.
+#
+
+set -euo pipefail
+shopt -s inherit_errexit
+
+SOURCE_DIR="$(dirname "$(readlink -m "${BASH_SOURCE[0]}")")"
+source "${SOURCE_DIR}/commons.sh"
+
+for pn in "${SPACK_INSTALL_SCRIPTS}/patches/*.patch"; do
+    patch -p 1 < ${pn}
+done
diff --git a/share/yashchiki/styles/esd/spack_collection.sh b/share/yashchiki/styles/esd/spack_collection.sh
new file mode 100644
index 0000000000000000000000000000000000000000..1e841c6b3af95ccb6243adf6801799bebe41594d
--- /dev/null
+++ b/share/yashchiki/styles/esd/spack_collection.sh
@@ -0,0 +1,10 @@
+# All spack packages that should be fetched/installed in the container
+spack_packages=(
+# FIXME: to be deleted, just for testing if packages and env build can be combined
+#nest@3.7+sonata
+gmake@4.4.1
+)
+# we should specify what `spack concretize --force --fresh --test root` provides (for the active ESD env)…
+
+spack_views=(\
+)
diff --git a/share/yashchiki/styles/esd/spack_custom_view.sh b/share/yashchiki/styles/esd/spack_custom_view.sh
new file mode 100644
index 0000000000000000000000000000000000000000..155b55256037f7b2ef8cae4ffbca9ab01f4fbf3a
--- /dev/null
+++ b/share/yashchiki/styles/esd/spack_custom_view.sh
@@ -0,0 +1,2 @@
+cat <<EOF
+EOF