diff --git a/DDCore/src/IDDescriptor.cpp b/DDCore/src/IDDescriptor.cpp
index 035c643d31f885306e43d57a565b3ce8dfdc0671..25c4d82b7bdef0194fa41b5580c2eefdbf22b3a0 100644
--- a/DDCore/src/IDDescriptor.cpp
+++ b/DDCore/src/IDDescriptor.cpp
@@ -48,8 +48,8 @@ namespace {
       field.second = f.size() == 3 ? ::atoi(f[2].c_str()) : ::atoi(f[1].c_str());
       pos = field.first + ::abs(field.second);
       if ( pos>o->maxBit ) o->maxBit = pos;
-      o->fieldIDs.insert(make_pair(o->fieldMap.size(),f[0]));
-      o->fieldMap.insert(make_pair(f[0],field));
+      o->fieldIDs.push_back(make_pair(o->fieldMap.size(),f[0]));
+      o->fieldMap.push_back(make_pair(f[0],field));
     }
   }
 }
diff --git a/DDCore/src/LCDDImp.h b/DDCore/src/LCDDImp.h
index cd1d4b54d6edc53615943cf86a804b19cb67c432..cc9d0f976cbd07075c6d3f5ab426812ef4f09de6 100644
--- a/DDCore/src/LCDDImp.h
+++ b/DDCore/src/LCDDImp.h
@@ -59,7 +59,6 @@ namespace DD4hep {
       };
 		      
       ObjectHandleMap     m_readouts;
-      ObjectHandleMap     m_header;
       ObjectHandleMap     m_idDict;
       ObjectHandleMap     m_limits;
       ObjectHandleMap     m_regions;
