diff --git a/Generators/EvgenJobTransforms/python/GENtoEVGEN_Skeleton.py b/Generators/EvgenJobTransforms/python/GENtoEVGEN_Skeleton.py
index 3ae10202c2de6ba01f6863ed224959af1b3814d2..21e6ce0c2bcacab12077ba620e0c371ad21f1023 100644
--- a/Generators/EvgenJobTransforms/python/GENtoEVGEN_Skeleton.py
+++ b/Generators/EvgenJobTransforms/python/GENtoEVGEN_Skeleton.py
@@ -239,7 +239,8 @@ def fromRunArgs(runArgs):
     
     # Fix non-standard event features
     from EvgenProdTools.EvgenProdToolsConfig import FixHepMCCfg
-    cfg.merge(FixHepMCCfg(flags))
+    cfg.merge(FixHepMCCfg(flags, 
+                          PurgeUnstableWithoutEndVtx = "Hijing" in sample.generators))
 
     ## Sanity check the event record (not appropriate for all generators)
     from GeneratorConfig.GenConfigHelpers import gens_testhepmc
diff --git a/Generators/EvgenJobTransforms/share/skel.GENtoEVGEN.py b/Generators/EvgenJobTransforms/share/skel.GENtoEVGEN.py
index c36845e63a50228f442c946a0808d8d5ae688d3c..e51307d748ab26906deb936e2e2684080983fa33 100644
--- a/Generators/EvgenJobTransforms/share/skel.GENtoEVGEN.py
+++ b/Generators/EvgenJobTransforms/share/skel.GENtoEVGEN.py
@@ -501,6 +501,10 @@ else:
 # Propagate DSID and seed to the generators
    include("EvgenJobTransforms/Generate_dsid_ranseed.py")
 
+## Purge unstable particle w/o end vertex occasionally produced by Hijing
+if 'Hijing' in evgenConfig.generators:
+    fixSeq.FixHepMC.PurgeUnstableWithoutEndVtx = True
+
 ## Propagate debug output level requirement to generators
 if (hasattr( runArgs, "VERBOSE") and runArgs.VERBOSE ) or (hasattr( runArgs, "loglevel") and runArgs.loglevel == "DEBUG") or (hasattr( runArgs, "loglevel") and runArgs.loglevel == "VERBOSE"):
    include("EvgenJobTransforms/Generate_debug_level.py")
diff --git a/Generators/EvgenProdTools/EvgenProdTools/FixHepMC.h b/Generators/EvgenProdTools/EvgenProdTools/FixHepMC.h
index 92cba96c3a9227c856332f43bcf541bfa34ee0bd..0e4e94819cc186858d5d12e8ac9544dc90232490 100644
--- a/Generators/EvgenProdTools/EvgenProdTools/FixHepMC.h
+++ b/Generators/EvgenProdTools/EvgenProdTools/FixHepMC.h
@@ -51,6 +51,7 @@ private:
   bool m_killLoops;   // Kill loops?
   bool m_killPDG0;    // Kill PDG0 particles?
   bool m_cleanDecays; // Clean decays?
+  bool m_purgeUnstableWithoutEndVtx; // Remove unstable particles without decay vertex?
   //@}
 
   /// @name Cleaned-particle counters
@@ -58,6 +59,7 @@ private:
   long m_loopKilled;
   long m_pdg0Killed;
   long m_decayCleaned;
+  long m_unstablePurged;
   long m_totalSeen;
   long m_replacedPIDs;
   //@}
diff --git a/Generators/EvgenProdTools/src/FixHepMC.cxx b/Generators/EvgenProdTools/src/FixHepMC.cxx
index 98733132d072f5d413ea2b71cb40ac21fe2ee69e..71aeab7092bc3051ee18c6667a70cdfeddf9c299 100644
--- a/Generators/EvgenProdTools/src/FixHepMC.cxx
+++ b/Generators/EvgenProdTools/src/FixHepMC.cxx
@@ -16,12 +16,14 @@ FixHepMC::FixHepMC(const std::string& name, ISvcLocator* pSvcLocator)
   , m_loopKilled(0)
   , m_pdg0Killed(0)
   , m_decayCleaned(0)
+  , m_unstablePurged(0)
   , m_totalSeen(0)
   , m_replacedPIDs(0)
 {
   declareProperty("KillLoops", m_killLoops = true, "Remove particles in loops?");
   declareProperty("KillPDG0", m_killPDG0 = true, "Remove particles with PDG ID 0?");
   declareProperty("CleanDecays", m_cleanDecays = true, "Clean decay chains from non-propagating particles?");
+  declareProperty("PurgeUnstableWithoutEndVtx", m_purgeUnstableWithoutEndVtx = false, "Remove unstable particles without decay vertex?");
   declareProperty("PIDmap", m_pidmap = std::map<int,int>(), "Map of PDG IDs to replace");
 }
 #ifndef HEPMC3
