diff --git a/Simulation/BeamEffects/src/GenEventVertexPositioner.cxx b/Simulation/BeamEffects/src/GenEventVertexPositioner.cxx
index 7aa9d98215922d3139808f00d04400d465c771f5..3604a1a0e12340c8a0c30d0a0ef3d5aa73300102 100644
--- a/Simulation/BeamEffects/src/GenEventVertexPositioner.cxx
+++ b/Simulation/BeamEffects/src/GenEventVertexPositioner.cxx
@@ -65,7 +65,7 @@ namespace Simulation
         continue;
       }
 
-      ATH_MSG_VERBOSE("Retrieved Vertex shift of: " << *curShift);
+      ATH_MSG_VERBOSE("Retrieved Vertex shift of: " << *curShift << " from " << vertexShifter->name());
 
       // As signal process vertex is a pointer, there is some risk
       // that the pointer points to a vertex somewhere else in the
@@ -86,7 +86,14 @@ namespace Simulation
       for( ; vtxIt != vtxItEnd; ++vtxIt) {
         // quick access:
         auto curVtx = (*vtxIt);
+#ifdef HEPMC3
+        // NB Doing this check to explicitly avoid the fallback mechanism in
+        // HepMC3::GenVertex::position() to return the position of
+        // another GenVertex in the event if the position isn't set (or is set to zero)!
+        const HepMC::FourVector &curPos = (curVtx->has_set_position()) ? curVtx->position() : HepMC::FourVector::ZERO_VECTOR();
+#else
         const HepMC::FourVector &curPos = curVtx->position();
+#endif
 
         // get a copy of the current vertex position
         CLHEP::HepLorentzVector newPos( curPos.x(), curPos.y(), curPos.z(), curPos.t() );
diff --git a/Simulation/BeamEffects/src/ZeroLifetimePositioner.cxx b/Simulation/BeamEffects/src/ZeroLifetimePositioner.cxx
index 475f1cb70e831a034a0fb4779f3f76f2c560be35..5e5c50e98891722814b68bc7fbe2152dac723adc 100644
--- a/Simulation/BeamEffects/src/ZeroLifetimePositioner.cxx
+++ b/Simulation/BeamEffects/src/ZeroLifetimePositioner.cxx
@@ -81,7 +81,10 @@ StatusCode Simulation::ZeroLifetimePositioner::manipulate(HepMC::GenEvent& ge, b
     if (ATH_UNLIKELY(this->msgLvl (MSG::VERBOSE))) {
       HepMC::Print::line(nextVtx);
     }
-    const HepMC::FourVector &nextVec = nextVtx->position();
+    // NB Doing this check to explicitly avoid the fallback mechanism in
+    // HepMC3::GenVertex::position() to return the position of
+    // another GenVertex in the event if the position isn't set (or is set to zero)!
+    const HepMC::FourVector &nextVec = (nextVtx->has_set_position()) ? nextVtx->position() : HepMC::FourVector::ZERO_VECTOR();
     const CLHEP::HepLorentzVector nextPos( nextVec.x(), nextVec.y(), nextVec.z(), nextVec.t() );
     ATH_MSG_VERBOSE("Current Vertex:");
     if (ATH_UNLIKELY(this->msgLvl (MSG::VERBOSE))) {
@@ -93,7 +96,10 @@ StatusCode Simulation::ZeroLifetimePositioner::manipulate(HepMC::GenEvent& ge, b
       if (ATH_UNLIKELY(this->msgLvl (MSG::VERBOSE))) {
         HepMC::Print::line(prevVtx);
       }
-      const HepMC::FourVector &prevVec = prevVtx->position();
+      // NB Doing this check to explicitly avoid the fallback mechanism in
+      // HepMC3::GenVertex::position() to return the position of
+      // another GenVertex in the event if the position isn't set (or is set to zero)!
+      const HepMC::FourVector &prevVec = (prevVtx->has_set_position()) ? prevVtx->position() : HepMC::FourVector::ZERO_VECTOR();
       const CLHEP::HepLorentzVector prevPos( prevVec.x(), prevVec.y(), prevVec.z(), prevVec.t() );
       CLHEP::HepLorentzVector newPos = 0.5*(prevPos+nextPos);
       curVtx->set_position(HepMC::FourVector(newPos.x(),newPos.y(),newPos.z(),newPos.t()));
diff --git a/Simulation/ISF/ISF_Core/ISF_Services/src/TruthSvc.cxx b/Simulation/ISF/ISF_Core/ISF_Services/src/TruthSvc.cxx
index 0e46a58985c0272eb7063fcca349b9a2eec2d390..30b80472263e37b57be98316bc2809c8d7e9f18b 100644
--- a/Simulation/ISF/ISF_Core/ISF_Services/src/TruthSvc.cxx
+++ b/Simulation/ISF/ISF_Core/ISF_Services/src/TruthSvc.cxx
@@ -267,7 +267,11 @@ void ISF::TruthSvc::recordIncidentToMCTruth( ISF::ITruthIncident& ti, bool passW
       // 2) A new GenVertex for the intermediate interaction should be
       // added.
 #ifdef HEPMC3
-      auto newVtx = HepMC::newGenVertexPtr( vtx->position(), vtx->status());
+      // NB Doing this check to explicitly avoid the fallback mechanism in
+      // HepMC3::GenVertex::position() to return the position of
+      // another GenVertex in the event if the position isn't set (or is set to zero)!
+      const HepMC::FourVector &posVec = (vtx->has_set_position()) ? vtx->position() : HepMC::FourVector::ZERO_VECTOR();
+      auto newVtx = HepMC::newGenVertexPtr( posVec, vtx->status());
       HepMC::GenEvent *mcEvent = parentBeforeIncident->parent_event();
       auto tmpVtx = newVtx;
       mcEvent->add_vertex( newVtx);
@@ -448,7 +452,14 @@ HepMC::GenVertexPtr  ISF::TruthSvc::createGenVertexFromTruthIncident( ISF::ITrut
       this->deleteChildVertex(oldVertex);
     }
     else {
+#ifdef HEPMC3
+      // NB Doing this check to explicitly avoid the fallback mechanism in
+      // HepMC3::GenVertex::position() to return the position of
+      // another GenVertex in the event if the position isn't set (or is set to zero)!
+      const HepMC::FourVector &old_pos = (oldVertex->has_set_position()) ? oldVertex->position() : HepMC::FourVector::ZERO_VECTOR();
+#else
       const auto& old_pos=oldVertex->position();
+#endif
       const auto& new_pos=ti.position();
       double diffr=std::sqrt(std::pow(new_pos.x()-old_pos.x(),2)+std::pow(new_pos.y()-old_pos.y(),2)+std::pow(new_pos.z()-old_pos.z(),2));
       //AV The comparison below is not portable.