diff --git a/DDCore/CMakeLists.txt b/DDCore/CMakeLists.txt
index 21e9a380d7b6d16828a7f15604500689a21b010b..52d2cb85d467b93cefd815f14bf617675ebfc2d7 100644
--- a/DDCore/CMakeLists.txt
+++ b/DDCore/CMakeLists.txt
@@ -9,8 +9,9 @@ include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include
 file(GLOB sources src/*.cpp src/Evaluator/*.cpp)
 
 if(DD4HEP_USE_PYROOT)
-  file(GLOB detdesc_headers include/DD4hep/*.h)
-  ROOT_GENERATE_DICTIONARY( G__DD4hep ${detdesc_headers} LINKDEF include/ROOT/LinkDef.h)
+  file(GLOB headers include/DD4hep/*.h)
+  list(REMOVE_ITEM headers ${CMAKE_CURRENT_SOURCE_DIR}/include/DetFactoryHelper.h)
+  ROOT_GENERATE_DICTIONARY( G__DD4hep ${headers} LINKDEF include/ROOT/LinkDef.h)
   list(APPEND sources G__DD4hep.cxx)
   add_definitions(-DDD4HEP_USE_PYROOT)
   set(libraries PyROOT)
diff --git a/DDExamples/CLICSiD/src/DetFactoryHelper.h b/DDCore/include/DD4hep/DetFactoryHelper.h
similarity index 96%
rename from DDExamples/CLICSiD/src/DetFactoryHelper.h
rename to DDCore/include/DD4hep/DetFactoryHelper.h
index 73906cee8e8c1cef77184fbd6a47284698531c7e..c8b0c1469be6b7d84bd02841f28ab8dfad4a58f5 100644
--- a/DDExamples/CLICSiD/src/DetFactoryHelper.h
+++ b/DDCore/include/DD4hep/DetFactoryHelper.h
@@ -22,7 +22,7 @@ typedef DD4hep::XML::Collection_t  xml_coll_t;
 typedef DD4hep::XML::Handle_t      xml_h;
 typedef DD4hep::XML::RefElement    xml_ref_t;
 typedef DD4hep::XML::DetElement    xml_det_t;
-typedef xml_det_t::Component        xml_comp_t;
+typedef xml_det_t::Component       xml_comp_t;
 typedef DD4hep::XML::Dimension     xml_dim_t;
 typedef DD4hep::Geometry::LCDD     lcdd_t;
 
diff --git a/DDCore/python/lcdd.py b/DDCore/python/lcdd.py
index 48694e82502672d3ef627356b6708b5b7b38c9fe..c46f0323336c606b3f9076ea8a2ace6414c4d609 100644
--- a/DDCore/python/lcdd.py
+++ b/DDCore/python/lcdd.py
@@ -40,23 +40,28 @@ def _getFloat(self,*attrib):
   sval = self.get(attrib[0], None)
   if not sval and len(attrib) > 1: return attrib[1]
   else: return float(eval(sval.replace('(int)',''), constants))
-def _getBool(self,attrib): return bool(self.get(attrib))
+def _getBool(self,attrib): return self.get(attrib).lower() in ('true', 'yes', 'on') 
 xml._ElementInterface.getI = _getInt
 xml._ElementInterface.getF = _getFloat
 xml._ElementInterface.getB = _getBool
 
+
 xml._ElementInterface.name = property(lambda self: self.get('name'))
 xml._ElementInterface.type = property(lambda self: self.get('type'))
 xml._ElementInterface.vis  = property(lambda self: self.get('vis'))
 xml._ElementInterface.material = property(lambda self: self.get('material'))
 xml._ElementInterface.module = property(lambda self: self.get('module'))
 xml._ElementInterface.id   = property(lambda self: self.getI('id'))
+xml._ElementInterface.number = property(lambda self: self.getI('number'))
 xml._ElementInterface.x1   = property(lambda self: self.getF('x1'))
 xml._ElementInterface.x2   = property(lambda self: self.getF('x2'))
 xml._ElementInterface.x    = property(lambda self: self.getF('x'))
 xml._ElementInterface.y    = property(lambda self: self.getF('y'))
 xml._ElementInterface.z    = property(lambda self: self.getF('z'))
 xml._ElementInterface.zstart = property(lambda self: self.getF('zstart'))
+xml._ElementInterface.offset = property(lambda self: self.getF('offset'))
+xml._ElementInterface.radius = property(lambda self: self.getF('radius'))
+xml._ElementInterface.zhalf = property(lambda self: self.getF('zhalf'))
 xml._ElementInterface.phi0 = property(lambda self: self.getF('phi0'))
 xml._ElementInterface.r    = property(lambda self: self.getF('r'))
 xml._ElementInterface.dz   = property(lambda self: self.getF('dz'))
@@ -66,7 +71,17 @@ xml._ElementInterface.width = property(lambda self: self.getF('width'))
 xml._ElementInterface.inner_r = property(lambda self: self.getF('inner_r'))
 xml._ElementInterface.outer_r = property(lambda self: self.getF('outer_r'))
 xml._ElementInterface.z_length = property(lambda self: self.getF('z_length'))
+xml._ElementInterface.rmin = property(lambda self: self.getF('rmin'))
+xml._ElementInterface.rmax = property(lambda self: self.getF('rmax'))
+
+
+def getRotation(rot):
+  return Rotation(rot.getF('x',0.0),rot.getF('y',0.0), rot.getF('z',0.0))
 
+def getPosition(pos):
+  return Position(pos.getF('x',0.0),pos.getF('y',0.0), pos.getF('z',0.0))
+drivers['getRotation'] = getRotation
+drivers['getPosition'] = getPosition
 
 
 #---------------------------------------------------------------------------------
@@ -202,6 +217,7 @@ def process_display(lcdd, elem):
     if 'drawingStyle' in v.keys() :
       ds = v.get('drawingStyle')
       if ds == 'wireframe' : visattr.setDrawingStyle(VisAttr.WIREFRAME)
+    print visattr.toString()
     lcdd.addVisAttribute(visattr)
 
 def process_limits(lcdd, elem):
@@ -219,7 +235,6 @@ def process_detectors(lcdd, elem):
     procs = drivers.get('detector_%s'% d.get('type'), None)
     if procs : 
       detector = apply(procs,(lcdd, d))
-      print "Adding detector ", detector
       lcdd.addDetector(detector)
     else : 
       print 'Detector type %s not found' % d.get('type')
diff --git a/DDCore/src/LCDDImp.cpp b/DDCore/src/LCDDImp.cpp
index ecceb73fe0d2a2256a312504005496ce86fbac20..2411ba0410a561a4473c27208143510bd5fe4e71 100644
--- a/DDCore/src/LCDDImp.cpp
+++ b/DDCore/src/LCDDImp.cpp
@@ -116,8 +116,8 @@ void LCDDImp::init()  {
   Tube trackingSolid(lcdd,"tracking_cylinder",
 		     0.,
 		     _toDouble("tracking_region_radius"),
-		     _toDouble("2*tracking_region_zmax"),M_PI);
-  Volume tracking(lcdd,"tracking_volume",trackingSolid,air);
+		     _toDouble("2*tracking_region_zmax"),2*M_PI);
+  Volume tracking(lcdd,"tracking_volume",trackingSolid, air);
   world.placeVolume(tracking);
 
   //Ref_t ref_world(lcdd,"world",world.refName());
diff --git a/DDCore/src/LCDDImp.h b/DDCore/src/LCDDImp.h
index 914755c9a5be05bad66be1395efc3a1dc39929db..d2f5a853a747a7f83f5fef748cfadb4d1546767e 100644
--- a/DDCore/src/LCDDImp.h
+++ b/DDCore/src/LCDDImp.h
@@ -21,28 +21,28 @@ class TGeoManager;
  *   DD4hep namespace declaration
  */
 namespace DD4hep {
-
+  
   /*
    *   XML namespace declaration
    */
   namespace Geometry  {
-
+    
     struct Materials {};
-
+    
     class LCDDImp : public LCDD  {
     public:
       struct InvalidObjectError : public std::runtime_error {
         InvalidObjectError(const std::string& msg) : std::runtime_error(msg) {}
       };
-
+      
       struct ObjectHandleMap : public HandleMap  {
         ObjectHandleMap() {}
         void append_noCheck(const Ref_t& e) { 
           if ( e.isValid() )  {
             std::string n = e.name();
-	    if ( this->find(n) != this->end() ) {
-	      throw InvalidObjectError("Object "+n+" is already present in map!");
-	    }
+            if ( this->find(n) != this->end() ) {
+              throw InvalidObjectError("Object "+n+" is already present in map!");
+            }
             this->insert(std::make_pair(n,e.ptr()));
           }
         }
@@ -63,7 +63,7 @@ namespace DD4hep {
           throw InvalidObjectError("Attempt to add an object, which is of the wrong type.");
         }
       };
-
+      
       ObjectHandleMap     m_readouts;
       ObjectHandleMap     m_header;
       ObjectHandleMap     m_idDict;
@@ -73,44 +73,44 @@ namespace DD4hep {
       ObjectHandleMap     m_sensitive;
       ObjectHandleMap     m_display;
       ObjectHandleMap     m_fields;
-
+      
       // GDML fields
       ObjectHandleMap     m_gdml;
       ObjectHandleMap     m_define;
       ObjectHandleMap     m_structure;
       ObjectHandleMap     m_materials;
       ObjectHandleMap     m_solids;
-
-
+      
+      
       Volume              m_worldVol;
       Volume              m_trackingVol;
-
+      
       Material            m_materialAir;
       Material            m_materialVacuum;
-
+      
       Ref_t          m_setup;
-
+      
       void convertMaterials(const std::string& uri);
       //void convertMaterials(XML::Handle_t doc_element);
-
+      
       LCDDImp();
       //void fromCompact(XML::Handle_t doc_element);
       virtual void fromCompact(const std::string& fname);
-
+      
       virtual void create();
       virtual void init();
       virtual void addStdMaterials();
       virtual void endDocument();
-
+      
       void dump() const;
-
+      
       virtual Handle<TObject>  getRefChild(const HandleMap& e, const std::string& name, bool throw_if_not=true)  const;
       virtual Volume         pickMotherVolume(const DetElement& sd) const;
       virtual Volume         worldVolume() const      { return m_worldVol;          }
       virtual Volume         trackingVolume() const   { return m_trackingVol;       }
       virtual Material       air() const              { return m_materialVacuum;    }
       virtual Material       vacuum() const           { return m_materialAir;       }
-
+      
       virtual LimitSet limitSet(const std::string& name)  const
       {  return getRefChild(m_limits,name);                                         }  
       virtual VisAttr     visAttributes(const std::string& name) const
@@ -131,7 +131,7 @@ namespace DD4hep {
       {  return getRefChild(m_readouts,name);                                       }
       virtual DetElement detector(const std::string& name)  const
       {  return getRefChild(m_detectors,name);                                      }
-
+      
       virtual const HandleMap& header()  const        { return m_header;            }
       virtual const HandleMap& constants() const      { return m_define;            }
       virtual const HandleMap& visAttributes() const  { return m_display;           }
@@ -142,7 +142,7 @@ namespace DD4hep {
       virtual const HandleMap& materials()  const     { return m_materials;         }
       virtual const HandleMap& readouts() const       { return m_readouts;          }
       virtual const HandleMap& detectors()  const     { return m_detectors;         }
-
+      
       virtual LCDD& add(const Constant& x)            { return addConstant(x);      }
       virtual LCDD& add(const Solid& x)               { return addSolid(x);         }
       virtual LCDD& add(const Volume& x)              { return addVolume(x);        }
@@ -152,12 +152,12 @@ namespace DD4hep {
       virtual LCDD& add(const VisAttr& x)             { return addVisAttribute(x);  }
       virtual LCDD& add(const Readout& x)             { return addReadout(x);       }
       virtual LCDD& add(const DetElement& x)          { return addDetector(x);      }
-
+      
 #define __R  return *this
       // These are manager by the TGeoManager
       virtual LCDD& addSolid(const Ref_t& x);       //  { m_solids.append(x);     __R;}
       virtual LCDD& addVolume(const Ref_t& x);      //  { m_structure.append(x);  __R;}
-
+      
       // These not:
       virtual LCDD& addConstant(const Ref_t& x)         { m_define.append(x);     __R;}
       virtual LCDD& addMaterial(const Ref_t& x)         { m_materials.append(x);  __R;}
@@ -169,7 +169,7 @@ namespace DD4hep {
       virtual LCDD& addSensitiveDetector(const Ref_t& x){ m_sensitive.append(x);  __R;}
       virtual LCDD& addDetector(const Ref_t& x)         { m_detectors.append_noCheck(x);  __R;}
 #undef __R
-
+      
     };
   }
 }         /* End namespace DD4hep   */
diff --git a/DDCore/src/compact/Compact2Objects.cpp b/DDCore/src/compact/Compact2Objects.cpp
index 014e3bae7916a09dd376a2dd7d08022ca5ce5559..4c19c638c74a9bb2b5d21a3f18f91909f9d435ce 100644
--- a/DDCore/src/compact/Compact2Objects.cpp
+++ b/DDCore/src/compact/Compact2Objects.cpp
@@ -7,9 +7,10 @@
 //
 //====================================================================
 
-#include "DetFactoryHelper.h"
+#include "DD4hep/DetFactoryHelper.h"
 #include "DD4hep/IDDescriptor.h"
 #include "XML/DocumentHandler.h"
+#include "xercesc/util/XMLURL.hpp"
 
 #include "Conversions.h"
 #include "TGeoManager.h"
@@ -34,24 +35,24 @@ namespace DD4hep { namespace Geometry {
   struct Includes;
   struct GdmlFile;
   typedef DD4hep::IDDescriptor IDDescriptor;
-
+  
   template <typename T> Handle<> toObject(LCDD& lcdd, const XML::Handle_t& xml);
-
+  
   template <> Ref_t toRefObject<Constant>(lcdd_t& lcdd, const xml_h& e)  {
     xml_ref_t    constant(e);
     TNamed*      obj = new TNamed(constant.attr<string>(_A(name)).c_str(),
-				  constant.attr<string>(_A(value)).c_str()); 
+                                  constant.attr<string>(_A(value)).c_str()); 
     Ref_t        cons(obj);
     _toDictionary(obj->GetName(),obj->GetTitle());
     lcdd.addConstant(cons);
     return cons;
   }
-
+  
   template <> Ref_t toRefObject<Atom>(lcdd_t& /* lcdd */, const xml_h& e)  {
     /* <element Z="29" formula="Cu" name="Cu" >
-       <atom type="A" unit="g/mol" value="63.5456" />
-       </element>
-    */
+     <atom type="A" unit="g/mol" value="63.5456" />
+     </element>
+     */
     xml_ref_t    elem(e);
     TGeoManager* mgr      = gGeoManager;
     XML::Tag_t   eltname  = elem.name();
@@ -60,26 +61,26 @@ namespace DD4hep { namespace Geometry {
     if ( !element )  {
       xml_ref_t atom(elem.child(_X(atom)));
       tab->AddElement(elem.attr<string>(_A(name)).c_str(),
-		      elem.attr<string>(_A(formula)).c_str(),
-		      elem.attr<int>(_A(Z)),
-		      atom.attr<int>(_A(value))
-		      );
+                      elem.attr<string>(_A(formula)).c_str(),
+                      elem.attr<int>(_A(Z)),
+                      atom.attr<int>(_A(value))
+                      );
       element = tab->FindElement(eltname.c_str());
     }
     return Ref_t(element);
   }
-
+  
   template <> Ref_t toRefObject<Material>(lcdd_t& /* lcdd */, const xml_h& e)  {
     /*  <material name="Air">
-	<D type="density" unit="g/cm3" value="0.0012"/>
-	<fraction n="0.754" ref="N"/>
-	<fraction n="0.234" ref="O"/>
-	<fraction n="0.012" ref="Ar"/>
-	</material>
-	<element Z="29" formula="Cu" name="Cu" >
-	<atom type="A" unit="g/mol" value="63.5456" />
-	</element>
-    */
+     <D type="density" unit="g/cm3" value="0.0012"/>
+     <fraction n="0.754" ref="N"/>
+     <fraction n="0.234" ref="O"/>
+     <fraction n="0.012" ref="Ar"/>
+     </material>
+     <element Z="29" formula="Cu" name="Cu" >
+     <atom type="A" unit="g/mol" value="63.5456" />
+     </element>
+     */
     xml_ref_t      m(e);
     TGeoManager*   mgr      = gGeoManager;
     XML::Tag_t     mname    = m.name();
@@ -96,20 +97,20 @@ namespace DD4hep { namespace Geometry {
     }
     if ( mix )  {
       for(Int_t i=0, n=mix->GetNelements(); i<n; ++i)
-	elts.insert(mix->GetElement(i)->GetName());
+        elts.insert(mix->GetElement(i)->GetName());
     }
     for(; composites; ++composites)  {
       std::string nam = composites.attr<string>(_X(ref));
       TGeoElement*   element;
       if ( elts.find(nam) == elts.end() )  {
-	double fraction = composites.attr<double>(_X(n));
-	if ( 0 != (element=table->FindElement(nam.c_str())) )
-	  mix->AddElement(element,fraction);
-	else if ( 0 != (mat=mgr->GetMaterial(nam.c_str())) )
-	  mix->AddElement(mat,fraction);
-	else  {
-	  throw runtime_error("Something going very wrong. Undefined material:"+nam);
-	}
+        double fraction = composites.attr<double>(_X(n));
+        if ( 0 != (element=table->FindElement(nam.c_str())) )
+          mix->AddElement(element,fraction);
+        else if ( 0 != (mat=mgr->GetMaterial(nam.c_str())) )
+          mix->AddElement(mat,fraction);
+        else  {
+          throw runtime_error("Something going very wrong. Undefined material:"+nam);
+        }
       }
     }
     TGeoMedium* medium = mgr->GetMedium(matname);
@@ -121,7 +122,7 @@ namespace DD4hep { namespace Geometry {
     }
     return Ref_t(medium);
   }
-
+  
   template <> Ref_t toRefObject<IDDescriptor>(lcdd_t& /* lcdd */, const xml_h& e)  {
     /*     <id>system:6,barrel:3,module:4,layer:8,slice:5,x:32:-16,y:-16</id>   */
     Value<TNamed,IDDescriptor>* id = new Value<TNamed,IDDescriptor>();
@@ -130,7 +131,7 @@ namespace DD4hep { namespace Geometry {
     id->SetTitle(dsc.c_str());
     return Ref_t(id);
   }
-
+  
   template <> Ref_t toRefObject<Limit>(lcdd_t& lcdd, const xml_h& e)  {
     /*     <limit name="step_length_max" particles="*" value="5.0" unit="mm" />
      */
@@ -140,7 +141,7 @@ namespace DD4hep { namespace Geometry {
     limit.setUnit(e.attr<string>(_A(unit)));
     return limit;
   }
-
+  
   template <> Ref_t toRefObject<LimitSet>(lcdd_t& lcdd, const xml_h& e)  {
     /*      <limitset name="...."> ... </limitset>
      */
@@ -149,7 +150,7 @@ namespace DD4hep { namespace Geometry {
       ls.addLimit(toRefObject<Limit>(lcdd,c));
     return ls;
   }
-
+  
   /// Convert compact visualization attribute to LCDD visualization attribute
   template <> Ref_t toRefObject<VisAttr>(lcdd_t& lcdd, const xml_h& e)  {
     /*    <vis name="SiVertexBarrelModuleVis" alpha="1.0" r="1.0" g="0.75" b="0.76" drawingStyle="wireframe" showDaughters="false" visible="true"/>
@@ -179,7 +180,7 @@ namespace DD4hep { namespace Geometry {
     if ( e.hasAttr(_A(showDaughters)) ) attr.setShowDaughters(e.attr<bool>(_A(showDaughters)));
     return attr;
   }
-
+  
   template <> Elt_t toObject<GridXYZ>(lcdd_t& lcdd, const xml_h& e)  {
     GridXYZ obj(lcdd);
     if ( e.hasAttr(_A(gridSizeX)) ) obj.setGridSizeX(e.attr<float>(_A(gridSizeX)));
@@ -193,35 +194,35 @@ namespace DD4hep { namespace Geometry {
     if ( e.hasAttr(_A(gridSizeY)) ) obj.setGridSizeY(e.attr<float>(_A(gridSizeY)));
     return obj;
   }
-
+  
   template <> Elt_t toObject<CartesianGridXY>(lcdd_t& lcdd, const xml_h& e)  {
     CartesianGridXY obj(lcdd);
     if ( e.hasAttr(_A(gridSizeX)) ) obj.setGridSizeX(e.attr<double>(_A(gridSizeX)));
     if ( e.hasAttr(_A(gridSizeY)) ) obj.setGridSizeY(e.attr<double>(_A(gridSizeY)));
     return obj;
   }
-
+  
   template <> Elt_t toObject<ProjectiveCylinder>(lcdd_t& lcdd, const xml_h& e)  {
     ProjectiveCylinder obj(lcdd);
     if ( e.hasAttr(_A(phiBins))   ) obj.setPhiBins(e.attr<int>(_A(phiBins)));
     if ( e.hasAttr(_A(thetaBins)) ) obj.setThetaBins(e.attr<int>(_A(thetaBins)));
     return obj;
   }
-
+  
   template <> Elt_t toObject<NonProjectiveCylinder>(lcdd_t& lcdd, const xml_h& e)  {
     NonProjectiveCylinder obj(lcdd);
     if ( e.hasAttr(_A(gridSizePhi)) ) obj.setThetaBinSize(e.attr<double>(_A(gridSizePhi)));
     if ( e.hasAttr(_A(gridSizeZ))   ) obj.setPhiBinSize(e.attr<double>(_A(gridSizeZ)));
     return obj;
   }
-
+  
   template <> Elt_t toObject<ProjectiveZPlane>(lcdd_t& lcdd, const xml_h& e)  {
     ProjectiveZPlane obj(lcdd);
     if ( e.hasAttr(_A(phiBins))   ) obj.setThetaBins(e.attr<int>(_A(phiBins)));
     if ( e.hasAttr(_A(thetaBins)) ) obj.setPhiBins(e.attr<int>(_A(thetaBins)));
     return obj;
   }
-
+  
   template <> Elt_t toObject<Segmentation>(lcdd_t& lcdd, const xml_h& e)  {
     string seg_typ = e.attr<string>(_A(type));
     if ( seg_typ == "GridXYZ" )
@@ -244,13 +245,13 @@ namespace DD4hep { namespace Geometry {
       cout << "Request to create UNKNOWN segmentation of type:" << seg_typ << endl;
     return Elt_t(0);
   }
-
+  
   template <> Ref_t toRefObject<Readout>(lcdd_t& lcdd, const xml_h& e)  {
     /* <readout name="HcalBarrelHits">
-       <segmentation type="RegularNgonCartesianGridXY" gridSizeX="3.0*cm" gridSizeY="3.0*cm" />
-       <id>system:6,barrel:3,module:4,layer:8,slice:5,x:32:-16,y:-16</id>
-       </readout>
-    */
+     <segmentation type="RegularNgonCartesianGridXY" gridSizeX="3.0*cm" gridSizeY="3.0*cm" />
+     <id>system:6,barrel:3,module:4,layer:8,slice:5,x:32:-16,y:-16</id>
+     </readout>
+     */
     xml_h   id, seg;
     string  name = e.attr<string>(_A(name));
     Readout ro(lcdd,name);
@@ -266,26 +267,26 @@ namespace DD4hep { namespace Geometry {
     }
     return ro;
   }
-
+  
   namespace  {
     template <typename T> static Ref_t toRefObject(LCDD& lcdd, const xml_h& xml, SensitiveDetector& sens) 
     {  return toRefObject<T>(lcdd,xml,sens); }
   }
-
+  
   template <> Ref_t toRefObject<SensitiveDetector>(lcdd_t& lcdd, const xml_h& e)  {
     string    nam = e.attr<string>(_A(name));
     string    typ = e.attr<string>(_A(type));
-
+    
     if      ( e.hasAttr("calorimeterType") ) typ = "calorimeter";
     else if ( typ.find("Tracker") != string::npos ) typ = "tracker";
     else if ( nam.find("Tracker") != string::npos ) typ = "tracker";
-
+    
     if ( e.hasAttr(_A(readout)) )  {
       Readout            ro = lcdd.readout(e.attr<string>(_A(readout)));
       Segmentation      seg = ro.segmentation();
       SensitiveDetector  sd = SensitiveDetector(lcdd,typ,nam);
       if ( seg.isValid() )  {
-	sd.setSegmentation(seg);
+        sd.setSegmentation(seg);
       }
       sd.setHitsCollection(ro.name());
       sd.setIDSpec(ro.idSpec());
@@ -294,12 +295,12 @@ namespace DD4hep { namespace Geometry {
     }
     return SensitiveDetector();
   }
-
+  
   template <> Ref_t toRefObject<Region>(lcdd_t& /* lcdd */, const xml_h& e)  {
     xml_ref_t compact(e);
     return Ref_t(0);
   }
-
+  
   template <> void Converter<Constant>::operator()(const xml_h& element)  const  {
     lcdd.addConstant(toRefObject<to_type>(lcdd,element));
   }
@@ -338,13 +339,13 @@ namespace DD4hep { namespace Geometry {
     try {
       SensitiveDetector  sd = toRefObject<SensitiveDetector>(lcdd,element);
       DetElement det(Handle<TNamed>(ROOT::Reflex::PluginService::Create<TNamed*>(type,&lcdd,&element,&sd)));
-
+      
       if ( det.isValid() && element.hasAttr(_A(readout)) )  {
-	string rdo = element.attr<string>(_A(readout));
-	det.setReadout(lcdd.readout(rdo));
+        string rdo = element.attr<string>(_A(readout));
+        det.setReadout(lcdd.readout(rdo));
       }
       cout << (det.isValid() ? "Converted" : "FAILED    ")
-	   << " subdetector:" << name << " of type " << type << endl;
+      << " subdetector:" << name << " of type " << type << endl;
       lcdd.addDetector(det);
     }
     catch(const exception& e) {
@@ -361,8 +362,9 @@ namespace DD4hep { namespace Geometry {
   }
   
   template <> void Converter<GdmlFile>::operator()(const xml_h& element)  const  {
-    string fname = element.attr<string>(_A(ref));
-    xml_h materials = XML::DocumentHandler().load(fname).root();
+    xercesc::XMLURL base(element.ptr()->getBaseURI());
+    xercesc::XMLURL ref(base, element.attr_value(_A(ref)));
+    xml_h materials = XML::DocumentHandler().load(_toString(ref.getURLText())).root();
     Converter<Materials>(this->lcdd)(materials);
   }
   
@@ -374,7 +376,7 @@ namespace DD4hep { namespace Geometry {
     xml_coll_t(compact,_X(define)   ).for_each(_X(constant),Converter<Constant>(lcdd));
     xml_coll_t(compact,_X(materials)).for_each(_X(element), Converter<Atom>(lcdd));
     xml_coll_t(compact,_X(materials)).for_each(_X(material),Converter<Material>(lcdd));
-
+    
     lcdd.init();
     xml_coll_t(compact,_X(limits)   ).for_each(_X(limitset),Converter<LimitSet>(lcdd));
     xml_coll_t(compact,_X(display)  ).for_each(_X(vis),     Converter<VisAttr>(lcdd));
diff --git a/DDCore/src/compact/DetFactoryHelper.h b/DDCore/src/compact/DetFactoryHelper.h
deleted file mode 100644
index be09f3630795d6b836edc26c4264d4924b5152d6..0000000000000000000000000000000000000000
--- a/DDCore/src/compact/DetFactoryHelper.h
+++ /dev/null
@@ -1,50 +0,0 @@
-// $Id:$
-//====================================================================
-//  AIDA Detector description 
-//--------------------------------------------------------------------
-//
-//  Author     : M.Frank
-//
-//====================================================================
-#ifndef DD4hep_DETECTOR_DETFACTORYHELPER_H
-#define DD4hep_DETECTOR_DETFACTORYHELPER_H
-
-#include "XML/XMLDetector.h"
-#include "DD4hep/LCDD.h"
-#include "DD4hep/Factories.h"
-
-// Helpers to access tags and attributes quickly without specifying explicitly namespaces
-#define _X(a) DD4hep::XML::Tag_##a
-#define _A(a) DD4hep::XML::Attr_##a
-
-// Shortcuts to elements of the XML namespace
-typedef DD4hep::XML::Collection_t  xml_coll_t;
-typedef DD4hep::XML::Handle_t      xml_h;
-typedef DD4hep::XML::RefElement    xml_ref_t;
-typedef DD4hep::XML::DetElement    xml_det_t;
-typedef xml_det_t::Component        xml_comp_t;
-typedef DD4hep::XML::Dimension     xml_dim_t;
-typedef DD4hep::Geometry::LCDD     lcdd_t;
-
-/*
- *   DD4hep namespace declaration
- */
-namespace DD4hep { 
-
-  /*
-   *   Geometry sub-namespace declaration
-   */
-  namespace Geometry {
-    static inline std::string _toString(const XMLCh* value)  
-      {
-	return XML::_toString(value); 
-      }
-
-    template <typename T> inline std::string _toString(T value, const char* fmt)
-      {
-	return XML::_toString(value, fmt); 
-      }
-  }
-}
-
-#endif // DD4hep_DETECTOR_DETFACTORYHELPER_H
diff --git a/DDExamples/CLICSiD/drivers/SiTrackerBarrel.py b/DDExamples/CLICSiD/drivers/SiTrackerBarrel.py
index 566d3279c24a3e86f80942c54e89dc2f137197c0..bfcf0edb82f3fad7aeaa99d5d0aefa834fdad79e 100644
--- a/DDExamples/CLICSiD/drivers/SiTrackerBarrel.py
+++ b/DDExamples/CLICSiD/drivers/SiTrackerBarrel.py
@@ -1,9 +1,3 @@
-def getRotation(rot):
-  return Rotation(rot.getF('x',0.0),rot.getF('y',0.0), rot.getF('z',0.0))
-
-def getPosition(pos):
-  return Position(pos.getF('x',0.0),pos.getF('y',0.0), pos.getF('z',0.0))
-
 def detector_SiTrackerBarrel(lcdd, det):
   sdet    = DetElement(lcdd, det.name, det.type, det.id)
   mother  = lcdd.trackingVolume()
diff --git a/DDExamples/CLICSiD/src/CylindricalBarrelCalorimeter_geo.cpp b/DDExamples/CLICSiD/src/CylindricalBarrelCalorimeter_geo.cpp
index acb9b9fa37e399c401e558fde67ccc50a53428e4..4ea4139b41475232e68c739ecc94b974799930cf 100644
--- a/DDExamples/CLICSiD/src/CylindricalBarrelCalorimeter_geo.cpp
+++ b/DDExamples/CLICSiD/src/CylindricalBarrelCalorimeter_geo.cpp
@@ -7,7 +7,7 @@
 //
 //====================================================================
 
-#include "DetFactoryHelper.h"
+#include "DD4hep/DetFactoryHelper.h"
 #include "CompactDetectors.h"
 
 using namespace std;
@@ -29,42 +29,42 @@ namespace DD4hep { namespace Geometry {
     double     rmin      = dim.inner_r();
     double     r         = rmin;
     int        n         = 0;
-
+    
     for(xml_coll_t c(x_det,_X(layer)); c; ++c)  {
       xml_comp_t x_layer = c;
       for(int i=0, m=0, repeat=x_layer.repeat(); i<repeat; ++i, m=0)  {
-	string layer_name = det_name + _toString(n,"_layer%d");
-	Tube   layer_tub(lcdd,layer_name);
-	Volume layer_vol(lcdd,layer_name+"_volume",layer_tub,air);
-	double rlayer = r;
-
-	for(xml_coll_t l(x_layer,_X(slice)); l; ++l, ++m)  {
-	  xml_comp_t x_slice = l;
-	  Material   slice_mat  = lcdd.material(x_slice.materialStr());
-	  string     slice_name = layer_name + _toString(m,"slice%d");
-	  Tube       slice_tube(lcdd,slice_name);
-	  Volume     slice_vol (lcdd,slice_name+"_volume",slice_tube,slice_mat);
-	  double     router = r + x_slice.thickness();
-
-	  if ( x_slice.isSensitive() ) slice_vol.setSensitiveDetector(sens);
-	  slice_tube.setDimensions(r,router,z * 2);
-	  r = router;
-	  slice_vol.setAttributes(lcdd,x_slice.regionStr(),x_slice.limitsStr(),x_slice.visStr());
-	  // Instantiate physical volume
-	  layer_vol.placeVolume(slice_vol,IdentityPos());
-	}
-	layer_vol.setVisAttributes(lcdd,x_layer.visStr());
-	layer_tub.setDimensions(rlayer,r,z * 2);
-
-	PlacedVolume layer_physvol = envelopeVol.placeVolume(layer_vol,IdentityPos());
-	layer_physvol.addPhysVolID(_A(layer),n);
-	++n;
+        string layer_name = det_name + _toString(n,"_layer%d");
+        Tube   layer_tub(lcdd,layer_name);
+        Volume layer_vol(lcdd,layer_name+"_volume",layer_tub,air);
+        double rlayer = r;
+        
+        for(xml_coll_t l(x_layer,_X(slice)); l; ++l, ++m)  {
+          xml_comp_t x_slice = l;
+          Material   slice_mat  = lcdd.material(x_slice.materialStr());
+          string     slice_name = layer_name + _toString(m,"slice%d");
+          Tube       slice_tube(lcdd,slice_name);
+          Volume     slice_vol (lcdd,slice_name+"_volume",slice_tube,slice_mat);
+          double     router = r + x_slice.thickness();
+          
+          if ( x_slice.isSensitive() ) slice_vol.setSensitiveDetector(sens);
+          slice_tube.setDimensions(r,router,z * 2);
+          r = router;
+          slice_vol.setAttributes(lcdd,x_slice.regionStr(),x_slice.limitsStr(),x_slice.visStr());
+          // Instantiate physical volume
+          layer_vol.placeVolume(slice_vol,IdentityPos());
+        }
+        layer_vol.setVisAttributes(lcdd,x_layer.visStr());
+        layer_tub.setDimensions(rlayer,r,z * 2);
+        
+        PlacedVolume layer_physvol = envelopeVol.placeVolume(layer_vol,IdentityPos());
+        layer_physvol.addPhysVolID(_A(layer),n);
+        ++n;
       }
     }
     envelope.setDimensions(rmin,r,2.*z);
     // Set region of slice
     envelopeVol.setAttributes(lcdd,x_det.regionStr(),x_det.limitsStr(),x_det.visStr());
-
+    
     PlacedVolume physvol = lcdd.pickMotherVolume(sdet).placeVolume(envelopeVol,IdentityPos());
     physvol.addPhysVolID(_A(system),sdet.id()).addPhysVolID(_A(barrel),0);
     sdet.addPlacement(physvol);
diff --git a/DDExamples/CLICSiD/src/CylindricalEndcapCalorimeter_geo.cpp b/DDExamples/CLICSiD/src/CylindricalEndcapCalorimeter_geo.cpp
index f63c3cc5cb4509c7b3f2df603e6b507750bd6ef1..528625533afbc0b6d038925a844527d05d98c12b 100644
--- a/DDExamples/CLICSiD/src/CylindricalEndcapCalorimeter_geo.cpp
+++ b/DDExamples/CLICSiD/src/CylindricalEndcapCalorimeter_geo.cpp
@@ -7,7 +7,7 @@
 //
 //====================================================================
 
-#include "DetFactoryHelper.h"
+#include "DD4hep/DetFactoryHelper.h"
 #include "CompactDetectors.h"
 #include "XML/Layering.h"
 
@@ -32,55 +32,55 @@ namespace DD4hep { namespace Geometry {
     double     totWidth  = Layering(x_det).totalThickness();
     double     z    = zmin;
     int        n    = 0;
-
+    
     for(xml_coll_t c(x_det,_X(layer)); c; ++c)  {
       xml_comp_t x_layer = c;
       double layerWidth = 0;
       for(xml_coll_t l(x_layer,_X(slice)); l; ++l)
-	layerWidth += xml_comp_t(l).thickness();
+        layerWidth += xml_comp_t(l).thickness();
       for(int i=0, m=0, repeat=x_layer.repeat(); i<repeat; ++i, m=0)  {
-	double     zlayer = z;
-	string     layer_name = det_name + _toString(n,"_layer%d");
-	Tube       layer_tub(lcdd,layer_name,rmin,rmax,layerWidth);
-	Volume     layer_vol(lcdd,layer_name+"_volume",layer_tub,air);
-
-	for(xml_coll_t l(x_layer,_X(slice)); l; ++l, ++m)  {
-	  xml_comp_t x_slice = l;
-	  double     w = x_slice.thickness();
-	  string     slice_name = layer_name + _toString(m,"slice%d");
-	  Material   slice_mat  = lcdd.material(x_slice.materialStr());
-	  Tube       slice_tube(lcdd,slice_name, rmin,rmax,w);
-	  Volume     slice_vol (lcdd,slice_name+"_volume", slice_tube, slice_mat);
-
-	  if ( x_slice.isSensitive() ) slice_vol.setSensitiveDetector(sens);
-
-	  // Set attributes of slice
-	  slice_vol.setAttributes(lcdd,x_slice.regionStr(),x_slice.limitsStr(),x_slice.visStr());
-	  layer_vol.placeVolume(slice_vol,Position(0,0,z-zlayer-layerWidth/2+w/2));
-	  z += w;
-	}
-	layer_vol.setVisAttributes(lcdd,x_layer.visStr());
-
-	Position layer_pos(0,0,zlayer-zmin-totWidth/2+layerWidth/2);
-	PlacedVolume layer_phys = envelopeVol.placeVolume(layer_vol,layer_pos);
-	layer_phys.addPhysVolID("layer",n);
-	++n;
+        double     zlayer = z;
+        string     layer_name = det_name + _toString(n,"_layer%d");
+        Tube       layer_tub(lcdd,layer_name,rmin,rmax,layerWidth);
+        Volume     layer_vol(lcdd,layer_name+"_volume",layer_tub,air);
+        
+        for(xml_coll_t l(x_layer,_X(slice)); l; ++l, ++m)  {
+          xml_comp_t x_slice = l;
+          double     w = x_slice.thickness();
+          string     slice_name = layer_name + _toString(m,"slice%d");
+          Material   slice_mat  = lcdd.material(x_slice.materialStr());
+          Tube       slice_tube(lcdd,slice_name, rmin,rmax,w);
+          Volume     slice_vol (lcdd,slice_name+"_volume", slice_tube, slice_mat);
+          
+          if ( x_slice.isSensitive() ) slice_vol.setSensitiveDetector(sens);
+          
+          // Set attributes of slice
+          slice_vol.setAttributes(lcdd,x_slice.regionStr(),x_slice.limitsStr(),x_slice.visStr());
+          layer_vol.placeVolume(slice_vol,Position(0,0,z-zlayer-layerWidth/2+w/2));
+          z += w;
+        }
+        layer_vol.setVisAttributes(lcdd,x_layer.visStr());
+        
+        Position layer_pos(0,0,zlayer-zmin-totWidth/2+layerWidth/2);
+        PlacedVolume layer_phys = envelopeVol.placeVolume(layer_vol,layer_pos);
+        layer_phys.addPhysVolID("layer",n);
+        ++n;
       }
     }
     envelope.setDimensions(rmin,rmax,totWidth,2.*M_PI);
     // Set attributes of slice
     envelopeVol.setAttributes(lcdd,x_det.regionStr(),x_det.limitsStr(),x_det.visStr());
-
+    
     DetElement sdet(lcdd,det_name,det_type,x_det.id());
     Volume     motherVol = lcdd.pickMotherVolume(sdet);
     PlacedVolume phv=motherVol.placeVolume(envelopeVol,Position(0,0,zmin+totWidth/2));
     phv.addPhysVolID(_A(system),sdet.id())
-       .addPhysVolID(_A(barrel),1);
+    .addPhysVolID(_A(barrel),1);
     sdet.addPlacement(phv);
     if ( reflect )   {
       phv=motherVol.placeVolume(envelopeVol,Position(0,0,-zmin-totWidth/2),ReflectRot());
       phv.addPhysVolID(_A(system),sdet.id())
-	 .addPhysVolID(_A(barrel),2);
+      .addPhysVolID(_A(barrel),2);
     }
     return sdet;
   }
diff --git a/DDExamples/CLICSiD/src/DiskTracker_geo.cpp b/DDExamples/CLICSiD/src/DiskTracker_geo.cpp
index fbb59802379ca2d7a2d316cb995cd0b7ea0e8146..4bddb83e1faed23b11124ea7ab8a0bcde13fc09a 100644
--- a/DDExamples/CLICSiD/src/DiskTracker_geo.cpp
+++ b/DDExamples/CLICSiD/src/DiskTracker_geo.cpp
@@ -7,7 +7,7 @@
 //
 //====================================================================
 
-#include "DetFactoryHelper.h"
+#include "DD4hep/DetFactoryHelper.h"
 #include "CompactDetectors.h"
 
 using namespace std;
@@ -15,7 +15,7 @@ using namespace DD4hep;
 using namespace DD4hep::Geometry;
 
 namespace DD4hep { namespace Geometry {
-
+  
   template <> Ref_t DetElementFactory<DiskTracker>::create(LCDD& lcdd, const xml_h& e, SensitiveDetector& sens)  {
     xml_det_t  x_det     = e;
     Material   air       = lcdd.air();
@@ -25,7 +25,7 @@ namespace DD4hep { namespace Geometry {
     DetElement sdet (lcdd,det_name,det_type,x_det.id());
     Volume     motherVol = lcdd.pickMotherVolume(sdet);
     int l_num = 0;
-
+    
     for(xml_coll_t i(x_det,_X(layer)); i; ++i, ++l_num)  {
       xml_comp_t x_layer = i;
       string l_nam = det_name+_toString(l_num,"_layer%d");
@@ -36,39 +36,39 @@ namespace DD4hep { namespace Geometry {
       Tube    l_tub(lcdd,l_nam,rmin,rmax,2*z,2*M_PI);
       Volume  l_vol(lcdd,l_nam+"_volume",l_tub,air);
       int     s_num = 0;
-
+      
       for(xml_coll_t j(x_layer,_X(slice)); j; ++j)  {
-	double thickness = xml_comp_t(j).thickness();
-	layerWidth += thickness;
+        double thickness = xml_comp_t(j).thickness();
+        layerWidth += thickness;
       }
       l_vol.setVisAttributes(lcdd,x_layer.visStr());
       for(xml_coll_t j(x_layer,_X(slice)); j; ++j, ++s_num)  {
-	xml_comp_t x_slice = j;
-	double thick = x_slice.thickness();
-	Material mat = lcdd.material(x_slice.materialStr());
-	string s_nam = l_nam+_toString(s_num,"_slice%d");
-	Tube   s_tub(lcdd,s_nam,rmin,rmax,2*M_PI);
-	Volume s_vol(lcdd,s_nam+"_volume", s_tub, mat);
-
-	if ( x_slice.isSensitive() ) s_vol.setSensitiveDetector(sens);
-	s_vol.setAttributes(lcdd,x_slice.regionStr(),x_slice.limitsStr(),x_slice.visStr());
-
-	PlacedVolume spv = l_vol.placeVolume(s_vol,Position(0,0,z-zmin-layerWidth/2+thick/2));
-	spv.addPhysVolID(_X(layer),l_num);
-	spv.addPhysVolID(_X(slice),s_num);
+        xml_comp_t x_slice = j;
+        double thick = x_slice.thickness();
+        Material mat = lcdd.material(x_slice.materialStr());
+        string s_nam = l_nam+_toString(s_num,"_slice%d");
+        Tube   s_tub(lcdd,s_nam,rmin,rmax,2*M_PI);
+        Volume s_vol(lcdd,s_nam+"_volume", s_tub, mat);
+        
+        if ( x_slice.isSensitive() ) s_vol.setSensitiveDetector(sens);
+        s_vol.setAttributes(lcdd,x_slice.regionStr(),x_slice.limitsStr(),x_slice.visStr());
+        
+        PlacedVolume spv = l_vol.placeVolume(s_vol,Position(0,0,z-zmin-layerWidth/2+thick/2));
+        spv.addPhysVolID(_X(layer),l_num);
+        spv.addPhysVolID(_X(slice),s_num);
       }
-
+      
       PlacedVolume lpv = motherVol.placeVolume(l_vol,Position(0,0,zmin+layerWidth/2.));
       lpv.addPhysVolID(_X(system),sdet.id());
       lpv.addPhysVolID(_X(barrel),1);
       DetElement layer(lcdd,l_nam,det_type+"/Layer",l_num);
       sdet.add(layer.addPlacement(lpv));
       if ( reflect )  {
-	PlacedVolume lpvR = motherVol.placeVolume(l_vol,Position(0,0,-zmin-layerWidth/2),ReflectRot());
-	lpvR.addPhysVolID(_X(system),sdet.id());
-	lpvR.addPhysVolID(_X(barrel),2);
-	DetElement layerR(lcdd,l_nam+"_reflect",det_type+"/Layer",l_num);
-	sdet.add(layerR.addPlacement(lpvR));
+        PlacedVolume lpvR = motherVol.placeVolume(l_vol,Position(0,0,-zmin-layerWidth/2),ReflectRot());
+        lpvR.addPhysVolID(_X(system),sdet.id());
+        lpvR.addPhysVolID(_X(barrel),2);
+        DetElement layerR(lcdd,l_nam+"_reflect",det_type+"/Layer",l_num);
+        sdet.add(layerR.addPlacement(lpvR));
       }
     }
     sdet.setCombineHits(x_det.attr<bool>(_A(combineHits)),sens);
diff --git a/DDExamples/CLICSiD/src/EcalBarrel_geo.cpp b/DDExamples/CLICSiD/src/EcalBarrel_geo.cpp
index 59851975f97db475b8557624fd75c780e70b1b4c..c3cafd1268d3d4f875ec07ed42e11e2b9b8f5e19 100644
--- a/DDExamples/CLICSiD/src/EcalBarrel_geo.cpp
+++ b/DDExamples/CLICSiD/src/EcalBarrel_geo.cpp
@@ -7,7 +7,7 @@
 //
 //====================================================================
 
-#include "DetFactoryHelper.h"
+#include "DD4hep/DetFactoryHelper.h"
 #include "CompactDetectors.h"
 #include "XML/Layering.h"
 #include "TGeoTrd2.h"
diff --git a/DDExamples/CLICSiD/src/ForwardDetector_geo.cpp b/DDExamples/CLICSiD/src/ForwardDetector_geo.cpp
index 543fff9bfb0d2b3ae0a3720eab08ade78652d0cc..7d0e9b2d75ae511b5094be33d857accf79aa2adf 100644
--- a/DDExamples/CLICSiD/src/ForwardDetector_geo.cpp
+++ b/DDExamples/CLICSiD/src/ForwardDetector_geo.cpp
@@ -8,7 +8,7 @@
 //====================================================================
 
 #include "XML/Layering.h"
-#include "DetFactoryHelper.h"
+#include "DD4hep/DetFactoryHelper.h"
 #include "CompactDetectors.h"
 
 using namespace std;
diff --git a/DDExamples/CLICSiD/src/MultiLayerTracker_geo.cpp b/DDExamples/CLICSiD/src/MultiLayerTracker_geo.cpp
index 0ce1d91748b979be6c56af04663d0b9a27ebaaff..093aa9ac1cbb7313998e53797b40c31521042698 100644
--- a/DDExamples/CLICSiD/src/MultiLayerTracker_geo.cpp
+++ b/DDExamples/CLICSiD/src/MultiLayerTracker_geo.cpp
@@ -7,7 +7,7 @@
 //
 //====================================================================
 
-#include "DetFactoryHelper.h"
+#include "DD4hep/DetFactoryHelper.h"
 #include "CompactDetectors.h"
 
 using namespace std;
@@ -24,7 +24,7 @@ namespace DD4hep { namespace Geometry {
     DetElement sdet(lcdd,det_name,det_type,x_det.id());
     Volume     motherVol = lcdd.pickMotherVolume(sdet);
     int n = 0;
-
+    
     for(xml_coll_t i(x_det,_X(layer)); i; ++i, ++n)  {
       xml_comp_t x_layer = i;
       string  l_name = det_name+_toString(n,"_layer%d");
@@ -35,26 +35,26 @@ namespace DD4hep { namespace Geometry {
       double  rmin = x_layer.inner_r();
       double  r    = rmin;
       int m = 0;
-
+      
       for(xml_coll_t j(x_layer,_X(slice)); j; ++j, ++m)  {
-	xml_comp_t x_slice = j;
-	Material mat = lcdd.material(x_slice.materialStr());
-	string s_name= l_name+_toString(m,"_slice%d");
-	Tube   s_tub(lcdd,s_name);
-	Volume s_vol(lcdd,s_name+"_volume", s_tub, mat);
-
-	r += x_slice.thickness();
-	s_tub.setDimensions(r,r,2*z,2*M_PI);
-	if ( x_slice.isSensitive() ) s_vol.setSensitiveDetector(sens);
-	// Set Attributes
-	s_vol.setAttributes(lcdd,x_slice.regionStr(),x_slice.limitsStr(),x_slice.visStr());
-	PlacedVolume spv = l_vol.placeVolume(s_vol,IdentityPos());
-	// Slices have no extra id. Take the ID of the layer!
-	spv.addPhysVolID(_X(layer),n);
+        xml_comp_t x_slice = j;
+        Material mat = lcdd.material(x_slice.materialStr());
+        string s_name= l_name+_toString(m,"_slice%d");
+        Tube   s_tub(lcdd,s_name);
+        Volume s_vol(lcdd,s_name+"_volume", s_tub, mat);
+        
+        r += x_slice.thickness();
+        s_tub.setDimensions(r,r,2*z,2*M_PI);
+        if ( x_slice.isSensitive() ) s_vol.setSensitiveDetector(sens);
+        // Set Attributes
+        s_vol.setAttributes(lcdd,x_slice.regionStr(),x_slice.limitsStr(),x_slice.visStr());
+        PlacedVolume spv = l_vol.placeVolume(s_vol,IdentityPos());
+        // Slices have no extra id. Take the ID of the layer!
+        spv.addPhysVolID(_X(layer),n);
       }
       l_tub.setDimensions(rmin,r,2*z,2*M_PI);
       l_vol.setVisAttributes(lcdd,x_layer.visStr());
-
+      
       PlacedVolume lpv = motherVol.placeVolume(l_vol,IdentityPos());
       lpv.addPhysVolID(_X(system),sdet.id()).addPhysVolID(_X(barrel),0);
       sdet.add(layer.addPlacement(lpv));
diff --git a/DDExamples/CLICSiD/src/PolyconeSupport_geo.cpp b/DDExamples/CLICSiD/src/PolyconeSupport_geo.cpp
index c13a671348636993c8ed9dc2b9d243cffe4876f4..403ec19eb918de8e9933cc15950843d2c559ab09 100644
--- a/DDExamples/CLICSiD/src/PolyconeSupport_geo.cpp
+++ b/DDExamples/CLICSiD/src/PolyconeSupport_geo.cpp
@@ -7,7 +7,7 @@
 //
 //====================================================================
 
-#include "DetFactoryHelper.h"
+#include "DD4hep/DetFactoryHelper.h"
 #include "CompactDetectors.h"
 
 using namespace std;
diff --git a/DDExamples/CLICSiD/src/PolyhedraBarrelCalorimeter2_geo.cpp b/DDExamples/CLICSiD/src/PolyhedraBarrelCalorimeter2_geo.cpp
index 53c48859bf4276e6b49e53f8d53a381cdd58679c..ce5b357fba6835cebb94f4f5420f3bcd272160a0 100644
--- a/DDExamples/CLICSiD/src/PolyhedraBarrelCalorimeter2_geo.cpp
+++ b/DDExamples/CLICSiD/src/PolyhedraBarrelCalorimeter2_geo.cpp
@@ -7,7 +7,7 @@
 //
 //====================================================================
 
-#include "DetFactoryHelper.h"
+#include "DD4hep/DetFactoryHelper.h"
 #include "CompactDetectors.h"
 #include "XML/Layering.h"
 
diff --git a/DDExamples/CLICSiD/src/PolyhedraEndcapCalorimeter2_geo.cpp b/DDExamples/CLICSiD/src/PolyhedraEndcapCalorimeter2_geo.cpp
index 3aab1cb59aa9ad846d5773b460279261a5a6a5dd..16e3a0eb98b39fd922aa1c65fb90282e0bdad3e0 100644
--- a/DDExamples/CLICSiD/src/PolyhedraEndcapCalorimeter2_geo.cpp
+++ b/DDExamples/CLICSiD/src/PolyhedraEndcapCalorimeter2_geo.cpp
@@ -7,7 +7,7 @@
 //
 //====================================================================
 
-#include "DetFactoryHelper.h"
+#include "DD4hep/DetFactoryHelper.h"
 #include "CompactDetectors.h"
 #include "XML/Layering.h"
 
@@ -31,14 +31,14 @@ namespace DD4hep { namespace Geometry {
     double      zmin      = dim.zmin();
     Layering    layering(x_det);
     double      totalThickness = layering.totalThickness();
-
+    
     PolyhedraRegular polyhedra(lcdd,det_name+"_polyhedra",numsides,rmin,rmax,totalThickness);
     Volume           envelopeVol(lcdd,det_name+"_envelope",polyhedra,air);
-
+    
     int l_num = 0;
     int layerType   = 0;
     double layerZ   = -totalThickness/2;
-
+    
     for(xml_coll_t c(x_det,_X(layer)); c; ++c)  {
       xml_comp_t       x_layer  = c;
       double           l_thick  = layering.layer(l_num)->thickness();
@@ -50,47 +50,47 @@ namespace DD4hep { namespace Geometry {
       int s_num = 0;
       double sliceZ = -l_thick/2;
       for(xml_coll_t s(x_layer,_X(slice)); s; ++s)  {
-	xml_comp_t x_slice = s;
-	string     s_name  = l_name + _toString(s_num,"_slice%d");
-	double     s_thick = x_slice.thickness();
-	Material   s_mat   = lcdd.material(x_slice.materialStr());
-	PolyhedraRegular s_solid(lcdd,s_name+"_solid",numsides,rmin,rmax,s_thick);
-	Volume           s_vol  (lcdd,s_name+"_volume",s_solid,s_mat);
-	
-	if ( x_slice.isSensitive() ) s_vol.setSensitiveDetector(sens);
-	s_vol.setVisAttributes(lcdd.visAttributes(x_slice.visStr()));
-	sliceZ += s_thick/2;
-	PlacedVolume s_phv = l_vol.placeVolume(s_vol,Position(0,0,sliceZ));
-	s_phv.addPhysVolID("slice",s_num);
-	s_num++;
+        xml_comp_t x_slice = s;
+        string     s_name  = l_name + _toString(s_num,"_slice%d");
+        double     s_thick = x_slice.thickness();
+        Material   s_mat   = lcdd.material(x_slice.materialStr());
+        PolyhedraRegular s_solid(lcdd,s_name+"_solid",numsides,rmin,rmax,s_thick);
+        Volume           s_vol  (lcdd,s_name+"_volume",s_solid,s_mat);
+        
+        if ( x_slice.isSensitive() ) s_vol.setSensitiveDetector(sens);
+        s_vol.setVisAttributes(lcdd.visAttributes(x_slice.visStr()));
+        sliceZ += s_thick/2;
+        PlacedVolume s_phv = l_vol.placeVolume(s_vol,Position(0,0,sliceZ));
+        s_phv.addPhysVolID("slice",s_num);
+        s_num++;
       }
       l_vol.setVisAttributes(lcdd.visAttributes(x_layer.visStr()));
       if ( l_repeat <= 0 ) throw std::runtime_error(det_name+"> Invalid repeat value");
       for(int j=0; j<l_repeat; ++j) {
-	string phys_lay = det_name + _toString(l_num,"_layer%d");
-	layerZ += l_thick/2;
-	PlacedVolume  phys_vol = envelopeVol.placeVolume(l_vol,Position(0,0,layerZ));
-	phys_vol.addPhysVolID("layer", l_num);
-	layerZ += l_thick/2;
-	++l_num;
+        string phys_lay = det_name + _toString(l_num,"_layer%d");
+        layerZ += l_thick/2;
+        PlacedVolume  phys_vol = envelopeVol.placeVolume(l_vol,Position(0,0,layerZ));
+        phys_vol.addPhysVolID("layer", l_num);
+        layerZ += l_thick/2;
+        ++l_num;
       }
       ++layerType;
     }
-
+    
     envelopeVol.setAttributes(lcdd,x_det.regionStr(),x_det.limitsStr(),x_det.visStr());
     DetElement sdet    (lcdd,det_name,det_type,x_det.id());
     Volume motherVol = lcdd.pickMotherVolume(sdet);
     PlacedVolume  physvol = motherVol.placeVolume(envelopeVol,
-						  Position(0,0,zmin+totalThickness/2),
-						  Rotation(0,0,M_PI/numsides));
+                                                  Position(0,0,zmin+totalThickness/2),
+                                                  Rotation(0,0,M_PI/numsides));
     physvol.addPhysVolID("system",det_id);
     physvol.addPhysVolID("barrel",1);        
     sdet.addPlacement(physvol);
-        
+    
     if ( reflect ) {
       physvol = motherVol.placeVolume(envelopeVol,
-				      Position(0,0,-(zmin+totalThickness/2)),
-				      Rotation(M_PI,0,M_PI/numsides));
+                                      Position(0,0,-(zmin+totalThickness/2)),
+                                      Rotation(M_PI,0,M_PI/numsides));
       physvol.addPhysVolID("system",det_id);
       physvol.addPhysVolID("barrel",2);
       DetElement rdet(lcdd,det_name+"_reflect",det_type,x_det.id());
diff --git a/DDExamples/CLICSiD/src/SiTrackerBarrel_geo.cpp b/DDExamples/CLICSiD/src/SiTrackerBarrel_geo.cpp
index 37bf3e4ca0eb7a547806b418b6f985b26f40ec55..802c7999da1fb9e967a2a0717d525f5e1287bfc2 100644
--- a/DDExamples/CLICSiD/src/SiTrackerBarrel_geo.cpp
+++ b/DDExamples/CLICSiD/src/SiTrackerBarrel_geo.cpp
@@ -7,7 +7,7 @@
 //
 //====================================================================
 
-#include "DetFactoryHelper.h"
+#include "DD4hep/DetFactoryHelper.h"
 #include "CompactDetectors.h"
 
 using namespace std;
diff --git a/DDExamples/CLICSiD/src/SiTrackerEndcap2_geo.cpp b/DDExamples/CLICSiD/src/SiTrackerEndcap2_geo.cpp
index ab95c523abde7b128a5e2ec39b98993f84612e19..77b3855efa99387fa924dced189c64252b6cf0c0 100644
--- a/DDExamples/CLICSiD/src/SiTrackerEndcap2_geo.cpp
+++ b/DDExamples/CLICSiD/src/SiTrackerEndcap2_geo.cpp
@@ -7,7 +7,7 @@
 //
 //====================================================================
 
-#include "DetFactoryHelper.h"
+#include "DD4hep/DetFactoryHelper.h"
 #include "CompactDetectors.h"
 #include <map>
 
diff --git a/DDExamples/CLICSiD/src/TubeSegment_geo.cpp b/DDExamples/CLICSiD/src/TubeSegment_geo.cpp
index 85d32aad2a0d2e115b5e34e0a3d5b7c0b81799f8..bb5058e2a7f4ac3ad06181dba79aa9a787c0a668 100644
--- a/DDExamples/CLICSiD/src/TubeSegment_geo.cpp
+++ b/DDExamples/CLICSiD/src/TubeSegment_geo.cpp
@@ -7,7 +7,7 @@
 //
 //====================================================================
 
-#include "DetFactoryHelper.h"
+#include "DD4hep/DetFactoryHelper.h"
 #include "CompactDetectors.h"
 using namespace std;
 using namespace DD4hep;
@@ -23,14 +23,14 @@ namespace DD4hep { namespace Geometry {
     string     name   = x_det.nameStr();
     Tube       tub    (lcdd,name+"_tube",x_tube.rmin(),x_tube.rmax(),x_tube.zhalf());
     Volume     vol    (lcdd,name,tub,lcdd.material(x_det.materialStr()));
-
+    
     vol.setVisAttributes(lcdd, x_det.visStr());
-
+    
     DetElement   sdet(lcdd,name,x_det.typeStr(),x_det.id());
     Volume       mother = lcdd.pickMotherVolume(sdet);
     PlacedVolume phv =  
-      mother.placeVolume(vol,Position(x_pos.x(),x_pos.y(),x_pos.z()),
-			 Rotation(x_rot.x(),x_rot.y(),x_rot.z()));
+    mother.placeVolume(vol,Position(x_pos.x(),x_pos.y(),x_pos.z()),
+                       Rotation(x_rot.x(),x_rot.y(),x_rot.z()));
     phv.addPhysVolID(_A(id),x_det.id());
     sdet.addPlacement(phv);
     return sdet;
diff --git a/DDExamples/ILDExDet/CMakeLists.txt b/DDExamples/ILDExDet/CMakeLists.txt
index d20ff9b49d3538d727719d8cea119a75bda104e2..ff8aba361ba03ab3227257e96308d4faace2d8f1 100644
--- a/DDExamples/ILDExDet/CMakeLists.txt
+++ b/DDExamples/ILDExDet/CMakeLists.txt
@@ -1,15 +1,23 @@
 cmake_minimum_required(VERSION 2.8.3 FATAL_ERROR)
 
-
 include_directories( ${CMAKE_CURRENT_SOURCE_DIR}/include 
                      ${CMAKE_SOURCE_DIR}/DDCore/include 
                      ${ROOT_INCLUDE_DIR})
 
-
 file(GLOB sources src/*.cpp)
-ROOT_GENERATE_DICTIONARY( G__ILDEx include/ILDExTPC.h 
-                                   LINKDEF include/LinkDef.h)
+file(GLOB headers include/*.h)
+
+if(DD4HEP_USE_XERCESC)
+  file(GLOB xmlsources src/compact/*.cpp)
+  list(APPEND sources ${xmlsources})
+  include_directories(${XERCESC_INCLUDE_DIR})
+endif()
+
+if(DD4HEP_USE_PYROOT)
+  ROOT_GENERATE_DICTIONARY(G__ILDEx ${headers} LINKDEF include/ROOT/LinkDef.h)
+  list(APPEND sources G__ILDEx.cxx)
+endif()
 
-add_library(ILDEx SHARED ${sources} G__ILDEx.cxx)
+add_library(ILDEx SHARED ${sources})
 target_link_libraries(ILDEx DD4hepCore)
 
diff --git a/DDExamples/ILDExDet/compact/ILDEx.xml b/DDExamples/ILDExDet/compact/ILDEx.xml
index 4981915bcd141bc0abfa154f05081dbe5dac4b02..31b1b8d347b9f428bc91402a0d194f55ba3e6b62 100644
--- a/DDExamples/ILDExDet/compact/ILDEx.xml
+++ b/DDExamples/ILDExDet/compact/ILDEx.xml
@@ -50,8 +50,8 @@
 
     <display>
       <vis name="TPCVis"        alpha="1.0" r="0"   g="1.0" b="0.7"  showDaughters="true"  visible="false"/>
-      <vis name="TPCSupportVis" alpha="1.0" r="0"   g="0"   b="0.7"  showDaughters="false" visible="true"/>
-      <vis name="TPCGasVis"     alpha="1.0" r="0.7" g="0"   b="0"    showDaughters="false" visible="true"/>
+      <vis name="TPCSupportVis" alpha="1.0" r="0"   g="0.4" b="0.4"  showDaughters="false" visible="true"/>
+      <vis name="TPCGasVis"     alpha="1.0" r="0.7" g="0"   b="0"    showDaughters="false" visible="false"/>
       <vis name="VXDLayerVis"   alpha="1.0" r="0.0" g="1.0" b="0.0"  showDaughters="true"  visible="true"/>
       <vis name="VXDSupportVis" alpha="1.0" r="0.0" g="1.0" b="0.0"  showDaughters="true"  visible="true"/>
       <vis name="SITSupportVis" alpha="1.0" r="0.0" g="0.3" b="0.7"  showDaughters="true"  visible="true"/>
@@ -91,7 +91,7 @@
             <support thickness="0.01*mm" material="Carbon" vis="SITSupportVis"/>
             <ladder  thickness="0.1*mm"  zhalf="370*mm" radius="155*mm" material="Silicon" number="10" />
           </layer>
-          <layer id="2"  vis="SITL/Users/mato/Development/AIDA/DD4hep/DDExamples/ILDExDet/compact/ILDEx.xmlayerVis">
+          <layer id="2"  vis="SITLayerVis">
             <support thickness="0.01*mm" material="Carbon" vis="SITSupportVis"/>
             <ladder  thickness="0.1*mm"  zhalf="650*mm" radius="300*mm" material="Silicon" number="19" />
           </layer>
@@ -118,14 +118,14 @@
 
            <detector name="TPC_EndA" type="TubeSegment" reflect="true" vis="TPCSupportVis" id="2">
              <material name="Carbon" />
-             <tubs rmin="TPC_inner_radius+TPC_inner_thickness" rmax="TPC_outer_radius-TPC_outer_thickness" zhalf="0.5*TPC_inner_radius+TPC_inner_thickness"/>
+             <tubs rmin="TPC_inner_radius+TPC_inner_thickness" rmax="TPC_outer_radius-TPC_outer_thickness" zhalf="0.5*TPC_endcap_thickness"/>
              <position x="0" y="0" z="TPC_zhalf-0.5*TPC_endcap_thickness"/>
              <rotation x="0" y="0" z="0"/>
            </detector>
 
            <detector name="TPC_EndB" type="TubeSegment" reflect="true" vis="TPCSupportVis" id="3">
              <material name="Carbon" />
-             <tubs rmin="TPC_inner_radius+TPC_inner_thickness" rmax="TPC_outer_radius-TPC_outer_thickness" zhalf="0.5*TPC_inner_radius+TPC_inner_thickness"/>
+             <tubs rmin="TPC_inner_radius+TPC_inner_thickness" rmax="TPC_outer_radius-TPC_outer_thickness" zhalf="0.5*TPC_endcap_thickness"/>
              <position x="0" y="0" z="-(TPC_zhalf-0.5*TPC_endcap_thickness)"/>
              <rotation x="0" y="0" z="0"/>
            </detector>
diff --git a/DDExamples/ILDExDet/drivers/ILDExSIT.py b/DDExamples/ILDExDet/drivers/ILDExSIT.py
index 79fe0f4ed360d9bf38a4fa57db355669c5a75c5c..ff84dc1aa9fa13c9cc207660e82d16bddcfe26a3 100644
--- a/DDExamples/ILDExDet/drivers/ILDExSIT.py
+++ b/DDExamples/ILDExDet/drivers/ILDExSIT.py
@@ -1,51 +1,36 @@
 #-------------------------------------------------------------------------------------      
 def detector_ILDExSIT(lcdd, det):
-  sit    = DetElement(lcdd, det.get('name'), det.get('type'), det.getI('id'))
-  
-  mother = lcdd.pickMotherVolume(sit);
+  sit = DetElement(lcdd, det.name, det.type, det.id)
+  mother = lcdd.trackingVolume()
   for layer in det.findall('layer'):
     support = layer.find('support')
     ladder  = layer.find('ladder')
-    layername = det.get('name') + '_layer%d' % layer.getI('id')
-    nLadders = ladder.getI('number')
+    layername = det.name + '_layer%d'%layer.id
+    nLadders = ladder.number
     dphi   = 2.*pi/nLadders
-    zhalf  = ladder.getF('zhalf')
-    sens_radius = ladder.getF('radius')
-    sens_thick  = ladder.getF('thickness')
-    supp_thick  = support.getF('thickness')
+    zhalf  = ladder.zhalf
+    sens_radius = ladder.radius
+    sens_thick  = ladder.thickness
+    supp_thick  = support.thickness
     support_radius = sens_radius + sens_thick/2. + supp_thick/2.
     width       = 2.*tan(dphi/2.)*(sens_radius-sens_thick/2.)
-    sens_mat    = lcdd.material(ladder.get('material'))
-    supp_mat    = lcdd.material(support.get('material'))
 
-    ladderbox = Box(lcdd, layername+'_ladder_solid',  (sens_thick+supp_thick)/2.,width/2.,zhalf)
-    laddervol = Volume(lcdd, layername+'_ladder_volume', ladderbox, sens_mat)
-    laddervol.setVisAttributes(lcdd.visAttributes(layer.get('vis')))
+    ladderbox = Box(lcdd, layername+'_ladder_box',  (sens_thick+supp_thick)/2.,width/2.,zhalf)
+    laddervol = Volume(lcdd, layername+'_ladder', ladderbox, lcdd.material('Air'))
+    laddervol.setVisAttributes(lcdd.visAttributes(layer.vis))
     
-    sensbox   = Box(lcdd, layername+'_sens_solid', sens_thick/2.,width/2.,zhalf)
-    sensvol   = Volume(lcdd, layername+'_sens_volume', sensbox, sens_mat)
-    sensvol.setVisAttributes(lcdd.visAttributes(support.get('vis')))
-    senspos   = Position(lcdd,layername+'_sens_position',-(sens_thick+supp_thick)/2.+sens_thick/2.,0,0)
-    laddervol.addPhysVol(sensvol,senspos)
+    sensbox   = Box(lcdd, layername+'_sens_box', sens_thick/2.,width/2.,zhalf)
+    sensvol   = Volume(lcdd, layername+'_sens_volume', sensbox, lcdd.material(ladder.material))
+    sensvol.setVisAttributes(lcdd.visAttributes(layer.vis))
+    laddervol.placeVolume(sensvol, Position(-(sens_thick+supp_thick)/2.+sens_thick/2.,0,0))
     
-    suppbox   = Box(lcdd, layername+'_supp_solid', supp_thick/2.,width/2.,zhalf)
-    suppvol   = Volume(lcdd,layername+'_supp_volume', suppbox,supp_mat)
-    suppvol.setVisAttributes(lcdd.visAttributes(layer.get('vis')))
-    supppos   = Position(lcdd,layername+'_supp_position',-(sens_thick+supp_thick)/2.+sens_thick/2.+supp_thick/2.,0,0)
-    laddervol.addPhysVol(suppvol,supppos)
-    
-    lcdd.add(ladderbox).add(sensbox).add(senspos).add(suppbox).add(supppos)
-    lcdd.add(laddervol).add(sensvol).add(suppvol)
+    suppbox   = Box(lcdd, layername+'_supp_box', supp_thick/2.,width/2.,zhalf)
+    suppvol   = Volume(lcdd,layername+'_supp', suppbox,lcdd.material(support.material))
+    suppvol.setVisAttributes(lcdd.visAttributes(support.vis))
+    laddervol.placeVolume(suppvol, Position(-(sens_thick+supp_thick)/2.+sens_thick/2.+supp_thick/2.,0,0))
     
     for j in range(nLadders):
       laddername = layername + '_ladder%d' % j
       radius = sens_radius + ((sens_thick+supp_thick)/2. - sens_thick/2.)
-      rot = Rotation(lcdd,laddername+'_rotation',0,0,j*dphi)
-      pos = Position(lcdd,laddername+'_position',
-                     radius*cos(j*dphi),
-                     radius*sin(j*dphi),0.)
-      lcdd.add(rot).add(pos)
-      mother.addPhysVol(laddervol,pos,rot)
-  
-  sit.setVisAttributes(lcdd, det.get('vis'), laddervol);
+      mother.placeVolume(laddervol, Position(radius*cos(j*dphi),radius*sin(j*dphi),0.), Rotation(0,0,j*dphi))
   return sit 
diff --git a/DDExamples/ILDExDet/drivers/ILDExTPC.py b/DDExamples/ILDExDet/drivers/ILDExTPC.py
index f5a81c12d75e4bd9c489024df250fb29360c3404..f0394ab9b57dfea86ed3fcd78127d0f9c128648e 100644
--- a/DDExamples/ILDExDet/drivers/ILDExTPC.py
+++ b/DDExamples/ILDExDet/drivers/ILDExTPC.py
@@ -2,38 +2,29 @@ from ROOT import DD4hep
 
 #-------------------------------------------------------------------------------------      
 def detector_ILDExTPC(lcdd, det):
-  name     = det.get('name')
-  mat      = lcdd.material(det.find('material').get('name'))
   tube     = det.find('tubs')
-  tpc      = DD4hep.ILDExTPC(lcdd, det.get('name'), det.get('type'), det.getI('id'))
-  tpc_tube = Tube(lcdd,name+'_envelope', tube.getF('rmin'), tube.getF('rmax'), tube.getF('zhalf')) 
-  tpc_vol  = Volume(lcdd, name+'_envelope_volume', tpc_tube, mat)
-  lcdd.add(tpc_tube).add(tpc_vol);
-  tpc.setEnvelope(tpc_tube).setVolume(tpc_vol)
+  material = det.find('material')
+  tpc_de   = DD4hep.ILDExTPC(lcdd, det.name, det.type, det.id)
+  tpc_tube = Tube(lcdd, det.name+'_tube', tube.rmin, tube.rmax, tube.zhalf) 
+  tpc_vol  = Volume(lcdd, det.name+'_envelope', tpc_tube, lcdd.material(material.name))
   
-  for px_det in det.findall('detector'):
-    px_tube = px_det.find('tubs')
-    px_pos  = px_det.find('position')
-    px_rot  = px_det.find('rotation')
-    part_name = px_det.get('name')
-    part_mat  = lcdd.material(px_det.find('material').get('name'))
-    part_det  = DetElement(lcdd,part_name,px_det.get('type'),px_det.getI('id'))
-    part_tube = Tube(lcdd,part_name+'_tube',px_tube.getF('rmin'),px_tube.getF('rmax'),px_tube.getF('zhalf'))
-    part_pos  = Position(lcdd,part_name+'_position',px_pos.getF('x'),px_pos.getF('y'),px_pos.getF('z'))
-    part_rot  = Rotation(lcdd,part_name+'_rotation',px_pos.getF('x'),px_pos.getF('y'),px_pos.getF('z'))
-    part_vol  = Volume(lcdd,part_name,part_tube,part_mat)
+  for px in det.findall('detector'):
+    px_tube = px.find('tubs')
+    px_pos  = px.find('position')
+    px_rot  = px.find('rotation')
+    px_mat  = px.find('material')
+    part_det  = DetElement(lcdd, px.name, px.type, px.id)
+    part_tube = Tube(lcdd,px.name+'_tube',px_tube.rmin, px_tube.rmax, px_tube.zhalf)
+    part_vol  = Volume(lcdd, px.name, part_tube, lcdd.material(px_mat.name))
+    print 'Vis for %s ' %det.name, px.vis
+    part_vol.setVisAttributes(lcdd.visAttributes(px.vis))
+    tpc_vol.placeVolume(part_vol, getPosition(px_pos), getRotation(px_rot))    
     
-    part_det.setVolume(part_vol).setEnvelope(part_tube)
-    part_det.setVisAttributes(lcdd,px_det.get('vis'), part_vol)
-    lcdd.add(part_tube).add(part_pos).add(part_rot).add(part_vol)
-    
-    tpc_vol.addPhysVol(part_vol,part_pos,part_rot)
-    
-    if   part_det.id() == 0 : tpc.setInnerWall(part_det)
-    elif part_det.id() == 1 : tpc.setOuterWall(part_det)
-    elif part_det.id() == 2 : tpc.setGasVolume(part_det)
-    tpc.add(part_det)
-    
-  tpc.setVisAttributes(lcdd, det.get('vis'), tpc_vol)
-  lcdd.pickMotherVolume(tpc).addPhysVol(tpc_vol,lcdd.identity())
-  return tpc
+    if   px.id == 0 : tpc_de.setInnerWall(part_det)
+    elif px.id == 1 : tpc_de.setOuterWall(part_det)
+    elif px.id == 5 : tpc_de.setGasVolume(part_det)
+    tpc_de.add(part_det)
+  print 'vis = ', det.vis  
+  tpc_vol.setVisAttributes(lcdd.visAttributes(det.vis))
+  lcdd.pickMotherVolume(tpc_de).placeVolume(tpc_vol)
+  return tpc_de
diff --git a/DDExamples/ILDExDet/drivers/ILDExVXD.py b/DDExamples/ILDExDet/drivers/ILDExVXD.py
index c781994305a8b0339682190efbcabb56a968df01..c062d5d7843fda35bf6d61e1bb13f4afd3fd2b86 100644
--- a/DDExamples/ILDExDet/drivers/ILDExVXD.py
+++ b/DDExamples/ILDExDet/drivers/ILDExVXD.py
@@ -1,52 +1,36 @@
 #-------------------------------------------------------------------------------------      
 def detector_ILDExVXD(lcdd, det):
-  name   = det.get('name')
-  vdx    = DetElement(lcdd, det.get('name'), det.get('type'), det.getI('id'))
-  
-  mother = lcdd.pickMotherVolume(vdx);
+  vdx = DetElement(lcdd, det.name, det.type, det.id)
+  mother = lcdd.trackingVolume()
   for layer in det.findall('layer'):
     support = layer.find('support')
-    ladder = layer.find('ladder')
-    layername = name + '_layer%d' % layer.getI('id')
+    ladder  = layer.find('ladder')
+    layername = det.name + '_layer%d' % layer.id
     nLadders = ladder.getI('number')
     dphi   = 2.*pi/nLadders
-    zhalf  = ladder.getF('zhalf')
-    offset = ladder.getF('offset')
-    sens_radius = ladder.getF('radius')
-    sens_thick  = ladder.getF('thickness')
-    supp_thick  = support.getF('thickness')
-    supp_radius = sens_radius + sens_thick/2. + supp_thick/2.
-    width       = 2.*tan(dphi/2.)*(sens_radius-sens_thick/2.)
-    sens_mat    = lcdd.material(ladder.get('material'))
-    supp_mat    = lcdd.material(support.get('material'))
-    ladderbox = Box(lcdd, layername+'_ladder_solid',  (sens_thick+supp_thick)/2.,width/2.,zhalf)
-    laddervol = Volume(lcdd, layername+'_ladder_volume', ladderbox, sens_mat)
-    sensbox   = Box(lcdd, layername+'_sens_solid', sens_thick/2.,width/2.,zhalf)
-    sensvol   = Volume(lcdd, layername+'_sens_volume', sensbox, sens_mat)
-    senspos   = Position(lcdd,layername+'_sens_position',-(sens_thick+supp_thick)/2.+sens_thick/2.,0,0)
-    suppbox   = Box(lcdd, layername+'_supp_solid', supp_thick/2.,width/2.,zhalf)
-    suppvol   = Volume(lcdd,layername+'_supp_volume', suppbox,supp_mat)
-    supppos   = Position(lcdd,layername+'_supp_position',-(sens_thick+supp_thick)/2.+sens_thick/2.+supp_thick/2.,0,0)
+    sens_thick  = ladder.thickness
+    supp_thick  = support.thickness
+    supp_radius = ladder.radius + sens_thick/2. + supp_thick/2.
+    width       = 2.*tan(dphi/2.)*(ladder.radius-sens_thick/2.)
     
-    lcdd.add(ladderbox).add(sensbox).add(senspos).add(suppbox).add(supppos)
-    lcdd.add(laddervol).add(sensvol).add(suppvol)
+    ladderbox = Box(lcdd, layername+'_ladder_box',  (sens_thick+supp_thick)/2., width/2., ladder.zhalf)
+    laddervol = Volume(lcdd, layername+'_ladder', ladderbox, lcdd.material('Air'))
     
-    laddervol.setVisAttributes(lcdd.visAttributes(layer.get('vis')))
-    suppvol.setVisAttributes(lcdd.visAttributes(layer.get('vis')))
-    sensvol.setVisAttributes(lcdd.visAttributes(support.get('vis')))
+    sensbox   = Box(lcdd, layername+'_sens_box', sens_thick/2., width/2., ladder.zhalf)
+    sensvol   = Volume(lcdd, layername+'_sens', sensbox, lcdd.material(ladder.material))
+    sensvol.setVisAttributes(lcdd.visAttributes(layer.vis))
+    laddervol.placeVolume(sensvol, Position(-(sens_thick+supp_thick)/2.+sens_thick/2.,0,0))
     
-    laddervol.addPhysVol(sensvol,senspos)
-    laddervol.addPhysVol(suppvol,supppos)
+    suppbox   = Box(lcdd, layername+'_supp_box', supp_thick/2.,width/2.,ladder.zhalf)
+    suppvol   = Volume(lcdd,layername+'_supp', suppbox, lcdd.material(support.material))
+    suppvol.setVisAttributes(lcdd.visAttributes(support.vis))
+    laddervol.placeVolume(suppvol, Position(-(sens_thick+supp_thick)/2.+sens_thick/2.+supp_thick/2.,0,0))
     
     for j in range(nLadders):
       laddername = layername + '_ladder%d' % j
-      radius = sens_radius + ((sens_thick+supp_thick)/2. - sens_thick/2.)
-      rot = Rotation(lcdd,laddername+'_rotation',0,0,j*dphi)
-      pos = Position(lcdd,laddername+'_position',
-                     radius*cos(j*dphi) - offset*sin(j*dphi),
-                     radius*sin(j*dphi) - offset*cos(j*dphi),0.)
-      lcdd.add(rot).add(pos)
-      mother.addPhysVol(laddervol,pos,rot)
-  
-  vdx.setVisAttributes(lcdd, det.get('vis'), laddervol);
+      radius = ladder.radius + ((sens_thick+supp_thick)/2. - sens_thick/2.)
+      rot = Rotation(0,0,j*dphi)
+      pos = Position(radius*cos(j*dphi) - ladder.offset*sin(j*dphi),
+                     radius*sin(j*dphi) - ladder.offset*cos(j*dphi),0.)
+      mother.placeVolume(laddervol, pos, rot)
   return vdx 
diff --git a/DDExamples/ILDExDet/include/ILDExVXD.h b/DDExamples/ILDExDet/include/ILDExVXD.h
new file mode 100644
index 0000000000000000000000000000000000000000..3fdf50a6cbeebaafc71d6cf4d879e82ce4cd6437
--- /dev/null
+++ b/DDExamples/ILDExDet/include/ILDExVXD.h
@@ -0,0 +1,20 @@
+// $Id:$
+//====================================================================
+//  AIDA Detector description implementation for LCD
+//--------------------------------------------------------------------
+//
+//  Author     : M.Frank
+//
+//====================================================================
+#ifndef DD4hep_ILDEXVXD_H
+#define DD4hep_ILDEXVXD_H
+
+#include "DD4hep/Detector.h"
+
+namespace DD4hep {
+  struct ILDExVXD : public Geometry::DetElement {
+    ILDExVXD(const Geometry::LCDD& lcdd, const std::string& name, const std::string& type, int id)
+      : Geometry::DetElement(lcdd,name,type,id) {}
+  };
+}
+#endif // DD4hep_ILDEXVXD_H
diff --git a/DDExamples/ILDExDet/include/LinkDef.h b/DDExamples/ILDExDet/include/ROOT/LinkDef.h
similarity index 100%
rename from DDExamples/ILDExDet/include/LinkDef.h
rename to DDExamples/ILDExDet/include/ROOT/LinkDef.h
diff --git a/DDExamples/ILDExDet/src/compact/ILDExTPC_geo.cpp b/DDExamples/ILDExDet/src/compact/ILDExTPC_geo.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..84a879a125757e0209206c36f70a71db612b1537
--- /dev/null
+++ b/DDExamples/ILDExDet/src/compact/ILDExTPC_geo.cpp
@@ -0,0 +1,60 @@
+// $Id:$
+//====================================================================
+//  AIDA Detector description implementation for LCD
+//--------------------------------------------------------------------
+//
+//  Author     : M.Frank
+//
+//====================================================================
+
+#include "DD4hep/DetFactoryHelper.h"
+#include "ILDExTPC.h"
+using namespace std;
+using namespace DD4hep;
+using namespace DD4hep::Geometry;
+
+namespace DD4hep { namespace Geometry {
+  
+  template <> Ref_t DetElementFactory<ILDExTPC>::create(LCDD& lcdd, const xml_h& e, SensitiveDetector&)  {
+    xml_det_t   x_det = e;
+    xml_comp_t  x_tube (x_det.child(_X(tubs)));
+    string      name  = x_det.nameStr();
+    Material    mat    (lcdd.material(x_det.materialStr()));
+    ILDExTPC    tpc    (lcdd,name,x_det.typeStr(),x_det.id());
+    Tube        tpc_tub(lcdd,name+"_envelope",x_tube.rmin(),x_tube.rmax(),x_tube.zhalf());
+    Volume      tpc_vol(lcdd,name+"_envelope_volume", tpc_tub, mat);
+
+    for(xml_coll_t c(e,_X(detector)); c; ++c)  {
+      xml_comp_t  px_det  (c);
+      xml_comp_t  px_tube (px_det.child(_X(tubs)));
+      xml_dim_t   px_pos  (px_det.child(_X(position)));
+      xml_dim_t   px_rot  (px_det.child(_X(rotation)));
+      xml_comp_t  px_mat  (px_det.child(_X(material)));
+      string      part_nam(px_det.nameStr());
+      Material    part_mat(lcdd.material(px_mat.nameStr()));
+      DetElement  part_det(lcdd,part_nam,px_det.typeStr(),px_det.id());
+      Tube        part_tub(lcdd,part_nam+"_tube",px_tube.rmin(),px_tube.rmax(),px_tube.zhalf());
+      Volume      part_vol(lcdd,part_nam,part_tub,part_mat);
+      Position    part_pos(px_pos.x(),px_pos.y(),px_pos.z());
+      Rotation    part_rot(px_rot.x(),px_rot.y(),px_rot.z());
+
+      part_vol.setVisAttributes(lcdd,px_det.visStr());
+
+      PlacedVolume part_phv = tpc_vol.placeVolume(part_vol,part_pos,part_rot);
+      part_phv.addPhysVolID(_A(id),px_det.id());
+      part_det.addPlacement(part_phv);
+      switch(part_det.id()) {
+      case 0:	tpc.setInnerWall(part_det);  break;
+      case 1:	tpc.setOuterWall(part_det);  break;
+      case 5:	tpc.setGasVolume(part_det);  break;
+      }
+      tpc.add(part_det);
+    }
+    tpc_vol.setVisAttributes(lcdd, x_det.visStr());
+    PlacedVolume phv = lcdd.pickMotherVolume(tpc).placeVolume(tpc_vol);
+    tpc.addPlacement(phv);
+    return tpc;
+  }
+}}
+
+DECLARE_NAMED_DETELEMENT_FACTORY(DD4hep,ILDExTPC);
diff --git a/DDExamples/ILDExDet/src/compact/ILDExVXD_geo.cpp b/DDExamples/ILDExDet/src/compact/ILDExVXD_geo.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..82be5eba2258533f8e70c7e31b2272567ac752ac
--- /dev/null
+++ b/DDExamples/ILDExDet/src/compact/ILDExVXD_geo.cpp
@@ -0,0 +1,66 @@
+// $Id:$
+//====================================================================
+//  AIDA Detector description implementation for LCD
+//--------------------------------------------------------------------
+//
+//  Author     : M.Frank
+//
+//====================================================================
+
+#include "DD4hep/DetFactoryHelper.h"
+#include "ILDExVXD.h"
+using namespace std;
+using namespace DD4hep;
+using namespace DD4hep::Geometry;
+
+namespace DD4hep { namespace Geometry {
+  
+  template <> Ref_t DetElementFactory<ILDExVXD>::create(LCDD& lcdd, const xml_h& e, SensitiveDetector&)  {
+    xml_det_t   x_det = e;
+    string      name  = x_det.nameStr();
+    ILDExVXD    vxd    (lcdd,name,x_det.typeStr(),x_det.id());
+    Volume      mother= lcdd.pickMotherVolume(vxd);
+    
+    for(xml_coll_t c(e,_X(layer)); c; ++c)  {
+      xml_comp_t  x_layer  (c);
+      xml_comp_t  x_support (x_layer.child(_X(support)));
+      xml_comp_t  x_ladder  (x_layer.child(_X(ladder)));
+      int         layer_id   = x_layer.id();
+      int         nLadders   = x_ladder.number();
+      string      layername  = name+_toString(layer_id,"_layer%d");
+      double      dphi       = 2.*M_PI/double(nLadders);
+      double      zhalf      = x_ladder.zhalf();
+      double      offset     = x_ladder.offset();
+      double      sens_radius= x_ladder.radius();
+      double      sens_thick = x_ladder.thickness();
+      double      supp_thick = x_support.thickness();
+      double      width      = 2.*tan(dphi/2.)*(sens_radius-sens_thick/2.);
+      Material    sens_mat   = lcdd.material(x_ladder.materialStr());
+      Material    supp_mat   = lcdd.material(x_support.materialStr());
+      Box         ladderbox (lcdd,layername+"_ladder_solid",  (sens_thick+supp_thick)/2.,width/2.,zhalf);
+      Volume      laddervol (lcdd,layername+"_ladder_volume",  ladderbox,sens_mat);
+      Box         sensbox   (lcdd,layername+"_sens_solid",     sens_thick/2.,width/2.,zhalf);
+      Volume      sensvol   (lcdd,layername+"_sens_volume",    sensbox,sens_mat);
+      Box         suppbox   (lcdd,layername+"_supp_solid",     supp_thick/2.,width/2.,zhalf);
+      Volume      suppvol   (lcdd,layername+"_supp_volume",    suppbox,supp_mat);
+      Position    senspos   (-(sens_thick+supp_thick)/2.+sens_thick/2.,0,0);
+      Position    supppos   (-(sens_thick+supp_thick)/2.+sens_thick/2.+supp_thick/2.,0,0);
+      
+      sensvol.setVisAttributes(lcdd.visAttributes(x_layer.visStr()));
+      laddervol.placeVolume(sensvol,senspos);
+      laddervol.placeVolume(suppvol,supppos);
+      
+      for(int j=0; j<nLadders; ++j) {
+        string laddername = layername + _toString(j,"_ladder%d");
+        double radius = sens_radius + ((sens_thick+supp_thick)/2. - sens_thick/2.);
+        Position pos(radius*cos(j*dphi) - offset*sin(j*dphi),
+                     radius*sin(j*dphi) - offset*cos(j*dphi),0.);
+        mother.placeVolume(laddervol,pos,Rotation(0,0,j*dphi));
+      }
+      vxd.setVisAttributes(lcdd, x_det.visStr(),laddervol);
+    }
+    return vxd;
+  }
+}}
+
+DECLARE_NAMED_DETELEMENT_FACTORY(DD4hep,ILDExVXD);
diff --git a/ReadMe.txt b/ReadMe.txt
new file mode 100644
index 0000000000000000000000000000000000000000..1d22b3cd1c8755ab0e38630668f2ca348736636c
--- /dev/null
+++ b/ReadMe.txt
@@ -0,0 +1,75 @@
+Detector Description for HEP Package
+-------------------------------------
+
+1) Package Contents
+-------------------
+
+  The DD4hep project consists of several packages. The idea has been to separate the common parts of 
+the detector description toolkit from concrete detector examples. 
+
+- DDCore
+
+  Contains the definition of the basic classes of the toolkit: Handle, DetElement, Volume, PlacedVolume,
+Shapes, Material, etc. Most of these classes are ‘handles’ to ROOT TGeom classes.
+The package provides the basic mechanisms for constructing the ‘Generic Detector Description Model’ 
+in memory from XML compact detector definition files. Two methods are currently supported: one based
+on the C++ XercesC parser, and another one based on Python and using the PyROOT bindings to ROOT. 
+
+  Two configuration options selects the desired method:
+
+     DD4HEP_USE_PYROOT:BOOL
+     DD4HEP_USE_XERCESC:BOOL
+
+- DDExamples
+
+  Contains different detector examples (CLICSiD, ILDEx) together with example applications to illustrate
+the their usage for simulation, reconstruction and visualization with an emphasis to minimize software
+dependencies. For instance, the simulation application example will require to compiler and link 
+against Geant4 but not the reconstruction application.
+
+  For each detector example the directory ‘compact’ contains the XML compact detector description, the 
+directory ‘drivers’ contains the Python functions to construct the detector from the XML, the ‘include’ 
+and ‘src’ contain the equivalent drivers for the XercesC parser.
+
+- DDExamples/ILDEx
+
+  Contains the original example ILDEx adapted from the Geant4 example N03
+
+3) Pre-requisites
+-----------------
+
+  DD4hep depends on a number of ‘external’ packages. The user will need to install these in his/her 
+system before building and running the examples
+
+- Mandatory
+  CMake (version 2.8 or higher) and ROOT (version 5.30 or higher) installations are mandatory.
+
+- Optional
+  If the XercesC is used to parse compact descriptions and installation of XercesC will be required.
+To build and run the simulation examples Geant4 will be required. 
+
+
+2) How to build and run
+-----------------------
+
+- Checkout code
+svn co https://svnsrv.desy.de/basic/aidasoft/DD4hep/trunk DD4hep
+
+- Configure (for PyROOT)
+mkdir build
+cmake ../DD4hep
+
+- Configure (for XercesC)
+cmake -DDD4HEP_USE_XERCESC=ON -DDD4HEP_USE_PYROOT=OFF -DXERCESC_ROOT_DIR=<xercesc> ../DD4hep
+
+- Run ILDEx display
+DDExamples/ILDExDisplay/ILDExDisplay file:../DD4hep/DDExamples/ILDExDet/compact/ILDEx.xml
+
+- Run CLICSiD display
+DDExamples/CLICSiD/CLICSiDtest file:../DD4hep/DDExamples/CLICSiD/compact/compact.xml
+
+
+3) Extending
+------------
+
+  Users may extend the models by changing the compact description or adding new drivers