diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/LogvolProcessor.h b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/LogvolProcessor.h
index 8a0a28ab8e5bfab53ba4bd6e730a137314053083..2b3277554767d4fb315d63980d4b05c778aeb642 100644
--- a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/LogvolProcessor.h
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/LogvolProcessor.h
@@ -12,24 +12,21 @@
 #include <map>
 
 #include "GeoModelXml/ElementProcessor.h"
+#include "GeoModelKernel/GeoNameTag.h"
 class GmxUtil;
-class GeoNameTag;
-class GeoLogVol;
-class GeoPhysVol;
 
 class LogvolProcessor: public ElementProcessor {
 public:
-    typedef struct {
-        GeoNameTag *name;
-        int id;
-        GeoLogVol *logVol;
-        bool alignable;
-    } LogVolStore; 
+     struct LogVolStore {
+        GeoIntrusivePtr<GeoNameTag> name{};
+        int id{0};
+        GeoLogVolPtr logVol{};
+        bool alignable{false};
+    } ; 
     void process(const xercesc::DOMElement *element, GmxUtil &gmxUtil, GeoNodeList &toAdd);
     void zeroId(const xercesc::DOMElement *element);
 private:
     std::map<std::string, LogVolStore> m_map; 
-    std::map<std::string, GeoPhysVol*> m_mapPV; 
 };
 
 #endif // LOGVOL_PROCESSOR_H
diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/src/LogvolProcessor.cxx b/GeoModelTools/GeoModelXML/GeoModelXml/src/LogvolProcessor.cxx
index d6871f3a7f704082b642a0bc77042bce1c603207..baa1f73949696e42abae2e79d969edfadf3d6057 100644
--- a/GeoModelTools/GeoModelXML/GeoModelXml/src/LogvolProcessor.cxx
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/src/LogvolProcessor.cxx
@@ -35,15 +35,12 @@
 #include "GeoModelXml/GeoNodeList.h"
 #include "xercesc/util/XMLString.hpp"
 
+#include "GeoModelHelpers/throwExcept.h"
 // using namespace CLHEP;
 
 using namespace std;
 using namespace xercesc;
 
