diff --git a/DDCore/include/DD4hep/VolumeManager.h b/DDCore/include/DD4hep/VolumeManager.h
index 25be5c3400a56d0575a146c79393960a1bed7aba..d2d39c8e7ba1a00132c07ce77fab5e412cc99abf 100644
--- a/DDCore/include/DD4hep/VolumeManager.h
+++ b/DDCore/include/DD4hep/VolumeManager.h
@@ -123,6 +123,9 @@ namespace DD4hep {
       /// Initializing constructor for subdetector volume managers.
       VolumeManager(DetElement subdetector, Readout ro);
 
+      /// static accessor calling DD4hepVolumeManagerPlugin if necessary
+      static VolumeManager getVolumeManager(LCDD& lcdd);
+
       /// Assignment operator
       VolumeManager& operator=(const VolumeManager& m)  {
         if ( this != &m ) m_element = m.m_element;
diff --git a/DDCore/src/VolumeManager.cpp b/DDCore/src/VolumeManager.cpp
index c2dcb5da32ca5d25f0bcf66f31f249eabd0b6073..36c70d1cf9ffa55b648d20bd54d31c78749fc52a 100644
--- a/DDCore/src/VolumeManager.cpp
+++ b/DDCore/src/VolumeManager.cpp
@@ -470,6 +470,13 @@ VolumeManager::VolumeManager(DetElement sub_detector, Readout ro)  {
   assign(obj_ptr, sub_detector.name(), "VolumeManager");
 }
 
+VolumeManager VolumeManager::getVolumeManager(LCDD& lcdd) {
+  if( not lcdd.volumeManager().isValid() ) {
+    lcdd.apply("DD4hepVolumeManager", 0, 0);
+  }
+  return lcdd.volumeManager();
+}
+
 /// Add a new Volume manager section according to a new subdetector
 VolumeManager VolumeManager::addSubdetector(DetElement det, Readout ro) {
   if (isValid()) {
diff --git a/DDG4/scripts/dumpDDG4.C b/DDG4/scripts/dumpDDG4.C
index b76e3e1032fd91a6ac31405242a18b4bff1037cd..f681542a6f7eee17f22a12778fa9e21b04daaf48 100644
--- a/DDG4/scripts/dumpDDG4.C
+++ b/DDG4/scripts/dumpDDG4.C
@@ -216,7 +216,7 @@ int dumpddg4_load_geometry(const char* fname)   {
     gSystem->Load("libDDG4Plugins");
     LCDD& lcdd = LCDD::getInstance();
     lcdd.fromXML(fname);
-    lcdd.apply("DD4hepVolumeManager",0,(char**)0);
+    VolumeManager::getVolumeManager();
   }
   return 1;
 }
diff --git a/DDRec/src/IDDecoder.cpp b/DDRec/src/IDDecoder.cpp
index 07165a4b3ba2a7abf58de6531bf76e777444979f..93c07fd5ee59590bb9f8256182b028a4165250ae 100644
--- a/DDRec/src/IDDecoder.cpp
+++ b/DDRec/src/IDDecoder.cpp
@@ -32,12 +32,7 @@ IDDecoder& IDDecoder::getInstance() {
 /// Default constructor
 IDDecoder::IDDecoder() {
 	LCDD& lcdd = LCDD::getInstance();
-	_volumeManager = lcdd.volumeManager();
-	if (not _volumeManager.isValid()) {
-		lcdd.apply("DD4hepVolumeManager",0,0);
-		_volumeManager = lcdd.volumeManager();
-	}
-	_tgeoMgr = lcdd.world().volume()->GetGeoManager();
+	_volumeManager = VolumeManager::getVolumeManager(lcdd);
 }
 
 /**
diff --git a/DDRec/src/SurfaceHelper.cpp b/DDRec/src/SurfaceHelper.cpp
index e172813d68874cb62c6a338e478d9cdd21746e3a..a838003de3d8a871fff8e8d1a9149be6f0eb4895 100644
--- a/DDRec/src/SurfaceHelper.cpp
+++ b/DDRec/src/SurfaceHelper.cpp
@@ -27,15 +27,8 @@ namespace DD4hep {
       // have to populate the volume manager once in order to have 
       // the volumeIDs attached to the DetElements
       LCDD& lcdd = LCDD::getInstance();
-      VolumeManager volMgr = lcdd.volumeManager();
-      if(not volMgr.isValid()) {
-	// VolumeManager initialised by DD4hepVolumeManager plugin
-	lcdd.apply("DD4hepVolumeManager",0,0);
-	volMgr = lcdd.volumeManager();
-      }
-
+      VolumeManager volMgr = VolumeManager::getVolumeManager(lcdd);
 
- 
       //------------------ breadth first tree traversal ---------
       std::list< DetElement > dets ;
       std::list< DetElement > daugs ;