diff --git a/Generators/EvgenProdTools/src/TestHepMC.cxx b/Generators/EvgenProdTools/src/TestHepMC.cxx
index de69b2dbaf6d4eebb8411f138c6f698425bc8cfb..d13dd1ec574560f04d1429d548890608fb3c7be3 100644
--- a/Generators/EvgenProdTools/src/TestHepMC.cxx
+++ b/Generators/EvgenProdTools/src/TestHepMC.cxx
@@ -5,6 +5,7 @@
 
 #include "EvgenProdTools/TestHepMC.h"
 #include "GaudiKernel/DataSvc.h"
+#include "GaudiKernal/SystemsOfUnits.h"
 #include "TruthUtils/HepMCHelpers.h"
 #include "PathResolver/PathResolver.h"
 
@@ -330,7 +331,7 @@ StatusCode TestHepMC::execute() {
       if (cmenergy < 0) ATH_MSG_WARNING("Invalid expected beam energy: " << cmenergy << " MeV");
       ++m_invalidBeamParticlesCheckRate;
     } else {
-      if (beams.first->status() != 4 || beams.second->status() != 4) {
+      if (!MC::isBeam(beams.first) || !MC::isBeam(beams.second)) {
         ATH_MSG_WARNING("Beam particles have incorrectly set status -- this generator interface should be fixed");
         ++m_beamParticleswithStatusNotFourCheckRate;
       }
@@ -338,32 +339,32 @@ StatusCode TestHepMC::execute() {
       const double sumP = beams.first->momentum().pz() + beams.second->momentum().pz();
       cmenergy = std::sqrt(sumE*sumE - sumP*sumP);
 
-      if(beams.first->pdg_id() == 1000080160 && beams.second->pdg_id() == 1000080160){//OO collisions
-          cmenergy /= 16.0; // divided by 16 for the total number of nucleons per nucleus
+      if(beams.first->pdg_id() == MC::OXYGEN && beams.second->pdg_id() == MC::OXYGEN){//OO collisions
+        cmenergy /= MC::baryonNumber(MC::OXYGEN); // divided by the total number of nucleons per nucleus
       }
-      if(beams.first->pdg_id() == 1000822080 && beams.second->pdg_id() == 1000822080){//PbPb collisions
-         cmenergy /= 208.0; // divided by 208 for the total number of nucleons per nucleus
+      if(beams.first->pdg_id() == MC::LEAD && beams.second->pdg_id() == MC::LEAD){//PbPb collisions
+        cmenergy /= MC::baryonNumber(MC::LEAD); // divided by the total number of nucleons per nucleus
       }
-      if(beams.first->pdg_id() == 1000080160 && beams.second->pdg_id() == 2212){//Op collisions
-         cmenergy = -2.0*beams.second->momentum().pz()*std::sqrt(8.0/16);
+      if(beams.first->pdg_id() == MC::OXYGEN && beams.second->pdg_id() == MC::PROTON){//Op collisions
+        cmenergy = -2.0*beams.second->momentum().pz()*std::sqrt(static_cast<double>(MC::numberOfProtons(MC::OXYGEN))/MC::baryonNumber(MC::OXYGEN));
       }
-      if(beams.first->pdg_id() == 2212 && beams.second->pdg_id() == 1000080160){//pO collisions
-         cmenergy = 2.0*beams.first->momentum().pz()*std::sqrt(8.0/16);
+      if(beams.first->pdg_id() == MC::PROTON && beams.second->pdg_id() == MC::OXYGEN){//pO collisions
+        cmenergy = 2.0*beams.first->momentum().pz()*std::sqrt(static_cast<double>(MC::numberOfProtons(MC::OXYGEN))/MC::baryonNumber(MC::OXYGEN));
       }
-      if(beams.first->pdg_id() == 1000822080 && beams.second->pdg_id() == 2212){//Pbp collisions
-         cmenergy = -2.0*beams.second->momentum().pz()*std::sqrt(82.0/208);
+      if(beams.first->pdg_id() == MC::LEAD && beams.second->pdg_id() == MC::PROTON){//Pbp collisions
+        cmenergy = -2.0*beams.second->momentum().pz()*std::sqrt(static_cast<double>(MC::numberOfProtons(MC::LEAD))/MC::baryonNumber(MC::LEAD));
       }
-      if(beams.first->pdg_id() == 2212 && beams.second->pdg_id() == 1000822080){//pPb collisions
-         cmenergy = 2.0*beams.first->momentum().pz()*std::sqrt(82.0/208);
+      if(beams.first->pdg_id() == MC::PROTON && beams.second->pdg_id() == MC::LEAD){//pPb collisions
+        cmenergy = 2.0*beams.first->momentum().pz()*std::sqrt(static_cast<double>(MC::numberOfProtons(MC::LEAD))/MC::baryonNumber(MC::LEAD));
       }
 
       if (m_cm_energy > 0 && std::abs(cmenergy - m_cm_energy) > m_cme_diff) {
-        ATH_MSG_FATAL("Beam particles have incorrect energy: " << m_cm_energy/1000. << " GeV expected, vs. " << cmenergy/1000. << " GeV found");
+        ATH_MSG_FATAL("Beam particles have incorrect energy: " << m_cm_energy/Gaudi::Units::GeV << " GeV expected, vs. " << cmenergy/Gaudi::Units::GeV << " GeV found");
         setFilterPassed(false);
         if (m_doHist){
-          m_h_beamparticle1_Energy->Fill(beams.first->momentum().e()*1.E-03);
-          m_h_beamparticle2_Energy->Fill(beams.second->momentum().e()*1.E-03);
-          m_h_cmEnergyDiff->Fill((cmenergy-m_cm_energy)*1.E-03);
+          m_h_beamparticle1_Energy->Fill(beams.first->momentum().e()/Gaudi::Units::GeV);
+          m_h_beamparticle2_Energy->Fill(beams.second->momentum().e()/Gaudi::Units::GeV);
+          m_h_cmEnergyDiff->Fill((cmenergy-m_cm_energy)/Gaudi::Units::GeV);
         }
         ++m_beamEnergyCheckRate;
         // Special case: this is so bad that we immediately fail out
@@ -447,15 +448,15 @@ StatusCode TestHepMC::execute() {
           }
 
           if (m_doHist){
-            m_h_energy_dispVtxCheck->Fill(part->momentum().e()*1e-3);
-            if (part->momentum().e()*1e-3 < 10.) {
-              m_h_energy_dispVtxCheck_lt10->Fill(part->momentum().e()*1e-3);
+            m_h_energy_dispVtxCheck->Fill(part->momentum().e()/Gaudi::Units::GeV);
+            if (part->momentum().e()/Gaudi::Units::GeV < 10.) {
+              m_h_energy_dispVtxCheck_lt10->Fill(part->momentum().e()/Gaudi::Units::GeV);
             }
             m_h_pdgid_dispVtxCheck->Fill(part->pdg_id());
             m_h_status_dispVtxCheck->Fill(part->status());
-            m_h_px_dispVtxCheck->Fill(part->momentum().px()*1e-3);
-            m_h_py_dispVtxCheck->Fill(part->momentum().py()*1e-3);
-            m_h_pz_dispVtxCheck->Fill(part->momentum().pz()*1e-3);
+            m_h_px_dispVtxCheck->Fill(part->momentum().px()/Gaudi::Units::GeV);
+            m_h_py_dispVtxCheck->Fill(part->momentum().py()/Gaudi::Units::GeV);
+            m_h_pz_dispVtxCheck->Fill(part->momentum().pz()/Gaudi::Units::GeV);
             m_h_vx_dispVtxCheck->Fill(part->end_vertex()->position().x());
             m_h_vy_dispVtxCheck->Fill(part->end_vertex()->position().y());
             m_h_vz_dispVtxCheck->Fill(part->end_vertex()->position().z());
@@ -502,7 +503,7 @@ StatusCode TestHepMC::execute() {
       } // End of check for NaNs and infinities
 
       // Check for undecayed pi0s
-      if (pstatus == 1 || pstatus == 2) {
+      if (MC::isStable(pstatus) || MC::isDecayed(pstatus)) {
         if (ppdgid == 111 && !pitr->end_vertex() ) {
           unDecPi0.push_back( pitr);
           ++m_undecayedPi0CheckRate;
@@ -510,7 +511,7 @@ StatusCode TestHepMC::execute() {
       } // End of check for undecayed pi0s
 
       //check stable particle lifetimes
-      if (pstatus == 1) {
+      if (MC::isStable(pstatus)) {
         const HepPDT::ParticleData* pd = particleData(ppdgid);
         if (pd != NULL) {
           double plifetime = pd->lifetime()*1e+12;  // why lifetime doesn't come in common units???
@@ -543,11 +544,10 @@ StatusCode TestHepMC::execute() {
       } // Test if the particle is stable
 
       //Check that stable particles are known by G4 or they are non-interacting
-      HepPDT::ParticleID pid(ppdgid);
-      int first_dig = ppdgid;
-      while (first_dig > 9) first_dig /= 10;
+      const MC::DecodedPID decodedPID(ppdgid);
+      const int first_dig = decodedPID(0);
 
-      if ((pstatus == 1 ) && (!pitr->end_vertex()) && (MC::isSimInteracting(pitr)) && (!pid.isNucleus()) && (first_dig != 9) ) {
+      if (MC::isStable(pstatus) && (!pitr->end_vertex()) && (MC::isSimInteracting(pitr)) && (!MC::isNucleus(ppdgid)) && (first_dig != 9) ) {
 
         int known_byG4 = 0;
         std::vector<int>::size_type count =0;
@@ -572,14 +572,14 @@ StatusCode TestHepMC::execute() {
       } // End of check for invalid PDG IDs
 
       // Check for unstables with no end vertex, 
-      if (!pitr->end_vertex() && pstatus == 2) {
+      if (!pitr->end_vertex() && MC::isDecayed(pstatus)) {
         unstNoEnd.push_back(pitr);
         ++m_unstableNoEndVtxCheckRate;
       } // End of check for unstable with no end vertex
 
       // Sum final state mom/energy, and note negative energy / tachyonic particles
       //     std::cout << "status " << pstatus << " e " << pmom.e() << " pz " << pmom.pz()<< std::endl;
-      if ( pstatus == 1 && !pitr->end_vertex() ) {
+      if ( MC::isStable(pstatus) && !pitr->end_vertex() ) {
         totalPx += pmom.px();
         totalPy += pmom.py();
         totalPz += pmom.pz();
@@ -598,7 +598,7 @@ StatusCode TestHepMC::execute() {
       // Decay checks (uses PdgToSearch attr value, for tau by default)
       /// @todo Clean up / improve / apply to *all* decaying species
       int tau_child = 0;
-      if (std::abs(ppdgid) == m_pdg && (pstatus == 1 || pstatus == 2)) {
+      if (std::abs(ppdgid) == m_pdg && (MC::isStable(pstatus) || MC::isDecayed(pstatus))) {
         ++m_TotalTaus;
         auto vtx = pitr->end_vertex();
         if (vtx) {
@@ -656,7 +656,7 @@ StatusCode TestHepMC::execute() {
 
       // Check for photons with non-zero masses
       /// @todo Persuade generator authors to set proper generated masses in HepMC, then *really* require mass = 0
-      if (ppdgid == 22 && pstatus == 1) {
+      if (MC::isPhoton(ppdgid) && MC::isStable(pstatus)) {
         const double mass = pitr->generated_mass();
         if (std::abs(mass) > 1.0) { // in MeV
           ATH_MSG_WARNING("Photon with non-zero mass found! Mass: " << mass << " MeV" << pitr);
@@ -683,7 +683,7 @@ StatusCode TestHepMC::execute() {
       ATH_MSG_WARNING("balance " << totalPx << " " << totalPy << " " << totalPz << " " << totalE);
       
       if (m_doHist){
-        m_h_energyImbalance->Fill(lostE*1.E-03);
+        m_h_energyImbalance->Fill(lostE/Gaudi::Units::GeV);
       }
       if (m_dumpEvent) HepMC::Print::content(std::cout,*evt);
       if (m_energyImbalanceTest) {
@@ -696,9 +696,9 @@ StatusCode TestHepMC::execute() {
     if ( std::abs(totalPx) > m_energy_diff || std::abs(totalPy) > m_energy_diff || std::abs(totalPz) > m_energy_diff ) {
       ATH_MSG_WARNING("MOMENTUM BALANCE FAILED : SumPx = " << totalPx << " SumPy = " <<  totalPy << " SumPz = " <<  totalPz << " MeV");
       if (m_doHist){
-        m_h_momentumImbalance_px->Fill(std::abs(totalPx)*1.E-03);
-        m_h_momentumImbalance_py->Fill(std::abs(totalPy)*1.E-03);
-        m_h_momentumImbalance_pz->Fill(std::abs(totalPz)*1.E-03);
+        m_h_momentumImbalance_px->Fill(std::abs(totalPx)/Gaudi::Units::GeV);
+        m_h_momentumImbalance_py->Fill(std::abs(totalPy)/Gaudi::Units::GeV);
+        m_h_momentumImbalance_pz->Fill(std::abs(totalPz)/Gaudi::Units::GeV);
       }
       if (m_dumpEvent) HepMC::Print::content(std::cout,*evt);
       if (m_momImbalanceTest) {