-//class GeoSerialDenominator;
-//class GeoSerialTransformer;
-//class GeoSerialIdentifier;
-
 std::string getNodeType(const GeoGraphNode* node) {
     if ( dynamic_cast<const GeoPhysVol*>(node) )
         return "GeoPhysVol";
@@ -59,19 +56,13 @@ std::string getNodeType(const GeoGraphNode* node) {
         return "GeoShape";
     if ( dynamic_cast<const GeoMaterial*>(node) )
         return "GeoMaterial";
-    //if ( dynamic_cast<const GeoSerialDenominator*>(node) )
-        //return "GeoSerialDenominator";
-    //if ( dynamic_cast<const GeoSerialIdentifier*>(node) )
-        //return "GeoSerialIdentifier";
-    //if ( dynamic_cast<const GeoSerialTransformer*>(node) )
-        //return "GeoSerialTransformer";
     if ( dynamic_cast<const GeoTransform*>(node) )
         return "GeoTransform";
     return "UnidentifiedNode";
 }
 
 void LogvolProcessor::process(const DOMElement *element, GmxUtil &gmxUtil, GeoNodeList &toAdd) {
-  GeoLogVol *lv;
+  GeoLogVolPtr lv{};
   GeoNameTag *nameTag_physChildVolName;//USed for "sensitive" PhysVols 
   GeoNameTag *nameTag_physVolName;//Actually the logVol name, which gets used for the PhysVols if they have "named" attribute (and aren't sensitive)
 
@@ -167,30 +158,30 @@ void LogvolProcessor::process(const DOMElement *element, GmxUtil &gmxUtil, GeoNo
     XMLCh * materials_tmp = XMLString::transcode("materials");
     if (XMLString::compareIString(parent->getNodeName(), materials_tmp) != 0) {
         char* material_s = XMLString::transcode (material);
-        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_s << "; exiting" << endmsg;
+        std::string materialName{material_s};
         XMLString::release (&material_s);
-        std::abort();
+        THROW_EXCEPTION("Processing logvol " << name <<
+            ". Error in gmx file. An IDREF for a logvol material did not refer to a material.\n" <<
+            "Material ref was " << materialName << "; exiting");
     }
-    std::string nam_mat=XMLString::transcode(material);
+    std::string nam_mat= XMLString::transcode(material);
 
     const GeoMaterial* matGeo = nullptr;
 
-    if (gmxUtil.matManager)
-    {
-        if (!gmxUtil.matManager->isMaterialDefined(nam_mat))
-        {
-            GeoMaterial* tempMat=static_cast<GeoMaterial *>(gmxUtil.tagHandler.material.process(refMaterial, gmxUtil));
+    if (gmxUtil.matManager) {
+        if (!gmxUtil.matManager->isMaterialDefined(nam_mat)) {
+            GeoMaterial* tempMat=dynamic_cast<GeoMaterial *>(gmxUtil.tagHandler.material.process(refMaterial, gmxUtil));
             // we let GMX create the material and store it in the MM
-
             gmxUtil.matManager->addMaterial(tempMat);
         }
         matGeo = gmxUtil.matManager->getMaterial(nam_mat);
+    } else {
+        matGeo = dynamic_cast<const GeoMaterial *>(gmxUtil.tagHandler.material.process(refMaterial, gmxUtil));
     }
-    else {
-        matGeo = static_cast<const GeoMaterial *>(gmxUtil.tagHandler.material.process(refMaterial, gmxUtil));
-    }
+
+    if (!matGeo) {
+        THROW_EXCEPTION("Cannot process "<<nam_mat);
+    }    
 //
 //    Make the LogVol and add it to the map ready for next time
 //
@@ -271,10 +262,10 @@ void LogvolProcessor::process(const DOMElement *element, GmxUtil &gmxUtil, GeoNo
 
   if (sensitive || (alignable.compare(string("true")) == 0)) {
     //msglog << MSG::DEBUG << "Handling a FullPhysVol (i.e., an 'alignable' or 'sensitive' volume) ..." << endmsg;
-    GeoFullPhysVol *pv = new GeoFullPhysVol(lv);
+    GeoFullPhysVol *pv = new GeoFullPhysVol(cacheVolume(lv));
     if (is_envelope) GeoVolumeTagCatalog::VolumeTagCatalog()->addTaggedVolume("Envelope",name,pv);
-    for (GeoNodeList::iterator node = childrenAdd.begin(); node != childrenAdd.end(); ++node) {
-	     pv->add(*node);
+    for (const auto& node : childrenAdd) {
+	     pv->add(node);
     }
     toAdd.push_back(pv); // NB: the *PV is third item added, so reference as toAdd[2].
     //
@@ -307,15 +298,15 @@ void LogvolProcessor::process(const DOMElement *element, GmxUtil &gmxUtil, GeoNo
   }
   else {
     //msglog << MSG::DEBUG << "Handling a standard PhysVol..." << endmsg;
-    GeoPhysVol *pv = new GeoPhysVol(lv);
+    GeoPhysVol *pv = new GeoPhysVol(cacheVolume(lv));
     if (is_envelope) GeoVolumeTagCatalog::VolumeTagCatalog()->addTaggedVolume("Envelope",name,pv);
     //msglog << MSG::DEBUG << "Now, looping over all the children of the LogVol (in the GMX meaning)..." << endmsg; 
-    for (GeoNodeList::iterator node = childrenAdd.begin(); node != childrenAdd.end(); ++node) {
-      pv->add(*node);
+    for (const auto & node : childrenAdd) {
+      pv->add(node);
       //msglog << MSG::DEBUG << "LVProc, PV child: " << *node << " -- " << getNodeType(*node) << endmsg;
     }
     //msglog << MSG::DEBUG << "End of loop over children." << endmsg;
-    toAdd.push_back(pv);
+    toAdd.push_back(cacheVolume(pv).get());
   }
 
   gmxUtil.positionIndex.decrementLevel();