diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index cdcba1b745083ef30a86730c4628ba7b885e5c08..e9047d8ee26343b545702508bb750084ae3adfc6 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -76,7 +76,7 @@ deploy-prod-release-prod-cscs:
     RELEASE_NAME: EBRAINS-23.06
   resource_group: shared-NFS-mount-prod-cscs
   rules:
-    - if: $CI_COMMIT_BRANCH =~ /ebrains/
+    - if: $CI_COMMIT_BRANCH =~ /^ebrains/
       when: manual
 
 # Deploy the production release of tools (manual pipeline)
@@ -94,7 +94,7 @@ deploy-prod-release-prod-jsc:
     RELEASE_NAME: EBRAINS-23.06
   resource_group: shared-NFS-mount-prod-jsc
   rules:
-    - if: $CI_COMMIT_BRANCH =~ /ebrains/
+    - if: $CI_COMMIT_BRANCH =~ /^ebrains/
       when: manual
 
 # Deploy the experimental release of tools (sheduled pipeline)
@@ -203,23 +203,12 @@ build-spack-env-on-runner:
     - cp /tmp/spack.yaml $SPACK_ENV/
     - spack install -y -j2 --fresh --test root
   after_script:
-    - mkdir spack_logs
-    - |
-      # succesfully installed packages: keep the spack logs for any package modified during this CI job
-      SPACK_PACKAGES_DIR=$SPACK_DEV_PATH/opt/spack/linux-ubuntu20.04-x86_64/gcc-10.3.0
-      if cp --parents $SPACK_PACKAGES_DIR/*/.spack/*.txt $SPACK_PACKAGES_DIR/*/.spack_test_results/* ./; then
-        mv .$SPACK_PACKAGES_DIR spack_logs/installed
-      else
-        echo "No packages installed, so no logs to collect"
-      fi
-      # not succesfully installed packages: also keep the spack logs for any packages that failed
-      if cp --parents /tmp/$(whoami)/spack-stage/*/*.txt ./; then
-        # also collect all bss test results
-        cp --parents -r /tmp/$(whoami)/spack-stage/*/spack-src/build/test_results ./ || echo ""
-        mv ./tmp/$(whoami)/spack-stage spack_logs/not_installed
-      else
-        echo "No packages failed to build, so no logs to collect"
-      fi
+    - mkdir -p $CI_PROJECT_DIR/spack_logs/installed $CI_PROJECT_DIR/spack_logs/not_installed
+      # for succesfully installed packages: keep the spack logs for any package modified during this CI job
+    - PKG_DIR=$SPACK_DEV_PATH/opt/spack/linux-ubuntu20.04-x86_64/gcc-10.3.0
+    - if cd $PKG_DIR; then find . \( -name ".spack" -o -name ".build" -o -name ".spack_test_results" \) -exec cp -r --parents "{}" $CI_PROJECT_DIR/spack_logs/installed \;; fi
+      # for not succesfully installed packages: also keep the spack logs for any packages that failed
+    - if cd /tmp/$(whoami)/spack-stage/; then find . -maxdepth 2 -name "*.txt" -exec cp --parents "{}" $CI_PROJECT_DIR/spack_logs/not_installed \;; fi
   artifacts:
     paths:
       - spack_logs
@@ -286,23 +275,13 @@ sync-gitlab-spack-instance:
     - spack install -y -j2 --fresh --test root
     - spack reindex
   after_script:
-    - mkdir spack_logs
-    - |
-      # succesfully installed packages: keep the spack logs for any package modified during this CI job
+    - mkdir -p $CI_PROJECT_DIR/spack_logs/installed $CI_PROJECT_DIR/spack_logs/not_installed
+      # for succesfully installed packages: keep the spack logs for any package modified during this CI job
       # (we use repo.yaml, that is modified at each start of the pipeline, as a reference file)
-      SPACK_PACKAGES_DIR=$SPACK_PATH/spack/opt/spack/linux-ubuntu20.04-x86_64/gcc-10.3.0
-      if find $SPACK_PACKAGES_DIR/*/.spack/*.txt -newer $SPACK_REPO_PATH/repo.yaml -exec cp --parents -r "{}" ./ \;; then
-        cp --parents -r $SPACK_PACKAGES_DIR/*/.spack_test_results/* ./
-        mv .$SPACK_PACKAGES_DIR spack_logs/installed
-      else
-        echo "No packages installed, so no logs to collect"
-      fi
-      # not succesfully installed packages: also keep the spack logs for any packages that failed
-      if cp --parents /tmp/$(whoami)/spack-stage/*/*.txt ./; then
-        mv ./tmp/$(whoami)/spack-stage spack_logs/not_installed
-      else
-        echo "No packages failed to build, so no logs to collect"
-      fi
+    - PKG_DIR=$SPACK_PATH/spack/opt/spack/linux-ubuntu20.04-x86_64/gcc-10.3.0
+    - if cd $PKG_DIR; then find . -newer $SPACK_REPO_PATH/repo.yaml \( -name ".spack" -o -name ".spack_test_results" -o -name ".build" \) -exec cp -r --parents "{}" $CI_PROJECT_DIR/spack_logs/installed \;; fi
+      # for not succesfully installed packages: also keep the spack logs for any packages that failed
+    - if cd /tmp/$(whoami)/spack-stage/; then find . -maxdepth 2 -name "*.txt" -exec cp --parents "{}" $CI_PROJECT_DIR/spack_logs/not_installed \;; fi
   artifacts:
     paths:
       - spack_logs
diff --git a/packages/biobb-gromacs/package.py b/packages/biobb-gromacs/package.py
index a682254412421657c5fe39adebd7412cdadf7245..c60afef13ff1559aebf227d626991c5afd765a04 100644
--- a/packages/biobb-gromacs/package.py
+++ b/packages/biobb-gromacs/package.py
@@ -8,6 +8,9 @@ class BiobbGromacs(PythonPackage):
     homepage = "https://github.com/bioexcel/biobb_gromacs"
     git = 'https://github.com/bioexcel/biobb_gromacs.git'
 
+    # Set the gitlab accounts of this package maintainers
+    maintainers = ['dbeltran']
+
     # Versions
     version('4.0.0', branch='master')
 
diff --git a/packages/biobb-io/package.py b/packages/biobb-io/package.py
index 6d8e4b07d0f236bfdc74e5b0d331edf2994bd219..a4f089d4e9d0c199f46baf075ae38ad812dc7c48 100644
--- a/packages/biobb-io/package.py
+++ b/packages/biobb-io/package.py
@@ -8,6 +8,9 @@ class BiobbIo(PythonPackage):
     homepage = "https://github.com/bioexcel/biobb_io"
     git = 'https://github.com/bioexcel/biobb_io.git'
 
+    # Set the gitlab accounts of this package maintainers
+    maintainers = ['dbeltran']
+
     # Versions
     version('4.0.0', branch='master')
 
diff --git a/packages/biobb-model/package.py b/packages/biobb-model/package.py
index 012732d6ec89cd4c598f774852d6746054854be3..877be433c85b0f28e2c0fedadde38b7508c66efa 100644
--- a/packages/biobb-model/package.py
+++ b/packages/biobb-model/package.py
@@ -8,6 +8,9 @@ class BiobbModel(PythonPackage):
     homepage = "https://github.com/bioexcel/biobb_model"
     git = 'https://github.com/bioexcel/biobb_model.git'
 
+    # Set the gitlab accounts of this package maintainers
+    maintainers = ['dbeltran']
+
     # Versions
     version('4.0.0', branch='master')
 
diff --git a/packages/biobb-structure-checking/package.py b/packages/biobb-structure-checking/package.py
index ab0862579ff1d1ba03c3207a649eb58a99037edb..8c528fd728f64192922fce64f25f38ae592d8649 100644
--- a/packages/biobb-structure-checking/package.py
+++ b/packages/biobb-structure-checking/package.py
@@ -9,6 +9,9 @@ class BiobbStructureChecking(PythonPackage):
     homepage = "https://github.com/bioexcel/biobb_structure_checking"
     git = 'https://github.com/bioexcel/biobb_structure_checking.git'
 
+    # Set the gitlab accounts of this package maintainers
+    maintainers = ['dbeltran']
+
     # Versions
     version('3.12.1', branch='master')
 
diff --git a/packages/biobb-structure-utils/package.py b/packages/biobb-structure-utils/package.py
index 9987467d22d8ce62e65d183a09e36827e85b0c5a..9dd06b981ff0c9bf8fc1c3b587849c0887d4036f 100644
--- a/packages/biobb-structure-utils/package.py
+++ b/packages/biobb-structure-utils/package.py
@@ -8,6 +8,9 @@ class BiobbStructureUtils(PythonPackage):
     homepage = "https://github.com/bioexcel/biobb_structure_utils"
     git = 'https://github.com/bioexcel/biobb_structure_utils.git'
 
+    # Set the gitlab accounts of this package maintainers
+    maintainers = ['dbeltran']
+
     # Versions
     version('4.0.0', branch='master')
 
diff --git a/packages/hxtorch/package.py b/packages/hxtorch/package.py
index ec8b209053a9105cac63c43630eb262bb7d64949..28aec2442e5cd0415be40a212bd0c247b2de7af6 100644
--- a/packages/hxtorch/package.py
+++ b/packages/hxtorch/package.py
@@ -11,24 +11,27 @@ class Hxtorch(WafPackage):
     """hxtorch --- a PyTorch-based toplevel for the BrainScaleS-2 neuromorphic hardware systems"""
 
     homepage = "https://github.com/electronicvisions/hxtorch"
