diff --git a/packages.yaml b/packages.yaml
index e7b9ae9064a57c1a5c8bc8537bbb2a07f4286719..c16e3313f79589b7f8ec0cc67d937d55491ea2fe 100644
--- a/packages.yaml
+++ b/packages.yaml
@@ -1,14 +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..f53769a3f2e5b2ce8008067ce7e79bd1493a6d74 100644
--- a/packages/apbs/package.py
+++ b/packages/apbs/package.py
@@ -30,17 +30,43 @@ 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)
+
+    @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/neuron/package.py b/packages/neuron/package.py
index 1bc7d7b2d40d3dcdfcbc0fb02fa27a06cbdb3b62..a960787cf718d384faddc709cf040792af43a2ef 100644
--- a/packages/neuron/package.py
+++ b/packages/neuron/package.py
@@ -143,8 +143,11 @@ 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_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)
+
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-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-neo/package.py b/packages/py-neo/package.py
index 7f641351423ffb6df841f3db371f77d0b162aeb4..75c4d780f41bb22ddb17062c048176c9ddab0bfc 100644
--- a/packages/py-neo/package.py
+++ b/packages/py-neo/package.py
@@ -14,6 +14,7 @@ class PyNeo(PythonPackage):
     homepage = "https://neuralensemble.org/neo"
     pypi = "neo/neo-0.4.1.tar.gz"
 
+    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-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/r-sbtabvfgen/package.py b/packages/r-sbtabvfgen/package.py
index c50a7ce8f319e3c1af96dda18edfe44c257c5020..9741f22666c2af67aaaa053eb4ac6c79f1686b4b 100644
--- a/packages/r-sbtabvfgen/package.py
+++ b/packages/r-sbtabvfgen/package.py
@@ -16,3 +16,5 @@ class RSbtabvfgen(RPackage):
     version("0.1", sha256="499c51abee75ca5961a41608c9fb09ad523e12aae276f5f67bffa313244cff28")
 
     depends_on("r-pracma")
+    depends_on("r-hdf5r")
+    depends_on("sbml+r")
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/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/spack.yaml b/spack.yaml
index f6980f3f6dec69a75341cc9b3999d78278e7e61f..5d73282bafcaab8a6f466ff0c94017e14eebf2b7 100644
--- a/spack.yaml
+++ b/spack.yaml
@@ -68,6 +68,7 @@ spack:
     - r-rgsl
     - r-sbtabvfgen
     - wf-uq-akar4
+    - wf-multi-area-model
     # demo for codejam12
     #- funniest1022
   concretizer: