diff --git a/DetectorDescription/GeoModelXml/GeoModelXml/AddbranchProcessor.h b/DetectorDescription/GeoModelXml/GeoModelXml/AddbranchProcessor.h
index c9f7350b9b5519397d333905470b3756e0048422..c728cf248a0fabd79fb86199e40daa525df6373a 100644
--- a/DetectorDescription/GeoModelXml/GeoModelXml/AddbranchProcessor.h
+++ b/DetectorDescription/GeoModelXml/GeoModelXml/AddbranchProcessor.h
@@ -4,6 +4,7 @@
 
 #ifndef GEO_MODEL_XML_ADD_BRANCH_PROCESSOR_H
 #define GEO_MODEL_XML_ADD_BRANCH_PROCESSOR_H
+#include <xercesc/util/XercesDefs.hpp>
 //
 //   Processor for addbranch tags.
 //
diff --git a/DetectorDescription/GeoModelXml/GeoModelXml/AssemblyProcessor.h b/DetectorDescription/GeoModelXml/GeoModelXml/AssemblyProcessor.h
index e35d330a15b8df534a20fd1a4bd762d7066c777b..523204ece15ed2195eab0a9167d2b7e6a33a7247 100644
--- a/DetectorDescription/GeoModelXml/GeoModelXml/AssemblyProcessor.h
+++ b/DetectorDescription/GeoModelXml/GeoModelXml/AssemblyProcessor.h
@@ -4,6 +4,7 @@
 
 #ifndef GEO_MODEL_XML_ASSEMBLY_PROCESSOR_H
 #define GEO_MODEL_XML_ASSEMBLY_PROCESSOR_H
+#include <xercesc/util/XercesDefs.hpp>
 //
 //   Processor for assembly tags.
 //
diff --git a/DetectorDescription/GeoModelXml/GeoModelXml/AssemblyrefProcessor.h b/DetectorDescription/GeoModelXml/GeoModelXml/AssemblyrefProcessor.h
index 9c3bf3c7fb7d7d76ab7cdd1b76c1ff135fbfe87b..54e1a691202758fd4b45d4994f92c8e99435ffdf 100644
--- a/DetectorDescription/GeoModelXml/GeoModelXml/AssemblyrefProcessor.h
+++ b/DetectorDescription/GeoModelXml/GeoModelXml/AssemblyrefProcessor.h
@@ -4,6 +4,7 @@
 
 #ifndef GEO_MODEL_XML_ASSEMBLYREF_PROCESSOR_H
 #define GEO_MODEL_XML_ASSEMBLYREF_PROCESSOR_H
+#include <xercesc/util/XercesDefs.hpp>
 
 //
 //   Processor for assemblyref tags.
diff --git a/DetectorDescription/GeoModelXml/GeoModelXml/Element2GeoItem.h b/DetectorDescription/GeoModelXml/GeoModelXml/Element2GeoItem.h
index 1e2faebbe9154ba77baaadc3a25ae755d816339e..aa892ce437937ed9ff5d7808f9e4f99a4fd0fdf4 100644
--- a/DetectorDescription/GeoModelXml/GeoModelXml/Element2GeoItem.h
+++ b/DetectorDescription/GeoModelXml/GeoModelXml/Element2GeoItem.h
@@ -9,17 +9,19 @@
 //
 #ifndef GEO_MODEL_XML_ELEMENT2GEO_ITEM_H
 #define GEO_MODEL_XML_ELEMENT2GEO_ITEM_H
+#include <xercesc/util/XercesDefs.hpp>
 
 #include <map>
 #include <string>
 
-#include <xercesc/dom/DOM.hpp>
-
 class RCBase;
 class GmxUtil;
 
+XERCES_CPP_NAMESPACE_BEGIN
+class DOMElement;
+XERCES_CPP_NAMESPACE_END
 class ProcessorRegistry;