-    # This repo provides a waf binary used for the build below
+    # This repo provides a custom waf binary used for the build below
     git      = "https://github.com/electronicvisions/pynn-brainscales.git"
 
-    version('7.0-a1', branch='waf')
+    maintainers = ['emuller']
 
-    # PPU compiler dependencies
-    depends_on('oppulance@7.0-a1')
+    version('7.0-rc1', branch='waf')
+
+    # compiler for the BrainScaleS-2 embedded processor ("PPU"); needed for
+    # building/linking, at runtime and for testing
+    depends_on('oppulance@7.0-rc1', type=('build', 'link', 'run', 'test'))
 
     # host software dependencies
-    depends_on('bitsery', type=('build', 'link', 'run'))
+    depends_on('bitsery', type=('build', 'link', 'run', 'test'))
     depends_on('binutils+gold+ld+plugins', type=('build', 'link', 'run')) # specialize
-    depends_on('boost@1.69.0: +graph+icu+mpi+numpy+coroutine+context+filesystem+python+serialization+system+thread+program_options cxxstd=17', type=('build', 'link', 'run')) # specialize boost (non-clingo, type=('build', 'link', 'run'))
-    depends_on('cereal', type=('build', 'link', 'run'))
+    depends_on('boost@1.69.0: +graph+icu+mpi+numpy+coroutine+context+filesystem+python+serialization+system+thread+program_options cxxstd=17', type=('build', 'link', 'run', 'test'))
+    depends_on('cereal', type=('build', 'link', 'run', 'test'))
     depends_on('cppcheck', type=('build', 'link', 'run'))
     depends_on('genpybind@ebrains', type=('build', 'link', 'run'))
     depends_on('gflags', type=('build', 'link', 'run'))
     depends_on('googletest@1.11.0:+gmock', type=('build', 'link', 'run')) # variadic templates needed
-    depends_on('inja', type=('build', 'link', 'run')) # template engine for PPU source jit generation
+    depends_on('inja', type=('build', 'link', 'run', 'test')) # template engine for PPU source jit generation
     depends_on('intel-tbb', type=('build', 'link', 'run'))  # ppu gdbserver
     depends_on('libelf', type=('build', 'link', 'run'))
     depends_on('liblockfile', type=('build', 'link', 'run'))
@@ -36,7 +39,7 @@ class Hxtorch(WafPackage):
     depends_on('log4cxx@0.12.1:', type=('build', 'link', 'run'))
     depends_on('pkgconfig', type=('build', 'link', 'run'))
     depends_on('psmisc', type=('run', 'test'))
-    depends_on('python@3.7.0:', type=('build', 'link', 'run')) # BrainScaleS(-2, type=('build', 'link', 'run')) only supports Python >= 3.7
+    depends_on('python@3.7.0:', type=('build', 'link', 'run')) # BrainScaleS-2 only supports Python >= 3.7
     depends_on('py-h5py', type=('build', 'link', 'run')) # PyNN tests need it
     depends_on('py-jax@0.3.25:', type=('build', 'link', 'run'))
     depends_on('py-matplotlib', type=('build', 'link', 'run'))
@@ -48,7 +51,7 @@ class Hxtorch(WafPackage):
     depends_on('py-pycodestyle', type=('build', 'link', 'run'))
     depends_on('py-pyelftools', type=('build', 'link', 'run'))
     depends_on('py-pylint', type=('build', 'link', 'run'))
-    depends_on('py-torch@1.9.1:', type=('build', 'link', 'run'))
+    depends_on('py-torch@1.9.1:', type=('build', 'link', 'run', 'test'))
     depends_on('py-torchvision', type=('run')) # for demos
     depends_on('py-tree-math', type=('build', 'link', 'run'))
     depends_on('py-pyyaml', type=('build', 'link', 'run'))
@@ -128,11 +131,27 @@ class Hxtorch(WafPackage):
         env.set('WAF_CONFIGURE_LD_LIBRARY_PATH', ':'.join(library))
         env.prepend_path('PATH', ':'.join(path))
 
-    def setup_dependent_build_environment(self, env, dependent_spec):
+    def _setup_common_env(self, env):
+        # TODO: use standard install layout for Python modules and extensions'
+        # shared objects => remove then
         env.prepend_path('PYTHONPATH', self.prefix.lib)
 
+        # grenade needs to find some libraries for the JIT-compilation of
+        # programs for BrainScaleS-2's embedded processor.
+        ppu_include_dirs = []
+        ppu_dep_names = ['bitsery', 'boost', 'cereal']
+        for ppu_dep_name in ppu_dep_names:
+            dep = self.spec[ppu_dep_name]
+            dep_include_dirs = set(dep.headers.directories)
+            ppu_include_dirs.extend(list(dep_include_dirs))
+        env.set('C_INCLUDE_PATH', ':'.join(ppu_include_dirs))
+        env.set('CPLUS_INCLUDE_PATH', ':'.join(ppu_include_dirs))
+
+    def setup_dependent_build_environment(self, env, dependent_spec):
+        self._setup_common_env(env)
+
     def setup_run_environment(self, env):
-        env.prepend_path('PYTHONPATH', self.prefix.lib)
+        self._setup_common_env(env)
 
     # override configure step as we perform a project setup first
     def configure(self, spec, prefix):
@@ -163,6 +182,7 @@ class Hxtorch(WafPackage):
 
     def build_test(self):
         self.builder.waf('build', '--test-execall')
+        copy_tree('build/test_results', join_path(self.prefix, '.build'))
 
     def install_args(self):
         args = ['--test-execnone']
@@ -172,7 +192,6 @@ class Hxtorch(WafPackage):
         with working_dir('spack-test', create=True):
             old_pythonpath = os.environ.get('PYTHONPATH', '')
             os.environ['PYTHONPATH'] = ':'.join([str(self.prefix.lib), old_pythonpath])
-            python('-c', 'import hxtorch; print(hxtorch.__file__)')
-            # ignore exit code for now
-            cmd_true = which("true")
-            cmd_true()
+            bash = which("bash")
+            # ignore segfaults for now (exit code 139)
+            bash('-c', '(python -c "import hxtorch; print(hxtorch.__file__)" || ( test $? -eq 139 && echo "segfault")) || exit $?')
diff --git a/packages/libvips/package.py b/packages/libvips/package.py
new file mode 100644
index 0000000000000000000000000000000000000000..c3ae509aaab4138d01b15c20556ad1ea8fb31d25
--- /dev/null
+++ b/packages/libvips/package.py
@@ -0,0 +1,49 @@
+# 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 Libvips(AutotoolsPackage):
+    """libvips is a demand-driven, horizontally threaded image processing
+    library. Compared to similar libraries, libvips runs quickly and uses
+    little memory."""
+
+    homepage = "https://libvips.github.io/libvips/"
+    url = "https://github.com/libvips/libvips/releases/download/v8.9.0/vips-8.9.0.tar.gz"
+    git = "https://github.com/libvips/libvips.git"
+
+    version("8.13.3", sha256="4eff5cdc8dbe1a05a926290a99014e20ba386f5dcca38d9774bef61413435d4c")
+    version("8.10.5", sha256="a4eef2f5334ab6dbf133cd3c6d6394d5bdb3e76d5ea4d578b02e1bc3d9e1cfd8")
+    version("8.9.1", sha256="45633798877839005016c9d3494e98dee065f5cb9e20f4552d3b315b8e8bce91")
+    version("8.9.0", sha256="97334a5e70aff343d2587f23cb8068fc846a58cd937c89a446142ccf00ea0349")
+
+    variant("fftw", default=True, description="Uses FFTW3 for fourier transforms.")
+
+    variant("jpeg", default=False, description="Enable JPEG support")
+
+    variant("tiff", default=False, description="Enable TIFF support")
+
+    variant("png", default=False, description="Enable pngfile support")
+
+    variant("poppler", default=False, description="Enable PDF rendering via poppler")
+
+    # TODO: Add more variants!
+
+    depends_on("glib")
+    depends_on("expat")
+
+    depends_on("fftw", when="+fftw")
+    depends_on("libjpeg", when="+jpeg")
+    depends_on("libtiff", when="+tiff")
+    depends_on("libpng", when="+png")
+    depends_on("poppler", when="+poppler")
+
+    # quick fix for build errors
+    depends_on("gobject-introspection")
+    depends_on("cfitsio")
+    depends_on("pango")
+    depends_on("libtiff")
+
diff --git a/packages/nest/package.py b/packages/nest/package.py
index e7c870f75b1a94be49577df733164335663aaa18..3f571164da86fe7c344afb81e96af35b4cee649f 100644
--- a/packages/nest/package.py
+++ b/packages/nest/package.py
@@ -25,7 +25,10 @@ class Nest(CMakePackage):
     ]
     git      = "https://github.com/nest/nest-simulator.git"
 
+    maintainers = ['terhorst']
+
     version('master', branch='master')
+    version('3.6-rc2',sha256='8508a9590ad49e6657809d1acfd02aa612b70fa8e5e7791a2ea261d891f181f7')
     version('3.5',    sha256='3cdf5720854a4d8a7d359f9de9d2fb3619a0be2e36932028d6940360741547bd')
     version('3.4',    sha256='c56699111f899045ba48e55e87d14eca8763b48ebbb3648beee701a36aa3af20')
     version('3.3',    sha256='179462b966cc61f5785d2fee770bc36f86745598ace9cd97dd620622b62043ed')