@@ -265,15 +267,38 @@ StatusCode FixHepMC::execute() {
       if (bad_particle) toremove.push_back(ip);
     }
 
-    // Escape here if there's nothing more to do, otherwise do the cleaning
-    if (toremove.empty()) continue;
-    ATH_MSG_DEBUG("Cleaning event record of " << toremove.size() << " bad particles");
     // Properties before cleaning
     const int num_particles_orig = evt->particles().size();
-    for (auto part: toremove) evt->remove_particle(part);
+
+    // Do the cleaning
+    if (!toremove.empty()) {
+      ATH_MSG_DEBUG("Cleaning event record of " << toremove.size() << " bad particles");
+      for (auto part: toremove) evt->remove_particle(part);
+    }
+
+    if(m_purgeUnstableWithoutEndVtx) {
+      int purged=0;
+      do {
+        purged=0;
+        const std::vector <HepMC::GenParticlePtr> allParticles=evt->particles();
+        for(auto p : allParticles) {
+          HepMC::ConstGenVertexPtr end_v=p->end_vertex();
+          if(p->status() == 2 && !end_v) {
+            evt->remove_particle(p);
+            ++purged;
+            ++m_unstablePurged;
+          } 
+        }
+      }
+      while (purged>0);
+    }
+
     const int num_particles_filt = evt->particles().size();
-     // Write out the change in the number of particles
-    ATH_MSG_INFO("Particles filtered: " << num_particles_orig << " -> " << num_particles_filt);
+
+    if(num_particles_orig!=num_particles_filt) {
+      // Write out the change in the number of particles
+      ATH_MSG_INFO("Particles filtered: " << num_particles_orig << " -> " << num_particles_filt);
+    }
  #else
 
     // Add a unit entry to the event weight vector if it's currently empty
@@ -431,10 +456,6 @@ StatusCode FixHepMC::execute() {
       if (bad_particle) toremove.push_back(*ip);
     }
 
-    // Escape here if there's nothing more to do, otherwise do the cleaning
-    if (toremove.empty()) continue;
-    ATH_MSG_DEBUG("Cleaning event record of " << toremove.size() << " bad particles");
-
     // Properties before cleaning
     const int num_particles_orig = evt->particles_size();
     int num_orphan_vtxs_orig = 0;
@@ -445,35 +466,56 @@ StatusCode FixHepMC::execute() {
       if ((*v)->particles_in_size()==0) num_noparent_vtxs_orig++;
       if ((*v)->particles_out_size()==0) num_nochild_vtxs_orig++;
     }