-namespace HepTool {class Evaluator;}
+class Evaluator;
 
 class Element2GeoItem {
 
diff --git a/DetectorDescription/GeoModelXml/GeoModelXml/ElementProcessor.h b/DetectorDescription/GeoModelXml/GeoModelXml/ElementProcessor.h
index 4a1f61e2dde4b6c7cb0a74dd0b105acc3318c269..08c92612ac39c52b926a019c51782981d34e7bb1 100644
--- a/DetectorDescription/GeoModelXml/GeoModelXml/ElementProcessor.h
+++ b/DetectorDescription/GeoModelXml/GeoModelXml/ElementProcessor.h
@@ -9,10 +9,13 @@
 //
 #ifndef GEO_MODEL_XML_ELEMENT_PROCESSOR_H
 #define GEO_MODEL_XML_ELEMENT_PROCESSOR_H
+#include <xercesc/util/XercesDefs.hpp>
 
 #include "GeoModelXml/GeoNodeList.h"
-#include <xercesc/dom/DOM.hpp>
 
+XERCES_CPP_NAMESPACE_BEGIN
+class DOMElement;
+XERCES_CPP_NAMESPACE_END
 class GmxUtil;
 
 class ElementProcessor {
diff --git a/DetectorDescription/GeoModelXml/GeoModelXml/Gmx2Geo.h b/DetectorDescription/GeoModelXml/GeoModelXml/Gmx2Geo.h
index 9df842d8ce20cbc00397475b97bc68f93b912456..2690f137c6fdaac058cc8299dbe2854e751c6402 100644
--- a/DetectorDescription/GeoModelXml/GeoModelXml/Gmx2Geo.h
+++ b/DetectorDescription/GeoModelXml/GeoModelXml/Gmx2Geo.h
@@ -4,6 +4,7 @@
 
 #ifndef GEO_MODEL_XML_GMX2GEO_H
 #define GEO_MODEL_XML_GMX2GEO_H
+#include <xercesc/util/XercesDefs.hpp>
 
 /**
  *  @brief Create a branch of a GeoModel Tree.
@@ -43,9 +44,12 @@
 #include "GeoModelXml/GmxInterface.h"
 
 class GeoPhysVol;
-
-#include <xercesc/dom/DOM.hpp>
-#include <xercesc/dom/DOMLSParser.hpp>
+XERCES_CPP_NAMESPACE_BEGIN
+class DOMDocument;
+XERCES_CPP_NAMESPACE_END
+XERCES_CPP_NAMESPACE_BEGIN
+class DOMNode;
+XERCES_CPP_NAMESPACE_END
 
 class Evaluator;
 
diff --git a/DetectorDescription/GeoModelXml/GeoModelXml/GmxUtil.h b/DetectorDescription/GeoModelXml/GeoModelXml/GmxUtil.h
index a99e9a9a2f2eb5f644dec49efa773e5e119d2b95..1ca6a1029aa8088e87720475ac4963d6aea8298f 100644
--- a/DetectorDescription/GeoModelXml/GeoModelXml/GmxUtil.h
+++ b/DetectorDescription/GeoModelXml/GeoModelXml/GmxUtil.h
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 */
 
 #ifndef GEO_MODEL_XML_GMXUTIL_H
@@ -28,7 +28,11 @@
 #include "GeoModelXml/MakeTransformationref.h"
 #include "GeoModelXml/MakeTranslation.h"
 #include "GeoModelXml/MakeRotation.h"
+#ifndef GEOMODEL_STANDALONE_GMX
+// #include "GeoModelXml/MakeScaling.h"
+#endif
 
+#include "GeoModelXml/shape/MakeSimplePolygonBrep.h"
 #include "GeoModelXml/shape/MakeBox.h"
 #include "GeoModelXml/shape/MakeCons.h"
 #include "GeoModelXml/shape/MakeGenericTrap.h"
@@ -78,6 +82,7 @@ public:
 //
         MakeElement element;
         MakeMaterial material;
+        MakeSimplePolygonBrep simplepolygonbrep;
         MakeBox box;
         MakeCons cons;
         MakeGenericTrap generictrap;
@@ -99,6 +104,9 @@ public:
 //
         MakeTranslation translation;
         MakeRotation rotation;
+#ifndef GEOMODEL_STANDALONE_GMX
+//        MakeScaling scaling;
+#endif
 //
 //    Other things
 //
diff --git a/DetectorDescription/GeoModelXml/GeoModelXml/IndexProcessor.h b/DetectorDescription/GeoModelXml/GeoModelXml/IndexProcessor.h
index 036415efa90fc9674e6817ed6eb988c1e08a73ff..2e66b9576e339848c18e7a72c1faeac9817909fb 100644
--- a/DetectorDescription/GeoModelXml/GeoModelXml/IndexProcessor.h
+++ b/DetectorDescription/GeoModelXml/GeoModelXml/IndexProcessor.h
@@ -4,6 +4,7 @@
 
 #ifndef GEO_MODEL_XML_INDEX_PROCESSOR_H
 #define GEO_MODEL_XML_INDEX_PROCESSOR_H
+#include <xercesc/util/XercesDefs.hpp>
 //
 //   Processor for index tags which change the formula for generating a position-index.
 //
diff --git a/DetectorDescription/GeoModelXml/GeoModelXml/LogvolProcessor.h b/DetectorDescription/GeoModelXml/GeoModelXml/LogvolProcessor.h
index 61003e0e0a57307e9fbe11a376b852d7d8ead0bb..a3b44e18f599c3ca959869433f2c75190ca92ddf 100644
--- a/DetectorDescription/GeoModelXml/GeoModelXml/LogvolProcessor.h
+++ b/DetectorDescription/GeoModelXml/GeoModelXml/LogvolProcessor.h
@@ -4,6 +4,7 @@
 
 #ifndef GEO_MODEL_XML_LOGVOL_PROCESSOR_H
 #define GEO_MODEL_XML_LOGVOL_PROCESSOR_H
+#include <xercesc/util/XercesDefs.hpp>
 //
 //   Processor for logvol tags.
 //
diff --git a/DetectorDescription/GeoModelXml/GeoModelXml/LogvolrefProcessor.h b/DetectorDescription/GeoModelXml/GeoModelXml/LogvolrefProcessor.h
index 82ad815c0de56231808191f1b7a26f2ed633757b..a3efbb9bd4157992bdadda0e6b9229f7a4783c2e 100644
--- a/DetectorDescription/GeoModelXml/GeoModelXml/LogvolrefProcessor.h
+++ b/DetectorDescription/GeoModelXml/GeoModelXml/LogvolrefProcessor.h
@@ -4,6 +4,7 @@
 
 #ifndef GEO_MODEL_XML_LOGVOLREF_PROCESSOR_H
 #define GEO_MODEL_XML_LOGVOLREF_PROCESSOR_H
+#include <xercesc/util/XercesDefs.hpp>
 
 //
 //   Processor for logvolref tags.
diff --git a/DetectorDescription/GeoModelXml/GeoModelXml/MakeElement.h b/DetectorDescription/GeoModelXml/GeoModelXml/MakeElement.h
index f89e03a70a16af3fa3d9a04adec4ecafd0c963b4..f1494499f1af72106d71ab71a3a6892c6f7034e1 100644
--- a/DetectorDescription/GeoModelXml/GeoModelXml/MakeElement.h
+++ b/DetectorDescription/GeoModelXml/GeoModelXml/MakeElement.h
@@ -7,6 +7,7 @@
 //
 #ifndef GEO_MODEL_XML_MAKE_ELEMENT_H
 #define GEO_MODEL_XML_MAKE_ELEMENT_H
+#include <xercesc/util/XercesDefs.hpp>
 
 #include "GeoModelXml/Element2GeoItem.h"
 
diff --git a/DetectorDescription/GeoModelXml/GeoModelXml/MakeMaterial.h b/DetectorDescription/GeoModelXml/GeoModelXml/MakeMaterial.h
index a91509ce2f3283193ce850a6b1777b6ecd3c31dc..8d95e862226a72f8206a06620d6d430f7c0aaa8e 100644
--- a/DetectorDescription/GeoModelXml/GeoModelXml/MakeMaterial.h
+++ b/DetectorDescription/GeoModelXml/GeoModelXml/MakeMaterial.h
@@ -7,6 +7,7 @@
 //
 #ifndef GEO_MODEL_XML_MAKE_MATERIAL_H
 #define GEO_MODEL_XML_MAKE_MATERIAL_H
+#include <xercesc/util/XercesDefs.hpp>
 
 #include "GeoModelXml/Element2GeoItem.h"
 
diff --git a/DetectorDescription/GeoModelXml/GeoModelXml/MakeRotation.h b/DetectorDescription/GeoModelXml/GeoModelXml/MakeRotation.h
index 00d30450184986f87588832fcc7b10a5cf051d91..3a41d1ebbc8179c5d2537ee890a405e96a787194 100644
--- a/DetectorDescription/GeoModelXml/GeoModelXml/MakeRotation.h
+++ b/DetectorDescription/GeoModelXml/GeoModelXml/MakeRotation.h
@@ -4,17 +4,17 @@
 
 #ifndef GEO_MODEL_XML_MAKE_ROTATION_H
 #define GEO_MODEL_XML_MAKE_ROTATION_H
+#include <xercesc/util/XercesDefs.hpp>
 //
 //    Create and return a HepRotation3d. Caller must delete it.
 //
 
-#include <xercesc/dom/DOM.hpp>
+XERCES_CPP_NAMESPACE_BEGIN
+class DOMElement;
+XERCES_CPP_NAMESPACE_END
 #include "GeoModelKernel/GeoDefinitions.h"
-
-//namespace HepGeom {class Rotate3D;}
 class GmxUtil;
 
-
 class MakeRotation {
 public:
     MakeRotation();
diff --git a/DetectorDescription/GeoModelXml/GeoModelXml/MakeTransformation.h b/DetectorDescription/GeoModelXml/GeoModelXml/MakeTransformation.h
index 9977b8c26b99cd5fcf02eb718d007ac182381b45..c80e05c88c8f15581f75f6bd27f5358236eadf71 100644
--- a/DetectorDescription/GeoModelXml/GeoModelXml/MakeTransformation.h
+++ b/DetectorDescription/GeoModelXml/GeoModelXml/MakeTransformation.h
@@ -7,6 +7,7 @@
 //
 #ifndef GEO_MODEL_XML_MAKE_TRANSFORMATION_H
 #define GEO_MODEL_XML_MAKE_TRANSFORMATION_H
+#include <xercesc/util/XercesDefs.hpp>
 
 #include "GeoModelXml/Element2GeoItem.h"
 
diff --git a/DetectorDescription/GeoModelXml/GeoModelXml/MakeTransformationref.h b/DetectorDescription/GeoModelXml/GeoModelXml/MakeTransformationref.h
index ac1b56787f197c54439766150d422aea631d9fb8..5c345f73663ddb943762f1ece8b883b0ee482730 100644
--- a/DetectorDescription/GeoModelXml/GeoModelXml/MakeTransformationref.h
+++ b/DetectorDescription/GeoModelXml/GeoModelXml/MakeTransformationref.h
@@ -7,6 +7,7 @@
 //
 #ifndef GEO_MODEL_XML_MAKE_TRANSFORMATIONREF_H
 #define GEO_MODEL_XML_MAKE_TRANSFORMATIONREF_H
+#include <xercesc/util/XercesDefs.hpp>
 
 #include "GeoModelXml/Element2GeoItem.h"
 
diff --git a/DetectorDescription/GeoModelXml/GeoModelXml/MakeTranslation.h b/DetectorDescription/GeoModelXml/GeoModelXml/MakeTranslation.h
index 8bd4f793dffd6658dee9ece052f8cb1d15654b2d..3464308f791059a16548cd7fa36d0f89e52d299f 100644
--- a/DetectorDescription/GeoModelXml/GeoModelXml/MakeTranslation.h
+++ b/DetectorDescription/GeoModelXml/GeoModelXml/MakeTranslation.h
@@ -4,15 +4,15 @@
 
 #ifndef GEO_MODEL_XML_MAKE_TRANSLATION_H
 #define GEO_MODEL_XML_MAKE_TRANSLATION_H
+#include <xercesc/util/XercesDefs.hpp>
 //
 //    Create and return a HepRotation3d. Caller must delete it.
 //
 
+XERCES_CPP_NAMESPACE_BEGIN
+class DOMElement;
+XERCES_CPP_NAMESPACE_END
 #include "GeoModelKernel/GeoDefinitions.h"
-
-#include <xercesc/dom/DOM.hpp>
-
-//namespace HepGeom {class Translate3D;}
 class GmxUtil;
 
 
diff --git a/DetectorDescription/GeoModelXml/GeoModelXml/MulticopyProcessor.h b/DetectorDescription/GeoModelXml/GeoModelXml/MulticopyProcessor.h
index 4c0bd59784dd834fb8128f6c89e64f4551e3ae98..d52033f4ea5ae1ca046ca83547b2d6696dab7808 100644
--- a/DetectorDescription/GeoModelXml/GeoModelXml/MulticopyProcessor.h
+++ b/DetectorDescription/GeoModelXml/GeoModelXml/MulticopyProcessor.h
@@ -4,6 +4,7 @@
 
 #ifndef GEO_MODEL_XML_MULTICOPY_PROCESSOR_H
 #define GEO_MODEL_XML_MULTICOPY_PROCESSOR_H
+#include <xercesc/util/XercesDefs.hpp>
 //
 //   Processor for multicopy tags.
 //
diff --git a/DetectorDescription/GeoModelXml/GeoModelXml/OutputDirector.h b/DetectorDescription/GeoModelXml/GeoModelXml/OutputDirector.h
new file mode 100644
index 0000000000000000000000000000000000000000..e6fc568a707de6e4e8216dbca738dd9ada5befba
--- /dev/null
+++ b/DetectorDescription/GeoModelXml/GeoModelXml/OutputDirector.h
@@ -0,0 +1,42 @@
+/*
+    Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+*/
+
+//
+//    Use gaudi messaging service when in Athena; use cout when "stand-alone".
+//
+
+#ifndef OUTPUTDIRECTOR_H
+#define OUTPUTDIRECTOR_H
+
+#ifdef GEOMODEL_STANDALONE_GMX
+  #include <iostream>
+  #include <string>
+
+  namespace MSG {
+    // enum((VERBOSE=1, DEBUG, INFO, WARNING, ERROR, FATAL, ALWAYS))}
+    const std::string PKG_NAME("GeoModelXML-");
+    const std::string VERBOSE(PKG_NAME + "VERBOSE: ");
+    const std::string DEBUG(PKG_NAME + "DEBUG: ");
+    const std::string INFO(PKG_NAME + "INFO: ");
+    const std::string WARNING(PKG_NAME + "WARNING: ");
+    const std::string ERROR(PKG_NAME + "ERROR: ");
+    const std::string FATAL(PKG_NAME + "FATAL: ");
+    const std::string ALWAYS(PKG_NAME + "ALWAYS: ");
+  }
+  // Consider changing this to a longer, less clashing sort of name, in the code
+  #define msglog std::cout
+  #define endmsg std::endl
+  // Nothing to do for stand-alone output; cout is already available.
+  #define OUTPUT_STREAM 
+#else
+  #include "GaudiKernel/ServiceHandle.h"
+  #include "GaudiKernel/MsgStream.h"
+  #include "GaudiKernel/IMessageSvc.h"
+  // Macro OUTPUT_STREAM opens a MsgStream called log; can then write to it.
+  // Cannot get ServiceHandle directly into the macro; hide it with a typedef...
+  typedef ServiceHandle<IMessageSvc> SvcHndl;
+  #define OUTPUT_STREAM SvcHndl msgh("MessageSvc", "GeoModelXml"); MsgStream msglog(&(*msgh), "GeoModelXml")
+#endif
+
+#endif // OUTPUTDIRECTOR_H
diff --git a/DetectorDescription/GeoModelXml/GeoModelXml/StrictErrorHandler.h b/DetectorDescription/GeoModelXml/GeoModelXml/StrictErrorHandler.h
index 84e00de59fe56ae1efe294d7f25c06f4cc6f7508..09dc48d18c59b7578261776e5866f84924e8ff39 100644
--- a/DetectorDescription/GeoModelXml/GeoModelXml/StrictErrorHandler.h
+++ b/DetectorDescription/GeoModelXml/GeoModelXml/StrictErrorHandler.h
@@ -7,6 +7,7 @@
 //
 #ifndef GEO_MODEL_XML_STRICT_ERROR_HANDLER_H
 #define GEO_MODEL_XML_STRICT_ERROR_HANDLER_H
+#include <xercesc/util/XercesDefs.hpp>
 
 #include <xercesc/dom/DOMErrorHandler.hpp>
 #include <xercesc/util/XMLString.hpp>
@@ -36,4 +37,4 @@ inline bool StrictErrorHandler::getSawErrors() const {
     return m_SawErrors;
 }
 
-#endif //STRICT_ERROR_HANDLER_H
\ No newline at end of file
+#endif //STRICT_ERROR_HANDLER_H
diff --git a/DetectorDescription/GeoModelXml/GeoModelXml/TransformProcessor.h b/DetectorDescription/GeoModelXml/GeoModelXml/TransformProcessor.h
index 1d90afd707dc93139d10b76349c175878b63b0e7..7167379dd05e3b2f2cd38044090161d57a1574a3 100644
--- a/DetectorDescription/GeoModelXml/GeoModelXml/TransformProcessor.h
+++ b/DetectorDescription/GeoModelXml/GeoModelXml/TransformProcessor.h
@@ -4,6 +4,7 @@
 
 #ifndef GEO_MODEL_XML_TRANSFORM_PROCESSOR_H
 #define GEO_MODEL_XML_TRANSFORM_PROCESSOR_H
+#include <xercesc/util/XercesDefs.hpp>
 
 //
 //   Processor for transform tags.
diff --git a/DetectorDescription/GeoModelXml/GeoModelXml/TransformrefProcessor.h b/DetectorDescription/GeoModelXml/GeoModelXml/TransformrefProcessor.h
index 0c04a62b7321b2ad4648502cef0722b7ff98736d..3314c90ea9fff64e97be50daa1272a5a729ee735 100644
--- a/DetectorDescription/GeoModelXml/GeoModelXml/TransformrefProcessor.h
+++ b/DetectorDescription/GeoModelXml/GeoModelXml/TransformrefProcessor.h
@@ -4,6 +4,7 @@
 
 #ifndef GEO_MODEL_XML_TRANSFORMREF_PROCESSOR_H
 #define GEO_MODEL_XML_TRANSFORMREF_PROCESSOR_H
+#include <xercesc/util/XercesDefs.hpp>
 
 //
 //   Processor for logvolref tags.
diff --git a/DetectorDescription/GeoModelXml/GeoModelXml/createdomdocument.h b/DetectorDescription/GeoModelXml/GeoModelXml/createdomdocument.h
index 2fafc9d772891104171cded4dd4ad1a1c464414c..bc7772436d8bc2b82967cd4b747fe7fdba93c7fb 100644
--- a/DetectorDescription/GeoModelXml/GeoModelXml/createdomdocument.h
+++ b/DetectorDescription/GeoModelXml/GeoModelXml/createdomdocument.h
@@ -1,7 +1,9 @@
 /*
   Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 */
-
+#ifndef CREATEDOMDOCUMENT_H
+#define CREATEDOMDOCUMENT_H
+#include <xercesc/util/XercesDefs.hpp>
 #include <xercesc/dom/DOM.hpp>
 #include <xercesc/dom/DOMLSParser.hpp>
 #include <iostream>
@@ -10,3 +12,5 @@ using namespace std;
 using namespace xercesc;
 
 DOMDocument *createDOMDocument(string xmlFile, DOMLSParser *parser, unsigned int flags = 0);
+
+#endif // CREATEDOMDOCUMENT_H
diff --git a/DetectorDescription/GeoModelXml/GeoModelXml/shape/AddPlane.h b/DetectorDescription/GeoModelXml/GeoModelXml/shape/AddPlane.h
index 411d73ccaf9b315827a91b8b6d9e01607bb2a0eb..7bac7dfa87f5f188905b3dc88479a14ffe3b2968 100644
--- a/DetectorDescription/GeoModelXml/GeoModelXml/shape/AddPlane.h
+++ b/DetectorDescription/GeoModelXml/GeoModelXml/shape/AddPlane.h
@@ -4,8 +4,11 @@
 
 #ifndef ADDPLANE_H
 #define ADDPLANE_H
+#include <xercesc/util/XercesDefs.hpp>
 
-#include <xercesc/dom/DOM.hpp>
+XERCES_CPP_NAMESPACE_BEGIN
+class DOMElement;
+XERCES_CPP_NAMESPACE_END
 
 class AddPlane {
 public:
diff --git a/DetectorDescription/GeoModelXml/GeoModelXml/shape/MakeBox.h b/DetectorDescription/GeoModelXml/GeoModelXml/shape/MakeBox.h
index 8c039062ce332383d6f2503f3675d44ac6daff5e..599abebcec3b07fd648e3a84ad280b2cfacc7c01 100644
--- a/DetectorDescription/GeoModelXml/GeoModelXml/shape/MakeBox.h
+++ b/DetectorDescription/GeoModelXml/GeoModelXml/shape/MakeBox.h
@@ -8,6 +8,7 @@
 //
 #ifndef GEO_MODEL_XML_MAKE_BOX_H
 #define GEO_MODEL_XML_MAKE_BOX_H
+#include <xercesc/util/XercesDefs.hpp>
 
 #include "GeoModelXml/Element2GeoItem.h"
 
diff --git a/DetectorDescription/GeoModelXml/GeoModelXml/shape/MakeCons.h b/DetectorDescription/GeoModelXml/GeoModelXml/shape/MakeCons.h
index 8c4e3a77c80996bf47b5349ce98c3a971bf4a3fe..9283cfc20a0b8ac1d7b1f28e54b71f8cb0fb3329 100644
--- a/DetectorDescription/GeoModelXml/GeoModelXml/shape/MakeCons.h
+++ b/DetectorDescription/GeoModelXml/GeoModelXml/shape/MakeCons.h
@@ -8,6 +8,7 @@
 //
 #ifndef GEO_MODEL_XML_MAKE_CONS_H
 #define GEO_MODEL_XML_MAKE_CONS_H
+#include <xercesc/util/XercesDefs.hpp>
 
 #include "GeoModelXml/Element2GeoItem.h"
 
diff --git a/DetectorDescription/GeoModelXml/GeoModelXml/shape/MakeGenericTrap.h b/DetectorDescription/GeoModelXml/GeoModelXml/shape/MakeGenericTrap.h
index f0f2a77d92e03d5852e17a93de284d7e853c362b..0eed6fe1193ef4c476cef6c33172c37190cb3ecc 100644
--- a/DetectorDescription/GeoModelXml/GeoModelXml/shape/MakeGenericTrap.h
+++ b/DetectorDescription/GeoModelXml/GeoModelXml/shape/MakeGenericTrap.h
@@ -8,6 +8,7 @@
 //
 #ifndef GEO_MODEL_XML_MAKE_GENERICTRAP_H
 #define GEO_MODEL_XML_MAKE_GENERICTRAP_H
+#include <xercesc/util/XercesDefs.hpp>
 
 #include "GeoModelXml/Element2GeoItem.h"
 
diff --git a/DetectorDescription/GeoModelXml/GeoModelXml/shape/MakeIntersection.h b/DetectorDescription/GeoModelXml/GeoModelXml/shape/MakeIntersection.h
index a99c42740a1c9357895d95ce2ee12cd8228508b6..483a11e51fecc2285f66a949de54b0e743282abd 100644
--- a/DetectorDescription/GeoModelXml/GeoModelXml/shape/MakeIntersection.h
+++ b/DetectorDescription/GeoModelXml/GeoModelXml/shape/MakeIntersection.h
@@ -8,6 +8,7 @@
 //
 #ifndef GEO_MODEL_XML_MAKE_INTERSECTION_H
 #define GEO_MODEL_XML_MAKE_INTERSECTION_H
+#include <xercesc/util/XercesDefs.hpp>
 
 #include "GeoModelXml/Element2GeoItem.h"
 
diff --git a/DetectorDescription/GeoModelXml/GeoModelXml/shape/MakePara.h b/DetectorDescription/GeoModelXml/GeoModelXml/shape/MakePara.h
index 1fd1ca29ec7db19f5e41ba339cd8ec5b252c3bb2..b354c986541eff1b35c55c6967c7c313224cd98d 100644
--- a/DetectorDescription/GeoModelXml/GeoModelXml/shape/MakePara.h
+++ b/DetectorDescription/GeoModelXml/GeoModelXml/shape/MakePara.h
@@ -8,6 +8,7 @@
 //
 #ifndef GEO_MODEL_XML_MAKE_PARA_H
 #define GEO_MODEL_XML_MAKE_PARA_H
+#include <xercesc/util/XercesDefs.hpp>
 
 #include "GeoModelXml/Element2GeoItem.h"
 
diff --git a/DetectorDescription/GeoModelXml/GeoModelXml/shape/MakePcon.h b/DetectorDescription/GeoModelXml/GeoModelXml/shape/MakePcon.h
index 81343184fbffc154e2727f858810adffc4b70dec..aab86ab53367d9c6921110411baf9def6a9f9067 100644
--- a/DetectorDescription/GeoModelXml/GeoModelXml/shape/MakePcon.h
+++ b/DetectorDescription/GeoModelXml/GeoModelXml/shape/MakePcon.h
@@ -8,6 +8,7 @@
 //
 #ifndef GEO_MODEL_XML_MAKE_PCON_H
 #define GEO_MODEL_XML_MAKE_PCON_H
+#include <xercesc/util/XercesDefs.hpp>
 
 #include "GeoModelXml/Element2GeoItem.h"
 
diff --git a/DetectorDescription/GeoModelXml/GeoModelXml/shape/MakePgon.h b/DetectorDescription/GeoModelXml/GeoModelXml/shape/MakePgon.h
index 15111add35a02213d496c07c854852d96cb2a5f6..df9fded68e5f2382b1c0f8018adb8eefcd87996d 100644
--- a/DetectorDescription/GeoModelXml/GeoModelXml/shape/MakePgon.h
+++ b/DetectorDescription/GeoModelXml/GeoModelXml/shape/MakePgon.h
@@ -8,6 +8,7 @@
 //
 #ifndef GEO_MODEL_XML_MAKE_PGON_H
 #define GEO_MODEL_XML_MAKE_PGON_H
+#include <xercesc/util/XercesDefs.hpp>
 
 #include "GeoModelXml/Element2GeoItem.h"
 
diff --git a/DetectorDescription/GeoModelXml/GeoModelXml/shape/MakeShaperef.h b/DetectorDescription/GeoModelXml/GeoModelXml/shape/MakeShaperef.h
index f90f750b2f52802631993e4f2ff687e308c9cc77..905e5fe2c131f60890aece05f8f056631d8714be 100644
--- a/DetectorDescription/GeoModelXml/GeoModelXml/shape/MakeShaperef.h
+++ b/DetectorDescription/GeoModelXml/GeoModelXml/shape/MakeShaperef.h
@@ -8,6 +8,7 @@
 //
 #ifndef GEO_MODEL_XML_MAKE_SHAPEREF_H
 #define GEO_MODEL_XML_MAKE_SHAPEREF_H
+#include <xercesc/util/XercesDefs.hpp>
 
 #include "GeoModelXml/Element2GeoItem.h"
 
diff --git a/DetectorDescription/GeoModelXml/GeoModelXml/shape/MakeSimplePolygonBrep.h b/DetectorDescription/GeoModelXml/GeoModelXml/shape/MakeSimplePolygonBrep.h
new file mode 100644
index 0000000000000000000000000000000000000000..5ec995fb3fbc496de16e1970f01e2b6a14977ae4
--- /dev/null
+++ b/DetectorDescription/GeoModelXml/GeoModelXml/shape/MakeSimplePolygonBrep.h
@@ -0,0 +1,20 @@
+/*
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+*/
+#include <xercesc/util/XercesDefs.hpp>
+//
+//    Handle simplePolygonBrep shape elements.
+//
+#ifndef GEO_MODEL_XML_MAKE_SIMPLEPOLYGONBREP_H
+#define GEO_MODEL_XML_MAKE_SIMPLEPOLYGONBREP_H
+#include <xercesc/util/XercesDefs.hpp>
+
+#include "GeoModelXml/Element2GeoItem.h"
+
+class MakeSimplePolygonBrep: public Element2GeoItem {
+public:
+    MakeSimplePolygonBrep();
+    const RCBase * make(const xercesc::DOMElement *element, GmxUtil &gmxUtil) const;
+};
+
+#endif // GEO_MODEL_XML_MAKE_SIMPLEPOLYGONBREP_H
diff --git a/DetectorDescription/GeoModelXml/GeoModelXml/shape/MakeSubtraction.h b/DetectorDescription/GeoModelXml/GeoModelXml/shape/MakeSubtraction.h
index 3550f662bb43c42ba23952d18075f935e1e8736c..5dcd328651f4438b568e0e67d090ebb9645a92d3 100644
--- a/DetectorDescription/GeoModelXml/GeoModelXml/shape/MakeSubtraction.h
+++ b/DetectorDescription/GeoModelXml/GeoModelXml/shape/MakeSubtraction.h
@@ -8,6 +8,7 @@
 //
 #ifndef GEO_MODEL_XML_MAKE_SUBTRACTION_H
 #define GEO_MODEL_XML_MAKE_SUBTRACTION_H
+#include <xercesc/util/XercesDefs.hpp>
 
 #include "GeoModelXml/Element2GeoItem.h"
 
diff --git a/DetectorDescription/GeoModelXml/GeoModelXml/shape/MakeTrap.h b/DetectorDescription/GeoModelXml/GeoModelXml/shape/MakeTrap.h
index fd0e871db4c2c5f9bde0cf5e87d5011a2a669efb..3e8794c8c2e9a4ea43b5189b6dd931a4d209fb2a 100644
--- a/DetectorDescription/GeoModelXml/GeoModelXml/shape/MakeTrap.h
+++ b/DetectorDescription/GeoModelXml/GeoModelXml/shape/MakeTrap.h
@@ -8,6 +8,7 @@
 //
 #ifndef GEO_MODEL_XML_MAKE_TRAP_H
 #define GEO_MODEL_XML_MAKE_TRAP_H
+#include <xercesc/util/XercesDefs.hpp>
 
 #include "GeoModelXml/Element2GeoItem.h"
 
diff --git a/DetectorDescription/GeoModelXml/GeoModelXml/shape/MakeTrd.h b/DetectorDescription/GeoModelXml/GeoModelXml/shape/MakeTrd.h
index c12e0d23ad90db42a637b436e63832c1837a4256..85ec542afa17852cf85ff6c18ccc06127950c612 100644
--- a/DetectorDescription/GeoModelXml/GeoModelXml/shape/MakeTrd.h
+++ b/DetectorDescription/GeoModelXml/GeoModelXml/shape/MakeTrd.h
@@ -8,6 +8,7 @@
 //
 #ifndef GEO_MODEL_XML_MAKE_TRD_H
 #define GEO_MODEL_XML_MAKE_TRD_H
+#include <xercesc/util/XercesDefs.hpp>
 
 #include "GeoModelXml/Element2GeoItem.h"
 
diff --git a/DetectorDescription/GeoModelXml/GeoModelXml/shape/MakeTube.h b/DetectorDescription/GeoModelXml/GeoModelXml/shape/MakeTube.h
index 47eeafee4884bc16b4056bc1727d3388378aa967..8c6f45debeb43709523b3f688e52a84c549687b1 100644
--- a/DetectorDescription/GeoModelXml/GeoModelXml/shape/MakeTube.h
+++ b/DetectorDescription/GeoModelXml/GeoModelXml/shape/MakeTube.h
@@ -8,6 +8,7 @@
 //
 #ifndef GEO_MODEL_XML_MAKE_TUBE_H
 #define GEO_MODEL_XML_MAKE_TUBE_H
+#include <xercesc/util/XercesDefs.hpp>
 
 #include "GeoModelXml/Element2GeoItem.h"
 
diff --git a/DetectorDescription/GeoModelXml/GeoModelXml/shape/MakeTubs.h b/DetectorDescription/GeoModelXml/GeoModelXml/shape/MakeTubs.h
index 6efbf27e1364a70eb9ac4f7771786d8cec2821e6..c414908e5ba65f6e63f3e65dc7fb0c693a59d621 100644
--- a/DetectorDescription/GeoModelXml/GeoModelXml/shape/MakeTubs.h
+++ b/DetectorDescription/GeoModelXml/GeoModelXml/shape/MakeTubs.h
@@ -8,6 +8,7 @@
 //
 #ifndef GEO_MODEL_XML_MAKE_TUBS_H
 #define GEO_MODEL_XML_MAKE_TUBS_H
+#include <xercesc/util/XercesDefs.hpp>
 
 #include "GeoModelXml/Element2GeoItem.h"
 
diff --git a/DetectorDescription/GeoModelXml/GeoModelXml/shape/MakeUnion.h b/DetectorDescription/GeoModelXml/GeoModelXml/shape/MakeUnion.h
index ecb2eee446078fb3df64b64a0b35291aca5f9359..e1a762fda56697a5488eb60225e8494565761213 100644
--- a/DetectorDescription/GeoModelXml/GeoModelXml/shape/MakeUnion.h
+++ b/DetectorDescription/GeoModelXml/GeoModelXml/shape/MakeUnion.h
@@ -8,6 +8,7 @@
 //
 #ifndef GEO_MODEL_XML_MAKE_UNION_H
 #define GEO_MODEL_XML_MAKE_UNION_H
+#include <xercesc/util/XercesDefs.hpp>
 
 #include "GeoModelXml/Element2GeoItem.h"
 
diff --git a/DetectorDescription/GeoModelXml/GeoModelXml/translate.h b/DetectorDescription/GeoModelXml/GeoModelXml/translate.h
deleted file mode 100644
index d234adc7edb0f892f0909280171ad825a96ea205..0000000000000000000000000000000000000000
--- a/DetectorDescription/GeoModelXml/GeoModelXml/translate.h
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
-*/
-
-#ifndef GEO_MODEL_XML_TRANSLATE_H
-#define GEO_MODEL_XML_TRANSLATE_H
-//
-//    Just an abbreviation for transcode functions. 
-//        translate("a string") returns the u16 type needed internally by Xerces-C
-//        translate(Xerces-C string) returns a char * string version
-//
-//    remember to release a char * with XMLString::release(char *theStringYouGaveMe) when finished with it
-//
-#include <xercesc/util/XMLString.hpp>
-
-#define Translate xercesc::XMLString::transcode 
-
-#endif // TRANSLATE_H
diff --git a/DetectorDescription/GeoModelXml/data/geomodel.dtd b/DetectorDescription/GeoModelXml/data/geomodel.dtd
index 54cf5c59d9012e4dc64979e0f957d879f805f17a..e0b0d314610b42f658d0c2bb244623168af97ea5 100644
--- a/DetectorDescription/GeoModelXml/data/geomodel.dtd
+++ b/DetectorDescription/GeoModelXml/data/geomodel.dtd
@@ -65,9 +65,15 @@
     <!ELEMENT addindex EMPTY>
         <!ATTLIST addindex name ID #REQUIRED>
 
-  <!ELEMENT shapes ((box|cons|generictrap|para|pcon|pgon|trap|tube|tubs|trd|intersection|subtraction|union)+)>
+  <!ELEMENT shapes ((box|cons|generictrap|para|pcon|pgon|trap|tube|tubs|trd|intersection|subtraction|union|simplepolygonbrep)+)>
     <!-- All shapes allowed in GeoModel manual. Same name, parameters, parameter order, but always lower case -->
 
+    <!ELEMENT simplepolygonbrep EMPTY>
+      <!ATTLIST simplepolygonbrep name        ID    #REQUIRED
+                                  xpoints     CDATA #REQUIRED
+                                  ypoints     CDATA #REQUIRED
+                                  zhalflength CDATA #REQUIRED>
+
     <!ELEMENT box EMPTY>
       <!ATTLIST box name        ID    #REQUIRED
                     xhalflength CDATA #REQUIRED
diff --git a/DetectorDescription/GeoModelXml/src/AddPlane.cxx b/DetectorDescription/GeoModelXml/src/AddPlane.cxx
index 5befaade807fe73d61b4bea43c5afd1313708d41..dd2f71cdf47e0717b459364ce9eba7ac489a8a06 100644
--- a/DetectorDescription/GeoModelXml/src/AddPlane.cxx
+++ b/DetectorDescription/GeoModelXml/src/AddPlane.cxx
@@ -7,15 +7,15 @@
 #include <sstream>
 
 #include <xercesc/dom/DOM.hpp>
-#include "GeoModelXml/translate.h"
+#include "xercesc/util/XMLString.hpp"
 
 using namespace xercesc;
 
-void AddPlane::process(const DOMElement *element, double &zPlane, double &rMinPlane, double &rMaxPlane) {
+void AddPlane::process(const xercesc::DOMElement *element, double &zPlane, double &rMinPlane, double &rMaxPlane) {
 
-    std::istringstream(Translate(element->getAttribute(Translate("zplane")))) >> zPlane;
-    std::istringstream(Translate(element->getAttribute(Translate("rminplane")))) >> rMinPlane;
-    std::istringstream(Translate(element->getAttribute(Translate("rmaxplane")))) >> rMaxPlane;
+    std::istringstream(XMLString::transcode(element->getAttribute(XMLString::transcode("zplane")))) >> zPlane;
+    std::istringstream(XMLString::transcode(element->getAttribute(XMLString::transcode("rminplane")))) >> rMinPlane;
+    std::istringstream(XMLString::transcode(element->getAttribute(XMLString::transcode("rmaxplane")))) >> rMaxPlane;
 
     return;
 }
diff --git a/DetectorDescription/GeoModelXml/src/AddbranchProcessor.cxx b/DetectorDescription/GeoModelXml/src/AddbranchProcessor.cxx
index f0d3119519fdfbb96c77020a80197a64fa0dc631..8a74efb97e724fbc4aa1bbd153487fb506bfb526 100644
--- a/DetectorDescription/GeoModelXml/src/AddbranchProcessor.cxx
+++ b/DetectorDescription/GeoModelXml/src/AddbranchProcessor.cxx
@@ -13,17 +13,17 @@
 #include <xercesc/dom/DOM.hpp>
 #include "GeoModelXml/ProcessorRegistry.h"
 
-#include "GeoModelXml/translate.h"
+#include "xercesc/util/XMLString.hpp"
 #include "GeoModelXml/GmxUtil.h"
 
 using namespace std;
 using namespace xercesc;
 
-void AddbranchProcessor::process(const DOMElement *element, GmxUtil &gmxUtil, GeoNodeList &toAdd) {
+void AddbranchProcessor::process(const xercesc::DOMElement *element, GmxUtil &gmxUtil, GeoNodeList &toAdd) {
 
     for (DOMNode *child = element->getFirstChild(); child != 0; child = child->getNextSibling()) {
         if (child->getNodeType() == DOMNode::ELEMENT_NODE) {
-            char *name2release = Translate(child->getNodeName());
+            char *name2release = XMLString::transcode(child->getNodeName());
             string name(name2release);
             XMLString::release(&name2release);
             gmxUtil.processorRegistry.find(name)->process(dynamic_cast<const DOMElement *>(child), gmxUtil, toAdd);
diff --git a/DetectorDescription/GeoModelXml/src/AssemblyProcessor.cxx b/DetectorDescription/GeoModelXml/src/AssemblyProcessor.cxx
index 27cff3b600c16602c58df421a4cb774b1434198e..29397e85f4c86e3270f0f3261758871fa5285768 100644
--- a/DetectorDescription/GeoModelXml/src/AssemblyProcessor.cxx
+++ b/DetectorDescription/GeoModelXml/src/AssemblyProcessor.cxx
@@ -23,7 +23,7 @@
 #include "GeoModelKernel/GeoFullPhysVol.h"
 #include "GeoModelXml/GmxUtil.h"
 #include "GeoModelXml/GeoNodeList.h"
-#include "GeoModelXml/translate.h"
+#include "xercesc/util/XMLString.hpp"
 
 // using namespace CLHEP;
 
@@ -36,7 +36,7 @@ GeoNameTag *physVolName;
 
     gmxUtil.positionIndex.incrementLevel();
 
-    char *name2release = Translate(element->getAttribute(Translate("name")));
+    char *name2release = XMLString::transcode(element->getAttribute(XMLString::transcode("name")));
     string name(name2release);
     XMLString::release(&name2release);
 //
@@ -67,7 +67,7 @@ GeoNameTag *physVolName;
     for (DOMNode *child = element->getFirstChild(); child != 0; child = child->getNextSibling()) {
         if (child->getNodeType() == DOMNode::ELEMENT_NODE) {
             DOMElement *el = dynamic_cast<DOMElement *> (child);
-            name2release = Translate(el->getNodeName());
+            name2release = XMLString::transcode(el->getNodeName());
             string name(name2release);
             XMLString::release(&name2release);
             gmxUtil.processorRegistry.find(name)->process(el, gmxUtil, childrenAdd);
@@ -76,7 +76,7 @@ GeoNameTag *physVolName;
 //
 //    Make a new PhysVol and add everything to it, then add it to the list of things for my caller to add
 //
-    char *toRelease = Translate(element->getAttribute(Translate("alignable")));
+    char *toRelease = XMLString::transcode(element->getAttribute(XMLString::transcode("alignable")));
     string alignable(toRelease);
     XMLString::release(&toRelease);
     if (alignable.compare(string("true")) == 0) {
@@ -101,7 +101,7 @@ GeoNameTag *physVolName;
 
 void AssemblyProcessor::zeroId(const xercesc::DOMElement *element) {
 
-    char *name2release = Translate(element->getAttribute(Translate("name")));
+    char *name2release = XMLString::transcode(element->getAttribute(XMLString::transcode("name")));
     string name(name2release);
     XMLString::release(&name2release);
 //
diff --git a/DetectorDescription/GeoModelXml/src/AssemblyrefProcessor.cxx b/DetectorDescription/GeoModelXml/src/AssemblyrefProcessor.cxx
index 8a362ab115b97913d883e8055c847915dbd6be4a..a95d759851b7c6d0fb30950957915528986dc439 100644
--- a/DetectorDescription/GeoModelXml/src/AssemblyrefProcessor.cxx
+++ b/DetectorDescription/GeoModelXml/src/AssemblyrefProcessor.cxx
@@ -5,28 +5,22 @@
 //
 //    Process assemblyref items: basically, just find the referenced assembly and call its processor.
 //
-
-#ifndef STANDALONE_GMX
-#include "GaudiKernel/MsgStream.h"
-#include "GaudiKernel/ServiceHandle.h"
-#include "GaudiKernel/IMessageSvc.h"
-#else 
-#include <iostream>
-#endif
-
-
+#include "GeoModelXml/OutputDirector.h"
 #include "GeoModelXml/AssemblyrefProcessor.h"
 #include <string>
+
+#include "xercesc/util/XercesDefs.hpp"
 #include <xercesc/dom/DOM.hpp>
+#include "xercesc/util/XMLString.hpp"
+
 #include "GeoModelXml/GmxUtil.h"
 #include "GeoModelXml/GeoNodeList.h"
-#include "GeoModelXml/translate.h"
 
 using namespace std;
 using namespace xercesc;
 
 void AssemblyrefProcessor::process(const DOMElement *element, GmxUtil &gmxUtil, GeoNodeList &toAdd) {
-const XMLCh *ref = Translate("ref");
+const XMLCh *ref = XMLString::transcode("ref");
 const XMLCh *idref;
 DOMDocument *doc = element->getOwnerDocument();
 char *toRelease;
@@ -38,26 +32,20 @@ char *toRelease;
 //
 //    Check it is the right sort
 //
-    toRelease = Translate(elem->getNodeName());
+    toRelease = XMLString::transcode(elem->getNodeName());
     string nodeName(toRelease);
     XMLString::release(&toRelease);
     if (nodeName != string("assembly")) {
-#ifndef STANDALONE_GMX
-        ServiceHandle<IMessageSvc> msgh("MessageSvc", "GeoModelXml");
-        MsgStream log(&(*msgh), "GeoModelXml");
-        log << MSG::FATAL << "Error in xml/gmx file: assemblyref " << Translate(idref) << " referenced a " << 
-                              nodeName << " instead of an assembly.\n";
-#else
-	std::cerr<< "Error in xml/gmx file: assemblyref " << Translate(idref) << " referenced a " << 
+        OUTPUT_STREAM;
+        msglog << MSG::FATAL << "Error in xml/gmx file: assemblyref " << XMLString::transcode(idref) << " referenced a " << 
                               nodeName << " instead of an assembly.\n";
-#endif
         exit(999); // Should do better...
     }
 //
 //    Process it
 //
-    const XMLCh *zeroid = element->getAttribute(Translate("zeroid"));
-    if (XMLString::equals(zeroid, Translate("true"))) {
+    const XMLCh *zeroid = element->getAttribute(XMLString::transcode("zeroid"));
+    if (XMLString::equals(zeroid, XMLString::transcode("true"))) {
         gmxUtil.tagHandler.assembly.zeroId(elem);
     }
     gmxUtil.tagHandler.assembly.process(elem, gmxUtil, toAdd);
diff --git a/DetectorDescription/GeoModelXml/src/Element2GeoItem.cxx b/DetectorDescription/GeoModelXml/src/Element2GeoItem.cxx
index a3503b31e1e88b9c1540e0aec437b94c7ebbdc95..01fabd4505f5ab74be1c57daea087ef7218bd143 100644
--- a/DetectorDescription/GeoModelXml/src/Element2GeoItem.cxx
+++ b/DetectorDescription/GeoModelXml/src/Element2GeoItem.cxx
@@ -1,21 +1,17 @@
 /*
   Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 */
-
-#ifndef STANDALONE_GMX
-#include "GaudiKernel/ServiceHandle.h"
-#include "GaudiKernel/MsgStream.h"
-#include "GaudiKernel/IMessageSvc.h"
-#else
-#include <iostream>
-#endif
+#include <string>
 
 #include "GeoModelXml/Element2GeoItem.h"
-#include <string>
+#include "GeoModelXml/OutputDirector.h"
+
+#include "xercesc/util/XercesDefs.hpp"
 #include <xercesc/dom/DOM.hpp>
+#include "xercesc/util/XMLString.hpp"
+
 #include "GeoModelXml/GmxUtil.h"
 #include "GeoModelKernel/RCBase.h"
-#include "GeoModelXml/translate.h"
 
 using namespace std;
 using namespace xercesc;
@@ -28,7 +24,7 @@ const RCBase * Element2GeoItem::process(const xercesc::DOMElement *element, GmxU
 
     char *name2release;
 
-    name2release = Translate(element->getAttribute(Translate("name")));
+    name2release = XMLString::transcode(element->getAttribute(XMLString::transcode("name")));
     string name(name2release);
     XMLString::release(&name2release);
 
@@ -49,15 +45,9 @@ const RCBase * Element2GeoItem::process(const xercesc::DOMElement *element, GmxU
 }
 
 const RCBase * Element2GeoItem::make(const xercesc::DOMElement *element, GmxUtil & /* gmxUtil */) const {
-    char *name2release = Translate(element->getNodeName());
-
-#ifndef STANDALONE_GMX
-    ServiceHandle<IMessageSvc> msgh("MessageSvc", "GeoModelXml");
-    MsgStream log(&(*msgh), "GeoModelXml");
-    log << MSG::FATAL << "Oh oh: called base class make() method of Element2GeoType object; tag " << name2release << endmsg;
-#else
-    std::cerr<< "Oh oh: called base class make() method of Element2GeoType object; tag " << name2release << std::endl;
-#endif
+    char *name2release = XMLString::transcode(element->getNodeName());
+    OUTPUT_STREAM;
+    msglog << MSG::FATAL << "Oh oh: called base class make() method of Element2GeoType object; tag " << name2release << endmsg;
     XMLString::release(&name2release);
 
     exit(999); // Should improve on this 
diff --git a/DetectorDescription/GeoModelXml/src/ElementProcessor.cxx b/DetectorDescription/GeoModelXml/src/ElementProcessor.cxx
index 13847821e90911b64d2ef80c037d33f996da8fe1..881d970b72abb843752a59b6d97b91cc6350be01 100644
--- a/DetectorDescription/GeoModelXml/src/ElementProcessor.cxx
+++ b/DetectorDescription/GeoModelXml/src/ElementProcessor.cxx
@@ -16,18 +16,11 @@
 //
 #include "GeoModelXml/ElementProcessor.h"
 
-#ifndef STANDALONE_GMX
-#include "GaudiKernel/ServiceHandle.h"
-#include "GaudiKernel/MsgStream.h"
-#include "GaudiKernel/IMessageSvc.h"
-#else
-#include <iostream>
-#endif
-
-
+#include "GeoModelXml/OutputDirector.h"
 #include <string>
+#include "xercesc/util/XercesDefs.hpp"
 #include <xercesc/dom/DOM.hpp>
-#include "GeoModelXml/translate.h"
+
 
 #include "GeoModelXml/GeoNodeList.h"
 #include "GeoModelXml/ProcessorRegistry.h"
@@ -39,15 +32,10 @@ ElementProcessor::ElementProcessor() {}
 
 void ElementProcessor::process(const DOMElement *element, GmxUtil & /* gmxUtil*/, GeoNodeList & /* toAdd */) {
 
-    char *name2release = Translate(element->getNodeName());
+    char *name2release = XMLString::transcode(element->getNodeName());
     std::string name(name2release);
     XMLString::release(&name2release);
 
-#ifndef STANDALONE_GMX
-    ServiceHandle<IMessageSvc> msgh("MessageSvc", "GeoModelXml");
-    MsgStream log(&(*msgh), "GeoModelXml");
-    log << MSG::FATAL << "Error!!! Default element processor called for tag-name " << name << endmsg;
-#else
-    std::cerr << "Error!!! Default element processor called for tag-name " << name << std::endl;
-#endif
+    OUTPUT_STREAM;
+    msglog << MSG::FATAL << "Error!!! Default element processor called for tag-name " << name << endmsg;
 }
diff --git a/DetectorDescription/GeoModelXml/src/Gmx2Geo.cxx b/DetectorDescription/GeoModelXml/src/Gmx2Geo.cxx
index 53eb447cd15ad4d9e295cacf49652b1df0d50a8c..b9475f43c6931bff311eb759ccba7d70854be89c 100644
--- a/DetectorDescription/GeoModelXml/src/Gmx2Geo.cxx
+++ b/DetectorDescription/GeoModelXml/src/Gmx2Geo.cxx
@@ -3,20 +3,14 @@
 */
 
 #include "GeoModelXml/Gmx2Geo.h"
-
-#ifndef STANDALONE_GMX
-#include "GaudiKernel/ServiceHandle.h"
-#include "GaudiKernel/IMessageSvc.h"
-#include "GaudiKernel/MsgStream.h"
-#else
-#include <iostream>
-#endif
+#include "GeoModelXml/OutputDirector.h"
 
 #include <string>
 #include <iomanip>
 #include <sstream>
 #include <stdlib.h>
 
+#include <xercesc/util/XercesDefs.hpp>
 #include <xercesc/dom/DOM.hpp>
 #include <xercesc/dom/DOMLSParser.hpp>
 #include <xercesc/util/PlatformUtils.hpp>
@@ -25,7 +19,7 @@
 
 #include "ExpressionEvaluator/Evaluator.h"
 
-#include "GeoModelXml/translate.h"
+#include "xercesc/util/XMLString.hpp"
 #include "GeoModelXml/GeoNodeList.h"
 #include "GeoModelXml/ElementProcessor.h"
 #include "GeoModelXml/GmxUtil.h"
@@ -33,7 +27,6 @@
 #include "GeoModelXml/createdomdocument.h"
 
 using namespace std;
-using namespace xercesc;
 
 Gmx2Geo::Gmx2Geo(const string xmlFile, GeoPhysVol *addHere, GmxInterface &gmxInterface, unsigned int flags) {
 //
@@ -42,20 +35,13 @@ Gmx2Geo::Gmx2Geo(const string xmlFile, GeoPhysVol *addHere, GmxInterface &gmxInt
 
 // Logging: ref https://wiki.bnl.gov/dayabay/index.php?title=Logging
 // Turn on logging in job-options with: MessageSvc.setDebug += {"GeoModelXml"}
-#ifndef STANDALONE_GMX
-    ServiceHandle<IMessageSvc> msgh("MessageSvc", "GeoModelXml");
-    MsgStream log(&(*msgh), "GeoModelXml");
-#endif
+    OUTPUT_STREAM;
 
     DOMLSParser *parser = 0;
     DOMDocument *doc = createDOMDocument(xmlFile, parser, flags);
     if (!doc) {// Parsed badly
         XMLPlatformUtils::Terminate();
-#ifndef STANDALONE_GMX
-        log << MSG::FATAL << "Error in xml file " << xmlFile << ". Exiting athena." << endmsg;
-#else
-	std::cout<<"Error in xml file " << xmlFile << ". Exiting athena." <<std::endl;
-#endif
+        msglog << MSG::FATAL << "Error in xml file " << xmlFile << ". Exiting athena." << endmsg;
         exit(0);
     }
 //
@@ -70,26 +56,14 @@ Gmx2Geo::Gmx2Geo(const string xmlFile, GeoPhysVol *addHere, GmxInterface &gmxInt
 //    info message: name of detector
 //
     if (flags & 0x1) {
-#ifndef STANDALONE_GMX
-        log << MSG::INFO << "Set up detector geometry from db-string \nwhich adds sub-detector ";
-#else
-	std::cout<<"Set up detector geometry from db-string \nwhich adds sub-detector ";
-#endif
+        msglog << MSG::INFO << "Set up detector geometry from db-string \nwhich adds sub-detector ";
     }
     else {
-#ifndef STANDALONE_GMX
-        log << MSG::INFO << "Set up detector geometry from file " << xmlFile << " which adds sub-detector ";
-#else
-	std::cout<<"Set up detector geometry from db-string \nwhich adds sub-detector ";
-#endif
+        msglog << MSG::INFO << "Set up detector geometry from file " << xmlFile << " which adds sub-detector ";
     }
     const DOMElement *element = dynamic_cast<const DOMElement*>(root);
-    const XMLCh *attribute = element->getAttribute(Translate("name"));
-#ifndef STANDALONE_GMX
-    log << Translate(attribute) << endmsg;
-#else
-    std::cout<<Translate(attribute) << std::endl;
-#endif
+    const XMLCh *attribute = element->getAttribute(XMLString::transcode("name"));
+    msglog << XMLString::transcode(attribute) << endmsg;
 //
 //    Add all constant definitions to the evaluator, so they are ready if needed.
 //
@@ -107,7 +81,7 @@ Gmx2Geo::Gmx2Geo(const string xmlFile, GeoPhysVol *addHere, GmxInterface &gmxInt
 //   and it fills in the list of things to be added to the GeoModel graph. 
 //   There is one and only one addbranch element according to the DTD.
 //
-    xercesc::DOMNodeList *addbranchs = doc->getElementsByTagName(Translate("addbranch"));
+    xercesc::DOMNodeList *addbranchs = doc->getElementsByTagName(XMLString::transcode("addbranch"));
     const DOMElement *addbranch = dynamic_cast<const DOMElement *> (addbranchs->item(0)); 
     GeoNodeList toAdd;
     gmxUtil.processorRegistry.find("addbranch")->process(addbranch, gmxUtil, toAdd);
@@ -136,19 +110,12 @@ const DOMElement *element;
 //
 //-------------------------------------------------------------------------------------------
 //
-// Turn var printout on and off with 
-    
-#ifndef STANDALONE_GMX
-    ServiceHandle<IMessageSvc> msgh("MessageSvc","GmxUtil");
-    MsgStream log(&(*msgh), "GmxUtil");
-    log << MSG::DEBUG << "\n\nGmx2Geo GmxUtil matrix, vector and var values:\n";
-    log << MSG::DEBUG <<     "==============================================\n\n";
-#else
-    std::cout << "\n\nGmx2Geo GmxUtil matrix, vector and var values:\n";
-    std::cout <<     "==============================================\n\n";
-#endif
+// Turn var printout on and off with message level
+    OUTPUT_STREAM;
+    msglog << MSG::DEBUG << "\n\nGmx2Geo GmxUtil matrix, vector and var values:\n";
+    msglog << MSG::DEBUG <<     "==============================================\n\n";
 
-    DOMNodeList *defines = doc->getElementsByTagName(Translate("defines"));
+    DOMNodeList *defines = doc->getElementsByTagName(XMLString::transcode("defines"));
     int nDefines = defines->getLength();
     for (int i = 0; i < nDefines; ++i) {
         element = dynamic_cast<DOMElement *>(defines->item(i));
@@ -158,19 +125,14 @@ const DOMElement *element;
 //
 //   Vectors: a list of variables. Names subscripted by _k; values white-space separated numbers.
 //
+        msglog << "\n\n    Vectors\n    =======\n\n";
 
-#ifndef STANDALONE_GMX
-        log << "\n\n    Vectors\n    =======\n\n";
-#else
-	std::cout<<"\n\n    Vectors\n    =======\n\n";
-#endif
-
-        vars = element->getElementsByTagName(Translate("vector"));
+        vars = element->getElementsByTagName(XMLString::transcode("vector"));
         nVars = vars->getLength();
         for (int j = 0; j < nVars; ++j) {
             var = dynamic_cast<DOMElement*>(vars->item(j));
-            char *name = Translate(var->getAttribute(Translate("name")));
-            char *val = Translate(var->getAttribute(Translate("value")));
+            char *name = XMLString::transcode(var->getAttribute(XMLString::transcode("name")));
+            char *val = XMLString::transcode(var->getAttribute(XMLString::transcode("value")));
             string fullname(name);
             fullname += '_';
             istringstream list(val);
@@ -178,11 +140,7 @@ const DOMElement *element;
             int k = 0;
             do  {
                 list >> dble;
-#ifndef STANDALONE_GMX
-                log << fullname + to_string(k) << " = " << dble << endl; 
-#else
-		std::cout<<fullname + to_string(k) << " = " << dble << std::endl;
-#endif
+                msglog << fullname + to_string(k) << " = " << dble << endl; 
                 eval.setVariable((fullname + to_string(k++)).c_str(), dble);
             } while(list.good());
             XMLString::release(&name);
@@ -191,20 +149,16 @@ const DOMElement *element;
 //
 //   Matrices: a matrix of variables. Names subscripted by _j_k; values: white-space separated numbers.
 //
-#ifndef STANDALONE_GMX
-        log << "\n\n    Matrices\n    ========\n\n";
-#else
-	std::cout<<"\n\n    Matrices\n    ========\n\n";
-#endif
+        msglog << "\n\n    Matrices\n    ========\n\n";
 
-        vars = element->getElementsByTagName(Translate("matrix"));
+        vars = element->getElementsByTagName(XMLString::transcode("matrix"));
         nVars = vars->getLength();
         for (int j = 0; j < nVars; ++j) {
             var = dynamic_cast<DOMElement*>(vars->item(j));
-            char *name = Translate(var->getAttribute(Translate("name")));
-            char *val = Translate(var->getAttribute(Translate("value")));
+            char *name = XMLString::transcode(var->getAttribute(XMLString::transcode("name")));
+            char *val = XMLString::transcode(var->getAttribute(XMLString::transcode("value")));
             int coldim;
-            istringstream(Translate(var->getAttribute(Translate("coldim")))) >> coldim;
+            istringstream(XMLString::transcode(var->getAttribute(XMLString::transcode("coldim")))) >> coldim;
             string fullname(name);
             fullname += '_';
             istringstream list(val);
@@ -213,11 +167,7 @@ const DOMElement *element;
             do  {
                 for (int col = 0; col < coldim; ++col) {
                         list >> dble;
-#ifndef STANDALONE_GMX
-                        log << fullname + to_string(k) + '_' + to_string(col) << " = " << dble << endl; 
-#else
-			std::cout<<fullname + to_string(k) + '_' + to_string(col) << " = " << dble << std::endl; 
-#endif
+                        msglog << fullname + to_string(k) + '_' + to_string(col) << " = " << dble << endl; 
                         eval.setVariable((fullname + to_string(k) + '_' + to_string(col)).c_str(), dble);
                         if (!list.good()) break;
                 }
@@ -229,65 +179,44 @@ const DOMElement *element;
 //
 //    Vars: single variable
 //
-#ifndef STANDALONE_GMX
-        log << "\n\n    Single variables\n    ================\n\n";
-#else
-	std::cout<<"\n\n    Single variables\n    ================\n\n";
-#endif
+        msglog << "\n\n    Single variables\n    ================\n\n";
 
-        vars = element->getElementsByTagName(Translate("var"));
+        vars = element->getElementsByTagName(XMLString::transcode("var"));
         nVars = vars->getLength();
         for (int j = 0; j < nVars; ++j) {
             var = dynamic_cast<DOMElement*>(vars->item(j));
-            char *name = Translate(var->getAttribute(Translate("name")));
-            char *val = Translate(var->getAttribute(Translate("value")));
+            char *name = XMLString::transcode(var->getAttribute(XMLString::transcode("name")));
+            char *val = XMLString::transcode(var->getAttribute(XMLString::transcode("value")));
             double evaluated = eval.evaluate(val);
             if (eval.status() != Evaluator::OK) {
-#ifndef STANDALONE_GMX
-                log << MSG::FATAL << "GeoModelXml Error processing CLHEP Evaluator expression. Error name " <<
+                msglog << MSG::FATAL << "GeoModelXml Error processing CLHEP Evaluator expression. Error name " <<
                 eval.error_name() << endl << "Message: ";
                 eval.print_error();
-                log << val << endl;
-                log << string(eval.error_position(), '-') << '^' << '\n';
-                log << "Exiting program." << endmsg;
-#else
-		std::cout<< "GeoModelXml Error processing CLHEP Evaluator expression. Error name " <<
-                eval.error_name() << std::endl << "Message: ";
-                eval.print_error();
-		std::cout << val << std::endl;
-                std::cout << string(eval.error_position(), '-') << '^' << '\n';
-                std::cout << "Exiting program." << std::endl;
-#endif
+                msglog << val << endl;
+                msglog << string(eval.error_position(), '-') << '^' << '\n';
+                msglog << "Exiting program." << endmsg;
                 exit(999); // Should do better...
             }
             eval.setVariable(name, evaluated);
-#ifndef STANDALONE_GMX
-            log << name << "\t\t" << val << " = " << setprecision(10) << evaluated << endl;
-#else
-	    std::cout<<"\t\t" << val << " = " << setprecision(10) << evaluated << std::endl;
-#endif
+            msglog << name << "\t\t" << val << " = " << setprecision(10) << evaluated << endl;
             XMLString::release(&name);
             XMLString::release(&val);
         }
     }
-#ifndef STANDALONE_GMX
-    log << endmsg;
-#else
-    std::cout<<std::endl;
-#endif
+    msglog << endmsg;
     return 1;
 }
 
 int Gmx2Geo::doPositionIndex(xercesc::DOMDocument *doc, GmxUtil &gmxUtil) {
-    DOMNodeList *posIndex = doc->getElementsByTagName(Translate("positionindex"));
+    DOMNodeList *posIndex = doc->getElementsByTagName(XMLString::transcode("positionindex"));
     int nPosIndex = posIndex->getLength(); // Probably limited to 0 or 1 by DTD
     for (int i = 0; i < nPosIndex; ++i) {
         const DOMElement *element = dynamic_cast<DOMElement *>(posIndex->item(i));
-        DOMNodeList *addindexs = element->getElementsByTagName(Translate("addindex"));
+        DOMNodeList *addindexs = element->getElementsByTagName(XMLString::transcode("addindex"));
         int nIndexs = addindexs->getLength();
         for (int j = 0; j < nIndexs; ++j) {
             DOMElement *addindex = dynamic_cast<DOMElement*>(addindexs->item(j));
-            string name = string(Translate(addindex->getAttribute(Translate("name"))));
+            string name = string(XMLString::transcode(addindex->getAttribute(XMLString::transcode("name"))));
             gmxUtil.positionIndex.addIndex(name);
         }
     }
@@ -305,7 +234,7 @@ string tagName;
 //
 //    Loop over all readoutgeometry elements
 //
-    DOMNodeList *rgs = doc->getElementsByTagName(Translate("readoutgeometry"));
+    DOMNodeList *rgs = doc->getElementsByTagName(XMLString::transcode("readoutgeometry"));
     int nRG = rgs->getLength(); 
     for (int i = 0; i < nRG; ++i) {
         map<string, string> rgParams; // New empty list
@@ -315,7 +244,7 @@ string tagName;
 //
         for (DOMNode *rgChild = rg->getFirstChild(); rgChild != 0; rgChild = rgChild->getNextSibling()) {
             if (rgChild->getNodeType() != DOMNode::ELEMENT_NODE) continue; // Skip char data
-            name2release = Translate(rgChild->getNodeName());
+            name2release = XMLString::transcode(rgChild->getNodeName());
             tagName = name2release;
             XMLString::release(&name2release);
             if (tagName == "param") {
@@ -324,7 +253,7 @@ string tagName;
             else if (tagName == "sensorclass") {
                 map<string, string> scParams(rgParams); // Initialised with all previous params
                 const DOMElement *sensorClass = dynamic_cast<DOMElement *>(rgChild);
-                name2release = Translate(sensorClass->getAttribute(Translate("name")));
+                name2release = XMLString::transcode(sensorClass->getAttribute(XMLString::transcode("name")));
                 string clas(name2release); // class is reserved word
                 XMLString::release(&name2release);
 //
@@ -332,7 +261,7 @@ string tagName;
 //
                 for (DOMNode *scChild = sensorClass->getFirstChild(); scChild != 0; scChild = scChild->getNextSibling()) {
                     if (scChild->getNodeType() != DOMNode::ELEMENT_NODE) continue; // Skip char data
-                    name2release = Translate(scChild->getNodeName());
+                    name2release = XMLString::transcode(scChild->getNodeName());
                     tagName = name2release;
                     XMLString::release(&name2release);
                     if (tagName == "param") {
@@ -341,7 +270,7 @@ string tagName;
                     else if (tagName == "sensortype") {
                         map<string, string> stParams(scParams); // Initialised with all previous params
                         const DOMElement *sensorType = dynamic_cast<DOMElement *>(scChild);
-                        name2release = Translate(sensorType->getAttribute(Translate("name")));
+                        name2release = XMLString::transcode(sensorType->getAttribute(XMLString::transcode("name")));
                         string name(name2release);
                         XMLString::release(&name2release);
 //
@@ -365,10 +294,10 @@ string tagName;
 
 void Gmx2Geo::addParam(DOMNode *node, map<string, string> &params) {
     const DOMElement *param = dynamic_cast<DOMElement *>(node);
-    char *name2release = Translate(param->getAttribute(Translate("name")));
+    char *name2release = XMLString::transcode(param->getAttribute(XMLString::transcode("name")));
     string name(name2release);
     XMLString::release(&name2release);
-    name2release = Translate(param->getAttribute(Translate("value")));
+    name2release = XMLString::transcode(param->getAttribute(XMLString::transcode("value")));
     string value(name2release);
     XMLString::release(&name2release);
     params[name] = value;
diff --git a/DetectorDescription/GeoModelXml/src/GmxInterface.cxx b/DetectorDescription/GeoModelXml/src/GmxInterface.cxx
index ae8a18a12e543c071404e5d1866da908d845ef0c..ce7296a7f719b50a42fe03a3699d6cbb4de0647d 100644
--- a/DetectorDescription/GeoModelXml/src/GmxInterface.cxx
+++ b/DetectorDescription/GeoModelXml/src/GmxInterface.cxx
@@ -8,15 +8,7 @@
 //    Use: create an instance of this, and pass a reference to it in the Gmx2Geo constructor.
 //
 #include "GeoModelXml/GmxInterface.h"
-
-#ifndef STANDALONE_GMX
-#include "GaudiKernel/ServiceHandle.h"
-#include "GaudiKernel/MsgStream.h"
-#include "GaudiKernel/IMessageSvc.h"
-#else
-#include <iostream>
-#endif
-
+#include "GeoModelXml/OutputDirector.h"
 #include "GeoModelKernel/GeoPVConstLink.h"
 #include "GeoModelKernel/Query.h"
 #include "GeoModelKernel/GeoPhysVol.h"
@@ -29,51 +21,24 @@ int GmxInterface::sensorId(map<string, int> &/*index*/) {
 }
 
 void GmxInterface::addSensorType(string clas, string type, map<string, string> params) {
+    OUTPUT_STREAM;
 
-#ifndef STANDALONE_GMX
-    ServiceHandle<IMessageSvc> msgh("MessageSvc", "GeoModelXml");
-    MsgStream log(&(*msgh), "GeoModelXml");
-
-    log << MSG::DEBUG << "GmxInterface::addSensorType called for class " << clas << "; type " << type << 
+    msglog << MSG::DEBUG << "GmxInterface::addSensorType called for class " << clas << "; type " << type << 
                          "\n    Parameter names and values:\n";
     for (map<string, string>::iterator p = params.begin(); p != params.end(); ++p) {
-        log << "        " << p->first << " = " << p->second << endmsg;
-    }
-#else
-    std::cout << "GmxInterface::addSensorType called for class " << clas << "; type " << type << 
-                         "\n    Parameter names and values:\n";
-
-    for (map<string, string>::iterator p = params.begin(); p != params.end(); ++p) {
-        std::cout << "        " << p->first << " = " << p->second << std::endl;
+        msglog << "        " << p->first << " = " << p->second << endmsg;
     }
-#endif
-
 }
 
 void GmxInterface::addSensor(string name, map<string, int> &index, int sequentialId, GeoVFullPhysVol *fpv) {
+    OUTPUT_STREAM;
 
-#ifndef STANDALONE_GMX
-    ServiceHandle<IMessageSvc> msgh("MessageSvc", "GeoModelXml");
-    MsgStream log(&(*msgh), "GeoModelXml");
-
-    log << MSG::DEBUG << "GmxInterface::addSensor called for " << fpv->getLogVol()->getName() << ", type " << name << 
-                         ". Indices:   ";
-#else
-    std::cout<< "GmxInterface::addSensor called for " << fpv->getLogVol()->getName() << ", type " << name << 
-                         ". Indices:   ";
-#endif	 
-		
+    msglog << MSG::DEBUG << "GmxInterface::addSensor called for " << fpv->getLogVol()->getName() << ", type " << name << 
+                         ". Indices:   ";		
     for (map<string, int>::iterator i = index.begin(); i != index.end(); ++i) {
-#ifndef STANDALONE_GMX
-        log << i->second << "   ";
+        msglog << i->second << "   ";
     }
-    log << "\nSequential ID = " << sequentialId << endmsg;
-#else
-    	std::cout << i->second << "   ";
-    }
-    std::cout << "\nSequential ID = " << sequentialId << std::endl;
-#endif
-
+    msglog << "\nSequential ID = " << sequentialId << endmsg;
 }
 
 void GmxInterface::addAlignable(int level, map<std::string, int> &index, GeoVFullPhysVol *fpv, 
@@ -81,9 +46,7 @@ void GmxInterface::addAlignable(int level, map<std::string, int> &index, GeoVFul
 //
 //    Logvol name is not very useful (usually == AssemblyLV). Get PhysVol name (seems surprisingly awkward way needed)
 //
-#ifndef STANDALONE_GMX
-    ServiceHandle<IMessageSvc> msgh("MessageSvc", "GeoModelXml");
-    MsgStream log(&(*msgh), "GeoModelXml");
+    OUTPUT_STREAM;
 /* Cannot get this to work.
     string name("New name");
     GeoPVConstLink parent = fpv->getParent();
@@ -94,21 +57,13 @@ void GmxInterface::addAlignable(int level, map<std::string, int> &index, GeoVFul
     else {
         name = string("Something Wrong, fullPV not found in parent in GmxInterface::addAlignable");
     }
-    log << MSG::DEBUG << "GmxInterface::addAlignable called for physvol name " << name << ".  Level = " << level << ". Indices:   ";
+    msglog << MSG::DEBUG << "GmxInterface::addAlignable called for physvol name " << name << ".  Level = " << level << ". Indices:   ";
 */
 
-    log << MSG::DEBUG << "GmxInterface::addAlignable called for a physvol. Logvol name " << fpv->getLogVol()->getName() << 
-            ". Level = " << level << ". Indices:   ";
-    for (map<string, int>::iterator i = index.begin(); i != index.end(); ++i) {
-        log << i->second << "   ";
-    }
-    log << endmsg;
-#else
-    std::cout << "GmxInterface::addAlignable called for a physvol. Logvol name " << fpv->getLogVol()->getName() << 
+    msglog << MSG::DEBUG << "GmxInterface::addAlignable called for a physvol. Logvol name " << fpv->getLogVol()->getName() << 
             ". Level = " << level << ". Indices:   ";
     for (map<string, int>::iterator i = index.begin(); i != index.end(); ++i) {
-        std::cout << i->second << "   ";
+        msglog << i->second << "   ";
     }
-    std::cout << std::endl;
-#endif
+    msglog << endmsg;
 }
diff --git a/DetectorDescription/GeoModelXml/src/GmxUtil.cxx b/DetectorDescription/GeoModelXml/src/GmxUtil.cxx
index df9e0524d295fcbad3ecdfbe98948bccf56156f8..b1722a4b60a64ab7175039dad21fec970c0d02dc 100644
--- a/DetectorDescription/GeoModelXml/src/GmxUtil.cxx
+++ b/DetectorDescription/GeoModelXml/src/GmxUtil.cxx
@@ -1,17 +1,16 @@
 /*
-  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 */
 
 #include "GeoModelXml/GmxUtil.h"
-#ifndef STANDALONE_GMX
+
+#include "GeoModelXml/OutputDirector.h"
+
+#ifndef GEOMODEL_STANDALONE_GMX
 #include "StoreGate/StoreGateSvc.h"
-#include "GaudiKernel/ISvcLocator.h"
-#include "GaudiKernel/MsgStream.h"
-#include "GaudiKernel/IMessageSvc.h"
 #include "GeoModelInterfaces/StoredMaterialManager.h"
-#else
-#include <iostream>
 #endif
+
 #include "GeoModelKernel/GeoElement.h"
 #include "GeoModelKernel/GeoMaterial.h"
 #include "GeoModelKernel/GeoBox.h"
@@ -28,7 +27,7 @@ using namespace std;
 GmxUtil::GmxUtil(GmxInterface &gmxInterface) {
     m_gmxInterface = &gmxInterface;
 //
-//    Initialise the Evaluator
+//    Initialise the CLHEP::Evaluator
 //
     eval.setStdMath();
 //
@@ -36,9 +35,6 @@ GmxUtil::GmxUtil(GmxInterface &gmxInterface) {
 //    When Geo2G4 finds any physvol using a logvol with material special::HyperUranium, it creates a G4Assembly
 //    instead of a G4Volume.
 //
-//    NB elsewhere special::ether is used to indicate a G4Assembly; HyperUranium is used here as a way to distinguish GeoModelXml assemblies from other assemblies and trigger distinct behaviour with regard to the copyNumbers which are assigned (ITkScheme, wherein the SiHitIdentifier is used as the copyNumber)
-// See ExtParameterisedVolumeBuilder::Build and Geo2G4AssemblyVolume::MakeImprint for how this propagates to G4
-
     m_assemblyLV = makeAssemblyLV();
 //
 //   Register tag handlers that produce a vector of items to add to the tree.
@@ -55,6 +51,7 @@ GmxUtil::GmxUtil(GmxInterface &gmxInterface) {
 //   Register tag handlers that produce GeoNodes. Only useful for those tags which
 //   can appear in a long list in any order. So certainly all shapes; maybe others.
 //
+    geoItemRegistry.enregister("simplepolygonbrep", (Element2GeoItem *) &tagHandler.simplepolygonbrep);
     geoItemRegistry.enregister("box", (Element2GeoItem *) &tagHandler.box);
     geoItemRegistry.enregister("cons", (Element2GeoItem *) &tagHandler.cons);
     geoItemRegistry.enregister("generictrap", (Element2GeoItem *) &tagHandler.generictrap);
@@ -92,15 +89,11 @@ double GmxUtil::evaluate(char const *expression) {
         }
     }
     if (isWhiteSpace) { // Catch a common error early and give best message possible
-#ifndef STANDALONE_GMX
-        ServiceHandle<IMessageSvc> msgh("MessageSvc", "GeoModelXml");
-        MsgStream log(&(*msgh), "GeoModelXml");
-        log << MSG::FATAL << "GeoModelXml Error processing Evaluator expression: empty expression. Exiting program.\n" << 
+	OUTPUT_STREAM;
+        msglog << MSG::FATAL << "GeoModelXml Error processing Evaluator expression: empty expression. Exiting program.\n" << 
                endmsg;
-#else
-	std::cout <<"GeoModelXml Error processing CLHEP Evaluator expression: empty expression. Exiting program.\n";
         throw runtime_error(string("evaluate: empty or white space expression. Last good expression was " + lastGoodExpression));
-#endif
+
     }
 //
 //    Process any []s. Contents are evaluated to in integer, then the [...] are replaced by 
@@ -113,25 +106,14 @@ double GmxUtil::evaluate(char const *expression) {
 //
     double result = eval.evaluate(noBrackets.c_str());
     if (eval.status() != Evaluator::OK) {
-#ifndef STANDALONE_GMX
-        ServiceHandle<IMessageSvc> msgh("MessageSvc", "GeoModelXml");
-        MsgStream log(&(*msgh), "GeoModelXml");
-        log << MSG::FATAL << "GeoModelXml Error processing Evaluator expression. Error name <" <<
+	OUTPUT_STREAM;
+        msglog << MSG::FATAL << "GeoModelXml Error processing Evaluator expression. Error name <" <<
          eval.error_name() << ">" << endl << "Message: <";
         eval.print_error();
-        log << ">. Original expression <" << expression << ">; Expression after de-bracketing:\n";
-        log << noBrackets << endl;
-        log << string(eval.error_position(), '-') << '^' << '\n';
-        log << "Exiting program.\n" << endmsg;
-#else
-	std::cout << "GeoModelXml Error processing Evaluator expression. Error name <" <<
-         eval.error_name() << ">" << std::endl << "Message: <";
-        eval.print_error();
-        std::cout << ">. Original expression <" << expression << ">; Expression after de-bracketing:\n";
-        std::cout << noBrackets << std::endl;
-        std::cout << string(eval.error_position(), '-') << '^' << '\n';
-        std::cout << "Exiting program.\n" << std::endl;
-#endif
+        msglog << ">. Original expression <" << expression << ">; Expression after de-bracketing:\n";
+        msglog << noBrackets << endl;
+        msglog << string(eval.error_position(), '-') << '^' << '\n';
+        msglog << "Exiting program.\n" << endmsg;
         throw runtime_error(string("evaluate: invalid expression. Last good expression was <" + lastGoodExpression + ">"));
     }
     lastGoodExpression = strExpression;
@@ -148,15 +130,8 @@ std::string GmxUtil::debracket(std::string expression) {
     }
     size_t nextClose = expression.find_first_of(']', lastOpen);
     if (nextClose == string::npos) {
-#ifndef STANDALONE_GMX
-        ServiceHandle<IMessageSvc> msgh("MessageSvc", "GeoModelXml");
-        MsgStream log(&(*msgh), "GeoModelXml");
-        log << MSG::ERROR << "debracket: unpaired opening [; expression was:\n    " << expression << endmsg; 
-#else
-	std::cout<<"debracket: unpaired opening [; expression was:\n    " <<
-	expression << std::endl;
-#endif
-
+	OUTPUT_STREAM;
+        msglog << MSG::ERROR << "debracket: unpaired opening [; expression was:\n    " << expression << endmsg; 
         return expression;
     }
     string toEvaluate = expression.substr(lastOpen + 1, nextClose - lastOpen - 1);
@@ -175,22 +150,21 @@ std::string GmxUtil::debracket(std::string expression) {
 }
 
 GeoLogVol * GmxUtil::makeAssemblyLV() {
-#ifndef STANDALONE_GMX
+#ifndef GEOMODEL_STANDALONE_GMX
     StoreGateSvc *pDetStore = 0;
     ISvcLocator *svcLocator = Gaudi::svcLocator();
 
-    ServiceHandle<IMessageSvc> msgh("MessageSvc", "GeoModelXml");
-    MsgStream log(&(*msgh), "GeoModelXml");
+    OUTPUT_STREAM;
 
     StatusCode sc = svcLocator->service("DetectorStore", pDetStore);
     if (sc.isFailure()) {
-            log << MSG::ERROR << "GmxUtil::makeAssemblyLV: Unable to access Detector Store" << endmsg;
+            msglog << MSG::ERROR << "GmxUtil::makeAssemblyLV: Unable to access Detector Store" << endmsg;
     }
     else {
         DataHandle<StoredMaterialManager> theMaterialManager;
         sc = pDetStore->retrieve(theMaterialManager, "MATERIALS");
         if(sc.isFailure()) {
-                log << MSG::ERROR << "GmxUtil::makeAssemblyLV: Unable to access Material Manager" << endmsg;
+                msglog << MSG::ERROR << "GmxUtil::makeAssemblyLV: Unable to access Material Manager" << endmsg;
         }
         else {
             const GeoMaterial *assembly_material = theMaterialManager->getMaterial("special::HyperUranium");
diff --git a/DetectorDescription/GeoModelXml/src/IndexProcessor.cxx b/DetectorDescription/GeoModelXml/src/IndexProcessor.cxx
index ac82dd2da5b9e186bf7e2683c2f7c9443fd9aafb..f048236c49cd4c3224572bc795c63c936b07845f 100644
--- a/DetectorDescription/GeoModelXml/src/IndexProcessor.cxx
+++ b/DetectorDescription/GeoModelXml/src/IndexProcessor.cxx
@@ -10,7 +10,7 @@
 #include <xercesc/dom/DOM.hpp>
 #include "GeoModelXml/IndexProcessor.h"
 
-#include "GeoModelXml/translate.h"
+#include "xercesc/util/XMLString.hpp"
 #include "GeoModelXml/GmxUtil.h"
 
 using namespace std;
@@ -20,11 +20,11 @@ void IndexProcessor::process(const DOMElement *element, GmxUtil &gmxUtil, GeoNod
 
     char *name2release;
 
-    name2release = Translate(element->getAttribute(Translate("ref")));
+    name2release = XMLString::transcode(element->getAttribute(XMLString::transcode("ref")));
     string name(name2release);
     XMLString::release(&name2release);
 
-    name2release = Translate(element->getAttribute(Translate("value")));
+    name2release = XMLString::transcode(element->getAttribute(XMLString::transcode("value")));
     string value(name2release);
     XMLString::release(&name2release);
 
diff --git a/DetectorDescription/GeoModelXml/src/LogvolProcessor.cxx b/DetectorDescription/GeoModelXml/src/LogvolProcessor.cxx
index e60b2be593cde6598cadb6c83475d62a36bf697e..e16a339d07046be3fb12739d82434ceccd1a08d9 100644
--- a/DetectorDescription/GeoModelXml/src/LogvolProcessor.cxx
+++ b/DetectorDescription/GeoModelXml/src/LogvolProcessor.cxx
@@ -11,14 +11,7 @@
 //   Add them to the physvol.
 //
 #include "GeoModelXml/LogvolProcessor.h"
-
-#ifndef STANDALONE_GMX
-#include "GaudiKernel/ServiceHandle.h"
-#include "GaudiKernel/MsgStream.h"
-#include "GaudiKernel/IMessageSvc.h"
-#else
-#include <iostream>
-#endif
+#include "GeoModelXml/OutputDirector.h"
 
 #include <map>
 
@@ -31,7 +24,7 @@
 #include "GeoModelKernel/GeoVFullPhysVol.h"
 #include "GeoModelXml/GmxUtil.h"
 #include "GeoModelXml/GeoNodeList.h"
-#include "GeoModelXml/translate.h"
+#include "xercesc/util/XMLString.hpp"
 
 // using namespace CLHEP;
 
@@ -42,14 +35,11 @@ void LogvolProcessor::process(const DOMElement *element, GmxUtil &gmxUtil, GeoNo
 GeoLogVol *lv;
 GeoNameTag *physVolName;
 
-#ifndef STANDALONE_GMX
-    ServiceHandle<IMessageSvc> msgh("MessageSvc", "GeoModelXml");
-    MsgStream log(&(*msgh), "GeoModelXml");
-#endif
+    OUTPUT_STREAM;
 
     gmxUtil.positionIndex.incrementLevel();
 
-    char *name2release = Translate(element->getAttribute(Translate("name")));
+    char *name2release = XMLString::transcode(element->getAttribute(XMLString::transcode("name")));
     string name(name2release);
     XMLString::release(&name2release);
 //
@@ -69,27 +59,21 @@ GeoNameTag *physVolName;
 //    Get the shape.
 //
         DOMDocument *doc = element->getOwnerDocument();
-        const XMLCh *shape = element->getAttribute(Translate("shape"));
+        const XMLCh *shape = element->getAttribute(XMLString::transcode("shape"));
         DOMElement *refShape = doc->getElementById(shape);
         // Check it is a shape... its parent should be a <shapes>. DTD cannot do this for us.
         DOMNode *parent = refShape->getParentNode();
-        if (XMLString::compareIString(parent->getNodeName(), Translate("shapes")) != 0) {
+        if (XMLString::compareIString(parent->getNodeName(), XMLString::transcode("shapes")) != 0) {
 
-#ifndef STANDALONE_GMX
-            log << MSG::FATAL << "Processing logvol " << name << 
+            msglog << MSG::FATAL << "Processing logvol " << name << 
                     ". Error in gmx file. An IDREF for a logvol shape did not refer to a shape.\n" <<
                     "Shape ref was " << shape << "; exiting" << endmsg;
-#else
-	    std::cout<<"Processing logvol " << name << 
-                    ". Error in gmx file. An IDREF for a logvol shape did not refer to a shape.\n" <<
-                    "Shape ref was " << shape << "; exiting" <<std::endl;
-#endif
             exit (1); // Need to improve...
         }
 //
 //    What sort of shape?
 //
-        name2release = Translate(refShape->getNodeName());
+        name2release = XMLString::transcode(refShape->getNodeName());
         string shapeType(name2release);
         XMLString::release(&name2release);
 
@@ -97,20 +81,14 @@ GeoNameTag *physVolName;
 //
 //    Get the material
 //
-        const XMLCh *material = element->getAttribute(Translate("material"));
+        const XMLCh *material = element->getAttribute(XMLString::transcode("material"));
         DOMElement *refMaterial = doc->getElementById(material);
         // Check it is a material... its parent should be a <materials>. DTD cannot do this for us.
         parent = refMaterial->getParentNode();
-        if (XMLString::compareIString(parent->getNodeName(), Translate("materials")) != 0) {
-#ifndef STANDALONE_GMX
-            log << MSG::FATAL << "Processing logvol " << name << 
+        if (XMLString::compareIString(parent->getNodeName(), XMLString::transcode("materials")) != 0) {
+            msglog << MSG::FATAL << "Processing logvol " << name << 
                     ". Error in gmx file. An IDREF for a logvol material did not refer to a material.\n" <<
                     "Material ref was " << material << "; exiting" << endmsg;
-#else
-	    std::cout<<"Processing logvol " << name << 
-                    ". Error in gmx file. An IDREF for a logvol material did not refer to a material.\n" <<
-                    "Material ref was " << material << "; exiting" <<std::endl;
-#endif
             exit (1); // Need to improve...
         }
 
@@ -132,7 +110,7 @@ GeoNameTag *physVolName;
     for (DOMNode *child = element->getFirstChild(); child != 0; child = child->getNextSibling()) {
         if (child->getNodeType() == DOMNode::ELEMENT_NODE) {
             DOMElement *el = dynamic_cast<DOMElement *> (child);
-            name2release = Translate(el->getNodeName());
+            name2release = XMLString::transcode(el->getNodeName());
             string name(name2release);
             XMLString::release(&name2release);
             gmxUtil.processorRegistry.find(name)->process(el, gmxUtil, childrenAdd);
@@ -142,7 +120,7 @@ GeoNameTag *physVolName;
 //   Make a list of things to be added
 //
     toAdd.push_back(physVolName);
-    bool sensitive = element->hasAttribute(Translate("sensitive"));
+    bool sensitive = element->hasAttribute(XMLString::transcode("sensitive"));
     int sensId = 0;
     map<string, int> index;
     if (sensitive) {
@@ -159,7 +137,7 @@ GeoNameTag *physVolName;
 //
 //    Make a new PhysVol and add everything to it, then add it to the list of things for my caller to add
 //
-    char *toRelease = Translate(element->getAttribute(Translate("alignable")));
+    char *toRelease = XMLString::transcode(element->getAttribute(XMLString::transcode("alignable")));
     string alignable(toRelease);
     XMLString::release(&toRelease);
     if (sensitive || (alignable.compare(string("true")) == 0)) {
@@ -172,7 +150,7 @@ GeoNameTag *physVolName;
 //    Add sensitive volumes to detector manager via GmxInterface
 //
         if (sensitive) {
-            name2release = Translate(element->getAttribute(Translate("sensitive")));
+            name2release = XMLString::transcode(element->getAttribute(XMLString::transcode("sensitive")));
             string sensitiveName(name2release);
             XMLString::release(&name2release);
             gmxUtil.gmxInterface()->addSensor(sensitiveName, index, sensId, dynamic_cast<GeoVFullPhysVol *> (pv));
@@ -193,7 +171,7 @@ GeoNameTag *physVolName;
 
 void LogvolProcessor::zeroId(const xercesc::DOMElement *element) {
 
-    char *name2release = Translate(element->getAttribute(Translate("name")));
+    char *name2release = XMLString::transcode(element->getAttribute(XMLString::transcode("name")));
     string name(name2release);
     XMLString::release(&name2release);
 //
diff --git a/DetectorDescription/GeoModelXml/src/LogvolrefProcessor.cxx b/DetectorDescription/GeoModelXml/src/LogvolrefProcessor.cxx
index 3f5520c8d224711a420a8ec95ddcef1499992be1..fef75926f35cc40e012301e039ce16143e899a89 100644
--- a/DetectorDescription/GeoModelXml/src/LogvolrefProcessor.cxx
+++ b/DetectorDescription/GeoModelXml/src/LogvolrefProcessor.cxx
@@ -6,25 +6,18 @@
 //    Process logvolref items: basically, just find the referenced logvol and call its processor.
 //
 #include "GeoModelXml/LogvolrefProcessor.h"
-
-#ifndef STANDALONE_GMX
-#include "GaudiKernel/ServiceHandle.h"
-#include "GaudiKernel/MsgStream.h"
-#include "GaudiKernel/IMessageSvc.h"
-#else
-#include <iostream>
-#endif
+#include "GeoModelXml/OutputDirector.h"
 #include <string>
 #include <xercesc/dom/DOM.hpp>
 #include "GeoModelXml/GeoNodeList.h"
-#include "GeoModelXml/translate.h"
+#include "xercesc/util/XMLString.hpp"
 #include "GeoModelXml/GmxUtil.h"
 
 using namespace std;
 using namespace xercesc;
 
 void LogvolrefProcessor::process(const DOMElement *element, GmxUtil &gmxUtil, GeoNodeList &toAdd) {
-const XMLCh *ref = Translate("ref");
+const XMLCh *ref = XMLString::transcode("ref");
 const XMLCh *idref;
 DOMDocument *doc = element->getOwnerDocument();
 char *toRelease;
@@ -36,26 +29,20 @@ char *toRelease;
 //
 //    Check it is the right sort
 //
-    toRelease = Translate(elem->getNodeName());
+    toRelease = XMLString::transcode(elem->getNodeName());
     string nodeName(toRelease);
     XMLString::release(&toRelease);
     if (nodeName != string("logvol")) {
-#ifndef STANDALONE_GMX
-        ServiceHandle<IMessageSvc> msgh("MessageSvc", "GeoModelXml");
-        MsgStream log(&(*msgh), "GeoModelXml");
-        log << MSG::FATAL << "Error in xml/gmx file: logvolref " << Translate(idref) << " referenced a " << nodeName << 
+	OUTPUT_STREAM;
+        msglog << MSG::FATAL << "Error in xml/gmx file: logvolref " << XMLString::transcode(idref) << " referenced a " << nodeName << 
                 " instead of a logvol." << endmsg;
-#else
-	std::cout << "Error in xml/gmx file: logvolref " << Translate(idref) << " referenced a " << nodeName << 
-                " instead of a logvol." << std::endl;
-#endif
         exit(999); // Should do better...
     }
 //
 //    Process it
 //
-    const XMLCh *zeroid = element->getAttribute(Translate("zeroid"));
-    if (XMLString::equals(zeroid, Translate("true"))) {
+    const XMLCh *zeroid = element->getAttribute(XMLString::transcode("zeroid"));
+    if (XMLString::equals(zeroid, XMLString::transcode("true"))) {
         gmxUtil.tagHandler.logvol.zeroId(elem);
     }
 
diff --git a/DetectorDescription/GeoModelXml/src/MakeBox.cxx b/DetectorDescription/GeoModelXml/src/MakeBox.cxx
index ae4c9a285bbe0693c1ac1013355fca15d27002fa..75a1e43c1c2d1aedf4e8e095bb12ac90dc2fcd5d 100644
--- a/DetectorDescription/GeoModelXml/src/MakeBox.cxx
+++ b/DetectorDescription/GeoModelXml/src/MakeBox.cxx
@@ -7,7 +7,7 @@
 #include <xercesc/dom/DOM.hpp>
 #include "GeoModelKernel/RCBase.h"
 #include "GeoModelKernel/GeoBox.h"
-#include "GeoModelXml/translate.h"
+#include "xercesc/util/XMLString.hpp"
 #include "GeoModelXml/GmxUtil.h"
 
 using namespace xercesc;
@@ -21,7 +21,7 @@ double p[nParams];
 char *toRelease;
 
     for (int i = 0; i < nParams; ++i) {
-        toRelease = Translate(element->getAttribute(Translate(parName[i])));
+        toRelease = XMLString::transcode(element->getAttribute(XMLString::transcode(parName[i])));
         p[i] = gmxUtil.evaluate(toRelease);
         XMLString::release(&toRelease);
     }
diff --git a/DetectorDescription/GeoModelXml/src/MakeCons.cxx b/DetectorDescription/GeoModelXml/src/MakeCons.cxx
index e650c5cf3c16324034db5a9640ab95175f43833d..7acac8dc1281530262a83902f003c92a50fe6b21 100644
--- a/DetectorDescription/GeoModelXml/src/MakeCons.cxx
+++ b/DetectorDescription/GeoModelXml/src/MakeCons.cxx
@@ -7,7 +7,7 @@
 #include <xercesc/dom/DOM.hpp>
 #include "GeoModelKernel/RCBase.h"
 #include "GeoModelKernel/GeoCons.h"
-#include "GeoModelXml/translate.h"
+#include "xercesc/util/XMLString.hpp"
 #include "GeoModelXml/GmxUtil.h"
 
 using namespace xercesc;
@@ -21,7 +21,7 @@ double p[nParams];
 char *toRelease;
 
     for (int i = 0; i < nParams; ++i) {
-        toRelease = Translate(element->getAttribute(Translate(parName[i])));
+        toRelease = XMLString::transcode(element->getAttribute(XMLString::transcode(parName[i])));
         p[i] = gmxUtil.evaluate(toRelease);
         XMLString::release(&toRelease);
     }
diff --git a/DetectorDescription/GeoModelXml/src/MakeElement.cxx b/DetectorDescription/GeoModelXml/src/MakeElement.cxx
index e37ceffd21495532bdda03e7b925a1ecc73e99c6..866ed1ce79335fc1dfc81f859d64819c1d3372f4 100644
--- a/DetectorDescription/GeoModelXml/src/MakeElement.cxx
+++ b/DetectorDescription/GeoModelXml/src/MakeElement.cxx
@@ -7,7 +7,7 @@
 #include "GeoModelKernel/RCBase.h"
 #include "GeoModelKernel/Units.h"
 #include "GeoModelKernel/GeoElement.h"
-#include "GeoModelXml/translate.h"
+#include "xercesc/util/XMLString.hpp"
 #include "GeoModelXml/GmxUtil.h"
 
 using namespace xercesc;
@@ -23,21 +23,21 @@ double zVal, aVal;
 //
 //   Get my Z
 //
-    z = Translate(element->getAttribute(Translate("Z")));
+    z = XMLString::transcode(element->getAttribute(XMLString::transcode("Z")));
     zVal = gmxUtil.evaluate(z);
     XMLString::release(&z);
 //
 //   Get my A
 //
-    a = Translate(element->getAttribute(Translate("A")));
+    a = XMLString::transcode(element->getAttribute(XMLString::transcode("A")));
     aVal = gmxUtil.evaluate(a);
 	
     XMLString::release(&a);
 //
 //    Get my names
 //
-    name = Translate(element->getAttribute(Translate("name")));
-    shortname = Translate(element->getAttribute(Translate("shortname")));
+    name = XMLString::transcode(element->getAttribute(XMLString::transcode("name")));
+    shortname = XMLString::transcode(element->getAttribute(XMLString::transcode("shortname")));
 //
 //    Create it
 //
diff --git a/DetectorDescription/GeoModelXml/src/MakeGenericTrap.cxx b/DetectorDescription/GeoModelXml/src/MakeGenericTrap.cxx
index c9e60458be8bff9d9bd615ef1a826f61caebea3a..df1a86fc8aa2e39b0cf75ca6ca88fa710cc36e2e 100644
--- a/DetectorDescription/GeoModelXml/src/MakeGenericTrap.cxx
+++ b/DetectorDescription/GeoModelXml/src/MakeGenericTrap.cxx
@@ -10,7 +10,7 @@
 #include <xercesc/dom/DOM.hpp>
 #include "GeoModelKernel/RCBase.h"
 #include "GeoModelKernel/GeoGenericTrap.h"
-#include "GeoModelXml/translate.h"
+#include "xercesc/util/XMLString.hpp"
 #include "GeoModelXml/GmxUtil.h"
 
 
@@ -29,10 +29,10 @@ double x;
 double y;
 
     for (int i = 0; i < (nParams - 1) / 2; ++i) {
-        toRelease = Translate(element->getAttribute(Translate(parName[2 * i])));
+        toRelease = XMLString::transcode(element->getAttribute(XMLString::transcode(parName[2 * i])));
         x = gmxUtil.evaluate(toRelease);
         XMLString::release(&toRelease);
-        toRelease = Translate(element->getAttribute(Translate(parName[2 * i + 1])));
+        toRelease = XMLString::transcode(element->getAttribute(XMLString::transcode(parName[2 * i + 1])));
         y = gmxUtil.evaluate(toRelease);
         XMLString::release(&toRelease);
         vertices.push_back(GeoTwoVector(x, y));
@@ -40,7 +40,7 @@ double y;
 //
 //    z-half-length
 //
-    toRelease = Translate(element->getAttribute(Translate(parName[16])));
+    toRelease = XMLString::transcode(element->getAttribute(XMLString::transcode(parName[16])));
     p = gmxUtil.evaluate(toRelease);
     XMLString::release(&toRelease);
 
diff --git a/DetectorDescription/GeoModelXml/src/MakeIntersection.cxx b/DetectorDescription/GeoModelXml/src/MakeIntersection.cxx
index 4ff2728b6b3efafa75799d5cff357ff81c376614..49ab5599f6debe99b2d8b46e698ab6bea9cb2a3c 100644
--- a/DetectorDescription/GeoModelXml/src/MakeIntersection.cxx
+++ b/DetectorDescription/GeoModelXml/src/MakeIntersection.cxx
@@ -6,23 +6,14 @@
 // Then heavily modified
 #include "GeoModelXml/shape/MakeIntersection.h"
 #include <string>
-
-#ifndef STANDALONE_GMX
-#include "GaudiKernel/ServiceHandle.h"
-#include "GaudiKernel/MsgStream.h"
-#include "GaudiKernel/IMessageSvc.h"
-#else
-#include <iostream>
-#endif
-
+#include "GeoModelXml/OutputDirector.h"
 #include <xercesc/dom/DOM.hpp>
-//   #include <CLHEP/Geometry/Transform3D.h>
-#include <Eigen/Dense>
+#include "GeoModelKernel/GeoDefinitions.h"
 #include "GeoModelKernel/RCBase.h"
 #include "GeoModelKernel/GeoShape.h"
 #include "GeoModelKernel/GeoTransform.h"
 
-#include "GeoModelXml/translate.h"
+#include "xercesc/util/XMLString.hpp"
 #include "GeoModelXml/GmxUtil.h"
 
 using namespace xercesc;
@@ -34,14 +25,9 @@ const RCBase * MakeIntersection::make(const xercesc::DOMElement *element, GmxUti
 // 
 //    Process child elements; first is first shaperef; then transform; then second shaperef.
 //
-    typedef Eigen::Affine3d Transform3D;
-
     GeoShape *first = 0;
     GeoShape *second = 0;
-    // HepGeom::Transform3D hepXf;
-    
-    Transform3D hepXf=Transform3D::Identity();
-    
+    GeoTrf::Transform3D hepXf=GeoTrf::Transform3D::Identity(); 
     int elementIndex = 0;
     for (DOMNode *child = element->getFirstChild(); child != 0; child = child->getNextSibling()) {
         if (child->getNodeType() == DOMNode::ELEMENT_NODE) { // Skips text nodes
@@ -51,7 +37,7 @@ const RCBase * MakeIntersection::make(const xercesc::DOMElement *element, GmxUti
                     break;
                 }
                 case 1: { // Second element is transformation or transformationref
-                    char *toRelease = Translate(child->getNodeName());
+                    char *toRelease = XMLString::transcode(child->getNodeName());
                     string nodeName(toRelease);
                     XMLString::release(&toRelease);
                     GeoTransform *geoXf = nodeName == "transformation"? 
@@ -65,13 +51,8 @@ const RCBase * MakeIntersection::make(const xercesc::DOMElement *element, GmxUti
                     break;
                 }
                 default: // More than 3 elements?
-#ifndef STANDALONE_GMX
-                    ServiceHandle<IMessageSvc> msgh("MessageSvc", "GeoModelXml");
-                    MsgStream log(&(*msgh), "GeoModelXml");
-                    log << MSG::FATAL << "MakeIntersection: Incompatible DTD? got more than 3 child elements\n";
-#else
-		    std::cout<<"MakeIntersection: Incompatible DTD? got more than 3 child elements\n";
-#endif
+                    OUTPUT_STREAM;
+                    msglog << MSG::FATAL << "MakeIntersection: Incompatible DTD? got more than 3 child elements\n";
             }
             elementIndex++;
         }
diff --git a/DetectorDescription/GeoModelXml/src/MakeMaterial.cxx b/DetectorDescription/GeoModelXml/src/MakeMaterial.cxx
index d123a293952382454b88c98818898d56af9f17e5..67dec42699e262fbf3d3907bbbc02524255f28fe 100644
--- a/DetectorDescription/GeoModelXml/src/MakeMaterial.cxx
+++ b/DetectorDescription/GeoModelXml/src/MakeMaterial.cxx
@@ -3,20 +3,12 @@
 */
 
 #include "GeoModelXml/MakeMaterial.h"
-
-#ifndef STANDALONE_GMX
-#include "GaudiKernel/ServiceHandle.h"
-#include "GaudiKernel/MsgStream.h"
-#include "GaudiKernel/IMessageSvc.h"
-#else
-#include <iostream>
-#endif
-
+#include "GeoModelXml/OutputDirector.h"
 #include <string>
 #include <xercesc/dom/DOM.hpp>
 #include "GeoModelKernel/RCBase.h"
 #include "GeoModelKernel/GeoMaterial.h"
-#include "GeoModelXml/translate.h"
+#include "xercesc/util/XMLString.hpp"
 #include "GeoModelXml/GmxUtil.h"
 #include "GeoModelKernel/Units.h"
 
@@ -34,43 +26,35 @@ double rho;
 char *fracString;
 double fraction;
 char *qString;
-const XMLCh *ref = Translate("ref");
+const XMLCh *ref = XMLString::transcode("ref");
 const XMLCh *idref;
 DOMDocument *doc = element->getOwnerDocument();
 char *toRelease;
 
-#ifndef STANDALONE_GMX
-    ServiceHandle<IMessageSvc> msgh("MessageSvc", "GeoModelXml");
-    MsgStream log(&(*msgh), "GeoModelXml");
-#endif
+    OUTPUT_STREAM;
 //
 //    Get material density scale-factor for the block of materials this one is in 
 //
     DOMNode *parent = element->getParentNode();
-    if (XMLString::compareIString(parent->getNodeName(), Translate("materials")) != 0) {
-#ifndef STANDALONE_GMX
-        log << MSG::FATAL << "Asked to make a material for non-material element. Parent element was " << 
-                             Translate(parent->getNodeName()) << "; error in gmx file; exiting" << endmsg;
-#else 
-	std::cout<<"Asked to make a material for non-material element. Parent element was " << 
-                             Translate(parent->getNodeName()) << "; error in gmx file; exiting" << std::endl;
-#endif
+    if (XMLString::compareIString(parent->getNodeName(), XMLString::transcode("materials")) != 0) {
+        msglog << MSG::FATAL << "Asked to make a material for non-material element. Parent element was " << 
+                             XMLString::transcode(parent->getNodeName()) << "; error in gmx file; exiting" << endmsg;
         exit(1);
     }
     double scaleFactor(1.0);
     DOMElement *el = dynamic_cast<DOMElement *> (parent);
-//    if (el->hasAttribute(Translate("densitysf"))) { // Guaranteed by DTD; don't recheck.
-        densitySF = Translate(el->getAttribute(Translate("densitysf")));
+//    if (el->hasAttribute(XMLString::transcode("densitysf"))) { // Guaranteed by DTD; don't recheck.
+        densitySF = XMLString::transcode(el->getAttribute(XMLString::transcode("densitysf")));
         scaleFactor = gmxUtil.evaluate(densitySF);
 //    }
 //
 //    Get my name
 //
-    name = Translate(element->getAttribute(Translate("name")));
+    name = XMLString::transcode(element->getAttribute(XMLString::transcode("name")));
 //
 //   Get my density
 //
-    density = Translate(element->getAttribute(Translate("density")));
+    density = XMLString::transcode(element->getAttribute(XMLString::transcode("density")));
     rho = gmxUtil.evaluate(density) * scaleFactor;
     XMLString::release(&density);
 //
@@ -81,30 +65,25 @@ char *toRelease;
 //
 //   Add my element contents
 //
-    DOMNodeList *elRefs = element->getElementsByTagName(Translate("elementref"));
+    DOMNodeList *elRefs = element->getElementsByTagName(XMLString::transcode("elementref"));
     int nElRefs = elRefs->getLength();
     for (int i = 0; i < nElRefs; ++i) {
         DOMElement *elRef = dynamic_cast<DOMElement *>(elRefs->item(i));
         idref = elRef->getAttribute(ref);
         DOMElement *elem = doc->getElementById(idref);
 
-        toRelease = Translate(elem->getNodeName());
+        toRelease = XMLString::transcode(elem->getNodeName());
         string nodeName(toRelease);
         XMLString::release(&toRelease);
         if (nodeName != string("element")) {
-#ifndef STANDALONE_GMX
-            log << MSG::FATAL << "Error in xml/gmx file: An elementref referenced a " << nodeName << " instead of an element." 
+            msglog << MSG::FATAL << "Error in xml/gmx file: An elementref referenced a " << nodeName << " instead of an element." 
                               << endmsg;
-#else
-	    std::cout<< "Error in xml/gmx file: An elementref referenced a " << nodeName << " instead of an element." 
-                              << std::endl;
-#endif
             exit(999); // Should do better...
         }
 
         GeoElement *geoElem = (GeoElement *) gmxUtil.tagHandler.element.process(elem, gmxUtil);
 
-        fracString = Translate(elRef->getAttribute(Translate("fraction")));
+        fracString = XMLString::transcode(elRef->getAttribute(XMLString::transcode("fraction")));
         fraction = gmxUtil.evaluate(fracString);
         XMLString::release(&fracString);
         material->add(geoElem, fraction);
@@ -112,33 +91,28 @@ char *toRelease;
 //
 //   Add my chemical contents
 //
-    DOMNodeList *chemRefs = element->getElementsByTagName(Translate("chemicalref"));
+    DOMNodeList *chemRefs = element->getElementsByTagName(XMLString::transcode("chemicalref"));
     int nChemRefs = chemRefs->getLength();
     for (int i = 0; i < nChemRefs; ++i) {
         DOMElement *chemRef = dynamic_cast<DOMElement *>(chemRefs->item(i));
         idref = chemRef->getAttribute(ref);
         DOMElement *chem = doc->getElementById(idref);
 
-        toRelease = Translate(chem->getNodeName());
+        toRelease = XMLString::transcode(chem->getNodeName());
         string nodeName(toRelease);
         XMLString::release(&toRelease);
         if (nodeName != string("chemical")) {
-#ifndef STANDALONE_GMX
-            log << MSG::FATAL << "Error in xml/gmx file: A chemref referenced a " << nodeName << " instead of a chemical." << 
+            msglog << MSG::FATAL << "Error in xml/gmx file: A chemref referenced a " << nodeName << " instead of a chemical." << 
                                   endmsg;
-#else
-	    std::cout<< "Error in xml/gmx file: A chemref referenced a " << nodeName << " instead of a chemical." << 
-                                  std::endl;
-#endif
             exit(999); // Should do better...
         }
 
-        fracString = Translate(chemRef->getAttribute(Translate("fraction")));
+        fracString = XMLString::transcode(chemRef->getAttribute(XMLString::transcode("fraction")));
         fraction = gmxUtil.evaluate(fracString);
         XMLString::release(&fracString);
 
         // Loop over chemical contents, adding each element to this material
-        DOMNodeList *chemEls = chem->getElementsByTagName(Translate("elemcontent"));
+        DOMNodeList *chemEls = chem->getElementsByTagName(XMLString::transcode("elemcontent"));
         int nChemEls = chemEls->getLength();
         vector<GeoElement *> geoElem;
         vector<double> atomicWeight;
@@ -149,24 +123,19 @@ char *toRelease;
             idref = chemEl->getAttribute(ref);
             DOMElement *elem = doc->getElementById(idref);
 
-            toRelease = Translate(elem->getNodeName());
+            toRelease = XMLString::transcode(elem->getNodeName());
             string nodeName(toRelease);
             XMLString::release(&toRelease);
             if (nodeName != string("element")) {
-#ifndef STANDALONE_GMX
-                log << MSG::FATAL << 
+                msglog << MSG::FATAL << 
                        "Error in xml/gmx file: An elementref referenced a " << nodeName << " instead of an element." << endmsg;
-#else
-		std::cout<<"Error in xml/gmx file: An elementref referenced a " << nodeName << " instead of an element." <<
-			std::endl;
-#endif
                 exit(999); // Should do better...
             }
 
             geoElem.push_back((GeoElement *) gmxUtil.tagHandler.element.process(elem, gmxUtil));
             atomicWeight.push_back(geoElem.back()->getA());
 
-            qString = Translate(chemEl->getAttribute(Translate("quantity")));
+            qString = XMLString::transcode(chemEl->getAttribute(XMLString::transcode("quantity")));
             formula.push_back(gmxUtil.evaluate(qString));
             XMLString::release(&qString);
 
@@ -180,30 +149,25 @@ char *toRelease;
 //
 //   Add my material contents
 //
-    elRefs = element->getElementsByTagName(Translate("materialref"));
+    elRefs = element->getElementsByTagName(XMLString::transcode("materialref"));
     nElRefs = elRefs->getLength();
     for (int i = 0; i < nElRefs; ++i) {
         DOMElement *elRef = dynamic_cast<DOMElement *>(elRefs->item(i));
         idref = elRef->getAttribute(ref);
         DOMElement *elem = doc->getElementById(idref);
 
-        toRelease = Translate(elem->getNodeName());
+        toRelease = XMLString::transcode(elem->getNodeName());
         string nodeName(toRelease);
         XMLString::release(&toRelease);
         if (nodeName != string("material")) {
-#ifndef STANDALONE_GMX
-            log << MSG::FATAL << 
+            msglog << MSG::FATAL << 
                    "Error in xml/gmx file: A materialref referenced a " << nodeName << " instead of a material." << endmsg;
-#else
-	    std::cout<<"Error in xml/gmx file: A materialref referenced a " << nodeName << " instead of a material." << 
-	    	std::endl;
-#endif
             exit(999); // Should do better...
         }
 
         GeoMaterial *geoMaterial = (GeoMaterial *) gmxUtil.tagHandler.material.process(elem, gmxUtil);
 
-        fracString = Translate(elRef->getAttribute(Translate("fraction")));
+        fracString = XMLString::transcode(elRef->getAttribute(XMLString::transcode("fraction")));
         fraction = gmxUtil.evaluate(fracString);
         XMLString::release(&fracString);
         material->add(geoMaterial, fraction);
diff --git a/DetectorDescription/GeoModelXml/src/MakePara.cxx b/DetectorDescription/GeoModelXml/src/MakePara.cxx
index bcb7e788d7b34d3196b65b4ee4a57557f74dac5b..e1aaef2b76e48c82cc6b633b9e9b9dab77eb57c4 100644
--- a/DetectorDescription/GeoModelXml/src/MakePara.cxx
+++ b/DetectorDescription/GeoModelXml/src/MakePara.cxx
@@ -7,7 +7,7 @@
 #include <xercesc/dom/DOM.hpp>
 #include "GeoModelKernel/RCBase.h"
 #include "GeoModelKernel/GeoPara.h"
-#include "GeoModelXml/translate.h"
+#include "xercesc/util/XMLString.hpp"
 #include "GeoModelXml/GmxUtil.h"
 
 using namespace xercesc;
@@ -21,7 +21,7 @@ double p[nParams];
 char *toRelease;
 
     for (int i = 0; i < nParams; ++i) {
-        toRelease = Translate(element->getAttribute(Translate(parName[i])));
+        toRelease = XMLString::transcode(element->getAttribute(XMLString::transcode(parName[i])));
         p[i] = gmxUtil.evaluate(toRelease);
         XMLString::release(&toRelease);
     }
diff --git a/DetectorDescription/GeoModelXml/src/MakePcon.cxx b/DetectorDescription/GeoModelXml/src/MakePcon.cxx
index a1a924c25675fef42f953d4464085efd3e148622..f333f5fddbdad46207339c20b50526d14501e5c0 100644
--- a/DetectorDescription/GeoModelXml/src/MakePcon.cxx
+++ b/DetectorDescription/GeoModelXml/src/MakePcon.cxx
@@ -8,7 +8,7 @@
 #include <xercesc/dom/DOM.hpp>
 #include "GeoModelKernel/RCBase.h"
 #include "GeoModelKernel/GeoPcon.h"
-#include "GeoModelXml/translate.h"
+#include "xercesc/util/XMLString.hpp"
 #include "GeoModelXml/GmxUtil.h"
 
 using namespace xercesc;
@@ -22,7 +22,7 @@ double p[nParams];
 char *toRelease;
 
     for (int i = 0; i < nParams; ++i) {
-        toRelease = Translate(element->getAttribute(Translate(parName[i])));
+        toRelease = XMLString::transcode(element->getAttribute(XMLString::transcode(parName[i])));
         p[i] = gmxUtil.evaluate(toRelease);
         XMLString::release(&toRelease);
     }
@@ -36,7 +36,7 @@ char *toRelease;
     double rMaxPlane = 0.;
     for (DOMNode *child = element->getFirstChild(); child != 0; child = child->getNextSibling()) {
         if (child->getNodeType() == DOMNode::ELEMENT_NODE) {
-            toRelease = Translate(child->getNodeName());
+            toRelease = XMLString::transcode(child->getNodeName());
             std::string name(toRelease);
             XMLString::release(&toRelease);
             if (name == "addplane") {
diff --git a/DetectorDescription/GeoModelXml/src/MakePgon.cxx b/DetectorDescription/GeoModelXml/src/MakePgon.cxx
index 426c373434e92a49771027703fa384122f7bb028..a57daf51291dc8d8c75c90ec78eb015d5997b4ff 100644
--- a/DetectorDescription/GeoModelXml/src/MakePgon.cxx
+++ b/DetectorDescription/GeoModelXml/src/MakePgon.cxx
@@ -8,7 +8,7 @@
 #include <xercesc/dom/DOM.hpp>
 #include "GeoModelKernel/RCBase.h"
 #include "GeoModelKernel/GeoPgon.h"
-#include "GeoModelXml/translate.h"
+#include "xercesc/util/XMLString.hpp"
 #include "GeoModelXml/GmxUtil.h"
 
 using namespace xercesc;
@@ -22,7 +22,7 @@ double p[nParams];
 char *toRelease;
 
     for (int i = 0; i < nParams; ++i) {
-        toRelease = Translate(element->getAttribute(Translate(parName[i])));
+        toRelease = XMLString::transcode(element->getAttribute(XMLString::transcode(parName[i])));
         p[i] = gmxUtil.evaluate(toRelease);
         XMLString::release(&toRelease);
     }
@@ -36,7 +36,7 @@ char *toRelease;
     double rMaxPlane = 0.;
     for (DOMNode *child = element->getFirstChild(); child != 0; child = child->getNextSibling()) {
         if (child->getNodeType() == DOMNode::ELEMENT_NODE) {
-            toRelease = Translate(child->getNodeName());
+            toRelease = XMLString::transcode(child->getNodeName());
             std::string name(toRelease);
             XMLString::release(&toRelease);
             if (name == "addplane") {
diff --git a/DetectorDescription/GeoModelXml/src/MakeRotation.cxx b/DetectorDescription/GeoModelXml/src/MakeRotation.cxx
index 6c88dfa3311b98f10a28392e9905a9dd583ca84b..db97f3f0159be6d74f89d148e3e23be5ec59c265 100644
--- a/DetectorDescription/GeoModelXml/src/MakeRotation.cxx
+++ b/DetectorDescription/GeoModelXml/src/MakeRotation.cxx
@@ -6,10 +6,10 @@
 #include <xercesc/dom/DOM.hpp>
 //  #include <CLHEP/Geometry/Transform3D.h>
 //  #include <CLHEP/Geometry/Vector3D.h>
-#include "GeoModelXml/translate.h"
+#include "GeoModelKernel/GeoDefinitions.h"
+#include "xercesc/util/XMLString.hpp"
 #include "GeoModelXml/GmxUtil.h"
 
-
 MakeRotation::MakeRotation() {}
 
 using namespace xercesc;
@@ -23,7 +23,7 @@ double p[nParams];
 char *toRelease;
 
     for (int i = 0; i < nParams; ++i) {
-        toRelease = Translate(rotation->getAttribute(Translate(parName[i])));
+        toRelease = XMLString::transcode(rotation->getAttribute(XMLString::transcode(parName[i])));
         p[i] = gmxUtil.evaluate(toRelease);
         XMLString::release(&toRelease);
     }
@@ -31,4 +31,5 @@ char *toRelease;
     temp = GeoTrf::AngleAxis3D(p[0], GeoTrf::Vector3D(p[1], p[2], p[3]));
 
     return temp;
+
 }
diff --git a/DetectorDescription/GeoModelXml/src/MakeShaperef.cxx b/DetectorDescription/GeoModelXml/src/MakeShaperef.cxx
index 55ed872cfa8268dc187fbedb964ef2fe15db4493..32f4f9f94f2c1379a103b460e5eb305642dc9d49 100644
--- a/DetectorDescription/GeoModelXml/src/MakeShaperef.cxx
+++ b/DetectorDescription/GeoModelXml/src/MakeShaperef.cxx
@@ -6,19 +6,11 @@
 //    Process transformationref items: basically, just find the referenced transform and call its processor.
 //
 #include "GeoModelXml/shape/MakeShaperef.h"
-
-#ifndef STANDALONE_GMX
-#include "GaudiKernel/ServiceHandle.h"
-#include "GaudiKernel/MsgStream.h"
-#include "GaudiKernel/IMessageSvc.h"
-#else
-#include <iostream>
-#endif
-
+#include "GeoModelXml/OutputDirector.h"
 #include <string>
 #include <xercesc/dom/DOM.hpp>
 #include "GeoModelXml/GmxUtil.h"
-#include "GeoModelXml/translate.h"
+#include "xercesc/util/XMLString.hpp"
 
 using namespace std;
 using namespace xercesc;
@@ -27,30 +19,23 @@ const RCBase *MakeShaperef::process(const DOMElement *element, GmxUtil &gmxUtil)
 //
 //    Get the referenced shape
 //
-    const XMLCh *idref = element->getAttribute(Translate("ref"));
+    const XMLCh *idref = element->getAttribute(XMLString::transcode("ref"));
     DOMDocument *doc = element->getOwnerDocument();
     DOMElement *shape = doc->getElementById(idref);
 //
 //    Check it is the right sort: it's parent should be a shapes
 //
     DOMNode *parent = shape->getParentNode();
-    if (XMLString::compareIString(parent->getNodeName(), Translate("shapes")) != 0) {
-#ifndef STANDALONE_GMX
-        ServiceHandle<IMessageSvc> msgh("MessageSvc", "GeoModelXml");
-        MsgStream log(&(*msgh), "GeoModelXml");
-        log << MSG::FATAL << "Error processing <shaperef> tag: An IDREF for a shape did not refer to a shape.\nShape ref was " << 
+    if (XMLString::compareIString(parent->getNodeName(), XMLString::transcode("shapes")) != 0) {
+        OUTPUT_STREAM;
+        msglog << MSG::FATAL << "Error processing <shaperef> tag: An IDREF for a shape did not refer to a shape.\nShape ref was " << 
                idref << "; exiting" << endmsg;
-#else
-	std::cout<< "Error processing <shaperef> tag: An IDREF for a shape did not refer to a shape.\nShape ref was " << 
-               idref << "; exiting" << std::endl;
-#endif
-
         exit (1); // Need to improve...
     }
 //
 //    Get what sort of shape
 //
-    char *toRelease = Translate(shape->getNodeName());
+    char *toRelease = XMLString::transcode(shape->getNodeName());
     string tag(toRelease);
     XMLString::release(&toRelease);
 //
diff --git a/DetectorDescription/GeoModelXml/src/MakeSimplePolygonBrep.cxx b/DetectorDescription/GeoModelXml/src/MakeSimplePolygonBrep.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..3150a3dd0b99e210c755ec3cfad7d1ce6dc25158
--- /dev/null
+++ b/DetectorDescription/GeoModelXml/src/MakeSimplePolygonBrep.cxx
@@ -0,0 +1,74 @@
+/*
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+*/
+#include <string>
+#include <vector>
+#include <sstream>
+#include <stdexcept>
+
+#include "GeoModelXml/OutputDirector.h"
+
+#include "GeoModelXml/shape/MakeSimplePolygonBrep.h"
+#include <xercesc/dom/DOM.hpp>
+#include "GeoModelKernel/RCBase.h"
+#include "GeoModelKernel/GeoSimplePolygonBrep.h"
+#include "xercesc/util/XMLString.hpp"
+#include "GeoModelXml/GmxUtil.h"
+using namespace xercesc;
+
+MakeSimplePolygonBrep::MakeSimplePolygonBrep() {}
+
+const RCBase * MakeSimplePolygonBrep::make(const xercesc::DOMElement *element, GmxUtil &gmxUtil) const {
+const int nParams = 3; 
+char const *parName[nParams] = {"xpoints", "ypoints", "zhalflength"};
+double z;
+std::vector <double> x;
+std::vector <double> y;
+
+char *toRelease;
+
+    toRelease = XMLString::transcode(element->getAttribute(XMLString::transcode(parName[0])));
+    std::string xPoints(toRelease);
+    XMLString::release(&toRelease);
+
+    toRelease = XMLString::transcode(element->getAttribute(XMLString::transcode(parName[1])));
+    std::string yPoints(toRelease);
+    XMLString::release(&toRelease);
+
+    toRelease = XMLString::transcode(element->getAttribute(XMLString::transcode(parName[2])));
+    z = gmxUtil.evaluate(toRelease);
+    XMLString::release(&toRelease);
+
+    GeoSimplePolygonBrep * poly = new GeoSimplePolygonBrep(z);
+
+    std::istringstream xSS(xPoints);
+    while (!xSS.eof()) {
+        std::string upToNextComma;
+        getline( xSS, upToNextComma, ';' );
+        x.push_back(gmxUtil.evaluate(upToNextComma.c_str()));
+    }
+
+    std::istringstream ySS(yPoints);
+    while (!ySS.eof()) {
+        std::string upToNextComma;
+        getline( ySS, upToNextComma, ';' );
+        y.push_back(gmxUtil.evaluate(upToNextComma.c_str()));
+    }
+
+    int nx = x.size();
+    int ny = y.size();
+  
+    if (nx < 3 || ny < 3 || nx != ny) {
+        OUTPUT_STREAM;
+        msglog << MSG::ERROR << "MakeSimplePolygonBrep: Bad xpoints and/or ypoints\n";
+        throw std::runtime_error(std::string("MakeSimplePolygonBrep: Unequal number of x and y points, or less than 3\n\n") +
+         "xpoints was:\n" + xPoints + "\nypoints was:\n" + yPoints + "\n\n");
+    }
+
+    for (int i = 0; i < nx; ++i) {
+        poly->addVertex(x[i], y[i]);
+    }
+
+    return poly;
+
+}
diff --git a/DetectorDescription/GeoModelXml/src/MakeSubtraction.cxx b/DetectorDescription/GeoModelXml/src/MakeSubtraction.cxx
index a2982ccff830ab2ceca4933d86d60f416f2d938d..699af4a9c7cbfb393be3dd61b14d86d934308c83 100644
--- a/DetectorDescription/GeoModelXml/src/MakeSubtraction.cxx
+++ b/DetectorDescription/GeoModelXml/src/MakeSubtraction.cxx
@@ -5,23 +5,16 @@
 // Automatically generated code from /home/hessey/prog/gmx2geo/makeshape
 // Then heavily modified
 #include "GeoModelXml/shape/MakeSubtraction.h"
-
-#ifndef STANDALONE_GMX
-#include "GaudiKernel/ServiceHandle.h"
-#include "GaudiKernel/MsgStream.h"
-#include "GaudiKernel/IMessageSvc.h"
-#else
-#include <iostream>
-#endif
-
+#include "GeoModelXml/OutputDirector.h"
 #include <string>
 #include <xercesc/dom/DOM.hpp>
 //   #include <CLHEP/Geometry/Transform3D.h>
+#include "GeoModelKernel/GeoDefinitions.h"
 #include "GeoModelKernel/RCBase.h"
 #include "GeoModelKernel/GeoShape.h"
 #include "GeoModelKernel/GeoTransform.h"
 
-#include "GeoModelXml/translate.h"
+#include "xercesc/util/XMLString.hpp"
 #include "GeoModelXml/GmxUtil.h"
 
 using namespace xercesc;
@@ -33,11 +26,9 @@ const RCBase * MakeSubtraction::make(const xercesc::DOMElement *element, GmxUtil
 // 
 //    Process child elements; first is first shaperef; then transformation; then second shaperef.
 //
-    typedef Eigen::Affine3d Transform3D;
-
     GeoShape *first = 0;
     GeoShape *second = 0;
-    Transform3D hepXf=Transform3D::Identity();
+    GeoTrf::Transform3D hepXf=GeoTrf::Transform3D::Identity();
     int elementIndex = 0;
     for (DOMNode *child = element->getFirstChild(); child != 0; child = child->getNextSibling()) {
         if (child->getNodeType() == DOMNode::ELEMENT_NODE) { // Skips text nodes
@@ -47,7 +38,7 @@ const RCBase * MakeSubtraction::make(const xercesc::DOMElement *element, GmxUtil
                     break;
                 }
                 case 1: { // Second element is transformation or transformationref
-                    char *toRelease = Translate(child->getNodeName());
+                    char *toRelease = XMLString::transcode(child->getNodeName());
                     string nodeName(toRelease);
                     XMLString::release(&toRelease);
                     GeoTransform *geoXf = nodeName == "transformation"? 
@@ -61,13 +52,8 @@ const RCBase * MakeSubtraction::make(const xercesc::DOMElement *element, GmxUtil
                     break;
                 }
                 default: // More than 3 elements?
-#ifndef STANDALONE_GMX
-                    ServiceHandle<IMessageSvc> msgh("MessageSvc", "GeoModelXml");
-                    MsgStream log(&(*msgh), "GeoModelXml");
-                    log << MSG::FATAL  << "MakeSubtraction: Incompatible DTD? got more than 3 child elements" << endmsg;
-#else
-		    std::cout<<"MakeSubtraction: Incompatible DTD? got more than 3 child elements" << std::endl;
-#endif
+                    OUTPUT_STREAM;
+                    msglog << MSG::FATAL  << "MakeSubtraction: Incompatible DTD? got more than 3 child elements" << endmsg;
             }
             elementIndex++;
         }
diff --git a/DetectorDescription/GeoModelXml/src/MakeTransformation.cxx b/DetectorDescription/GeoModelXml/src/MakeTransformation.cxx
index 1a154a724309b300110d22b3faf729d4f041ba78..fcba4039d8ece7b50ae650a2d69a0b59cea71e53 100644
--- a/DetectorDescription/GeoModelXml/src/MakeTransformation.cxx
+++ b/DetectorDescription/GeoModelXml/src/MakeTransformation.cxx
@@ -8,10 +8,10 @@
 #include "GeoModelKernel/RCBase.h"
 #include "GeoModelKernel/GeoTransform.h"
 #include "GeoModelKernel/GeoAlignableTransform.h"
-#include "GeoModelXml/translate.h"
+#include "xercesc/util/XMLString.hpp"
 #include "GeoModelXml/GmxUtil.h"
 
-#include <Eigen/Dense>
+#include "GeoModelKernel/GeoDefinitions.h"
 
 using namespace xercesc;
 using namespace std;
@@ -20,14 +20,13 @@ MakeTransformation::MakeTransformation() {}
 
 const RCBase * MakeTransformation::make(const xercesc::DOMElement *element, GmxUtil &gmxUtil) const {
 char *name2release;
-typedef Eigen::Affine3d Transform3D;
- Transform3D hepTransform=Transform3D::Identity(); // Starts as Identity transform
+ GeoTrf::Transform3D hepTransform=GeoTrf::Transform3D::Identity(); // Starts as Identity transform
 //
 //   Add my element contents
 //
     for (DOMNode *child = element->getFirstChild(); child != 0; child = child->getNextSibling()) {
         if (child->getNodeType() == DOMNode::ELEMENT_NODE) {
-            name2release = Translate(child->getNodeName());
+            name2release = XMLString::transcode(child->getNodeName());
             string name(name2release);
             DOMElement *el = dynamic_cast<DOMElement *>(child);
             if (name == string("translation")) {
@@ -47,7 +46,7 @@ typedef Eigen::Affine3d Transform3D;
 //
 //    Create and return GeoModel transform
 //
-    char *toRelease = Translate(element->getAttribute(Translate("alignable")));
+    char *toRelease = XMLString::transcode(element->getAttribute(XMLString::transcode("alignable")));
     string alignable(toRelease);
     XMLString::release(&toRelease);
     if (alignable.compare(string("true")) == 0) {
diff --git a/DetectorDescription/GeoModelXml/src/MakeTransformationref.cxx b/DetectorDescription/GeoModelXml/src/MakeTransformationref.cxx
index e4d9e7278a034e1571b53d5e970e2e7b0efe6e52..a424e36a893cd445043bb7dd8501d04f5d5af5a2 100644
--- a/DetectorDescription/GeoModelXml/src/MakeTransformationref.cxx
+++ b/DetectorDescription/GeoModelXml/src/MakeTransformationref.cxx
@@ -6,26 +6,18 @@
 //    Process transformationref items: basically, just find the referenced transform and call its processor.
 //
 #include "GeoModelXml/MakeTransformationref.h"
-
-#ifndef STANDALONE_GMX
-#include "GaudiKernel/ServiceHandle.h"
-#include "GaudiKernel/MsgStream.h"
-#include "GaudiKernel/IMessageSvc.h"
-#else
-#include <iostream>
-#endif
-
+#include "GeoModelXml/OutputDirector.h"
 #include <string>
 #include <xercesc/dom/DOM.hpp>
 #include "GeoModelXml/GmxUtil.h"
 #include "GeoModelXml/GeoNodeList.h"
-#include "GeoModelXml/translate.h"
+#include "xercesc/util/XMLString.hpp"
 
 using namespace std;
 using namespace xercesc;
 
 const RCBase *MakeTransformationref::make(const DOMElement *element, GmxUtil &gmxUtil) const {
-const XMLCh *ref = Translate("ref");
+const XMLCh *ref = XMLString::transcode("ref");
 const XMLCh *idref;
 DOMDocument *doc = element->getOwnerDocument();
 char *toRelease;
@@ -37,19 +29,13 @@ char *toRelease;
 //
 //    Check it is the right sort
 //
-    toRelease = Translate(elem->getNodeName());
+    toRelease = XMLString::transcode(elem->getNodeName());
     string nodeName(toRelease);
     XMLString::release(&toRelease);
     if (nodeName != string("transformation")) {
-#ifndef STANDALONE_GMX
-        ServiceHandle<IMessageSvc> msgh("MessageSvc", "GeoModelXml");
-        MsgStream log(&(*msgh), "GeoModelXml");
-        log << MSG::FATAL << "Error in xml/gmx file: transformationref " << Translate(idref) << " referenced a " << nodeName << 
+        OUTPUT_STREAM;
+        msglog << MSG::FATAL << "Error in xml/gmx file: transformationref " << XMLString::transcode(idref) << " referenced a " << nodeName << 
                 " instead of a transformation." << endmsg;
-#else
-	std::cout<<"Error in xml/gmx file: transformationref " << Translate(idref) << " referenced a " << nodeName << 
-                " instead of a transformation." <<std::endl;
-#endif
         exit(999); // Should do better...
     }
 //
diff --git a/DetectorDescription/GeoModelXml/src/MakeTranslation.cxx b/DetectorDescription/GeoModelXml/src/MakeTranslation.cxx
index d0de25a58c5b9e495b80f0778b06968be13a3820..7068dd222ffb8f1cfa57fe1c185eb8b26ba16235 100644
--- a/DetectorDescription/GeoModelXml/src/MakeTranslation.cxx
+++ b/DetectorDescription/GeoModelXml/src/MakeTranslation.cxx
@@ -6,7 +6,7 @@
 #include <xercesc/dom/DOM.hpp>
 //#include <CLHEP/Geometry/Transform3D.h>
 //#include <CLHEP/Geometry/Vector3D.h>
-#include "GeoModelXml/translate.h"
+#include "xercesc/util/XMLString.hpp"
 #include "GeoModelXml/GmxUtil.h"
 
 #include "GeoModelKernel/GeoDefinitions.h"
@@ -24,10 +24,9 @@ double p[nParams];
 char *toRelease;
 
     for (int i = 0; i < nParams; ++i) {
-        toRelease = Translate(translation->getAttribute(Translate(parName[i])));
+        toRelease = XMLString::transcode(translation->getAttribute(XMLString::transcode(parName[i])));
         p[i] = gmxUtil.evaluate(toRelease);
         XMLString::release(&toRelease);
     }
-    GeoTrf::Translate3D temp(p[0], p[1], p[2]);
-    return temp;
+    return GeoTrf::Translate3D(p[0], p[1], p[2]);
 }
diff --git a/DetectorDescription/GeoModelXml/src/MakeTrap.cxx b/DetectorDescription/GeoModelXml/src/MakeTrap.cxx
index 78f77aa0fec39c4a5efa4711b35fa433b0d43cee..c7c64b3eb5833b195c5eaf3dc4fd6ff9a9fc2f89 100644
--- a/DetectorDescription/GeoModelXml/src/MakeTrap.cxx
+++ b/DetectorDescription/GeoModelXml/src/MakeTrap.cxx
@@ -7,7 +7,7 @@
 #include <xercesc/dom/DOM.hpp>
 #include "GeoModelKernel/RCBase.h"
 #include "GeoModelKernel/GeoTrap.h"
-#include "GeoModelXml/translate.h"
+#include "xercesc/util/XMLString.hpp"
 #include "GeoModelXml/GmxUtil.h"
 
 using namespace xercesc;
@@ -21,7 +21,7 @@ double p[nParams];
 char *toRelease;
 
     for (int i = 0; i < nParams; ++i) {
-        toRelease = Translate(element->getAttribute(Translate(parName[i])));
+        toRelease = XMLString::transcode(element->getAttribute(XMLString::transcode(parName[i])));
         p[i] = gmxUtil.evaluate(toRelease);
         XMLString::release(&toRelease);
     }
diff --git a/DetectorDescription/GeoModelXml/src/MakeTrd.cxx b/DetectorDescription/GeoModelXml/src/MakeTrd.cxx
index 668154a06566bd85b1cfb9fc4d0c02abea2bab5b..afe9dd86a33b0f1c5eb78ba8f6cba940bc2d0347 100644
--- a/DetectorDescription/GeoModelXml/src/MakeTrd.cxx
+++ b/DetectorDescription/GeoModelXml/src/MakeTrd.cxx
@@ -7,7 +7,7 @@
 #include <xercesc/dom/DOM.hpp>
 #include "GeoModelKernel/RCBase.h"
 #include "GeoModelKernel/GeoTrd.h"
-#include "GeoModelXml/translate.h"
+#include "xercesc/util/XMLString.hpp"
 #include "GeoModelXml/GmxUtil.h"
 
 using namespace xercesc;
@@ -21,7 +21,7 @@ double p[nParams];
 char *toRelease;
 
     for (int i = 0; i < nParams; ++i) {
-        toRelease = Translate(element->getAttribute(Translate(parName[i])));
+        toRelease = XMLString::transcode(element->getAttribute(XMLString::transcode(parName[i])));
         p[i] = gmxUtil.evaluate(toRelease);
         XMLString::release(&toRelease);
     }
diff --git a/DetectorDescription/GeoModelXml/src/MakeTube.cxx b/DetectorDescription/GeoModelXml/src/MakeTube.cxx
index 27e318707862ac70c8a8b9374fcf4084ef04166a..b8690d063d92d65a539b3b2d769cf289510f81b8 100644
--- a/DetectorDescription/GeoModelXml/src/MakeTube.cxx
+++ b/DetectorDescription/GeoModelXml/src/MakeTube.cxx
@@ -7,7 +7,7 @@
 #include <xercesc/dom/DOM.hpp>
 #include "GeoModelKernel/RCBase.h"
 #include "GeoModelKernel/GeoTube.h"
-#include "GeoModelXml/translate.h"
+#include "xercesc/util/XMLString.hpp"
 #include "GeoModelXml/GmxUtil.h"
 
 using namespace xercesc;
@@ -21,7 +21,7 @@ double p[nParams];
 char *toRelease;
 
     for (int i = 0; i < nParams; ++i) {
-        toRelease = Translate(element->getAttribute(Translate(parName[i])));
+        toRelease = XMLString::transcode(element->getAttribute(XMLString::transcode(parName[i])));
         p[i] = gmxUtil.evaluate(toRelease);
         XMLString::release(&toRelease);
     }
diff --git a/DetectorDescription/GeoModelXml/src/MakeTubs.cxx b/DetectorDescription/GeoModelXml/src/MakeTubs.cxx
index b71bdaa78611ad39a46d50f75992e3f039efd95c..b0d4d79bfca7188f9ad57e7b06f1e2ee161a434c 100644
--- a/DetectorDescription/GeoModelXml/src/MakeTubs.cxx
+++ b/DetectorDescription/GeoModelXml/src/MakeTubs.cxx
@@ -7,7 +7,7 @@
 #include <xercesc/dom/DOM.hpp>
 #include "GeoModelKernel/RCBase.h"
 #include "GeoModelKernel/GeoTubs.h"
-#include "GeoModelXml/translate.h"
+#include "xercesc/util/XMLString.hpp"
 #include "GeoModelXml/GmxUtil.h"
 
 using namespace xercesc;
@@ -21,7 +21,7 @@ double p[nParams];
 char *toRelease;
 
     for (int i = 0; i < nParams; ++i) {
-        toRelease = Translate(element->getAttribute(Translate(parName[i])));
+        toRelease = XMLString::transcode(element->getAttribute(XMLString::transcode(parName[i])));
         p[i] = gmxUtil.evaluate(toRelease);
         XMLString::release(&toRelease);
     }
diff --git a/DetectorDescription/GeoModelXml/src/MakeUnion.cxx b/DetectorDescription/GeoModelXml/src/MakeUnion.cxx
index f28be31d17598fa76fce4579c0878c34aac0c5f9..d23afc4ffe60ca12ce28bdfec01d5527e397e4a4 100644
--- a/DetectorDescription/GeoModelXml/src/MakeUnion.cxx
+++ b/DetectorDescription/GeoModelXml/src/MakeUnion.cxx
@@ -4,15 +4,7 @@
 
 #include "GeoModelXml/shape/MakeUnion.h"
 #include <string>
-
-#ifndef STANDALONE_GMX
-#include "GaudiKernel/ServiceHandle.h"
-#include "GaudiKernel/MsgStream.h"
-#include "GaudiKernel/IMessageSvc.h"
-#else
-#include <iostream>
-#endif
-
+#include "GeoModelXml/OutputDirector.h"
 #include <xercesc/dom/DOM.hpp>
 //   #include <CLHEP/Geometry/Transform3D.h>
 #include "GeoModelKernel/RCBase.h"
@@ -20,7 +12,7 @@
 #include "GeoModelKernel/GeoTransform.h"
 #include "GeoModelKernel/GeoDefinitions.h"
 
-#include "GeoModelXml/translate.h"
+#include "xercesc/util/XMLString.hpp"
 #include "GeoModelXml/GmxUtil.h"
 
 using namespace xercesc;
@@ -44,7 +36,7 @@ const RCBase * MakeUnion::make(const xercesc::DOMElement *element, GmxUtil &gmxU
                     break;
                 }
                 case 1: { // Second element is transformation or transformationref
-                    char *toRelease = Translate(child->getNodeName());
+                    char *toRelease = XMLString::transcode(child->getNodeName());
                     string nodeName(toRelease);
                     XMLString::release(&toRelease);
                     GeoTransform *geoXf = nodeName == "transformation"? 
@@ -58,13 +50,8 @@ const RCBase * MakeUnion::make(const xercesc::DOMElement *element, GmxUtil &gmxU
                     break;
                 }
                 default: // More than 3 elements?
-#ifndef STANDALONE_GMX
-                    ServiceHandle<IMessageSvc> msgh("MessageSvc", "GeoModelXml");
-                    MsgStream log(&(*msgh), "GeoModelXml");
-                    log << MSG::FATAL << "MakeUnion: Incompatible DTD? got more than 3 child elements" << endmsg;
-#else
-		    std::cout<<"MakeUnion: Incompatible DTD? got more than 3 child elements" << std::endl;
-#endif
+                    OUTPUT_STREAM;
+                    msglog << MSG::FATAL << "MakeUnion: Incompatible DTD? got more than 3 child elements" << endmsg;
             }
             elementIndex++;
         }
diff --git a/DetectorDescription/GeoModelXml/src/MulticopyProcessor.cxx b/DetectorDescription/GeoModelXml/src/MulticopyProcessor.cxx
index 6abdd3073910fa0145c00bd09b1c9694cf30db8f..b579b5199c24631ecfd90fbfe0b0df07bbfc96af 100644
--- a/DetectorDescription/GeoModelXml/src/MulticopyProcessor.cxx
+++ b/DetectorDescription/GeoModelXml/src/MulticopyProcessor.cxx
@@ -21,14 +21,7 @@
 //
 #include "GeoModelXml/MulticopyProcessor.h"
 
-#ifndef STANDALONE_GMX
-#include "GaudiKernel/ServiceHandle.h"
-#include "GaudiKernel/MsgStream.h"
-#include "GaudiKernel/IMessageSvc.h"
-#else
-#include <iostream>
-#endif
-
+#include "GeoModelXml/OutputDirector.h"
 #include <sstream>
 #include <string>
 #include <cstdlib>
@@ -38,9 +31,8 @@
 #include "GeoModelKernel/GeoVFullPhysVol.h"
 #include "GeoModelKernel/GeoNameTag.h"
 #include "GeoModelKernel/GeoDefinitions.h"
-//  #include <CLHEP/Geometry/Transform3D.h>
 
-#include "GeoModelXml/translate.h"
+#include "xercesc/util/XMLString.hpp"
 #include "GeoModelXml/GeoNodeList.h"
 #include "GeoModelXml/ProcessorRegistry.h"
 #include "GeoModelXml/GmxUtil.h"
@@ -51,27 +43,24 @@ using namespace std;
 
 void MulticopyProcessor::process(const DOMElement *element, GmxUtil &gmxUtil, GeoNodeList &toAdd) {
 char *toRelease;
-const XMLCh *ref = Translate("ref");
+const XMLCh *ref = XMLString::transcode("ref");
 const XMLCh *idref;
 DOMDocument *doc = element->getOwnerDocument();
 
-#ifndef STANDALONE_GMX
-    ServiceHandle<IMessageSvc> msgh("MessageSvc", "GeoModelXml");
-    MsgStream log(&(*msgh), "GeoModelXml");
-#endif
+    OUTPUT_STREAM;
 
-    bool alignable = element->hasAttribute(Translate("alignable"));
+    bool alignable = element->hasAttribute(XMLString::transcode("alignable"));
 //
 //    How many copies?
 //
     int nCopies;
-    toRelease = Translate(element->getAttribute(Translate("n")));
+    toRelease = XMLString::transcode(element->getAttribute(XMLString::transcode("n")));
     nCopies = gmxUtil.evaluate(toRelease);
     XMLString::release(&toRelease);
 //
 //    See if it is in the map; if so, xfList is already done. If not, fill xfList.
 //
-    toRelease = Translate(element->getAttribute(Translate("name")));
+    toRelease = XMLString::transcode(element->getAttribute(XMLString::transcode("name")));
     string name(toRelease);
     XMLString::release(&toRelease);
     map<string, GeoNodeList>::iterator entry;
@@ -86,22 +75,16 @@ DOMDocument *doc = element->getOwnerDocument();
 //    Loopvar Variable name
 //
         string varname, firstElement;
-        bool hasVarname = (element->getAttributeNode(Translate("loopvar")) != 0);
+        bool hasVarname = (element->getAttributeNode(XMLString::transcode("loopvar")) != 0);
         if (hasVarname) {
-            toRelease = Translate(element->getAttribute(Translate("loopvar")));
+            toRelease = XMLString::transcode(element->getAttribute(XMLString::transcode("loopvar")));
             varname = toRelease;
             XMLString::release(&toRelease);
             // Check it is a vector
             firstElement = varname + "_0";
             if (!gmxUtil.eval.findVariable(firstElement.c_str())) {
-#ifndef STANDALONE_GMX
-                log << MSG::FATAL << "Error in .gmx file. Processing multicopy element with name " << name << 
+                msglog << MSG::FATAL << "Error in .gmx file. Processing multicopy element with name " << name << 
                 ". Found loopvar set to " << varname << ", but no vector with that name has been defined." << endmsg;
-#else
-		std::cout<< "Error in .gmx file. Processing multicopy element with name " << name << 
-                ". Found loopvar set to " << varname << ", but no vector with that name has been defined." << std::endl;
-#endif
-
                 exit(999); // Should do better
             }
         }
@@ -109,7 +92,7 @@ DOMDocument *doc = element->getOwnerDocument();
 //    Get the transformation-element
 //
         DOMElement *elXf = element->getFirstElementChild();
-        toRelease = Translate(elXf->getNodeName());
+        toRelease = XMLString::transcode(elXf->getNodeName());
         string nodeName(toRelease);
         XMLString::release(&toRelease);
         Element2GeoItem *xFormProcessor;
@@ -118,13 +101,8 @@ DOMDocument *doc = element->getOwnerDocument();
                 xFormProcessor = (Element2GeoItem *) &(gmxUtil.tagHandler.transformation);
             }
             else { // Not OK
-#ifndef STANDALONE_GMX
-                log << MSG::FATAL << "Error in .gmx file. Processing multicopy element with name " << name <<
-                ". \nIt gives loopvar therefore should have a <transformation> and not a <transformationref> (despite the DTD)\n";
-#else
-		std::cout<<"Error in .gmx file. Processing multicopy element with name " << name <<
+                msglog << MSG::FATAL << "Error in .gmx file. Processing multicopy element with name " << name <<
                 ". \nIt gives loopvar therefore should have a <transformation> and not a <transformationref> (despite the DTD)\n";
-#endif
                 exit(999); // Should do better
             }
         }
@@ -180,7 +158,7 @@ DOMDocument *doc = element->getOwnerDocument();
 //    Get object to be copied
 //
     DOMElement *object = element->getLastElementChild();
-    toRelease = Translate(object->getNodeName());
+    toRelease = XMLString::transcode(object->getNodeName());
     string nodeName(toRelease);
     XMLString::release(&toRelease);
     ElementProcessor *objectProcessor = gmxUtil.processorRegistry.find(nodeName);
@@ -199,29 +177,24 @@ DOMDocument *doc = element->getOwnerDocument();
         gmxUtil.tagHandler.assembly.zeroId(elem);
     }
     else if (nodeName == "transform") { // Object is either an assemlyref or logvolref, and there is only one of these
-        DOMNodeList *lvList = element->getElementsByTagName(Translate("logvolref"));
+        DOMNodeList *lvList = element->getElementsByTagName(XMLString::transcode("logvolref"));
         if (lvList->getLength() > 0) {
-            const XMLCh *idref =  dynamic_cast<DOMElement *> (lvList->item(0))->getAttribute(Translate("ref"));
+            const XMLCh *idref =  dynamic_cast<DOMElement *> (lvList->item(0))->getAttribute(XMLString::transcode("ref"));
             DOMElement *lv = doc->getElementById(idref);
             gmxUtil.tagHandler.logvol.zeroId(lv);
         }
         else {
-            DOMNodeList *asList = element->getElementsByTagName(Translate("assemblyref"));
+            DOMNodeList *asList = element->getElementsByTagName(XMLString::transcode("assemblyref"));
             if (asList->getLength() > 0) {
-                const XMLCh *idref =  dynamic_cast<DOMElement *> (asList->item(0))->getAttribute(Translate("ref"));
+                const XMLCh *idref =  dynamic_cast<DOMElement *> (asList->item(0))->getAttribute(XMLString::transcode("ref"));
                 DOMDocument *doc = element->getOwnerDocument();
                 DOMElement *as = doc->getElementById(idref);
                 gmxUtil.tagHandler.assembly.zeroId(as);
             }
             else {
-#ifndef STANDALONE_GMX
-                log << MSG::FATAL << 
+                msglog << MSG::FATAL << 
                     "multicopyprocessor: error in " << name << ". <transform> object was neither assemblyref nor logvolref\n"
                     << "Exiting Athena" << endmsg;
-#else
-		std::cout<<"multicopyprocessor: error in " << name << ". <transform> object was neither assemblyref nor logvolref\n"
-                    << "Exiting Athena" << std::endl;
-#endif
                 exit(999); // Should do better
             }
         }
@@ -240,7 +213,7 @@ DOMDocument *doc = element->getOwnerDocument();
 //
     int level;
     if (alignable) {
-        istringstream(Translate(element->getAttribute(Translate("alignable")))) >> level;
+        istringstream(XMLString::transcode(element->getAttribute(XMLString::transcode("alignable")))) >> level;
     }
 //
 //    Add transforms and physvols etc. to list to be added
diff --git a/DetectorDescription/GeoModelXml/src/PositionIndex.cxx b/DetectorDescription/GeoModelXml/src/PositionIndex.cxx
index 0150212f4c1d88ab9477249863f6c42469cc7fa9..162528e4d2c97ce5afb3731600c5274e6e6f0086 100644
--- a/DetectorDescription/GeoModelXml/src/PositionIndex.cxx
+++ b/DetectorDescription/GeoModelXml/src/PositionIndex.cxx
@@ -3,15 +3,7 @@
 */
 
 #include <cstdlib>
-
-#ifndef STANDALONE_GMX
-#include "GaudiKernel/ServiceHandle.h"
-#include "GaudiKernel/MsgStream.h"
-#include "GaudiKernel/IMessageSvc.h"
-#else
-#include <iostream>
-#endif
-
+#include "GeoModelXml/OutputDirector.h"
 #include <vector>
 #include <string>
 #include "ExpressionEvaluator/Evaluator.h"
@@ -106,22 +98,13 @@ void PositionIndex::indices(map<string, int> &index, Evaluator &eval) {
         string name = *n;
         index[name] = (int) eval.evaluate(m_formula[name].c_str());
         if (eval.status() != Evaluator::OK) {
-#ifndef STANDALONE_GMX
-            ServiceHandle<IMessageSvc> msgh("MessageSvc", "GeoModelXml");
-            MsgStream log(&(*msgh), "GeoModelXml");
-            log << MSG::FATAL <<
+            OUTPUT_STREAM;
+            msglog << MSG::FATAL <<
                    "GeoModelXml Error processing Evaluator expression for PositionIndex. Error name " <<
                     eval.error_name() << endl << "Message: ";
             eval.print_error();
-            log << m_formula[name] << endl << string(eval.error_position(), '-') << '^' << '\n' << "Exiting program." << 
+            msglog << m_formula[name] << endl << string(eval.error_position(), '-') << '^' << '\n' << "Exiting program." << 
                    endmsg;
-#else
-	    std::cout<<"GeoModelXml Error processing Evaluator expression for PositionIndex. Error name " <<
-                    eval.error_name() << endl << "Message: ";
-            eval.print_error();
-            std::cout << m_formula[name] << endl << string(eval.error_position(), '-') << '^' << '\n' << "Exiting program." << 
-		  std::endl;
-#endif
             exit(999); // Should do better...
         }
 //
diff --git a/DetectorDescription/GeoModelXml/src/StrictErrorHandler.cxx b/DetectorDescription/GeoModelXml/src/StrictErrorHandler.cxx
index e8ee0ed8ee0180e00ab348616f1b578469e23daf..49be4a154ea2b2b7c6b29a391004401ce33410e4 100644
--- a/DetectorDescription/GeoModelXml/src/StrictErrorHandler.cxx
+++ b/DetectorDescription/GeoModelXml/src/StrictErrorHandler.cxx
@@ -3,64 +3,37 @@
 */
 
 #include "GeoModelXml/StrictErrorHandler.h"
-#include "GeoModelXml/translate.h"
+#include "xercesc/util/XMLString.hpp"
 #include <xercesc/dom/DOMError.hpp>
 #include <xercesc/dom/DOMLocator.hpp>
-
-#ifndef STANDALONE_GMX
-#include "GaudiKernel/ServiceHandle.h"
-#include "GaudiKernel/MsgStream.h"
-#include "GaudiKernel/IMessageSvc.h"
-#else
-#include <iostream>
-#endif
+#include "GeoModelXml/OutputDirector.h"
 
 StrictErrorHandler::StrictErrorHandler(): m_SawErrors(false) {}
 StrictErrorHandler::~StrictErrorHandler() {}
 
+using namespace xercesc;
+
 bool StrictErrorHandler::handleError(const xercesc::DOMError &domError) {
 
-#ifndef STANDALONE_GMX
-    ServiceHandle<IMessageSvc> msgh("MessageSvc", "GeoModelXml");
-    MsgStream log(&(*msgh), "GeoModelXml");
-    log << MSG::ERROR << "StrictErrorHandler: Handle an error\n";
-#else
-    std::cout << "StrictErrorHandler: Handle an error\n";
-#endif
+    OUTPUT_STREAM;
+    msglog << MSG::ERROR << "StrictErrorHandler: Handle an error\n";
 
     m_SawErrors = true;
 
     switch (domError.getSeverity()) {
     case (xercesc::DOMError::DOM_SEVERITY_WARNING):
-#ifndef STANDALONE_GMX
-        log << "\nWarning at file \n";
-#else
-	std::cout<< "\nWarning at file \n";
-#endif
+        msglog << "\nWarning at file \n";
         break;
     case (xercesc::DOMError::DOM_SEVERITY_ERROR):
-#ifndef STANDALONE_GMX
-        log << "\nError at file \n";
-#else
-	std::cout<< "\nError at file \n";
-#endif
+        msglog << "\nError at file \n";
         break;
     default:
-#ifndef STANDALONE_GMX
-        log << "\nFatal Error at file \n";
-    }
-    log << Translate(domError.getLocation()->getURI())
-         << ", line " << domError.getLocation()->getLineNumber()
-         << ", char " << domError.getLocation()->getColumnNumber()
-         << "\n  Message: " << Translate(domError.getMessage()) << endmsg;
-#else
-    std::cout << "\nFatal Error at file \n";
+        msglog << "\nFatal Error at file \n";
     }
-    std::cout << Translate(domError.getLocation()->getURI())
+    msglog << XMLString::transcode(domError.getLocation()->getURI())
          << ", line " << domError.getLocation()->getLineNumber()
          << ", char " << domError.getLocation()->getColumnNumber()
-         << "\n  Message: " << Translate(domError.getMessage()) << std::endl;
-#endif
+         << "\n  Message: " << XMLString::transcode(domError.getMessage()) << endmsg;
 
     return true;
 }
diff --git a/DetectorDescription/GeoModelXml/src/TransformProcessor.cxx b/DetectorDescription/GeoModelXml/src/TransformProcessor.cxx
index 5c3e567f6a57e33b938730e05a743e6081cc5556..9f67170d1878dcd9f9ff5d10685f76d4360a9f12 100644
--- a/DetectorDescription/GeoModelXml/src/TransformProcessor.cxx
+++ b/DetectorDescription/GeoModelXml/src/TransformProcessor.cxx
@@ -22,7 +22,8 @@
 #include "GeoModelKernel/GeoVFullPhysVol.h"
 #include "GeoModelKernel/GeoAlignableTransform.h"
 #include "GeoModelXml/GmxUtil.h"
-#include "GeoModelXml/translate.h"
+#include "xercesc/util/XMLString.hpp"
+
 
 //  using namespace CLHEP;
 using namespace std;
@@ -30,13 +31,13 @@ using namespace xercesc;
 
 void TransformProcessor::process(const DOMElement *element, GmxUtil &gmxUtil, GeoNodeList &toAdd) {
 char *tagName;
-    bool alignable = element->hasAttribute(Translate("alignable"));
+    bool alignable = element->hasAttribute(XMLString::transcode("alignable"));
 //
 //    Do second element first, to find what sort of transform is needed (shape or logvol etc.?)
 //
     GeoNodeList objectsToAdd;
     DOMElement *object = element->getLastElementChild();
-    tagName = Translate(object->getTagName());
+    tagName = XMLString::transcode(object->getTagName());
     string objectName(tagName);
     gmxUtil.processorRegistry.find(objectName)->process(object, gmxUtil, objectsToAdd);
     XMLString::release(&tagName);
@@ -44,7 +45,7 @@ char *tagName;
 //    Get the transformation
 //
     DOMElement *transformation = element->getFirstElementChild();
-    tagName = Translate(transformation->getTagName()); // transformation or transformationref
+    tagName = XMLString::transcode(transformation->getTagName()); // transformation or transformationref
 //  ******* Should check here that an alignable transform is given an alignable transformation and object; to be done
     toAdd.push_back((GeoGraphNode *)gmxUtil.geoItemRegistry.find(string(tagName))->process(transformation, gmxUtil));
     XMLString::release(&tagName);
@@ -53,7 +54,7 @@ char *tagName;
 //
     if (alignable) { 
         int level;
-        istringstream(Translate(element->getAttribute(Translate("alignable")))) >> level;
+        istringstream(XMLString::transcode(element->getAttribute(XMLString::transcode("alignable")))) >> level;
 	//cout << "\nTransformProcessor: Add Alignable named " << ((GeoNameTag *) objectsToAdd[0])->getName() << " with GeoModel id " << 
         //((GeoIdentifierTag *) objectsToAdd[1])->getIdentifier() << endl; // commenting out this cout, as it is spamming all ITk jobs with tens of thousands of lines of output
         map<string, int> index;
diff --git a/DetectorDescription/GeoModelXml/src/TransformrefProcessor.cxx b/DetectorDescription/GeoModelXml/src/TransformrefProcessor.cxx
index b6c7c4235df1f724dfa9f65aaa7e437ee19171fc..82d351d46af36776c13bbbe4fe41055b501a0ae3 100644
--- a/DetectorDescription/GeoModelXml/src/TransformrefProcessor.cxx
+++ b/DetectorDescription/GeoModelXml/src/TransformrefProcessor.cxx
@@ -6,26 +6,18 @@
 //    Process transformref items: basically, just find the referenced transform and call its processor.
 //
 #include "GeoModelXml/TransformrefProcessor.h"
-
-#ifndef STANDALONE_GMX
-#include "GaudiKernel/ServiceHandle.h"
-#include "GaudiKernel/MsgStream.h"
-#include "GaudiKernel/IMessageSvc.h"
-#else
-#include <iostream>
-#endif
-
+#include "GeoModelXml/OutputDirector.h"
 #include <string>
 #include <xercesc/dom/DOM.hpp>
 #include "GeoModelXml/GmxUtil.h"
 #include "GeoModelXml/GeoNodeList.h"
-#include "GeoModelXml/translate.h"
+#include "xercesc/util/XMLString.hpp"
 
 using namespace std;
 using namespace xercesc;
 
 void TransformrefProcessor::process(const DOMElement *element, GmxUtil &gmxUtil, GeoNodeList &toAdd) {
-const XMLCh *ref = Translate("ref");
+const XMLCh *ref = XMLString::transcode("ref");
 const XMLCh *idref;
 DOMDocument *doc = element->getOwnerDocument();
 char *toRelease;
@@ -37,19 +29,13 @@ char *toRelease;
 //
 //    Check it is the right sort
 //
-    toRelease = Translate(elem->getNodeName());
+    toRelease = XMLString::transcode(elem->getNodeName());
     string nodeName(toRelease);
     XMLString::release(&toRelease);
     if (nodeName != "transform") {
-#ifndef STANDALONE_GMX
-        ServiceHandle<IMessageSvc> msgh("MessageSvc", "GeoModelXml");
-        MsgStream log(&(*msgh), "GeoModelXml");
-        log << MSG::FATAL<< "Error in xml/gmx file: transformref " << Translate(idref) << " referenced a " << nodeName << 
+        OUTPUT_STREAM;
+        msglog << MSG::FATAL<< "Error in xml/gmx file: transformref " << XMLString::transcode(idref) << " referenced a " << nodeName << 
                 " instead of a logvol." << endmsg;
-#else
-	std::cout <<"Error in xml/gmx file: transformref " << Translate(idref) << " referenced a " << nodeName << 
-                " instead of a logvol." << std::endl;
-#endif
         exit(999); // Should do better...
     }
 //
diff --git a/DetectorDescription/GeoModelXml/src/createdomdocument.cxx b/DetectorDescription/GeoModelXml/src/createdomdocument.cxx
index 39366f72caca71c0d1196a65eb0dd775854e5afb..2222a0186da1850f4e637f6fcd5df38a2da84f87 100644
--- a/DetectorDescription/GeoModelXml/src/createdomdocument.cxx
+++ b/DetectorDescription/GeoModelXml/src/createdomdocument.cxx
@@ -17,7 +17,7 @@
 #include <xercesc/dom/DOMImplementationLS.hpp>
 #include <xercesc/dom/DOMImplementationRegistry.hpp>
 #include "GeoModelXml/StrictErrorHandler.h"
-#include "GeoModelXml/translate.h"
+#include "xercesc/util/XMLString.hpp"
 #include <iostream>
 #include <stdexcept>
 
@@ -34,7 +34,7 @@ DOMDocument *createDOMDocument(string xmlFile, DOMLSParser *parser, unsigned int
         XMLPlatformUtils::Initialize();
     }
     catch (const xercesc::XMLException &toCatch) {
-        char *message = Translate(toCatch.getMessage());
+        char *message = XMLString::transcode(toCatch.getMessage());
         cout << "XercesC error during initialization: " << message << "\n";
         XMLString::release(&message);
         return 0;
@@ -79,7 +79,7 @@ cout << "Decompressed it\n";
             else {
                 decompressed = xmlFile;
             }
-            xmlCh = Translate(decompressed.c_str());
+            xmlCh = XMLString::transcode(decompressed.c_str());
 cout << "Transcoded it\n";
             DOMLSInput *input = impl->createLSInput();
             input->setStringData(xmlCh);            
@@ -88,7 +88,7 @@ cout << "Parsed it\n";
         }
         if (errorHandler.getSawErrors()) {
             cout << "Oh oh, saw errors. \n";
-if (flags & 0x1) cout << "\n\n\n" << Translate(xmlCh) << "\n\n\n";
+if (flags & 0x1) cout << "\n\n\n" << XMLString::transcode(xmlCh) << "\n\n\n";
             return 0;
         }
         else {
@@ -101,13 +101,13 @@ if (flags & 0x1) cout << "\n\n\n" << Translate(xmlCh) << "\n\n\n";
         }
     }
     catch (const XMLException &toCatch) {
-        char *message = Translate(toCatch.getMessage());
+        char *message = XMLString::transcode(toCatch.getMessage());
         cout << "Parse-file xml exception: \n" << message << "\n";
         XMLString::release(&message);
         return 0;
     }
     catch (const DOMException &toCatch) {
-        char *message = Translate(toCatch.msg);
+        char *message = XMLString::transcode(toCatch.msg);
         cout << "DOM exception: \n" << message << "\n";
         XMLString::release(&message);
         return 0;