diff --git a/packages/neuron/package.py b/packages/neuron/package.py
index fb66601f3d1c2e884ee2908d1006a8462899b9a4..313c8e6ed7abb064113e37af50e79e9e359709c1 100644
--- a/packages/neuron/package.py
+++ b/packages/neuron/package.py
@@ -16,10 +16,13 @@ class Neuron(CMakePackage):
     """
 
     homepage = "https://www.neuron.yale.edu/"
-    url = "https://github.com/neuronsimulator/nrn/releases/download/8.2.2/full-src-package-8.2.2.tar.gz"
+    url = "https://github.com/neuronsimulator/nrn/releases/download/8.2.3/full-src-package-8.2.3.tar.gz"
     git = "https://github.com/neuronsimulator/nrn"
 
+    maintainers = ["kumbhar"]
+
     version("develop", branch="master", submodules="True")
+    version("8.2.3", tag="8.2.3", 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")
diff --git a/packages/npm/package.py b/packages/npm/package.py
new file mode 100644
index 0000000000000000000000000000000000000000..0d6480f210428b035fb54eff79d7e8416e2dd399
--- /dev/null
+++ b/packages/npm/package.py
@@ -0,0 +1,131 @@
+# 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)
+
+import os
+import shutil
+
+from spack.package import *
+
+
+class Npm(Package):
+    """npm: A package manager for javascript."""
+
+    homepage = "https://github.com/npm/cli"
+    # base https://www.npmjs.com/
+
+    git = "https://github.com/npm/cli.git"
+    url = "https://registry.npmjs.org/npm/-/npm-9.3.1.tgz"
+
+    version("9.3.1", sha256="41caa26a340b0562bc5429d28792049c980fe3e872b42b82cad94e8f70e37f40")
+    version("8.19.3", sha256="634bf4e0dc87be771ebf48a058629960e979a209c20a51ebdbc4897ca6a25260")
+    version("7.24.2", sha256="5b9eeea011f8bc3b76e55cc33339e87213800677f37e0756ad13ef0e9eaccd64")
+    version("6.14.18", sha256="c9b15f277e2a0b1b57e05bad04504296a27024555d56c2aa967f862e957ad2ed")
+
+    version(
+        "6.14.9",
+        sha256="1e0e880ce0d5adf0120fb3f92fc8e5ea5bac73681d37282615d074ff670f7703",
+        deprecated=True,
+    )
+    version(
+        "6.14.8",
+        sha256="fe8e873cb606c06f67f666b4725eb9122c8927f677c8c0baf1477f0ff81f5a2c",
+        deprecated=True,
+    )
+    version(
+        "6.13.7",
+        sha256="6adf71c198d61a5790cf0e057f4ab72c6ef6c345d72bed8bb7212cb9db969494",
+        deprecated=True,
+    )
+    version(
+        "6.13.4",
+        sha256="a063290bd5fa06a8753de14169b7b243750432f42d01213fbd699e6b85916de7",
+        deprecated=True,
+    )
+    version(
+        "3.10.9",
+        sha256="fb0871b1aebf4b74717a72289fade356aedca83ee54e7386e38cb51874501dd6",
+        deprecated=True,
+    )
+    version(
+        "3.10.5",
+        sha256="ff019769e186152098841c1fa6325e5a79f7903a45f13bd0046a4dc8e63f845f",
+        deprecated=True,
+    )
+
+    depends_on("node-js", type=("build", "run"))
+    depends_on("libvips")
+
+    # npm 6.13.4 ships with node-gyp 5.0.5, which contains several Python 3
+    # compatibility issues on macOS. Manually update to node-gyp 6.0.1 for
+    # full Python 3 support.
+    resource(
+        name="node-gyp",
+        destination="node-gyp",
+        url="https://registry.npmjs.org/node-gyp/-/node-gyp-6.0.1.tgz",
+        sha256="bbc0e137e17a63676efc97a0e3b1fcf101498a1c2c01c3341cd9491f248711b8",
+        when="@6",
+    )
+    resource(
+        name="env-paths",
+        destination="env-paths",
+        url="https://registry.npmjs.org/env-paths/-/env-paths-2.2.0.tgz",
+        sha256="168b394fbca60ea81dc84b1824466df96246b9eb4d671c2541f55f408a264b4c",
+        when="@6",
+    )
+
+    @when("@6")
+    def patch(self):
+        shutil.rmtree("node_modules/node-gyp")
+        install_tree("node-gyp/package", "node_modules/node-gyp")
+        filter_file(r'"node-gyp": "\^5\..*"', '"node-gyp": "^6.0.1"', "package.json")
+        install_tree("env-paths/package", "node_modules/env-paths")
+
+    @when("@:8")
+    def install(self, spec, prefix):
+        # `npm install .` doesn't work properly out of the box on npm up to 8, so we do
+        # what it would do manually. The only thing we seem to miss is docs. In
+        # particular, it will end up symlinking into the stage, which spack then
+        # deletes. You can avoid that with `npm install $(npm pack .)`, but `npm pack`
+        # also seems to fail when run from the tarball on macos. So we just copy manually.
+        to_install = [
+            "LICENSE",
+            "README.md",
+            "bin",
+            "docs",
+            "index.js",
+            "lib",
+            "node_modules",
+            "package.json",
+        ]
+
+        mkdirp(prefix.bin)
+        mkdirp(prefix.lib.node_modules.npm)
+
+        # manually install all the files above (if they exist for a particular node version)
+        for filename in to_install:
+            if os.path.exists(filename):
+                install_fn = install if os.path.isfile(filename) else install_tree
+                install_fn(filename, os.path.join(prefix.lib.node_modules.npm, filename))
+
+        # set up symlinks in bin
+        node_modules_bin = os.path.relpath(prefix.lib.node_modules.npm.bin, prefix.bin)
+        symlink(os.path.join(node_modules_bin, "npm-cli.js"), prefix.bin.npm)
+        symlink(os.path.join(node_modules_bin, "npx-cli.js"), prefix.bin.npx)
+
+    @when("@9:")
+    def install(self, spec, prefix):
+        # in npm 9, `npm install .` finally works within the repo, so we can just call it.
+        node = which("node", required=True)
+        node("bin/npm-cli.js", "install", "-ddd", "--global", f"--prefix={prefix}", ".")
+
+    def setup_dependent_build_environment(self, env, dependent_spec):
+        npm_config_cache_dir = "%s/npm-cache" % dependent_spec.prefix
+        if not os.path.isdir(npm_config_cache_dir):
+            mkdirp(npm_config_cache_dir)
+        env.set("npm_config_cache", npm_config_cache_dir)
+
+    def setup_dependent_run_environment(self, env, dependent_spec):
+        npm_config_cache_dir = "%s/npm-cache" % dependent_spec.prefix
+        env.set("npm_config_cache", npm_config_cache_dir)
diff --git a/packages/oppulance/package.py b/packages/oppulance/package.py
index 77a47abb3802426db600257743f259ce56491e16..c8525f3b94374a5c7dcf94e0db7ea12fd620ad5e 100644
--- a/packages/oppulance/package.py
+++ b/packages/oppulance/package.py
@@ -22,8 +22,8 @@ class Oppulance(Package):
 
     releases = [
         {
-            'version': '7.0-a1',
-            'tag': 'ebrains-7.0-a1'
+            'version': '7.0-rc1',
+            'tag': 'ebrains-7.0-rc1'
         },
     ]
 
diff --git a/packages/py-ebrains-kg-core/package.py b/packages/py-ebrains-kg-core/package.py
index c6eff2c94b78870eba090b3ae6584775943c1b42..cfe76f490abd501b0e14565e1f6bf3520dc6eefd 100644
--- a/packages/py-ebrains-kg-core/package.py
+++ b/packages/py-ebrains-kg-core/package.py
@@ -15,6 +15,7 @@ class PyEbrainsKgCore(PythonPackage):
 
     maintainers = ["ioannistsanaktsidis", "olinux"]
 
+    version('0.9.15', sha256='c672815ebcd6968f090620f68d85f0fbf282a83636c3a1845b078ef5ac5a06be')
     version('0.9.14', sha256='e898761abb999b09e5da49b25d13ffcadebaec7acd87ed079abe23f3bb12a5e7')
     version('0.9.13', sha256='25e155e9eb6c516dd33e29d9ff433c996630989a0f017c5920b66fe5334f2d82')
     version('0.9.12', sha256='244e52dffaec425bf65cf2d3d697969ec9036aaa028bf47fdddfb4911282f484')
diff --git a/packages/py-elephant/package.py b/packages/py-elephant/package.py
index 4c0b8ac4ad71b40f84d02b2a236ac57a4bf1ed4d..23d66ad74bf93804ac4f1a2b54985738c719c055 100644
--- a/packages/py-elephant/package.py
+++ b/packages/py-elephant/package.py
@@ -13,8 +13,7 @@ class PyElephant(PythonPackage):
     pypi = "elephant/elephant-0.11.0.tar.gz"
     git = "https://github.com/NeuralEnsemble/elephant.git"
 
-    # list of GitHub accounts to notify when the package is updated.
-    maintainers = ["Moritz-Alexander-Kern"]
+    maintainers = ["moritzkern"]
 
     version('develop', branch='master')
     version("0.13.0", sha256="2c6463cf9ace41631f2af196c5b80b468bf1c4b264d3a6b1ea0fb587d9e7dd67")
diff --git a/packages/py-fairgraph/package.py b/packages/py-fairgraph/package.py
index 2e0fd8e1d7a580f8a5087dfdd10b71f2ea049a63..0fc0945822a573489b3a69f5fca2c755de89a5fd 100644
--- a/packages/py-fairgraph/package.py
+++ b/packages/py-fairgraph/package.py
@@ -15,6 +15,7 @@ class PyFairgraph(PythonPackage):
 
     maintainers = ["apdavison"]
 
+    version("0.11.1", sha256="e4bc1737af032e7a9f693c8f12112e100762dd9597022aed012ae05d8196ebeb")
     version("0.11.0", sha256="ae87acf0d9f7e0c296a889056855e759705132f2fb88f77b08c708528f9823bb")
     version("0.10.0", sha256="4ad387549a12886323f149867c0940d2e3855f2fd9b3fb44af2ba312cc4975b7")
     version("0.9.0", sha256="8ed3dd3bc274d9c25408a2e971f317d4e3aa4400636e9f4b89716ad92b721d78")
diff --git a/packages/py-frites/package.py b/packages/py-frites/package.py
index 91414f628cb941fc0b011a517f05aca06aeda40a..2a1f3d0272c41c0fd8e2715e15c1af248a1b2cb8 100644
--- a/packages/py-frites/package.py
+++ b/packages/py-frites/package.py
@@ -14,9 +14,7 @@ class PyFrites(PythonPackage):
     homepage = "https://brainets.github.io/frites/"
     pypi     = "frites/frites-0.4.2.tar.gz"
 
-    # FIXME: Add a list of GitHub accounts to
-    # notify when the package is updated.
-    # maintainers = ['github_user1', 'github_user2']
+    maintainers = ['ecombrisson']
 
     version('0.4.4', sha256='280ca9f3f711da0550eceec8ce94108b891369b63ea3cc1b8c960825ed20fb3f')
     version('0.4.3', sha256='41a0aa2414196f1a08b7668b3e6be5872eda0f6814171408ef33af4904619f3a')
diff --git a/packages/py-hbp-validation-client/package.py b/packages/py-hbp-validation-client/package.py
index d8e7de2ab45edb94e0b4091b96af77fb66041022..d946d464e31c96306d28f7cd1a5c670908c11b68 100644
--- a/packages/py-hbp-validation-client/package.py
+++ b/packages/py-hbp-validation-client/package.py
@@ -14,6 +14,8 @@ class PyHbpValidationClient(PythonPackage):
     pypi     = "hbp_validation_framework/hbp_validation_framework-0.8.1.tar.gz"
     git      = "https://github.com/HumanBrainProject/hbp-validation-client"
 
+    maintainers = ["apdavison"]
+
     version("0.8.2", sha256="ba1cf2ecfc10de35e106884d2734faea069b939830990989f9ae08e43d6fde64")
     version("0.8.1", sha256="2afa96c07a5646e3e37528bacf103da4b352353ac45c10bf5948e4efbbbfb2a0")
     version("0.8.0", sha256="948fed2c83230cfab07416763b3d0e8adb0de1ee4c3a1a911697045025ff540f")
diff --git a/packages/py-lfpykit/package.py b/packages/py-lfpykit/package.py
index 36963978a9b558c8044db997b433592617fdfd70..fbf9a5cd61bf151afa5694cef13707f946ecd85f 100644
--- a/packages/py-lfpykit/package.py
+++ b/packages/py-lfpykit/package.py
@@ -14,6 +14,7 @@ class PyLfpykit(PythonPackage):
 
     version('0.4', sha256='ce92f5a987535ee72a76644bac90393eaa669d952f493dc388f3deb1c36f474d')
     version('0.5', sha256='9a7ae80ad905bb8dd0eeab8517b43c3d5b4fff2b8766c9d5a36320a7a67bd545')
+    version('0.5.1', sha256='a962029460c8173c4fec3923204e04d64c370b05740b64c2d07efbe29cbe63a6')
 
     depends_on('python@3.8:', type=('build', 'run'))
     depends_on('py-pip', type='build')
diff --git a/packages/py-libsonata/package.py b/packages/py-libsonata/package.py
index 7478f1d63e166e3e63795f427da0b5a8641b8b55..ed0644c33bb131b431d9cf0aaa833a975d278d6f 100644
--- a/packages/py-libsonata/package.py
+++ b/packages/py-libsonata/package.py
@@ -18,6 +18,7 @@ class PyLibsonata(PythonPackage):
     submodules = True
 
     version("develop", branch="master", get_full_repo=True)
+    version("0.1.23", sha256="815aac5bdaa5d025b5f3558ac4d3acb9ebcb070594109af4c0844f47ec701c1d")
     version("0.1.22", sha256="4adbb32ed2fac5d3c74bde03a5e2adb319724d324318a2a7dc2ef3c30f817b2c")
     version("0.1.21", sha256="5b280d82cb21a745d9cdb736c00446e0209494c21d2d17a2c878fabf23a08b68")
     version("0.1.20", sha256="f2e63a26dcf045bb7424e236e12f9b9ef8c46c356e953d26555f313f5763651e")
diff --git a/packages/py-morph-tool/package.py b/packages/py-morph-tool/package.py
index f639ba217f767de0cd13367ae8b69825080652fa..dbe42d14c6490c7328e7b8ac5bf90b067bd33671 100644
--- a/packages/py-morph-tool/package.py
+++ b/packages/py-morph-tool/package.py
@@ -13,11 +13,14 @@ class PyMorphTool(PythonPackage):
 
     homepage = "https://github.com/BlueBrain/morph-tool"
     git = "https://github.com/BlueBrain/morph-tool.git"
-    pypi = "morph-tool/morph-tool-2.4.1.tar.gz"
+    pypi = "morph-tool/morph-tool-2.9.1.tar.gz"
 
     version("develop", branch="master")
+    version("2.9.1", sha256="305e9456c8047726588b23dfa070eb95ccbe5573e9fea3e0a83dc93eacdf61dc")
     version("2.9.0", sha256="c60d4010e17ddcc3f53c864c374fffee05713c8f8fd2ba4eed7706041ce1fa47")
 
+    variant("neuron", default=False, description="Enable additional neuron support")
+
     depends_on("py-setuptools", type=("build", "run"))
 
     depends_on("py-click@6.7:", type=("build", "run"))
@@ -28,9 +31,10 @@ class PyMorphTool(PythonPackage):
     depends_on("py-xmltodict@0.12:", type=("build", "run"))
 
     depends_on("py-plotly@4.1:", type=("build", "run"))
-    depends_on("py-dask+bag@2.19:", type=("build", "run"))
+    depends_on("py-dask@2.19:", type=("build", "run"))
     depends_on("neuron+python@7.8:", type=("build", "run"))
-    depends_on("py-bluepyopt@1.9.37:", type=("build", "run"))
+    depends_on("py-bluepyopt@1.9.37:", type=("build", "run"), when="+neuron")
 
     depends_on("py-neurom@3.0:3.999,develop", type=("build", "run"))
-    depends_on("py-morphio@3.0:3.999,develop", type=("build", "run"))
+    depends_on("py-morphio@3.3.6:3,develop", type=("build", "run"), when="@2.9.1:")
+    depends_on("py-morphio@3.0:3,develop", type=("build", "run"), when="@2.9.0")
diff --git a/packages/py-morphio/package.py b/packages/py-morphio/package.py
index 5a08dfe86cd4d14b5fa96af724ea937da59bcbea..f1c6141484b924bacbee3c263351171efd044a49 100644
--- a/packages/py-morphio/package.py
+++ b/packages/py-morphio/package.py
@@ -18,6 +18,7 @@ class PyMorphio(PythonPackage):
     version("develop", branch="master", submodules=True)
     version("unifurcation", branch="unifurcation", submodules=True)
 
+    version("3.3.6", sha256="0f2e55470d92a3d89f2141ae905ee104fd16257b93dafb90682d90171de2f4e6")
     version("3.3.5", sha256="9e6cfebaea32080131b2b08a4a32dfbe92b18427a3e557861e27c4131f7542ac")
     version("3.3.4", sha256="b70c6884e9b835560501f798c75c9cc7eaf3162cba1d930b5a9b854bb9ea60dc")
     version("3.3.3", sha256="f6d91970cfd734b2e5fb8f9239a0bfa00519fe082dd8e403e4cc204dbdf0a9fa")
diff --git a/packages/py-neo/package.py b/packages/py-neo/package.py
index 829731d1703567a54347bab7ef8d4d65ef67a1c4..dd3d5b2ff8914f7659258228a75029d691c110a2 100644
--- a/packages/py-neo/package.py
+++ b/packages/py-neo/package.py
@@ -14,6 +14,8 @@ class PyNeo(PythonPackage):
     homepage = "https://neuralensemble.org/neo"
     pypi = "neo/neo-0.4.1.tar.gz"
 
+    maintainers = ["apdavison"]
+
     version('0.12.0', sha256='3b6ca4fc05dfdb4e953e253e70994bfbbc8fe2e90958fbda7fa5860caf3fa63a')
     version('0.11.1', sha256='f4a206044b332ad00b10072b0dc7a70b359fa365ec786f92ab757ef4ae588474')
     version('0.11.0', sha256='cdf8e1324a3fbbd1efd5618dcd37cfc497b1997923bd710b598472c1d846674a')
diff --git a/packages/py-netpyne/package.py b/packages/py-netpyne/package.py
index 15137fb06f6fad5d3ee43ec0cb35e6f5ea180df6..60d84b685f30dccf6b07d36056a94f3c1ccbe93f 100644
--- a/packages/py-netpyne/package.py
+++ b/packages/py-netpyne/package.py
@@ -10,12 +10,13 @@ class PyNetpyne(PythonPackage):
     """NetPyNE (Networks using Python and NEURON) is a Python package to facilitate the development, simulation, parallelization, analysis, and optimization of biological neuronal networks using the NEURON simulator."""
 
     homepage = "netpyne.org"
-    url = "https://github.com/suny-downstate-medical-center/netpyne/archive/refs/tags/v1.0.4.2.tar.gz"
+    url = "https://github.com/suny-downstate-medical-center/netpyne/archive/refs/tags/v1.0.5.tar.gz"
     git = "https://github.com/suny-downstate-medical-center/netpyne.git"
 
     # list of GitHub accounts to notify when the package is updated.
     maintainers = ["salvadord", "vvbragin"]
 
+    version("1.0.5",   sha256="482ceceef87afd587c5df5ae62e31993fcb2f68c9f09fe2b1548a94e7797a3e3")
     version("1.0.4.2", sha256="4191464386bbc2ecad3b224302c19edb9a26fe0da57c0d9b234cb9c2dd918c8d")
     version("1.0.4.1", sha256="2ed12807f9b3d3e3a8ba9910f8d22c5c17635e0cdea0af09fa3a230e68876df6")
 
diff --git a/packages/py-neuror/package.py b/packages/py-neuror/package.py
index b9273ee334a89cc84c867a93a420a377100da4f8..d84d202d063b5189676bf3d5159b048d32e07b1e 100644
--- a/packages/py-neuror/package.py
+++ b/packages/py-neuror/package.py
@@ -5,6 +5,7 @@
 #
 # SPDX-License-Identifier: (Apache-2.0 OR MIT)
 
+
 from spack.package import *
 
 
@@ -16,17 +17,18 @@ class PyNeuror(PythonPackage):
     pypi = "neuror/NeuroR-1.2.3.tar.gz"
 
     version("develop", branch="master")
-    version("1.4.2", sha256="f5e18ebddf59a60ce650c24eb49042057cf97990d63aee3ceb58b7acff823255")
+    version("1.6.4", sha256="a65c0e1814c38326a344f03c1f5f92ab4db721c5541888b2acb9ffc5a7adac50")
 
     depends_on("py-setuptools", type=("build", "run"))
 
     depends_on("py-click@6.7:", type=("build", "run"))
+    depends_on("py-jsonschema", type=("build", "run"))
     depends_on("py-matplotlib@2.2.3:", type=("build", "run"))
     depends_on("py-morph-tool@2.9.0:2.999", type=("build", "run"))
-    depends_on("py-morphio@3.0:3.999", type=("build", "run"))
-    depends_on("py-neurom@3.0:3.999", type=("build", "run"))
+    depends_on("py-morphio@3.0.0:3.999", type=("build", "run"))
+    depends_on("py-neurom@3.0.1:3.999", type=("build", "run"))
     depends_on("py-numpy@1.19.2:", type=("build", "run"))
-    depends_on("py-nptyping@1.3.0:", type=("build", "run"))
+    depends_on("py-nptyping@2:", type=("build", "run"))
     depends_on("py-pandas@0.24.2:", type=("build", "run"))
     depends_on("py-pyquaternion@0.9.2:", type=("build", "run"))
     depends_on("py-scipy@1.2.0:", type=("build", "run"))
diff --git a/packages/py-pynn/package.py b/packages/py-pynn/package.py
index 358c7d3aa2494a01ef0acbc200a54a10a43d3449..0366f2aab09328f9368096a7f60884fd5e4afbc0 100644
--- a/packages/py-pynn/package.py
+++ b/packages/py-pynn/package.py
@@ -15,6 +15,8 @@ class PyPynn(PythonPackage):
     pypi = "PyNN/PyNN-0.10.0.tar.gz"
     git = "https://github.com/NeuralEnsemble/PyNN.git"
 
+    maintainers = ["apdavison"]
+
     version('0.11.0', sha256='eab6ef281e0a00180c8b31ffb65984f54216c68464db363a5c09832fec91f952')
     version('0.10.1', sha256='03fbafeddd64ae7163e2b557b2760380b6eceb52469f1b3f4cc203bbb80f0cde')
     version('0.10.0', sha256='04120fe0e03260d664b337e0ac29d985c3fb3684ef35b1add93a66739891c98f')
diff --git a/packages/py-pyunicore/package.py b/packages/py-pyunicore/package.py
index 470f1e1c499471835d43f622096e2c5cbe29fd37..39fb8d9ea803210ce2117026762a61d5c58c7959 100644
--- a/packages/py-pyunicore/package.py
+++ b/packages/py-pyunicore/package.py
@@ -10,10 +10,11 @@ class PyPyunicore(PythonPackage):
     """Python library for using the UNICORE REST API"""
 
     homepage = "https://github.com/HumanBrainProject/pyunicore"
-    pypi     = "pyunicore/pyunicore-0.14.1.tar.gz"
+    pypi     = "pyunicore/pyunicore-0.15.0.tar.gz"
 
-    maintainers = ['bschulle', 'elmath']
+    maintainers = ['bschulle']
 
+    version('0.15.0', sha256='dc57ef05b1681b20471e8a4a72067671f74b4d41601099fe80324293439175d5')
     version('0.14.1', sha256='7efd4784d55ef02c4da4431232b54505814666577165c0f320c922ed2b32af01')
     version('0.14.0', sha256='8197aea4009ceb150bc4e341f660c942e424dca5025bc0253c8729328835a0c0')
     version('0.12.0', sha256='a1d7a63528cb0065d5ad58a42bc00adcf48614e16c2337dd815c8ac4d81b60cb')
diff --git a/packages/py-quantities-scidash/package.py b/packages/py-quantities-scidash/package.py
index c18a6d47f572600f3c8c8398a199c35df6a5a675..1854bc7162f01ab7c7d94bfb496445c4f474e64e 100644
--- a/packages/py-quantities-scidash/package.py
+++ b/packages/py-quantities-scidash/package.py
@@ -14,6 +14,8 @@ class PyQuantitiesScidash(PythonPackage):
     pypi     = "quantities-scidash/quantities-scidash-0.12.4.3.tar.gz"
     git      = "https://github.com/python-quantities/python-quantities.git"
 
+    maintainers = ["apdavison"]
+
     version('0.12.4.3', sha256='c281383b989ae19bfe1526c09e452c82880b633a735f9494d8bb469412a33ea2')
 
     depends_on('python@3.6.9:')
diff --git a/packages/py-ray/package.py b/packages/py-ray/package.py
new file mode 100644
index 0000000000000000000000000000000000000000..c687d7eef4d8bc9379de9f63218967b1db4118f8
--- /dev/null
+++ b/packages/py-ray/package.py
@@ -0,0 +1,96 @@
+# 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 PyRay(PythonPackage):
+    """Ray provides a simple, universal API for building distributed applications."""
+
+    homepage = "https://github.com/ray-project/ray"
+    url = "https://github.com/ray-project/ray/archive/ray-0.8.7.tar.gz"
+
+    version("2.0.1", sha256="b8b2f0a99d2ac4c001ff11c78b4521b217e2a02df95fb6270fd621412143f28b")
+    version("0.8.7", sha256="2df328f1bcd3eeb4fa33119142ea0d669396f4ab2a3e78db90178757aa61534b")
+
+    variant("default", default=False, description="Install default extras", when="@2.0.1")
+
+    depends_on("python@3.6:3.10", when="@2.0.1", type=("build", "run"))
+    depends_on("python@3.6:3.8", when="@0.8.7", type=("build", "run"))
+    depends_on("bazel@4.2.2:", when="@2.0.1", type="build")
+    depends_on("bazel@3.2.0", when="@0.8.7", type="build")
+    depends_on("npm", type="build")
+    depends_on("py-setuptools", type="build")
+    depends_on("py-cython@0.29.26:", when="@2.0.1", type="build")
+    depends_on("py-cython@0.29.14:", when="@0.8.7", type="build")
+    depends_on("py-attrs", when="@2.0.1", type=("build", "run"))
+    depends_on("py-click@7:8.0.4", when="@2.0.1", type=("build", "run"))
+    depends_on("py-click@7.0:", when="@0.8.7", type=("build", "run"))
+    depends_on("py-dataclasses", when="@2.0.1 ^python@:3.6", type=("build", "run"))
+    depends_on("py-filelock", type=("build", "run"))
+    depends_on("py-grpcio@1.32:1.43.0", when="@2.0.1 ^python@:3.9", type=("build", "run"))
+    depends_on("py-grpcio@1.42:1.43.0", when="@2.0.1 ^python@3.10:", type=("build", "run"))
+    depends_on("py-grpcio@1.28.1:", when="@0.8.7", type=("build", "run"))
+    depends_on("py-jsonschema", type=("build", "run"))
+    depends_on("py-msgpack@1", type=("build", "run"))
+    depends_on("py-numpy@1.16:", when="^python@:3.8", type=("build", "run"))
+    depends_on("py-numpy@1.19.3:", when="^python@3.9:", type=("build", "run"))
+    depends_on("py-protobuf@3.15.3:3", when="@2.0.1", type=("build", "run"))
+    depends_on("py-protobuf@3.8.0:", when="@0.8.7", type=("build", "run"))
+    depends_on("py-pyyaml", type=("build", "run"))
+    depends_on("py-frozenlist", when="@2.0.1", type=("build", "run"))
+    depends_on("py-requests", type=("build", "run"))
+    depends_on("py-typing-extensions", when="@2.0.1 ^python@:3.7", type=("build", "run"))
+    depends_on("py-virtualenv", when="@2.0.1", type=("build", "run"))
+
+    # needed to fix import errors
+    depends_on("py-setproctitle", type=("build", "run"))
+    depends_on("py-colorama", type=("build", "run"))
+    depends_on("py-psutil", type=("build", "run"))
+
+    with when("+default"):
+        depends_on("py-aiohttp@3.7:", type=("build", "run"))
+        depends_on("py-aiohttp-cors", type=("build", "run"))
+        depends_on("py-colorful", type=("build", "run"))
+        depends_on("py-py-spy@0.2:", type=("build", "run"))
+        depends_on("py-gpustat@1:", type=("build", "run"))
+        depends_on("py-opencensus", type=("build", "run"))
+        depends_on("py-pydantic", type=("build", "run"))
+        depends_on("py-prometheus-client@0.7.1:0.13", type=("build", "run"))
+        depends_on("py-smart-open", type=("build", "run"))
+
+    # Historical dependencies
+    with when("@0.8.7"):
+        depends_on("py-aiohttp", type=("build", "run"))
+        depends_on("py-aioredis", type=("build", "run"))
+        depends_on("py-colorama", type=("build", "run"))
+        depends_on("py-colorful", type=("build", "run"))
+        depends_on("py-google", type=("build", "run"))
+        depends_on("py-gpustat", type=("build", "run"))
+        depends_on("py-py-spy@0.2.0:", type=("build", "run"))
+        depends_on("py-redis@3.3.2:3.4", type=("build", "run"))
+        depends_on("py-opencensus", type=("build", "run"))
+        depends_on("py-prometheus-client@0.7.1:", type=("build", "run"))
+        # If not guarded by SKIP_THIRDPARTY_INSTALL, those dependencies
+        # would be automatically installed via pip by the setup.py script.
+        depends_on("py-setproctitle", type=("build", "run"))
+        depends_on("py-psutil", type=("build", "run"))
+        # If not detected during install, the following dependency would
+        # be automatically downloaded and installed by the setup.py script.
+        depends_on("py-pickle5", when="^python@:3.8.1", type=("build", "run"))
+
+    build_directory = "python"
+
+    def setup_build_environment(self, env):
+        env.set("SKIP_THIRDPARTY_INSTALL", "1")
+
+    # Compile the dashboard npm modules included in the project
+    @run_before("install")
+    def build_dashboard(self):
+        with working_dir(join_path("python", "ray", "dashboard", "client")):
+            npm = which("npm")
+            npm("ci")
+            npm("run", "build")
diff --git a/packages/py-snudda/package.py b/packages/py-snudda/package.py
index dca3202ff6e969283199865f00b52affa7966346..1678b1a00577884b791be5c8087e00339c26502f 100644
--- a/packages/py-snudda/package.py
+++ b/packages/py-snudda/package.py
@@ -7,7 +7,7 @@ class PySnudda(PythonPackage):
     homepage = "https://pypi.org/project/snudda/"
     pypi     = "snudda/snudda-1.4.71.tar.gz"
 
-    maintainers = ["hjorth", "elmath"]
+    maintainers = ["hjorth"]
     
     version("1.4.71", "563fcd816ad8a5c44b3185759e179c68", url="https://files.pythonhosted.org/packages/f7/d2/3f7b50f01f4d18578e15fb15deee9de0abebaa2006d0738714241d0359a5/snudda-1.4.71-py3-none-any.whl", expand=False)
     version("1.4.0", "55f9b398b01b34bf3cec28c8a3aebc78")
diff --git a/packages/py-spynnaker/package.py b/packages/py-spynnaker/package.py
index af39aa3a3b913adb0b8d5d89af194ce9480238f5..6af7b1e2f441a5025acc2f531958f5f140f99486 100644
--- a/packages/py-spynnaker/package.py
+++ b/packages/py-spynnaker/package.py
@@ -13,6 +13,8 @@ class PySpynnaker(PythonPackage):
     homepage = "https://github.com/SpiNNakerManchester/sPyNNaker"
     pypi = "sPyNNaker/sPyNNaker-1!7.0.0.tar.gz"
 
+    maintainers = ["rowley"]
+
     version("7.0.0", sha256="caeaa624e3fdbca3b938c9be7ea4c78a51a037e659389fb01952822f069664db")
 
     depends_on("python@3.7:", type=("build", "run"))
diff --git a/packages/py-tvb-contrib/package.py b/packages/py-tvb-contrib/package.py
index 1c528d746d5fe1d69d36d2d343df0cb6220e714c..5ce35d7daf775cf9993947f389f7c4b28274cf36 100644
--- a/packages/py-tvb-contrib/package.py
+++ b/packages/py-tvb-contrib/package.py
@@ -12,10 +12,11 @@ class PyTvbContrib(PythonPackage):
     """
 
     homepage = "https://www.thevirtualbrain.org/"
