diff --git a/corsika/detail/modules/epos/InteractionModel.inl b/corsika/detail/modules/epos/InteractionModel.inl
index 039d9635de189d5c6a96309e6a96b4bd07365dd7..35ed15a884c6e608056fcb5b562ddfd1d0c5e50e 100644
--- a/corsika/detail/modules/epos/InteractionModel.inl
+++ b/corsika/detail/modules/epos/InteractionModel.inl
@@ -20,6 +20,7 @@
 
 #include <string>
 #include <tuple>
+#include <cmath>
 
 namespace corsika::epos {
 
@@ -112,7 +113,7 @@ namespace corsika::epos {
     ::epos::nucl6_.infragm =
         2; // 0: keep free nucleons in fragmentation,1: one fragment, 2: fragmentation
 
-    ::epos::othe2_.iframe = 12; // lab frame, target at rest
+    ::epos::othe2_.iframe = 11; // cms frame
 
     // set paths to tables in corsika data
     ::epos::datadir BASE(data_path_);
@@ -136,8 +137,8 @@ namespace corsika::epos {
     ::epos::nfname_.nfncs = CS.length;
 
     // initialiazes maximum energy and mass
-    initializeEventLab(Code::Lead, Lead::nucleus_A, Lead::nucleus_Z, Code::Lead,
-                       Lead::nucleus_A, Lead::nucleus_Z, 1_TeV);
+    initializeEventCoM(Code::Lead, Lead::nucleus_A, Lead::nucleus_Z, Code::Lead,
+                       Lead::nucleus_A, Lead::nucleus_Z, 1_PeV);
   }
 
   inline void InteractionModel::initializeEventCoM(Code const idBeam, int const iBeamA,
@@ -163,30 +164,6 @@ namespace corsika::epos {
     ::epos::ainit_();
   }
 
-  inline void InteractionModel::initializeEventLab(Code const idBeam, int const iBeamA,
-                                                   int const iBeamZ, Code const idTarget,
-                                                   int const iTargetA, int const iTargetZ,
-                                                   HEPEnergyType const Plab) const {
-    CORSIKA_LOGGER_TRACE(logger_,
-                         "initialize event in lab. frame!"
-                         " Plab per nuc={} GeV",
-                         Plab / 1_GeV);
-    ::epos::lept1_.engy = -1.;
-    ::epos::enrgy_.ecms = -1.;
-    ::epos::enrgy_.elab = -1.;
-    ::epos::enrgy_.ekin = -1.;
-    ::epos::hadr1_.pnll = -1.;
-
-    // hadron-nucleon momentum
-    ::epos::hadr1_.pnll = float(Plab / 1_GeV); // -> lab frame
-
-    CORSIKA_LOGGER_TRACE(logger_, "inside EPOS: Ecm={}, Elab={}, Pnll={}",
-                         ::epos::enrgy_.ecms, ::epos::enrgy_.elab, ::epos::hadr1_.pnll);
-
-    configureParticles(idBeam, iBeamA, iBeamZ, idTarget, iTargetA, iTargetZ);
-    ::epos::ainit_();
-  }
-
   inline void InteractionModel::configureParticles(Code const idBeam, int const iBeamA,
                                                    int const iBeamZ, Code const idTarget,
                                                    int const iTargetA,
@@ -392,7 +369,7 @@ namespace corsika::epos {
     // define projectile
     // define projectile, in lab frame
     auto const sqrtS2 = (projectileP4 + targetP4).getNormSqr();
-    auto const sqrtS = sqrt(sqrtS2);
+    HEPEnergyType const sqrtS = sqrt(sqrtS2);
     if (!isValid(projectileId, targetId, sqrtS)) {
       throw std::runtime_error("invalid projectile/target/energy combination.");
     }
@@ -411,11 +388,14 @@ namespace corsika::epos {
         sqrt((Elab - get_mass(projectileId)) * (Elab + get_mass(projectileId)));
     MomentumVector pLab(csPrime, {0_eV, 0_eV, pLabMag});
 
-    // internal EPOS lab system
-    COMBoost const boostInternal({Elab, pLab}, get_mass(targetId));
-
-    CORSIKA_LOGGER_DEBUG(logger_, "doInteraction: {} interaction, Elab={} ", projectileId,
-                         Elab);
+    CORSIKA_LOGGER_DEBUG(logger_,
+                         "doInteraction: interaction, projectile id={}, E={}, p3={} ",
+                         projectileId, projectileP4.getTimeLikeComponent(),
+                         projectileP4.getSpaceLikeComponents());
+    CORSIKA_LOGGER_DEBUG(
+        logger_, "doInteraction: interaction, target id={}, E={}, p3={} ", targetId,
+        targetP4.getTimeLikeComponent(), targetP4.getSpaceLikeComponents());
+    CORSIKA_LOGGER_DEBUG(logger_, "doInteraction: Elab={}, sqrtS={} ", Elab, sqrtS);
 
     int beamA = 1;
     int beamZ = 1;
@@ -425,8 +405,6 @@ namespace corsika::epos {
       CORSIKA_LOGGER_DEBUG(logger_, "A={}, Z={} ", beamA, beamZ);
     }
 
-    HEPMomentumType const projectileMomentumLabPerNucleon = pLabMag / beamA;
-
     // // from corsika7 interface
     // // NEXLNK-part
     int targetA = 1;
@@ -435,8 +413,7 @@ namespace corsika::epos {
       targetA = get_nucleus_A(targetId);
       targetZ = get_nucleus_Z(targetId);
     }
-    initializeEventLab(projectileId, beamA, beamZ, targetId, targetA, targetZ,
-                       projectileMomentumLabPerNucleon);
+    initializeEventCoM(projectileId, beamA, beamZ, targetId, targetA, targetZ, sqrtS);
 
     // create event
     int iarg = 1;
@@ -450,8 +427,8 @@ namespace corsika::epos {
 
     // NSTORE-part
 
-    MomentumVector Plab_final(originalCS, {0.0_GeV, 0.0_GeV, 0.0_GeV});
-    HEPEnergyType Elab_final = 0_GeV;
+    MomentumVector P_final(originalCS, {0.0_GeV, 0.0_GeV, 0.0_GeV});
+    HEPEnergyType E_final = 0_GeV;
 
     // position and time of interaction, not used in QgsjetII
     auto const& projectile = view.getProjectile();
@@ -460,15 +437,13 @@ namespace corsika::epos {
 
     // secondaries
     EposStack es;
-    CORSIKA_LOGGER_DEBUG(logger_, "number of particles: {}", es.getSize());
+    CORSIKA_LOGGER_DEBUG(logger_, "number of entries on Epos stack: {}", es.getSize());
     for (auto& psec : es) {
       if (!psec.isFinal()) continue;
 
       auto momentum = psec.getMomentum(csPrime);
-      // this is not "CoM" here, but rather the system defined by projectile+target,
-      // which in Cascade-mode is already lab
-      auto const P4com = boostInternal.toCoM(FourVector{psec.getEnergy(), momentum});
-      auto const P4output = boost.fromCoM(P4com);
+      // transform particle output to frame defined by input 4-momenta
+      auto const P4output = boost.fromCoM(FourVector{psec.getEnergy(), momentum});
       auto p3output = P4output.getSpaceLikeComponents();
       p3output.rebase(originalCS); // transform back into standard lab frame
 
@@ -480,14 +455,15 @@ namespace corsika::epos {
                            pid, p3output.getComponents() / 1_GeV);
 
       auto pnew = view.addSecondary(std::make_tuple(pid, p3output, pOrig, tOrig));
-      Plab_final += pnew.getMomentum();
-      Elab_final += pnew.getEnergy();
+      P_final += pnew.getMomentum();
+      E_final += pnew.getEnergy();
     }
     CORSIKA_LOGGER_DEBUG(
         logger_,
         "conservation (all GeV): Ecm_final= n/a" /* << Ecm_final / 1_GeV*/
-        ", Elab_final={}"
-        ", Plab_final={}",
-        Elab_final / 1_GeV, (Plab_final / 1_GeV).getComponents());
+        ", E_final={} GeV"
+        ", P_final={} GeV"
+        ", no. of particles={}",
+        E_final / 1_GeV, (P_final / 1_GeV).getComponents(), view.getSize());
   }
 } // namespace corsika::epos