diff --git a/DDCore/include/DD4hep/Detector.h b/DDCore/include/DD4hep/Detector.h
index f0858ecc141635294cfb954b9aae6015e5b54219..6403db50c2605835e45584ec3ae2695f5d148eef 100644
--- a/DDCore/include/DD4hep/Detector.h
+++ b/DDCore/include/DD4hep/Detector.h
@@ -91,6 +91,9 @@ namespace DD4hep {
       /// Constructor for a new sensitive detector element
       SensitiveDetector(const std::string& name, const std::string& type="sensitive");
       
+      /// Assignment operator
+      SensitiveDetector& operator=(const SensitiveDetector& sd) {  m_element = sd.m_element;  return *this; }
+
       /// Additional data accessor
       Object& _data()   const {  return *data<Object>();  }
 
@@ -165,13 +168,13 @@ namespace DD4hep {
       typedef std::map<std::string,DetElement>       Children;
       typedef std::map<const std::type_info*,void*>  Extensions;
       
-      enum {
+      enum CopyParameters  {
         COPY_NONE      = 0,
         COPY_PLACEMENT = 1<<0,
         COPY_PARENT    = 1<<1,
         COPY_ALIGNMENT = 1<<2,
         LAST
-      } CopyParameters;
+      };
       struct Object  {
         unsigned int      magic;
         int               id;
@@ -282,6 +285,9 @@ namespace DD4hep {
       /// Constructor for a new subdetector element
       DetElement(DetElement parent, const std::string& name, int id);
       
+      /// Assignment operator
+      DetElement& operator=(const DetElement& e) {  m_element=e.m_element;  return *this; }
+
       /// Clone (Deep copy) the DetElement structure with a new name
       DetElement clone(const std::string& new_name) const;
       
diff --git a/DDCore/include/DD4hep/Fields.h b/DDCore/include/DD4hep/Fields.h
index 875b7f7e8f641d89b9a1371f59de369c478b3f57..66dd0417f50ea8d8cb00a46cbefd9be5b617da55 100644
--- a/DDCore/include/DD4hep/Fields.h
+++ b/DDCore/include/DD4hep/Fields.h
@@ -67,6 +67,9 @@ namespace DD4hep {
       /// Constructor to be used when reading the already parsed DOM tree
       template <typename Q> CartesianField(const Handle<Q>& e) : Ref_t(e)  {}
 
+      /// Assignment operator
+      CartesianField& operator=(const CartesianField& f) {  m_element=f.m_element;  return *this; }
+
       /// Access the field type
       int fieldType()  const {  return data<Object>()->type; }
 
diff --git a/DDCore/include/DD4hep/GeoHandler.h b/DDCore/include/DD4hep/GeoHandler.h
index 07e7b57e08fd61e49c52b61d410cd830a493ae2d..8f123b91956298158ba1e88e6f04612b949b42f2 100644
--- a/DDCore/include/DD4hep/GeoHandler.h
+++ b/DDCore/include/DD4hep/GeoHandler.h
@@ -80,6 +80,12 @@ namespace DD4hep {
       /// Internal helper to collect geometry information from traversal
       GeoHandler& i_collect(const TGeoNode* node, int level);
 
+    private:
+      /// Never call Copy constructor
+      GeoHandler(const GeoHandler&) {}
+      /// Never call assignment operator
+      GeoHandler& operator=(const GeoHandler&) { return *this; }
+
     public:
       /// Default constructor
       GeoHandler();
diff --git a/DDCore/include/DD4hep/Handle.h b/DDCore/include/DD4hep/Handle.h
index a2ca0aa3fcfa2058ca3774dc9f4740f52144a563..f4104388573afead513ba462957ba7b57d9f2eb2 100644
--- a/DDCore/include/DD4hep/Handle.h
+++ b/DDCore/include/DD4hep/Handle.h
@@ -123,22 +123,22 @@ namespace DD4hep {
       typedef T Implementation;
       typedef Handle<Implementation> handle_t;
       T* m_element;
-      Handle() : m_element(0)                 {                                 }
-      Handle(T* e) : m_element(e)             {                                 }
-      Handle(const Handle<T>& e) : m_element(e.m_element) {                     }
+      Handle() : m_element(0)                 {                                      }
+      Handle(T* e) : m_element(e)             {                                      }
+      Handle(const Handle<T>& e) : m_element(e.m_element) {                          }
       template<typename Q> Handle(Q* e)
-      : m_element((T*)e)                      {  verifyObject();                }
+      : m_element((T*)e)                      {  verifyObject();                     }
       template<typename Q> Handle(const Handle<Q>& e) 
-      : m_element((T*)e.m_element)            {  verifyObject();                }
-      
-      bool isValid() const                    {  return 0 != m_element;         }
-      bool operator!() const                  {  return 0 == m_element;         }
-      T* operator->() const                   {  return  m_element;             }
-      operator T& ()  const                   {  return *m_element;             }
-      T& operator*()  const                   {  return *m_element;             }
-      T* ptr() const                          {  return m_element;              }
-      template <typename Q> Q* _ptr() const   {  return (Q*)m_element;          }
-      template <typename Q> Q* data() const   {  return (Value<T,Q>*)m_element; }
+      : m_element((T*)e.m_element)            {  verifyObject();                     }
+      Handle<T>& operator=(const Handle<T>& e){ m_element=e.m_element; return *this; }
+      bool isValid() const                    {  return 0 != m_element;              }
+      bool operator!() const                  {  return 0 == m_element;              }
+      T* operator->() const                   {  return  m_element;                  }
+      operator T& ()  const                   {  return *m_element;                  }
+      T& operator*()  const                   {  return *m_element;                  }
+      T* ptr() const                          {  return m_element;                   }
+      template <typename Q> Q* _ptr() const   {  return (Q*)m_element;               }
+      template <typename Q> Q* data() const   {  return (Value<T,Q>*)m_element;      }
       void verifyObject() const {
         increment_object_validations();
         if ( m_element && dynamic_cast<T*>(m_element) == 0 )  {
diff --git a/DDCore/include/DD4hep/Volumes.h b/DDCore/include/DD4hep/Volumes.h
index 6118df963c44a6ab949c4c28e5e2f75897944441..d110ea6d05c12bb9e88cf5601296c0d68a484c72 100644
--- a/DDCore/include/DD4hep/Volumes.h
+++ b/DDCore/include/DD4hep/Volumes.h
@@ -55,9 +55,11 @@ namespace DD4hep {
 	/// ID container
         VolIDs        volIDs;
 	/// Default constructor
-        Object() : volIDs() {}
+        Object() : magic(0), volIDs() {}
 	/// Copy constructor
 	Object(const Object& c) : magic(c.magic), volIDs(c.volIDs) {}
+	/// Assignment operator
+	Object& operator=(const Object& c) { magic=c.magic; volIDs=c.volIDs; return *this; }
       };
       /// Constructor to be used when reading the already parsed DOM tree
       PlacedVolume(const TGeoNode* e) : Handle<TGeoNodeMatrix>(e) {}
@@ -67,6 +69,9 @@ namespace DD4hep {
       PlacedVolume(const PlacedVolume& e) : Handle<TGeoNodeMatrix>(e) {}
       /// Copy assignment from other handle type
       template <typename T> PlacedVolume(const Handle<T>& e) : Handle<TGeoNodeMatrix>(e) {}
+      /// Assignment operator (must match copy constructor)
+      PlacedVolume& operator=(const PlacedVolume& v) {  m_element=v.m_element;  return *this; }
+
       /// Add identifier
       PlacedVolume& addPhysVolID(const std::string& name, int value);
       /// Volume material
@@ -99,8 +104,8 @@ namespace DD4hep {
         VisAttr       vis;
         Ref_t         sens_det;
 	int           referenced;
-        Object() : region(), limits(), vis(), sens_det(), referenced(0)  {}
-        void copy(const Object& c) { region=c.region; limits=c.limits; vis=c.vis; sens_det=c.sens_det; referenced=c.referenced; }
+        Object() : magic(0), region(), limits(), vis(), sens_det(), referenced(0)  {}
+        void copy(const Object& c) { magic=c.magic; region=c.region; limits=c.limits; vis=c.vis; sens_det=c.sens_det; referenced=c.referenced; }
       };
 
       public:
@@ -119,6 +124,9 @@ namespace DD4hep {
       /// Constructor to be used when creating a new geometry tree. Also sets materuial and solid attributes
       Volume(const std::string& name, const Solid& s, const Material& m);
       
+      /// Assignment operator (must match copy constructor)
+      Volume& operator=(const Volume& a) {  m_element=a.m_element;  return *this; }
+
       /// Place daughter volume. The position and rotation are the identity
       PlacedVolume placeVolume(const Volume& vol)  const  
       { return placeVolume(vol,IdentityPos());                        }
@@ -201,6 +209,9 @@ namespace DD4hep {
       
       /// Constructor to be used when creating a new geometry tree.
       Assembly(const std::string& name);
+
+      /// Assignment operator (must match copy constructor)
+      Assembly& operator=(const Assembly& a) {  m_element=a.m_element;  return *this; }
     };
 
   }       /* End namespace Geometry          */
diff --git a/DDCore/include/XML/XMLDetector.h b/DDCore/include/XML/XMLDetector.h
index 283245d0d52d428819663a2951ea58faf19c2ee1..be8e13b8e3f84feb4567e6c186521e6847e37091 100644
--- a/DDCore/include/XML/XMLDetector.h
+++ b/DDCore/include/XML/XMLDetector.h
@@ -10,7 +10,7 @@
 #define DD4HEP_XMLDETECTOR_H
 
 // Framework include files
-#include "XML/XMLTags.h"
+#include "XML/XMLDimension.h"
 
 /*
  *   DD4hep namespace declaration
@@ -22,329 +22,6 @@ namespace DD4hep {
   */
   namespace XML  {
 
-
-    /** @class Dimension XMLDetector.h XML/XMLDetector.h
-     * 
-     *  Helper class to access any field in a xml tag in a 
-     *  very easy way.
-     *  - You may assign any xml handle to a dimension object
-     *  - Any attribute of this xml element may then be accessed
-     *    by it's natural way. All possible attribute names are
-     *    reflected by the Dimmension object's member functions.
-     *  - If an attribute is requested and not present, a exception
-     *    is thrown.
-     *  - Functions, which accept a default value do NOT throw 
-     *    an exception if the attribute is not present. These
-     *    rather return the default value.
-     *  - If a often used function is not present - the 
-     *    implementation thereof is simple.
-     *  
-     *  @author  M.Frank
-     *  @version 1.0
-     */
-    struct Dimension : public Element  {
-      /// Default constructor
-      Dimension() : Element(Handle_t(0)) {}
-      /// Constructor from Handle
-      Dimension(Handle_t e) : Element(e) {}
-      /// Constructor from Element
-      Dimension(const Element& e) : Element(e) {}
-
-      /// Access parameters: id
-      int    id() const;
-      /// Access parameters: id, if not present returns default
-      int    id(int default_value) const;
-
-      /// Access parameters: type
-      int    type() const;
-      /// Access rotation constants: combineHits
-      bool combineHits() const;
-
-      /// Access rotation constants: angle
-      double angle() const;
-      /// Access rotation constants: angle
-      double alpha() const;
-      /// Access rotation constants: angle
-      double beta() const;
-      /// Access rotation constants: angle
-      double gamma() const;
-      /// Access rotation constants: angle
-      double delta() const;
-      /// Access rotation constants: angle
-      double epsilon() const;
-      /// Access rotation constants: theta
-      double theta() const;
-      /// Access rotation constants: thetaBins
-      int thetaBins() const;
-
-      /// Access rotation constants: phi
-      double phi() const;
-      /// Access rotation constants: phiBins
-      int phiBins() const;
-      /// Access rotation constants: phi0
-      double phi0() const;
-      /// Access parameters: phi0, if not present returns default
-      double phi0(double default_value) const;
-      /// Access rotation constants: psi
-      double psi() const;
-
-      /// Access Tube parameters: zhalf
-      double zhalf() const;
-      /// Access Tube parameters: deltaphi
-      double deltaphi() const;
-
-      /// Access parameters: b
-      double b()  const;
-      /// Access parameters: B
-      double B()  const;
-      /// Access parameters: g
-      double g()  const;
-      /// Access parameters: G
-      double G()  const;
-
-      /// Access parameters: r
-      double r()  const;
-      /// Access parameters: r, if not present returns default
-      double r(double default_value)  const;
-      /// Access parameters: R
-      double R()  const;
-      /// Access parameters: dr
-      double dr()  const;
-      /// Access parameters: r0
-      double r0()  const;
-      /// Access parameters: dr, if not present returns default
-      double dr(double default_value)  const;
-      /// Access min/max parameters: rmin
-      double rmin() const;
-      /// Access min/max parameters: rmax
-      double rmax() const;
-      /// Access min/max parameters: rmin1
-      double rmin1() const;
-      /// Access min/max parameters: rmax1
-      double rmax1() const;
-      /// Access min/max parameters: rmin2
-      double rmin2() const;
-      /// Access min/max parameters: rmax2
-      double rmax2() const;
-      /// Access parameters: radius
-      double radius() const;
-      /// Access attribute values: outer_radius
-      double outer_radius() const;
-      /// Access attribute values: outer_r
-      double outer_r() const;
-      /// Access attribute values: inner_radius
-      double inner_radius() const;
-      /// Access attribute values: inner_r
-      double inner_r() const;
-
-      /// Access parameters: x
-      double x() const;
-      /// Access parameters: x, if not present returns default
-      double x(double default_val) const;
-      /// Access parameters: X
-      double X() const;
-      /// Access parameters: x0
-      double x0() const;
-      /// Access parameters: x1
-      double x1() const;
-      /// Access parameters: x2
-      double x2() const;
-      /// Access parameters: dx
-      double dx() const;
-      /// Access parameters: dx, if not present returns default
-      double dx(double default_value)  const;
-      /// Access min/max parameters: xmax
-      double xmin() const;
-      /// Access min/max parameters: xmax
-      double xmax() const;
-      /// Access min/max parameters: x_offset
-      double x_offset() const;
-      /// Access min/max parameters: dim_x
-      double dim_x() const;
-
-      /// Access parameters: y
-      double y() const;
-      /// Access parameters: y, if not present returns default
-      double y(double default_val) const;
-      /// Access parameters: Y
-      double Y() const;
-      /// Access parameters: y0
-      double y0() const;
-      /// Access parameters: y1
-      double y1() const;
-      /// Access parameters: y2
-      double y2() const;
-      /// Access parameters: dy
-      double dy() const;
-      /// Access parameters: dz, if not present returns default
-      double dy(double default_value)  const;
-      /// Access min/max parameters: ymax
-      double ymin() const;
-      /// Access min/max parameters: ymax
-      double ymax() const;
-      /// Access min/max parameters: y_offset
-      double y_offset() const;
-      /// Access min/max parameters: dim_y
-      double dim_y() const;
-
-      /// Access parameters: z
-      double z() const;
-      /// Access parameters: z, if not present returns default
-      double z(double default_val) const;
-      /// Access parameters: Z
-      double Z() const;
-      /// Access parameters: z0
-      double z0() const;
-      /// Access parameters: z1
-      double z1() const;
-      /// Access parameters: z2
-      double z2() const;
-      /// Access parameters: dz
-      double dz() const;
-      /// Access parameters: dz, if not present returns default
-      double dz(double default_value)  const;
-      /// Access min/max parameters: zmax
-      double zmin() const;
-      /// Access min/max parameters: zmax
-      double zmax() const;
-      /// Access attribute values: outer_z
-      double outer_z() const;
-      /// Access attribute values: inner_z
-      double inner_z() const;
-      /// Access min/max parameters: z_offset
-      double z_offset() const;
-      /// Access min/max parameters: dim_z
-      double dim_z() const;
-
-      /// Access attribute values: length
-      double length() const;
-      /// Access attribute values: width
-      double width() const;
-      /// Access attribute values: height
-      double height() const;
-      /// Access attribute values: depth
-      double depth() const;
-      /// Access attribute values: thickness
-      double thickness() const;
-
-      /// Access attribute values: z_length
-      double z_length() const;
-      /// Access attribute values: gap
-      double gap() const;
-      /// Access attribute values: r_size
-      double r_size() const;
-      /// Access attribute values: phi_size_max
-      double phi_size_max() const;
-      /// Access attribute values: reflect
-      bool   reflect() const;
-      /// Access attribute values: reflect
-      bool   reflect(bool default_value) const;
-      /// Access attribute values: crossing_angle
-      double crossing_angle() const;
-      /// Access attribute values: repeat
-      int    repeat()  const;
-
-      /// Access attribute values: outgoing_r
-      double outgoing_r() const;
-      /// Access attribute values: incoming_r
-      double incoming_r() const;
-      /// Access attribute values: offset
-      double offset() const;
-      /// Access attribute values: offset
-      double offset(double default_value) const;
-      /// Access attribute values: number
-      int    number() const;
-
-      /// Access attribute values: nmodules
-      int    nmodules() const;
-      /// Access attribute values: nModules
-      int    nModules() const;
-      /// Access attribute values: RowID
-      int    RowID() const;
-      /// Access attribute values: moduleHeight
-      double moduleHeight() const;
-      /// Access attribute values: moduleWidth
-      double moduleWidth() const;
-      /// Access attribute values: modulePitch
-      double modulePitch() const;
-      /// Access attribute values: modulePosX
-      double modulePosX() const;
-      /// Access attribute values: modulePosY
-      double modulePosY() const;
-
-      /// Access attribute values: nPads
-      int    nPads() const;
-      /// Access attribute values: rowPitch
-      double rowPitch() const;
-      /// Access attribute values: padPitch
-      double padPitch() const;
-      /// Access attribute values: rowHeight
-      double rowHeight() const;
-      /// Access attribute values: padType
-      std::string padType() const;
-
-      /// Access attribute values: numsides
-      int    numsides() const;
-
-      /// Access attribute values: phi_tilt
-      double phi_tilt() const;
-      /// Access attribute values: nphi
-      int    nphi() const;
-      /// Access attribute values: rc
-      double rc()  const;
-      
-      /// Access attribute values: zstart
-      double zstart() const;
-      /// Access attribute values: nz
-      int    nz() const;
-
-      /// Access attribute values: start
-      double start()  const;
-      /// Access attribute values: end
-      double end()    const;
-      /// Access attribute values: inner_field
-      double inner_field() const;
-      /// Access attribute values: outer_field
-      double outer_field() const;
-
-      /// Access attribute values: visible
-      bool visible() const;
-      /// Access attribute values: show_daughters
-      bool show_daughters() const;
-      
-      /// Access child element with tag "dimensions" as Dimension object
-      Dimension dimensions(bool throw_if_not_present=true)  const;
-      /// Child access: position
-      Dimension position(bool throw_if_not_present=true) const;
-      /// Child access: rotation
-      Dimension rotation(bool throw_if_not_present=true) const;
-      /// Child access: trd
-      Dimension trd(bool throw_if_not_present=true) const;
-      /// Child access: tubs
-      Dimension tubs(bool throw_if_not_present=true) const;
-      /// Child access: staves
-      Dimension staves(bool throw_if_not_present=true) const;
-      /// Child access: beampipe
-      Dimension beampipe(bool throw_if_not_present=true) const;
-
-      /// Access name attribute as STL string
-      std::string   nameStr() const;
-      /// Access ref attribute as a string
-      std::string   refStr()  const;
-      /// Access type attribute as STL string
-      std::string   typeStr() const;
-      /// Access module attribute as STL string
-      std::string   moduleStr() const;
-      /// Access readout attribute as STL string
-      std::string   readoutStr() const;
-      /// Access vis attribute as STL string. If not present empty return empty string
-      std::string   visStr() const;
-      /// Access region attribute as STL string. If not present empty return empty string
-      std::string   regionStr() const;
-      /// Access limits attribute as STL string. If not present empty return empty string
-      std::string   limitsStr() const;
-    };
-
     /** @class DetElement::Component XMLDetector.h XML/XMLDetector.h
      * 
      *  Helper class to access any field in a xml tag.
diff --git a/DDCore/include/XML/XMLDimension.h b/DDCore/include/XML/XMLDimension.h
new file mode 100644
index 0000000000000000000000000000000000000000..b5fc9cd2bb0a7641f6edbae6d5fac6238838e059
--- /dev/null
+++ b/DDCore/include/XML/XMLDimension.h
@@ -0,0 +1,349 @@
+// $Id: XMLDetector.h 513 2013-04-05 14:31:53Z gaede $
+//====================================================================
+//  AIDA Detector description implementation
+//--------------------------------------------------------------------
+//
+//  Author     : M.Frank
+//
+//====================================================================
+#ifndef DD4HEP_XMLDIMENSION_H
+#define DD4HEP_XMLDIMENSION_H
+
+// Framework include files
+#include "XML/XMLTags.h"
+
+/*
+ *   DD4hep namespace declaration
+ */
+namespace DD4hep {
+
+  /*
+  *   XML namespace declaration
+  */
+  namespace XML  {
+
+
+    /** @class Dimension XMLDetector.h XML/XMLDetector.h
+     * 
+     *  Helper class to access any field in a xml tag in a 
+     *  very easy way.
+     *  - You may assign any xml handle to a dimension object
+     *  - Any attribute of this xml element may then be accessed
+     *    by it's natural way. All possible attribute names are
+     *    reflected by the Dimmension object's member functions.
+     *  - If an attribute is requested and not present, a exception
+     *    is thrown.
+     *  - Functions, which accept a default value do NOT throw 
+     *    an exception if the attribute is not present. These
+     *    rather return the default value.
+     *  - If a often used function is not present - the 
+     *    implementation thereof is simple.
+     *  
+     *  @author  M.Frank
+     *  @version 1.0
+     */
+    struct Dimension : public Element  {
+      /// Default constructor
+      Dimension() : Element(Handle_t(0)) {}
+      /// Constructor from Handle
+      Dimension(Handle_t e) : Element(e) {}
+      /// Constructor from Element
+      Dimension(const Element& e) : Element(e) {}
+
+      /// Access parameters: id
+      int    id() const;
+      /// Access parameters: id, if not present returns default
+      int    id(int default_value) const;
+
+      /// Access parameters: type
+      int    type() const;
+      /// Access rotation constants: combineHits
+      bool combineHits() const;
+
+      /// Access rotation constants: angle
+      double angle() const;
+      /// Access rotation constants: angle
+      double alpha() const;
+      /// Access rotation constants: angle
+      double beta() const;
+      /// Access rotation constants: angle
+      double gamma() const;
+      /// Access rotation constants: angle
+      double delta() const;
+      /// Access rotation constants: angle
+      double epsilon() const;
+      /// Access rotation constants: theta
+      double theta() const;
+      /// Access rotation constants: thetaBins
+      int thetaBins() const;
+
+      /// Access rotation constants: phi
+      double phi() const;
+      /// Access rotation constants: phiBins
+      int phiBins() const;
+      /// Access rotation constants: phi0
+      double phi0() const;
+      /// Access parameters: phi0, if not present returns default
+      double phi0(double default_value) const;
+      /// Access rotation constants: psi
+      double psi() const;
+
+      /// Access Tube parameters: zhalf
+      double zhalf() const;
+      /// Access Tube parameters: deltaphi
+      double deltaphi() const;
+
+      /// Access parameters: b
+      double b()  const;
+      /// Access parameters: B
+      double B()  const;
+      /// Access parameters: g
+      double g()  const;
+      /// Access parameters: G
+      double G()  const;
+
+      /// Access parameters: r
+      double r()  const;
+      /// Access parameters: r, if not present returns default
+      double r(double default_value)  const;
+      /// Access parameters: R
+      double R()  const;
+      /// Access parameters: dr
+      double dr()  const;
+      /// Access parameters: r0
+      double r0()  const;
+      /// Access parameters: dr, if not present returns default
+      double dr(double default_value)  const;
+      /// Access min/max parameters: rmin
+      double rmin() const;
+      /// Access min/max parameters: rmax
+      double rmax() const;
+      /// Access min/max parameters: rmin1
+      double rmin1() const;
+      /// Access min/max parameters: rmax1
+      double rmax1() const;
+      /// Access min/max parameters: rmin2
+      double rmin2() const;
+      /// Access min/max parameters: rmax2
+      double rmax2() const;
+      /// Access parameters: radius
+      double radius() const;
+      /// Access attribute values: outer_radius
+      double outer_radius() const;
+      /// Access attribute values: outer_r
+      double outer_r() const;
+      /// Access attribute values: inner_radius
+      double inner_radius() const;
+      /// Access attribute values: inner_r
+      double inner_r() const;
+
+      /// Access parameters: x
+      double x() const;
+      /// Access parameters: x, if not present returns default
+      double x(double default_val) const;
+      /// Access parameters: X
+      double X() const;
+      /// Access parameters: x0
+      double x0() const;
+      /// Access parameters: x1
+      double x1() const;
+      /// Access parameters: x2
+      double x2() const;
+      /// Access parameters: dx
+      double dx() const;
+      /// Access parameters: dx, if not present returns default
+      double dx(double default_value)  const;
+      /// Access min/max parameters: xmax
+      double xmin() const;
+      /// Access min/max parameters: xmax
+      double xmax() const;
+      /// Access min/max parameters: x_offset
+      double x_offset() const;
+      /// Access min/max parameters: dim_x
+      double dim_x() const;
+
+      /// Access parameters: y
+      double y() const;
+      /// Access parameters: y, if not present returns default
+      double y(double default_val) const;
+      /// Access parameters: Y
+      double Y() const;
+      /// Access parameters: y0
+      double y0() const;
+      /// Access parameters: y1
+      double y1() const;
+      /// Access parameters: y2
+      double y2() const;
+      /// Access parameters: dy
+      double dy() const;
+      /// Access parameters: dz, if not present returns default
+      double dy(double default_value)  const;
+      /// Access min/max parameters: ymax
+      double ymin() const;
+      /// Access min/max parameters: ymax
+      double ymax() const;
+      /// Access min/max parameters: y_offset
+      double y_offset() const;
+      /// Access min/max parameters: dim_y
+      double dim_y() const;
+
+      /// Access parameters: z
+      double z() const;
+      /// Access parameters: z, if not present returns default
+      double z(double default_val) const;
+      /// Access parameters: Z
+      double Z() const;
+      /// Access parameters: z0
+      double z0() const;
+      /// Access parameters: z1
+      double z1() const;
+      /// Access parameters: z2
+      double z2() const;
+      /// Access parameters: dz
+      double dz() const;
+      /// Access parameters: dz, if not present returns default
+      double dz(double default_value)  const;
+      /// Access min/max parameters: zmax
+      double zmin() const;
+      /// Access min/max parameters: zmax
+      double zmax() const;
+      /// Access attribute values: outer_z
+      double outer_z() const;
+      /// Access attribute values: inner_z
+      double inner_z() const;
+      /// Access min/max parameters: z_offset
+      double z_offset() const;
+      /// Access min/max parameters: dim_z
+      double dim_z() const;
+
+      /// Access attribute values: length
+      double length() const;
+      /// Access attribute values: width
+      double width() const;
+      /// Access attribute values: height
+      double height() const;
+      /// Access attribute values: depth
+      double depth() const;
+      /// Access attribute values: thickness
+      double thickness() const;
+
+      /// Access attribute values: z_length
+      double z_length() const;
+      /// Access attribute values: gap
+      double gap() const;
+      /// Access attribute values: r_size
+      double r_size() const;
+      /// Access attribute values: phi_size_max
+      double phi_size_max() const;
+      /// Access attribute values: reflect
+      bool   reflect() const;
+      /// Access attribute values: reflect
+      bool   reflect(bool default_value) const;
+      /// Access attribute values: crossing_angle
+      double crossing_angle() const;
+      /// Access attribute values: repeat
+      int    repeat()  const;
+
+      /// Access attribute values: outgoing_r
+      double outgoing_r() const;
+      /// Access attribute values: incoming_r
+      double incoming_r() const;
+      /// Access attribute values: offset
+      double offset() const;
+      /// Access attribute values: offset
+      double offset(double default_value) const;
+      /// Access attribute values: number
+      int    number() const;
+
+      /// Access attribute values: nmodules
+      int    nmodules() const;
+      /// Access attribute values: nModules
+      int    nModules() const;
+      /// Access attribute values: RowID
+      int    RowID() const;
+      /// Access attribute values: moduleHeight
+      double moduleHeight() const;
+      /// Access attribute values: moduleWidth
+      double moduleWidth() const;
+      /// Access attribute values: modulePitch
+      double modulePitch() const;
+      /// Access attribute values: modulePosX
+      double modulePosX() const;
+      /// Access attribute values: modulePosY
+      double modulePosY() const;
+
+      /// Access attribute values: nPads
+      int    nPads() const;
+      /// Access attribute values: rowPitch
+      double rowPitch() const;
+      /// Access attribute values: padPitch
+      double padPitch() const;
+      /// Access attribute values: rowHeight
+      double rowHeight() const;
+      /// Access attribute values: padType
+      std::string padType() const;
+
+      /// Access attribute values: numsides
+      int    numsides() const;
+
+      /// Access attribute values: phi_tilt
+      double phi_tilt() const;
+      /// Access attribute values: nphi
+      int    nphi() const;
+      /// Access attribute values: rc
+      double rc()  const;
+      
+      /// Access attribute values: zstart
+      double zstart() const;
+      /// Access attribute values: nz
+      int    nz() const;
+
+      /// Access attribute values: start
+      double start()  const;
+      /// Access attribute values: end
+      double end()    const;
+      /// Access attribute values: inner_field
+      double inner_field() const;
+      /// Access attribute values: outer_field
+      double outer_field() const;
+
+      /// Access attribute values: visible
+      bool visible() const;
+      /// Access attribute values: show_daughters
+      bool show_daughters() const;
+      
+      /// Access child element with tag "dimensions" as Dimension object
+      Dimension dimensions(bool throw_if_not_present=true)  const;
+      /// Child access: position
+      Dimension position(bool throw_if_not_present=true) const;
+      /// Child access: rotation
+      Dimension rotation(bool throw_if_not_present=true) const;
+      /// Child access: trd
+      Dimension trd(bool throw_if_not_present=true) const;
+      /// Child access: tubs
+      Dimension tubs(bool throw_if_not_present=true) const;
+      /// Child access: staves
+      Dimension staves(bool throw_if_not_present=true) const;
+      /// Child access: beampipe
+      Dimension beampipe(bool throw_if_not_present=true) const;
+
+      /// Access name attribute as STL string
+      std::string   nameStr() const;
+      /// Access ref attribute as a string
+      std::string   refStr()  const;
+      /// Access type attribute as STL string
+      std::string   typeStr() const;
+      /// Access module attribute as STL string
+      std::string   moduleStr() const;
+      /// Access readout attribute as STL string
+      std::string   readoutStr() const;
+      /// Access vis attribute as STL string. If not present empty return empty string
+      std::string   visStr() const;
+      /// Access region attribute as STL string. If not present empty return empty string
+      std::string   regionStr() const;
+      /// Access limits attribute as STL string. If not present empty return empty string
+      std::string   limitsStr() const;
+    };
+  }       /* End namespace XML       */
+}         /* End namespace DD4hep    */
+#endif    /* DD4HEP_XMLDIMENSION_H   */
diff --git a/DDCore/include/XML/XMLElements.h b/DDCore/include/XML/XMLElements.h
index d52a0cb8e986c04828d10442764e1e392b9c6a26..e5dd0f19ecd8cb8ee324cf85947d2d5de90e2e0c 100644
--- a/DDCore/include/XML/XMLElements.h
+++ b/DDCore/include/XML/XMLElements.h
@@ -636,6 +636,8 @@ namespace DD4hep {
       RefElement(const RefElement& e);
       /// Initializing constructor to create a new XMLElement and add it to the document.
       RefElement(const Document& d, const XmlChar* type, const XmlChar* name);
+      /// Assignment operator
+      RefElement& operator=(const RefElement& e);
       /// Access the object's name in unicode
       const XmlChar* name() const;
       /// Access the object's reference name in unicode (same as name)
diff --git a/DDCore/include/XML/XMLTags.h b/DDCore/include/XML/XMLTags.h
index 73ed57e99c945f46efec974ba230197f0408a121..ce7e7c432d2e7fc945151dd374ef69e366c74499 100644
--- a/DDCore/include/XML/XMLTags.h
+++ b/DDCore/include/XML/XMLTags.h
@@ -9,6 +9,8 @@
 #ifndef DD4hep_XML_TAGS_H
 #define DD4hep_XML_TAGS_H
 
+#define DECLARE_UNICODE_TAG(x)  namespace DD4hep { namespace XML { extern const Tag_t Unicode_##x (#x); }}
+
 #include "XML/XMLElements.h"
 #define UNICODE(x)  extern const Tag_t Unicode_##x
 #include "XML/UnicodeValues.h"
diff --git a/DDCore/include/XML/tinyxml.h b/DDCore/include/XML/tinyxml.h
index 600ac5f0bd5b483e810672a8dbaed2b2a89378ef..4dc88f3b088a2062169b2989e077d26da68ea458 100644
--- a/DDCore/include/XML/tinyxml.h
+++ b/DDCore/include/XML/tinyxml.h
@@ -134,23 +134,23 @@ public:
 	virtual ~TiXmlVisitor() {}
 
 	/// Visit a document.
-	virtual bool VisitEnter( const TiXmlDocument& doc )	{ return true; }
+	virtual bool VisitEnter( const TiXmlDocument& /* doc */)	{ return true; }
 	/// Visit a document.
-	virtual bool VisitExit( const TiXmlDocument& doc )	{ return true; }
+	virtual bool VisitExit( const TiXmlDocument& /* doc */)	{ return true; }
 
 	/// Visit an element.
-	virtual bool VisitEnter( const TiXmlElement& element, const TiXmlAttribute* firstAttribute )	{ return true; }
+	virtual bool VisitEnter( const TiXmlElement& /* element */, const TiXmlAttribute* /* firstAttribute */ )	{ return true; }
 	/// Visit an element.
-	virtual bool VisitExit( const TiXmlElement& element )											{ return true; }
+	virtual bool VisitExit( const TiXmlElement& /* element */ )											{ return true; }
 
 	/// Visit a declaration
-	virtual bool Visit( const TiXmlDeclaration& declaration )		{ return true; }
+	virtual bool Visit( const TiXmlDeclaration& /* declaration */ )		{ return true; }
 	/// Visit a text node
-	virtual bool Visit( const TiXmlText& text )						{ return true; }
+	virtual bool Visit( const TiXmlText& /* text */ )						{ return true; }
 	/// Visit a comment node
-	virtual bool Visit( const TiXmlComment& comment )				{ return true; }
+	virtual bool Visit( const TiXmlComment& /* comment */ )				{ return true; }
 	/// Visit an unknow node
-	virtual bool Visit( const TiXmlUnknown& unknown )				{ return true; }
+	virtual bool Visit( const TiXmlUnknown& /* unknown */ )				{ return true; }
 };
 
 // Only used by Attribute::Query functions
diff --git a/DDCore/src/GeoHandler.cpp b/DDCore/src/GeoHandler.cpp
index 62803c1cfcbce1e871776695cec13b3ca407e830..a34d6bf4fe7abe348fe07bf29e7e15eb54fc211c 100644
--- a/DDCore/src/GeoHandler.cpp
+++ b/DDCore/src/GeoHandler.cpp
@@ -74,27 +74,29 @@ GeoHandler& GeoHandler::collect(DetElement element, GeometryInfo& info) {
     for(Data::mapped_type::const_iterator j=v.begin(); j != v.end(); ++j) {
       const TGeoNode* n = *j;
       TGeoVolume* v = n->GetVolume();
-      TGeoMedium* m = v->GetMedium();
-      Volume      vol = Ref_t(v);
-      VisAttr     vis = vol.visAttributes();
-      //Region      reg = vol.region();
-      //LimitSet    lim = vol.limitSet();
-      //SensitiveDetector det = vol.sensitiveDetector();
-
-      // Note : assemblies and the world do not have a real volume nor a material
-      if ( v && info.volumeSet.find(v) == info.volumeSet.end() )   {
-	info.volumeSet.insert(v);
-	info.volumes.push_back(v);
+      if ( v ) {
+	TGeoMedium* m = v->GetMedium();
+	Volume      vol = Ref_t(v);
+	VisAttr     vis = vol.visAttributes();
+	//Region      reg = vol.region();
+	//LimitSet    lim = vol.limitSet();
+	//SensitiveDetector det = vol.sensitiveDetector();
+
+	// Note : assemblies and the world do not have a real volume nor a material
+	if ( info.volumeSet.find(v) == info.volumeSet.end() )   {
+	  info.volumeSet.insert(v);
+	  info.volumes.push_back(v);
+	}
+	if ( m ) info.materials.insert(m);
+	if ( dynamic_cast<Volume::Object*>(v) ) {
+	  if ( vis.isValid() ) info.vis.insert(vis.ptr());
+	}
+	//if ( lim.isValid() ) info.limits[lim.ptr()].insert(v);
+	//if ( reg.isValid() ) info.regions[reg.ptr()].insert(v);
+	//if ( det.isValid() ) info.sensitives[det.ptr()].insert(v);
+
+	collectSolid(info,v->GetName(),n->GetName(),v->GetShape(),n->GetMatrix());
       }
-      if ( m ) info.materials.insert(m);
-      if ( dynamic_cast<Volume::Object*>(v) ) {
-	if ( vis.isValid() ) info.vis.insert(vis.ptr());
-      }
-      //if ( lim.isValid() ) info.limits[lim.ptr()].insert(v);
-      //if ( reg.isValid() ) info.regions[reg.ptr()].insert(v);
-      //if ( det.isValid() ) info.sensitives[det.ptr()].insert(v);
-
-      collectSolid(info,v->GetName(),n->GetName(),v->GetShape(),n->GetMatrix());
     }
   }
   return *this;
diff --git a/DDCore/src/GeometryTreeDump.cpp b/DDCore/src/GeometryTreeDump.cpp
index 7c39aa0c565beee51c09e89075b8ca62db7a2483..3048845f2299bfdf26797182ab590ca9f71a31d6 100644
--- a/DDCore/src/GeometryTreeDump.cpp
+++ b/DDCore/src/GeometryTreeDump.cpp
@@ -276,7 +276,7 @@ static void dumpStructure(PlacedVolume pv, int level) {
 
   _path += "/";
   _path += current->GetName();
-  ::sprintf(fmt, "%%4d %%%ds %%7s %%s\n",level*2+5);
+  ::snprintf(fmt, sizeof(fmt), "%%4d %%%ds %%7s %%s\n", level*2+5);
   ::printf(fmt,level,"","  ->LV:  ",volume->GetName());
   ::printf(fmt,level,"","  ->PV:  ",current->GetName());
   ::printf(fmt,level,"","  ->path:",_path.c_str());
@@ -296,7 +296,7 @@ static void dumpDetectors(DetElement parent,int level) {
 
   _path += "/";
   _path += parent.name();
-  ::sprintf(fmt, "%%4d %%%ds %%7s %%s\n",level*2+5);
+  ::snprintf(fmt, sizeof(fmt), "%%4d %%%ds %%7s %%s\n",level*2+5);
   ::printf(fmt,level,"","->path:",_path.c_str());
   if ( pl.isValid() ) {
     ::printf(fmt,level,"","   ->placement:",parent.placementPath().c_str());
diff --git a/DDCore/src/Handle.cpp b/DDCore/src/Handle.cpp
index 30b1f4fc114d92fd020d37a5b242b2722ea1ac5d..78c949db9914119066a37b18cab15c1521f4a800 100644
--- a/DDCore/src/Handle.cpp
+++ b/DDCore/src/Handle.cpp
@@ -110,25 +110,25 @@ void DD4hep::Geometry::_toDictionary(const string& name, const string& value)  {
 
 string DD4hep::Geometry::_toString(bool value)    {
   char text[32];
-  ::sprintf(text,"%s",value ? "true" : "false");
+  ::snprintf(text,sizeof(text),"%s",value ? "true" : "false");
   return text;
 }
 
 string DD4hep::Geometry::_toString(int value)   {
   char text[32];
-  ::sprintf(text,"%d",value);
+  ::snprintf(text,sizeof(text),"%d",value);
   return text;
 }
 
 string DD4hep::Geometry::_toString(float value)   {
   char text[32];
-  ::sprintf(text,"%f",value);
+  ::snprintf(text,sizeof(text),"%f",value);
   return text;
 }
 
 string DD4hep::Geometry::_toString(double value)   {
   char text[32];
-  ::sprintf(text,"%f",value);
+  ::snprintf(text,sizeof(text),"%f",value);
   return text;
 }
 namespace DD4hep { namespace Geometry {
diff --git a/DDCore/src/LCDDImp.h b/DDCore/src/LCDDImp.h
index 4bd9508daba5eeb8020744dfb0dac842e1d87f44..e2a54a00536046bbe96a4d10fec503c5e35c60b3 100644
--- a/DDCore/src/LCDDImp.h
+++ b/DDCore/src/LCDDImp.h
@@ -30,6 +30,12 @@ namespace DD4hep {
   namespace Geometry  {
 
     class LCDDImp : public LCDD  {
+    private:
+      /// Disable copy constructor
+      LCDDImp(const LCDDImp&) {}
+      /// Disable assignment operator
+      LCDDImp& operator=(const LCDDImp&) { return *this; }
+
     public:
       struct InvalidObjectError : public std::runtime_error {
         InvalidObjectError(const std::string& msg) : std::runtime_error(msg) {}
diff --git a/DDCore/src/Objects.cpp b/DDCore/src/Objects.cpp
index 235557e99fcb31b8e4575ca512d4b36b861d0a93..a9425e5f08088f8e0a7c16d503d29b7b67a14c45 100644
--- a/DDCore/src/Objects.cpp
+++ b/DDCore/src/Objects.cpp
@@ -256,7 +256,8 @@ string VisAttr::toString()  const {
   const VisAttr::Object* obj = &_data();
   TColor* col = gROOT->GetColor(obj->color);
   char text[256];
-  ::sprintf(text,"%-20s RGB:%-8s [%d] %7.2f  Style:%d %d ShowDaughters:%3s Visible:%3s",
+  ::snprintf(text,sizeof(text),
+	    "%-20s RGB:%-8s [%d] %7.2f  Style:%d %d ShowDaughters:%3s Visible:%3s",
 	    ptr()->GetName(),col->AsHexString(), obj->color, col->GetAlpha(), 
 	    int(obj->drawingStyle), int(obj->lineStyle),
 	    obj->showDaughters ? "YES" : "NO", obj->visible ? "YES" : "NO");
@@ -297,11 +298,13 @@ int AlignmentEntry::align(const Position& pos, const Rotation& rot, bool check,
 
 /// Assignment operator
 Limit& Limit::operator=(const Limit& c) 	{ 
-  particles = c.particles;
-  name      = c.name;
-  unit      = c.unit;
-  value     = c.value; 
-  content   = c.content;
+  if ( this != &c ) {
+    particles = c.particles;
+    name      = c.name;
+    unit      = c.unit;
+    value     = c.value; 
+    content   = c.content;
+  }
   return *this;
 }
 
diff --git a/DDCore/src/Segementations.cpp b/DDCore/src/Segementations.cpp
index 646ee9d82578da9b050a9310a5e6eb5a80cf5a0e..047401cd28d5180485921be7160515a029605793 100644
--- a/DDCore/src/Segementations.cpp
+++ b/DDCore/src/Segementations.cpp
@@ -13,8 +13,11 @@
 using namespace std;
 using namespace DD4hep::Geometry;
 
-Segmentation::Object::Object() : magic(magic_word()), type(REGULAR), useForHitPosition(0) {
+Segmentation::Object::Object() 
+: magic(magic_word()), type(REGULAR), useForHitPosition(0) 
+{
   ::memset(data.values,0,sizeof(data.values));
+  _spare[5]=_spare[4]=_spare[3]=_spare[2]=_spare[1]=_spare[0]=0;
 }
 
 Segmentation::Object::~Object() {
diff --git a/DDCore/src/Shapes.cpp b/DDCore/src/Shapes.cpp
index 9bf0e3d690d2ef1c76a201cd4db59a891fd5fd74..e6805bde0e462dd647f8cb5fc38e4a6abfa49651 100644
--- a/DDCore/src/Shapes.cpp
+++ b/DDCore/src/Shapes.cpp
@@ -63,7 +63,7 @@ void Box::make(const string& name, double x, double y, double z)  {
   _assign(new TGeoBBox(x*MM_2_CM,y*MM_2_CM,z*MM_2_CM),name,"box");
 }
 
-/// Set the box dimensions
+/// Set the box dimensionsy
 Box& Box::setDimensions(double x, double y, double z)   {
   double params[] = {x*MM_2_CM,y*MM_2_CM,z*MM_2_CM};
   _setDimensions(params);
diff --git a/DDCore/src/XML/DocumentHandler.cpp b/DDCore/src/XML/DocumentHandler.cpp
index 03e0ef4ed20b9c3473d7d840762713894dc2d0d9..aa666c520772bb1c661d6ab001c8b49a7d084d0c 100644
--- a/DDCore/src/XML/DocumentHandler.cpp
+++ b/DDCore/src/XML/DocumentHandler.cpp
@@ -290,7 +290,7 @@ Document DocumentHandler::load(const string& fname)  const  {
 }
 
 /// Parse a standalong XML string into a document.
-Document DocumentHandler::parse(const char* doc_string, size_t length) const {
+Document DocumentHandler::parse(const char* doc_string, size_t /* length */) const {
   TiXmlDocument* doc = new TiXmlDocument();
   try  {
     if ( 0 == doc->Parse(doc_string) ) {
diff --git a/DDCore/src/XML/XMLDetector.cpp b/DDCore/src/XML/XMLDetector.cpp
index d8a254dfa2c8bc3088ab88ab87506f2f0e3327ec..4cddd3658a88191d702ed5c7383b8d9786f0e95c 100644
--- a/DDCore/src/XML/XMLDetector.cpp
+++ b/DDCore/src/XML/XMLDetector.cpp
@@ -1,202 +1,17 @@
+// $Id$
+//====================================================================
+//  AIDA Detector description implementation
+//--------------------------------------------------------------------
+//
+//  Author     : M.Frank
+//
+//====================================================================
+// Framework include files
 #include "XML/XMLDetector.h"
 
 using namespace std;
 using namespace DD4hep::XML;
 
-#define XML_ATTR_ACCESSOR(type,name)  type Dimension::name() const { return m_element.attr<type>(Unicode_##name); }
-#define XML_ATTR_ACCESSOR_DOUBLE(name)	                                \
-  double Dimension::name(double default_val) const {		       	\
-    const XmlChar* val = m_element.attr_value_nothrow(Unicode_##name);	\
-    return val ? _toDouble(val) : default_val; }
-#define XML_ATTR_ACCESSOR_INT(name)	                                \
-  int Dimension::name(int default_val) const {				\
-    const XmlChar* val = m_element.attr_value_nothrow(Unicode_##name);	\
-    return val ? _toInt(val) : default_val; }
-#define XML_ATTR_ACCESSOR_BOOL(name)	                                \
-  bool Dimension::name(bool default_val) const {		       	\
-    const XmlChar* val = m_element.attr_value_nothrow(Unicode_##name);	\
-    return val ? _toBool(val) : default_val; }
-
-#define XML_CHILD_ACCESSOR_XML_DIM(name)	                        \
-  Dimension Dimension::name(bool throw_if_not_present) const {          \
-    return m_element.child(Unicode_##name,throw_if_not_present); }
-
-XML_ATTR_ACCESSOR(int,id)
-  XML_ATTR_ACCESSOR_INT(id)
-  XML_ATTR_ACCESSOR(bool,combineHits)
-
-  XML_ATTR_ACCESSOR(double,x)
-  XML_ATTR_ACCESSOR_DOUBLE(x)
-  XML_ATTR_ACCESSOR(double,X)
-  XML_ATTR_ACCESSOR(double,dx)
-  XML_ATTR_ACCESSOR_DOUBLE(dx)
-  XML_ATTR_ACCESSOR(double,x0)
-  XML_ATTR_ACCESSOR(double,x1)
-  XML_ATTR_ACCESSOR(double,x2)
-  XML_ATTR_ACCESSOR(double,xmin)
-  XML_ATTR_ACCESSOR(double,xmax)
-  XML_ATTR_ACCESSOR(double,x_offset)
-  XML_ATTR_ACCESSOR(double,dim_x)
-  
-  XML_ATTR_ACCESSOR(double,y)
-  XML_ATTR_ACCESSOR_DOUBLE(y)
-  XML_ATTR_ACCESSOR(double,Y)
-  XML_ATTR_ACCESSOR(double,dy)
-  XML_ATTR_ACCESSOR_DOUBLE(dy)
-  XML_ATTR_ACCESSOR(double,y0)
-  XML_ATTR_ACCESSOR(double,y1)
-  XML_ATTR_ACCESSOR(double,y2)
-  XML_ATTR_ACCESSOR(double,ymin)
-  XML_ATTR_ACCESSOR(double,ymax)
-  XML_ATTR_ACCESSOR(double,y_offset)
-  XML_ATTR_ACCESSOR(double,dim_y)
-
-  XML_ATTR_ACCESSOR(double,z)
-  XML_ATTR_ACCESSOR_DOUBLE(z)
-  XML_ATTR_ACCESSOR(double,Z)
-  XML_ATTR_ACCESSOR(double,dz)
-  XML_ATTR_ACCESSOR_DOUBLE(dz)
-  XML_ATTR_ACCESSOR(double,z0)
-  XML_ATTR_ACCESSOR(double,z1)
-  XML_ATTR_ACCESSOR(double,z2)
-  XML_ATTR_ACCESSOR(double,zmin)
-  XML_ATTR_ACCESSOR(double,zmax)
-  XML_ATTR_ACCESSOR(double,z_offset)
-  XML_ATTR_ACCESSOR(double,dim_z)
-  XML_ATTR_ACCESSOR(double,outer_z)
-  XML_ATTR_ACCESSOR(double,inner_z)
-
-  XML_ATTR_ACCESSOR(double,b)
-  XML_ATTR_ACCESSOR(double,g)
-  XML_ATTR_ACCESSOR(double,B)
-  XML_ATTR_ACCESSOR(double,G)
-  XML_ATTR_ACCESSOR(double,r)
-  XML_ATTR_ACCESSOR_DOUBLE(r)
-  XML_ATTR_ACCESSOR(double,R)
-  XML_ATTR_ACCESSOR(double,dr)
-  XML_ATTR_ACCESSOR(double,rmin)
-  XML_ATTR_ACCESSOR(double,rmax)
-  XML_ATTR_ACCESSOR(double,radius)
-  XML_ATTR_ACCESSOR(double,outer_r)
-  XML_ATTR_ACCESSOR(double,outer_radius)
-  XML_ATTR_ACCESSOR(double,inner_r)
-  XML_ATTR_ACCESSOR(double,inner_radius)
-
-  XML_ATTR_ACCESSOR(double,angle)
-  XML_ATTR_ACCESSOR(double,alpha)
-  XML_ATTR_ACCESSOR(double,beta)
-  XML_ATTR_ACCESSOR(double,gamma)
-  XML_ATTR_ACCESSOR(double,delta)
-  XML_ATTR_ACCESSOR(double,epsilon)
-  XML_ATTR_ACCESSOR(double,theta)
-  XML_ATTR_ACCESSOR(int,thetaBins)
-  XML_ATTR_ACCESSOR(double,psi)
-  XML_ATTR_ACCESSOR(double,phi)
-  XML_ATTR_ACCESSOR(int,phiBins)
-  XML_ATTR_ACCESSOR(double,phi0)
-  XML_ATTR_ACCESSOR_DOUBLE(phi0)
-  XML_ATTR_ACCESSOR(double,deltaphi)
-
-
-  XML_ATTR_ACCESSOR(double,length)
-  XML_ATTR_ACCESSOR(double,width)
-  XML_ATTR_ACCESSOR(double,height)
-  XML_ATTR_ACCESSOR(double,depth)
-  XML_ATTR_ACCESSOR(double,offset)
-  XML_ATTR_ACCESSOR_DOUBLE(offset)
-  XML_ATTR_ACCESSOR(double,crossing_angle)
-  XML_ATTR_ACCESSOR(double,incoming_r)
-  XML_ATTR_ACCESSOR(double,outgoing_r)
-  XML_ATTR_ACCESSOR(double,phi_size_max)
-  XML_ATTR_ACCESSOR(double,r_size)
-  
-  XML_ATTR_ACCESSOR(double,gap)
-  XML_ATTR_ACCESSOR(double,z_length)
-  XML_ATTR_ACCESSOR(double,zhalf)
-  XML_ATTR_ACCESSOR(double,phi_tilt)
-  XML_ATTR_ACCESSOR(int,nphi)
-  XML_ATTR_ACCESSOR(double,rc)
-  XML_ATTR_ACCESSOR(int,nz)
-  XML_ATTR_ACCESSOR(double,zstart)
-  XML_ATTR_ACCESSOR(double,start)
-  XML_ATTR_ACCESSOR(double,end)
-  XML_ATTR_ACCESSOR(double,thickness)
-  XML_ATTR_ACCESSOR(int,numsides)
-  XML_ATTR_ACCESSOR(int,number)
-  XML_ATTR_ACCESSOR(int,repeat)
-  XML_ATTR_ACCESSOR(bool,reflect)
-  XML_ATTR_ACCESSOR_BOOL(reflect)
-
-  XML_ATTR_ACCESSOR(int,nmodules)
-  XML_ATTR_ACCESSOR(int,nModules)
-  XML_ATTR_ACCESSOR(int,RowID)
-  XML_ATTR_ACCESSOR(int,nPads)
-  XML_ATTR_ACCESSOR(double,moduleHeight)
-  XML_ATTR_ACCESSOR(double,moduleWidth)
-  XML_ATTR_ACCESSOR(double,modulePosX)
-  XML_ATTR_ACCESSOR(double,modulePosY)
-  XML_ATTR_ACCESSOR(double,modulePitch)
-  XML_ATTR_ACCESSOR(double,rowPitch)
-  XML_ATTR_ACCESSOR(double,padPitch)
-  XML_ATTR_ACCESSOR(double,rowHeight)
-  XML_ATTR_ACCESSOR(double,inner_field)
-  XML_ATTR_ACCESSOR(double,outer_field)
-  XML_ATTR_ACCESSOR(int,type)
-
-  XML_ATTR_ACCESSOR(bool,visible)
-  XML_ATTR_ACCESSOR(bool,show_daughters)
-#if 0
-  XML_ATTR_ACCESSOR(double,)
-  XML_ATTR_ACCESSOR(double,)
-  XML_ATTR_ACCESSOR(double,)
-  XML_ATTR_ACCESSOR(double,)
-#endif
-
-  XML_CHILD_ACCESSOR_XML_DIM(dimensions)
-  XML_CHILD_ACCESSOR_XML_DIM(position)
-  XML_CHILD_ACCESSOR_XML_DIM(rotation)
-  XML_CHILD_ACCESSOR_XML_DIM(trd)
-  XML_CHILD_ACCESSOR_XML_DIM(tubs)
-  XML_CHILD_ACCESSOR_XML_DIM(staves)
-  XML_CHILD_ACCESSOR_XML_DIM(beampipe)
-
-
-  string Dimension::padType()  const  {
-  return m_element.attr<string>(_U(pads));
-}
-
-string Dimension::nameStr()  const  {
-  return m_element.attr<string>(_U(name));
-}
-
-string Dimension::refStr()  const  {
-  return m_element.attr<string>(_U(ref));
-}
-
-string Dimension::typeStr()  const  {
-  return m_element.attr<string>(_U(type));
-}
-
-string Dimension::regionStr() const {
-  return m_element.hasAttr(_U(region)) ? m_element.attr<string>(_U(region)) : string();
-}
-
-string Dimension::limitsStr() const {
-  return m_element.hasAttr(_U(limits)) ? m_element.attr<string>(_U(limits)) : string();
-}
-
-string Dimension::visStr()  const  {
-  return m_element.hasAttr(_U(vis)) ? m_element.attr<string>(_U(vis)) : string();
-}
-
-string Dimension::readoutStr()  const  {
-  return m_element.hasAttr(_U(readout)) ? m_element.attr<string>(_U(readout)) : string();
-}
-
-string Dimension::moduleStr()  const  {
-  return m_element.hasAttr(_U(module)) ? m_element.attr<string>(_U(module)) : string();
-}
-
 string Component::materialStr() const   {
   return m_element.attr<string>(_U(material));
 }
diff --git a/DDCore/src/XML/XMLDimension.cpp b/DDCore/src/XML/XMLDimension.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..9048df2e3ae5ea56f32d26caafe0013bbc353363
--- /dev/null
+++ b/DDCore/src/XML/XMLDimension.cpp
@@ -0,0 +1,207 @@
+// $Id: XMLElements.cpp 513 2013-04-05 14:31:53Z gaede $
+//====================================================================
+//  AIDA Detector description implementation
+//--------------------------------------------------------------------
+//
+//  Author     : M.Frank
+//
+//====================================================================
+// Framework include files
+#include "XML/XMLDimension.h"
+
+using namespace std;
+using namespace DD4hep::XML;
+
+#define XML_ATTR_ACCESSOR(type,name)  type Dimension::name() const { return m_element.attr<type>(Unicode_##name); }
+#define XML_ATTR_ACCESSOR_DOUBLE(name)	                                \
+  double Dimension::name(double default_val) const {		       	\
+    const XmlChar* val = m_element.attr_value_nothrow(Unicode_##name);	\
+    return val ? _toDouble(val) : default_val; }
+#define XML_ATTR_ACCESSOR_INT(name)	                                \
+  int Dimension::name(int default_val) const {				\
+    const XmlChar* val = m_element.attr_value_nothrow(Unicode_##name);	\
+    return val ? _toInt(val) : default_val; }
+#define XML_ATTR_ACCESSOR_BOOL(name)	                                \
+  bool Dimension::name(bool default_val) const {		       	\
+    const XmlChar* val = m_element.attr_value_nothrow(Unicode_##name);	\
+    return val ? _toBool(val) : default_val; }
+
+#define XML_CHILD_ACCESSOR_XML_DIM(name)	                        \
+  Dimension Dimension::name(bool throw_if_not_present) const {          \
+    return m_element.child(Unicode_##name,throw_if_not_present); }
+
+XML_ATTR_ACCESSOR(int,id)
+  XML_ATTR_ACCESSOR_INT(id)
+  XML_ATTR_ACCESSOR(bool,combineHits)
+
+  XML_ATTR_ACCESSOR(double,x)
+  XML_ATTR_ACCESSOR_DOUBLE(x)
+  XML_ATTR_ACCESSOR(double,X)
+  XML_ATTR_ACCESSOR(double,dx)
+  XML_ATTR_ACCESSOR_DOUBLE(dx)
+  XML_ATTR_ACCESSOR(double,x0)
+  XML_ATTR_ACCESSOR(double,x1)
+  XML_ATTR_ACCESSOR(double,x2)
+  XML_ATTR_ACCESSOR(double,xmin)
+  XML_ATTR_ACCESSOR(double,xmax)
+  XML_ATTR_ACCESSOR(double,x_offset)
+  XML_ATTR_ACCESSOR(double,dim_x)
+  
+  XML_ATTR_ACCESSOR(double,y)
+  XML_ATTR_ACCESSOR_DOUBLE(y)
+  XML_ATTR_ACCESSOR(double,Y)
+  XML_ATTR_ACCESSOR(double,dy)
+  XML_ATTR_ACCESSOR_DOUBLE(dy)
+  XML_ATTR_ACCESSOR(double,y0)
+  XML_ATTR_ACCESSOR(double,y1)
+  XML_ATTR_ACCESSOR(double,y2)
+  XML_ATTR_ACCESSOR(double,ymin)
+  XML_ATTR_ACCESSOR(double,ymax)
+  XML_ATTR_ACCESSOR(double,y_offset)
+  XML_ATTR_ACCESSOR(double,dim_y)
+
+  XML_ATTR_ACCESSOR(double,z)
+  XML_ATTR_ACCESSOR_DOUBLE(z)
+  XML_ATTR_ACCESSOR(double,Z)
+  XML_ATTR_ACCESSOR(double,dz)
+  XML_ATTR_ACCESSOR_DOUBLE(dz)
+  XML_ATTR_ACCESSOR(double,z0)
+  XML_ATTR_ACCESSOR(double,z1)
+  XML_ATTR_ACCESSOR(double,z2)
+  XML_ATTR_ACCESSOR(double,zmin)
+  XML_ATTR_ACCESSOR(double,zmax)
+  XML_ATTR_ACCESSOR(double,z_offset)
+  XML_ATTR_ACCESSOR(double,dim_z)
+  XML_ATTR_ACCESSOR(double,outer_z)
+  XML_ATTR_ACCESSOR(double,inner_z)
+
+  XML_ATTR_ACCESSOR(double,b)
+  XML_ATTR_ACCESSOR(double,g)
+  XML_ATTR_ACCESSOR(double,B)
+  XML_ATTR_ACCESSOR(double,G)
+  XML_ATTR_ACCESSOR(double,r)
+  XML_ATTR_ACCESSOR_DOUBLE(r)
+  XML_ATTR_ACCESSOR(double,R)
+  XML_ATTR_ACCESSOR(double,dr)
+  XML_ATTR_ACCESSOR(double,rmin)
+  XML_ATTR_ACCESSOR(double,rmax)
+  XML_ATTR_ACCESSOR(double,radius)
+  XML_ATTR_ACCESSOR(double,outer_r)
+  XML_ATTR_ACCESSOR(double,outer_radius)
+  XML_ATTR_ACCESSOR(double,inner_r)
+  XML_ATTR_ACCESSOR(double,inner_radius)
+
+  XML_ATTR_ACCESSOR(double,angle)
+  XML_ATTR_ACCESSOR(double,alpha)
+  XML_ATTR_ACCESSOR(double,beta)
+  XML_ATTR_ACCESSOR(double,gamma)
+  XML_ATTR_ACCESSOR(double,delta)
+  XML_ATTR_ACCESSOR(double,epsilon)
+  XML_ATTR_ACCESSOR(double,theta)
+  XML_ATTR_ACCESSOR(int,thetaBins)
+  XML_ATTR_ACCESSOR(double,psi)
+  XML_ATTR_ACCESSOR(double,phi)
+  XML_ATTR_ACCESSOR(int,phiBins)
+  XML_ATTR_ACCESSOR(double,phi0)
+  XML_ATTR_ACCESSOR_DOUBLE(phi0)
+  XML_ATTR_ACCESSOR(double,deltaphi)
+
+
+  XML_ATTR_ACCESSOR(double,length)
+  XML_ATTR_ACCESSOR(double,width)
+  XML_ATTR_ACCESSOR(double,height)
+  XML_ATTR_ACCESSOR(double,depth)
+  XML_ATTR_ACCESSOR(double,offset)
+  XML_ATTR_ACCESSOR_DOUBLE(offset)
+  XML_ATTR_ACCESSOR(double,crossing_angle)
+  XML_ATTR_ACCESSOR(double,incoming_r)
+  XML_ATTR_ACCESSOR(double,outgoing_r)
+  XML_ATTR_ACCESSOR(double,phi_size_max)
+  XML_ATTR_ACCESSOR(double,r_size)
+  
+  XML_ATTR_ACCESSOR(double,gap)
+  XML_ATTR_ACCESSOR(double,z_length)
+  XML_ATTR_ACCESSOR(double,zhalf)
+  XML_ATTR_ACCESSOR(double,phi_tilt)
+  XML_ATTR_ACCESSOR(int,nphi)
+  XML_ATTR_ACCESSOR(double,rc)
+  XML_ATTR_ACCESSOR(int,nz)
+  XML_ATTR_ACCESSOR(double,zstart)
+  XML_ATTR_ACCESSOR(double,start)
+  XML_ATTR_ACCESSOR(double,end)
+  XML_ATTR_ACCESSOR(double,thickness)
+  XML_ATTR_ACCESSOR(int,numsides)
+  XML_ATTR_ACCESSOR(int,number)
+  XML_ATTR_ACCESSOR(int,repeat)
+  XML_ATTR_ACCESSOR(bool,reflect)
+  XML_ATTR_ACCESSOR_BOOL(reflect)
+
+  XML_ATTR_ACCESSOR(int,nmodules)
+  XML_ATTR_ACCESSOR(int,nModules)
+  XML_ATTR_ACCESSOR(int,RowID)
+  XML_ATTR_ACCESSOR(int,nPads)
+  XML_ATTR_ACCESSOR(double,moduleHeight)
+  XML_ATTR_ACCESSOR(double,moduleWidth)
+  XML_ATTR_ACCESSOR(double,modulePosX)
+  XML_ATTR_ACCESSOR(double,modulePosY)
+  XML_ATTR_ACCESSOR(double,modulePitch)
+  XML_ATTR_ACCESSOR(double,rowPitch)
+  XML_ATTR_ACCESSOR(double,padPitch)
+  XML_ATTR_ACCESSOR(double,rowHeight)
+  XML_ATTR_ACCESSOR(double,inner_field)
+  XML_ATTR_ACCESSOR(double,outer_field)
+  XML_ATTR_ACCESSOR(int,type)
+
+  XML_ATTR_ACCESSOR(bool,visible)
+  XML_ATTR_ACCESSOR(bool,show_daughters)
+#if 0
+  XML_ATTR_ACCESSOR(double,)
+  XML_ATTR_ACCESSOR(double,)
+  XML_ATTR_ACCESSOR(double,)
+  XML_ATTR_ACCESSOR(double,)
+#endif
+
+  XML_CHILD_ACCESSOR_XML_DIM(dimensions)
+  XML_CHILD_ACCESSOR_XML_DIM(position)
+  XML_CHILD_ACCESSOR_XML_DIM(rotation)
+  XML_CHILD_ACCESSOR_XML_DIM(trd)
+  XML_CHILD_ACCESSOR_XML_DIM(tubs)
+  XML_CHILD_ACCESSOR_XML_DIM(staves)
+  XML_CHILD_ACCESSOR_XML_DIM(beampipe)
+
+
+  string Dimension::padType()  const  {
+  return m_element.attr<string>(_U(pads));
+}
+
+string Dimension::nameStr()  const  {
+  return m_element.attr<string>(_U(name));
+}
+
+string Dimension::refStr()  const  {
+  return m_element.attr<string>(_U(ref));
+}
+
+string Dimension::typeStr()  const  {
+  return m_element.attr<string>(_U(type));
+}
+
+string Dimension::regionStr() const {
+  return m_element.hasAttr(_U(region)) ? m_element.attr<string>(_U(region)) : string();
+}
+
+string Dimension::limitsStr() const {
+  return m_element.hasAttr(_U(limits)) ? m_element.attr<string>(_U(limits)) : string();
+}
+
+string Dimension::visStr()  const  {
+  return m_element.hasAttr(_U(vis)) ? m_element.attr<string>(_U(vis)) : string();
+}
+
+string Dimension::readoutStr()  const  {
+  return m_element.hasAttr(_U(readout)) ? m_element.attr<string>(_U(readout)) : string();
+}
+
+string Dimension::moduleStr()  const  {
+  return m_element.hasAttr(_U(module)) ? m_element.attr<string>(_U(module)) : string();
+}
diff --git a/DDCore/src/XML/XMLElements.cpp b/DDCore/src/XML/XMLElements.cpp
index 198de30cb80e815191bd5fce8cdb1bf47bce9c0e..02d6f8d482b3dcb372eebeb9cdb0909daeaf130f 100644
--- a/DDCore/src/XML/XMLElements.cpp
+++ b/DDCore/src/XML/XMLElements.cpp
@@ -19,7 +19,7 @@
 
 using namespace std;
 using namespace DD4hep::XML;
-#define INVALID_NODE ~0x0
+static const size_t INVALID_NODE = ~0U;
 
 // Forward declarations
 namespace DD4hep  {
@@ -417,6 +417,7 @@ const XmlChar* Handle_t::rawValue() const     {
 Handle_t Handle_t::clone(XmlDocument* new_doc) const  {
   if ( m_node ) {
 #ifdef DD4HEP_USE_TINYXML
+    if ( new_doc ) {}
     if ( _N(m_node)->Type() == ELEMENT_NODE_TYPE ) {
       XmlElement* e = _XE(_N(m_node)->Clone()->ToElement());
       if ( e ) return e;
@@ -822,7 +823,6 @@ Document Element::document() const   {
 /// Clone the DOM element tree
 Handle_t Element::clone(Handle_t h) const  {
   if ( m_element && h )  {    
-    Document d = document();
     return h.clone(Document::DOC(document()));
   }
   throw runtime_error("Element::clone: Invalid element pointer -- unable to clone node!");
@@ -869,23 +869,31 @@ void Element::addComment(const char* text) const {
 #endif
 }
 
+/// Initializing constructor to create a new XMLElement and add it to the document.
 RefElement::RefElement(const Document& document, const XmlChar* type, const XmlChar* name)  
 : Element(document, type) 
 {
   m_name = name ? setAttr(_U(name),name) : 0;
 }
 
+/// Construction from existing object handle
 RefElement::RefElement(const Handle_t& e)  
 : Element(e) 
 {
   m_name = m_element ? getAttr(_U(name)) : 0;
 }
 
+/// Copy constructor
 RefElement::RefElement(const RefElement& e)  
 : Element(e), m_name(e.m_name)
 {
 }
 
+/// Assignment operator
+RefElement& RefElement::operator=(const RefElement& e) {
+  m_element = e.m_element; return *this;
+}
+
 const XmlChar* RefElement::name() const  {
   if ( 0 == m_name ) cout << "Error:tag=" << m_element.tag() << endl;
   return attribute_value(m_name);
diff --git a/DDCore/src/XML/XMLTags.cpp b/DDCore/src/XML/XMLTags.cpp
index d501d37f210b07d3b8db159a7a9b46090c801267..e7a05107278ab82b5997ca41715b9991b5d9506e 100644
--- a/DDCore/src/XML/XMLTags.cpp
+++ b/DDCore/src/XML/XMLTags.cpp
@@ -30,7 +30,7 @@ namespace {
 }
 #endif
 
-#define UNICODE(x)  extern const Tag_t Unicode_##x (#x)
+#define UNICODE(x)        extern const Tag_t Unicode_##x (#x)
 #include "XML/UnicodeValues.h"
 
 namespace DD4hep   { namespace XML  {
diff --git a/DDCore/src/XML/tinyxml_inl.h b/DDCore/src/XML/tinyxml_inl.h
index 7997302b7b66ee0bdc63b0a334079097218bbefd..b472d2af045ef0152929f0eed6be66dd16d6364c 100644
--- a/DDCore/src/XML/tinyxml_inl.h
+++ b/DDCore/src/XML/tinyxml_inl.h
@@ -1292,9 +1292,9 @@ void TiXmlAttribute::SetDoubleValue( double _value )
 {
 	char buf [256];
 	#if defined(TIXML_SNPRINTF)		
-		TIXML_SNPRINTF( buf, sizeof(buf), "%lf", _value);
+		TIXML_SNPRINTF( buf, sizeof(buf), "%f", _value);
 	#else
-		sprintf (buf, "%lf", _value);
+		sprintf (buf, "%f", _value);
 	#endif
 	SetValue (buf);
 }
diff --git a/DDCore/src/plugins/Compact2Objects.cpp b/DDCore/src/plugins/Compact2Objects.cpp
index 66d9795ee7b60c55d60d7282ef267719c6f8b9fb..3459162d4d39ba5b1edcecd4967a053a32d04240 100644
--- a/DDCore/src/plugins/Compact2Objects.cpp
+++ b/DDCore/src/plugins/Compact2Objects.cpp
@@ -359,6 +359,10 @@ template <> void Converter<Atom>::operator()(xml_h e)  const  {
 		    atom.attr<int>(_U(value))
 		    );
     element = tab->FindElement(eltname.c_str());
+    if ( !element ) {
+      throw runtime_error("Failed to properly insert the Element:"+
+			  eltname+" into the element table!");
+    }
   }
 }
 
@@ -727,7 +731,7 @@ template <> void Converter<Compact>::operator()(xml_h element)  const  {
   xml_coll_t(compact,_U(alignments)  ).for_each(_U(alignment),Converter<AlignmentEntry>(lcdd));
   xml_coll_t(compact,_U(fields)      ).for_each(_U(field),    Converter<CartesianField>(lcdd));
   xml_coll_t(compact,_U(sensitive_detectors)).for_each(_U(sd),Converter<SensitiveDetector>(lcdd));
-  ::sprintf(text,"%u",xml_h(element).checksum(0));
+  ::snprintf(text,sizeof(text),"%u",xml_h(element).checksum(0));
   lcdd.addConstant(Constant("compact_checksum",text));
   lcdd.endDocument();
 }