-    pypi = 'tvb-contrib/tvb-contrib-2.8.1.tar.gz'
+    pypi = 'tvb-contrib/tvb-contrib-2.8.2.tar.gz'
 
     maintainers = ['dionperd', 'paulapopa', "ldomide"]
 
+    version('2.8.2', 'ff5990e979cf1f87046d7bed2c265f9dec50f9d817abaabdf5df7ec4482b5063')
     version('2.8.1', '0b9bc5f837913f1cba007d25ae94c9df51bf43bf19c9fb2af14a90cb6a1e1a66')
 
     # python_requires
diff --git a/packages/py-tvb-data/package.py b/packages/py-tvb-data/package.py
index fffa2aad60d948d19e8c8a91b05bdd88b8277f03..8dae50884557a25b1361a53521841e7c724e3b90 100644
--- a/packages/py-tvb-data/package.py
+++ b/packages/py-tvb-data/package.py
@@ -11,11 +11,12 @@ class PyTvbData(PythonPackage):
     Various demonstration datasets for use with The Virtual Brain are provided here.
     """
 
-    homepage = "https://zenodo.org/record/7574266"
-    url = 'https://zenodo.org/record/7574266/files/tvb_data.zip'
+    homepage = "https://zenodo.org/record/8331301"
+    url = 'https://zenodo.org/record/8331301/files/tvb_data.zip'
 
     maintainers = ['paulapopa', "ldomide"]
 
+    version('2.8', 'd2f9b5933327c1d106838d301a4bf7b5')
     version('2.7', 'f74ec53edadb4540da3de7268257dd20')
     version('2.0.3', '1e02cdc21147f46644c57b14429f564f')
 
diff --git a/packages/py-tvb-framework/package.py b/packages/py-tvb-framework/package.py
index c0922e6b058828bd8b1503f2df948b96174fe4f3..c2c8c729f1c21436b7a9b8db0b0a3eb5e3bb3d8b 100644
--- a/packages/py-tvb-framework/package.py
+++ b/packages/py-tvb-framework/package.py
@@ -14,10 +14,11 @@ class PyTvbFramework(PythonPackage):
     """
 
     homepage = "https://www.thevirtualbrain.org/"
