diff --git a/packages/py-bokeh/package.py b/packages/py-bokeh/package.py
new file mode 100644
index 0000000000000000000000000000000000000000..5ccc01d5c7c791c63a3b60247f7a206f884199f9
--- /dev/null
+++ b/packages/py-bokeh/package.py
@@ -0,0 +1,54 @@
+# this package was adapted from Spack upstream v0.20.0, to add missing nmp dependency
+
+# 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 PyBokeh(PythonPackage):
+    """Statistical and novel interactive HTML plots for Python"""
+
+    homepage = "https://github.com/bokeh/bokeh"
+    pypi = "bokeh/bokeh-0.12.2.tar.gz"
+
+    version("2.4.3", sha256="ef33801161af379665ab7a34684f2209861e3aefd5c803a21fbbb99d94874b03")
+    version("2.4.1", sha256="d0410717d743a0ac251e62480e2ea860a7341bdcd1dbe01499a904f233c90512")
+    version("2.4.0", sha256="6fa00ed8baab5cca33f4175792c309fa2536eaae7e90abee884501ba8c90fddb")
+    version("2.3.3", sha256="a5fdcc181835561447fcc5a371300973fce4114692d5853addec284d1cdeb677")
+    version("1.3.4", sha256="e2d97bed5b199a10686486001fed5c854e4c04ebe28859923f27c52b93904754")
+    version("0.12.2", sha256="0a840f6267b6d342e1bd720deee30b693989538c49644142521d247c0f2e6939")
+
+    depends_on("py-setuptools", type="build", when="@1.3.4:")
+
+    depends_on("npm", type=("build", "run"))
+
+    depends_on("python@2.6:", type=("build", "run"), when="@0.12.2")
+    depends_on("python@2.7:", type=("build", "run"), when="@1.3.4:")
+    depends_on("python@3.6:", type=("build", "run"), when="@2.3.3:")
+    depends_on("python@3.7:", type=("build", "run"), when="@2.4.0:")
+
+    depends_on("py-requests@1.2.3:", type=("build", "run"), when="@0.12.2")
+    depends_on("py-six@1.5.2:", type=("build", "run"), when="@:1.3.4")
+    depends_on("py-python-dateutil@2.1:", type=("build", "run"), when="@:2.3.3")
+
+    depends_on("py-jinja2@2.7:", type=("build", "run"))
+    depends_on("py-jinja2@2.9:", type=("build", "run"), when="@2.3.3:")
+
+    depends_on("py-numpy@1.7.1:", type=("build", "run"))
+    depends_on("py-numpy@1.11.3:", type=("build", "run"), when="@2.3.3:")
+
+    depends_on("py-packaging@16.8:", type=("build", "run"), when="@1.3.4:")
+
+    depends_on("pil@4.0:", type=("build", "run"), when="@1.3.4:")
+    depends_on("pil@7.1.0:", type=("build", "run"), when="@2.3.3:")
+
+    depends_on("py-pyyaml@3.10:", type=("build", "run"))
+
+    depends_on("py-tornado@4.3:", type=("build", "run"))
+    depends_on("py-tornado@5.1:", type=("build", "run"), when="@2.3.3:")
+
+    depends_on("py-typing-extensions@3.7.4:", type=("build", "run"), when="@2.3.3:")
+    depends_on("py-typing-extensions@3.10.0:", type=("build", "run"), when="@2.4.0:")
\ No newline at end of file
diff --git a/packages/py-holoviews/package.py b/packages/py-holoviews/package.py
new file mode 100644
index 0000000000000000000000000000000000000000..8409e9a57b6af257fb668d5dfb2ae4689a6c4971
--- /dev/null
+++ b/packages/py-holoviews/package.py
@@ -0,0 +1,30 @@
+# 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 PyHoloviews(PythonPackage):
+    """HoloViews is an open-source Python library designed to make data analysis and visualization seamless and simple."""
+
+    homepage = "https://holoviews.org/"
+    pypi = "holoviews/holoviews-1.18.0.tar.gz"
+
+    version("1.17.1", sha256="ca30c661508b22e9e8c119dbc3e4a5d851987b43c30565db180b291d8fd770a4")
+
+
+    depends_on('py-setuptools', type='build')
+    depends_on('py-pyct', type='build')
+    depends_on('py-matplotlib', type=('build','run'))
+    depends_on('py-bokeh', type=('build','run'))
+    depends_on('py-param@1.12.0:3.0', type=('build','run'))
+    depends_on('py-numpy@1.0:', type=('build','run'))
+    depends_on('py-pyviz-comms@0.7.4:', type=('build','run'))
+    depends_on('py-pandas@0.20.0:', type=('build','run'))
+    depends_on('py-packaging', type=('build','run'))
+    depends_on('py-panel', type=('build','run'))
+    depends_on('py-colorcet', type=('build','run'))
+    depends_on('py-jupyterlab-widgets', type='run')
+    depends_on('py-ipywidgets', type='run')
diff --git a/packages/py-pyviz-comms/package.py b/packages/py-pyviz-comms/package.py
new file mode 100644
index 0000000000000000000000000000000000000000..6ec510d7e48666beaf9e17aedea1dbd07e0335c7
--- /dev/null
+++ b/packages/py-pyviz-comms/package.py
@@ -0,0 +1,22 @@
+# this package was adapted from Spack upstream v0.20.0, to add version 2.3.2 (that supports setuptools>60)
+
+# 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 PyPyvizComms(PythonPackage):
+    """Bidirectional communication for the HoloViz ecosystem."""
+
+    homepage = "https://holoviz.org/"
+    pypi = "pyviz_comms/pyviz_comms-2.2.1.tar.gz"
+
+    version("2.3.2", sha256="542a10fed8242d3a9d468ed0a14d6a2537e589c3f8a7986c79c374591254d6b4")
+    version("2.2.1", sha256="a26145b8ce43d2d934b3c6826d77b913ce105c528eb2e494c890b3e3525ddf33")
+
+    depends_on("py-setuptools@40.8:", type="build")
+    depends_on("py-setuptools@40.8:60", type="build", when="@:2.2.1")
+    depends_on("py-param", type=("build", "run"))
diff --git a/packages/py-viziphant/package.py b/packages/py-viziphant/package.py
index 22f8da9a02fd2b2c05a3296463b5c777402ede21..4f61b3b835d24fae4e53636018506979bbe1a3ce 100644
--- a/packages/py-viziphant/package.py
+++ b/packages/py-viziphant/package.py
@@ -14,6 +14,7 @@ class PyViziphant(PythonPackage):
 
     maintainers = ['moritzkern']
 