@@ -83,7 +82,7 @@ namespace DD4hep {
       Material            m_materialVacuum;
       VisAttr             m_invisibleVis;
       OverlayedField      m_field;
-      Ref_t               m_setup;
+      Ref_t               m_header;
       Properties*         m_properties;
       
       /// Default constructor
@@ -100,6 +99,9 @@ namespace DD4hep {
       
       virtual void dump() const;
 
+      /// Manipulate geometry using facroy converter
+      virtual void apply(const char* factory, int argc, char** argv);
+
       /// Apply & lock realigments
       //virtual void applyAlignment();
       
@@ -128,6 +130,10 @@ namespace DD4hep {
       virtual Volume          trackingVolume() const   { return m_trackingVol;          }
       /// Return handle to the combined electromagentic field description.
       virtual OverlayedField  field() const            { return m_field;                }
+      /// Accessor to the header entry
+      virtual Header          header()  const          { return m_header;               }
+      /// Accessor to the header entry
+      virtual void setHeader(Header h)                 { m_header = h;                  }
 
       /// Typed access to constants: access string values
       virtual std::string       constantAsString(const std::string& name) const;
@@ -170,8 +176,6 @@ namespace DD4hep {
       virtual CartesianField    field(const std::string& name)  const 
       {  return getRefChild(m_fields,name,false);                                       }
       
-      /// Accessor to the map of header entries
-      virtual const HandleMap& header()  const          { return m_header;              }
       /// Accessor to the map of constants
       virtual const HandleMap& constants() const        { return m_define;              }
       /// Accessor to the map of visualisation attributes
diff --git a/DDCore/src/Objects.cpp b/DDCore/src/Objects.cpp
index e55214897bdb9cdcc6be1a7c1616b2c034ee7a41..219d18240f20e48799f9be485f23ac0ded11ec79 100644
--- a/DDCore/src/Objects.cpp
+++ b/DDCore/src/Objects.cpp
@@ -25,34 +25,85 @@
 using namespace std;
 using namespace DD4hep::Geometry;
 
-#if 0
-Header& Header::fromCompact(Document doc, Handle_t element, const string& fname)   {
-  Element    info = element;
-  Author     aut(doc);
-  RefElement det(doc,Tag_detector,info.attr<cpXMLCh>(Attr_name));
-  RefElement gen(doc,Tag_generator, Strng_t("GeomCnv++"));
+/// Constructor to be used when creating a new DOM tree
+Author::Author(LCDD& /* lcdd */)  {
+  m_element = new TNamed("","author");
+}
 
-  gen.setAttr(Attr_file,fname);  
-  gen.setAttr(Attr_version,"1.0");
-  gen.setAttr(Attr_checksum,"None");
+/// Constructor to be used when creating a new DOM tree
+Header::Header(const string& author, const string& url)   {
+  Value<TNamed,Object>* ptr = new Value<TNamed,Object>();
+  assign(ptr,author, url);
+}
 
-  aut.setAttr(Attr_name,info.attr<cpXMLCh>(Tag_author));
+/// Accessor to object name
+const std::string Header::name()  const {
+  return m_element->GetName();
+}
 
-  append(gen);
-  append(aut);
-  append(doc.clone(info.child(Tag_comment),true));
-  return *this;
+/// Accessor: set object name
+void Header::setName(const std::string& new_name) {
+  m_element->SetName(new_name.c_str());
 }
-#endif
 
-/// Constructor to be used when creating a new DOM tree
-Author::Author(LCDD& /* lcdd */)  {
-  m_element = new TNamed("","author");
+/// Accessor to object title
+const std::string Header::title()  const {
+  return m_element->GetTitle();
 }
 
-/// Constructor to be used when creating a new DOM tree
-Header::Header(LCDD& /* lcdd */)   {
-  m_element = new TNamed("","header");
+/// Accessor: set object title
+void Header::setTitle(const std::string& new_title) {
+  m_element->SetTitle(new_title.c_str());
+}
+
+/// Accessor to object url
+const std::string& Header::url()  const {
+  return data<Object>()->url;
+}
+
+/// Accessor: set object url
+void Header::setUrl(const std::string& new_url) {
+  data<Object>()->url = new_url;
+}
+
+/// Accessor to object author
+const std::string& Header::author()  const {
+  return data<Object>()->author;
+}
+
+/// Accessor: set object author
+void Header::setAuthor(const std::string& new_author) {
+  data<Object>()->author = new_author;
+}
+
+/// Accessor to object status
+const std::string& Header::status()  const {
+  return data<Object>()->status;
+}
+
+/// Accessor: set object status
+void Header::setStatus(const std::string& new_status) {
+  data<Object>()->status = new_status;
+}
+
+/// Accessor to object version
+const std::string& Header::version()  const {
+  return data<Object>()->version;
+}
+
+/// Accessor: set object version
+void Header::setVersion(const std::string& new_version) {
+  data<Object>()->version = new_version;
+}
+
+/// Accessor to object comment
+const std::string& Header::comment()  const {
+  return data<Object>()->comment;
+}
+
+/// Accessor: set object comment
+void Header::setComment(const std::string& new_comment) {
+  data<Object>()->comment = new_comment;
 }
 
 /// Constructor to be used when creating a new DOM tree
@@ -407,6 +458,16 @@ bool Region::storeSecondaries() const {
   return _data().store_secondaries;
 }
 
+/// Access the length unit
+const std::string& Region::lengthUnit() const   {
+  return _data().lunit;
+}
+
+/// Access the energy unit
+const std::string& Region::energyUnit() const   {
+  return _data().eunit;
+}
+
 #undef setAttr
 
 #if 0
diff --git a/DDCore/src/Volumes.cpp b/DDCore/src/Volumes.cpp
index 13376464cee038a4fdf2707cde896a7c31083bde..95a8728f7d49ac5dff055cece5caba2bd17fe368 100644
--- a/DDCore/src/Volumes.cpp
+++ b/DDCore/src/Volumes.cpp
@@ -245,6 +245,11 @@ string PlacedVolume::toString() const {
   return s.str();
 }
 
+Volume::Object* _data(const Volume& v) {
+  if ( v.ptr() && v.ptr()->IsA() == TGeoVolume::Class() ) return v.data<Volume::Object>();
+  return dynamic_cast<Volume::Object*>(v.ptr());
+}
+
 /// Constructor to be used when creating a new geometry tree.
 Volume::Volume(const string& name)    {
   m_element = new Value<TGeoVolume,Volume::Object>(name.c_str());
@@ -372,14 +377,14 @@ void Volume::setVisAttributes(const VisAttr& attr) const   {
     m_element->SetAttBit(TGeoAtt::kVisContainers,kTRUE);
     m_element->SetVisDaughters(vis->showDaughters ? kTRUE : kFALSE);
   }
-  data<Object>()->vis = attr;
+  _data(*this)->vis = attr;
 }
 
 /// Set Visualization attributes to the volume
 void Volume::setVisAttributes(const LCDD& lcdd, const string& name)  const {
   if ( !name.empty() )   {
     VisAttr attr = lcdd.visAttributes(name);
-    data<Object>()->vis = attr;
+    _data(*this)->vis = attr;
     setVisAttributes(attr);
   }
   else  {
@@ -414,25 +419,25 @@ void Volume::setSolid(const Solid& solid)  const
 
 /// Set the regional attributes to the volume
 void Volume::setRegion(const Region& obj)  const   
-{  data<Object>()->region = obj;                            }
+{  _data(*this)->region = obj;                            }
 
 /// Set the limits to the volume
 void Volume::setLimitSet(const LimitSet& obj)  const   
-{  data<Object>()->limits = obj;                            }
+{  _data(*this)->limits = obj;                            }
 
 /// Assign the sensitive detector structure
 void Volume::setSensitiveDetector(const SensitiveDetector& obj) const   {
   //cout << "Setting sensitive detector '" << obj.name() << "' to volume:" << ptr() << " " << name() << endl;
-  data<Object>()->sens_det = obj;                          
+  _data(*this)->sens_det = obj;                          
 }
 
 /// Access to the handle to the sensitive detector
 Ref_t Volume::sensitiveDetector() const
-{  return data<Object>()->sens_det;                         }
+{  return _data(*this)->sens_det;                         }
 
 /// Accessor if volume is sensitive (ie. is attached to a sensitive detector)
 bool Volume::isSensitive() const
-{  return data<Object>()->sens_det.isValid();               }
+{  return _data(*this)->sens_det.isValid();               }
 
 /// Access to Solid (Shape)
 Solid Volume::solid() const   
@@ -444,15 +449,15 @@ Material Volume::material() const
 
 /// Access the visualisation attributes
 VisAttr Volume::visAttributes() const
-{  return data<Object>()->vis;                              }
+{  return _data(*this)->vis;                              }
 
 /// Access to the handle to the region structure
 Region Volume::region() const   
-{  return data<Object>()->region;                           }
+{  return _data(*this)->region;                           }
 
 /// Access to the limit set
 LimitSet Volume::limitSet() const   
-{  return data<Object>()->limits;                           }
+{  return _data(*this)->limits;                           }
 
 /// Constructor to be used when creating a new geometry tree.
 Assembly::Assembly(const string& name) {
diff --git a/DDCore/src/XML/DocumentHandler.cpp b/DDCore/src/XML/DocumentHandler.cpp
index 0702c525e79fc7d7a4e6e2b5c1d4d4183982f024..75d30e722b2dbacf0d735909906919524af1e320 100644
--- a/DDCore/src/XML/DocumentHandler.cpp
+++ b/DDCore/src/XML/DocumentHandler.cpp
@@ -166,6 +166,19 @@ Document DocumentHandler::load(const string& fname)  const  {
   return parser->adoptDocument();
 }
 
+/// Parse a standalong XML string into a document.
+Document DocumentHandler::parse(const char* bytes, size_t length)  const {
+  auto_ptr<XercesDOMParser> parser(makeParser());
+  MemBufInputSource src((const XMLByte*)bytes,length,"memory");
+  parser->setValidationSchemaFullChecking(true);
+  parser->parse(src);
+  DOMDocument* doc  = parser->adoptDocument();
+  doc->setXmlStandalone(true);
+  doc->setStrictErrorChecking(true);
+  return doc;
+}
+
+
 #else
 #ifdef _WIN32
 #include <cstdlib>
@@ -247,4 +260,27 @@ Document DocumentHandler::load(const string& fname)  const  {
   return 0;
 }
 
+/// Parse a standalong XML string into a document.
+Document DocumentHandler::parse(const char* doc_string, size_t length) const {
+  TiXmlDocument* doc = new TiXmlDocument();
+  try  {
+    if ( 0 == doc->Parse(doc_string) ) {
+      return doc;
+    }
+    if ( doc->Error() ) {
+      cout << "Unknown error whaile parsing XML document with TiXml:" << endl;
+      cout << "Document:" << doc->Value() << endl;
+      cout << "Location: Line:" << doc->ErrorRow() 
+	   << " Column:" << doc->ErrorCol() << endl;
+      throw runtime_error(doc->ErrorDesc());
+    }
+    throw runtime_error("Unknown error whaile parsing XML document with TiXml.");
+  }
+  catch(std::exception& e) {
+    cout << "parse(xml-string):" << e.what() << endl;
+  }
+  delete doc;
+  return 0;
+}
+
 #endif
diff --git a/DDCore/src/XML/XMLDetector.cpp b/DDCore/src/XML/XMLDetector.cpp
index 7949ffd11c5512eaa000bcb83ed583345869b205..37a8eaac99821fb01285d71e662749c737a26634 100644
--- a/DDCore/src/XML/XMLDetector.cpp
+++ b/DDCore/src/XML/XMLDetector.cpp
@@ -4,16 +4,16 @@ using namespace std;
 using namespace DD4hep::XML;
 
 #define XML_ATTR_ACCESSOR(type,name)  type Dimension::name() const { return m_element.attr<type>(Attr_##name); }
-#define XML_ATTR_ACCESSOR_DOUBLE(name)	 \
+#define XML_ATTR_ACCESSOR_DOUBLE(name)	                                \
   double Dimension::name(double default_val) const {		       	\
     const XmlChar* val = m_element.attr_value_nothrow(Attr_##name);	\
     return val ? _toDouble(val) : default_val; }
-#define XML_ATTR_ACCESSOR_INT(name)	 \
+#define XML_ATTR_ACCESSOR_INT(name)	                                \
   int Dimension::name(int default_val) const {				\
     const XmlChar* val = m_element.attr_value_nothrow(Attr_##name);	\
     return val ? _toInt(val) : default_val; }
-#define XML_ATTR_ACCESSOR_BOOL(name)	 \
-  bool Dimension::name(bool default_val) const {				\
+#define XML_ATTR_ACCESSOR_BOOL(name)	                                \
+  bool Dimension::name(bool default_val) const {		       	\
     const XmlChar* val = m_element.attr_value_nothrow(Attr_##name);	\
     return val ? _toBool(val) : default_val; }
 
diff --git a/DDCore/src/XML/XMLElements.cpp b/DDCore/src/XML/XMLElements.cpp
index e0acd7fbe16c7ccc40855b559587d124414ecccf..4d77dc8a3e579efb4386803bc537165d927a931e 100644
--- a/DDCore/src/XML/XMLElements.cpp
+++ b/DDCore/src/XML/XMLElements.cpp
@@ -14,6 +14,7 @@
 // C/C++ include files
 #include <iostream>
 #include <stdexcept>
+#include <map>
 
 using namespace std;
 using namespace DD4hep::XML;
@@ -483,6 +484,43 @@ bool Handle_t::hasChild(const XmlChar* tag) const   {
   return node_first(m_node,tag) != 0;
 }
 
+/// Set the element's value
+void Handle_t::setValue(const XmlChar* text) const   {
+#ifdef __TIXML__
+  m_node->SetValue(text);
+#else
+  m_node->setNodeValue(text);
+#endif
+}
+
+/// Set the element's value
+void Handle_t::setValue(const string& text) const   {
+#ifdef __TIXML__
+  m_node->SetValue(text.c_str());
+#else
+  m_node->setNodeValue(Strng(text));
+#endif
+}
+
+/// Set the element's text
+void Handle_t::setText(const XmlChar* text) const   {
+#ifdef __TIXML__
+  m_node->LinkEndChild(new TiXmlText(text));
+#else
+  m_node->setNodeText(text);
+#endif
+}
+
+/// Set the element's text
+void Handle_t::setText(const string& text) const   {
+#ifdef __TIXML__
+  m_node->LinkEndChild(new TiXmlText(text.c_str()));
+#else
+  m_node->setNodeText(Strng(text));
+#endif
+}
+
+/// Remove all attributes of this element
 void Handle_t::removeAttrs() const   {
 #ifdef __TIXML__
   m_node->ClearAttributes();
@@ -496,6 +534,7 @@ void Handle_t::removeAttrs() const   {
 #endif
 }
 
+/// Set attributes as in argument handle
 void Handle_t::setAttrs(Handle_t e) const   {
   removeAttrs();
 #ifdef __TIXML__
@@ -514,6 +553,7 @@ void Handle_t::setAttrs(Handle_t e) const   {
 #endif
 }
 
+/// Access attribute pointer by the attribute's unicode name (throws exception if not present)
 Attribute Handle_t::attr_ptr(const XmlChar* t)  const    {
   Attribute a = attribute_node(m_node,t);
   if ( 0 != a ) return a;
@@ -525,6 +565,7 @@ Attribute Handle_t::attr_ptr(const XmlChar* t)  const    {
   throw runtime_error(msg);
 }
 
+/// Access attribute name (throws exception if not present)
 const XmlChar* Handle_t::attr_name(const Attribute attr)  const   {
   if ( attr ) {
 #ifdef __TIXML__
@@ -536,53 +577,67 @@ const XmlChar* Handle_t::attr_name(const Attribute attr)  const   {
   throw runtime_error("Attempt to access invalid XML attribute object!");
 }
 
+/// Access attribute value by the attribute's unicode name (throws exception if not present)
 const XmlChar* Handle_t::attr_value(const XmlChar* attr)  const   {
   return attribute_value(attr_ptr(attr));
 }
 
+/// Access attribute value by the attribute  (throws exception if not present)
 const XmlChar* Handle_t::attr_value(const Attribute attr)  const   {
   return attribute_value(attr);
 }
 
+/// Access attribute value by the attribute's unicode name (no exception thrown if not present)
 const XmlChar* Handle_t::attr_value_nothrow(const XmlChar* attr)  const   {
   Attribute a = attr_nothrow(attr);
   return a ? attribute_value(a) : 0;
 }
 
+/// Generic attribute setter with integer value
 Attribute Handle_t::setAttr(const XmlChar* name, int val)  const    {
   char txt[32];
   ::sprintf(txt,"%d",val);
   return setAttr(name, Strng_t(txt));
 }
 
+/// Generic attribute setter with boolen value
 Attribute Handle_t::setAttr(const XmlChar* name, bool val)  const   {
   char txt[32];
   ::sprintf(txt,"%s",val ? "true" : "false");
   return setAttr(name, Strng_t(txt));
 }
 
+/// Generic attribute setter with floating point value
 Attribute Handle_t::setAttr(const XmlChar* name, float val)  const   {
   char txt[32];
   ::sprintf(txt,"%f",val);
   return setAttr(name, Strng_t(txt));
 }
 
+/// Generic attribute setter with double precision floating point value
 Attribute Handle_t::setAttr(const XmlChar* name, double val)  const   {
   char txt[32];
   ::sprintf(txt,"%f",val);
   return setAttr(name, Strng_t(txt));
 }
 
+/// Generic attribute setter with string value
+Attribute Handle_t::setAttr(const XmlChar* name, const string& val)  const {
+  return setAttr(name, Strng_t(val.c_str()));
+}
+
 #ifndef __TIXML__
 Attribute Handle_t::setAttr(const XmlChar* name, const char* v) const    {
-  return setAttr(name,Strng_t(v));
+  return setAttr(name, Strng_t(v));
 }
 #endif
 
+/// Generic attribute setter with XmlAttr value
 Attribute Handle_t::setAttr(const XmlChar* name, const Attribute v) const    {
   return v ? setAttr(name,attribute_value(v)) : 0;
 }
 
+/// Generic attribute setter with unicode value
 Attribute Handle_t::setAttr(const XmlChar* name, const XmlChar* value) const  { 
 #ifdef __TIXML__
   m_node->SetAttribute(name,value);
@@ -598,6 +653,90 @@ Attribute Handle_t::setAttr(const XmlChar* name, const XmlChar* value) const  {
 #endif
 }
 
+/// Add reference child as a new child node. The obj must have the "name" attribute!
+Handle_t Handle_t::setRef(const XmlChar* tag, const XmlChar* ref_name) {
+  Element me(*this);
+  Element ref(me.document(),tag);
+  ref.setAttr(Attr_ref,ref_name);
+  me.append(ref);
+  return ref;
+}
+
+/// Checksum (sub-)tree of a xml document/tree
+static unsigned int adler32(unsigned int adler,const char* buf,size_t len)    {
+#define DO1(buf,i)  {s1 +=(unsigned char)buf[i]; s2 += s1;}
+#define DO2(buf,i)  DO1(buf,i); DO1(buf,i+1);
+#define DO4(buf,i)  DO2(buf,i); DO2(buf,i+2);
+#define DO8(buf,i)  DO4(buf,i); DO4(buf,i+4);
+#define DO16(buf)   DO8(buf,0); DO8(buf,8);
+
+  static const unsigned int BASE = 65521;    /* largest prime smaller than 65536 */
+  /* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */
+  static const unsigned int NMAX = 5550;
+  unsigned int s1 = adler & 0xffff;
+  unsigned int s2 = (adler >> 16) & 0xffff;
+  int k;
+
+  if (buf == NULL) return 1;
+
+  while (len > 0) {
+    k = len < NMAX ? (int)len : NMAX;
+    len -= k;
+    while (k >= 16) {
+      DO16(buf);
+      buf += 16;
+      k -= 16;
+    }
+    if (k != 0) do {
+      s1 += (unsigned char)*buf++;
+      s2 += s1;
+    } while (--k);
+    s1 %= BASE;
+    s2 %= BASE;
+  }
+  unsigned int result = (s2 << 16) | s1;
+  return result;
+}
+
+/// Checksum (sub-)tree of a xml document/tree
+unsigned int Handle_t::checksum(unsigned int param,unsigned int (fcn)(unsigned int,const XmlChar*,size_t)) const  {
+  typedef std::map<std::string,std::string> StringMap;
+#ifdef __TIXML__
+  TiXmlNode* n = m_node;
+  if ( n )   {
+    if ( 0 == fcn ) fcn = adler32;
+    switch (n->Type())  {
+    case TiXmlNode::ELEMENT: {
+      map<string,string> m;
+      TiXmlElement* e = n->ToElement();
+      TiXmlAttribute* p=e->FirstAttribute();
+      for(; p; p=p->Next()) m.insert(make_pair(p->Name(),p->Value()));
+      param = (*fcn)(param,e->Value(),::strlen(e->Value()));
+      for(StringMap::const_iterator i=m.begin();i!=m.end();++i) {
+	param = (*fcn)(param,(*i).first.c_str(),(*i).first.length());
+	param = (*fcn)(param,(*i).second.c_str(),(*i).second.length());
+      }
+      break;
+    }
+    case TiXmlNode::TEXT:
+      param = (*fcn)(param,n->ToText()->Value(),::strlen(n->ToText()->Value()));
+      break;
+    case TiXmlNode::UNKNOWN:
+    case TiXmlNode::COMMENT:
+    case TiXmlNode::DOCUMENT:
+    case TiXmlNode::DECLARATION:
+    default:
+      break;
+    }
+    for(TiXmlNode* c=n->FirstChild(); c; c=c->NextSibling())
+      param = Handle_t(c->ToElement()).checksum(param,fcn);
+  }
+#else
+
+#endif
+  return param;
+}
+
 /// Create DOM element
 Handle_t Document::createElt(const XmlChar* tag)  const {
 #ifdef __TIXML__
diff --git a/DDExamples/CLICSiD/src/SiTrackerBarrel_geo.cpp b/DDExamples/CLICSiD/src/SiTrackerBarrel_geo.cpp
index ba5d58fb3401b4a951ca8b170f2718e8989083fe..7a3957a8585460ba6f77c8c735f3eb9000908424 100644
--- a/DDExamples/CLICSiD/src/SiTrackerBarrel_geo.cpp
+++ b/DDExamples/CLICSiD/src/SiTrackerBarrel_geo.cpp
@@ -34,9 +34,9 @@ static Ref_t create_detector(LCDD& lcdd, const xml_h& e, SensitiveDetector& sens
       xml_comp_t x_comp = ci;
       xml_comp_t x_pos  = x_comp.child(_X(position),false);
       xml_comp_t x_rot  = x_comp.child(_X(rotation),false);	
-      string     c_nam  = _toString(ncomponents,"component%d");
-      Box        c_box (x_comp.width(),x_comp.length(),x_comp.thickness());
-      Volume     c_vol (c_nam,c_box,lcdd.material(x_comp.materialStr()));
+      string     c_nam  = det_name+"_"+m_nam+_toString(ncomponents,"_component%d");
+      Box        c_box(x_comp.width(),x_comp.length(),x_comp.thickness());
+      Volume     c_vol(c_nam,c_box,lcdd.material(x_comp.materialStr()));
       PlacedVolume c_phv;
 
       if ( x_pos && x_rot ) {
@@ -51,7 +51,7 @@ static Ref_t create_detector(LCDD& lcdd, const xml_h& e, SensitiveDetector& sens
 	c_phv = m_vol.placeVolume(c_vol,Position(x_pos.x(0),x_pos.y(0),x_pos.z(0)));
       }
       else {
-	c_phv = m_vol.placeVolume(c_vol,IdentityPos());
+	c_phv = m_vol.placeVolume(c_vol);
       }
       if ( x_comp.isSensitive() ) {
 	c_phv.addPhysVolID(_X(sensor),sensor_number++);
@@ -72,7 +72,7 @@ static Ref_t create_detector(LCDD& lcdd, const xml_h& e, SensitiveDetector& sens
     string     m_nam    = x_layer.moduleStr();
     DetElement m_elt    = sdet.child(m_nam);
     Volume     m_env    = volumes[m_nam];
-    string     lay_nam  = det_name+_toString(lay_id,"_layer%d");
+    string     lay_nam  = det_name+"_"+m_nam+_toString(lay_id,"_layer%d");
     Tube       lay_tub   (x_barrel.inner_r(),x_barrel.outer_r(),x_barrel.z_length());
     Volume     lay_vol   (lay_nam,lay_tub,air);       // Create the layer envelope volume.
     double     phi0     = x_layout.phi0();            // Starting phi of first module.
@@ -117,10 +117,10 @@ static Ref_t create_detector(LCDD& lcdd, const xml_h& e, SensitiveDetector& sens
 	// Add z increment to get next z placement pos.
 	module_z += z_incr;
       }
-      phic    += phi_incr;      // Increment the phi placement of module.
-      rc      += rphi_dr;       // Increment the center radius according to dr parameter.
-      rphi_dr *= -1;            // Flip sign of dr parameter.
-      module_z = -z0;           // Reset the Z placement parameter for module.
+      phic     += phi_incr;      // Increment the phi placement of module.
+      rc       += rphi_dr;       // Increment the center radius according to dr parameter.
+      rphi_dr  *= -1;            // Flip sign of dr parameter.
+      module_z  = -z0;           // Reset the Z placement parameter for module.
     }
     // Create the PhysicalVolume for the layer.
     PlacedVolume lpv = motherVol.placeVolume(lay_vol); // Place layer in mother
diff --git a/DDExamples/ILDExDet/compact/CLIC_ILD_CDR.xml b/DDExamples/ILDExDet/compact/CLIC_ILD_CDR.xml
index e2c2d4e82d3d86a3586be024ff3485e9018d5595..5a4c390c7df1b2f0468e664cd33a6c5679ccdff4 100644
--- a/DDExamples/ILDExDet/compact/CLIC_ILD_CDR.xml
+++ b/DDExamples/ILDExDet/compact/CLIC_ILD_CDR.xml
@@ -936,16 +936,16 @@
             <id>system:6,barrel:3,layer:4,module:16,sensor:1,side:32:-2,strip:20</id>
         </readout>
         <readout name="EcalBarrelHits">
-            <id>system:6,barrel:3,layer:4,module:16</id>
+            <id>system:6,barrel:3,layer:4,module:16,sensor:1,side:32:-2,strip:20</id>
         </readout>
         <readout name="EcalEndcapHits">
-            <id>system:6,barrel:3,layer:4,module:16</id>
+            <id>system:6,barrel:3,layer:4,module:16,sensor:1,side:32:-2,strip:20</id>
         </readout>
         <readout name="EcalEndcapRingHits">
-            <id>system:6,barrel:3,layer:4,module:16</id>
+            <id>system:6,barrel:3,layer:4,module:16,sensor:1,side:32:-2,strip:20</id>
         </readout>
         <readout name="HcalRegularHits">
-            <id>system:6,barrel:3,layer:4,module:16</id>
+            <id>system:6,barrel:3,layer:4,module:16,sensor:1,side:32:-2,strip:20</id>
         </readout>
         <readout name="HcalEndModuleHits">
             <id>system:6,barrel:3,layer:4,module:16</id>
diff --git a/DDExamples/ILDExDet/src/compact/Tesla_ClicYoke01_geo.cpp b/DDExamples/ILDExDet/src/compact/Tesla_ClicYoke01_geo.cpp
index b9debe8b0422fab6ab59ce1ebbbd773416c7a245..cbf36f6ce0d08e5f9ba877f41278de072e79e4f5 100644
--- a/DDExamples/ILDExDet/src/compact/Tesla_ClicYoke01_geo.cpp
+++ b/DDExamples/ILDExDet/src/compact/Tesla_ClicYoke01_geo.cpp
@@ -138,9 +138,9 @@ void ClicYoke01::collectRPClayers(xml_comp_t x_rpcs)   {
 /// Build the endcap logical volume ready for placement
 Volume ClicYoke01::buildEndcap()   {
   PolyhedraRegular solid(symmetry,endcap.inner_r,endcap.outer_r,yokeThickness);
-  Volume           envelope(name+"_endcap",solid,yokeMat);
+  Volume           envelope(name+"_endcap_envelope",solid,yokeMat);
   PolyhedraRegular chamberSolid(symmetry,endcap.inner_r,barrel.outer_r,layer_thickness);
-  Volume           chamberVol(name+"_layer",chamberSolid,lcdd->air());
+  Volume           chamberVol(name+"_endcap",chamberSolid,lcdd->air());
   Volume           gasVol;
   PlacedVolume     pv;
 
@@ -153,7 +153,7 @@ Volume ClicYoke01::buildEndcap()   {
     Material m = rpc_layers[i].first;
     double   t = rpc_layers[i].second.second;
     PolyhedraRegular h(symmetry,endcap.inner_r,barrel.outer_r,t);
-    Volume   v((name+"_endcap_")+m.name(),h,m);
+    Volume   v(name+_toString(i,"_endcap_layer%d"),h,m);
     if ( m.ptr() == rpcGasMat.ptr() )   {
       v.setLimitSet(limitSet);
       v.setVisAttributes(rpcGasVis);
@@ -198,7 +198,6 @@ Volume ClicYoke01::buildPlug() {
 #endif
   Volume           gasVol;
   PlacedVolume     pv;
-
   /*	
     fg: the plug should have same outer radius as the hcal endcap 
     note: HCAL_R_max is outer edge radius of  the barrel with 16-fold symmentry -> cos(pi/16)
@@ -215,7 +214,7 @@ Volume ClicYoke01::buildPlug() {
   PolyhedraRegular plugSolid(symmetry,endcap.inner_r,HCAL_R_max,HCAL_plug_thickness);
   Volume           plugVol  (name+"_plug",plugSolid,yokeMat);
   PolyhedraRegular chamberSolid(symmetry,endcap.inner_r,HCAL_R_max,layer_thickness);
-  Volume           chamberVol  (name+"_plug_layer",chamberSolid,lcdd->air());
+  Volume           chamberVol  (name+"_plug_layers",chamberSolid,lcdd->air());
 
   plugVol.setVisAttributes(plugVis);
   chamberVol.setVisAttributes(chamberVis);
@@ -229,7 +228,7 @@ Volume ClicYoke01::buildPlug() {
     Material m = rpc_layers[i].first;
     double   t = rpc_layers[i].second.second;
     PolyhedraRegular h(symmetry,endcap.inner_r,HCAL_R_max,t);
-    Volume   v((name+"_endcap_")+m.name(),h,m);
+    Volume   v(name+_toString(i,"_plug_layers_layer%d"),h,m);
     if ( m.ptr() == rpcGasMat.ptr() )   {
       v.setLimitSet(limitSet);
       v.setVisAttributes(rpcGasVis);
@@ -292,8 +291,9 @@ Volume ClicYoke01::buildBarrel() {
 #if 0
     m_barrel.sensDet->AddLayer(i+1, dx, radius_sensitive, 0.0); 
 #endif
+    string chamber_name = name+_toString(i,"_barrel_stave_layer%d");
     Box    chamberBox(dx,layer_thickness/2.0, dy);
-    Volume chamberVol(name+"_stave",chamberBox,lcdd->air());
+    Volume chamberVol(chamber_name,chamberBox,lcdd->air());
     chamberVol.setVisAttributes(chamberVis);
     if ( rpc_last_layer.first+rpc_last_layer.second > chamberBox.y() ) {
       throw runtime_error("Overfull RPC layer in yoke barrel!");
@@ -301,7 +301,7 @@ Volume ClicYoke01::buildBarrel() {
     for(size_t j=0; j<rpc_layers.size(); ++j)   {
       Material m = rpc_layers[j].first;
       double   t = rpc_layers[j].second.second;
-      Volume   v((name+"_barrel_")+m.name(),Box(dx,t/2,dy),m);
+      Volume   v(chamber_name+_toString(j,"_layer%d"),Box(dx,t/2,dy),m);
       if ( m.ptr() == rpcGasMat.ptr() )   {
 	v.setLimitSet(limitSet);
 	v.setVisAttributes(rpcGasVis);
@@ -433,7 +433,7 @@ DetElement ClicYoke01::construct(LCDD& l, xml_det_t x_det)  {
   //  -------------------------------------------------
   if( m_hasPlug )      {
     Volume plugVol = buildPlug();
-    pv = assembly.placeVolume(plugVol,Position(0,0, HCAL_plug_zpos),Rotation(0,tiltAngle,0));//,Rotation(0,0,M_PI));
+    pv = assembly.placeVolume(plugVol,Position(0,0, HCAL_plug_zpos),Rotation(0,tiltAngle,0));
     m_plugPlus.setPlacement(pv);
     pv = assembly.placeVolume(plugVol,Position(0,0,-HCAL_plug_zpos),Rotation(0,tiltAngle+M_PI,0));
     m_plugMinus = m_plugPlus.clone(name+"_plug_minus",x_det.id());
diff --git a/DDExamples/ILDExDet/src/compact/Tesla_LumiCalX_geo.cpp b/DDExamples/ILDExDet/src/compact/Tesla_LumiCalX_geo.cpp
index e48aeace42be87d66e7b6f5c307b67d06ffe983b..ff4d746a7598da4c5305b63ffb42497fc46c8e82 100644
--- a/DDExamples/ILDExDet/src/compact/Tesla_LumiCalX_geo.cpp
+++ b/DDExamples/ILDExDet/src/compact/Tesla_LumiCalX_geo.cpp
@@ -94,12 +94,14 @@ static Ref_t create_element(LCDD& lcdd, const xml_h& e, SensitiveDetector& sens)
   Volume      sensor_vol (name+"_sensor",sensor_tube, cell_mat);
   sensor_vol.setVisAttributes(cell_vis);
 
+
+  // Note: Problem with divisions still - hence no special attributes
   // Replicate strips within a theta and phi plane padded version
   Volume sens_theta_vol = Ref_t(sector_tube->Divide(sector_vol,(name+"_sector_theta").c_str(),1,ncell_theta,0,thetastrip_dr));
-  sens_theta_vol.setVisAttributes(cell_vis);
+  //sens_theta_vol.setVisAttributes(cell_vis);
   
   Volume sens_phi_vol = Ref_t(sensor_tube->Divide(sensor_vol,(name+"_sensor_phi").c_str(),2,ncell_phi,0,phistrip_dphi*RAD_2_DEGREE));
-  sens_phi_vol.setVisAttributes(cell_vis);
+  //sens_phi_vol.setVisAttributes(cell_vis);
 
   //Declare the silcon strip  to be sensitive 
   //CellLogical->SetSensitiveDetector(theLumiCalSD); 
diff --git a/DDExamples/ILDExDet/src/compact/Tesla_SEcal03_geo.cpp b/DDExamples/ILDExDet/src/compact/Tesla_SEcal03_geo.cpp
index d1dcabec238a5909f46ea68b3570b5e4be89e475..4c288040d1eba45ed21fd4b381939fb53561c7ba 100644
--- a/DDExamples/ILDExDet/src/compact/Tesla_SEcal03_geo.cpp
+++ b/DDExamples/ILDExDet/src/compact/Tesla_SEcal03_geo.cpp
@@ -121,7 +121,7 @@ namespace DD4hep { namespace Geometry {
     /// Build barrel volume
     std::pair<DetElement,Volume> buildBarrelStave(const Barrel& barrel);
     /// Build slab 
-    Volume buildSlab(bool barrel, const Dimension dim, SensitiveDetector& sd);
+    Volume buildSlab(const std::string& prefix, bool barrel, const Dimension dim, SensitiveDetector& sd);
     // Build radiator solid
     Volume buildRadiator(const std::string& name, const Dimension& dim, const Material& mat);
   };
@@ -269,18 +269,25 @@ DetElement SEcal03::construct(LCDD& l, xml_det_t x_det)  {
 
   double inc_x = (x_mid-x_left ) / (y_top-y_mid);
   double inc_y = m_alveolus.y + fiber_inter_alveolus;
+  int itower = -1;
   for(double last_dim_x=0., y_curr=y_bot+m_alveolus.y; y_curr < y_top; y_curr += inc_y )    {
     m_alveolus.x = x_right - x_left - ((y_curr <= y_mid) ? 0 : (y_curr - y_mid) * inc_x);
     // While the towers have the same shape use the same logical volumes and parameters.
     if(last_dim_x != m_alveolus.x)      {
+      ++itower;
       //printf("%s> Build slab x=%f y=%f\n",name().c_str(),m_alveolus.x,m_alveolus.y);
-      EC_TowerSlabs.push_back(buildSlab(false,Dimension(m_alveolus.y,m_slab.total_thickness,m_alveolus.x),m_endcap.sensDet));
+      EC_TowerSlabs.push_back(buildSlab(name+_toString(itower,"_endcap_tower%d"),false,
+					Dimension(m_alveolus.y,m_slab.total_thickness,m_alveolus.x),
+					m_endcap.sensDet));
       if( m_layers[0].nLayer > 0 )
-	EC_Towers[0].push_back(buildRadiator(name+"_T1",Dimension(m_alveolus.y,m_layers[0].thickness,m_alveolus.x),m_layers[0].rad_mat));
+	EC_Towers[0].push_back(buildRadiator(name+_toString(int(EC_Towers[0].size()),"_endcap_T1_layer%d"),
+					     Dimension(m_alveolus.y,m_layers[0].thickness,m_alveolus.x),m_layers[0].rad_mat));
       if( m_layers[1].nLayer > 0 )
-	EC_Towers[1].push_back(buildRadiator(name+"_T2",Dimension(m_alveolus.y,m_layers[1].thickness,m_alveolus.x),m_layers[1].rad_mat));
+	EC_Towers[1].push_back(buildRadiator(name+_toString(int(EC_Towers[1].size()),"_endcap_T2_layer%d"),
+					     Dimension(m_alveolus.y,m_layers[1].thickness,m_alveolus.x),m_layers[1].rad_mat));
       if( m_layers[2].nLayer > 0 )
-	EC_Towers[2].push_back(buildRadiator(name+"_T3",Dimension(m_alveolus.y,m_layers[2].thickness,m_alveolus.x),m_layers[2].rad_mat));
+	EC_Towers[2].push_back(buildRadiator(name+_toString(int(EC_Towers[2].size()),"_endcap_T3_layer%d"),
+					     Dimension(m_alveolus.y,m_layers[2].thickness,m_alveolus.x),m_layers[2].rad_mat));
       last_dim_x = m_alveolus.x;
     }
     else   {
@@ -398,22 +405,22 @@ double SEcal03::radiatorThickness(int layer_id)   const  {
 Volume SEcal03::buildRadiator(const string& name, const Dimension& dim, const Material& mat)   {
   Box    box(dim.x/2,dim.z/2,dim.y/2);
   //::printf("%s> Radiator: %.2f %.2f %.2f\n",name.c_str(),dim.x/2,dim.z/2,dim.y/2);
-  Volume vol("radiator",box,mat);
+  Volume vol(name+"_radiator",box,mat);
   vol.setVisAttributes(m_radiatorVis);
   return vol;
 }
 
 /// Build slab 
-Volume SEcal03::buildSlab(bool barrel, Dimension dim, SensitiveDetector& sd) {
+Volume SEcal03::buildSlab(const string& prefix, bool barrel, Dimension dim, SensitiveDetector& sd) {
   // Slab solid: hx, hz, hy
   Box slabBox(dim.x/2,dim.z/2,dim.y/2);
-  Volume slabVol("slab",slabBox,lcdd->air());
+  Volume slabVol(prefix+"_slab",slabBox,lcdd->air());
   slabVol.setVisAttributes(m_slab.vis);
   double y_slab_floor  = -dim.y/2;
 
   // Ground plate
   Box    groundBox(dim.x/2,dim.z/2,m_slab.ground_thickness/2);
-  Volume groundVol("ground",groundBox,m_slab.ground_mat);
+  Volume groundVol(prefix+"_ground",groundBox,m_slab.ground_mat);
   groundVol.setVisAttributes(m_slab.ground_vis);
   slabVol.placeVolume(groundVol,Position(0,0,y_slab_floor+m_slab.ground_thickness/2));
   y_slab_floor += m_slab.ground_thickness;
@@ -421,7 +428,7 @@ Volume SEcal03::buildSlab(bool barrel, Dimension dim, SensitiveDetector& sd) {
   // Si layer
   // we place a big plane of Si and inside it the Si wafers, to simplify the gard ring placements
   Box     siBox(dim.x/2,dim.z/2,m_slab.sensitive_thickness/2);
-  Volume  siVol("sensitive",siBox,m_slab.sensitive_mat);
+  Volume  siVol(prefix+"_sensitive",siBox,m_slab.sensitive_mat);
   siVol.setVisAttributes(m_slab.sensitive_vis);
   slabVol.placeVolume(siVol,Position(0,0,y_slab_floor + m_slab.sensitive_thickness/2));
 
@@ -444,7 +451,7 @@ Volume SEcal03::buildSlab(bool barrel, Dimension dim, SensitiveDetector& sd) {
   double wafer_dim_z = N_cells_in_Z * cell_dim_z;
 
   Box     waferBox(wafer_dim_x/2, wafer_dim_z/2, m_slab.sensitive_thickness/2);
-  Volume  waferVol("wafer",waferBox,m_slab.sensitive_mat);
+  Volume  waferVol(prefix+"_wafer",waferBox,m_slab.sensitive_mat);
   waferVol.setVisAttributes(m_slab.wafer_vis);
   waferVol.setSensitiveDetector(sd);
   waferVol.setLimitSet(m_limits);
@@ -482,7 +489,7 @@ Volume SEcal03::buildSlab(bool barrel, Dimension dim, SensitiveDetector& sd) {
       int N_cells_x_remaining =	int(floor((resting_dim_x - 2 * m_guard_ring_size)/cell_dim_x));
       wafer_dim_x = N_cells_x_remaining * cell_dim_x;
       Box    waf_box(wafer_dim_x/2, wafer_dim_z/2, m_slab.sensitive_thickness/2);
-      Volume waf_vol("wafer_rest",waf_box,m_slab.sensitive_mat);
+      Volume waf_vol(prefix+"_wafer_rest",waf_box,m_slab.sensitive_mat);
       waf_vol.setVisAttributes(m_slab.wafer_vis);
       waf_vol.setSensitiveDetector(sd);
       waf_vol.setLimitSet(m_limits);
@@ -520,7 +527,7 @@ Volume SEcal03::buildSlab(bool barrel, Dimension dim, SensitiveDetector& sd) {
       int N_cells_x_remaining = int(std::floor((resting_dim_x - 2 * m_guard_ring_size)/cell_dim_z));
       wafer_dim_x = N_cells_x_remaining * cell_dim_z;
       Box    waf_box(wafer_dim_z/2, wafer_dim_x/2, m_slab.sensitive_thickness/2);
-      Volume waf_vol("wafer", waf_box, m_slab.sensitive_mat);
+      Volume waf_vol(prefix+"_wafer_rest", waf_box, m_slab.sensitive_mat);
       waf_vol.setVisAttributes(m_slab.sensitive_vis);
       waf_vol.setSensitiveDetector(sd);
       waf_vol.setLimitSet(m_limits);
@@ -540,7 +547,7 @@ Volume SEcal03::buildSlab(bool barrel, Dimension dim, SensitiveDetector& sd) {
   // The PCB layer, the copper and the shielding are placed as a big G10 layer,
   // as the copper and the shielding ones are very tiny.
   Box    pcbShieldBox(dim.x/2,dim.z/2,m_shield.thickness/2);
-  Volume pcbShieldVol("pcbshield",pcbShieldBox,m_shield.material);
+  Volume pcbShieldVol(prefix+"_pcbshield",pcbShieldBox,m_shield.material);
   pcbShieldVol.setVisAttributes(m_shield.vis);
   slabVol.placeVolume(pcbShieldVol,Position(0,0,y_slab_floor+m_shield.thickness/2));
   return slabVol;
@@ -552,11 +559,12 @@ Volume SEcal03::buildEndcap(DetElement det,bool Zminus, const Endcap& endcap,
 {
   // While waiting for more geometric details, build a simple Endcap using 
   // a fiber polyhedra and substract the center box
+  string nam  = det.name();
   double disp = Zminus ? -m_centerTubDisplacement : m_centerTubDisplacement;
   Position displacement(disp,0,0);
   PolyhedraRegular hedra(8, 0, endcap.rmax, m_endcap.thickness);
   SubtractionSolid solid(hedra, m_center_tube, displacement);
-  Volume           endcap_vol("endcap", solid,m_shield.material);
+  Volume           endcap_vol(nam+"_endcap", solid,m_shield.material);
   endcap_vol.setVisAttributes(m_endcap.vis);
 
   //----------------------------------------------------
@@ -570,38 +578,38 @@ Volume SEcal03::buildEndcap(DetElement det,bool Zminus, const Endcap& endcap,
   double r_outer = endcap.rmax - m_lateral_face_thickness;
   double box_dim = (m_endcap_center_box_size - m_lateral_face_thickness)/ 2.;
   VisAttr ring_vis = lcdd->visAttributes("EcalRingVis");
-
+  
   if(m_layers[0].nLayer > 0 )    {
     PolyhedraRegular hedra_rad(8, r_inner, r_outer, m_layers[0].thickness);
     SubtractionSolid sol_rad(hedra_rad, m_center_tube, displacement);
-    vol_radL1 = Volume("ECL1_radiator",sol_rad, m_layers[0].rad_mat);
+    vol_radL1 = Volume(nam+"_ECL1_radiator",sol_rad, m_layers[0].rad_mat);
     vol_radL1.setVisAttributes(m_radiatorVis);
     // plate for slab in ring
     Box              box_ring(box_dim,box_dim, m_layers[0].thickness/2);
     SubtractionSolid sol_ring(box_ring,m_center_tube,displacement,rot);
-    vol_ringL1 = Volume(name+"_ECL1_ring",sol_ring,m_layers[0].rad_mat);
+    vol_ringL1 = Volume(nam+"_ECL1_ring",sol_ring,m_layers[0].rad_mat);
     vol_ringL1.setVisAttributes(ring_vis);
   }
   if(m_layers[1].nLayer > 0 )    {
     PolyhedraRegular hedra_rad(8, r_inner, r_outer, m_layers[1].thickness);
     SubtractionSolid sol_rad(hedra_rad, m_center_tube, displacement, rot);
-    vol_radL2 = Volume("ECL2_radiator",sol_rad, m_layers[0].rad_mat);
+    vol_radL2 = Volume(nam+"_ECL2_radiator",sol_rad, m_layers[0].rad_mat);
     vol_radL2.setVisAttributes(m_radiatorVis);
     // plate for slab in ring
     Box              box_ring(box_dim,box_dim, m_layers[1].thickness/2);
     SubtractionSolid sol_ring(box_ring,m_center_tube,displacement, rot);
-    vol_ringL2 = Volume(name+"_ECL2_ring",sol_ring,m_layers[0].rad_mat);
+    vol_ringL2 = Volume(nam+"_ECL2_ring",sol_ring,m_layers[0].rad_mat);
     vol_ringL2.setVisAttributes(ring_vis);
   }
   if(m_layers[2].nLayer > 0 )    {
     PolyhedraRegular hedra_rad(8, r_inner, r_outer, m_layers[2].thickness);
     SubtractionSolid sol_rad(hedra_rad, m_center_tube, displacement, rot);
-    vol_radL3 = Volume("ECL3_radiator",sol_rad, m_layers[0].rad_mat);
+    vol_radL3 = Volume(nam+"_ECL3_radiator",sol_rad, m_layers[0].rad_mat);
     vol_radL3.setVisAttributes(m_radiatorVis);
     // plate for slab in ring
     Box box_ring(box_dim,box_dim, m_layers[2].thickness/2);
     SubtractionSolid sol_ring(box_ring,m_center_tube,displacement, rot);
-    vol_ringL3 = Volume(name+"_ECL3_ring",sol_ring,m_layers[2].rad_mat);
+    vol_ringL3 = Volume(nam+"_ECL3_ring",sol_ring,m_layers[2].rad_mat);
     vol_ringL3.setVisAttributes(ring_vis);
   }
 
@@ -732,9 +740,9 @@ Volume SEcal03::buildEndcap(DetElement det,bool Zminus, const Endcap& endcap,
 
 ///  Barrel Standard Module
 pair<DetElement,Volume> SEcal03::buildBarrelStave(const Barrel& barrel) {
-  DetElement staveDet("stave",0);
+  DetElement staveDet(name+"_barrel_stave",0);
   Trapezoid staveTrd(barrel.bottom/2, barrel.top/2, barrel.dim_z/2, barrel.dim_z/2, barrel.thickness/2);
-  Volume    staveVol("stave",staveTrd,m_barrel.material);
+  Volume    staveVol(name+"_barrer_stave",staveTrd,m_barrel.material);
   staveVol.setVisAttributes(m_barrel.vis);
 
   // We count the layers starting from IP and from 1, so odd layers should be inside slabs and
@@ -745,6 +753,7 @@ pair<DetElement,Volume> SEcal03::buildBarrelStave(const Barrel& barrel) {
   double z_pos;
   PlacedVolume pv;
   for(int layer_id = 1; layer_id < m_numLayer+1; layer_id+=2) {// ATTENTION, TWO LAYERS PER LOOP
+    string l_nam = name+_toString(layer_id,"_barrel_stave_layer%d");
     DetElement layerDet(staveDet,_toString(layer_id,"layer%d"),layer_id);
     // build and place the several Alveolus with the slabs and the radiator layer inside.
     double rad_thick = radiatorThickness(layer_id);
@@ -756,8 +765,9 @@ pair<DetElement,Volume> SEcal03::buildBarrelStave(const Barrel& barrel) {
     // To simplify we place each slab and the radiator layer directly into the fiber module.
     //
     // Build a slab:
-    Volume slabVol = buildSlab(true,Dimension(alveolus_dim_x,m_slab.total_thickness,m_alveolus.z),m_barrel.sensDet);
-
+    Volume slabVol = buildSlab(l_nam,true,
+			       Dimension(alveolus_dim_x,m_slab.total_thickness,m_alveolus.z),
+			       m_barrel.sensDet);
     // Place the Slab and radiator inside the H, here directly into the module fiber as the
     // H structure is also built in fiber.
     double z_tower_center = -barrel.dim_z /2 + m_lateral_face_thickness 
@@ -765,7 +775,7 @@ pair<DetElement,Volume> SEcal03::buildBarrelStave(const Barrel& barrel) {
       + m_slab.h_fiber_thickness + m_alveolus.z /2;  
 
     Dimension radDim1(alveolus_dim_x,rad_thick,m_alveolus.z);
-    Volume radVol1 = buildRadiator("radiator1",radDim1,barrel.radiatorMaterial);
+    Volume radVol1 = buildRadiator(l_nam+"_radiator1",radDim1,barrel.radiatorMaterial);
     for (int itow = m_barrel.numTowers; itow > 0; --itow )    {
       y_fl  = y_floor;
       x_off = 0; // to be calculed
@@ -818,7 +828,7 @@ pair<DetElement,Volume> SEcal03::buildBarrelStave(const Barrel& barrel) {
     double radiator_dim_z = barrel.dim_z - 2.*m_lateral_face_thickness - 2*N_FIBERS_W_STRUCTURE * m_fiber_thickness;
     
     Dimension radDim2(radiator_dim_x,rad_thick,radiator_dim_z);
-    Volume radVol2 = buildRadiator("radiator2",radDim2,barrel.radiatorMaterial);
+    Volume radVol2 = buildRadiator(l_nam+"_radiator2",radDim2,barrel.radiatorMaterial);
     pv = staveVol.placeVolume(radVol2,Position(0,0,-barrel.thickness/2+y_floor+rad_thick/2));
 
     // update the y_floor
diff --git a/DDExamples/ILDExDet/src/compact/Tesla_SFtd05_geo.cpp b/DDExamples/ILDExDet/src/compact/Tesla_SFtd05_geo.cpp
index 3795cb4dfba2fd1e881b419923aa9c0d8d6e4e93..c94f83f949ff77c0b66e308b7565cb614019519e 100644
--- a/DDExamples/ILDExDet/src/compact/Tesla_SFtd05_geo.cpp
+++ b/DDExamples/ILDExDet/src/compact/Tesla_SFtd05_geo.cpp
@@ -105,9 +105,10 @@ static Ref_t create_element(LCDD& lcdd, const xml_h& e, SensitiveDetector& sens_
 #endif
 
   //... Disks
+  int cnt = 0;
   cylinder_t outer, inner;
   //... assembling detector
-  for(xml_coll_t c(x_disks,_U(disk)); c; ++c) {
+  for(xml_coll_t c(x_disks,_U(disk)); c; ++c, ++cnt) {
     //... Get the disk parameters
     xml_comp_t x_disk(c);
     int id = x_disk.id();
@@ -245,7 +246,7 @@ static Ref_t create_element(LCDD& lcdd, const xml_h& e, SensitiveDetector& sens_
 
     //... Si sensitive
     Tube  diskTube(inner_radius,outer_radius,si_thickness/2);
-    Volume diskVol(disk_name+"_silicon",diskTube,siliconMat);
+    Volume diskVol(disk_name+_toString(cnt,"_silicon_%d"),diskTube,siliconMat);
     diskVol.setSensitiveDetector(sens_det);
     diskVol.setVisAttributes(diskVis);
     assembly.placeVolume(diskVol,Position(0,0, z_pos)).addPhysVolID("disk", id);
@@ -253,7 +254,7 @@ static Ref_t create_element(LCDD& lcdd, const xml_h& e, SensitiveDetector& sens_
 
     //... Support
     Tube  suppTube(inner_radius,outer_radius,support_thickness/2);
-    Volume suppVol(disk_name+"_support",suppTube,kaptonMat);
+    Volume suppVol(disk_name+_toString(cnt,"_support_%d"),suppTube,kaptonMat);
     suppVol.setVisAttributes(supportVis);     
     assembly.placeVolume(diskVol,Position(0,0,  z_pos+si_thickness/2+support_thickness/2));
     assembly.placeVolume(diskVol,Position(0,0,-(z_pos+si_thickness/2+support_thickness/2)));
diff --git a/DDExamples/ILDExDet/src/compact/Tesla_SHcalSc02_geo.cpp b/DDExamples/ILDExDet/src/compact/Tesla_SHcalSc02_geo.cpp
index a5bff79a3420a14815131816b89f0a53616b0811..ac15bb69550c996db0e9ad9fdc548fcfc840869b 100644
--- a/DDExamples/ILDExDet/src/compact/Tesla_SHcalSc02_geo.cpp
+++ b/DDExamples/ILDExDet/src/compact/Tesla_SHcalSc02_geo.cpp
@@ -441,16 +441,16 @@ void SHcalSc02::constructBarrelChambers(Volume modVol,double chambers_y_off_corr
   Trap supportTrap1(2*z_width_supp,2*y_height,
 		    Hcal_layer_support_length + 2*y_height*tan8,
 		    Hcal_layer_support_length);
-  Volume supportTrapVol1(name+"_trap",supportTrap1,m_aluminum);
+  Volume supportTrapVol1(name+"_support1",supportTrap1,m_aluminum);
   supportTrapVol1.setVisAttributes(m_supportTrapVis);
 
   Trap supportTrap2(2*z_width_supp,2*y_height,
 		    Hcal_layer_support_length + 2*y_height/tan8,
 		    Hcal_layer_support_length);
-  Volume supportTrapVol2(name+"_trap",supportTrap1,m_aluminum);
+  Volume supportTrapVol2(name+"_support2",supportTrap1,m_aluminum);
   supportTrapVol2.setVisAttributes(m_supportTrapVis);
 
-  Box    supportBox(Hcal_layer_support_length/2, z_width_supp, y_height);
+  Box    supportBox(Hcal_layer_support_length/2,z_width_supp,y_height);
   Volume supportBoxVol(name+"_support",supportBox,m_aluminum);
   supportBoxVol.setVisAttributes(m_supportTrapVis);
 
diff --git a/DDExamples/ILDExDet/src/compact/Tesla_VXD03_geo.cpp b/DDExamples/ILDExDet/src/compact/Tesla_VXD03_geo.cpp
index b4057d80e9c64aecfbd0731ad93a24de3e957c39..18891f40a8994c499d7706faab2d5069a2da6046 100644
--- a/DDExamples/ILDExDet/src/compact/Tesla_VXD03_geo.cpp
+++ b/DDExamples/ILDExDet/src/compact/Tesla_VXD03_geo.cpp
@@ -102,13 +102,13 @@ static Ref_t create_element(LCDD& lcdd, const xml_h& e, SensitiveDetector& sens)
     layer.ladders.gap   = x_ladders.gap();
     vxd_data->layers.push_back(layer);
 
-    string          layer_name = name+_toString(layer.id,"_layer_%d");
-    DetElement      layer_elt(vxd, layer_name, layer.id);
+    string     layer_name = name+_toString(layer.id,"_layer%d");
+    DetElement layer_elt(vxd, layer_name, layer.id);
     double ldd_len   = layer.ladders.len;
     double ldd_width = layer.ladders.width;
     double ldd_gap   = layer.ladders.gap;
 
-    Assembly layer_vol(name);
+    Assembly layer_vol(layer_name);
     Box      ladder_supp_box(ldd_width+side_band_electronics_width,
 			     ldd_len+(2.0*end_electronics_zhalf)+ be_ladder_block_length*2.,
 			     support_thickness/2.);
@@ -158,7 +158,7 @@ static Ref_t create_element(LCDD& lcdd, const xml_h& e, SensitiveDetector& sens)
 
       // **********************   Berylium annulus block *****************************************
       Box     box(ldd_width,len,be_ladder_block_thickness);
-      Volume  vol(layer_name+"_Be", box, be_ladder_block_mat); 
+      Volume  vol(layer_name+_toString(i,"_ladder%d_Be"), box, be_ladder_block_mat); 
       vol.setVisAttributes(lcdd.visAttributes("VXDBerilliumVis"));
       for( int i=0;i<layer.num_ladder;i++ ) {
 	double phi =  i*delta_phi;
diff --git a/DDExamples/ILDExDet/src/compact/Tesla_ftd01_geo.cpp b/DDExamples/ILDExDet/src/compact/Tesla_ftd01_geo.cpp
index 0ff59c3e628ac514effe8d94c0dc5d29bed66411..3d6e790fbfbf7d377292751277cbbaac70db1682 100644
--- a/DDExamples/ILDExDet/src/compact/Tesla_ftd01_geo.cpp
+++ b/DDExamples/ILDExDet/src/compact/Tesla_ftd01_geo.cpp
@@ -54,10 +54,10 @@ static Ref_t create_element(LCDD& lcdd, const xml_h& e, SensitiveDetector& sens)
   Assembly    ftdVol(name);
   Volume      motherVol   = lcdd.pickMotherVolume(sdet);
 
-  xml_comp_t  x_disks = x_det.child(_U(disks));
-  xml_comp_t  x_cables = x_det.child(_U(cables));
+  xml_comp_t  x_disks    = x_det.child(_U(disks));
+  xml_comp_t  x_cables   = x_det.child(_U(cables));
   xml_comp_t  x_cylinder = x_det.child(_U(cylinder));
-  xml_comp_t  x_support = x_det.child(_U(support));
+  xml_comp_t  x_support  = x_det.child(_U(support));
   xml_comp_t  x_inner_support = x_support.child(_U(inner));
   xml_comp_t  x_outer_support = x_support.child(_U(outer));
 
@@ -90,7 +90,7 @@ static Ref_t create_element(LCDD& lcdd, const xml_h& e, SensitiveDetector& sens)
     _Ext *ext_neg=disk_neg.addExtension<_Ext>(new _Ext());
     { //... Si sensitive
       Tube   tub(inner_r,outer_r,si_thickness/2.0);
-      Volume vol(_toString(id,"_disk%d_Si"),tub,diskMat);
+      Volume vol(name+_toString(id,"_disk%d_Si"),tub,diskMat);
       vol.setVisAttributes(lcdd.visAttributes(x_disk.visStr()));
       // This is the sensitive element: add senssitive detector
       vol.setSensitiveDetector(sens);
@@ -105,7 +105,7 @@ static Ref_t create_element(LCDD& lcdd, const xml_h& e, SensitiveDetector& sens)
     }
     { //... Support
       Tube   tub(inner_r,outer_r,inner_support_thickness);
-      Volume vol(_toString(id,"_disk%d_support"),tub,supportMat);
+      Volume vol(name+_toString(id,"_disk%d_support"),tub,supportMat);
       double z = z_pos + si_thickness + inner_support_thickness;
       vol.setVisAttributes(supportVis);
       pv = ftdVol.placeVolume(vol,Position(0,0, z));
@@ -117,7 +117,7 @@ static Ref_t create_element(LCDD& lcdd, const xml_h& e, SensitiveDetector& sens)
     }
     /* { //... Outer support rings
       Tube   tub(outer_r,outer_r+outer_support.thickness,outer_support_length);
-      Volume vol(_toString(id,"disk%d_outer_support"),tub,supportMat);
+      Volume vol(name+_toString(id,"disk%d_outer_support"),tub,supportMat);
       vol.setVisAttributes(supportVis);
       pv = ftdVol.placeVolume(vol,Position(0,0, z_pos));
       pv.addPhysVolID("disk",id);
diff --git a/DDExamples/ILDExDet/src/compact/Tesla_tpc06_geo.cpp b/DDExamples/ILDExDet/src/compact/Tesla_tpc06_geo.cpp
index b8ddabf6dc8a01466c0d62f70005d8f83432fa27..fe41efc5312a10d598d9114428aaadc4c9bfe730 100644
--- a/DDExamples/ILDExDet/src/compact/Tesla_tpc06_geo.cpp
+++ b/DDExamples/ILDExDet/src/compact/Tesla_tpc06_geo.cpp
@@ -61,12 +61,12 @@ static Ref_t create_element(LCDD& lcdd, const xml_h& e, SensitiveDetector& sens_
   assembly.setVisAttributes(lcdd.visAttributes(x_det.visStr()));
   
   Tube   innerTube(env.inner_r, gas.inner_r, env.z);
-  Volume innerVol(name+"_assembly",innerTube,lcdd.material(x_inner.materialStr()));
+  Volume innerVol(name+"_inner",innerTube,lcdd.material(x_inner.materialStr()));
   innerVol.setVisAttributes(lcdd.visAttributes(x_inner.visStr()));
   assembly.placeVolume(innerVol);
 
   Tube   outerTube(gas.outer_r, env.outer_r, env.z);
-  Volume outerVol(name+"_assembly",outerTube,lcdd.material(x_outer.materialStr()));
+  Volume outerVol(name+"_outer",outerTube,lcdd.material(x_outer.materialStr()));
   outerVol.setVisAttributes(lcdd.visAttributes(x_outer.visStr()));
   assembly.placeVolume(outerVol);
 
diff --git a/DDExamples/ILDExDet/src/compact/Tesla_tubeX01_geo.cpp b/DDExamples/ILDExDet/src/compact/Tesla_tubeX01_geo.cpp
index dad500164553334a3acdf94af5071ed45f4bd0b4..3d3707b252df533a82f74b32ab381a9049a1ae8a 100644
--- a/DDExamples/ILDExDet/src/compact/Tesla_tubeX01_geo.cpp
+++ b/DDExamples/ILDExDet/src/compact/Tesla_tubeX01_geo.cpp
@@ -207,7 +207,7 @@ static Ref_t create_element(LCDD& lcdd, const xml_h& e, SensitiveDetector&)  {
         if (start.inner_r != start.outer_r || end.inner_r != end.outer_r) {
 	  wallCone = ConeSegment(zHalf+clipSize/2,start.inner_r,start.outer_r,end.inner_r,end.outer_r);
 	  SubtractionSolid sol(wallCone,clip,clip_pos_pos,Rotation(0,0,-clipAngle));
-	  Volume           vol (name+"_"+nam+"_wall_solid",sol,mat);
+	  Volume           vol (name+"_"+nam+"_wall_solid_front",sol,mat);
 	  vol.setVisAttributes(vis);
 	  wall.placeVolume(vol);
 	}
@@ -218,7 +218,7 @@ static Ref_t create_element(LCDD& lcdd, const xml_h& e, SensitiveDetector&)  {
 	wall.setVisAttributes(vis);
         if (start.inner_r != start.outer_r || end.inner_r != end.outer_r) {
 	  SubtractionSolid sol(wallCone,clip, clip_pos_neg, Rotation(0,0,clipAngle));
-	  Volume           vol(name+"_"+nam+"_wall_solid",sol,mat);
+	  Volume           vol(name+"_"+nam+"_wall_solid_back",sol,mat);
 	  wall.placeVolume(vol);
 	}
 	assembly.placeVolumeEx(wall,Position(0,0,zPos-clipSize/2),Rotation(0,0,reflect_angle));
@@ -249,7 +249,7 @@ static Ref_t create_element(LCDD& lcdd, const xml_h& e, SensitiveDetector&)  {
         if (start.inner_r != start.outer_r || end.inner_r != end.outer_r) {
 	  wallCone = ConeSegment(zHalf + clipSize/2,start.inner_r,start.outer_r,end.inner_r,end.outer_r);
 	  solid = SubtractionSolid(wallCone,clip,clip_pos_pos,Rotation(0,0,-clipAngle));
-	  Volume  wall (name+"_"+nam+"_wall_solid",solid,mat);
+	  Volume  wall (name+"_"+nam+"_wall_pos_solid",solid,mat);
 	  wall.setVisAttributes(vis);
 	  vol.placeVolume(wall);
 	}
@@ -260,7 +260,7 @@ static Ref_t create_element(LCDD& lcdd, const xml_h& e, SensitiveDetector&)  {
 	vol.setVisAttributes(vis);
         if (start.inner_r != start.outer_r || end.inner_r != end.outer_r) {
 	  solid = SubtractionSolid(wallCone, clip, clip_pos_neg, Rotation(0,0,+clipAngle));
-	  Volume  wall (name+"_"+nam+"_wall_solid",solid,mat);
+	  Volume  wall (name+"_"+nam+"_wall_neg_solid",solid,mat);
 	  wall.setVisAttributes(vis);
 	  vol.placeVolume(wall);
 	}