-    pypi = 'tvb-framework/tvb-framework-2.8.1.1.tar.gz'
+    pypi = 'tvb-framework/tvb-framework-2.8.2.tar.gz'
 
     maintainers = ['paulapopa', 'ldomide']
 
+    version('2.8.2', '00f4bdfc9faccf2df1a95695e231d7d4890cbf5ca7eac0474d52b976a51d91d5')
     version('2.8.1.1', '5f858398708453b3ea48de11c4ca1f098fe732738431ed421cc435d9bfc4b6fb')
     version('2.7.3.1', 'e1de0df0b8f43a317962b066790a5d724e1e6ae98ee124ad8b977f92aa228877')
     version('2.7.2', '1109c956c22e737d276bc822a69716c811d22e12f0606b47cc61700067af3ff4')
diff --git a/packages/py-tvb-library/package.py b/packages/py-tvb-library/package.py
index 21cea4efa89bc681a2fe251ccbc0046efa9cf4a8..7013071cac739b5ea5bfdaf1de3ca425a55774b9 100644
--- a/packages/py-tvb-library/package.py
+++ b/packages/py-tvb-library/package.py
@@ -14,10 +14,11 @@ class PyTvbLibrary(PythonPackage):
     """
 
     homepage = "https://www.thevirtualbrain.org/"
-    pypi = 'tvb-library/tvb-library-2.8.1.tar.gz'
+    pypi = 'tvb-library/tvb-library-2.8.2.tar.gz'
 
     maintainers = ['paulapopa', 'ldomide']
 
+    version('2.8.2', '4222dadbecce53b29e2141801b1ca8eb99c4595ace6c7d0469f7e0a41d3f384a')
     version('2.8.1', 'be130b10e7e176d503709afd211ae728f45d4e8b4a6082c6f6fcfbc1be990d0c')
     version('2.8', '49624cc8ca0673f8590227a9246ea2ffa855ef7a4242235ce85263ff6f3db7c8')
     version('2.7.3', 'bcf7ad291ff4549508f6720e207561f5f0bad638cd0d8507fd4ed9a7bcc561ff')
diff --git a/packages/py-tvb-multiscale/package.py b/packages/py-tvb-multiscale/package.py
index 5c17c883beef5caba3db0840a9e27dcf388bd1d5..f98ba9cbaea4e49c38135d8a2cef0ee4174b02b4 100644
--- a/packages/py-tvb-multiscale/package.py
+++ b/packages/py-tvb-multiscale/package.py
@@ -12,13 +12,11 @@ class PyTvbMultiscale(PythonPackage):
     """
 
     homepage = "https://github.com/the-virtual-brain/tvb-multiscale"
