diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index eb05c46a7bac6713182129d8750a4a9acc75ed12..ef1702baa91fdbcc7285657bdd5a77b8083a7b47 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -160,6 +160,7 @@ deploy-exp-release-prod-jsc:
     - shell-runner
   rules:
     - if: $CI_PIPELINE_SOURCE == "schedule"  && $DEPLOYMENT == "prod"
+      when: never
 
 build-spack-env-on-runner:
   stage: build
@@ -170,6 +171,9 @@ build-spack-env-on-runner:
   variables:
     SPACK_DEV_ENV: ebrains-dev
   script:
+    # deactivate environment views (we don't need them for the test build-job)
+    - >
+        echo "  view: False" >> $CI_PROJECT_DIR/site-config/$SYSTEMNAME/spack.yaml
     # run installation script
     - . install_spack_env.sh $CI_PROJECT_DIR $SPACK_VERSION $CI_PROJECT_DIR $SPACK_DEV_ENV $SPACK_PATH_GITLAB
     # re-activate envionment and run tests
diff --git a/packages/py-libneuroml/package.py b/packages/py-libneuroml/package.py
new file mode 100644
index 0000000000000000000000000000000000000000..c24241eccef174d39c8e8837bb080d7aabaace6e
--- /dev/null
+++ b/packages/py-libneuroml/package.py
@@ -0,0 +1,27 @@
+# Copyright 2013-2021 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 PyLibneuroml(PythonPackage):
+    """A SciUnit library for data-driven validation testing of models of hippocampus
+    """
+
+    homepage = "https://github.com/NeuralEnsemble/libNeuroML"
+    pypi     = "libNeuroML/libNeuroML-0.4.1.tar.gz"
+    git      = "https://github.com/NeuralEnsemble/libNeuroML.git"
+
+    version('0.5.5', sha256='b05830bb451ba797d941efee174724be9075d8d2e7d66f8379b2f2513c90d588')
+    version('0.4.1', sha256='d1b81dbcf794097904438f04f201cb2cffed7c38117c19f65c595d63fcb8c8b3')
+
+    depends_on('python@3.7:')
+    depends_on('py-setuptools',    type=('build'))
+    depends_on('py-lxml',          type=('run', 'test'))
+    depends_on('py-six',           type=('run', 'test'))
+    depends_on('py-networkx',      type=('run', 'test'))
+    depends_on('py-numpy',         type=('run', 'test'))
+    depends_on('py-tables@3.3.0:', type=('run', 'test'))
+    depends_on('py-natsort',       type=('run', 'test'))
diff --git a/packages/py-pynn/package.py b/packages/py-pynn/package.py
index 402d05099e70dc5476fec69de07c1d96a497446f..eea8e7cafeca3969e063cbd580151d606948c562 100644
--- a/packages/py-pynn/package.py
+++ b/packages/py-pynn/package.py
@@ -17,6 +17,8 @@ class PyPynn(PythonPackage):
 
     maintainers = ["apdavison"]
 
+    version('0.12.2', sha256='8039b68e3e5f98b537038c249dc42c027bd63f9ecc015c82f1f88bd30dfa28a9')
+    version('0.12.1', sha256='fef49cc601032565341f02c5c982cb805bc0cc16de75166acb1b7f8c179adfda')
     version('0.11.0', sha256='eab6ef281e0a00180c8b31ffb65984f54216c68464db363a5c09832fec91f952')
     version('0.10.1', sha256='03fbafeddd64ae7163e2b557b2760380b6eceb52469f1b3f4cc203bbb80f0cde')
     version('0.10.0', sha256='04120fe0e03260d664b337e0ac29d985c3fb3684ef35b1add93a66739891c98f')
@@ -52,15 +54,22 @@ class PyPynn(PythonPackage):
     depends_on('py-neo@0.10.0:',        type=('run', 'test'), when="@0.10.0")
     depends_on('py-neo@0.11.0:',        type=('run', 'test'), when="@0.10.1:")
 
+    depends_on('py-libneuroml@0.4.1:',  type=('run', 'test'), when="@0.12.1:")
+    depends_on('py-morphio',            type=('run', 'test'), when="@0.12:")
+
     depends_on('neuron@8.1:+python',    type=('run', 'test'), when="@0.10.1:")
-    depends_on('nest@3.3:+python',      type=('run', 'test'), when="@0.10.1:")
+    depends_on('nest@3.3:3.4+python',   type=('run', 'test'), when="@0.10.1:0.11.0")
+    depends_on('nest@3.4:+python',      type=('run', 'test'), when="@0.12.1:")
     depends_on('py-brian2',             type=('run', 'test'))
+    depends_on('arbor@0.8.1:+python',   type=('run', 'test'), when="@0.12.1:")
+
 
     depends_on('py-mock@1.0:',          type='test')
     depends_on('py-matplotlib',         type='test')
     depends_on("py-pytest",             type='test', when="@0.11.0:")
 
     patch('pynn-0.9.6-python3.patch', when='@0.9.6 ^python@3:')
+    patch('pynn-0.12.2-arbor-0.9.0.patch', when='@0.12.1:0.12.2')
 
     # neuroml and nineml are optional dependencies. Leave out of import_modules to avoid errors in tests
     skip_modules = ['pyNN.neuroml', 'pyNN.nineml', 'pyNN.hardware']
