diff --git a/packages/genpybind/package.py b/packages/genpybind/package.py
index b33268c5cf400f5cf0cf203c93cca07bfd3a10fe..b2a639b8c0605f322bed8d3e3b0fa4ba9dda03cd 100644
--- a/packages/genpybind/package.py
+++ b/packages/genpybind/package.py
@@ -40,6 +40,7 @@ class Genpybind(WafPackage):
     version('develop', branch='develop')
 
     version('visions', branch='master', git='https://github.com/electronicvisions/genpybind')
+    version('ebrains', tag='ebrains_release-1-rc1', git='https://github.com/electronicvisions/genpybind')
 
     depends_on(
             'llvm+clang+python+visionary@5.0.0:',
@@ -52,7 +53,7 @@ class Genpybind(WafPackage):
     def configure_args(self):
         args = super(Genpybind, self).configure_args()
 
-        if self.spec.satisfies("@visions"):
+        if self.spec.satisfies("@visions") or self.spec.satisfies("@ebrains"):
             # currently only our HEAD supports the rename
             # TODO: adapt once the change is upstream
             args.append("--genpybind-disable-tests")
diff --git a/packages/meta-brainscales/package.py b/packages/meta-brainscales/package.py
index 4f1f7d72240c07c483cb8be6bac61f2a2fd22027..383159fe5c20cdfc8c067d71d4e2d65458d50a3d 100644
--- a/packages/meta-brainscales/package.py
+++ b/packages/meta-brainscales/package.py
@@ -35,7 +35,7 @@ class MetaBrainscales(Package):
     depends_on('cereal')
     depends_on('cppcheck')
     depends_on('doxygen+graphviz')
-    depends_on('genpybind@visions')
+    depends_on('genpybind@ebrains')
     depends_on('gflags')
     depends_on('googletest+gmock')
     depends_on('intel-tbb')  # ppu gdbserver
diff --git a/packages/pynn-brainscales/package.py b/packages/pynn-brainscales/package.py
new file mode 100644
index 0000000000000000000000000000000000000000..470a2e5a6fd564b7c81c33715571a685448de0b3
--- /dev/null
+++ b/packages/pynn-brainscales/package.py
@@ -0,0 +1,76 @@
+# 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 PynnBrainscales(WafPackage):
+    """PyNN toplevel for the BrainScaleS-2 neuromorphic hardware systems"""
+
+    homepage = "https://github.com/electronicvisions/pynn-brainscales"
+    #url      = "https://github.com/electronicvisions/pynn-brainscales/archive/v0.1.0.tar.gz"
+    git      = "https://github.com/electronicvisions/pynn-brainscales.git"
+
+    version('waf', branch='waf')
+    depends_on('meta-brainscales', type=('build', 'link', 'run'))
+    extends('python')
+
+    def setup_build_environment(self, env):
+        """waf needs to find headers and libraries by itself (mostly `boost`
+        tool, but also `gtest`); it also needs to run executables during
+        configuration."""
+
+        include = []
+        for dep in self.spec.traverse(deptype='build'):
+            query = self.spec[dep.name]
+            try:
+                include.extend(query.headers.directories)
+            except:
+                pass
+
+        library = []
+        for dep in self.spec.traverse(deptype=('link', 'run')):
+            query = self.spec[dep.name]
+            try:
+                print("\nQUERY", query)
+                library.extend(query.libs.directories)
+                print(query.libs.directories, "\n")
+            except:
+                pass
+
+        path = []
+        for dep in self.spec.traverse(deptype=('build', 'link', 'run')):
+            query = self.spec[dep.name]
+            try:
+                path.append(query.prefix.bin)
+            except:
+                pass
+
+        # llvm might be built with ~shared_libs but still builds shared libs
+        if not any('llvm' in lib for lib in library):
+            library.append(self.spec['llvm'].prefix.lib)
+
+        env.set('CPATH', ':'.join(include))
+        env.set('C_INCLUDE_PATH', ':'.join(include))
+        env.set('CPLUS_INCLUDE_PATH', ':'.join(include))
+        env.set('LIBRARY_PATH', ':'.join(library))
+        env.set('LD_LIBRARY_PATH', ':'.join(library))
+        env.prepend_path('PATH', ':'.join(path))
+
+    # override configure step as we perform a project setup first
+    def configure(self, spec, prefix):
+        """Setup and configure the project."""
+
+        self.waf('setup', '--project=pynn-brainscales', '--without-grenade-ppu-support', '--without-munge',
+                 '--project=grenade@ebrains_release-1-rc1',
+                 '--project=hate@ebrains_release-1-rc1',
+                 '--project=hxcomm@ebrains_release-1-rc1',
+                 '--project=lib-rcf@ebrains_release-1-rc1',
+                 '--project=visions-slurm@ebrains_release-1-rc1'
+                 )
+
+        args = ['--prefix={0}'.format(self.prefix)]
+        args += self.configure_args()
+
+        self.waf('configure', *args)
diff --git a/spack.yaml b/spack.yaml
index a2aab4b9d366a646671b0df32ba00b2eb72f043b..a8f3e18f090aad71d3b94a0ff14e660caa2a475a 100644
--- a/spack.yaml
+++ b/spack.yaml
@@ -22,3 +22,4 @@ spack:
     - tvb-storage ^binutils+ld+gold %gcc@10.3.0
     - tvb-framework ^binutils+ld+gold %gcc@10.3.0
     - meta-brainscales %gcc@10.3.0
+    - pynn-brainscales %gcc@10.3.0