diff --git a/DDCore/include/DD4hep/CartesianGridXYZ.h b/DDCore/include/DD4hep/CartesianGridXYZ.h
index f4cec8dd0619a9f751904d81bd2679c45418324a..ad895266009b13909c29c4c48c5efade6c13a9ce 100644
--- a/DDCore/include/DD4hep/CartesianGridXYZ.h
+++ b/DDCore/include/DD4hep/CartesianGridXYZ.h
@@ -105,7 +105,7 @@ namespace dd4hep {
 
         Returns a vector of the cellDimensions of the given cell ID
         \param cellID is ignored as all cells have the same dimension
-        \return std::vector<double> size 2:
+        \return std::vector<double> size 3:
         -# size in x
         -# size in y
         -# size in z
diff --git a/DDCore/include/DD4hep/CylindricalGridPhiZ.h b/DDCore/include/DD4hep/CylindricalGridPhiZ.h
new file mode 100644
index 0000000000000000000000000000000000000000..c6fb386c8cc83d08e54f6accee3cc38b101af35d
--- /dev/null
+++ b/DDCore/include/DD4hep/CylindricalGridPhiZ.h
@@ -0,0 +1,111 @@
+//==========================================================================
+//  AIDA Detector description implementation 
+//--------------------------------------------------------------------------
+// Copyright (C) Organisation europeenne pour la Recherche nucleaire (CERN)
+// All rights reserved.
+//
+// For the licensing terms see $DD4hepINSTALL/LICENSE.
+// For the list of contributors see $DD4hepINSTALL/doc/CREDITS.
+//
+//  \author   Markus Frank
+//  \date     2016-10-18
+//  \version  1.0
+//
+//==========================================================================
+#ifndef DD4HEP_CYLINDRICALGRIDPHIZ_H
+#define DD4HEP_CYLINDRICALGRIDPHIZ_H 1
+
+// Framework include files
+#include <DD4hep/Segmentations.h>
+
+/// Namespace for the AIDA detector description toolkit
+namespace dd4hep {
+
+  /// Namespace for base segmentations
+  namespace DDSegmentation  {    class CylindricalGridPhiZ;  }
+    
+  /// We need some abbreviation to make the code more readable.
+  typedef Handle<SegmentationWrapper<DDSegmentation::CylindricalGridPhiZ> > CylindricalGridPhiZHandle;
+ 
+  /// Implementation class for the grid PhiZ segmentation.
+  /**
+   *  Concrete user handle to serve specific needs of client code
+   *  which requires access to the base functionality not served
+   *  by the super-class Segmentation.
+   *
+   *  Note:
+   *  We only check the validity of the underlying handle.
+   *  If for whatever reason the implementation object is not valid
+   *  This is not checked.
+   *  In principle this CANNOT happen unless some brain-dead has
+   *  fiddled with the handled object directly.....
+   *
+   *  Note:
+   *  The handle base corrsponding to this object in for
+   *  conveniance reasons instantiated in dd4hep/src/Segmentations.cpp.
+   *
+   *  \author  M.Frank
+   *  \version 1.0
+   *  \ingroup DD4HEP_CORE
+   */
+  class CylindricalGridPhiZ : public  CylindricalGridPhiZHandle {
+  public:
+    /// Default constructor
+    CylindricalGridPhiZ() = default;
+    /// Copy constructor
+    CylindricalGridPhiZ(const CylindricalGridPhiZ& e) = default;
+    /// Copy Constructor from segmentation base object
+    CylindricalGridPhiZ(const Segmentation& e) : Handle<Object>(e) {}
+    /// Copy constructor from handle
+    CylindricalGridPhiZ(const Handle<Object>& e) : Handle<Object>(e) {}
+    /// Copy constructor from other polymorph/equivalent handle
+    template <typename Q>
+    CylindricalGridPhiZ(const Handle<Q>& e) : Handle<Object>(e) {}
+    /// Assignment operator
+    CylindricalGridPhiZ& operator=(const CylindricalGridPhiZ& seg) = default;
+    /// Equality operator
+    bool operator==(const CylindricalGridPhiZ& seg) const
+    {  return m_element == seg.m_element;           }
+
+    /// determine the position based on the cell ID
+    Position position(const CellID& cellID) const;
+    /// determine the cell ID based on the position
+    CellID cellID(const Position& local, const Position& global, const VolumeID& volID) const;
+    /// access the grid size in phi
+    double gridSizePhi() const;
+    /// access the grid size in Z
+    double gridSizeZ() const;
+    /// access the radius
+    double radius() const;
+    /// access the coordinate offset in phi
+    double offsetPhi() const;
+    /// access the coordinate offset in Z
+    double offsetZ() const;
+    
+    /// set the grid size in phi
+    void setGridSizePhi(double cellSize) const;
+    /// set the grid size in Z
+    void setGridSizeZ(double cellSize) const;
+    /// set the coordinate offset in phi
+    void setOffsetPhi(double offset) const;
+    /// set the coordinate offset in Z
+    void setOffsetZ(double offset) const;
+    /// set the radius
+    void setRadius(double radius);
+    /// access the field name used for phi
+    const std::string& fieldNamePhi() const;
+    /// access the field name used for Z
+    const std::string& fieldNameZ() const;
+    /** \brief Returns a vector<double> of the cellDimensions of the given cell ID
+        in natural order of dimensions, e.g., dx/dy/dz, or dr/r*dPhi
+
+        Returns a vector of the cellDimensions of the given cell ID
+        \param cellID is ignored as all cells have the same dimension
+        \return std::vector<double> size 2:
+        -# size in x
+        -# size in z
+    */
+    std::vector<double> cellDimensions(const CellID& cellID) const;
+  };
+}       /* End namespace dd4hep                */
+#endif // DD4HEP_CYLINDRICALGRIDPHIZ_H
diff --git a/DDCore/include/DDSegmentation/CylindricalGridPhiZ.h b/DDCore/include/DDSegmentation/CylindricalGridPhiZ.h
new file mode 100644
index 0000000000000000000000000000000000000000..a02d01d473af6f0d0cc2a949629506abcae9e46d
--- /dev/null
+++ b/DDCore/include/DDSegmentation/CylindricalGridPhiZ.h
@@ -0,0 +1,127 @@
+//==========================================================================
+//  AIDA Detector description implementation 
+//--------------------------------------------------------------------------
+// Copyright (C) Organisation europeenne pour la Recherche nucleaire (CERN)
+// All rights reserved.
+//
+// For the licensing terms see $DD4hepINSTALL/LICENSE.
+// For the list of contributors see $DD4hepINSTALL/doc/CREDITS.
+//
+//==========================================================================
+/*
+ * CylindricalGridPhiZ.h
+ *
+ *  Created on: Jun 28, 2024
+ *      Author: Yann Bedfer, ePIC/Saclay
+ */
+
+#ifndef DDSEGMENTATION_CYLINDRICALGRIDPHIZ_H
+#define DDSEGMENTATION_CYLINDRICALGRIDPHIZ_H
+
+#include <DDSegmentation/CylindricalSegmentation.h>
+
+namespace dd4hep {
+  namespace DDSegmentation {
+
+    /// Segmentation base class describing cylindrical grid segmentation in the Phi-Z cylinder
+    class CylindricalGridPhiZ: public CylindricalSegmentation {
+    public:
+      /// default constructor using an arbitrary type
+      CylindricalGridPhiZ(const std::string& cellEncoding);
+      /// Default constructor used by derived classes passing an existing decoder
+      CylindricalGridPhiZ(const BitFieldCoder* decoder);
+      /// destructor
+      virtual ~CylindricalGridPhiZ();
+
+      /// determine the local based on the cell ID
+      virtual Vector3D position(const CellID& cellID) const;
+      /// determine the cell ID based on the position
+      virtual CellID cellID(const Vector3D& localPosition, const Vector3D& globalPosition, const VolumeID& volumeID) const;
+      /// access the grid size in phi
+      double gridSizePhi() const {
+        return _gridSizePhi;
+      }
+      /// access the grid size in Z
+      double gridSizeZ() const {
+        return _gridSizeZ;
+      }
+      /// access the coordinate offset in phi
+      double offsetPhi() const {
+        return _offsetPhi;
+      }
+      /// access the coordinate offset in Z
+      double offsetZ() const {
+        return _offsetZ;
+      }
+      /// access the radius
+      double radius() const {
+        return _radius;
+      }
+      /// access the field name used for phi
+      const std::string& fieldNamePhi() const {
+        return _phiId;
+      }
+      /// access the field name used for Z
+      const std::string& fieldNameZ() const {
+        return _zId;
+      }
+      /// set the grid size in phi
+      void setGridSizePhi(double cellSize) {
+        _gridSizePhi = cellSize;
+      }
+      /// set the grid size in Z
+      void setGridSizeZ(double cellSize) {
+        _gridSizeZ = cellSize;
+      }
+      /// set the coordinate offset in phi
+      void setOffsetPhi(double offset) {
+        _offsetPhi = offset;
+      }
+      /// set the coordinate offset in Z
+      void setOffsetZ(double offset) {
+        _offsetZ = offset;
+      }
+      /// set the radius
+      void setRadius(double radius) {
+        _radius = radius;
+      }
+      /// set the field name used for phi
+      void setFieldNamePhi(const std::string& fieldName) {
+        _phiId = fieldName;
+      }
+      /// set the field name used for Z
+      void setFieldNameZ(const std::string& fieldName) {
+        _zId = fieldName;
+      }
+      /** \brief Returns a vector<double> of the cellDimensions of the given cell ID
+          in natural order of dimensions, e.g., dx/dy/dz, or dr/r*dPhi
+
+          Returns a vector of the cellDimensions of the given cell ID
+          \param cellID is ignored as all cells have the same dimension
+          \return std::vector<double> size 2:
+          -# size in x
+          -# size in z
+      */
+      virtual std::vector<double> cellDimensions(const CellID& cellID) const;
+
+    protected:
+      /// the grid size in phi
+      double _gridSizePhi;
+      /// the coordinate offset in phi
+      double _offsetPhi;
+      /// the grid size in Z
+      double _gridSizeZ;
+      /// the coordinate offset in Z
+      double _offsetZ;
+      /// the radius
+      double _radius;
+      /// the field name used for phi
+      std::string _phiId;
+      /// the field name used for Z
+      std::string _zId;
+      /// encoding field used for the module
+    };
+
+  } /* namespace DDSegmentation */
+} /* namespace dd4hep */
+#endif // DDSEGMENTATION_CYLINDRICALGRIDPHIZ_H
diff --git a/DDCore/include/DDSegmentation/CylindricalSegmentation.h b/DDCore/include/DDSegmentation/CylindricalSegmentation.h
index 84ce8e7a59ec7c3f67f743d1782c3442545580d0..47deece4205e3e442c02ca49e3461ce893233758 100644
--- a/DDCore/include/DDSegmentation/CylindricalSegmentation.h
+++ b/DDCore/include/DDSegmentation/CylindricalSegmentation.h
@@ -26,14 +26,14 @@
 namespace dd4hep {
   namespace DDSegmentation {
 
-    /// Segmentation base class describing a cyliondrical segmentation
+    /// Segmentation base class describing a cylindrical grid segmentation
     class CylindricalSegmentation: public Segmentation {
     public:
-      /// destructor
+      /// Destructor
       virtual ~CylindricalSegmentation();
 
     protected:
-      /// default constructor using an arbitrary type
+      /// Default constructor using an arbitrary type
       CylindricalSegmentation(const std::string& cellEncoding);
       /// Default constructor used by derived classes passing an existing decoder
       CylindricalSegmentation(const BitFieldCoder* decoder);
diff --git a/DDCore/src/CylindricalGridPhiZ.cpp b/DDCore/src/CylindricalGridPhiZ.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..364f6e212d52c88c1c983af55b17c32f7328b838
--- /dev/null
+++ b/DDCore/src/CylindricalGridPhiZ.cpp
@@ -0,0 +1,94 @@
+//==========================================================================
+//  AIDA Detector description implementation 
+//--------------------------------------------------------------------------
+// Copyright (C) Organisation europeenne pour la Recherche nucleaire (CERN)
+// All rights reserved.
+//
+// For the licensing terms see $DD4hepINSTALL/LICENSE.
+// For the list of contributors see $DD4hepINSTALL/doc/CREDITS.
+//
+// Author     : M.Frank
+//
+//==========================================================================
+
+// Framework include files
+#include <DD4hep/CylindricalGridPhiZ.h>
+#include <DDSegmentation/CylindricalGridPhiZ.h>
+
+using namespace dd4hep;
+
+/// determine the position based on the cell ID
+Position CylindricalGridPhiZ::position(const CellID& id) const   {
+  return Position(access()->implementation->position(id));
+}
+
+/// determine the cell ID based on the position
+dd4hep::CellID CylindricalGridPhiZ::cellID(const Position& local,
+                               const Position& global,
+                               const VolumeID& volID) const
+{
+  return access()->implementation->cellID(local, global, volID);
+}
+
+/// access the grid size in phi
+double CylindricalGridPhiZ::gridSizePhi() const {
+  return access()->implementation->gridSizePhi();
+}
+
+/// access the grid size in Z
+double CylindricalGridPhiZ::gridSizeZ() const {
+  return access()->implementation->gridSizeZ();
+}
+
+/// set the grid size in phi
+void CylindricalGridPhiZ::setGridSizePhi(double cellSize) const   {
+  access()->implementation->setGridSizePhi(cellSize);
+}
+
+/// set the grid size in Z
+void CylindricalGridPhiZ::setGridSizeZ(double cellSize) const   {
+  access()->implementation->setGridSizeZ(cellSize);
+}
+
+/// access the coordinate offset in phi
+double CylindricalGridPhiZ::offsetPhi() const {
+  return access()->implementation->offsetPhi();
+}
+
+/// access the coordinate offset in Z
+double CylindricalGridPhiZ::offsetZ() const {
+  return access()->implementation->offsetZ();
+}
+
+/// set the coordinate offset in phi
+void CylindricalGridPhiZ::setOffsetPhi(double offset) const   {
+  access()->implementation->setOffsetPhi(offset);
+}
+
+/// set the coordinate offset in Z
+void CylindricalGridPhiZ::setOffsetZ(double offset) const   {
+  access()->implementation->setOffsetZ(offset);
+}
+
+/// access the field name used for phi
+const std::string& CylindricalGridPhiZ::fieldNamePhi() const {
+  return access()->implementation->fieldNamePhi();
+}
+
+/// access the field name used for Z
+const std::string& CylindricalGridPhiZ::fieldNameZ() const {
+  return access()->implementation->fieldNameZ();
+}
+
+/** \brief Returns a vector<double> of the cellDimensions of the given cell ID
+    in natural order of dimensions, e.g., dx/dy/dz, or dr/r*dPhi
+
+    Returns a vector of the cellDimensions of the given cell ID
+    \param cellID is ignored as all cells have the same dimension
+    \return vector<double> size 2:
+    -# size in x
+    -# size in z
+*/
+std::vector<double> CylindricalGridPhiZ::cellDimensions(const CellID& id) const  {
+  return access()->implementation->cellDimensions(id);
+}
diff --git a/DDCore/src/SegmentationDictionary.h b/DDCore/src/SegmentationDictionary.h
index 8a710cf095e3e5e3190c34a64e54090063902a0d..c8c7e0aa005b8d6f4469f37255663f5af797948c 100644
--- a/DDCore/src/SegmentationDictionary.h
+++ b/DDCore/src/SegmentationDictionary.h
@@ -31,6 +31,7 @@
 #include <DDSegmentation/CartesianStripY.h>
 #include <DDSegmentation/CartesianStripZ.h>
 #include <DDSegmentation/CylindricalSegmentation.h>
+#include <DDSegmentation/CylindricalGridPhiZ.h>
 #include <DDSegmentation/GridPhiEta.h>
 #include <DDSegmentation/GridRPhiEta.h>
 #include <DDSegmentation/MegatileLayerGridXY.h>
@@ -77,6 +78,7 @@ typedef dd4hep::DDSegmentation::CellID CellID;
 #pragma link C++ class dd4hep::DDSegmentation::CartesianStripY+;
 #pragma link C++ class dd4hep::DDSegmentation::CartesianStripZ+;
 #pragma link C++ class dd4hep::DDSegmentation::CylindricalSegmentation+;
+#pragma link C++ class dd4hep::DDSegmentation::CylindricalGridPhiZ+;
 #pragma link C++ class dd4hep::DDSegmentation::GridPhiEta+;
 #pragma link C++ class dd4hep::DDSegmentation::GridRPhiEta+;
 #pragma link C++ class dd4hep::DDSegmentation::MegatileLayerGridXY+;
diff --git a/DDCore/src/Segmentations.cpp b/DDCore/src/Segmentations.cpp
index 55a4d3bacc307667f97f5d72277935589d40e721..789967aeafece0b1d813a1c1090c807ba49bc5de 100644
--- a/DDCore/src/Segmentations.cpp
+++ b/DDCore/src/Segmentations.cpp
@@ -173,3 +173,6 @@ DD4HEP_INSTANTIATE_SEGMENTATION_HANDLE(DDSegmentation::ProjectiveCylinder);
 
 #include <DDSegmentation/MultiSegmentation.h>
 DD4HEP_INSTANTIATE_SEGMENTATION_HANDLE(DDSegmentation::MultiSegmentation);
+
+#include <DDSegmentation/CylindricalGridPhiZ.h>
+DD4HEP_INSTANTIATE_SEGMENTATION_HANDLE(DDSegmentation::CylindricalGridPhiZ);
diff --git a/DDCore/src/plugins/ReadoutSegmentations.cpp b/DDCore/src/plugins/ReadoutSegmentations.cpp
index edfd47aea896bb9b5eb4655ed463e3489df0830e..8a1d506943359c2c62e38f061710c6b98405575a 100644
--- a/DDCore/src/plugins/ReadoutSegmentations.cpp
+++ b/DDCore/src/plugins/ReadoutSegmentations.cpp
@@ -81,3 +81,6 @@ DECLARE_SEGMENTATION(MultiSegmentation,create_segmentation<dd4hep::DDSegmentatio
 
 #include <DDSegmentation/HexGrid.h>
 DECLARE_SEGMENTATION(HexGrid,create_segmentation<dd4hep::DDSegmentation::HexGrid>)
+
+#include <DDSegmentation/CylindricalGridPhiZ.h>
+DECLARE_SEGMENTATION(CylindricalGridPhiZ,create_segmentation<dd4hep::DDSegmentation::CylindricalGridPhiZ>)
diff --git a/DDCore/src/segmentations/CylindricalGridPhiZ.cpp b/DDCore/src/segmentations/CylindricalGridPhiZ.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..e0cee722cde4c20d3d8e4fa318da9b2b99e856d1
--- /dev/null
+++ b/DDCore/src/segmentations/CylindricalGridPhiZ.cpp
@@ -0,0 +1,106 @@
+//==========================================================================
+//  AIDA Detector description implementation 
+//--------------------------------------------------------------------------
+// Copyright (C) Organisation europeenne pour la Recherche nucleaire (CERN)
+// All rights reserved.
+//
+// For the licensing terms see $DD4hepINSTALL/LICENSE.
+// For the list of contributors see $DD4hepINSTALL/doc/CREDITS.
+//
+//==========================================================================
+/*
+ * CylindricalGridPhiZ.cpp
+ *
+ *  Created on: Jun 28, 2024
+ *      Author: Yann Bedfer, ePIC/Saclay
+ */
+
+#include <DDSegmentation/CylindricalGridPhiZ.h>
+
+namespace dd4hep {
+namespace DDSegmentation {
+
+using std::make_pair;
+using std::vector;
+
+/// default constructor using an encoding string
+CylindricalGridPhiZ::CylindricalGridPhiZ(const std::string& cellEncoding) :
+	CylindricalSegmentation(cellEncoding) {
+	// define type and description
+	_type = "CylindricalGridPhiZ";
+	_description = "Cylindrical segmentation in the local PhiZ-cylinder";
+
+	// register all necessary parameters
+	registerParameter("grid_size_phi", "Cell size in phi", _gridSizePhi, 1., SegmentationParameter::AngleUnit);
+	registerParameter("grid_size_z",   "Cell size in Z",   _gridSizeZ,   1., SegmentationParameter::LengthUnit);
+	registerParameter("offset_phi", "Cell offset in phi", _offsetPhi,    0., SegmentationParameter::AngleUnit, true);
+	registerParameter("offset_z",   "Cell offset in Z",   _offsetZ,      0., SegmentationParameter::LengthUnit, true);
+	registerParameter("radius",     "Radius of Cylinder", _radius,       0., SegmentationParameter::LengthUnit);
+	registerIdentifier("identifier_phi", "Cell ID identifier for phi", _phiId, "phi");
+	registerIdentifier("identifier_z",   "Cell ID identifier for Z",   _zId,   "z");
+}
+
+/// Default constructor used by derived classes passing an existing decoder
+CylindricalGridPhiZ::CylindricalGridPhiZ(const BitFieldCoder* decode) :
+	CylindricalSegmentation(decode) {
+	// define type and description
+	_type = "CylindricalGridPhiZ";
+	_description = "Cylindrical segmentation in the local PhiZ-cylinder";
+
+	// register all necessary parameters
+	registerParameter("grid_size_phi", "Cell size in phi", _gridSizePhi, 1., SegmentationParameter::AngleUnit);
+	registerParameter("grid_size_z",   "Cell size in Z",   _gridSizeZ,   1., SegmentationParameter::LengthUnit);
+	registerParameter("offset_phi", "Cell offset in phi", _offsetPhi,    0., SegmentationParameter::AngleUnit, true);
+	registerParameter("offset_z",   "Cell offset in Z",   _offsetZ,      0., SegmentationParameter::LengthUnit, true);
+	registerParameter("radius",     "Radius of Cylinder", _radius,       0., SegmentationParameter::LengthUnit);
+	registerIdentifier("identifier_phi", "Cell ID identifier for phi", _phiId, "phi");
+	registerIdentifier("identifier_z",   "Cell ID identifier for Z",   _zId,   "z");
+}
+
+/// destructor
+CylindricalGridPhiZ::~CylindricalGridPhiZ() {
+
+}
+
+/// determine the position based on the cell ID
+Vector3D CylindricalGridPhiZ::position(const CellID& cID) const {
+	vector<double> localPosition(3);
+	Vector3D cellPosition;
+	double phi =
+	  binToPosition( _decoder->get(cID,_phiId ), _gridSizePhi, _offsetPhi);
+	cellPosition.Z =
+	  binToPosition( _decoder->get(cID,_zId ),   _gridSizeZ,   _offsetZ);
+	const double &R = _radius;
+	cellPosition.X = R*cos(phi); cellPosition.Y = R*sin(phi);
+
+	return cellPosition;
+}
+
+/// determine the cell ID based on the position
+  CellID CylindricalGridPhiZ::cellID(const Vector3D& localPosition, const Vector3D& /* globalPosition */, const VolumeID& vID) const {
+	double phi = atan2(localPosition.Y,localPosition.X);
+	double Z = localPosition.Z;
+	if ( phi < _offsetPhi) {
+	  phi += 2*M_PI;
+	}
+        CellID cID = vID ;
+        _decoder->set( cID,_phiId, positionToBin(phi, _gridSizePhi, _offsetPhi) );
+	_decoder->set( cID,_zId,   positionToBin(Z,   _gridSizeZ,   _offsetZ) );
+
+	return cID ;
+}
+
+std::vector<double> CylindricalGridPhiZ::cellDimensions(const CellID&) const {
+#if __cplusplus >= 201103L
+  return {_gridSizePhi, _gridSizeZ};
+#else
+  std::vector<double> cellDims(2,0.0);
+  cellDims[0] = _radius*_gridSizePhi;
+  cellDims[1] = _gridSizeZ;
+  return cellDims;
+#endif
+}
+
+
+} /* namespace DDSegmentation */
+} /* namespace dd4hep */