diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index da724f864bfa6af064a607dd2aac1d77cc3a7e4a..7c8e8430a4f8a9dda378b6e6813a500f9c14cc16 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -39,7 +39,7 @@ deploy-int-release-dev-cscs:
     OPENSHIFT_TOKEN: $CSCS_OPENSHIFT_DEV_TOKEN
     OC_PROJECT: jupyterhub-int
     LAB_KERNEL_ROOT: /srv/jupyterlab_kernels/int
-    INSTALLATION_ROOT: /srv/test-build-2212
+    INSTALLATION_ROOT: /srv/test-build-2302
     SPACK_ENV: test
     RELEASE_NAME: EBRAINS-test
   resource_group: shared-NFS-mount-dev-cscs
@@ -56,9 +56,9 @@ deploy-prod-release-prod-cscs:
     OPENSHIFT_TOKEN: $CSCS_OPENSHIFT_PROD_TOKEN
     OC_PROJECT: jupyterhub
     LAB_KERNEL_ROOT: /srv/jupyterlab_kernels/prod
-    INSTALLATION_ROOT: /srv/main-spack-instance-2212
-    SPACK_ENV: ebrains-23-01
-    RELEASE_NAME: EBRAINS-23.01
+    INSTALLATION_ROOT: /srv/main-spack-instance-2302
+    SPACK_ENV: ebrains-23-02
+    RELEASE_NAME: EBRAINS-23.02
   resource_group: shared-NFS-mount-prod-cscs
   rules:
     - if: $CI_COMMIT_BRANCH =~ /ebrains/
@@ -74,9 +74,9 @@ deploy-prod-release-prod-jsc:
     OPENSHIFT_TOKEN: $JSC_OPENSHIFT_PROD_TOKEN
     OC_PROJECT: jupyterhub
     LAB_KERNEL_ROOT: /srv/jupyterlab_kernels/prod
-    INSTALLATION_ROOT: /srv/main-spack-instance-2212
-    SPACK_ENV: ebrains-23-01
-    RELEASE_NAME: EBRAINS-23.01
+    INSTALLATION_ROOT: /srv/main-spack-instance-2302
+    SPACK_ENV: ebrains-23-02
+    RELEASE_NAME: EBRAINS-23.02
   resource_group: shared-NFS-mount-prod-jsc
   rules:
     - if: $CI_COMMIT_BRANCH =~ /ebrains/
@@ -94,7 +94,7 @@ deploy-exp-release-dev-cscs:
     OPENSHIFT_TOKEN: $CSCS_OPENSHIFT_DEV_TOKEN
     OC_PROJECT: jupyterhub-int
     LAB_KERNEL_ROOT: /srv/jupyterlab_kernels/int
-    INSTALLATION_ROOT: /srv/test-build-2212
+    INSTALLATION_ROOT: /srv/test-build-2302
     SPACK_ENV: experimental
     RELEASE_NAME: EBRAINS-experimental
   resource_group: shared-NFS-mount-dev-cscs
@@ -116,7 +116,7 @@ deploy-exp-release-prod-cscs:
     OPENSHIFT_TOKEN: $CSCS_OPENSHIFT_PROD_TOKEN
     OC_PROJECT: jupyterhub
     LAB_KERNEL_ROOT: /srv/jupyterlab_kernels/prod
-    INSTALLATION_ROOT: /srv/main-spack-instance-2212
+    INSTALLATION_ROOT: /srv/main-spack-instance-2302
     SPACK_ENV: experimental
     RELEASE_NAME: EBRAINS-experimental
   resource_group: shared-NFS-mount-prod-cscs
@@ -141,7 +141,7 @@ deploy-exp-release-prod-jsc:
     OPENSHIFT_TOKEN: $JSC_OPENSHIFT_PROD_TOKEN
     OC_PROJECT: jupyterhub
     LAB_KERNEL_ROOT: /srv/jupyterlab_kernels/prod
-    INSTALLATION_ROOT: /srv/main-spack-instance-2212
+    INSTALLATION_ROOT: /srv/main-spack-instance-2302
     SPACK_ENV: experimental
     RELEASE_NAME: EBRAINS-experimental
   resource_group: shared-NFS-mount-prod-jsc
@@ -170,7 +170,7 @@ build-spack-env-on-runner:
     - cp packages.yaml $SPACK_DEV_PATH/etc/spack/packages.yaml
     # SPACK PATCH: see https://github.com/spack/spack/pull/35290
     - sed -i 's/solver.solve(abstract_specs)/solver.solve(abstract_specs, tests=kwargs.get("tests", False))/g' $SPACK_DEV_PATH/lib/spack/spack/concretize.py
-    # the post-build logs on install-time-test-logs.txt gets ovewritten by the post-install logs.
+    # SPACK PATCH: the post-build logs on install-time-test-logs.txt gets ovewritten by the post-install logs.
     # quick fix for that: (TODO: investigate more and open PR)
     - sed -i "s/self.file_like, 'w'/self.file_like, 'a'/g" $SPACK_DEV_PATH/lib/spack/llnl/util/tty/log.py
     - |
@@ -186,7 +186,7 @@ build-spack-env-on-runner:
     - spack repo add .
     - spack env create $SPACK_DEV_ENV spack.yaml
     - spack env activate $SPACK_DEV_ENV
-    - spack install -y -j2 --fresh --no-check-signature --test root
+    - spack install -y -j2 --fresh --test root
   after_script:
     - mkdir spack_logs
     - |
@@ -233,40 +233,40 @@ sync-gitlab-spack-instance:
     SPACK_USER_CONFIG_PATH: $SPACK_PATH/.spack
     SPACK_REPO_PATH: $SPACK_PATH/ebrains-spack-builds
   script:
-    - echo $CI_PROJECT_NAMESPACE
+    # clone spack if it doesn't exist
     - |
       if [ ! -d $SPACK_PATH ]; then
         git clone --depth 1 -c advice.detachedHead=false -c feature.manyFiles=true --branch $SPACK_VERSION https://github.com/spack/spack $SPACK_PATH
       fi
     # SPACK PATCH: see https://github.com/spack/spack/pull/35290
     - sed -i 's/solver.solve(abstract_specs)/solver.solve(abstract_specs, tests=kwargs.get("tests", False))/g' $SPACK_PATH/lib/spack/spack/concretize.py
-    # the post-build logs on install-time-test-logs.txt gets ovewritten by the post-install logs.
+    # SPACK PATCH: the post-build logs on install-time-test-logs.txt gets ovewritten by the post-install logs.
     # quick fix for that: (TODO: investigate more and open PR)
     - sed -i "s/self.file_like, 'w'/self.file_like, 'a'/g" $SPACK_PATH/lib/spack/llnl/util/tty/log.py
+    # copy package settings
     - cp $CI_PROJECT_DIR/packages.yaml $SPACK_PATH/etc/spack/packages.yaml
+    # activate spack
     - . $SPACK_PATH/share/spack/setup-env.sh
-    # - spack bootstrap untrust github-actions
+    # install compiler (if not already installed)
+    - EBRAINS_SPACK_COMPILER=$(grep 'compiler' $CI_PROJECT_DIR/packages.yaml | awk -F'[][]' '{ print $2 }')
     - spack compiler find
-    - spack compiler list
-    - spack load gcc@10.3.0 || spack install gcc@10.3.0
-    - spack load gcc@10.3.0
+    - spack install $EBRAINS_SPACK_COMPILER
+    - spack load $EBRAINS_SPACK_COMPILER
     - spack compiler find
     - spack compiler list
-    - spack install --keep-stage python@3.8.11 %gcc@10.3.0
-    # - for section in $(spack config list); do spack config blame $section; done
+    # get latest state of EBRAINS repo
     - rm -rf $SPACK_REPO_PATH && mkdir $SPACK_REPO_PATH && cp -r -t $SPACK_REPO_PATH $CI_PROJECT_DIR/{packages,repo.yaml}
     - spack repo list | grep -q ebrains-spack-builds && echo "Repository registered already" || spack repo add $SPACK_REPO_PATH
     - spack repo list
+    # activate and update environment (and create it, if it doesn't exist)
     - spack env list | grep -q $SPACK_NFS_ENV && echo "Environment created already" || spack env create $SPACK_NFS_ENV $CI_PROJECT_DIR/spack.yaml
     - spack env activate $SPACK_NFS_ENV
     - cp $CI_PROJECT_DIR/spack.yaml $SPACK_ROOT/var/spack/environments/$SPACK_NFS_ENV/spack.yaml
     # There is a known spack bug (https://github.com/spack/spack/issues/29447) in installing test dependencies for installation tests. The workaround suggested
     # in the issue is to NOT concretize separately, but simply remove the .lock file and let the enironment be concretized by the spack install command:
     - rm $SPACK_ROOT/var/spack/environments/$SPACK_NFS_ENV/spack.lock || echo "No spack.lock file"
-    - spack install -y -j2 --fresh --no-check-signature --test root
-    - spack module tcl refresh -y
+    - spack install -y -j2 --fresh --test root
     - spack reindex
-    - spack env loads -r
   after_script:
     - mkdir spack_logs
     - |
@@ -289,5 +289,5 @@ sync-gitlab-spack-instance:
       - spack_logs
     when: always
   rules:
-    - if: '$CI_COMMIT_BRANCH =~ /test-spacktests-workaround/ && $CI_PROJECT_NAMESPACE =~ /technical-coordination/'
+    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PROJECT_NAMESPACE =~ /technical-coordination/
       when: manual
diff --git a/README.md b/README.md
index fcfa056dab99e5e4d54a0a44ea6bd3428cda77cd..6531d9140044e61886e9303592574aa012812bb1 100644
--- a/README.md
+++ b/README.md
@@ -1,66 +1,69 @@
 # ebrains-spack-builds
 
-Build and distribute software tools with Spack for the EBRAINS Collaboratory Lab containers.  
+Build and distribute EBRAINS software tools with Spack.
 