-    # url = "https://github.com/the-virtual-brain/tvb-multiscale/archive/refs/tags/2.0.2.tar.gz"
-    url = "https://github.com/the-virtual-brain/tvb-multiscale/archive/refs/tags/2.0.3.dev.tar.gz"
+    url = "https://github.com/the-virtual-brain/tvb-multiscale/archive/refs/tags/2.1.0.ebrains.tar.gz"
 
-    maintainers = ['dionperd', 'paulapopa', "ldomide"]
+    maintainers = ['dionperd', 'paulapopa', "ldomide", "vbragin"]
 
-    # version('2.0.2', sha256='647079e649225c7e9029bea9485872836a6dfe027a29718413e1e9e00255f4e6')
-    version('2.0.3.dev', sha256='3763c709ccb554a4bb1a38350a8137e2287e4859ef5cd13ca744db3351ab0def')
+    version('2.1.0.ebrains', sha256='eab51e235f565cffbf300daa4b7c65a7afacde149e2eda0f49437db3c2429253')
 
     # python_requires
     depends_on('python@3.8:3.10', type=('build', 'run'))
@@ -36,6 +34,7 @@ class PyTvbMultiscale(PythonPackage):
     depends_on('py-nestml', type=('build', 'run'))
     depends_on('py-elephant', type=('build', 'run'))
     depends_on('py-pyspike', type=('build', 'run'))