diff --git a/packages/py-pynn/pynn-0.12.2-arbor-0.9.0.patch b/packages/py-pynn/pynn-0.12.2-arbor-0.9.0.patch
new file mode 100644
index 0000000000000000000000000000000000000000..4a6d1757fde933f233ae5b7eed1eb1fbbc57b03e
--- /dev/null
+++ b/packages/py-pynn/pynn-0.12.2-arbor-0.9.0.patch
@@ -0,0 +1,13 @@
+diff --git a/pyNN/arbor/simulator.py b/pyNN/arbor/simulator.py
+index 69c7eab9..528e8d4d 100644
+--- a/pyNN/arbor/simulator.py
++++ b/pyNN/arbor/simulator.py
+@@ -186,7 +186,7 @@ class State(common.control.BaseState):
+             comm = arbor.mpi_comm(MPI.COMM_WORLD)
+         else:
+             comm = None
+-        self.arbor_context = arbor.context(alloc, comm)
++        self.arbor_context = arbor.context(alloc, mpi=comm)
+         # unclear if we can create the recipe now, or if we have to
+         # construct it only when we've assembled the whole network
+         self.network = NetworkRecipe()
diff --git a/packages/py-quantities/package.py b/packages/py-quantities/package.py
index d7cccbf7cce79a7bf08cb315f3d4aa884da8e514..bc785842571724ab4b9245a2fd61e09937589e85 100644
--- a/packages/py-quantities/package.py
+++ b/packages/py-quantities/package.py
@@ -13,6 +13,7 @@ class PyQuantities(PythonPackage):
     pypi = "quantities/quantities-0.12.1.tar.gz"
     maintainers = ['apdavison']
 
+    version('0.15.0', sha256='9ea31e2a0d7517cf24d546b14146def9292639993a616cca61b875ef796b4b2b')
     version('0.14.1', sha256='efeafffc0c0364f891a9327239cd12496bccb55cd037a6d1bf44de706f722877')
     version('0.13.0', sha256='0fde20115410de21cefa786f3aeae69c1b51bb19ee492190324c1da705e61a81')
     version('0.12.5', sha256='67546963cb2a519b1a4aa43d132ef754360268e5d551b43dd1716903d99812f0')
@@ -30,7 +31,7 @@ class PyQuantities(PythonPackage):
     depends_on('python@2.7.0:2.7,3.4:3.7', type=('build', 'run'), when='@0.12.3')
     depends_on('python@2.7.0:2.7,3.4:3.8', type=('build', 'run'), when='@0.12.4:0.12.5')
     depends_on('python@3.7:3.10', type=('build', 'run'), when='@0.13.0:0.13.1')
-    depends_on('python@3.8:3.11', type=('build', 'run'), when='@0.14:')
+    depends_on('python@3.8:3.12', type=('build', 'run'), when='@0.14:')
 
     # pip silently replaces distutils with setuptools
     # py-setuptools@:61 doesn't support PEP 621
@@ -44,4 +45,5 @@ class PyQuantities(PythonPackage):
     depends_on('py-numpy@1.8.2:1.16', type=('build', 'run'), when='@0.12.3')
     depends_on('py-numpy@1.8.2:1.17', type=('build', 'run'), when='@0.12.4:0.12')
     depends_on('py-numpy@1.16:', type=('build', 'run'), when='@0.13.0:0.13.1')
-    depends_on('py-numpy@1.19:', type=('build', 'run'), when='@0.14:')
+    depends_on('py-numpy@1.19:', type=('build', 'run'), when='@0.14:0.14')
+    depends_on('py-numpy@1.20:', type=('build', 'run'), when='@0.15.0:')
diff --git a/packages/wf-brainscales2-demos/package.py b/packages/wf-brainscales2-demos/package.py
index 580fd5cecc6788fb274352cd253d875af900fef9..f54ebef167c8e2ee55c19ad27a214e726b93b78a 100644
--- a/packages/wf-brainscales2-demos/package.py
+++ b/packages/wf-brainscales2-demos/package.py
@@ -55,10 +55,10 @@ class WfBrainscales2Demos(Package):
         try:
             # execute notebook and save
             jupyter(*args, output=str.split, error=str.split)
-        except ProcessError as e:
+        except Exception as e:
             # if the notebook execution fails, re-run notebook to produce output with error
             # in case of a cell timeout, don't re-run
-            if "CellTimeoutError" not in e:
+            if "CellTimeoutError" not in str(e):
                 jupyter(*(args+["--allow-errors"]))
             raise
 
diff --git a/packages/wf-multi-area-model/package.py b/packages/wf-multi-area-model/package.py
index b8ff5feb8f4326cc8e756885b10e540904bf1632..76db0cf2097ab9dab37df5f290378ba74535d8d3 100644
--- a/packages/wf-multi-area-model/package.py
+++ b/packages/wf-multi-area-model/package.py
@@ -47,7 +47,7 @@ class WfMultiAreaModel(Package):
         try:
             # execute notebook and save
             jupyter(*args)
-        except ProcessError as e:
+        except Exception as e:
             # if the above fails, re-run notebook to produce output with error
             jupyter(*(args+["--allow-errors"]))
             raise
diff --git a/spack.yaml b/spack.yaml
index f825a84885e3774bd1568d450c04aee12d13825a..6bb4c779f6319e4f7d8823c68e7746cf6bf87d84 100644
--- a/spack.yaml
+++ b/spack.yaml
@@ -31,16 +31,17 @@ spack:
     - py-hippounit@1.3.6
     - py-lfpy@2.3
     - py-lfpykit@0.5.1
+    - py-libneuroml@0.4.1
     - py-libsonata@0.1.23
     - py-neo@0.12.0
     - py-nestml@7.0.0
     - py-netpyne@1.0.5
     - py-neurom@3.2.2
     - py-neuror@1.6.4
-    - py-pynn@0.11.0 +mpi
+    - py-pynn@0.12.2 +mpi
     - py-pyunicore@0.15.0
     - py-quantities-scidash@0.12.4.3
-    - py-quantities@0.14.1
+    - py-quantities@0.15.0
     - py-siibra@0.4a66
     - py-snudda@1.4.71
     - py-spynnaker@7.0.0