diff --git a/spack.yaml b/spack.yaml
index ae79ad650cc585dbb4efb290f5e773f2849f9b9d..ddeeff79a7fe3abcff2bf0f1f959f2c58881e4f1 100644
--- a/spack.yaml
+++ b/spack.yaml
@@ -24,7 +24,7 @@ spack:
     - cairo@1.16.0 +fc+ft+X+pdf+gobject
     - podio@0.13.1
     - geant4@10.7.1 cxxstd=17 +opengl +vecgeom +x11 +qt +threads ^qt +opengl
-    - dd4hep@1.17 +geant4 +assimp +hepmc3 +ipo +lcio
+    - dd4hep@1.17.0p1 +geant4 +assimp +hepmc3 +ipo +lcio
     - acts@8.03.0p1 +dd4hep +digitization +identification +json +tgeo +ipo
     - genfit@2.00.00
     - gaudi@36.0
diff --git a/spack/packages/dd4hep/backport.patch b/spack/packages/dd4hep/backport.patch
new file mode 100644
index 0000000000000000000000000000000000000000..8e743c119681986ad9f38ad41bc58a8884b1ce31
--- /dev/null
+++ b/spack/packages/dd4hep/backport.patch
@@ -0,0 +1,103 @@
+diff --git a/DDCore/src/plugins/Compact2Objects.cpp b/DDCore/src/plugins/Compact2Objects.cpp
+index fab6267f..581f535f 100644
+--- a/DDCore/src/plugins/Compact2Objects.cpp
++++ b/DDCore/src/plugins/Compact2Objects.cpp
+@@ -805,21 +805,48 @@ template <> void Converter<PropertyTable>::operator()(xml_h e) const {
+ }
+ #endif
+ 
+-/** Convert compact visualization attribute to Detector visualization attribute
++/** Convert compact visualization attribute to Detector visualization attribute.
+  *
+  *  <vis name="SiVertexBarrelModuleVis"
+  *       alpha="1.0" r="1.0" g="0.75" b="0.76"
+  *       drawingStyle="wireframe"
+  *       showDaughters="false"
+  *       visible="true"/>
++ *
++ *  Optionally inherit an already defined VisAttr and override other properties.
++ *
++ *  <vis name="SiVertexEndcapModuleVis"
++ *       ref="SiVertexBarrelModuleVis"
++ *       alpha="0.5"/>
+  */
+ template <> void Converter<VisAttr>::operator()(xml_h e) const {
+   VisAttr attr(e.attr<string>(_U(name)));
++  float alpha = 1.0;
++  float red   = 1.0;
++  float green = 1.0;
++  float blue  = 1.0;
++  bool use_ref = false;
++  if(e.hasAttr(_U(ref))) {
++    use_ref = true;
++    auto refName = e.attr<string>(_U(ref));
++    const auto refAttr = description.visAttributes(refName);
++    if(!refAttr.isValid() )  {
++        throw runtime_error("reference VisAttr " + refName + " does not exist");
++    }
++    // Just copying things manually.
++    // I think a handle's copy constructor/assignment would reuse the underlying pointer... maybe?
++    refAttr.argb(alpha,red,green,blue);
++    attr.setColor(alpha,red,green,blue);
++    attr.setDrawingStyle( refAttr.drawingStyle());
++    attr.setLineStyle( refAttr.lineStyle());
++    attr.setShowDaughters(refAttr.showDaughters());
++    attr.setVisible(refAttr.visible());
++  }
+   xml_dim_t dim(e);
+-  float alpha = dim.alpha(1.0);
+-  float red   = dim.r(1.0);
+-  float green = dim.g(1.0);
+-  float blue  = dim.b(1.0);
++  alpha = dim.alpha(alpha);
++  red   = dim.r(red  );
++  green = dim.g(green);
++  blue  = dim.b(blue );
+ 
+   printout(s_debug.visattr ? ALWAYS : DEBUG, "Compact",
+            "++ Converting VisAttr  structure: %-16s. Alpha=%.2f R=%.3f G=%.3f B=%.3f",
+@@ -835,7 +862,8 @@ template <> void Converter<VisAttr>::operator()(xml_h e) const {
+       attr.setLineStyle(VisAttr::DASHED);
+   }
+   else {
+-    attr.setLineStyle(VisAttr::SOLID);
++    if (!use_ref)
++      attr.setLineStyle(VisAttr::SOLID);
+   }
+   if (e.hasAttr(_U(drawingStyle))) {
+     string ds = e.attr<string>(_U(drawingStyle));
+@@ -845,12 +873,15 @@ template <> void Converter<VisAttr>::operator()(xml_h e) const {
+       attr.setDrawingStyle(VisAttr::SOLID);
+   }
+   else {
+-    attr.setDrawingStyle(VisAttr::SOLID);
++    if (!use_ref)
++      attr.setDrawingStyle(VisAttr::SOLID);
+   }
+   if (e.hasAttr(_U(showDaughters)))
+     attr.setShowDaughters(e.attr<bool>(_U(showDaughters)));
+-  else
+-    attr.setShowDaughters(true);
++  else {
++    if (!use_ref)
++      attr.setShowDaughters(true);
++  }
+   description.addVisAttribute(attr);
+ }
+ 
+diff --git a/DDG4/src/Geant4ShapeConverter.cpp b/DDG4/src/Geant4ShapeConverter.cpp
+index 2a79a69a..6f4af522 100644
+--- a/DDG4/src/Geant4ShapeConverter.cpp
++++ b/DDG4/src/Geant4ShapeConverter.cpp
+@@ -205,8 +205,9 @@ namespace dd4hep {
+ 
+     template <> G4VSolid* convertShape<TGeoSphere>(const TGeoShape* shape)  {
+       const TGeoSphere* sh = (const TGeoSphere*) shape;
+-      return new G4Sphere(sh->GetName(), sh->GetRmin() * CM_2_MM, sh->GetRmax() * CM_2_MM, sh->GetPhi1() * DEGREE_2_RAD,
+-                          sh->GetPhi2() * DEGREE_2_RAD, sh->GetTheta1() * DEGREE_2_RAD, sh->GetTheta2() * DEGREE_2_RAD);
++      return new G4Sphere(sh->GetName(), sh->GetRmin() * CM_2_MM, sh->GetRmax() * CM_2_MM,
++                          sh->GetPhi1() * DEGREE_2_RAD, (sh->GetPhi2()-sh->GetPhi1()) * DEGREE_2_RAD,
++                          sh->GetTheta1() * DEGREE_2_RAD, (sh->GetTheta2()- sh->GetTheta1()) * DEGREE_2_RAD);
+     }
+ 
+     template <> G4VSolid* convertShape<TGeoTorus>(const TGeoShape* shape)  {
diff --git a/spack/packages/dd4hep/package.py b/spack/packages/dd4hep/package.py
index 2748bba8032b8cd758c4e449e74ec77df8f984d0..b08f30d0afad7d850485a199e7a54d3d3a0e9854 100644
--- a/spack/packages/dd4hep/package.py
+++ b/spack/packages/dd4hep/package.py
@@ -24,6 +24,7 @@ class Dd4hep(CMakePackage):
     tags = ['hep']
 
     version('master', branch='master')
+    version('1.17.0p1', sha256='036a9908aaf1e13eaf5f2f43b6f5f4a8bdda8183ddc5befa77a4448dbb485826')
     version('1.17', sha256='036a9908aaf1e13eaf5f2f43b6f5f4a8bdda8183ddc5befa77a4448dbb485826')
     version('1.16.1', sha256='c8b1312aa88283986f89cc008d317b3476027fd146fdb586f9f1fbbb47763f1a')
     version('1.16', sha256='ea9755cd255cf1b058e0e3cd743101ca9ca5ff79f4c60be89f9ba72b1ae5ec69')
@@ -49,6 +50,11 @@ class Dd4hep(CMakePackage):
     # See https://github.com/spack/spack/issues/24232
     patch('cmake_language.patch', when='@:1.17')
 
+    # Patch to incorporate Whit's recent PRs merged into the DD4hep master
+    # https://github.com/AIDASoft/DD4hep/pull/849
+    # https://github.com/AIDASoft/DD4hep/pull/851
+    patch('backport.patch', when='@1.17.0p1')
+
     variant('xercesc', default=False, description="Enable 'Detector Builders' based on XercesC")
     variant('geant4', default=False, description="Enable the simulation part based on Geant4")
     variant('assimp', default=False, description="Enable CAD interface based on Assimp")