+    depends_on('py-ray', type=('build', 'run'))
 
     # Test dependency
     depends_on('py-pytest@:7.1', type='test')
diff --git a/packages/py-viziphant/package.py b/packages/py-viziphant/package.py
index 8d75c691fe6efcbde6c4dc47fafc8e4d92815f50..22f8da9a02fd2b2c05a3296463b5c777402ede21 100644
--- a/packages/py-viziphant/package.py
+++ b/packages/py-viziphant/package.py
@@ -12,8 +12,7 @@ class PyViziphant(PythonPackage):
     homepage = "https://viziphant.readthedocs.io/en/latest/"
     pypi = "viziphant/viziphant-0.1.0.tar.gz"
 
-    # notify when the package is updated.
-    maintainers = ['Moritz-Alexander-Kern']
+    maintainers = ['moritzkern']
 
     version('0.3.0', sha256='40d2970b8384d8e1c5d324caf1b1188391d7e651375ce08dd518bcf4ac6477f2')
     version('0.2.0', sha256='044b5c92de169dfafd9665efe2c310e917d2c21980bcc9f560d5c727161f9bd8')
diff --git a/packages/pynn-brainscales/package.py b/packages/pynn-brainscales/package.py
index 07309dd5843f178701535ece87615556e6d262ff..60afda339e5708b68e663da167c6854e9834254b 100644
--- a/packages/pynn-brainscales/package.py
+++ b/packages/pynn-brainscales/package.py
@@ -11,23 +11,27 @@ class PynnBrainscales(WafPackage):
     """PyNN toplevel for the BrainScaleS-2 neuromorphic hardware systems"""
 
     homepage = "https://github.com/electronicvisions/pynn-brainscales"
+    # This repo provides a custom waf binary used for the build below
     git      = "https://github.com/electronicvisions/pynn-brainscales.git"
 
-    version('7.0-a1', branch='waf')
+    maintainers = ['emuller']
+    
+    version('7.0-rc1', branch='waf')
 
-    # PPU compiler dependencies
-    depends_on('oppulance@7.0-a1')
+    # compiler for the BrainScaleS-2 embedded processor ("PPU"); needed for
+    # building/linking, at runtime and for testing
+    depends_on('oppulance@7.0-rc1', type=('build', 'link', 'run', 'test'))
 
     # host software dependencies
-    depends_on('bitsery', type=('build', 'link', 'run'))
+    depends_on('bitsery', type=('build', 'link', 'run', 'test'))
     depends_on('binutils+gold+ld+plugins', type=('build', 'link', 'run')) # specialize
-    depends_on('boost@1.69.0: +graph+icu+mpi+numpy+coroutine+context+filesystem+python+serialization+system+thread+program_options cxxstd=17', type=('build', 'link', 'run')) # specialize boost (non-clingo, type=('build', 'link', 'run'))
-    depends_on('cereal', type=('build', 'link', 'run'))
+    depends_on('boost@1.69.0: +graph+icu+mpi+numpy+coroutine+context+filesystem+python+serialization+system+thread+program_options cxxstd=17', type=('build', 'link', 'run', 'test'))
+    depends_on('cereal', type=('build', 'link', 'run', 'test'))
     depends_on('cppcheck', type=('build', 'link', 'run'))
     depends_on('genpybind@ebrains', type=('build', 'link', 'run'))
     depends_on('gflags', type=('build', 'link', 'run'))
     depends_on('googletest@1.11.0:+gmock', type=('build', 'link', 'run')) # variadic templates needed
-    depends_on('inja', type=('build', 'link', 'run')) # template engine for PPU source jit generation
+    depends_on('inja', type=('build', 'link', 'run', 'test')) # template engine for PPU source jit generation
     depends_on('intel-tbb', type=('build', 'link', 'run'))  # ppu gdbserver
     depends_on('libelf', type=('build', 'link', 'run'))
     depends_on('liblockfile', type=('build', 'link', 'run'))
@@ -35,7 +39,7 @@ class PynnBrainscales(WafPackage):
     depends_on('log4cxx@0.12.1:', type=('build', 'link', 'run'))
     depends_on('pkgconfig', type=('build', 'link', 'run'))
     depends_on('psmisc', type=('run', 'test'))
-    depends_on('python@3.7.0:', type=('build', 'link', 'run')) # BrainScaleS(-2, type=('build', 'link', 'run')) only supports Python >= 3.7
+    depends_on('python@3.7.0:', type=('build', 'link', 'run')) # BrainScaleS-2 only supports Python >= 3.7
     depends_on('py-deap@1.3.1:', type=('build', 'link', 'run'))
     depends_on('py-h5py', type=('build', 'link', 'run')) # PyNN tests need it
     depends_on('py-matplotlib', type=('build', 'link', 'run'))
@@ -104,11 +108,27 @@ class PynnBrainscales(WafPackage):
         env.set('WAF_CONFIGURE_LD_LIBRARY_PATH', ':'.join(library))
         env.prepend_path('PATH', ':'.join(path))
 
-    def setup_dependent_build_environment(self, env, dependent_spec):
+    def _setup_common_env(self, env):
+        # TODO: use standard install layout for Python modules and extensions'
+        # shared objects => remove then
         env.prepend_path('PYTHONPATH', self.prefix.lib)
 
+        # grenade needs to find some libraries for the JIT-compilation of
+        # programs for BrainScaleS-2's embedded processor.
+        ppu_include_dirs = []
+        ppu_dep_names = ['bitsery', 'boost', 'cereal']
+        for ppu_dep_name in ppu_dep_names:
+            dep = self.spec[ppu_dep_name]
+            dep_include_dirs = set(dep.headers.directories)
+            ppu_include_dirs.extend(list(dep_include_dirs))
+        env.set('C_INCLUDE_PATH', ':'.join(ppu_include_dirs))
+        env.set('CPLUS_INCLUDE_PATH', ':'.join(ppu_include_dirs))
+
+    def setup_dependent_build_environment(self, env, dependent_spec):
+        self._setup_common_env(env)
+
     def setup_run_environment(self, env):
-        env.prepend_path('PYTHONPATH', self.prefix.lib)
+        self._setup_common_env(env)
 
     # override configure step as we perform a project setup first
     def configure(self, spec, prefix):
@@ -139,6 +159,7 @@ class PynnBrainscales(WafPackage):
 
     def build_test(self):
         self.builder.waf('build', '--test-execall')
+        copy_tree('build/test_results', join_path(self.prefix, '.build'))
 
     def install_args(self):
         args = ['--test-execnone']
@@ -148,7 +169,6 @@ class PynnBrainscales(WafPackage):
         with working_dir('spack-test', create=True):
             old_pythonpath = os.environ.get('PYTHONPATH', '')
             os.environ['PYTHONPATH'] = ':'.join([str(self.prefix.lib), old_pythonpath])
-            python('-c', 'import pynn_brainscales; print(pynn_brainscales.__file__)')
-            # ignore exit code for now
-            cmd_true = which("true")
-            cmd_true()
+            bash = which("bash")
+            # ignore segfaults for now (exit code 139)
+            bash('-c', '(python -c "import pynn_brainscales; print(pynn_brainscales.__file__)" || ( test $? -eq 139 && echo "segfault")) || exit $?')
diff --git a/packages/r-rgsl/package.py b/packages/r-rgsl/package.py
index 264ecfe9ae461de88a6c2eae926be24d27f637e1..d7796805ea3fc29606fb33805b450d4d9efb31d7 100644
--- a/packages/r-rgsl/package.py
+++ b/packages/r-rgsl/package.py
@@ -13,7 +13,10 @@ class RRgsl(RPackage):
     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")
+    maintainers = ["akramer", "oliviaeriksson"]
+
+    version("0.1.1", sha256="a2d8fdbbb6c4f9937d6abaa56d912418b42931ae67067357e9bf5a032cc1a833")
+    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
diff --git a/packages/r-sbtabvfgen/package.py b/packages/r-sbtabvfgen/package.py
index 9741f22666c2af67aaaa053eb4ac6c79f1686b4b..0b49a66b5cefc4df3380b80e3e0a2774f6fae787 100644
--- a/packages/r-sbtabvfgen/package.py
+++ b/packages/r-sbtabvfgen/package.py
@@ -13,6 +13,8 @@ class RSbtabvfgen(RPackage):
     homepage = "https://github.com/icpm-kth/SBtabVFGEN"
     url = "https://github.com/icpm-kth/SBtabVFGEN/archive/refs/tags/v0.1.tar.gz"
 
