diff --git a/DDCore/include/DD4hep/detail/Handle.inl b/DDCore/include/DD4hep/detail/Handle.inl
index 56d1e2f34eff6c9422d1f64286917b7c9e8b6818..44b1eb03f477f18a46a9d6fc1931c1cd35186eec 100644
--- a/DDCore/include/DD4hep/detail/Handle.inl
+++ b/DDCore/include/DD4hep/detail/Handle.inl
@@ -99,21 +99,32 @@ namespace dd4hep {
 
 #endif
 
-// Predefined cast map for shapes
-#define DD4HEP_IMPLEMENT_SAFE_SHAPE_CAST(FROM)                          \
-  DD4HEP_IMPLEMENT_SAFE_CAST(FROM,TGeoShape)                            \
-  DD4HEP_IMPLEMENT_SAFE_CAST(FROM,TGeoBBox)
-
-#define DD4HEP_INSTANTIATE_HANDLE(X)					\
-  DD4HEP_IMPLEMENT_SAFE_NAMED_CAST(X)                                   \
-  template class dd4hep::Handle<X>
-
-#define DD4HEP_INSTANTIATE_SHAPE_HANDLE(X)			        \
-  DD4HEP_IMPLEMENT_SAFE_SHAPE_CAST(X)                                   \
-  DD4HEP_INSTANTIATE_HANDLE(X)
-
-#define DD4HEP_INSTANTIATE_HANDLE_NAMED(X)                              \
-  DD4HEP_IMPLEMENT_SAFE_NAMED_CAST(X)                                   \
+// Utility for counting the number of args in the __VA_ARGS__ pack:
+#define DD4HEP_HANDLE_PP_NARGS(...)  DD4HEP_HANDLE_PP_NARGS2(__VA_ARGS__, DD4HEP_HANDLE_PP_NARGS_COUNT())
+#define DD4HEP_HANDLE_PP_NARGS2(...) DD4HEP_HANDLE_PP_NARGS_IMPL(__VA_ARGS__)
+#define DD4HEP_HANDLE_PP_NARGS_IMPL(x1, x2, x3, x4, x5, x6, x7, x8, x9, N, ...) N
+#define DD4HEP_HANDLE_PP_NARGS_COUNT() 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, ERROR
+
+// Macros to delegate to concrete, defined-arity implementations:
+#define DD4HEP_HANDLE_XF(count, ...)      DD4HEP_HANDLE_XF_IMPL (count, __VA_ARGS__)
+#define DD4HEP_HANDLE_XF_IMPL(count, ...) DD4HEP_HANDLE_XF_ ## count (__VA_ARGS__)
+
+#define DD4HEP_HANDLE_XF_1(CODE,x1)                              DD4HEP_TEMPLATE_HANDLE(CODE,x1)
+#define DD4HEP_HANDLE_XF_2(CODE,x1,x2)                           DD4HEP_IMPLEMENT_SAFE_CAST(x1,x2)  DD4HEP_HANDLE_XF_1(CODE,x1)
+#define DD4HEP_HANDLE_XF_3(CODE,x1,x2,x3)                        DD4HEP_IMPLEMENT_SAFE_CAST(x1,x3)  DD4HEP_HANDLE_XF_2(CODE,x1,x2)
+#define DD4HEP_HANDLE_XF_4(CODE,x1,x2,x3,x4)                     DD4HEP_IMPLEMENT_SAFE_CAST(x1,x4)  DD4HEP_HANDLE_XF_3(CODE,x1,x2,x3)
+#define DD4HEP_HANDLE_XF_5(CODE,x1,x2,x3,x4,x5)                  DD4HEP_IMPLEMENT_SAFE_CAST(x1,x5)  DD4HEP_HANDLE_XF_4(CODE,x1,x2,x3,x4)
+#define DD4HEP_HANDLE_XF_6(CODE,x1,x2,x3,x4,x5,x6)               DD4HEP_IMPLEMENT_SAFE_CAST(x1,x6)  DD4HEP_HANDLE_XF_5(CODE,x1,x2,x3,x4,x5)
+#define DD4HEP_HANDLE_XF_7(CODE,x1,x2,x3,x4,x5,x6,x7)            DD4HEP_IMPLEMENT_SAFE_CAST(x1,x7)  DD4HEP_HANDLE_XF_6(CODE,x1,x2,x3,x4,x5,x6)
+#define DD4HEP_HANDLE_XF_8(CODE,x1,x2,x3,x4,x5,x6,x7,x8)         DD4HEP_IMPLEMENT_SAFE_CAST(x1,x8)  DD4HEP_HANDLE_XF_7(CODE,x1,x2,x3,x4,x5,x6,x7)
+#define DD4HEP_HANDLE_XF_9(CODE,x1,x2,x3,x4,x5,x6,x7,x8,x9)      DD4HEP_IMPLEMENT_SAFE_CAST(x1,x9)  DD4HEP_HANDLE_XF_8(CODE,x1,x2,x3,x4,x5,x6,x7,x8)
+#define DD4HEP_HANDLE_XF_10(CODE,x1,x2,x3,x4,x5,x6,x7,x8,x9,x10) DD4HEP_IMPLEMENT_SAFE_CAST(x1,x10) DD4HEP_HANDLE_XF_9(CODE,x1,x2,x3,x4,x5,x6,x7,x8,x9)
+
+
+#define DD4HEP_TEMPLATE_HANDLE(CODE,X) DD4HEP_TEMPLATE_HANDLE_CODE_##CODE(X) template class dd4hep::Handle<X>
+#define DD4HEP_TEMPLATE_HANDLE_CODE_NONE(X)
+#define DD4HEP_TEMPLATE_HANDLE_CODE_CAST_ONLY(X)       DD4HEP_IMPLEMENT_SAFE_NAMED_CAST(X)
+#define DD4HEP_TEMPLATE_HANDLE_CODE_NAMED(X)                            \
   namespace dd4hep {                                                    \
     template <> const char* Handle<X>::name() const			\
     { return this->m_element ? this->m_element->name.c_str() : ""; }	\
@@ -122,32 +133,40 @@ namespace dd4hep {
       this->m_element = p;						\
       p->name = n;							\
       p->type = t;							\
-    }}  								\
-  template class dd4hep::Handle<X>
+    }}                                                                  \
+    DD4HEP_IMPLEMENT_SAFE_NAMED_CAST(X)
 