-    // Clean!
-    int signal_vertex_bc = evt->signal_process_vertex() ? evt->signal_process_vertex()->barcode() : 0;
-    //This is the only place where reduce is used.
-    reduce(evt , toremove);
-    if (evt->barcode_to_vertex (signal_vertex_bc) == nullptr) {
-      evt->set_signal_process_vertex (nullptr);
+
+    // Do the cleaning
+    if (!toremove.empty()) {
+      ATH_MSG_DEBUG("Cleaning event record of " << toremove.size() << " bad particles");
+      // Clean!
+      int signal_vertex_bc = evt->signal_process_vertex() ? evt->signal_process_vertex()->barcode() : 0;
+      //This is the only place where reduce is used.
+      reduce(evt , toremove);
+      if (evt->barcode_to_vertex (signal_vertex_bc) == nullptr) {
+        evt->set_signal_process_vertex (nullptr);
+      }
+    }
+
+    if(m_purgeUnstableWithoutEndVtx) {
+      int purged=0;
+      do {
+        for (HepMC::GenParticle* p : *evt) {
+          HepMC::ConstGenVertexPtr end_v = p->end_vertex();
+          if (p->status() == 2 && !end_v) {
+            delete p->production_vertex()->remove_particle(p);
+            ++purged;
+            ++m_unstablePurged;
+          }
+        }
+      }
+      while (purged>0);
     }
 
     // Properties after cleaning
     const int num_particles_filt = evt->particles_size();
-    int num_orphan_vtxs_filt = 0;
-    int num_noparent_vtxs_filt = 0;
-    int num_nochild_vtxs_filt = 0;
-    for (auto v = evt->vertices_begin(); v != evt->vertices_end(); ++v) {
-      if ((*v)->particles_in_size()==0&&(*v)->particles_out_size()==0) num_orphan_vtxs_filt++;
-      if ((*v)->particles_in_size()==0) num_noparent_vtxs_filt++;
-      if ((*v)->particles_out_size()==0) num_nochild_vtxs_filt++;
-    }
-
-    // Write out the change in the number of particles
-    ATH_MSG_INFO("Particles filtered: " << num_particles_orig << " -> " << num_particles_filt);
-    // Warn if the numbers of "strange" vertices have changed
-    if (num_orphan_vtxs_filt != num_orphan_vtxs_orig)
-      ATH_MSG_WARNING("Change in orphaned vertices: " << num_orphan_vtxs_orig << " -> " << num_orphan_vtxs_filt);
-    if (num_noparent_vtxs_filt != num_noparent_vtxs_orig)
-      ATH_MSG_WARNING("Change in no-parent vertices: " << num_noparent_vtxs_orig << " -> " << num_noparent_vtxs_filt);
-    if (num_nochild_vtxs_filt != num_nochild_vtxs_orig)
-      ATH_MSG_WARNING("Change in no-parent vertices: " << num_nochild_vtxs_orig << " -> " << num_nochild_vtxs_filt);
+    if(num_particles_orig!=num_particles_filt) {
+      int num_orphan_vtxs_filt = 0;
+      int num_noparent_vtxs_filt = 0;
+      int num_nochild_vtxs_filt = 0;
+      for (auto v = evt->vertices_begin(); v != evt->vertices_end(); ++v) {
+        if ((*v)->particles_in_size()==0&&(*v)->particles_out_size()==0) num_orphan_vtxs_filt++;
+        if ((*v)->particles_in_size()==0) num_noparent_vtxs_filt++;
+        if ((*v)->particles_out_size()==0) num_nochild_vtxs_filt++;
+      }
 
+      // Write out the change in the number of particles
+      ATH_MSG_INFO("Particles filtered: " << num_particles_orig << " -> " << num_particles_filt);
+      // Warn if the numbers of "strange" vertices have changed
+      if (num_orphan_vtxs_filt != num_orphan_vtxs_orig)
+        ATH_MSG_WARNING("Change in orphaned vertices: " << num_orphan_vtxs_orig << " -> " << num_orphan_vtxs_filt);
+      if (num_noparent_vtxs_filt != num_noparent_vtxs_orig)
+        ATH_MSG_WARNING("Change in no-parent vertices: " << num_noparent_vtxs_orig << " -> " << num_noparent_vtxs_filt);
+      if (num_nochild_vtxs_filt != num_nochild_vtxs_orig)
+        ATH_MSG_WARNING("Change in no-parent vertices: " << num_nochild_vtxs_orig << " -> " << num_nochild_vtxs_filt);
+    }
 #endif
   }
   return StatusCode::SUCCESS;
@@ -484,6 +526,7 @@ StatusCode FixHepMC::finalize() {
   if (m_killLoops  ) ATH_MSG_INFO( "Removed " <<   m_loopKilled << " of " << m_totalSeen << " particles because of loops." );
   if (m_killPDG0   ) ATH_MSG_INFO( "Removed " <<   m_pdg0Killed << " of " << m_totalSeen << " particles because of PDG ID 0." );
   if (m_cleanDecays) ATH_MSG_INFO( "Removed " << m_decayCleaned << " of " << m_totalSeen << " particles while cleaning decay chains." );
+  if(m_purgeUnstableWithoutEndVtx) ATH_MSG_INFO( "Removed " << m_unstablePurged << " of " << m_totalSeen << " unstable particles because they had no decay vertex." );
   if (!m_pidmap.empty()) ATH_MSG_INFO( "Replaced " << m_replacedPIDs << "PIDs of particles." );
   return StatusCode::SUCCESS;
 }
diff --git a/Generators/Hijing_i/src/Hijing.cxx b/Generators/Hijing_i/src/Hijing.cxx
index 79a78619ec5486ffb58da8179542f2327aa9dec1..9c70daf5fa80821e6d68ea949a0f423c6e456460 100644
--- a/Generators/Hijing_i/src/Hijing.cxx
+++ b/Generators/Hijing_i/src/Hijing.cxx
@@ -737,26 +737,6 @@ Hijing::fillEvt(HepMC::GenEvent* evt)
     }
     //BPK-<
 
-    //ARA -- ATLHI-483, clean up unstable particles with no decay vertex
-#ifdef HEPMC3
-    if(m_keepAllDecayVertices)
-    {
-      const std::vector <HepMC::GenParticlePtr> allParticles=evt->particles();
-      for(auto p : allParticles)
-      {
-        HepMC::ConstGenVertexPtr end_v=p->end_vertex();
-        if(p->status() == 2 && !end_v) evt->remove_particle(p);
-      }
-    }
-#else
-    if(m_keepAllDecayVertices)  
-    {
-      for (HepMC::GenParticle* p : *evt) {
-        HepMC::ConstGenVertexPtr end_v = p->end_vertex();
-        if (p->status() == 2 && !end_v) delete p->production_vertex()->remove_particle(p);
-      }
-    }
-#endif
     return StatusCode::SUCCESS;
 }