diff --git a/DDCore/include/DD4hep/DetElement.h b/DDCore/include/DD4hep/DetElement.h
index 5090ebe74f243bef26956da69f821fce479e5edf..3fbf75642974c218ea75daa8147a347786a0574b 100644
--- a/DDCore/include/DD4hep/DetElement.h
+++ b/DDCore/include/DD4hep/DetElement.h
@@ -383,6 +383,8 @@ namespace dd4hep {
 
     /// Access to the logical volume of the detector element's placement
     Volume volume() const;
+    /// Access to the shape of the detector element's placement
+    Solid solid() const;
 
     /// Access to the physical volume of this detector element
     /** This is the current placement value of the detector eleemnt.
diff --git a/DDCore/include/DD4hep/Detector.h b/DDCore/include/DD4hep/Detector.h
index 6fdcf6171b6552aad88b945953bb008ce98e3b51..16fffc5bc37cc13edfe63d2be8b9f19beeaeb1bf 100644
--- a/DDCore/include/DD4hep/Detector.h
+++ b/DDCore/include/DD4hep/Detector.h
@@ -34,6 +34,7 @@
 #include <vector>
 #include <string>
 #include <cstdio>
+#include <memory>
 
 // Forward declarations
 class TGeoManager;
@@ -313,6 +314,9 @@ namespace dd4hep {
     static Detector& getInstance(const std::string& name="default");
     /// Destroy the singleton instance
     static void destroyInstance(const std::string& name="default");
+    /// Unique creation without internal registration
+    static std::unique_ptr<Detector> make_unique(const std::string& name);
+
   };
 
   /*
diff --git a/DDCore/src/DetElement.cpp b/DDCore/src/DetElement.cpp
index 1e4e21ac6e4aa47b140872bb500051807a9fbacc..5452d05cbf6e4e27ce1f21761a0a81badcd68caa 100644
--- a/DDCore/src/DetElement.cpp
+++ b/DDCore/src/DetElement.cpp
@@ -321,6 +321,11 @@ Volume DetElement::volume() const {
   return access()->placement.volume();
 }
 
+/// Access to the shape of the detector element's placement
+Solid DetElement::solid() const    {
+  return volume()->GetShape();
+}
+
 DetElement& DetElement::setVisAttributes(const Detector& description, const string& nam, const Volume& vol) {
   vol.setVisAttributes(description, nam);
   return *this;
diff --git a/DDCore/src/DetectorImp.cpp b/DDCore/src/DetectorImp.cpp
index 14a5691fdf003f05cc4fa124649f88415c0b1f10..59c9df81081bfe6bd88b7eae9d9b98f1ca1cec15 100644
--- a/DDCore/src/DetectorImp.cpp
+++ b/DDCore/src/DetectorImp.cpp
@@ -118,6 +118,11 @@ string dd4hep::versionString(){
   return vs;
 }
 
+unique_ptr<Detector> Detector::make_unique(const std::string& name)   {
+  Detector* description = new DetectorImp(name);
+  return unique_ptr<Detector>(description);
+}
+
 Detector& Detector::getInstance(const std::string& name)   {
   lock_guard<recursive_mutex> lock(s_instances.lock);
   Detector* description = s_instances.get(name);
diff --git a/UtilityApps/src/display.cpp b/UtilityApps/src/display.cpp
index 9f9c2516dd616166c7faf1fd2779730311dcaa1b..f3e33ad793c3acde4adb6236e3572f02a4dd6080 100644
--- a/UtilityApps/src/display.cpp
+++ b/UtilityApps/src/display.cpp
@@ -21,12 +21,12 @@ int main(int argc,char** argv)  {
   bool dry = false;
   for(int i=0; i<argc; ++i)  {
     if ( i==1 && argv[i][0] != '-' ) av.push_back("-input");
-    if      ( strncmp(argv[i],"-load",4)     == 0 ) dry = true, av.push_back(argv[i]);
-    else if ( strncmp(argv[i],"-dry",4)      == 0 ) dry = true, av.push_back(argv[i]);
-    else if ( strncmp(argv[i],"-visopt",4)   == 0 ) visopt   = argv[++i];
-    else if ( strncmp(argv[i],"-level", 4)   == 0 ) level    = argv[++i];
-    else if ( strncmp(argv[i],"-option",4)   == 0 ) opt      = argv[++i];
-    else if ( strncmp(argv[i],"-detector",4) == 0 ) detector = argv[++i];
+    if      ( strncmp(argv[i],"-load-only",4) == 0 ) dry = true, av.push_back(argv[i]);
+    else if ( strncmp(argv[i],"-dry-run",4)   == 0 ) dry = true, av.push_back(argv[i]);
+    else if ( strncmp(argv[i],"-visopt",4)    == 0 ) visopt   = argv[++i];
+    else if ( strncmp(argv[i],"-level", 4)    == 0 ) level    = argv[++i];
+    else if ( strncmp(argv[i],"-option",4)    == 0 ) opt      = argv[++i];
+    else if ( strncmp(argv[i],"-detector",4)  == 0 ) detector = argv[++i];
     else av.push_back(argv[i]);
   }
   if ( !dry )   {