+    version('0.4.0', sha256='ae8c3df517d7781c184086909fad95f30c093534cfb35b74eadf330fa144e336')
     version('0.3.0', sha256='40d2970b8384d8e1c5d324caf1b1188391d7e651375ce08dd518bcf4ac6477f2')
     version('0.2.0', sha256='044b5c92de169dfafd9665efe2c310e917d2c21980bcc9f560d5c727161f9bd8')
     version('0.1.0', sha256='8fd56ec8633f799396dc33fbace95d2553bedb17f680a8c0e97f43b3a629bf6c')
@@ -27,6 +28,9 @@ class PyViziphant(PythonPackage):
     depends_on('py-six@1.10.0:', type=('build', 'run'))
     depends_on('py-matplotlib@3.3.2:', type=('build', 'run'))
     depends_on('py-seaborn@0.9.0:', type=('build', 'run'))
+    depends_on('py-bokeh@2.4.3:', type=('build', 'run'), when="@0.4.0:")
+    depends_on('py-holoviews@1.16.0:', type=('build', 'run'), when="@0.4.0:")
+    depends_on('py-networkx@2.8.6:', type=('build', 'run'), when="@0.4.0:")
 
     depends_on("py-pytest", type=("test"), when="@0.3.0:")
     depends_on("py-elephant@0.9.0:+extras", type=("test"), when="@0.3.0:")
diff --git a/spack.yaml b/spack.yaml
index d0cadda9561eba986c2dabada1ec4d3b56b31b5c..f9f0ca6092da120a3cede98af893ee69ea0a320d 100644
--- a/spack.yaml
+++ b/spack.yaml
@@ -51,7 +51,7 @@ spack:
     - py-tvb-library@2.8.2
     - py-tvb-multiscale@2.1.0.ebrains
     - py-tvb-storage@2.8.1
-    - py-viziphant@0.3.0
+    - py-viziphant@0.4.0
     - pynn-brainscales@7.0-rc1-fixup1
     - r-rgsl@0.1.1
     - r-sbtabvfgen@0.1