-#define DD4HEP_INSTANTIATE_HANDLE_RAW(X)                                \
+#define DD4HEP_TEMPLATE_HANDLE_CODE_UNNAMED(X)                          \
   namespace dd4hep {                                                    \
     template <> void		                                        \
     Handle<X>::assign(X* n, const std::string&, const std::string&)     \
     { this->m_element = n;}	                                        \
     template <> const char* Handle<X>::name() const { return ""; }	\
   }                                                                     \
-  template class dd4hep::Handle<X>
-  
-#define DD4HEP_INSTANTIATE_HANDLE_UNNAMED(X)                            \
+  DD4HEP_IMPLEMENT_SAFE_NAMED_CAST(X)
+
+#define DD4HEP_TEMPLATE_HANDLE_CODE_RAW(X)                              \
   namespace dd4hep {                                                    \
     template <> void		                                        \
     Handle<X>::assign(X* n, const std::string&, const std::string&)     \
     { this->m_element = n;}	                                        \
     template <> const char* Handle<X>::name() const { return ""; }	\
   }                                                                     \
-  DD4HEP_INSTANTIATE_HANDLE(X)
+  DD4HEP_SAFE_CAST_IMPLEMENTATION(X,X)
+
+// Delegation macro; this is the only macro you need to call from elsewhere:
+#define DD4HEP_INSTANTIATE_HANDLE_CODE(CODE,...)  DD4HEP_HANDLE_XF(DD4HEP_HANDLE_PP_NARGS(__VA_ARGS__),CODE,__VA_ARGS__)
+#define DD4HEP_INSTANTIATE_HANDLE(...)            DD4HEP_INSTANTIATE_HANDLE_CODE(CAST_ONLY,__VA_ARGS__)
+#define DD4HEP_INSTANTIATE_SHAPE_HANDLE(...)      DD4HEP_INSTANTIATE_HANDLE_CODE(CAST_ONLY,__VA_ARGS__,TGeoShape,TGeoBBox)
+#define DD4HEP_INSTANTIATE_HANDLE_RAW(...)        DD4HEP_INSTANTIATE_HANDLE_CODE(RAW,__VA_ARGS__)
+#define DD4HEP_INSTANTIATE_HANDLE_NAMED(...)      DD4HEP_INSTANTIATE_HANDLE_CODE(NAMED,__VA_ARGS__)
+#define DD4HEP_INSTANTIATE_HANDLE_UNNAMED(...)    DD4HEP_INSTANTIATE_HANDLE_CODE(UNNAMED,__VA_ARGS__)
 
 #define DD4HEP_CONCAT_MACROS(name, serial)  name##_##serial
