diff --git a/spack/README.md b/spack/README.md
index 40b709143e6ce6c10a4ddf6b03bbe072db4eb379..24dbd820cb648f9f1aee471515f59a10f42886c6 100644
--- a/spack/README.md
+++ b/spack/README.md
@@ -18,6 +18,7 @@ Then use spack as you normally would.
   * Package overrides
     * `acts`: Patch bug for simple disk geometries
     * `dd4hep`: Fix package hash which somehow is wrong in spack...
+    * `Geant4`: Add extra hardcoded materials with Birks constant
     * `fmt`: Modified compiler flags to build shared library version.
     * `madx`: Add madx package
     * `mesa`: fix issue in meson step
diff --git a/spack/packages/geant4/CLHEP-10.03.03.patch b/spack/packages/geant4/CLHEP-10.03.03.patch
new file mode 100644
index 0000000000000000000000000000000000000000..b865f3bde24c1eead5cf2237289dfe7f886faaee
--- /dev/null
+++ b/spack/packages/geant4/CLHEP-10.03.03.patch
@@ -0,0 +1,34 @@
+diff --git a/cmake/Modules/FindCLHEP.cmake b/cmake/Modules/FindCLHEP.cmake
+index 8b59f1c0a..f616d678e 100644
+--- a/cmake/Modules/FindCLHEP.cmake
++++ b/cmake/Modules/FindCLHEP.cmake
+@@ -180,7 +180,10 @@ if(UNIX)
+         execute_process(COMMAND ${CLHEP_CONFIG_EXECUTABLE} --prefix
+             OUTPUT_VARIABLE _clhep_config_prefix
+             OUTPUT_STRIP_TRAILING_WHITESPACE)
+-
++          if (_clhep_config_prefix)
++            # Remove wrapping double quotes.
++            string(REGEX REPLACE "\"(.*)\"" "\\1" _clhep_config_prefix "${_clhep_config_prefix}")
++          endif()
+         list(APPEND _clhep_root_hints ${_clhep_config_prefix})
+     endif()
+ elseif(WIN32 AND NOT UNIX)
+diff --git a/cmake/Templates/Geant4Config.cmake.in b/cmake/Templates/Geant4Config.cmake.in
+index d6fe408b3..f355be2af 100644
+--- a/cmake/Templates/Geant4Config.cmake.in
++++ b/cmake/Templates/Geant4Config.cmake.in
+@@ -268,13 +268,7 @@ set(Geant4_builtin_clhep_FOUND @GEANT4_USE_BUILTIN_CLHEP@)
+ if(NOT Geant4_builtin_clhep_FOUND)
+   set(Geant4_system_clhep_ISGRANULAR @GEANT4_USE_SYSTEM_CLHEP_GRANULAR@)
+ 
+-  set(CLHEP_ROOT_DIR "@CLHEP_ROOT_DIR@")
+-  set(__GEANT4_OLD_CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH})
+-  set(CMAKE_MODULE_PATH "${_geant4_thisdir}/Modules" ${CMAKE_MODULE_PATH})
+   find_package(CLHEP @CLHEP_VERSION@ REQUIRED @__g4_clhep_components@)
+-  set(CMAKE_MODULE_PATH ${__GEANT4_OLD_CMAKE_MODULE_PATH})
+-  unset(CLHEP_ROOT_DIR)
+-  unset(__GEANT4_OLD_CMAKE_MODULE_PATH)
+   #CLHEP doesn't use target properties fully yet, so always include_directories
+   include_directories(${CLHEP_INCLUDE_DIRS})
+ endif()
diff --git a/spack/packages/geant4/birks.patch b/spack/packages/geant4/birks.patch
new file mode 100644
index 0000000000000000000000000000000000000000..afaa29f9d437182e10e1ba94542b9639a6996550
--- /dev/null
+++ b/spack/packages/geant4/birks.patch
@@ -0,0 +1,36 @@
+diff --git a/source/processes/electromagnetic/utils/src/G4EmSaturation.cc b/source/processes/electromagnetic/utils/src/G4EmSaturation.cc
+index 9fb850dd7c..a67b31ced8 100644
+--- a/source/processes/electromagnetic/utils/src/G4EmSaturation.cc
++++ b/source/processes/electromagnetic/utils/src/G4EmSaturation.cc
+@@ -269,7 +269,7 @@ void G4EmSaturation::DumpG4BirksCoefficients()
+ 
+ void G4EmSaturation::InitialiseG4materials()
+ {
+-  nG4Birks = 4;
++  nG4Birks = 10;
+   g4MatData.reserve(nG4Birks);
+ 
+   // M.Hirschberg et al., IEEE Trans. Nuc. Sci. 39 (1992) 511
+@@ -306,6 +306,22 @@ void G4EmSaturation::InitialiseG4materials()
+   g4MatNames.push_back("G4_PbWO4");
+   g4MatData.push_back(0.0333333*mm/MeV);
+ 
++  g4MatNames.push_back("polystyrene");
++  g4MatData.push_back(0.07943*mm/MeV);
++  g4MatNames.push_back("Polystyrene");
++  g4MatData.push_back(0.07943*mm/MeV);
++
++  g4MatNames.push_back("PlasticScint");
++  g4MatData.push_back(0.126*mm/MeV);
++  g4MatNames.push_back("PlasticScintillator");
++  g4MatData.push_back(0.126*mm/MeV);
++
++  g4MatNames.push_back("PlasticScint079");
++  g4MatData.push_back(0.126*mm/MeV);
++
++  g4MatNames.push_back("PlasticScint153");
++  g4MatData.push_back(0.153*mm/MeV);
++
+   //G4_Lucite
+ 
+ }
diff --git a/spack/packages/geant4/cxx17.patch b/spack/packages/geant4/cxx17.patch
new file mode 100644
index 0000000000000000000000000000000000000000..3845e9e20bb6534467f6713285817b11310ee30d
--- /dev/null
+++ b/spack/packages/geant4/cxx17.patch
@@ -0,0 +1,22 @@
+diff -Naur geant4.10.03.p03/cmake/Modules/Geant4LibraryBuildOptions.cmake geant4.10.03.p03/cmake/Modules/Geant4LibraryBuildOptions.cmake
+--- geant4.10.03.p03/cmake/Modules/Geant4LibraryBuildOptions.cmake	2017-10-20 06:30:46.000000000 -0500
++++ geant4.10.03.p03/cmake/Modules/Geant4LibraryBuildOptions.cmake	2018-04-16 16:48:02.194321171 -0500
+@@ -76,7 +76,7 @@
+ # Mark as advanced because most users will not need it
+ enum_option(GEANT4_BUILD_CXXSTD
+   DOC "C++ Standard to compile against"
+-  VALUES 11 14 c++11 c++14
++  VALUES 11 14 17 c++11 c++14 c++17
+   CASE_INSENSITIVE
+   )
+ 
+@@ -106,6 +106,9 @@
+ 
+ # Add Definition to flags for temporary back compatibility
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DG4USE_STD11")
++if(GEANT4_BUILD_CXXSTD GREATER 14)
++  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_LIBCPP_ENABLE_CXX17_REMOVED_FEATURES=1")
++endif()
+ 
+ # Hold any appropriate compile flag(s) in variable for later export to
+ # config files. Needed to support late CMake 2.8 where compile features
diff --git a/spack/packages/geant4/cxx17_geant4_10_0.patch b/spack/packages/geant4/cxx17_geant4_10_0.patch
new file mode 100644
index 0000000000000000000000000000000000000000..228985ebc446c30acf7975f3280e7f4be9431d27
--- /dev/null
+++ b/spack/packages/geant4/cxx17_geant4_10_0.patch
@@ -0,0 +1,22 @@
+diff -Naur geant4/cmake/Modules/G4BuildSettings.cmake geant4/cmake/Modules/G4BuildSettings.cmake
+--- geant4/cmake/Modules/G4BuildSettings.cmake	2017-10-20 06:30:46.000000000 -0500
++++ geant4/cmake/Modules/G4BuildSettings.cmake	2018-04-16 16:48:02.194321171 -0500
+@@ -76,7 +76,7 @@
+ # Mark as advanced because most users will not need it
+ enum_option(GEANT4_BUILD_CXXSTD
+   DOC "C++ Standard to compile against"
+-  VALUES 11 14 c++11 c++14
++  VALUES 11 14 17 c++11 c++14 c++17
+   CASE_INSENSITIVE
+   )
+ 
+@@ -106,6 +106,9 @@
+ 
+ # Add Definition to flags for temporary back compatibility
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DG4USE_STD11")
++if(GEANT4_BUILD_CXXSTD GREATER 14)
++  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_LIBCPP_ENABLE_CXX17_REMOVED_FEATURES=1")
++endif()
+ 
+ # Hold any appropriate compile flag(s) in variable for later export to
+ # config files. Needed to support late CMake 2.8 where compile features
diff --git a/spack/packages/geant4/geant4-10.4.3-cxx17-removed-features.patch b/spack/packages/geant4/geant4-10.4.3-cxx17-removed-features.patch
new file mode 100644
index 0000000000000000000000000000000000000000..a4938876794fab4c60ab35102fb25da84159192f
--- /dev/null
+++ b/spack/packages/geant4/geant4-10.4.3-cxx17-removed-features.patch
@@ -0,0 +1,18 @@
+diff --git a/cmake/Modules/G4BuildSettings.cmake b/cmake/Modules/G4BuildSettings.cmake
+index f68cb0a44..6bf4b6948 100644
+--- a/cmake/Modules/G4BuildSettings.cmake
++++ b/cmake/Modules/G4BuildSettings.cmake
+@@ -205,6 +205,13 @@ endif()
+ # Add Definition to flags for temporary back compatibility
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DG4USE_STD11")
+ 
++# Spack patch to support use of C++ features deprecated/removed in C++17
++# Only checked on AppleClang for now
++if(GEANT4_BUILD_CXXSTD GREATER 14)
++  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_LIBCPP_ENABLE_CXX17_REMOVED_FEATURES=1")
++endif()
++#----
++
+ # Hold any appropriate compile flag(s) in variable for later export to
+ # config files. Needed to support clients using late CMake 2.8 where compile features
+ # are not available.
diff --git a/spack/packages/geant4/package.py b/spack/packages/geant4/package.py
new file mode 100644
index 0000000000000000000000000000000000000000..beabb6b8e0644e81c6a80e186a9d8614a620313d
--- /dev/null
+++ b/spack/packages/geant4/package.py
@@ -0,0 +1,181 @@
+# 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 Geant4(CMakePackage):
+    """Geant4 is a toolkit for the simulation of the passage of particles
+    through matter. Its areas of application include high energy, nuclear
+    and accelerator physics, as well as studies in medical and space
+    science."""
+
+    homepage = "http://geant4.cern.ch/"
+    url = "https://gitlab.cern.ch/geant4/geant4/-/archive/v10.7.1/geant4-v10.7.1.tar.gz"
+
+    tags = ['hep']
+
+    maintainers = ['drbenmorgan']
+
+    version('10.7.2', sha256='593fc85883a361487b17548ba00553501f66a811b0a79039276bb75ad59528cf')
+    version('10.7.1', sha256='2aa7cb4b231081e0a35d84c707be8f35e4edc4e97aad2b233943515476955293')
+    version('10.7.0', sha256='c991a139210c7f194720c900b149405090058c00beb5a0d2fac5c40c42a262d4')
+    version('10.6.3', sha256='bf96d6d38e6a0deabb6fb6232eb00e46153134da645715d636b9b7b4490193d3')
+    version('10.6.2', sha256='e381e04c02aeade1ed8cdd9fdbe7dcf5d6f0f9b3837a417976b839318a005dbd')
+    version('10.6.1', sha256='4fd64149ae26952672a81ce5579d3806fda4bd251d486897093ac57633a42b7e')
+    version('10.6.0', sha256='eebe6a170546064ff81ab3b00f513ccd1d4122a026514982368d503ac55a4ee4')
+    version('10.5.1', sha256='2397eb859dc4de095ff66059d8bda9f060fdc42e10469dd7890946293eeb0e39')
+    version('10.4.3', sha256='67f3bb6405a2c77e573936c2b933f5a4a33915aa379626a2eb3012009b91e1da')
+    version('10.4.0', sha256='e919b9b0a88476e00c0b18ab65d40e6a714b55ee4778f66bac32a5396c22aa74')
+    version('10.3.3', sha256='bcd36a453da44de9368d1d61b0144031a58e4b43a6d2d875e19085f2700a89d8')
+
+    _cxxstd_values = ('11', '14', '17')
+    variant('cxxstd',
+            default=_cxxstd_values[0],
+            values=_cxxstd_values,
+            multi=False,
+            description='Use the specified C++ standard when building.')
+
+    variant('threads', default=True, description='Build with multithreading')
+    variant('vecgeom', default=False, description='Enable vecgeom support')
+    variant('opengl', default=False, description='Optional OpenGL support')
+    variant('x11', default=False, description='Optional X11 support')
+    variant('motif', default=False, description='Optional motif support')
+    variant('qt', default=False, description='Enable Qt support')
+    variant('python', default=False, description='Enable Python bindings')
+
+    depends_on('cmake@3.5:', type='build')
+    depends_on('cmake@3.8:', type='build', when='@10.6.0:')
+
+    depends_on('geant4-data@10.7.2', when='@10.7.2')
+    depends_on('geant4-data@10.7.1', when='@10.7.1')
+    depends_on('geant4-data@10.7.0', when='@10.7.0')
+    depends_on('geant4-data@10.6.3', when='@10.6.3')
+    depends_on('geant4-data@10.6.2', when='@10.6.2')
+    depends_on('geant4-data@10.6.1', when='@10.6.1')
+    depends_on('geant4-data@10.6.0', when='@10.6.0')
+    depends_on('geant4-data@10.5.1', when='@10.5.1')
+    depends_on('geant4-data@10.4.3', when='@10.4.3')
+    depends_on('geant4-data@10.4.0', when='@10.4.0')
+    depends_on('geant4-data@10.3.3', when='@10.3.3')
+
+    depends_on("expat")
+    depends_on("zlib")
+
+    # Python, with boost requirement dealt with in cxxstd section
+    depends_on('python@3:', when='+python')
+    extends('python', when='+python')
+    conflicts('+python', when='@:10.6.1',
+              msg='Geant4 <= 10.6.1 cannot be built with Python bindings')
+
+    for std in _cxxstd_values:
+        # CLHEP version requirements to be reviewed
+        depends_on('clhep@2.4.4.0: cxxstd=' + std,
+                   when='@10.7.0: cxxstd=' + std)
+
+        depends_on('clhep@2.3.3.0: cxxstd=' + std,
+                   when='@10.3.3:10.6.99 cxxstd=' + std)
+
+        # Spack only supports Xerces-c 3 and above, so no version req
+        depends_on('xerces-c netaccessor=curl cxxstd=' + std, when='cxxstd=' + std)
+
+        # Vecgeom specific versions for each Geant4 version
+        depends_on('vecgeom@1.1.8 cxxstd=' + std,
+                   when='@10.7.0: +vecgeom cxxstd=' + std)
+        depends_on('vecgeom@1.1.5 cxxstd=' + std,
+                   when='@10.6.0:10.6.99 +vecgeom cxxstd=' + std)
+        depends_on('vecgeom@1.1.0 cxxstd=' + std,
+                   when='@10.5.0:10.5.99 +vecgeom cxxstd=' + std)
+        depends_on('vecgeom@0.5.2 cxxstd=' + std,
+                   when='@10.4.0:10.4.99 +vecgeom cxxstd=' + std)
+        depends_on('vecgeom@0.3rc cxxstd=' + std,
+                   when='@10.3.0:10.3.99 +vecgeom cxxstd=' + std)
+
+        # Boost.python, conflict handled earlier
+        depends_on('boost@1.70: +python cxxstd=' + std,
+                   when='+python cxxstd=' + std)
+
+    # Visualization driver dependencies
+    depends_on("gl", when='+opengl')
+    depends_on("glu", when='+opengl')
+    depends_on("glx", when='+opengl+x11')
+    depends_on("libx11", when='+x11')
+    depends_on("libxmu", when='+x11')
+    depends_on("motif", when='+motif')
+    depends_on("qt@5: +opengl", when="+qt")
+
+    # As released, 10.03.03 has issues with respect to using external
+    # CLHEP.
+    patch('CLHEP-10.03.03.patch', level=1, when='@10.3.3')
+    # These patches can be applied independent of the cxxstd value?
+    patch('cxx17.patch', when='@:10.3.99 cxxstd=17')
+    patch('cxx17_geant4_10_0.patch', level=1, when='@10.4.0 cxxstd=17')
+    patch('geant4-10.4.3-cxx17-removed-features.patch',
+          level=1, when='@10.4.3 cxxstd=17')
+
+    ## Add to the hardcoded GEANT4 Birk's constants
+    patch('birks.patch', when='@10.7.0:')
+
+    def cmake_args(self):
+        spec = self.spec
+
+        # Core options
+        options = [
+            self.define_from_variant('GEANT4_BUILD_CXXSTD', 'cxxstd'),
+            '-DGEANT4_USE_SYSTEM_CLHEP=ON',
+            '-DGEANT4_USE_SYSTEM_EXPAT=ON',
+            '-DGEANT4_USE_SYSTEM_ZLIB=ON',
+            '-DGEANT4_USE_G3TOG4=ON',
+            '-DGEANT4_USE_GDML=ON',
+            '-DXERCESC_ROOT_DIR={0}'.format(spec['xerces-c'].prefix)
+        ]
+
+        # Don't install the package cache file as Spack will set
+        # up CMAKE_PREFIX_PATH etc for the dependencies
+        if spec.version > Version('10.5.99'):
+            options.append('-DGEANT4_INSTALL_PACKAGE_CACHE=OFF')
+
+        # Multithreading
+        options.append(self.define_from_variant('GEANT4_BUILD_MULTITHREADED',
+                                                'threads'))
+        if '+threads' in spec:
+            # Locked at global-dynamic to allow use cases that load the
+            # geant4 libs at application runtime
+            options.append('-DGEANT4_BUILD_TLS_MODEL=global-dynamic')
+
+        # install the data with geant4
+        datadir = spec['geant4-data'].prefix.share
+        dataver = '{0}-{1}'.format(spec['geant4-data'].name,
+                                   spec['geant4-data'].version.dotted)
+        datapath = join_path(datadir, dataver)
+        options.append('-DGEANT4_INSTALL_DATADIR={0}'.format(datapath))
+
+        # Vecgeom
+        if '+vecgeom' in spec:
+            options.append('-DGEANT4_USE_USOLIDS=ON')
+            options.append('-DUSolids_DIR=%s' % spec[
+                'vecgeom'].prefix.lib.CMake.USolids)
+
+        # Visualization options
+        if 'platform=darwin' not in spec:
+            if "+x11" in spec and "+opengl" in spec:
+                options.append('-DGEANT4_USE_OPENGL_X11=ON')
+            if "+motif" in spec and "+opengl" in spec:
+                options.append('-DGEANT4_USE_XM=ON')
+            if "+x11" in spec:
+                options.append('-DGEANT4_USE_RAYTRACER_X11=ON')
+
+        if '+qt' in spec:
+            options.append('-DGEANT4_USE_QT=ON')
+            options.append(
+                '-DQT_QMAKE_EXECUTABLE=%s' %
+                spec['qt'].prefix.bin.qmake)
+
+        # Python
+        if spec.version > Version('10.6.1'):
+            options.append(self.define_from_variant('GEANT4_USE_PYTHON',
+                                                    'python'))
+
+        return options