+    maintainers = ["akramer", "oliviaeriksson"]
+
     version("0.1", sha256="499c51abee75ca5961a41608c9fb09ad523e12aae276f5f67bffa313244cff28")
 
     depends_on("r-pracma")
diff --git a/packages/r-uqsa/package.py b/packages/r-uqsa/package.py
index 4b4b34fd06176066292109b75de90b6e61b3912d..823f067c512185d4ec5820423cf7dbc0cd83c370 100644
--- a/packages/r-uqsa/package.py
+++ b/packages/r-uqsa/package.py
@@ -21,6 +21,8 @@ class RUqsa(RPackage):
     homepage = "https://github.com/icpm-kth/uqsa"
     url = "https://github.com/icpm-kth/uqsa/archive/refs/tags/v2.2.tar.gz"
 
+    maintainers = ["akramer", "oliviaeriksson"]
+
     version("2.2", sha256="df15d20c0cd466083181ec8f37cd331f409dcd23838553cd46a7a7305bdcfc7f")
 
     depends_on("r-vinecopula")
diff --git a/packages/wf-biobb/package.py b/packages/wf-biobb/package.py
index 4f98f444acfd1bf0bc695cd5abaa7a4b143ce4cd..d8188d8d0aae81f3ad22d94fc4d0b9d83ebe32a1 100644
--- a/packages/wf-biobb/package.py
+++ b/packages/wf-biobb/package.py
@@ -12,6 +12,8 @@ class WfBiobb(BundlePackage):
 
     homepage="https://wiki.ebrains.eu/bin/view/Collabs/biobb"
 
+    maintainers = ["dbeltran"]
+
     version("0.1")
 
     depends_on("py-plotly")
diff --git a/packages/wf-brainscales2-demos/package.py b/packages/wf-brainscales2-demos/package.py
index 74a3fcf7b34e5a708317fb452e8d4075cbb7710e..a879c609f6ceebf48dcb4aebdc46f455501ef28d 100644
--- a/packages/wf-brainscales2-demos/package.py
+++ b/packages/wf-brainscales2-demos/package.py
@@ -4,7 +4,9 @@
 # SPDX-License-Identifier: (Apache-2.0 OR MIT)
 
 
+from glob import glob
 from spack import *
+import os
 
 
 class WfBrainscales2Demos(Package):
@@ -38,19 +40,37 @@ class WfBrainscales2Demos(Package):
         # sanity_check_prefix requires something in the install directory
         mkdirp(prefix + "/.spack_test_results")
 
-    @run_after("install")
-    @on_package_attributes(run_tests=True)
-    def installcheck(self):
+    def _run_notebooks(self):
+        # TODO: remove debug output
         cmd_env = which("env")
         cmd_env()
         # execute notebook and save
         jupyter = Executable("jupyter")
-        jupyter("nbconvert",
-            "--ExecutePreprocessor.kernel_name=python3",
-            "--execute",
-            "--allow-errors",
-            "--to",
-            "notebook",
-            "ts_05-yin_yang.ipynb",
-            "--output",
-            prefix+"/.spack_test_results/ts_05-yin_yang.ipynb")
+        for fn in glob("ts*.ipynb") + glob("tp*.ipynb"):
+            jupyter("nbconvert",
+                "--ExecutePreprocessor.kernel_name=python3",
+                "--execute",
+                "--allow-errors",
+                "--to",
+                "notebook",
+                fn,
+                "--output",
+                prefix + "/.spack_test_results/" + fn)
+
+    def _set_collab_things(self):
+        # enable "EBRAINS lab" mode
+        os.environ["LAB_IMAGE_NAME"] = "EBRAINS"
+        # select "EBRAINS experimental" upstream experiment service
+        os.environ["LAB_KERNEL_NAME"] = "EBRAINS-experimental"
+        os.environ["JUPYTERHUB_USER"] = "spack-test-wf-brainscales2-demos"
+
+    @run_after("install")
+    @on_package_attributes(run_tests=True)
+    def installcheck(self):
+        self._set_collab_things()
+        # TODO (ECM): Provide a selection of notebooks that perform local-only tests.
+        #self._run_notebooks()
+
+    def test_notebooks(self):
+        self._set_collab_things()
+        self._run_notebooks()
diff --git a/packages/wf-multi-area-model/package.py b/packages/wf-multi-area-model/package.py
index 0020b1de2827ce3a086283a1350e7f86e3f68c27..01ffda36e18216b0037e7d4fc043830fb8cbd2b7 100644
--- a/packages/wf-multi-area-model/package.py
+++ b/packages/wf-multi-area-model/package.py
@@ -10,10 +10,10 @@ class WfMultiAreaModel(Package):
     """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"
-    git = "https://github.com/terhorstd/multi-area-model"
-    maintainer = ["terhorstd"]
+    git = "https://github.com/INM-6/multi-area-model"
+    maintainer = ["terhorstd", "didi-hou"]
 
+    version("v1.1.0",  tag="v1.1.0")
     version("master",  branch="master")
     version("ebrains",  branch="lab.ebrains.eu")
 
@@ -24,6 +24,7 @@ class WfMultiAreaModel(Package):
     depends_on("py-scipy")
     depends_on("py-future")
     depends_on("nest")
+    depends_on("r-aod")
     depends_on("py-notebook", type="test")
 
     def install(self, spec, prefix):
diff --git a/packages/wf-uq-akar4/package.py b/packages/wf-uq-akar4/package.py
index 2aca38fc52842465afcc58a151765d9fe9bd563d..4718038e85b24e2176fbba64db47f2e48c682663 100644
--- a/packages/wf-uq-akar4/package.py
+++ b/packages/wf-uq-akar4/package.py
@@ -12,6 +12,8 @@ class WfUqAkar4(BundlePackage):
 
     homepage="https://wiki.ebrains.eu/bin/view/Collabs/subcellular-modeling-and-simulation/Lab"
 
+    maintainers = ["akramer", "oliviaeriksson"]
+
     version("0.1")
 
     depends_on("r-mass")
diff --git a/spack.yaml b/spack.yaml
index 550e260ecf133c58c6c7844c76f5762d04b1e838..835600464099cc3f71383d07029c4c4414fc4c4a 100644
--- a/spack.yaml
+++ b/spack.yaml
@@ -13,56 +13,56 @@ spack:
     - biobb-model@4.0.0
     - biobb-structure-checking@3.12.1
     - biobb-structure-utils@4.0.0
-    - hxtorch@7.0-a1
-    - nest@3.5 +sonata
-    - neuron@8.2.2 +mpi
+    - hxtorch@7.0-rc1
+    - nest@3.6-rc2 +sonata
+    - neuron@8.2.3 +mpi
     - py-bluepyefe@2.2.18
     - py-bluepymm@0.7.65
     - py-bluepyopt@1.13.86
     - py-ebrains-drive@0.5.1
-    - py-ebrains-kg-core@0.9.14
+    - py-ebrains-kg-core@0.9.15
     - py-efel@4.0.4
     - py-elephant@0.13.0
-    - py-fairgraph@0.11.0
+    - py-fairgraph@0.11.1
     - py-frites@0.4.4
     - py-hbp-archive@1.1.1
     - py-hbp-neuromorphic-platform@0.10.1
     - py-hbp-validation-client@0.8.2
     - py-hippounit@1.3.6
     - py-lfpy@2.3
-    - py-lfpykit@0.5
-    - py-libsonata@0.1.22
+    - py-lfpykit@0.5.1
+    - py-libsonata@0.1.23
     - py-neo@0.12.0
     - py-nestml@5.2.0
-    - py-netpyne@1.0.4.2
+    - py-netpyne@1.0.5
     - py-neurom@3.2.2
-    - py-neuror@1.4.2
+    - py-neuror@1.6.4
     - py-pdb2pqr@3.5.2
     - py-pynn@0.11.0 +mpi
-    - py-pyunicore@0.14.1
+    - py-pyunicore@0.15.0
     - py-quantities-scidash@0.12.4.3
     - py-quantities@0.14.1
     - py-siibra@0.4a57
     - py-snudda@1.4.71
     - py-spynnaker@7.0.0
-    - py-tvb-contrib@2.8.1
-    - py-tvb-data@2.7
-    - py-tvb-framework@2.8.1.1
+    - py-tvb-contrib@2.8.2
+    - py-tvb-data@2.8
+    - py-tvb-framework@2.8.2
     - py-tvb-gdist@2.2
-    - py-tvb-library@2.8.1
-    - py-tvb-multiscale@2.0.3.dev
+    - py-tvb-library@2.8.2
+    - py-tvb-multiscale@2.1.0.ebrains
     - py-tvb-storage@2.8.1
     - py-viziphant@0.3.0
-    - pynn-brainscales@7.0-a1
-    - r-rgsl@0.1
+    - pynn-brainscales@7.0-rc1
+    - r-rgsl@0.1.1
     - r-sbtabvfgen@0.1
     - r-uqsa@2.2
     - sda@7.3.3d
     # Workflows (meta-packages)
     - wf-biobb
     - wf-brainscales2-demos
+    - wf-multi-area-model@v1.1.0
     - wf-uq-akar4@0.1
-    - wf-multi-area-model@ebrains
     #- py-cerebstats
     #- py-cerebunit
     #- py-morphounit@1.0.4