-#define DD4HEP_SEGMENTATION_HANDLE_IMPLEMENTATION(X,serial)             \
-  namespace {                                                           \
-  typedef dd4hep::SegmentationWrapper<X> DD4HEP_CONCAT_MACROS(Wrapper,serial); }      \
-  DD4HEP_IMPLEMENT_SAFE_CAST(DD4HEP_CONCAT_MACROS(Wrapper,serial),dd4hep::SegmentationObject) \
-  DD4HEP_INSTANTIATE_HANDLE_UNNAMED(DD4HEP_CONCAT_MACROS(Wrapper,serial))
+#define DD4HEP_SEGMENTATION_HANDLE_IMPLEMENTATION(serial,name,...)                    \
+  namespace {                                                                         \
+  typedef dd4hep::SegmentationWrapper<name> DD4HEP_CONCAT_MACROS(Wrapper,serial); }   \
+  DD4HEP_INSTANTIATE_HANDLE_CODE(UNNAMED,DD4HEP_CONCAT_MACROS(Wrapper,serial),__VA_ARGS__)
 
-#define DD4HEP_IMPLEMENT_SEGMENTATION_HANDLE(X) DD4HEP_SEGMENTATION_HANDLE_IMPLEMENTATION(X,__LINE__)
+#define DD4HEP_INSTANTIATE_SEGMENTATION_HANDLE(...)                                   \
+  DD4HEP_SEGMENTATION_HANDLE_IMPLEMENTATION(__LINE__,__VA_ARGS__,dd4hep::SegmentationObject)
diff --git a/DDCore/src/AlignmentsInterna.cpp b/DDCore/src/AlignmentsInterna.cpp
index afcc54bc259e44a7742a8841bcf682fd717d8ec6..00576ef4fc0cd9a0cdc8764b3379f82ad9d0a321 100644
--- a/DDCore/src/AlignmentsInterna.cpp
+++ b/DDCore/src/AlignmentsInterna.cpp
@@ -24,9 +24,8 @@ using namespace std;
 using namespace dd4hep;
 using namespace dd4hep::detail;
 
-DD4HEP_INSTANTIATE_HANDLE_NAMED(AlignmentObject);
+DD4HEP_INSTANTIATE_HANDLE_NAMED(AlignmentObject,ConditionObject);
 DD4HEP_INSTANTIATE_HANDLE_UNNAMED(AlignmentData);
-DD4HEP_IMPLEMENT_SAFE_CAST(AlignmentObject,ConditionObject)
 
 /// Default constructor
 AlignmentObject::AlignmentObject()
diff --git a/DDCore/src/DetectorInterna.cpp b/DDCore/src/DetectorInterna.cpp
index 3472d154463765eab5828f0226edd2d46d2a1126..feb556357115478ea46e734ea7145813052750bf 100644
--- a/DDCore/src/DetectorInterna.cpp
+++ b/DDCore/src/DetectorInterna.cpp
@@ -29,11 +29,9 @@ using namespace dd4hep::detail;
 typedef detail::tools::PlacementPath PlacementPath;
 typedef detail::tools::ElementPath   ElementPath;
 
-DD4HEP_INSTANTIATE_HANDLE_NAMED(WorldObject);
 DD4HEP_INSTANTIATE_HANDLE_NAMED(DetElementObject);
 DD4HEP_INSTANTIATE_HANDLE_NAMED(SensitiveDetectorObject);
-DD4HEP_IMPLEMENT_SAFE_CAST(WorldObject,DetElementObject)
-
+DD4HEP_INSTANTIATE_HANDLE_NAMED(WorldObject,DetElementObject);
 
 /// Default constructor
 SensitiveDetectorObject::SensitiveDetectorObject()
