diff --git a/Processes/QGSJetII/Interaction.cc b/Processes/QGSJetII/Interaction.cc
index 20e91242c1790cbf3fc6dd02e4caec5c5a9b6c9a..61d6f3849a75f65df10c1dc872648795fecb9ebd 100644
--- a/Processes/QGSJetII/Interaction.cc
+++ b/Processes/QGSJetII/Interaction.cc
@@ -67,7 +67,7 @@ namespace corsika::process::qgsjetII {
   units::si::CrossSectionType
   Interaction::GetCrossSection(const particles::Code BeamId,
                                const particles::Code TargetId,
-                               const units::si::HEPEnergyType CoMenergy,
+                               const units::si::HEPEnergyType Elab,
                                const unsigned int Abeam,
                                const unsigned int Atarget) const {
     using namespace units::si;
@@ -76,13 +76,6 @@ namespace corsika::process::qgsjetII {
     if (process::qgsjetII::CanInteract(BeamId)) {
 
       const int iBeam = process::qgsjetII::GetQgsjetIIXSCode(BeamId);
-      if (!IsValidCoMEnergy(CoMenergy)) {
-        ostringstream txt;
-        txt << "Interaction: GetCrossSection: CoM energy outside range for QgsjetII! "
-               "CoMenergy="
-            << CoMenergy;
-        throw std::runtime_error(txt.str().c_str());
-      }
       int iTarget = 1;
       if (particles::IsNucleus(TargetId)) {
         iTarget = Atarget;
@@ -99,11 +92,10 @@ namespace corsika::process::qgsjetII {
           throw std::runtime_error("QgsjetII target outside range. ");
       }
 
-      const double dEcm = CoMenergy / 1_GeV / iProjectile; // CoM energy (per nucleon)
-
-      cout << "QgsjetII::GetCrossSection " << dEcm << " " << iBeam << " " << iProjectile
-           << " " << iTarget << endl;
-      sigProd = qgsect_(dEcm, iBeam, iProjectile, iTarget);
+      cout << "QgsjetII::GetCrossSection Elab=" << Elab << " iBeam=" << iBeam << " iProjectile=" << iProjectile
+           << " iTarget=" << iTarget << endl;
+      sigProd = qgsect_(Elab/1_GeV, iBeam, iProjectile, iTarget);
+      cout << "QgsjetII::GetCrossSection sigProd=" << sigProd << endl;
     }
 
     return sigProd * 1_mb;
@@ -136,15 +128,13 @@ namespace corsika::process::qgsjetII {
     pTotLab += vP.GetMomentum();
     pTotLab += pTarget;
     auto const pTotLabNorm = pTotLab.norm();
-    // calculate cm. energy
-    const HEPEnergyType ECoM = sqrt((Elab + pTotLabNorm) * (Elab - pTotLabNorm));
 
     cout << "Interaction: LambdaInt: \n"
          << " input energy: " << vP.GetEnergy() / 1_GeV << endl
          << " beam can interact:" << kInteraction << endl
          << " beam pid:" << vP.GetPID() << endl;
 
-    if (kInteraction && IsValidCoMEnergy(ECoM)) {
+    if (kInteraction) {
 
       int Abeam = 0;
       if (particles::IsNucleus(vP.GetPID())) Abeam = vP.GetNuclearA();
@@ -165,8 +155,7 @@ namespace corsika::process::qgsjetII {
             int Atarget = 0;
             if (corsika::particles::IsNucleus(targetID))
               Atarget = particles::GetNucleusA(targetID);
-            return std::get<0>(
-                GetCrossSection(corsikaBeamId, targetID, ECoM, Abeam, Atarget));
+            return GetCrossSection(corsikaBeamId, targetID, Elab, Abeam, Atarget);
           });
 
       cout << "Interaction: "
@@ -245,11 +234,6 @@ namespace corsika::process::qgsjetII {
       cout << "Interaction: position of interaction: " << pOrig.GetCoordinates() << endl;
       cout << "Interaction: time: " << tOrig << endl;
 
-      HEPEnergyType Etot = eProjectileLab + eTargetLab;
-      MomentumVector Ptot = vP.GetMomentum();
-      // invariant mass, i.e. cm. energy
-      HEPEnergyType Ecm = sqrt(Etot * Etot - Ptot.squaredNorm());
-
       // sample target mass number
       auto const* currentNode = vP.GetNode();
       auto const& mediumComposition =
@@ -259,7 +243,6 @@ namespace corsika::process::qgsjetII {
         Here we read the cross section from the interaction model again,
         should be passed from GetInteractionLength if possible
        */
-      //#warning reading interaction cross section again, should not be necessary
       auto const& compVec = mediumComposition.GetComponents();
       std::vector<si::CrossSectionType> cross_section_of_components(compVec.size());
 
@@ -268,9 +251,8 @@ namespace corsika::process::qgsjetII {
         int Atarget = 0;
         if (corsika::particles::IsNucleus(targetId))
           Atarget = particles::GetNucleusA(targetId);
-        const auto [sigProd, sigEla] =
-            GetCrossSection(corsikaBeamId, targetId, Ecm, Abeam, Atarget);
-        [[maybe_unused]] const auto& dummy_sigEla = sigEla;
+        const auto sigProd =
+            GetCrossSection(corsikaBeamId, targetId, eProjectileLab, Abeam, Atarget);
         cross_section_of_components[i] = sigProd;
       }
 
@@ -317,73 +299,64 @@ namespace corsika::process::qgsjetII {
 
       cout << "Interaction: "
            << " DoInteraction: E(GeV):" << eProjectileLab / 1_GeV
-           << " Ecm(GeV): " << Ecm / 1_GeV << endl;
-      if (Ecm > GetMaxEnergyCoM())
-        throw std::runtime_error("Interaction::DoInteraction: CoM energy too high!");
-      // FR: removed eProjectileLab < 8.5_GeV ||
-      if (Ecm < GetMinEnergyCoM()) {
-        cout << "Interaction: "
-             << " DoInteraction: should have dropped particle.. "
-             << "THIS IS AN ERROR" << endl;
-        throw std::runtime_error("energy too low for QGSJETII");
-      } else {
-        count_++;
-        auto Elab = eProjectileLab / projQgsCode;
-        qgini_(Elab / 1_GeV, kBeam, projQgsCode, targetQgsCode);
-        qgini_(Elab / 1_GeV, kBeam, projQgsCode, targetQgsCode);
-        qgconf_();
-
-        // bookkeeping
-        MomentumVector Plab_final(rootCS, {0.0_GeV, 0.0_GeV, 0.0_GeV});
-        HEPEnergyType Elab_final = 0_GeV;
-
-        // fragments
-        QGSJetIIFragmentsStack qfs;
-        for (auto& fragm : qfs) {
-          particles::Code idFragm = particles::Code::Nucleus;
-          int A = fragm.GetFragmentSize();
-          int Z = 0;
-          switch (A) {
-            case 1: { // proton/neutron
-              idFragm = particles::Code::Proton;
-              MomentumVector Plab_nucleon(rootCS,
-                                          {0.0_GeV, 0.0_GeV,
-                                           sqrt((Elab + particles::Proton::GetMass()) *
-                                                (Elab - particles::Proton::GetMass()))});
-              auto const PlabRot = boost.fromCoM(FourVector(Elab, Plab_nucleon));
-              cout << "secondary fragment>" //<< static_cast<int>(psec.GetPID())
-                   << " " << idFragm << " Elab=" << Elab << " " << endl;
-              auto pnew = vP.AddSecondary(
-                  tuple<particles::Code, units::si::HEPEnergyType, stack::MomentumVector,
-                        geometry::Point, units::si::TimeType>{
-                      idFragm, PlabRot.GetTimeLikeComponent(),
-                      PlabRot.GetSpaceLikeComponents(), pOrig, tOrig});
-              Plab_final += pnew.GetMomentum();
-              Elab_final += pnew.GetEnergy();
-            } break;
-            case 2: // deuterium
-              Z = 1;
-              break;
-            case 3: // tritium
-              Z = 1;
-              break;
-            case 4: // helium
-              Z = 2;
-              break;
+	   << endl;
+      count_++;
+      qgini_(eProjectileLab / 1_GeV, kBeam, projQgsCode, targetQgsCode);
+      // this is from CRMC, is this REALLY needed ???
+      qgini_(eProjectileLab / 1_GeV, kBeam, projQgsCode, targetQgsCode);
+      qgconf_();
+
+      // bookkeeping
+      MomentumVector Plab_final(rootCS, {0.0_GeV, 0.0_GeV, 0.0_GeV});
+      HEPEnergyType Elab_final = 0_GeV;
+
+      // fragments
+      QGSJetIIFragmentsStack qfs;
+      for (auto& fragm : qfs) {
+	particles::Code idFragm = particles::Code::Nucleus;
+	int A = fragm.GetFragmentSize();
+	int Z = 0;
+	switch (A) {
+	case 1: { // proton/neutron
+	  idFragm = particles::Code::Proton;
+	  MomentumVector Plab_nucleon(rootCS,
+				      {0.0_GeV, 0.0_GeV,
+					  sqrt((eProjectileLab + particles::Proton::GetMass()) *
+					       (eProjectileLab - particles::Proton::GetMass()))});
+	  auto const PlabRot = boost.fromCoM(FourVector(eProjectileLab, Plab_nucleon));
+	  cout << "secondary fragment>" //<< static_cast<int>(psec.GetPID())
+	       << " " << idFragm << " eProjectileLab=" << eProjectileLab << " " << endl;
+	  auto pnew = vP.AddSecondary(
+				      tuple<particles::Code, units::si::HEPEnergyType, stack::MomentumVector,
+				      geometry::Point, units::si::TimeType>{
+					idFragm, PlabRot.GetTimeLikeComponent(),
+					  PlabRot.GetSpaceLikeComponents(), pOrig, tOrig});
+	  Plab_final += pnew.GetMomentum();
+	  Elab_final += pnew.GetEnergy();
+	} break;
+	case 2: // deuterium
+	  Z = 1;
+	  break;
+	case 3: // tritium
+	  Z = 1;
+	  break;
+	case 4: // helium
+	  Z = 2;
+	  break;
             default: // nucleus
-            {
-              Z = int(A / 2.15 + 0.7);
+	      {
+		Z = int(A / 2.15 + 0.7);
             }
           }
 
           if (idFragm == particles::Code::Nucleus) {
             MomentumVector Plab_nucleus(rootCS,
                                         {0.0_GeV, 0.0_GeV,
-                                         sqrt((Elab + constants::nucleonMass * A) *
-                                              (Elab - constants::nucleonMass * A))});
-            auto const PlabRot = boost.fromCoM(FourVector(Elab * A, Plab_nucleus));
-            cout << "secondary fragment>" //<< static_cast<int>(psec.GetPID())
-                 << " " << idFragm << " Elab=" << Elab << " A=" << A << " Z=" << Z
+                                         sqrt((eProjectileLab + constants::nucleonMass * A) *
+                                              (eProjectileLab - constants::nucleonMass * A))});
+            auto const PlabRot = boost.fromCoM(FourVector(eProjectileLab * A, Plab_nucleus));
+            cout << "secondary fragment>" 
+                 << " " << idFragm << " eProjectileLab=" << eProjectileLab << " A=" << A << " Z=" << Z
                  << endl;
             auto pnew = vP.AddSecondary(
                 tuple<particles::Code, units::si::HEPEnergyType, stack::MomentumVector,
@@ -400,15 +373,10 @@ namespace corsika::process::qgsjetII {
         QGSJetIIStack qs;
         for (auto& psec : qs) {
 
-          // // skip particles that have decayed in QgsjetII
-          // if (psec.HasDecayed()) continue;
-
           auto const Plab = psec.GetMomentum();
           auto const Elab = psec.GetEnergy();
 
           // transform energy to lab. frame
-          // auto const pCoM = psec.GetMomentum();
-          // HEPEnergyType const eCoM = psec.GetEnergy();
           auto const PlabRot = boost.fromCoM(FourVector(Elab, Plab));
 
           cout << "secondary hadron>" //<< static_cast<int>(psec.GetPID())
@@ -421,12 +389,10 @@ namespace corsika::process::qgsjetII {
                     geometry::Point, units::si::TimeType>{
                   process::qgsjetII::ConvertFromQgsjetII(psec.GetPID()),
                   PlabRot.GetTimeLikeComponent(), PlabRot.GetSpaceLikeComponents(),
-                  // Elab, Plab,
                   pOrig, tOrig});
 
           Plab_final += pnew.GetMomentum();
           Elab_final += pnew.GetEnergy();
-          // Ecm_final += psec.GetEnergy();
         }
         cout << "conservation (all GeV): Ecm_final= n/a" /* << Ecm_final / 1_GeV*/ << endl
              << "Elab_final=" << Elab_final / 1_GeV
@@ -436,9 +402,8 @@ namespace corsika::process::qgsjetII {
              << ", N_wounded,proj="
              << QGSJetIIFragmentsStackData::GetWoundedNucleonsProjectile()
              << ", N_fragm,proj=" << qfs.GetSize() << endl;
-      }
     }
     return process::EProcessReturn::eOk;
   }
-
+  
 } // namespace corsika::process::qgsjetII
diff --git a/Processes/QGSJetII/Interaction.h b/Processes/QGSJetII/Interaction.h
index 713400b666be83a96ba4d83452f412d656b1acb5..dae16950fae0ca979e7493e7844e10913683164c 100644
--- a/Processes/QGSJetII/Interaction.h
+++ b/Processes/QGSJetII/Interaction.h
@@ -33,12 +33,7 @@ namespace corsika::process::qgsjetII {
     void Init();
 
     bool WasInitialized() { return initialized_; }
-    bool IsValidCoMEnergy(corsika::units::si::HEPEnergyType ecm) const {
-      return (minEnergyCoM_ <= ecm) && (ecm <= maxEnergyCoM_);
-    }
     int GetMaxTargetMassNumber() const { return maxMassNumber_; }
-    corsika::units::si::HEPEnergyType GetMinEnergyCoM() const { return minEnergyCoM_; }
-    corsika::units::si::HEPEnergyType GetMaxEnergyCoM() const { return maxEnergyCoM_; }
     bool IsValidTarget(corsika::particles::Code TargetId) const {
       return (corsika::particles::GetNucleusA(TargetId) < maxMassNumber_) &&
              corsika::particles::IsNucleus(TargetId);
@@ -63,22 +58,6 @@ namespace corsika::process::qgsjetII {
   private:
     corsika::random::RNG& fRNG =
         corsika::random::RNGManager::GetInstance().GetRandomStream("qgran");
-    // FOR NOW keep trackedParticles private, could be configurable
-    std::vector<particles::Code> const fTrackedParticles = {
-        particles::Code::PiPlus,     particles::Code::PiMinus,
-        particles::Code::Pi0,        particles::Code::KMinus,
-        particles::Code::KPlus,      particles::Code::K0Long,
-        particles::Code::K0Short,    particles::Code::SigmaPlus,
-        particles::Code::SigmaMinus, particles::Code::Lambda0,
-        particles::Code::Xi0,        particles::Code::XiMinus,
-        particles::Code::OmegaMinus, particles::Code::DPlus,
-        particles::Code::DMinus,     particles::Code::D0,
-        particles::Code::MuMinus,    particles::Code::MuPlus,
-        particles::Code::D0Bar};
-    const corsika::units::si::HEPEnergyType minEnergyCoM_ =
-        10. * 1e9 * corsika::units::si::electronvolt;
-    const corsika::units::si::HEPEnergyType maxEnergyCoM_ =
-        1.e6 * 1e9 * corsika::units::si::electronvolt;
     const int maxMassNumber_ = 208;
   };