diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 99b7c3613588302eac3535c3c256bb52d7ac5023..7c8e8430a4f8a9dda378b6e6813a500f9c14cc16 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -199,6 +199,8 @@ build-spack-env-on-runner:
       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"
diff --git a/packages/hxtorch/package.py b/packages/hxtorch/package.py
index 87e5ea03edbddedac3005593b98e55c9c1d5fce0..5b2790e94f770b25d3bb9004b90df417a648ef8e 100644
--- a/packages/hxtorch/package.py
+++ b/packages/hxtorch/package.py
@@ -14,10 +14,10 @@ class Hxtorch(WafPackage):
     # This repo provides a waf binary used for the build below
     git      = "https://github.com/electronicvisions/pynn-brainscales.git"
 
-    version('4.0-a4', branch='waf')
+    version('4.0-rc1', branch='waf')
 
     # PPU compiler dependencies
-    depends_on('oppulance@4.0-a4')
+    depends_on('oppulance@4.0-rc1')
 
     # host software dependencies
     depends_on('bitsery', type=('build', 'link', 'run'))
@@ -35,6 +35,7 @@ class Hxtorch(WafPackage):
     depends_on('llvm', type=('build', 'link', 'run'))
     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('py-h5py', type=('build', 'link', 'run')) # PyNN tests need it
     depends_on('py-jax@0.3.25:', type=('build', 'link', 'run'))
@@ -153,6 +154,8 @@ class Hxtorch(WafPackage):
             '--project=flange@ebrains-' + str(spec.version),
             '--project=lib-rcf@ebrains-' + str(spec.version),
             '--project=bss-hw-params@ebrains-' + str(spec.version),
+            '--project=nhtl-extoll@ebrains-' + str(spec.version),
+            '--project=librma@ebrains-' + str(spec.version),
             '--project=libnux@ebrains-' + str(spec.version)
          )
 
@@ -168,12 +171,14 @@ class Hxtorch(WafPackage):
         return args
 
     def build_test(self):
-        self.waf('install', '--test-execall')
+        self.waf('build', '--test-execall')
 
     def install_args(self):
         args = ['--test-execnone']
         return args
 
-    # def install_test(self):
-    #     with working_dir('spack-test', create=True):
-    #         python('-c', 'import hxtorch; print(hxtorch.__file__)')
+    def install_test(self):
+        with working_dir('spack-test', create=True):
+            old_pythonpath = os.environ.get('PYTHONPATH', '')
+            os.environ['PYTHONPATH'] = ':'.join([str(self.prefix.lib), old_pythonpath])
+            python('-v', '-X dev', '-c', 'import hxtorch; print(hxtorch.__file__)')
diff --git a/packages/oppulance/package.py b/packages/oppulance/package.py
index 697e3e794afbb2036f01814c65050ba4eed866a0..072808ff4f402b0b28aee887ceb9fe76581eb3ea 100644
--- a/packages/oppulance/package.py
+++ b/packages/oppulance/package.py
@@ -22,8 +22,8 @@ class Oppulance(Package):
 
     releases = [
         {
-            'version': '4.0-a4',
-            'tag': 'ebrains-4.0-a4'
+            'version': '4.0-rc1',
+            'tag': 'ebrains-4.0-rc1'
         },
     ]
 
diff --git a/packages/psmisc/package.py b/packages/psmisc/package.py
new file mode 100644
index 0000000000000000000000000000000000000000..70a58922c775019f224834dbcc1a7a67e649056c
--- /dev/null
+++ b/packages/psmisc/package.py
@@ -0,0 +1,24 @@
+# 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 Psmisc(AutotoolsPackage):
+    """A package of small utilities that use the proc file-system."""
+
+    homepage = "http://psmisc.sf.net/"
+    url      = "https://sourceforge.net/projects/psmisc/files/psmisc/psmisc-23.6.tar.xz"
+
+    version('23.6', sha256='257dde06159a4c49223d06f1cccbeb68933a4514fc8f1d77c64b54f0d108822a')
+    version('23.5', sha256='dc37ecc2f7e4a90a94956accc6e1c77adb71316b7c9cbd39b26738db0c3ae58b')
+    version('23.4', sha256='7f0cceeace2050c525f3ebb35f3ba01d618b8d690620580bdb8cd8269a0c1679')
+    version('23.3', sha256='41750e1a5abf7ed2647b094f58127c73dbce6876f77ba4e0a7e0995ae5c7279a')
+
+    depends_on('autoconf', type='build')
+    depends_on('automake', type='build')
+    depends_on('libtool', type='build')
+    depends_on('gettext', type=('build', 'link'))
+    depends_on('ncurses', type=('build', 'link'))
+    depends_on('dejagnu', type=('build', 'link'))
diff --git a/packages/pynn-brainscales/package.py b/packages/pynn-brainscales/package.py
index eb71917e851ddab6a7d7cfefe618ad8a07dc94fe..0c289d29d1330759b22fe6af239b1c4fe94e74c9 100644
--- a/packages/pynn-brainscales/package.py
+++ b/packages/pynn-brainscales/package.py
@@ -13,10 +13,10 @@ class PynnBrainscales(WafPackage):
     homepage = "https://github.com/electronicvisions/pynn-brainscales"
     git      = "https://github.com/electronicvisions/pynn-brainscales.git"
 
-    version('4.0-a4', branch='waf')
+    version('4.0-rc1', branch='waf')
 
     # PPU compiler dependencies
-    depends_on('oppulance@4.0-a4')
+    depends_on('oppulance@4.0-rc1')
 
     # host software dependencies
     depends_on('bitsery', type=('build', 'link', 'run'))
@@ -34,6 +34,7 @@ class PynnBrainscales(WafPackage):
     depends_on('llvm', type=('build', 'link', 'run'))
     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('py-deap@1.3.1:', type=('build', 'link', 'run'))
     depends_on('py-h5py', type=('build', 'link', 'run')) # PyNN tests need it
@@ -130,6 +131,8 @@ class PynnBrainscales(WafPackage):
             '--project=flange@ebrains-' + str(spec.version),
             '--project=lib-rcf@ebrains-' + str(spec.version),
             '--project=bss-hw-params@ebrains-' + str(spec.version),
+            '--project=nhtl-extoll@ebrains-' + str(spec.version),
+            '--project=librma@ebrains-' + str(spec.version),
             '--project=libnux@ebrains-' + str(spec.version)
          )
 
@@ -145,12 +148,14 @@ class PynnBrainscales(WafPackage):
         return args
 
     def build_test(self):
-        self.waf('install', '--test-execall')
+        self.waf('build', '--test-execall')
 
     def install_args(self):
         args = ['--test-execnone']
         return args
 
-    # def install_test(self):
-    #     with working_dir('spack-test', create=True):
-    #         python('-c', 'import pynn_brainscales; print(pynn_brainscales.__file__)')
+    def install_test(self):
+        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__)')
diff --git a/spack.yaml b/spack.yaml
index 52ca0bf4259b211d72ea818f3a6e0712cf2774a0..3dd63b96c5c4e2b3472f89d2b9661bb835b4c61d 100644
--- a/spack.yaml
+++ b/spack.yaml
@@ -19,8 +19,8 @@ spack:
     - py-tvb-library@2.7.3
     - py-tvb-storage@2.7.3
     - py-tvb-framework@2.7.3.1
-    - pynn-brainscales@4.0-a4
-    - hxtorch@4.0-a4
+    - pynn-brainscales@4.0-rc1
+    - hxtorch@4.0-rc1
     - py-nestml@5.2.0
     - py-neo@0.12.0
     - py-hdmf@3.4.6