diff --git a/DDCore/src/Handle.cpp b/DDCore/src/Handle.cpp
index 921f91d759ee01515f30c5fdcc888112c45a541a..99202cd8063630865c7097312986752f117298c1 100644
--- a/DDCore/src/Handle.cpp
+++ b/DDCore/src/Handle.cpp
@@ -255,7 +255,6 @@ namespace dd4hep {
 
 #include "DDSegmentation/Segmentation.h"
 typedef DDSegmentation::Segmentation _Segmentation;
-//INSTANTIATE_UNNAMED(_Segmentation);
 namespace dd4hep {
   template <> void Handle<_Segmentation>::assign(_Segmentation* s, const std::string& n, const std::string&) {
     this->m_element = s;
@@ -271,15 +270,12 @@ namespace dd4hep {
 #include "TMap.h"
 #include "TColor.h"
 
-DD4HEP_INSTANTIATE_HANDLE_UNNAMED(Detector);
-DD4HEP_INSTANTIATE_HANDLE_RAW(TObject);
-DD4HEP_INSTANTIATE_HANDLE_RAW(TNamed);
-DD4HEP_SAFE_CAST_IMPLEMENTATION(TObject,TObject)
-DD4HEP_SAFE_CAST_IMPLEMENTATION(TNamed,TNamed)
+template class dd4hep::Handle<NamedObject>;
 DD4HEP_SAFE_CAST_IMPLEMENTATION(NamedObject,NamedObject)
-DD4HEP_IMPLEMENT_SAFE_CAST(TObject,TNamed)
-DD4HEP_IMPLEMENT_SAFE_CAST(TObject,NamedObject)
-DD4HEP_IMPLEMENT_SAFE_CAST(TNamed,NamedObject)
+
+DD4HEP_INSTANTIATE_HANDLE_UNNAMED(Detector);
+DD4HEP_INSTANTIATE_HANDLE_CODE(RAW,TObject,NamedObject);
+DD4HEP_INSTANTIATE_HANDLE_CODE(NONE,TNamed,TObject,NamedObject);
 
 #include "TGeoMedium.h"
 #include "TGeoMaterial.h"
@@ -317,10 +313,9 @@ DD4HEP_INSTANTIATE_HANDLE(TGeoNodeOffset);
 #include "TGeoVolume.h"
 #include "TGeoCompositeShape.h"
 #include "TGeoShapeAssembly.h"
-DD4HEP_INSTANTIATE_HANDLE(TGeoVolume);
+DD4HEP_INSTANTIATE_HANDLE(TGeoVolume,TGeoAtt);
 DD4HEP_INSTANTIATE_HANDLE(TGeoShape);
-DD4HEP_INSTANTIATE_HANDLE(TGeoBBox);
-DD4HEP_IMPLEMENT_SAFE_CAST(TGeoShape,TGeoBBox)
+DD4HEP_INSTANTIATE_HANDLE(TGeoBBox,TGeoShape);
 
 DD4HEP_INSTANTIATE_SHAPE_HANDLE(TGeoCone);
 DD4HEP_INSTANTIATE_SHAPE_HANDLE(TGeoArb8);
diff --git a/DDCore/src/NamedObject.cpp b/DDCore/src/NamedObject.cpp
index 92f8127bfa12fdc6070e3c1e0bd721b6670b3fe1..80d53634eb0a399dcccd8d5dd598fd6e3c8bd5e5 100644
--- a/DDCore/src/NamedObject.cpp
+++ b/DDCore/src/NamedObject.cpp
@@ -50,3 +50,4 @@ NamedObject::NamedObject(const std::string& nam, const std::string& typ)
   : name(nam), type(typ)
 {
 }
+
diff --git a/DDCore/src/Segmentations.cpp b/DDCore/src/Segmentations.cpp
index bfd86ba0697edece8e00cb8ce8fcded57485c75e..7b5a807a7fa0c20b21fb5bf04e346307f74ade4f 100644
--- a/DDCore/src/Segmentations.cpp
+++ b/DDCore/src/Segmentations.cpp
@@ -118,46 +118,46 @@ Handle<SensitiveDetectorObject> Segmentation::sensitive() const  {
 }
 
 #include "DDSegmentation/NoSegmentation.h"
-DD4HEP_IMPLEMENT_SEGMENTATION_HANDLE(DDSegmentation::NoSegmentation);
+DD4HEP_INSTANTIATE_SEGMENTATION_HANDLE(DDSegmentation::NoSegmentation);
 
 #include "DDSegmentation/CartesianGrid.h"
-DD4HEP_IMPLEMENT_SEGMENTATION_HANDLE(DDSegmentation::CartesianGrid);
+DD4HEP_INSTANTIATE_SEGMENTATION_HANDLE(DDSegmentation::CartesianGrid);
 
 #include "DDSegmentation/CartesianGridXY.h"
-DD4HEP_IMPLEMENT_SEGMENTATION_HANDLE(DDSegmentation::CartesianGridXY);
+DD4HEP_INSTANTIATE_SEGMENTATION_HANDLE(DDSegmentation::CartesianGridXY);
 
 #include "DDSegmentation/CartesianGridXZ.h"
-DD4HEP_IMPLEMENT_SEGMENTATION_HANDLE(DDSegmentation::CartesianGridXZ);
+DD4HEP_INSTANTIATE_SEGMENTATION_HANDLE(DDSegmentation::CartesianGridXZ);
 
 #include "DDSegmentation/CartesianGridYZ.h"
-DD4HEP_IMPLEMENT_SEGMENTATION_HANDLE(DDSegmentation::CartesianGridYZ);
+DD4HEP_INSTANTIATE_SEGMENTATION_HANDLE(DDSegmentation::CartesianGridYZ);
 
 #include "DDSegmentation/CartesianGridXYZ.h"
-DD4HEP_IMPLEMENT_SEGMENTATION_HANDLE(DDSegmentation::CartesianGridXYZ);
+DD4HEP_INSTANTIATE_SEGMENTATION_HANDLE(DDSegmentation::CartesianGridXYZ);
 
 #include "DDSegmentation/TiledLayerGridXY.h"
-DD4HEP_IMPLEMENT_SEGMENTATION_HANDLE(DDSegmentation::TiledLayerGridXY);
+DD4HEP_INSTANTIATE_SEGMENTATION_HANDLE(DDSegmentation::TiledLayerGridXY);
 
 #include "DDSegmentation/MegatileLayerGridXY.h"
-DD4HEP_IMPLEMENT_SEGMENTATION_HANDLE(DDSegmentation::MegatileLayerGridXY);
+DD4HEP_INSTANTIATE_SEGMENTATION_HANDLE(DDSegmentation::MegatileLayerGridXY);
 
 #include "DDSegmentation/WaferGridXY.h"
-DD4HEP_IMPLEMENT_SEGMENTATION_HANDLE(DDSegmentation::WaferGridXY);
+DD4HEP_INSTANTIATE_SEGMENTATION_HANDLE(DDSegmentation::WaferGridXY);
 
 #include "DDSegmentation/PolarGridRPhi.h"
-DD4HEP_IMPLEMENT_SEGMENTATION_HANDLE(DDSegmentation::PolarGridRPhi);
+DD4HEP_INSTANTIATE_SEGMENTATION_HANDLE(DDSegmentation::PolarGridRPhi);
 
 #include "DDSegmentation/PolarGridRPhi2.h"
-DD4HEP_IMPLEMENT_SEGMENTATION_HANDLE(DDSegmentation::PolarGridRPhi2);
+DD4HEP_INSTANTIATE_SEGMENTATION_HANDLE(DDSegmentation::PolarGridRPhi2);
 
 #include "DDSegmentation/GridPhiEta.h"
-DD4HEP_IMPLEMENT_SEGMENTATION_HANDLE(DDSegmentation::GridPhiEta);
+DD4HEP_INSTANTIATE_SEGMENTATION_HANDLE(DDSegmentation::GridPhiEta);
 
 #include "DDSegmentation/GridRPhiEta.h"
-DD4HEP_IMPLEMENT_SEGMENTATION_HANDLE(DDSegmentation::GridRPhiEta);
+DD4HEP_INSTANTIATE_SEGMENTATION_HANDLE(DDSegmentation::GridRPhiEta);
 
 #include "DDSegmentation/ProjectiveCylinder.h"
-DD4HEP_IMPLEMENT_SEGMENTATION_HANDLE(DDSegmentation::ProjectiveCylinder);
+DD4HEP_INSTANTIATE_SEGMENTATION_HANDLE(DDSegmentation::ProjectiveCylinder);
 
 #include "DDSegmentation/MultiSegmentation.h"
-DD4HEP_IMPLEMENT_SEGMENTATION_HANDLE(DDSegmentation::MultiSegmentation);
+DD4HEP_INSTANTIATE_SEGMENTATION_HANDLE(DDSegmentation::MultiSegmentation);