-**Quickstart for Notebooks**  
-- Open a terminal at a running Collaboratory Lab Container and execute the following:
+## Introduction
+
+Building and deploying EBRAINS tools to make them available for direct use in the Collaboratory Lab environment is a challenging task, mainly due to the number of tools and the increasing complexity of resolving their dependency conflicts. To efficiently solve this problem, we have implemented a delivery strategy based on [Spack](https://spack.io/), a package manager specifically designed to simplify the installation and management of scientific software (more information [here](https://drive.ebrains.eu/f/73bcfe5acf924cef83cc/)).
+
+Spack is highly customizable and flexible, allowing developers to create their own packages and specify their dependencies and custom build configurations. It supports a wide range of programming languages (Python, R, C, C++, Fortran etc), different hardware architectures and operating systems. All an EBRAINS developer needs to do is create a Spack package (simple description of the build logic of their software). Then Spack automatically handles downloading, building, and installing the entire EBRAINS environment, managing all their dependencies and other requirements.
+
+## Repository
+
+This repository is where the EBRAINS Spack packages are maintained. It contains:
+- the EBRAINS [Spack repository](https://spack.readthedocs.io/en/latest/repositories.html), that contains all available EBRAINS Spack packages ([packages/](packages))
+- the latest EBRAINS [Spack environment](https://spack.readthedocs.io/en/latest/environments.html) ([spack.yaml](spack.yaml)), a list of the specific versions of EBRAINS tools that are part of the software release
+- a script ([install_spack_env.sh](install_spack_env.sh)) that can be used to install the latest spack environment on any machine (either install from scratch or update an existing installation)
+- CI/CD pipelines configured for (a) testing the installation of new packages and (b) deploying the environment to the EBRAINS Collaboratory Lab.
+
+## Contributing
+
+HBP's developers/component owners that want their EBRAINS tools to be included in the official EBRAINS releases and deployed for direct use from the Lab environment should follow those steps:
+
+- Fork this repository
+- Clone the forked repository to local machine (or use the Gitlab Web IDE)
+- Create a new Spack package for your tool. For instructions on how to do this, see [the Spack documentation](https://spack.readthedocs.io/en/latest/packaging_guide.html) and the developer's section of [our documentation](https://drive.ebrains.eu/f/73bcfe5acf924cef83cc/). **Add the new package** to the repository, by creating a directory inside [packages/](./packages/) and copying the package recipe there. Also don't forget to **add a spec** to [spack.yaml](spack.yaml)
+- Commit the new package and push to a new branch, e.g. `add-packagename`
+- Create a Merge Request to merge your changes into the master branch of the original repository
+- Check the results of the automated test build job and solve any issues
+- Once the tests pass, wait for TC to approve and merge. Once merged, the package will be automatically built and deployed to the integration environment of the Collaboratory Lab (lab-int).
+
+## Installing the EBRAINS official Software release
+
+To install the EBRAINS Spack environment on a new machine, it is recommended to follow exactly the steps from [install_spack_env.sh](install_spack_env.sh), that installs or updates and tests the spack environment defined in this repository. In general, you need to:
+
+Clone this repository. You can use the `ebrains-yy-mm` branches to install the EBRAINS official releases, the `experimental-rel` branch for the experimental release, or the `master` branch for the latest state:
+```
+git clone --branch {branch-name} https://gitlab.ebrains.eu/technical-coordination/project-internal/devops/platform/ebrains-spack-builds.git
 ```
-#update modulepath of JupterLab container to include spack arch modulefiles path
-module use /srv/test-build/spack/share/spack/modules/linux-centos7-broadwell/
-module use /srv/test-build/spack/share/spack/modules/linux-centos7-x86_64/
 
-#start JupyterLab kernel made for spack
-jupyter kernelspec install --user /srv/jupyterlab_kernels/int/release20210930/spack_python_kernel_release_20210930/
+Clone Spack. We currently use version v0.18.1:
 ```
-- Then select File > New Launcher
-- Open a new Notebook with the "EBRAINS_release_20210930" kernel
-- Import the tools available with spack:
+git clone --depth 1 -c advice.detachedHead=false -c feature.manyFiles=true --branch v0.18.1 https://github.com/spack/spack
 ```
-import nest
-import arbor
-import neuron
+
+Modify (if needed) and copy the package.yaml file (that contains important package settings for Spack) and activate Spack:
+```
+cp ebrains-spack-builds/packages.yaml spack/etc/spack/packages.yaml
+. spack/share/spack/setup-env.sh
+```
+
+Add the project repository to your Spack environment:
+```
+spack repo add ebrains-spack-builds
 ```
 
-**Quickstart for terminal**  
-- Open a terminal at a running Collaboratory Lab Container and execute the following:
+Create and activate the environment:
 ```
- git clone https://gitlab.ebrains.eu/akarmas/ebrains-spack-builds.git
- cd ebrains-spack-builds
- source ./load_sim_tools.sh
+spack env create ebrains-env ebrains-spack-builds/spack.yaml
+spack env activate ebrains-env
 ```
-- Then you can start python and import the available tools
-- Currently installed:  
- arbor  
- neuron  
- nest
-
-## Gitlab CI/CD Enviromental variables
-
-The following variable(s) must be set up if not or re-configured if tokens expire.  
-	  
-OPENSHIFT_TOKEN: Token to login to OpenShift cluster (with the "gitlab" service account)  
-OPENSHIFT_DEV_SERVER: The URL of the OpenShift Development cluster needed for deploying software in lab-int environment  
-BUILD_ENV: The name of the environment to deploy the software of the next commit  
-OPERATION: The operation to perform on the spack environment (one of the following: testing, create, update, delete)
-  
-## Copy spack .yaml files and packages to the Openshift job pod that does the build
-
-The gitlab runner copies the various files needed for the build to the OpenShift job pod.
-- It copies the {spack, repo}.yaml files, the create_JupyterLab_kernel.sh script and the packages/ directory
-- The runner waits until the job's pod is running to start copying the files
-- The pod (built from [tc/ebrains-spack-build-env:latest image](https://docker-registry.ebrains.eu/harbor/projects/8/repositories/ebrains-spack-build-env)) waits until the necessary file(s) has finished copying so that it can continue the build process
-
-## Bulding software binaries with Spack
-
-- The build process is powered by Spack a multi-platform package manager that builds and installs multiple versions and configurations of software.
-- A Job (object) in OpenShift is responsible for the build process.
-- The gitlab runner starts a new Job that runs on an OpenShift pod that uses the container image developed in [this](https://gitlab.ebrains.eu/akarmas/ebrains-spack-build-env/) repository that holds all the Spack specifics needed for the build process. All the Spack configuration necessary for a successfull build is to be changed from the Spack configuration files that are found in the present repository.
-- The OpenShift Job's pod mounts an NFS drive that is also mounted by all Collaboratory Lab containers and performs the entire build process with Spack on that NFS drive and as a result all the installed software is readily available to Collaboratory Lab containers
-- A schema of the build process can be found [here](https://drive.ebrains.eu/smart-link/6adcd99f-c088-472e-a596-37ac38869051/)
-
-## Activating software in the Collaboratory Lab containers
-
-- Currently to activate the pre-built simulation tools in the Collaboratory Lab containers refer to **Quickstart** at the beggining of this file
-- There are two options: i) for using the simulation tools directly in the notebooks and ii) for using the simulation tools from a terminal in a Collaboratory Lab container
-
-**ToDo: put the necessary activation commands in the startup script of a JupyterLab conatiner spawned in OpenShift to hide all implementation details from the users**  
+
+Install:
+```
+spack install --fresh
+```
+
+## Troubleshooting
+
+If you encounter any issues with installing, testing, or using the EBRAINS Spack environment or a specific package, please [open an issue](https://gitlab.ebrains.eu/technical-coordination/project-internal/devops/platform/ebrains-spack-builds/-/issues/new) using the provided templates, or contact the Technical Coordination team directly.
diff --git a/create_JupyterLab_kernel.sh b/create_JupyterLab_kernel.sh
index 8c0d02062b46bc176d5cd42ed3f4996505d42b1b..4961eaa4f5aa4cedd0d2364aed4382a052e3c035 100644
--- a/create_JupyterLab_kernel.sh
+++ b/create_JupyterLab_kernel.sh
@@ -12,67 +12,68 @@ EBRAINS_SPACK_ENV=$2
 RELEASE_NAME=$3
 LAB_KERNEL_ROOT=$4
 
-# enable modules
-source /usr/share/modules/init/sh
-
-# capture the empty env
-cd ~
-env >> /tmp/before.txt
-
-# load spack
-export SPACK_USER_CACHE_PATH=$INSTALLATION_ROOT/spack/.spack
-export SPACK_USER_CONFIG_PATH=$INSTALLATION_ROOT/spack/.spack
-source $INSTALLATION_ROOT/spack/share/spack/setup-env.sh
-# no need to activate as the env is already activated in the context it is used
-# spack env activate $EBRAINS_SPACK_ENV
-
-# load modules
-module use $INSTALLATION_ROOT/spack/share/spack/modules/linux-ubuntu20.04-x86_64/
-source $INSTALLATION_ROOT/spack/var/spack/environments/$EBRAINS_SPACK_ENV/loads
-# also add user's .local python3.8 packages to allow package installation at runtime by the user using pip
-export PYTHONPATH=$PYTHONPATH:/opt/app-root/src/.local/lib/python3.8/site-packages
-export PATH=$PATH:/opt/app-root/src/.local/bin
-# and python modules installed in the base docker Collab image
-export PYTHONPATH=$PYTHONPATH:/usr/local/lib/python3.8/dist-packages
-
-# capture the env after spack activation
-cd ~
-env >> /tmp/after.txt
-
 # kernel name is lowercase release name
 KERNEL_NAME=$(echo "$RELEASE_NAME" | tr '[:upper:]' '[:lower:]')
 # kernel dir is a directory inside LAB_KERNEL_ROOT named after the kernel
 KERNEL_PATH=$LAB_KERNEL_ROOT/$KERNEL_NAME
 
-# prepare the env file required for the JupyterLab kernel
+# prepare the base env.sh script required for the JupyterLab kernels:
 mkdir -p $KERNEL_PATH/bin
 
-# start of env creation
+# (1) create env.sh bash script
 cat <<EOF > $KERNEL_PATH/bin/env.sh
 #!/usr/bin/env bash
 set -euxo pipefail
 EOF
 
-# append the necessary env variables for spack env and tools
-diff /tmp/before.txt /tmp/after.txt|grep ">"|cut -c 3- |awk '$0="export "$0' >> $KERNEL_PATH/bin/env.sh
+# (2) append the necessary env variables for spack env and tools
+cat $INSTALLATION_ROOT/spack/var/spack/environments/$EBRAINS_SPACK_ENV/load_env.sh >> $KERNEL_PATH/bin/env.sh
 
-# end of env creation
-cat <<EOF >>$KERNEL_PATH/bin/env.sh
-python -m ipykernel_launcher -f \$@
+# (3) also add the user's .local locations to allow package installation at runtime,
+# and the location of python modules installed in the base docker Collab image
+cat <<EOF >> $KERNEL_PATH/bin/env.sh
+export PATH=\$PATH:/opt/app-root/src/.local/bin
+export PYTHONPATH=\$PYTHONPATH:/opt/app-root/src/.local/lib/python3.8/site-packages:/usr/local/lib/python3.8/dist-packages
+export R_LIBS_USER=/opt/app-root/src/.local/lib/R/site-library
+mkdir -p \$R_LIBS_USER
+export R_LIBS=\$R_LIBS_USER:\$R_LIBS
 EOF
-chmod +x $KERNEL_PATH/bin/env.sh
 
-# create the new kernel's configuration file
+# (4) create startup script for python kernel
+cat $KERNEL_PATH/bin/env.sh > $KERNEL_PATH/bin/env_python.sh
+echo "python -m ipykernel_launcher -f \$@" >> $KERNEL_PATH/bin/env_python.sh
+chmod +x $KERNEL_PATH/bin/env_python.sh
+
+# ... and the new kernel's configuration file
 mkdir -p $KERNEL_PATH/$KERNEL_NAME
-cat <<EOF >$KERNEL_PATH/$KERNEL_NAME/kernel.json
+cat <<EOF > $KERNEL_PATH/$KERNEL_NAME/kernel.json
 {
- "argv": ["$KERNEL_PATH/bin/env.sh", "{connection_file}", "--profile=default"],
+ "argv": ["$KERNEL_PATH/bin/env_python.sh", "{connection_file}", "--profile=default"],
  "display_name": "$RELEASE_NAME",
- "name": "$KERNEL_NAME",
  "language": "python",
  "env": { "LAB_KERNEL_NAME": "$RELEASE_NAME", "LAB_KERNEL_RELEASE_DATE": "$(date +"%Y-%m-%d")" }
 }
 EOF
 
-# add EBRAINS logo to kernel
-cp $LAB_KERNEL_ROOT/../logo/logo-64x64.png $KERNEL_PATH/$KERNEL_NAME/
+# ... and add EBRAINS logo to kernel
+cp $LAB_KERNEL_ROOT/../etc/logo-64x64-python.png $KERNEL_PATH/$KERNEL_NAME/logo-64x64.png
+
+# (5) create startup script for R kernel
+cat $KERNEL_PATH/bin/env.sh > $KERNEL_PATH/bin/env_r.sh
+echo "R --slave -e \"IRkernel::main()\" --args \$@" >> $KERNEL_PATH/bin/env_r.sh
+chmod +x $KERNEL_PATH/bin/env_r.sh
+
+# ... and the new R kernel's configuration file
+mkdir -p $KERNEL_PATH/${KERNEL_NAME}-R
+cat <<EOF > $KERNEL_PATH/${KERNEL_NAME}-R/kernel.json
+{
+ "argv": ["$KERNEL_PATH/bin/env_r.sh", "{connection_file}"],
+ "display_name": "R-$RELEASE_NAME",
+ "language": "R",
+ "env": { "LAB_KERNEL_NAME": "R-$RELEASE_NAME", "LAB_KERNEL_RELEASE_DATE": "$(date +"%Y-%m-%d")" }
+}
+EOF
+
+# ... and add EBRAINS logo and kernel.js to kernel
+cp $LAB_KERNEL_ROOT/../etc/logo-64x64-R.png $KERNEL_PATH/${KERNEL_NAME}-R/logo-64x64.png
+cp $LAB_KERNEL_ROOT/../etc/kernel.js $KERNEL_PATH/${KERNEL_NAME}-R/
diff --git a/install_spack_env.sh b/install_spack_env.sh
index 5c91bb32b05532d65328494e7cb30b8729069436..ced7f5a626e32c3e77cc9a0e507838ac88621be3 100644
--- a/install_spack_env.sh
+++ b/install_spack_env.sh
@@ -7,31 +7,34 @@
 #                 (if the specified spack instance doesn't exist, it also creates it)
 # ===========================================================================================================
 
-INSTALLATION_ROOT=$1
-SPACK_VERSION=$2
-EBRAINS_REPO=$3
-EBRAINS_SPACK_ENV=$4
+INSTALLATION_ROOT=$1  # where to set up the installation
+SPACK_VERSION=$2      # which spack version to use
+EBRAINS_REPO=$3       # location of ebrains-spack-builds repository
+EBRAINS_SPACK_ENV=$4  # name of EBRAINS Spack environment to be created/updated
 
 # specify location of .spack dir (by default in ~)
+# this is where cache and configuration settings are stored
 export SPACK_USER_CACHE_PATH=$INSTALLATION_ROOT/spack/.spack
 export SPACK_USER_CONFIG_PATH=$INSTALLATION_ROOT/spack/.spack
 
-# initial setup: if spack dir doesn't already exist, clone it and install gcc and python
+# initial setup: clone spack if spack dir doesn't already exist
 if [ ! -d $INSTALLATION_ROOT/spack ]
 then
-  # clone spack repo, import packages.yaml config file and activate
   git clone --depth 1 -c advice.detachedHead=false -c feature.manyFiles=true --branch $SPACK_VERSION https://github.com/spack/spack $INSTALLATION_ROOT/spack
 fi
+# SPACK PATCH: see https://github.com/spack/spack/pull/35290
+sed -i 's/solver.solve(abstract_specs)/solver.solve(abstract_specs, tests=kwargs.get("tests", False))/g' $INSTALLATION_ROOT/spack/lib/spack/spack/concretize.py
+
+# copy package settings (modify if necessary) and activate Spack
 cp $EBRAINS_REPO/packages.yaml $INSTALLATION_ROOT/spack/etc/spack/packages.yaml
 source $INSTALLATION_ROOT/spack/share/spack/setup-env.sh
-# install platform compiler and python (extract versions from packages.yaml)
+
+# install platform compiler (extract version from packages.yaml)
 EBRAINS_SPACK_COMPILER=$(grep 'compiler' $EBRAINS_REPO/packages.yaml | awk -F'[][]' '{ print $2 }')
-EBRAINS_SPACK_PYTHON=python@$(grep -A1 'python' $EBRAINS_REPO/packages.yaml | tail -n1 | awk -F'[][]' '{ print $2 }')
 spack compiler find
 spack install $EBRAINS_SPACK_COMPILER
 spack load $EBRAINS_SPACK_COMPILER
 spack compiler find
-spack install $EBRAINS_SPACK_PYTHON %$EBRAINS_SPACK_COMPILER
 
 # add repo if it does not exist
 if [[ ! $(spack repo list | grep $EBRAINS_REPO) ]]
@@ -45,7 +48,7 @@ then
   spack env create $EBRAINS_SPACK_ENV
 fi
 
-# activate environment
+# update and activate environment
 cp $EBRAINS_REPO/spack.yaml $SPACK_ROOT/var/spack/environments/$EBRAINS_SPACK_ENV/spack.yaml
 spack env activate $EBRAINS_SPACK_ENV
 # There is a known spack bug (https://github.com/spack/spack/issues/29447) in installing test dependencies
@@ -53,11 +56,18 @@ spack env activate $EBRAINS_SPACK_ENV
 # remove the .lock file and let the enironment be concretized by the spack install command:
 rm $SPACK_ROOT/var/spack/environments/$EBRAINS_SPACK_ENV/spack.lock || echo "No spack.lock file"
 # install the environment, use 2 jobs to reduce the amount of required RAM
-spack install -y -j2 --fresh --no-check-signature --test root
+spack install -y -j2 --fresh --test root
 
-# create modules files with spack
-spack module tcl refresh -y
 # rebuild spack's database
 spack reindex
-# create loads script that when sourced activates and loads the installed spack environment
-spack env loads -r
+
+# create load script that when sourced activates and loads the installed spack environment, using views
+# this needs deactivating the environment first:
+spack env deactivate
+unset SPACK_LD_LIBRARY_PATH
+spack env activate --sh $EBRAINS_SPACK_ENV > $SPACK_ROOT/var/spack/environments/$EBRAINS_SPACK_ENV/load_env.sh
+
+# create modules files with spack
+# spack module tcl refresh -y
+# create loads script that when sourced activates and loads the installed spack environment, using modules
+# spack env loads -r
diff --git a/load_sim_tools.sh b/load_sim_tools.sh
deleted file mode 100644
index adb774a9d7717d14ebd0d71b22ec32cbf66b53ba..0000000000000000000000000000000000000000
--- a/load_sim_tools.sh
+++ /dev/null
@@ -1,24 +0,0 @@
-#!/bin/bash
-#title           :load_sim_tools.sh
-#description     :Script to load simulation software on the Collaboratory Lab containers from the Object Storage at CSCS.
-#author          :Athanasios Karmas
-#date            :20210601   
-#usage           :source ./load_sim_tools.sh
-#==============================================================================
-
-echo "Setting up environment..."
-
-INSTALLATION_ROOT="test-build"
-SPACKIFIED_ENV="ebrains-spack-builds"
-
-cp -r /srv/$INSTALLATION_ROOT/spack/.spack ~
-source /srv/$INSTALLATION_ROOT/spack/share/spack/setup-env.sh
-
-cd /srv/$INSTALLATION_ROOT
-spack repo add ebrains-spack-builds
-spack env activate $SPACKIFIED_ENV
-
-module use /srv/$INSTALLATION_ROOT/spack/share/spack/modules/linux-centos7-x86_64/
-source /srv/$INSTALLATION_ROOT/spack/var/spack/environments/$SPACKIFIED_ENV/loads
-
-echo "Everything ready!"
diff --git a/packages.yaml b/packages.yaml
index 54619e5b7025c457912075ed202c4022b9d27ab0..c16e3313f79589b7f8ec0cc67d937d55491ea2fe 100644
--- a/packages.yaml
+++ b/packages.yaml
@@ -1,11 +1,24 @@
 packages:
     all:
+        # collab-specific settings
         target: [x86_64]
         compiler: [gcc@10.3.0]
     python:
+        # collab-specific settings
         version: [3.8.11]
+    r:
+        version: [4.1.3]
+        # EM: +X fixes build for collab
+        variants: [+X]
     py-torch:
+        # ECM: keep at latest w.r.t. tracked upstream spack
         version: [1.11.0]
+        # ECM: No cuda nor rocm in collab VMs.
+        #      I did not try to minimize the specification any further.
         variants: [~cuda~rocm~valgrind~mkldnn~mpi~gloo+tensorpipe~onnx_ml]
     py-jax:
+        # ECM: No cuda in collab VMs.
+        variants: [~cuda]
+    py-jaxlib:
+        # ECM: No cuda in collab VMs.
         variants: [~cuda]
diff --git a/packages/apbs/package.py b/packages/apbs/package.py
index 288b92f62c435d3d201cd2cee1c11bf8d3197e71..5cae20099c56c7263fe06ec5d1b8847964a43bbb 100644
--- a/packages/apbs/package.py
+++ b/packages/apbs/package.py
@@ -30,17 +30,46 @@ class Apbs(CMakePackage):
     version('3.4.0', sha256='572ff606974119430020ec948c78e171d8525fb0e67a56dad937a897cac67461')
 
     # Dependencies.
-    depends_on('cmake@3.19', type='build')
-    depends_on('python@3.8:3.10', type=('build', 'run'))
-    depends_on('blas', type=('build', 'run'))
-    depends_on('suite-sparse', type=('build', 'run'))
-    depends_on('maloc', type=('build', 'run'))
+    depends_on('cmake@3.19',        type=('build'))
+    depends_on('bison',             type=('build')) 
+    depends_on('flex',              type=('build'))
+    depends_on('swig',              type=('build'))
+    depends_on('readline',          type=('build', 'run'))
+    depends_on('eigen',             type=('build', 'run'))
+    depends_on('boost',             type=('build', 'run'))
+    depends_on('blas',              type=('build', 'run'))
+    depends_on('arpack-ng',         type=('build', 'run'))
+    depends_on('suite-sparse+tbb',  type=('build', 'run'))
+    depends_on('maloc',             type=('build', 'run'))
+    depends_on('python@3.8:3.10',   type=('build', 'run'))
 
     def cmake_args(self):
         # Min and max Python versions need to be set as variables to pass tests.
         # See tests/CMakeLists.txt lines 6-14.
+        python_version = str(self.spec['python'].version)
         args = [
-                '-DPYTHON_MIN_VERSION=3.8',
-                '-DPYTHON_MAX_VERSION=3.10',
+                '-DPYTHON_MIN_VERSION='+python_version,
+                '-DPYTHON_MAX_VERSION='+python_version
                 ]
         return args
+
+    def setup_build_environment(self, env):
+        # add suite-sparse libs to path because tests can't find them
+        env.prepend_path("LD_LIBRARY_PATH", self.spec['suite-sparse'].prefix.lib)
+
+    def setup_dependent_build_environment(self, env, dependent_spec):
+        self.setup_build_environment(env)
+
+    @run_after('install')
+    @on_package_attributes(run_tests=True)
+    def install_test(self):
+        with working_dir(self.build_directory):
+            # for testing, apbs needs to be in the path
+            import os
+            os.environ['PATH'] = self.prefix.bin + ':' + os.environ['PATH']
+            ctest = which("ctest")
+            ctest("-C", "Release", "--output-on-failure")
+
+    def check(self):
+        # this would run "make test" before installation, so we override this and define install_test() instead
+        pass
diff --git a/packages/arbor/package.py b/packages/arbor/package.py
index 34a30425b85d0185301a52855a1786444ab8e264..2f93d3cfab50b9e0196e01a7dda44062686a2866 100644
--- a/packages/arbor/package.py
+++ b/packages/arbor/package.py
@@ -123,3 +123,8 @@ class Arbor(CMakePackage, CudaPackage):
         args.append("-DARB_CXX_FLAGS_TARGET=" + opt_flags)
 
         return args
+
+    @run_after('install')
+    @on_package_attributes(run_tests=True)
+    def install_test(self):
+        python('-c', 'import arbor')
diff --git a/packages/biobb-common/package.py b/packages/biobb-common/package.py
index 4ab5a4015ead507e80c449ef693235fb1b2fec4c..2bb4d1fd70bc7a8d916185affe609b8cd4a839cf 100644
--- a/packages/biobb-common/package.py
+++ b/packages/biobb-common/package.py
@@ -1,8 +1,9 @@
-# Copyright 2013-2021 Lawrence Livermore National Security, LLC and other
+# Copyright 2013-2023 Lawrence Livermore National Security, LLC and other
 # Spack Project Developers. See the top-level COPYRIGHT file for details.
 #
 # SPDX-License-Identifier: (Apache-2.0 OR MIT)
 
+
 from spack import *
 
 class BiobbCommon(PythonPackage):
@@ -10,15 +11,12 @@ class BiobbCommon(PythonPackage):
 
     # Homepage and download url
     homepage = "https://github.com/bioexcel/biobb_common"
-    #url = "https://github.com/bioexcel/biobb_common/tarball/v3.7.0"
-    git = 'https://github.com/bioexcel/biobb_common.git'
+    url      = "https://github.com/bioexcel/biobb_common/archive/refs/tags/v3.8.1.tar.gz"
 
-    # FIXME: Add a list of GitHub accounts to
-    # notify when the package is updated.
-    # maintainers = ['github_user1', 'github_user2']
+    maintainers = ['dbeltran']
 
     # Versions
-    version('3.8.1', branch='master')
+    version('3.8.1', sha256='b6c939c1445ea2f8282e491e0414cc15f4934466ca24ecd77e24cef2e7df49e4')
 
     # Dependencies
     depends_on('py-setuptools')
@@ -26,3 +24,4 @@ class BiobbCommon(PythonPackage):
     depends_on('py-pyyaml', type=('build', 'run'))
     depends_on('py-requests', type=('build', 'run'))
     depends_on('py-biopython@1.78:1.80', type=('build', 'run'))
+
diff --git a/packages/biobb-gromacs/package.py b/packages/biobb-gromacs/package.py
index b2243b91be9eda63e09de60194601b7dfa5b2f97..16f643c7e5b427bc02e976fb1743658186209880 100644
--- a/packages/biobb-gromacs/package.py
+++ b/packages/biobb-gromacs/package.py
@@ -1,3 +1,9 @@
+# Copyright 2013-2023 Lawrence Livermore National Security, LLC and other
+# Spack Project Developers. See the top-level COPYRIGHT file for details.
+#
+# SPDX-License-Identifier: (Apache-2.0 OR MIT)
+
+
 from spack import *
 
 class BiobbGromacs(PythonPackage):
@@ -6,12 +12,14 @@ class BiobbGromacs(PythonPackage):
 
     # Homepage and download url
     homepage = "https://github.com/bioexcel/biobb_gromacs"
-    git = 'https://github.com/bioexcel/biobb_gromacs.git'
+    url      = "https://github.com/bioexcel/biobb_gromacs/archive/refs/tags/v3.8.1.tar.gz"
+
+    maintainers = ['dbeltran']
 
     # Versions
-    version('3.8.0', branch='master')
+    version('3.8.1', sha256='6da49b691b14a8bcf7ffca08c898fe9affd258ca2f8c7be4981df840a6907efa')
 
     # Dependencies
-    depends_on('python@3.8:', type=('build', 'run'))
-    depends_on('biobb-common')
+    depends_on('python@3.8:',type=('build', 'run'))
+    depends_on('biobb-common@3.8.1', type=('build', 'run'), when='@3.8.1')
     depends_on('gromacs')
diff --git a/packages/funniest1022/package.py b/packages/funniest1022/package.py
deleted file mode 100644
index b39f22705825252587f2107d4977cd0202684eae..0000000000000000000000000000000000000000
--- a/packages/funniest1022/package.py
+++ /dev/null
@@ -1,8 +0,0 @@
-from spack import *
-
-class Funniest1022(PythonPackage):
-    pypi = 'funniest1022/funniest1022-0.3.tar.gz'
-    maintainers = ['akarmas']
-    version('0.3', '248ec9320ad80dc4b05dca73e4deff78')
-    depends_on('python@3.8:', type=('build','run'))
-    depends_on('py-pandas', type=('build','run'))
diff --git a/packages/nest/package.py b/packages/nest/package.py
index 64bf7045589c3f408aa08ec46e038bc2ea1569c4..aa32a588983ca6033eb221f65206a64bc724e701 100644
--- a/packages/nest/package.py
+++ b/packages/nest/package.py
@@ -21,13 +21,12 @@ class Nest(CMakePackage):
         #
         #'https://github.com/nest/nest-simulator/releases/download/v2.12.0/nest-2.12.0.tar.gz',
         'https://github.com/nest/nest-simulator/archive/refs/tags/v2.12.0.tar.gz',
-
         'https://github.com/nest/nest-simulator/archive/refs/tags/v3.0.tar.gz'
     ]
     git      = "https://github.com/nest/nest-simulator.git"
 
     version('master', branch='master')
-    version('3.4_rc1',sha256='62558bf545abd5a54e92abd4ce8afaa58b45fe1065e6f47a7da723cd85a7e013')
+    version('3.4',    sha256='c56699111f899045ba48e55e87d14eca8763b48ebbb3648beee701a36aa3af20')
     version('3.3',    sha256='179462b966cc61f5785d2fee770bc36f86745598ace9cd97dd620622b62043ed')
     version('3.2',    sha256='583d5725882ad5e8fd4fc7ffab425da97cbbb91fadbc327e940c184e8892b958')
     patch('nest-simulator-3.2-p1-VersionNumber.patch', when='@3.2')
diff --git a/packages/neuron/package.py b/packages/neuron/package.py
index dbb9b90b799c06c4bdd773900a042c271f190717..25ea3219cf0c17ea98566bced345622169280710 100644
--- a/packages/neuron/package.py
+++ b/packages/neuron/package.py
@@ -1,13 +1,9 @@
-# this package was adapted from the spack v0.18.1 upstream to fix an issue with
-# setting the PYTHONPATH of dependents for installation time tests
-# also version 8.1.0 has been added
-
-# Copyright 2013-2022 Lawrence Livermore National Security, LLC and other
+# Copyright 2013-2023 Lawrence Livermore National Security, LLC and other
 # Spack Project Developers. See the top-level COPYRIGHT file for details.
 #
 # SPDX-License-Identifier: (Apache-2.0 OR MIT)
 
-from spack import *
+from spack.package import *
 
 
 class Neuron(CMakePackage):
@@ -20,41 +16,41 @@ class Neuron(CMakePackage):
     """
 
     homepage = "https://www.neuron.yale.edu/"
-    url      = "https://neuron.yale.edu/ftp/neuron/versions/v7.7/nrn-7.7.tar.gz"
-    git      = "https://github.com/neuronsimulator/nrn"
-    maintainers = ['pramodk', 'nrnhines', 'iomaganaris', 'alexsavulescu']
+    url = "https://github.com/neuronsimulator/nrn/releases/download/8.2.2/full-src-package-8.2.2.tar.gz"
+    git = "https://github.com/neuronsimulator/nrn"
 
-    version('develop', branch='master', submodules='True')
-    version("8.1.0", tag="8.0.0", submodules='True')
-    version("8.0.0", tag="8.0.0", submodules='True')
-    version("7.8.2", tag="7.8.2", submodules='True')
-    version("7.8.1", tag="7.8.1", submodules='True')
+    version("develop", branch="master", submodules="True")
+    version("8.2.2", tag="8.2.2", submodules="True")
+    version("8.1.0", tag="8.1.0", submodules="True")
+    version("8.0.0", tag="8.0.0", submodules="True")
+    version("7.8.2", tag="7.8.2", submodules="True")
+    version("7.8.1", tag="7.8.1", submodules="True")
 
-    variant("coreneuron",    default=False, description="Enable CoreNEURON as submodule")
+    variant("coreneuron", default=True, description="Enable CoreNEURON as submodule")
     variant("cross-compile", default=False, description="Build for cross-compile environment")
-    variant("interviews",    default=False, description="Enable GUI with INTERVIEWS")
-    variant("legacy-unit",   default=False, description="Enable legacy units")
-    variant("mpi",           default=True,  description="Enable MPI parallelism")
-    variant("python",        default=True,  description="Enable python")
-    variant("rx3d",          default=False,  description="Enable cython translated 3-d rxd")
-    variant("tests",         default=False, description="Enable unit tests")
-    variant("caliper",       default=False, description="Add LLNL/Caliper support")
-
-    depends_on("bison",     type="build")
-    depends_on("flex",      type="build")
+    variant("interviews", default=False, description="Enable GUI with INTERVIEWS")
+    variant("legacy-unit", default=False, description="Enable legacy units")
+    variant("mpi", default=True, description="Enable MPI parallelism")
+    variant("python", default=True, description="Enable python")
+    variant("rx3d", default=False, description="Enable cython translated 3-d rxd")
+    variant("tests", default=False, description="Enable unit tests")
+    variant("caliper", default=False, description="Add LLNL/Caliper support")
+
+    depends_on("bison", type="build")
+    depends_on("flex", type="build")
     depends_on("py-cython", when="+rx3d", type="build")
 
     depends_on("gettext")
-    depends_on("mpi",         when="+mpi")
+    depends_on("mpi", when="+mpi")
     depends_on("ncurses")
     depends_on("python@2.7:", when="+python")
-    depends_on("py-pytest",   when="+python+tests")
-    depends_on("py-mpi4py",   when="+mpi+python+tests")
+    depends_on("py-pytest", when="+python+tests")
+    depends_on("py-mpi4py", when="+mpi+python+tests")
     depends_on("readline")
-    depends_on("caliper",     when="+caliper")
-    depends_on("py-numpy",    type='run')
+    depends_on("caliper", when="+caliper")
+    depends_on("py-numpy", type="run")
 
-    conflicts("+rx3d",        when="~python")
+    conflicts("+rx3d", when="~python")
 
     patch("patch-v782-git-cmake-avx512.patch", when="@7.8.2")
 
@@ -66,32 +62,36 @@ class Neuron(CMakePackage):
             cmake_name = spec_options[1:].upper().replace("-", "_")
             return "-DNRN_ENABLE_" + cmake_name + ":BOOL=" + value
 
-        args = [cmake_options(variant) for variant in ["+coreneuron",
-                                                       "+interviews",
-                                                       "+mpi",
-                                                       "+python",
-                                                       "+rx3d",
-                                                       "+coreneuron",
-                                                       "+tests"]]
+        args = [
+            cmake_options(variant)
+            for variant in [
+                "+coreneuron",
+                "+interviews",
+                "+mpi",
+                "+python",
+                "+rx3d",
+                "+coreneuron",
+                "+tests",
+            ]
+        ]
         args.append("-DNRN_ENABLE_BINARY_SPECIAL=ON")
 
-        if "~mpi" in spec and '+coreneuron' in spec:
+        if "~mpi" in spec and "+coreneuron" in spec:
             args.append("-DCORENRN_ENABLE_MPI=OFF")
 
         if "+python" in spec:
-            args.append("-DPYTHON_EXECUTABLE:FILEPATH="
-                        + spec["python"].command.path)
+            args.append("-DPYTHON_EXECUTABLE:FILEPATH=" + spec["python"].command.path)
 
-        if spec.variants['build_type'].value == 'Debug':
+        if spec.variants["build_type"].value == "Debug":
             args.append("-DCMAKE_C_FLAGS=-g -O0")
             args.append("-DCMAKE_CXX_FLAGS=-g -O0")
             args.append("-DCMAKE_BUILD_TYPE=Custom")
 
         if "+legacy-unit" in spec:
-            args.append('-DNRN_DYNAMIC_UNITS_USE_LEGACY=ON')
+            args.append("-DNRN_DYNAMIC_UNITS_USE_LEGACY=ON")
 
         if "+caliper" in spec:
-            args.append('-DCORENRN_CALIPER_PROFILING=ON')
+            args.append("-DCORENRN_CALIPER_PROFILING=ON")
 
         return args
 
@@ -113,8 +113,7 @@ class Neuron(CMakePackage):
             cxx_compiler = self.compiler.cxx
 
         kwargs = {"backup": False, "string": True}
-        nrnmech_makefile = join_path(self.prefix,
-                                     "./bin/nrnmech_makefile")
+        nrnmech_makefile = join_path(self.prefix, "./bin/nrnmech_makefile")
 
         # assign_operator is changed to fix wheel support
         if self.spec.satisfies("@:7"):
@@ -122,18 +121,21 @@ class Neuron(CMakePackage):
         else:
             assign_operator = "="
 
-        filter_file("CC {0} {1}".format(assign_operator, env["CC"]),
-                    "CC = {0}".format(cc_compiler),
-                    nrnmech_makefile,
-                    **kwargs)
-        filter_file("CXX {0} {1}".format(assign_operator, env["CXX"]),
-                    "CXX = {0}".format(cxx_compiler),
-                    nrnmech_makefile,
-                    **kwargs)
+        filter_file(
+            "CC {0} {1}".format(assign_operator, env["CC"]),
+            "CC = {0}".format(cc_compiler),
+            nrnmech_makefile,
+            **kwargs,
+        )
+        filter_file(
+            "CXX {0} {1}".format(assign_operator, env["CXX"]),
+            "CXX = {0}".format(cxx_compiler),
+            nrnmech_makefile,
+            **kwargs,
+        )
 
         if spec.satisfies("+coreneuron"):
-            corenrn_makefile = join_path(self.prefix,
-                                         "share/coreneuron/nrnivmodl_core_makefile")
+            corenrn_makefile = join_path(self.prefix, "share/coreneuron/nrnivmodl_core_makefile")
             filter_file(env["CXX"], cxx_compiler, corenrn_makefile, **kwargs)
 
     def setup_run_environment(self, env):
@@ -141,7 +143,18 @@ class Neuron(CMakePackage):
         env.prepend_path("LD_LIBRARY_PATH", join_path(self.prefix, "lib"))
         if self.spec.satisfies("+python"):
             env.prepend_path("PYTHONPATH", self.spec.prefix.lib.python)
-    
-    # necessary for installation time tests of dependents
+
+    # override setup_{build/run}_environment for standalone package tests
+    def setup_build_environment(self, env):
+        self.setup_run_environment(env)
+
     def setup_dependent_build_environment(self, env, dependent_spec):
         self.setup_run_environment(env)
+
+    def setup_dependent_run_environment(self, env, dependent_spec):
+        self.setup_run_environment(env)
+
+    @run_after('install')
+    @on_package_attributes(run_tests=True)
+    def install_test(self):
+        python('-c', 'import neuron')
diff --git a/packages/neuron/patch-v782-git-cmake-avx512.patch b/packages/neuron/patch-v782-git-cmake-avx512.patch
index 34f0f3a6569ed14f7d2fd2ac2228f543eb24a934..dc2a4b8fe49f7fb01b409d0cf923c9ba5b220cd5 100644
--- a/packages/neuron/patch-v782-git-cmake-avx512.patch
+++ b/packages/neuron/patch-v782-git-cmake-avx512.patch
@@ -137,4 +137,3 @@ index 30024d6e..26f76a98 100644
    COMMAND ${CMAKE_COMMAND} -E copy_if_different nrnversion.h.tmp ${NRN_NRNOC_SRC_DIR}/nrnversion.h
    DEPENDS ${PROJECT_SOURCE_DIR}/git2nrnversion_h.sh)
  
-
diff --git a/packages/py-bluepyopt/package.py b/packages/py-bluepyopt/package.py
index b42aa7ae008f6ca4abdfafa109316da69bfc72df..3cb09bc83ab214fa2a84160f4376391790d0e59c 100644
--- a/packages/py-bluepyopt/package.py
+++ b/packages/py-bluepyopt/package.py
@@ -1,8 +1,6 @@
-##############################################################################
-# Copyright 2013-2020 Lawrence Livermore National Security, LLC and other
-# Spack Project Developers. See the top-level COPYRIGHT file for details.
-#
-# SPDX-License-Identifier: (Apache-2.0 OR MIT)
+# (this package was adapted from https://github.com/BlueBrain/spack/blob/develop/bluebrain/repo-bluebrain/packages/py-bluepyopt/package.py)
+
+
 from spack import *
 
 
@@ -12,34 +10,39 @@ class PyBluepyopt(PythonPackage):
     homepage = "https://github.com/BlueBrain/BluePyOpt"
     pypi = "bluepyopt/bluepyopt-1.9.27.tar.gz"
 
+    maintainers = ["hjorth", "elmath"]
+
     # NOTE : while adding new release check pmi_rank.patch compatibility
-    version('1.10.38', sha256='fb1411c6a8fbfac52d36b837225bae882fd6524acfb4d0580189312ef3c1cfcc')
-    version('1.9.37', sha256='4399af71de48b288832e92f0de73c431bf88d6e76e2c4ea250c3b38fb38a45a8')
-    version('1.9.27', sha256='4cce15b92b32311c808cae5e005b664deb6e8dc5df4ca13ea7b59252ae346522')
-    version('1.8.68', sha256='b9d432840aab89d4863c935d3dc604816441eba02d731422b92056cee751ca9c')
-    version('1.6.56', sha256='1c57c91465ca4b947fe157692e7004a3e6df02e4151e3dc77a8831382a8f1ab9')
-    version('1.8.68', sha256='b9d432840aab89d4863c935d3dc604816441eba02d731422b92056cee751ca9c')
-    version('1.9.12', sha256='7b623ab9168f460a85d952719ca5249248fc95e6f7a02658b0673b2baa0a8fc6')
+    version("1.12.63", sha256="ec33abe2113767420cae0317da4d61554eb934e5447cadb54d66620576b97714")
+    version("1.11.47", sha256="cffe1698930e3e89544c441674a5f66e310c72db27f8265b17200713d9d16614")
+    version("1.10.38", sha256="fb1411c6a8fbfac52d36b837225bae882fd6524acfb4d0580189312ef3c1cfcc")
+    version("1.9.37", sha256="4399af71de48b288832e92f0de73c431bf88d6e76e2c4ea250c3b38fb38a45a8")
+    version("1.9.27", sha256="4cce15b92b32311c808cae5e005b664deb6e8dc5df4ca13ea7b59252ae346522")
+    version("1.8.68", sha256="b9d432840aab89d4863c935d3dc604816441eba02d731422b92056cee751ca9c")
+    version("1.6.56", sha256="1c57c91465ca4b947fe157692e7004a3e6df02e4151e3dc77a8831382a8f1ab9")
+    version("1.8.68", sha256="b9d432840aab89d4863c935d3dc604816441eba02d731422b92056cee751ca9c")
+    version("1.9.12", sha256="7b623ab9168f460a85d952719ca5249248fc95e6f7a02658b0673b2baa0a8fc6")
 
     # patch required to avoid hpe-mpi linked mechanism library
     patch("pmi_rank.patch", when="@1.9.27:")
 
-    variant('neuron', default=True, description="Use BluePyOpt together with NEURON")
-
-    depends_on("py-setuptools@:57", type="build") #TODO: remove version constraint after update to spack v0.19 (this is actually a py-deap dependency)
-    depends_on('py-pandas', type='run')
-    depends_on('py-numpy', type='run')
-    depends_on('py-efel', type='run')
-    depends_on('py-deap', type='run')
-    depends_on('py-scoop@0.7:', type='run', when='@:1.9.37')
-    depends_on('py-ipyparallel', type='run')
-    depends_on('py-pickleshare', type='run')
-    depends_on('py-future', type='run')
-    depends_on('py-jinja2', type='run')
-    depends_on('py-pebble@4.3.10:', type='run')
-    depends_on('neuron', type='run', when='+neuron')
+    variant("neuron", default=True, description="Use BluePyOpt together with NEURON")
+
+    depends_on("py-setuptools",         type=("build"))
+    depends_on("py-pandas@0.18:",       type=("build","run"))
+    depends_on("py-numpy@1.6:",         type=("build","run"))
+    depends_on("py-efel@2.13:",         type=("build","run"))
+    depends_on("py-deap",               type=("build","run"))
+    depends_on("py-deap@1.3.3:",        type=("build","run"), when="@1.12.63:")
+    depends_on("py-scoop@0.7:",         type=("build","run"), when="@:1.9.37")
+    depends_on("py-ipyparallel",        type=("build","run"))
+    depends_on("py-pickleshare@0.7.3:", type=("build","run"))
+    depends_on("py-future",             type=("build","run"))
+    depends_on("py-jinja2@2.8:",        type=("build","run"))
+    depends_on("py-pebble@4.3.10:",     type=("build","run"))
+    depends_on("neuron",                type=("build","run"), when="+neuron")
 
     def setup_run_environment(self, env):
-        env.unset('PMI_RANK')
-        env.set('NEURON_INIT_MPI', "0")
-        env.prepend_path('PATH', self.spec['py-ipyparallel'].prefix.bin)
+        env.unset("PMI_RANK")
+        env.set("NEURON_INIT_MPI", "0")
+        env.prepend_path("PATH", self.spec["py-ipyparallel"].prefix.bin)
diff --git a/packages/py-deap/package.py b/packages/py-deap/package.py
new file mode 100644
index 0000000000000000000000000000000000000000..1841b020953bde7862d5e147f15c1f16a568a8ca
--- /dev/null
+++ b/packages/py-deap/package.py
@@ -0,0 +1,24 @@
+# (this package was adapted from the spack develop upstream as a dependency of py-bluepyopt)
+
+# Copyright 2013-2023 Lawrence Livermore National Security, LLC and other
+# Spack Project Developers. See the top-level COPYRIGHT file for details.
+#
+# SPDX-License-Identifier: (Apache-2.0 OR MIT)
+
+
+from spack import *
+
+
+class PyDeap(PythonPackage):
+    """Distributed Evolutionary Algorithms in Python."""
+
+    homepage = "https://deap.readthedocs.org/"
+    pypi = "deap/deap-1.3.1.tar.gz"
+
+    maintainers = ["hjorth", "elmath"]
+
+    version("1.3.3", sha256="8772f1b0fff042d5e516b0aebac2c706243045aa7d0de8e0b8658f380181cf31")
+    version("1.3.1", sha256="11f54493ceb54aae10dde676577ef59fc52d52f82729d5a12c90b0813c857a2f")
+
+    depends_on("py-setuptools@:57", type=("build"))
+    depends_on("py-numpy",          type=("build", "run"))
diff --git a/packages/py-dicthash/package.py b/packages/py-dicthash/package.py
new file mode 100644
index 0000000000000000000000000000000000000000..785066f7a6ed430e46b4d7312c29b1ac4f70873c
--- /dev/null
+++ b/packages/py-dicthash/package.py
@@ -0,0 +1,28 @@
+# Copyright 2013-2022 Lawrence Livermore National Security, LLC and other
+# Spack Project Developers. See the top-level COPYRIGHT file for details.
+#
+# SPDX-License-Identifier: (Apache-2.0 OR MIT)
+
+from spack import *
+
+
+class PyDicthash(PythonPackage):
+    """Generate portable md5 hashes from (arbitrarily nested) dictionaries.
+
+    These dictionaries can contain arbitrary Python and NumPy data types. The
+    goal of the module is to provide a hash function that can be safely used
+    across different platforms. Its main use is to generate unique identifiers
+    for parameter dictionaries used in parameter scans of neural network
+    simulations.
+    """
+
+    homepage = "https://python-dicthash.readthedocs.io"
+    pypi     = "dicthash/dicthash-0.0.2.tar.gz"
+    git = "https://github.com/Happy-Algorithms-League/python-dicthash"
+
+    maintainers = ['terhorstd', 'jakobj']
+
+    version('0.0.2', sha256='30b71bd64101295053b082b3244870e6ca7dca561bdb8f3776c42c8c40cb4af4')
+
+    depends_on('py-setuptools', type='build')
+
diff --git a/packages/py-ebrains-kg-core/package.py b/packages/py-ebrains-kg-core/package.py
index 4f4f7f3cd02695b2fe39b6e56453891f361674d8..c6eff2c94b78870eba090b3ae6584775943c1b42 100644
--- a/packages/py-ebrains-kg-core/package.py
+++ b/packages/py-ebrains-kg-core/package.py
@@ -15,6 +15,9 @@ class PyEbrainsKgCore(PythonPackage):
 
     maintainers = ["ioannistsanaktsidis", "olinux"]
 
+    version('0.9.14', sha256='e898761abb999b09e5da49b25d13ffcadebaec7acd87ed079abe23f3bb12a5e7')
+    version('0.9.13', sha256='25e155e9eb6c516dd33e29d9ff433c996630989a0f017c5920b66fe5334f2d82')
+    version('0.9.12', sha256='244e52dffaec425bf65cf2d3d697969ec9036aaa028bf47fdddfb4911282f484')
     version("0.9.10", sha256="5b7022379f06468fd827a8eb7bddf86a182af188abfd11c84a47bbe21c6f8b7b")
 
     depends_on("py-setuptools", type="build")
diff --git a/packages/py-efel/package.py b/packages/py-efel/package.py
index cb119c70427c182cb48d2078a52165f1fc62fe1d..091bf110491cfc52f5fb86b70302d26e9ce63dc0 100644
--- a/packages/py-efel/package.py
+++ b/packages/py-efel/package.py
@@ -14,8 +14,8 @@ class PyEfel(PythonPackage):
     pypi     = "efel/efel-4.0.4.tar.gz"
     git      = "https://github.com/BlueBrain/eFEL.git"
 
-    version('4.0.4', sha256='258c506776df609edc799338fd773e78f0f0315fd6f3e2f969478bda401a8894')
+    version("4.0.4", sha256="258c506776df609edc799338fd773e78f0f0315fd6f3e2f969478bda401a8894")
 
-    depends_on('python@3.6.9:')
-    depends_on('py-numpy@1.6:',     type=('build', 'run'))
-    depends_on('py-six',            type=('build', 'run'))
\ No newline at end of file
+    depends_on("python@3.6.9:")
+    depends_on("py-numpy@1.6:", type=("build", "run"))
+    depends_on("py-six",        type=("build", "run"))
diff --git a/packages/py-elephant/package.py b/packages/py-elephant/package.py
index 163ee8000d80871584af4962ed6f735b823b3eb8..779cae51a435195416b06b32aa29fbaa28d34637 100644
--- a/packages/py-elephant/package.py
+++ b/packages/py-elephant/package.py
@@ -17,6 +17,7 @@ class PyElephant(PythonPackage):
     maintainers = ["Moritz-Alexander-Kern"]
 
     version('develop', branch='master')
+    version("0.12.0", sha256="81f8d668f92d8688344bb7a9c5abaa8438d824560c935a411e6e36ddf7dc7c72")
     version("0.11.2", sha256="f8759fff0bbb136ae4ffc8d1eacadeea8ba56610d705c3bf207de87ada3ba240")
     version("0.11.1", sha256="d604a202583440fdf9d95d42cef50a410bd74fcaaa1a925b139435f27ab012ef")
     version("0.11.0", sha256="7b547964dbd196361edc922db2c5a7c0c886ef1effcca6c6dc7adb06f966a3be")
@@ -61,9 +62,11 @@ class PyElephant(PythonPackage):
     depends_on("py-neo@0.9.0", type=("build", "run"), when="@0.9.0:0.10.0")
     depends_on("py-neo@0.8.0", type=("build", "run"), when="@0.6.4:0.8.0")
     depends_on("py-numpy@1.18.1:1.23.5", type=("build", "run"), when="@0.6.4:0.11.2")
+    depends_on("py-numpy@1.18.1:", type=("build", "run"), when="@0.12.0:")
     depends_on("py-numpy@1.18.1:", type=("build", "run"), when="@develop")
     depends_on("py-quantities@0.12.1:0.13.0", type=("build", "run"), when="@0.6.4:0.11.2")
     depends_on("py-quantities@0.14.0:", type=("build", "run"), when="@develop")
+    depends_on("py-quantities@0.14.1:", type=("build", "run"), when="@0.12.0:")
     depends_on("py-scipy@1.5.4:", type=("build", "run"), when="@0.6.4:")
     depends_on("py-six@1.10.0:", type=("build", "run"), when="@0.6.4:")
     depends_on("py-tqdm", type=("build", "run"), when="@0.6.4:")
diff --git a/packages/py-jaxlib/package.py b/packages/py-jaxlib/package.py
index ed403158bc5ef0351b234f70c987dbf823b5ed25..b6d117c94f6bc087e7ee53c64d23a6b3b9443375 100644
--- a/packages/py-jaxlib/package.py
+++ b/packages/py-jaxlib/package.py
@@ -21,6 +21,8 @@ class PyJaxlib(PythonPackage, CudaPackage):
     version("0.3.25", sha256="73ebc7868631cd9d520385557bbd7f08762d748a5a6a1bebef0f3b8d7ba748ef")
     version("0.1.74", sha256="bbc78c7a4927012dcb1b7cd135c7521f782d7dad516a2401b56d3190f81afe35")
 
+    variant("cuda", default=True, description="Build with CUDA")
+
     depends_on("python@3.7:", type=("build", "run"))
     depends_on("py-setuptools", type="build")
     depends_on("py-numpy@1.18:", type=("build", "run"))
diff --git a/packages/py-libsonata/package.py b/packages/py-libsonata/package.py
index 4c9ee33b5ec7c51f54dc1d5bdb14546e5cd3a03f..6195654318a64f10b13313ffa4f82661c3a4f008 100644
--- a/packages/py-libsonata/package.py
+++ b/packages/py-libsonata/package.py
@@ -1,7 +1,5 @@
-# Copyright 2013-2018 Lawrence Livermore National Security, LLC and other
-# Spack Project Developers. See the top-level COPYRIGHT file for details.
-#
-# SPDX-License-Identifier: (Apache-2.0 OR MIT)
+# (this package was adapted from https://github.com/BlueBrain/spack/blob/develop/bluebrain/repo-bluebrain/packages/py-libsonata/package.py)
+
 
 from spack import *
 
@@ -12,22 +10,23 @@ class PyLibsonata(PythonPackage):
     homepage = "https://github.com/BlueBrain/libsonata"
     git = "https://github.com/BlueBrain/libsonata.git"
     pypi = "libsonata/libsonata-0.1.14.tar.gz"
+    
+    maintainers = ["hjorth", "elmath"]
 
     submodules = True
 
-    version('develop', branch='master')
-    version('0.1.16', sha256='49ced56992ba8be8aa6638525e8078b7e3ce0d5c05c34ee90746cab02bb5185a')
-    version('0.1.15', sha256='8c7c509db692b482cba5b0453579747db5a981ce5b3c13da96b14ae0332a6e81')
-    version('0.1.14', sha256='a5c75df1c3ef6fac10d92fb6781643e0834e5c35debe77693686dab8bfcf221f')
-    version('0.1.13', sha256='8263938e49b501c477f626b4c25e0c74e91152268830c69aabc96eeb263c6eea')
-    version('0.1.12', sha256='f0fa0f3b129d28e41b337ce2c39c3604990752de8e485327ec9df3bf0360e9c1')
-    version('0.1.11', sha256='95f302818971fec3f19ef18febd5c31c580490692138c8e4fe3534104d88b5e0')
-    version('0.1.10', sha256='7ef9f911f7ea31da5ff5306d8372ec194d223850aede0878ac2a921ce049bbb2')
-
-    depends_on('cmake@3.3:', type='build')
-    depends_on('hdf5')
-    depends_on('py-pybind11')
-
-    depends_on('py-numpy@1.17:', type=('build', 'run'))
-    depends_on('py-setuptools', type='build', when='@0.1:')
-    depends_on('py-setuptools-scm', type='build', when='@0.1:')
+    version("develop", branch="master")
+    version("0.1.16", sha256="49ced56992ba8be8aa6638525e8078b7e3ce0d5c05c34ee90746cab02bb5185a")
+    version("0.1.15", sha256="8c7c509db692b482cba5b0453579747db5a981ce5b3c13da96b14ae0332a6e81")
+    version("0.1.14", sha256="a5c75df1c3ef6fac10d92fb6781643e0834e5c35debe77693686dab8bfcf221f")
+    version("0.1.13", sha256="8263938e49b501c477f626b4c25e0c74e91152268830c69aabc96eeb263c6eea")
+    version("0.1.12", sha256="f0fa0f3b129d28e41b337ce2c39c3604990752de8e485327ec9df3bf0360e9c1")
+    version("0.1.11", sha256="95f302818971fec3f19ef18febd5c31c580490692138c8e4fe3534104d88b5e0")
+    version("0.1.10", sha256="7ef9f911f7ea31da5ff5306d8372ec194d223850aede0878ac2a921ce049bbb2")
+
+    depends_on("hdf5")
+    depends_on("py-pybind11")
+    depends_on("cmake@3.3:",        type=("build"))
+    depends_on("py-setuptools",     type=("build"), when="@0.1:")
+    depends_on("py-setuptools-scm", type=("build"), when="@0.1:")
+    depends_on("py-numpy@1.17:",    type=("build", "run"))
diff --git a/packages/py-neo/package.py b/packages/py-neo/package.py
index 7f641351423ffb6df841f3db371f77d0b162aeb4..b41b05768791a4a27d9398cd75dfd5a398a48216 100644
--- a/packages/py-neo/package.py
+++ b/packages/py-neo/package.py
@@ -14,6 +14,10 @@ class PyNeo(PythonPackage):
     homepage = "https://neuralensemble.org/neo"
     pypi = "neo/neo-0.4.1.tar.gz"
 
+    # temporary fix to avoid building with py-setuptools@:61, that doesn't support PEP 621
+    version('0.12.0', sha256='758f1938b6e3d1a21e465265e6859dc925cc1f0a4a347658cd4bc6293b99545d',
+            url='https://pypi.io/packages/py3/n/neo/neo-0.12.0-py3-none-any.whl', expand=False)
+    # version('0.12.0', sha256='3b6ca4fc05dfdb4e953e253e70994bfbbc8fe2e90958fbda7fa5860caf3fa63a')
     version('0.11.1', sha256='f4a206044b332ad00b10072b0dc7a70b359fa365ec786f92ab757ef4ae588474')
     version('0.11.0', sha256='cdf8e1324a3fbbd1efd5618dcd37cfc497b1997923bd710b598472c1d846674a')
     version('0.10.2', sha256='2d4218b0826daeea880e155227060029ec38a00238ceb5f097138d9467c6399b')
diff --git a/packages/py-nested-dict/package.py b/packages/py-nested-dict/package.py
new file mode 100644
index 0000000000000000000000000000000000000000..9442c3b12597f0a4810e069d2128a17d7acbd9b2
--- /dev/null
+++ b/packages/py-nested-dict/package.py
@@ -0,0 +1,26 @@
+# Copyright 2013-2022 Lawrence Livermore National Security, LLC and other
+# Spack Project Developers. See the top-level COPYRIGHT file for details.
+#
+# SPDX-License-Identifier: (Apache-2.0 OR MIT)
+
+from spack import *
+
+
+class PyNestedDict(PythonPackage):
+    """FIXME: Put a proper description of your package here."""
+
+    homepage = "http://nested-dict.readthedocs.org"
+    pypi     = "nested_dict/nested_dict-1.61.tar.gz"
+    git      = "https://github.com/bunbun/nested-dict"
+
+    # FIXME: Add a list of GitHub accounts to
+    # notify when the package is updated.
+    # maintainers = ['terhorstd', 'bunbun']
+
+    version('1.61', sha256='de0fb5bac82ba7bcc23736f09373f18628ea57f92bbaa13480d23f261c41e771')
+
+    # FIXME: Add a build backend, usually defined in pyproject.toml. If no such file
+    # exists, use setuptools.
+    # depends_on('py-setuptools', type='build')
+    # depends_on('py-flit-core', type='build')
+    # depends_on('py-poetry-core', type='build')
diff --git a/packages/py-nestml/package.py b/packages/py-nestml/package.py
new file mode 100644
index 0000000000000000000000000000000000000000..020fbcd7c2101e24023ba1dc5b3080d3e386f9f6
--- /dev/null
+++ b/packages/py-nestml/package.py
@@ -0,0 +1,29 @@
+from spack import *
+
+
+class PyNestml(PythonPackage):
+    """A Python package for writing and generating code for (spiking) neuron
+    models and synaptic plasticity rules. Supports C++ code generation for
+    NEST Simulator as well as other target platforms.
+    """
+
+    homepage = 'https://nestml.readthedocs.org/'
+    url      = 'https://pypi.org/packages/py3/N/NESTML/NESTML-5.2.0-py3-none-any.whl'
+    git      = 'https://github.com/nest/nestml/'
+
+    maintainers = ['clinssen', 'pnbabu', 'jougs']
+
+    version('5.2.0', sha256='acb703bf9c7f70304bd5d547dccd6a6a219f8acb298a6412df779b808241eb14', expand=False)
+
+    depends_on('python@3.8:', type=('build', 'run'))
+    depends_on('py-pip', type='build')
+    depends_on('py-numpy', type=('build', 'run'))
+    depends_on('py-scipy', type=('build', 'run'))
+    depends_on('py-sympy', type=('build', 'run'))
+    depends_on('py-antlr4-python3-runtime', type=('build', 'run'))
+    depends_on('py-setuptools', type=('build', 'run'))
+    depends_on('py-jinja2', type=('build', 'run'))
+    depends_on('py-astropy', type=('build', 'run'))
+    depends_on('py-odetoolbox', type=('build', 'run'))
+    depends_on('nest', type=('build', 'run'))
+    depends_on('py-pytest', type='test')
diff --git a/packages/py-odetoolbox/package.py b/packages/py-odetoolbox/package.py
new file mode 100644
index 0000000000000000000000000000000000000000..0f8265d12e9b20c65d3842d23aac1689bde53976
--- /dev/null
+++ b/packages/py-odetoolbox/package.py
@@ -0,0 +1,26 @@
+from spack import *
+
+
+class PyOdetoolbox(PythonPackage):
+    """A Python package for the automatic selection and generation of
+    integration schemes for systems of ordinary differential equations
+    """
+
+    homepage = 'https://ode-toolbox.readthedocs.io'
+    url      = 'https://pypi.org/packages/py3/o/odetoolbox/odetoolbox-2.5-py3-none-any.whl'
+    git      = 'https://github.com/nest/ode-toolbox'
+
+    maintainers = ['clinssen']
+
+    version('2.5', sha256='947bbb289830dde60066106f5f628de2598a71129eafff8ec86317a0b5e8960e', expand=False)
+
+    depends_on('python@3.8:', type=('build', 'run'))
+    depends_on('py-pip', type='build')
+    depends_on('py-sympy@:1.4,1.7,1.8,1.9,1.11:', type=('build', 'run'))
+    depends_on('py-scipy', type=('build', 'run'))
+    depends_on('py-numpy@1.8.2:', type=('build', 'run'))
+    depends_on('py-cython', type=('build', 'run'))
+    depends_on('py-graphviz', type=('build', 'run'))
+    depends_on('py-matplotlib', type=('build', 'run'))
+    depends_on('py-setuptools', type=('build', 'run'))
+    depends_on('py-pytest', type='test')
diff --git a/packages/py-pdb2pqr/package.py b/packages/py-pdb2pqr/package.py
index d43ebaaa969019e2a5fa269d8007c6ee0e7ef57b..e219a78510ecffa8a7aa0e43025471b95b62c1e6 100644
--- a/packages/py-pdb2pqr/package.py
+++ b/packages/py-pdb2pqr/package.py
@@ -23,10 +23,22 @@ class PyPdb2pqr(PythonPackage):
     maintainers = ['richtesn', 'thielblz']
 
     version('3.5.2', sha256='9d145ff3797a563ce818f9d2488413ac339f66c58230670c2455b2572cccd957')
-    
+    version('3.5.1', sha256='50272a850e876ea76d253e21eb01041ac8a01f7f17d73d0da95b26a6204c2564')
+    version('3.5.0', sha256='560d992b62e009a6e752c8b7db3b53243ff08945eb76eb9460e43887433a55b1')
+    version('3.4.1', sha256='9e8cabd984f8e31f010bda0a3e81c87ad93f403d1fd36c787627e5134f7542ba')
+
     depends_on('python@3.8:', type=('build','run'))
     depends_on('py-docutils@:0.18', type=('build','run'))
     depends_on('py-mmcif-pdbx@1.1.2:', type=('build','run'))
     depends_on('py-numpy', type=('build','run'))
     depends_on('py-propka@3.2:', type=('build','run'))
     depends_on('py-requests', type=('build','run'))
+    depends_on('py-pytest', type=('test'))
+    depends_on('py-pandas@1.0:', type=('test'))
+    depends_on('py-testfixtures', type=('test'))
+
+    @run_after('install')
+    @on_package_attributes(run_tests=True)
+    def install_test(self):
+        pytest = which('pytest')
+        pytest()
diff --git a/packages/py-pebble/package.py b/packages/py-pebble/package.py
index ab9ef132377410fe695ee9f603df530860e67054..5e17a06cec5be189527ab05b47a7572df3df0db3 100644
--- a/packages/py-pebble/package.py
+++ b/packages/py-pebble/package.py
@@ -1,21 +1,23 @@
-# Copyright 2013-2020 Lawrence Livermore National Security, LLC and other
+# (this package was adapted from the spack develop upstream as a dependency of py-bluepyopt)
+
+# Copyright 2013-2023 Lawrence Livermore National Security, LLC and other
 # Spack Project Developers. See the top-level COPYRIGHT file for details.
 #
 # SPDX-License-Identifier: (Apache-2.0 OR MIT)
 
+
 from spack import *
 
 
 class PyPebble(PythonPackage):
-    """Python API to manage threads and processes within an application."""
+    """Threading and multiprocessing eye-candy."""
 
     homepage = "https://github.com/noxdafox/pebble"
-    pypi = "pebble/Pebble-4.5.0.tar.gz"
-    git = "https://github.com/noxdafox/pebble.git"
+    pypi = "Pebble/Pebble-5.0.3.tar.gz"
 
-    version('4.5.0', sha256='2de3cd11aa068e0c4a4abbaf8d4ecfdac409d8bfb78a4c211a01f6a4fb17a35f')
-    version('4.4.1', sha256='7c4d68a3479140cba74d7454d8190e2cb1a93213b44b5befe3c53c201beb8317')
-    version('4.3.10', sha256='c39a7bf99af6525fcf0783a8859fb10a4f20f4f988ddb66fd6fa7588f9c91731')
+    maintainers = ["hjorth", "elmath"]
+    
+    version("5.0.3", sha256="bdcfd9ea7e0aedb895b204177c19e6d6543d9962f4e3402ebab2175004863da8")
 
-    depends_on('py-setuptools', type=('build', 'run'))
-    depends_on('py-futures', type='run', when='^python@:2.9.9')
+    depends_on("python@3.6:",   type=("build", "run"))
+    depends_on("py-setuptools", type=("build"))
diff --git a/packages/py-pyswarms/package.py b/packages/py-pyswarms/package.py
index eb83ce579fc31b6af20764bcafaa74ee90e6ba10..15313932920d39578d0584b2bf8ed57adbe919cb 100644
--- a/packages/py-pyswarms/package.py
+++ b/packages/py-pyswarms/package.py
@@ -6,12 +6,14 @@ class PyPyswarms(PythonPackage):
     homepage = "https://github.com/ljvmiranda921/pyswarms"
     pypi = "pyswarms/pyswarms-1.3.0.tar.gz"
 
-    version('1.3.0', sha256='1204aa9c332c662113e3c37d1b109906f4a0859b29ded80c1582dc66387ce34b') 
+    maintainers = ["hjorth", "elmath"]
 
-    depends_on('py-scipy',	type=('build', 'run'))
-    depends_on('py-numpy',	type=('build', 'run'))
-    depends_on('py-matplotlib@1.3.1:',	type=('build', 'run'))
-    depends_on('py-attrs',	type=('build', 'run'))
-    depends_on('py-tqdm',	type=('build', 'run'))
-    depends_on('py-future',	type=('build', 'run'))
-    depends_on('py-pyyaml',	type=('build', 'run'))
+    version("1.3.0", sha256="1204aa9c332c662113e3c37d1b109906f4a0859b29ded80c1582dc66387ce34b") 
+
+    depends_on("py-scipy",              type=("build", "run"))
+    depends_on("py-numpy",              type=("build", "run"))
+    depends_on("py-matplotlib@1.3.1:",  type=("build", "run"))
+    depends_on("py-attrs",              type=("build", "run"))
+    depends_on("py-tqdm",               type=("build", "run"))
+    depends_on("py-future",             type=("build", "run"))
+    depends_on("py-pyyaml",             type=("build", "run"))
diff --git a/packages/py-quantities/package.py b/packages/py-quantities/package.py
index 699a20e1cf2a2a590f9e6f561f6f278476b4be85..2e919c47fcdb3ca9a6312f5da6cef58b6930b942 100644
--- a/packages/py-quantities/package.py
+++ b/packages/py-quantities/package.py
@@ -14,9 +14,9 @@ class PyQuantities(PythonPackage):
     maintainers = ['apdavison']
 
     # temporary fix to avoid building with py-setuptools@:61, that doesn't support PEP 621
-    version('0.14.0', sha256='abb993ac16817c5303da3bcf866bcfc19a0d797f4d85c06adebb8b6fe2bcb67a',
-            url= "https://pypi.io/packages/py3/q/quantities/quantities-0.14.0-py3-none-any.whl", expand=False)
-    # version('0.14.0', sha256='b5cbe363e27dc6d16abeba9fab7a5c98775d81b7d7f16cc691ba00041e02e1d0')
+    version('0.14.1', sha256='b2edf67b8c2a28aa3bbe096f9fc3ec3ab83fc3192997373641cddab32bea2f72',
+            url= "https://pypi.io/packages/py3/q/quantities/quantities-0.14.1-py3-none-any.whl", expand=False)
+    # version('0.14.1', sha256='efeafffc0c0364f891a9327239cd12496bccb55cd037a6d1bf44de706f722877')
     version('0.13.0', sha256='0fde20115410de21cefa786f3aeae69c1b51bb19ee492190324c1da705e61a81')
     version('0.12.5', sha256='67546963cb2a519b1a4aa43d132ef754360268e5d551b43dd1716903d99812f0')
     version('0.12.4', sha256='a33d636d1870c9e1127631185d89b0105a49f827d6aacd44ad9d8f151f331d8b')
diff --git a/packages/py-snudda/package.py b/packages/py-snudda/package.py
index 333e28a3a41817154d7d2f0f6b510810af4beea5..a56336c083998f7547ffbdd5a0a79f39a54443bd 100644
--- a/packages/py-snudda/package.py
+++ b/packages/py-snudda/package.py
@@ -1,34 +1,42 @@
 from spack import *
 
-class PySnudda(Package):
-    homepage = 'https://pypi.org/project/snudda/'
-    url      = 'https://files.pythonhosted.org/packages/py3/s/snudda/snudda-1.2.9-py3-none-any.whl'
-    list_url = 'https://pypi.org/simple/snudda/'
 
-    maintainers = ['hjorth','akarmas']
-    
-    version('1.3.2', '2306ec50acead5fd4f988ec373f19718', expand=False)
+class PySnudda(PythonPackage):
+    """Snudda creates the connectivity for realistic networks of simulated neurons in silico in a bottom up fashion that can then be simulated using the NEURON software."""
+
+    homepage = "https://pypi.org/project/snudda/"
+    pypi     = "snudda/snudda-1.4.0.tar.gz"
+
+    maintainers = ["hjorth", "elmath"]
     
-    depends_on('python@3.8:', type=('build','run'))
-    depends_on('py-pip', type='build')
-    depends_on('unzip', type='build')
-    depends_on('py-bluepyopt', type=('build','run')) # got this from BlueBrainProject https://github.com/BlueBrain/spack/blob/develop/bluebrain/repo-bluebrain/packages/py-bluepyopt/package.py
-    depends_on('py-h5py', type=('build','run'))
-    depends_on('py-ipyparallel', type=('build','run'))
-    depends_on('py-matplotlib', type=('build','run'))
-    depends_on('py-mpi4py', type=('build','run'))
-    depends_on('py-numpy', type=('build','run'))
-    depends_on('py-scipy', type=('build','run'))
-    depends_on('py-libsonata', type=('build','run')) # got it from from BlueBrainProject https://github.com/BlueBrain/spack/blob/develop/bluebrain/repo-bluebrain/packages/py-libsonata/package.py
-    depends_on('py-pyzmq', type=('build','run'))
-    depends_on('py-numexpr', type=('build','run'))
-    depends_on('neuron', type=('build','run'))
-    depends_on('py-pyswarms', type=('build','run'))
-    depends_on('py-setuptools', type=('build'))
-    depends_on('py-psutil', type=('build','run'))
-    depends_on('py-cython', type=('build','run'))
-    depends_on('py-numba', type=('build','run'))
+    version("1.4.0", "55f9b398b01b34bf3cec28c8a3aebc78")
+    version("1.3.2", "2306ec50acead5fd4f988ec373f19718", url="https://files.pythonhosted.org/packages/py3/s/snudda/snudda-1.2.9-py3-none-any.whl", expand=False)
+
+    depends_on("unzip",                 type=("build"))
+    depends_on("py-setuptools",         type=("build"))
+    depends_on("py-bluepyopt@1.11.7:",  type=("build","run"))
+    depends_on("py-h5py@3.2.1:",        type=("build","run"))
+    depends_on("py-ipyparallel@6.3.0:", type=("build","run"))
+    depends_on("py-matplotlib@3.3.4:",  type=("build","run"))
+    depends_on("py-mpi4py@3.0.3:",      type=("build","run"))
+    depends_on("py-numpy@1.20.2:",      type=("build","run"))
+    depends_on("py-scipy@1.6.3:",       type=("build","run"))
+    depends_on("py-libsonata@0.0.2:",   type=("build","run"))
+    depends_on("py-pyzmq@22.0.3:",      type=("build","run"))
+    depends_on("py-numexpr@2.7.3:",     type=("build","run"))
+    depends_on("neuron@7.8.2:",         type=("build","run"))
+    depends_on("py-pyswarms@1.3.0:",    type=("build","run"))
+    depends_on("py-psutil",             type=("build","run"))
+    depends_on("py-cython",             type=("build","run"))
+    depends_on("py-numba@0.53.1:",      type=("build","run"))
+
+    # snudda tarballs in pypi do not include the tests/ dir: just use default spack tests for now
+    # @run_after('install')
+    # @on_package_attributes(run_tests=True)
+    # def install_test(self):
+    #     python('-m', 'unittest', 'discover', '-v', '-s' './tests')
 
-    def install(self, spec, prefix):
-        pip = which('pip')
-        pip('install', self.stage.archive_file, '--prefix={0}'.format(prefix))
+    # blender is for now an optional dependency: leave out of import_modules to avoid errors in tests
+    import_modules = ['snudda', 'snudda.utils', 'snudda.neurons', 'snudda.plotting', 'snudda.analyse', 'snudda.simulate', 'snudda.place', 'snudda.prune', 'snudda.neuromodulation', 'snudda.input', 'snudda.init', 'snudda.detect']
+    # TODO: for Spack>v0.19.0, skip_modules can be used instead
+    # skip_modules = ['snudda.plotting.Blender', 'snudda.plotting.Blender.io_mesh_swc', 'snudda.plotting.Blender.visualisation']
diff --git a/packages/py-viziphant/package.py b/packages/py-viziphant/package.py
index 9853eb54d5d62325cad3b8f074d7aca604cc12d9..8d75c691fe6efcbde6c4dc47fafc8e4d92815f50 100644
--- a/packages/py-viziphant/package.py
+++ b/packages/py-viziphant/package.py
@@ -15,6 +15,7 @@ class PyViziphant(PythonPackage):
     # notify when the package is updated.
     maintainers = ['Moritz-Alexander-Kern']
 
+    version('0.3.0', sha256='40d2970b8384d8e1c5d324caf1b1188391d7e651375ce08dd518bcf4ac6477f2')
     version('0.2.0', sha256='044b5c92de169dfafd9665efe2c310e917d2c21980bcc9f560d5c727161f9bd8')
     version('0.1.0', sha256='8fd56ec8633f799396dc33fbace95d2553bedb17f680a8c0e97f43b3a629bf6c')
 
@@ -27,3 +28,15 @@ class PyViziphant(PythonPackage):
     depends_on('py-six@1.10.0:', type=('build', 'run'))
     depends_on('py-matplotlib@3.3.2:', type=('build', 'run'))
     depends_on('py-seaborn@0.9.0:', type=('build', 'run'))
+
+    depends_on("py-pytest", type=("test"), when="@0.3.0:")
+    depends_on("py-elephant@0.9.0:+extras", type=("test"), when="@0.3.0:")
+
+    @run_after('install')
+    @on_package_attributes(run_tests=True)
+    def install_test(self):
+        # run tests
+        # TODO: replace if clause with @run_after('install', when='@0.3.0:') after update to Spack v0.19
+        if self.spec.version >= Version('0.3.0'):
+            pytest = which('pytest')
+            pytest()
diff --git a/packages/r-dynutils/package.py b/packages/r-dynutils/package.py
new file mode 100644
index 0000000000000000000000000000000000000000..fa917b9b410636a5933ecafe02753928c5db88a1
--- /dev/null
+++ b/packages/r-dynutils/package.py
@@ -0,0 +1,31 @@
+# Copyright 2013-2023 Lawrence Livermore National Security, LLC and other
+# Spack Project Developers. See the top-level COPYRIGHT file for details.
+#
+# SPDX-License-Identifier: (Apache-2.0 OR MIT)
+
+from spack.package import *
+
+
+class RDynutils(RPackage):
+    """Provides common functionality for the 'dynverse' packages. 'dynverse' is created to support the development, execution, and benchmarking of trajectory inference methods. For more information, check out <https://dynverse.org>."""
+
+    homepage = "https://cran.r-project.org/package=dynutils"
+    cran = "dynutils"
+
+    version("1.0.11", sha256="09ce9efda019e5c345ad6a7131f41f7fe9c8458c1b105191d8618416ea125619")
+
+    depends_on("r-assertthat")
+    depends_on("r-crayon")
+    depends_on("r-desc")
+    depends_on("r-dplyr")
+    depends_on("r-magrittr")
+    depends_on("r-matrix")
+    depends_on("r-proxyc")
+    depends_on("r-purrr")
+    depends_on("r-rcpp")
+    depends_on("r-remotes")
+    depends_on("r-stringr")
+    depends_on("r-tibble")
+
+
+
diff --git a/packages/r-gillespiessa2/package.py b/packages/r-gillespiessa2/package.py
new file mode 100644
index 0000000000000000000000000000000000000000..92b94184289ec4f55d9d88e1f927a65435c7e130
--- /dev/null
+++ b/packages/r-gillespiessa2/package.py
@@ -0,0 +1,28 @@
+# Copyright 2013-2023 Lawrence Livermore National Security, LLC and other
+# Spack Project Developers. See the top-level COPYRIGHT file for details.
+#
+# SPDX-License-Identifier: (Apache-2.0 OR MIT)
+
+from spack.package import *
+
+
+class RGillespiessa2(RPackage):
+    """A fast, scalable, and versatile framework for simulating large systems with Gillespie's Stochastic Simulation Algorithm ('SSA'). This package is the spiritual successor to the 'GillespieSSA' package originally written by Mario Pineda-Krch. Benefits of this package include major speed improvements (>100x), easier to understand documentation, and many unit tests that try to ensure the package works as intended. Cannoodt and Saelens et al. (2021) <doi:10.1038/s41467-021-24152-2>."""
+
+    homepage = "https://cran.r-project.org/package=GillespieSSA2"
+    cran = "GillespieSSA2"
+
+    version("0.3.0", sha256="206497ae7be8ff88a5edafe81b0295eb4b14109c546878ace16a7396a0035f72")
+
+    depends_on("r-assertthat")
+    depends_on("r-dplyr")
+    depends_on("r-dynutils")
+    depends_on("r-matrix")
+    depends_on("r-purrr")
+    depends_on("r-rcpp")
+    depends_on("r-rcppxptrutils")
+    depends_on("r-readr")
+    depends_on("r-rlang")
+    depends_on("r-stringr")
+    depends_on("r-tidyr")
+
diff --git a/packages/r-irkernel/package.py b/packages/r-irkernel/package.py
new file mode 100644
index 0000000000000000000000000000000000000000..d6dd8db386548c6464be1f016487b9f07246969b
--- /dev/null
+++ b/packages/r-irkernel/package.py
@@ -0,0 +1,39 @@
+# this package was adapted from Spack upstream v0.18.1, to change the dependency on py-jupyter to py-jupyter-client
+
+# Copyright 2013-2022 Lawrence Livermore National Security, LLC and other
+# Spack Project Developers. See the top-level COPYRIGHT file for details.
+#
+# SPDX-License-Identifier: (Apache-2.0 OR MIT)
+
+
+from spack import *
+
+
+class RIrkernel(RPackage):
+    """Native R Kernel for the 'Jupyter Notebook'.
+    The R kernel for the 'Jupyter' environment executes R code which the
+    front-end ('Jupyter Notebook' or other front-ends) submits to the kernel
+    via the network."""
+
+    cran = "IRkernel"
+
+    version('1.3', sha256='5a7fcbfd978dfb3cca6702a68a21c147551995fc400084ae8382ffcbbdae1903')
+    version('1.2', sha256='5fb4dbdb741d05043120a8be0eb73f054b607d9854f314bd79cfec08d219ff91')
+    version('0.7',
+            git="https://github.com/IRkernel/IRkernel.git",
+            commit='9cdd284e03eb42d03fab18544b81f486852d5fe0',
+            deprecated=True)
+
+    depends_on('r@3.2.0:', type=('build', 'run'))
+    depends_on('r-repr@0.4.99:', type=('build', 'run'))
+    depends_on('r-evaluate@0.10:', type=('build', 'run'))
+    depends_on('r-irdisplay@0.3.0.9999:', type=('build', 'run'))
+    depends_on('r-pbdzmq@0.2-1:', type=('build', 'run'))
+    depends_on('r-crayon', type=('build', 'run'))
+    depends_on('r-jsonlite@0.9.6:', type=('build', 'run'))
+    depends_on('r-uuid', type=('build', 'run'))
+    depends_on('r-digest', type=('build', 'run'))
+    depends_on('py-jupyter-client', type='run')
+
+    depends_on('r-evaluate@0.5.4:', type=('build', 'run'), when='@0.7')
+    depends_on('r-devtools', type=('build', 'run'), when='@0.7')
diff --git a/packages/r-proxyc/package.py b/packages/r-proxyc/package.py
new file mode 100644
index 0000000000000000000000000000000000000000..a0eb6ed1793d9ac149d2a64446fab74e2f337ab2
--- /dev/null
+++ b/packages/r-proxyc/package.py
@@ -0,0 +1,20 @@
+# Copyright 2013-2023 Lawrence Livermore National Security, LLC and other
+# Spack Project Developers. See the top-level COPYRIGHT file for details.
+#
+# SPDX-License-Identifier: (Apache-2.0 OR MIT)
+
+from spack.package import *
+
+
+class RProxyc(RPackage):
+    """Computes proximity between rows or columns of large matrices efficiently in C++. Functions are optimised for large sparse matrices using the Armadillo and Intel TBB libraries. Among several built-in similarity/distance measures, computation of correlation, cosine similarity and Euclidean distance is particularly fast."""
+
+    homepage = "https://cran.r-project.org/package=proxyC"
+    cran = "proxyC"
+
+    version("0.3.3", sha256="3e25da94633da0b5c6cdac03f5b6d8205d078f60c5a09073e90a1b6f0930e302")
+
+    depends_on("r-rcpp")
+    depends_on("r-rcppparallel")
+    depends_on("r-rcpparmadillo")
+    depends_on("r-matrix")
diff --git a/packages/r-rcppxptrutils/package.py b/packages/r-rcppxptrutils/package.py
new file mode 100644
index 0000000000000000000000000000000000000000..0c74a9f8bcb94bc49efa73674c5a1ec859b8a827
--- /dev/null
+++ b/packages/r-rcppxptrutils/package.py
@@ -0,0 +1,17 @@
+# Copyright 2013-2023 Lawrence Livermore National Security, LLC and other
+# Spack Project Developers. See the top-level COPYRIGHT file for details.
+#
+# SPDX-License-Identifier: (Apache-2.0 OR MIT)
+
+from spack.package import *
+
+
+class RRcppxptrutils(RPackage):
+    """Provides the means to compile user-supplied C++ functions with 'Rcpp' and retrieve an 'XPtr' that can be passed to other C++ components."""
+
+    homepage = "https://cran.r-project.org/package=RcppXPtrUtils"
+    cran = "RcppXPtrUtils"
+
+    version("0.1.2", sha256="34d0cab1891c95453c357cf93ab97b6ea42ef98cdc4809c9abfafd469c3da542")
+
+    depends_on("r-rcpp")
diff --git a/packages/r-rgsl/package.py b/packages/r-rgsl/package.py
new file mode 100644
index 0000000000000000000000000000000000000000..264ecfe9ae461de88a6c2eae926be24d27f637e1
--- /dev/null
+++ b/packages/r-rgsl/package.py
@@ -0,0 +1,20 @@
+# Copyright 2013-2022 Lawrence Livermore National Security, LLC and other
+# Spack Project Developers. See the top-level COPYRIGHT file for details.
+#
+# SPDX-License-Identifier: (Apache-2.0 OR MIT)
+
+
+from spack.package import *
+
+
+class RRgsl(RPackage):
+    """This is an interface package to solve ODE systems using gsl_odeiv2 within R. The system to solve has to be defined using C code: a shared library, dynamically loaded by this package when solving."""
+
+    homepage = "https://github.com/icpm-kth/rgsl"
+    url = "https://github.com/icpm-kth/rgsl/archive/refs/tags/v0.1.tar.gz"
+
+    version("0.1", sha256="dd6a14dda8731f4cf32149c8a9842e4e2ba424c8404f4d6839108153b20e4c3e")
+
+    # GNU Scientific Library: https://www.gnu.org/software/gsl
+    # spack: https://spack.readthedocs.io/en/latest/package_list.html#gsl
+    depends_on("gsl")
diff --git a/packages/r-sbtabvfgen/package.py b/packages/r-sbtabvfgen/package.py
new file mode 100644
index 0000000000000000000000000000000000000000..9741f22666c2af67aaaa053eb4ac6c79f1686b4b
--- /dev/null
+++ b/packages/r-sbtabvfgen/package.py
@@ -0,0 +1,20 @@
+# Copyright 2013-2023 Lawrence Livermore National Security, LLC and other
+# Spack Project Developers. See the top-level COPYRIGHT file for details.
+#
+# SPDX-License-Identifier: (Apache-2.0 OR MIT)
+
+
+from spack.package import *
+
+
+class RSbtabvfgen(RPackage):
+    """This package converts SBtab files (with one table per tsv file) into three other formats: vfgen, sbml, Neuron's MOD. It also saves its findings in a free form, as text files. SBtab files typically contain a reaction network model (systems biology). The output is more useful for simulations."""
+
+    homepage = "https://github.com/icpm-kth/SBtabVFGEN"
+    url = "https://github.com/icpm-kth/SBtabVFGEN/archive/refs/tags/v0.1.tar.gz"
+
+    version("0.1", sha256="499c51abee75ca5961a41608c9fb09ad523e12aae276f5f67bffa313244cff28")
+
+    depends_on("r-pracma")
+    depends_on("r-hdf5r")
+    depends_on("sbml+r")
diff --git a/packages/r-uqsa/package.py b/packages/r-uqsa/package.py
new file mode 100644
index 0000000000000000000000000000000000000000..4b4b34fd06176066292109b75de90b6e61b3912d
--- /dev/null
+++ b/packages/r-uqsa/package.py
@@ -0,0 +1,30 @@
+# Copyright 2013-2023 Lawrence Livermore National Security, LLC and other
+# Spack Project Developers. See the top-level COPYRIGHT file for details.
+#
+# SPDX-License-Identifier: (Apache-2.0 OR MIT)
+
+
+from spack.package import *
+
+
+class RUqsa(RPackage):
+    """This package will solve an initial value problem (given an ordinary
+    differential equation) for a list of simulation experiments. The
+    simulations will be compared to data, repeatedly.  The package can
+    sample the parameters of the model via ABC (approximate Bayesian
+    computation) and by doing so quantify the uncertainty that remains
+    within the model even after considering the data. Experiments are
+    evaluated in a sequence, intermediate probability densities are
+    modeled using the VineCopua package."""
+
+    # FIXME: Add a proper url for your package's homepage here.
+    homepage = "https://github.com/icpm-kth/uqsa"
+    url = "https://github.com/icpm-kth/uqsa/archive/refs/tags/v2.2.tar.gz"
+
+    version("2.2", sha256="df15d20c0cd466083181ec8f37cd331f409dcd23838553cd46a7a7305bdcfc7f")
+
+    depends_on("r-vinecopula")
+    depends_on("r-mass")
+    depends_on("r-r-utils")
+    depends_on("r-ks")
+    depends_on("r-gillespiessa2")
diff --git a/packages/r-vinecopula/package.py b/packages/r-vinecopula/package.py
new file mode 100644
index 0000000000000000000000000000000000000000..560af0ab057bbe3e35ff35e93cd95bc6ee676f95
--- /dev/null
+++ b/packages/r-vinecopula/package.py
@@ -0,0 +1,27 @@
+# Copyright 2013-2023 Lawrence Livermore National Security, LLC and other
+# Spack Project Developers. See the top-level COPYRIGHT file for details.
+#
+# SPDX-License-Identifier: (Apache-2.0 OR MIT)
+
+from spack.package import *
+
+
+class RVinecopula(RPackage):
+    """Provides tools for the statistical analysis of regular vine copula 
+    models, see Aas et al. (2009) <doi:10.1016/j.insmatheco.2007.02.001> and 
+    Dissman et al. (2013) <doi:10.1016/j.csda.2012.08.010>.
+    The package includes tools for parameter estimation, model selection,
+    simulation, goodness-of-fit tests, and visualization. Tools for estimation,
+    selection and exploratory data analysis of bivariate copula models are also
+    provided."""
+
+    homepage = "https://cran.r-project.org/package=VineCopula"
+    url = "https://github.com/tnagler/VineCopula/archive/refs/tags/v2.4.5.tar.gz"
+
+    version("2.4.5", sha256="2255a2a0f2644e447f33c7fa3562cb1ad109aa7809ea250fe82b67b35cc2d23d")
+
+    depends_on("r-mass")
+    depends_on("r-mvtnorm")
+    depends_on("r-r-methodss3")
+    depends_on("r-adgoftest")
+    depends_on("r-lattice")
diff --git a/packages/sbml/package.py b/packages/sbml/package.py
new file mode 100644
index 0000000000000000000000000000000000000000..33cec4946b2eec356418599ef6c9b7b7e1913c95
--- /dev/null
+++ b/packages/sbml/package.py
@@ -0,0 +1,136 @@
+# Copyright 2013-2022 Lawrence Livermore National Security, LLC and other
+# Spack Project Developers. See the top-level COPYRIGHT file for details.
+#
+# SPDX-License-Identifier: (Apache-2.0 OR MIT)
+
+from spack import *
+
+
+class Sbml(CMakePackage):
+    """Library for the Systems Biology Markup Language"""
+
+    homepage = "https://sbml.org"
+    maintainers = ['rblake-llnl']
+
+    version('5.19.0', sha256='a7f0e18be78ff0e064e4cdb1cd86634d08bc33be5250db4a1878bd81eeb8b547')
+    version('5.18.0', sha256='6c01be2306ec0c9656b59cb082eb7b90176c39506dd0f912b02e08298a553360')
+    version('5.17.0', sha256='189216e1472777e4464b791c506b79267d07a5454cb23ac991452711f8e0ed3a')
+    version('5.16.0', sha256='c6855481434dd2a667fef73e1ff2feade509aa2f3a76d4d06e29022975ce1496')
+    version('5.15.0', sha256='c779c2a8a97c5480fe044028099d928a327261fb68cf08657ec8d4f3b3fc0a21')
+    version('5.13.0', sha256='e58430edb1b454d7414bcf1be0549bf6860a6d19d73232eb58211559485c2c05')
+    version('5.12.0', sha256='c637494b19269947fc90ebe479b624d36f80d1cb5569e45cd76ddde81dd28ae4')
+    version('5.11.4', sha256='6429188b689b331b0b8f2c8b55b3f2339196ccd4c93191648fa767e1d02152a3')
+    version('5.11.0', sha256='b21931ca7461494915c617b30d4a9f2cafe831d6ce74989b3e5874e6e3c3f72b')
+    version('5.10.2', sha256='83f32a143cf657672b1050f5f79d3591c418fc59570d180fb1f39b103f4e5286')
+    version('5.10.0', sha256='2cd8b37018ce8b1df869c8c182803addbce6d451512ae25a7f527b49981f0966')
+
+    def url_for_version(self, version):
+        url = "https://downloads.sourceforge.net/project/sbml/libsbml/{0}/stable/libSBML-{1}-core-plus-packages-src.tar.gz".format(version, version)
+        return url
+
+    variant('python', default=False,
+            description='Build with python support')
+    depends_on('python', when="+python")
+
+    variant('perl', default=False,
+            description='Build with perl support')
+    depends_on('perl', when="+perl")
+
+    variant('ruby', default=False,
+            description='Build with ruby support')
+    depends_on('ruby', when="+ruby")
+
+    variant('r', default=False,
+            description='Build with R support')
+    depends_on('r', when="+r")
+
+    variant('octave', default=False,
+            description='Build with octave support')
+    depends_on('octave', when="+octave")
+
+    variant('matlab', default=False,
+            description='Build with matlab support')
+    depends_on('matlab', when="+matlab")
+
+    variant('java', default=False,
+            description='Build with java support')
+    depends_on('java', when="+java")
+
+    variant('mono', default=False,
+            description='Build with mono support')
+    depends_on('mono', when="+mono")
+
+    variant('cpp', default=False,
+            description="All c++ includes should be under a namespace")
+
+    depends_on('swig@2:', type='build')
+    depends_on('cmake', type='build')
+    depends_on('zlib')
+    depends_on('bzip2')
+    depends_on('libxml2')
+
+    def cmake_args(self):
+        spec = self.spec
+        args = [
+            "-DENABLE_COMP:BOOL=ON",
+            "-DENABLE_FBC:BOOL=ON",
+            "-DENABLE_GROUPS:BOOL=ON",
+            "-DENABLE_LAYOUT:BOOL=ON",
+            "-DENABLE_QUAL:BOOL=ON",
+            "-DENABLE_RENDER:BOOL=ON",
+            "-DWITH_BZIP2:BOOL=ON",
+            "-DWITH_CHECK:BOOL=OFF",
+            "-DWITH_DOXYGEN:BOOL=OFF",
+            "-DWITH_EXAMPLES:BOOL=OFF",
+            "-DWITH_EXPAT:BOOL=OFF",
+            "-DWITH_LIBXML:BOOL=ON",
+            "-DWITH_SWIG:BOOL=ON",
+            "-DWITH_WALL:BOOL=ON",
+            "-DWITH_XERCES:BOOL=OFF",
+            "-DWITH_ZLIB:BOOL=ON",
+        ]
+        args.append(self.define_from_variant('WITH_CPP_NAMESPACE', 'cpp'))
+        if '+python' in spec:
+            args.extend([
+                "-DWITH_PYTHON:BOOL=ON",
+                "-DWITH_PYTHON_INCLUDE:PATH=%s" % spec['python'].prefix,
+            ])
+        else:
+            args.append('-DWITH_PYTHON:BOOL=OFF')
+
+        args.append(self.define_from_variant('WITH_CSHARP', 'mono'))
+
+        if '+java' in spec:
+            args.extend([
+                "-DWITH_JAVA:BOOL=ON",
+                "-DJDK_PATH:STRING=%s" % spec['java'].prefix,
+                "-DJAVA_INCLUDE_PATH:STRING=%s" % spec['java'].prefix,
+            ])
+        else:
+            args.append('-DWITH_JAVA:BOOL=OFF')
+
+        if '+matlab' in spec:
+            args.extend([
+                "-DWITH_MATLAB:BOOL=ON",
+                "-DMATLAB_ROOT_PATH:PATH=%s" % spec['matlab'].prefix,
+                "-DWITH_MATLAB_MEX:BOOL=ON",
+            ])
+        else:
+            args.append('-DWITH_MATLAB:BOOL=OFF')
+
+        # fix issue with finding existing R libs/headers
+        if '+r' in spec:
+            args.extend([
+                "-DR_LIB=%s" % spec['r'].prefix,
+                "-DR_INCLUDE_DIRS=%s" % spec['r'].prefix.rlib.R.include
+            ])
+
+        args.append(self.define_from_variant('WITH_OCTAVE', 'octave'))
+        args.append(self.define_from_variant('WITH_PERL', 'perl'))
+        args.append(self.define_from_variant('WITH_R', 'r'))
+        args.append(self.define_from_variant('WITH_RUBY', 'ruby'))
+
+        # fix issue with finding existing libxml2
+        args.append('-DLIBXML_INCLUDE_DIR=%s' % spec['libxml2'].prefix.include.libxml2)
+
+        return args
diff --git a/packages/sda/package.py b/packages/sda/package.py
index b5c5c606fc0250688ef5e7d0e9da726f450a6233..8ff8aa207313200c866a4375ee7e3f6ff761d415 100644
--- a/packages/sda/package.py
+++ b/packages/sda/package.py
@@ -1,4 +1,4 @@
-# Copyright 2013-2022 Lawrence Livermore National Security, LLC and other
+# Copyright 2013-2023 Lawrence Livermore National Security, LLC and other
 # Spack Project Developers. See the top-level COPYRIGHT file for details.
 #
 # SPDX-License-Identifier: (Apache-2.0 OR MIT)
@@ -27,8 +27,9 @@ class Sda(MakefilePackage):
     version('7.3.3d', sha256='295ca0142532759a43375422a4ebc050e15b1c248e45493f5864765a9fe8076f')
 
     # Dependencies.
+    depends_on('apbs', type=('build','run'))
     depends_on('python@3.8:', type=('build','run'))
-    conflicts('%gcc@:9.3.999', when='@7.3.3d')
+    conflicts('%gcc@:9.3', when='@7.3.3d')
     conflicts('%intel')
 
     build_directory = 'src'
@@ -42,9 +43,21 @@ class Sda(MakefilePackage):
         makefile.filter(r'\${CC_plus}', '${CXX}')
         makefile.filter(r'^\s*CC_moins\s*=.*', 'CC = ' + spack_cc)
         makefile.filter(r'\${CC_moins}', '${CC}')
-
-    @property
-    def install_targets(self):
-        build_directory = 'sda_flex-7.3.3d/src/'
-        targets = ['init libsda sda_flex tools auxi clust test_module']
-        return ['prefix={0}'.format(self.prefix), 'install']
+    
+    def install(self, spec, prefix):
+        install_tree('auxi', prefix.auxi)
+        install_tree('bin', prefix.bin)
+        install_tree('examples', prefix.examples)
+        install_tree('lib', prefix.lib)
+        install_tree('src', prefix.src)
+
+    @run_after('install')
+    def test_install(self):
+        # prepare grid
+        with working_dir(self.prefix.examples + '/lysozymes/prepare_grids_and_ecm'):
+            run_script = Executable('bash')
+            run_script('./run_ed_hd_ecm.sh')
+        # run random test
+        with working_dir(self.prefix.examples + '/lysozymes/unit_test'):
+            test = Executable(self.prefix.bin.test_force_energy2)
+            test('128_lysph6_2interactions.in')
diff --git a/packages/wf-multi-area-model/package.py b/packages/wf-multi-area-model/package.py
new file mode 100644
index 0000000000000000000000000000000000000000..4458d12310e5488005c37357586f2fc60c003a51
--- /dev/null
+++ b/packages/wf-multi-area-model/package.py
@@ -0,0 +1,20 @@
+# Copyright 2013-2022 Lawrence Livermore National Security, LLC and other
+# Spack Project Developers. See the top-level COPYRIGHT file for details.
+#
+# SPDX-License-Identifier: (Apache-2.0 OR MIT)
+
+from spack import *
+
+
+class WfMultiAreaModel(BundlePackage):
+    """Meta-package to collect all dependencies of the Multi-Area-Model."""
+
+    homepage="https://inm-6.github.io/multi-area-model/"
+    git = "https://github.com/INM-6/multi-area-model"
+    maintainer = ["terhorstd"]
+
+    version("0.1")
+
+    depends_on("py-nested-dict")
+    depends_on("py-dicthash")
+
diff --git a/packages/wf-uq-akar4/package.py b/packages/wf-uq-akar4/package.py
new file mode 100644
index 0000000000000000000000000000000000000000..2aca38fc52842465afcc58a151765d9fe9bd563d
--- /dev/null
+++ b/packages/wf-uq-akar4/package.py
@@ -0,0 +1,24 @@
+# Copyright 2013-2022 Lawrence Livermore National Security, LLC and other
+# Spack Project Developers. See the top-level COPYRIGHT file for details.
+#
+# SPDX-License-Identifier: (Apache-2.0 OR MIT)
+
+
+from spack import *
+
+
+class WfUqAkar4(BundlePackage):
+    """Meta-package to collect all dependencies of the Uncertainty Quantification demo."""
+
+    homepage="https://wiki.ebrains.eu/bin/view/Collabs/subcellular-modeling-and-simulation/Lab"
+
+    version("0.1")
+
+    depends_on("r-mass")
+    depends_on("r-desolve")
+    depends_on("r-pracma")
+    depends_on("r-ks")
+    depends_on("r-reshape2")
+    depends_on("r-r-utils")
+    depends_on("r-vinecopula")
+    depends_on("r-ggplot2")
diff --git a/spack.yaml b/spack.yaml
index cb5d44b4e4e220964081ea01082058b0206465a7..3dd63b96c5c4e2b3472f89d2b9661bb835b4c61d 100644
--- a/spack.yaml
+++ b/spack.yaml
@@ -1,70 +1,67 @@
 spack:
   specs:
     # Notebook
-    #- py-jupyter
+    - r-irkernel
     - py-ipython
     - py-ipykernel
     - py-notebook
     - py-ipycanvas
     # Collab utils
     - clb-nb-utils@0.1.0
-    # General
-    # - py-pip
-    # - py-numpy
-    # - py-scipy
-    # - py-pandas
-    # - py-seaborn
-    # - py-matplotlib
-    - py-nameparser
-    - py-lazyarray
-    #- py-version-query
-    # EBRAINS simulators
-    - nest@3.4_rc1
-    - arbor +python +mpi
-    - neuron +mpi
+    # EBRAINS tools
+    - nest@3.4
+    - arbor@0.8.1 +python +mpi
+    - neuron@8.2.2 +mpi
     - py-pynn@0.10.1 +mpi
-    - py-brian2
-    - py-tvb-data
-    - py-tvb-gdist
-    - py-tvb-library
-    - py-tvb-storage
-    - py-tvb-framework
-    # - pynn-brainscales@4.0-rc1
+    - py-brian2@2.5.0.2
+    - py-tvb-data@2.7
+    - py-tvb-gdist@2.1.0
+    - py-tvb-library@2.7.3
+    - py-tvb-storage@2.7.3
+    - py-tvb-framework@2.7.3.1
+    - pynn-brainscales@4.0-rc1
     - hxtorch@4.0-rc1
-    - py-neo
-    - py-hdmf
-    - py-pynwb
-    - py-nixio
-    #- py-cerebstats
-    #- py-cerebunit
-    - py-cerebrus
+    - py-nestml@5.2.0
+    - py-neo@0.12.0
+    - py-hdmf@3.4.6
+    - py-pynwb@2.1.0
+    - py-nixio@1.5.3
+    - py-cerebrus@1.3.4
     - py-sciunit@0.2.5.1
-    - py-quantities@0.14.0
+    - py-quantities@0.14.1
     - py-quantities-scidash@0.12.4.3
-    #- py-ebrains-drive@0.4.0
-    - py-ebrains-kg-core
-    - py-pyld
-    - py-fairgraph
-    #- py-vf-client@0.6.3
+    - py-ebrains-kg-core@0.9.14
+    - py-pyld@0.8.2
+    - py-fairgraph@0.8.1
+    - py-nameparser@1.1.1
+    - py-lazyarray@0.5.2
     - py-hbp-archive@1.1.1
-    - py-viziphant
-    #- py-morphounit@1.0.4
-    #- py-neurom@1.4.10
-    #- py-morphio@3.1.1
+    - py-viziphant@0.3.0
     - py-hippounit@1.3.6
     - py-efel@4.0.4
     - py-hbp-neuromorphic-platform@0.10.1
     - py-lfpy@2.3
-    - py-elephant
-    - py-frites
-    - py-snudda
-    - biobb-common
-    - biobb-gromacs
-    - apbs
-    - py-pdb2pqr
-    - sda
-    # demo for codejam12
-    #- funniest1022
+    - py-elephant@0.12.0
+    - py-frites@0.4.2
+    - py-snudda@1.4.0
+    - biobb-common@3.8.1
+    - biobb-gromacs@3.8.1
+    - apbs@3.4.0
+    - py-pdb2pqr@3.5.2
+    - sda@7.3.3d
+    - r-uqsa@2.2
+    - r-rgsl@0.1
+    - r-sbtabvfgen@0.1
+    #- py-version-query
+    #- py-cerebstats
+    #- py-cerebunit
+    #- py-ebrains-drive@0.4.0
+    #- py-vf-client@0.6.3
+    #- py-morphounit@1.0.4
+    #- py-neurom@1.4.10
+    #- py-morphio@3.1.1
+    # Workflows (meta-packages)
+    - wf-uq-akar4@0.1
+    - wf-multi-area-model@0.1
   concretizer:
     unify: true
-