diff --git a/src/shared/algorithms/MEA/MEA.cpp b/src/shared/algorithms/MEA/MEA.cpp
index c519f8654c8a8d8a09079295588577c1599e96bf..a30f73b6ffca1a05e1cb562b41b88edc09a0af5a 100644
--- a/src/shared/algorithms/MEA/MEA.cpp
+++ b/src/shared/algorithms/MEA/MEA.cpp
@@ -61,10 +61,11 @@ void MEA::Step::withSpeedAndAlt(float verticalSpeed, float mslAltitude)
 MEA::MEA(const Config &config)
     : F{config.F}, Q{config.Q}, G{config.G}, baroH{config.baroH},
       baroR{config.baroR}, P{config.P}, x{0, 0, config.initialMass},
-      accelThresh{config.accelThresh}, speedThresh{config.speedThresh},
-      Kt{config.Kt}, alpha{config.alpha}, c{config.c}, coeffs{config.coeffs},
-      crossSection{config.crossSection}, ae{config.ae}, p0{config.p0},
-      minMass{config.minMass}, maxMass{config.maxMass}
+      mass{config.initialMass}, accelThresh{config.accelThresh},
+      speedThresh{config.speedThresh}, Kt{config.Kt}, alpha{config.alpha},
+      c{config.c}, coeffs{config.coeffs}, crossSection{config.crossSection},
+      ae{config.ae}, p0{config.p0}, minMass{config.minMass}, maxMass{
+                                                                 config.maxMass}
 {
     updateState();
 }
@@ -181,13 +182,13 @@ void MEA::computeApogee(const Step &step)
     if (!step.hasSpeedAndAlt)
         return;
 
-    // TODO: Matlab uses CD_correction_shutDown, should we?
-    // Holy fuck, massive formula, split this for the love of god
-    apogee = step.mslAltitude +
-             1 / (2 * ((0.5f * rho * cd * crossSection) / mass)) *
-                 log1p(1 + (step.verticalSpeed * step.verticalSpeed *
-                            ((0.5f * rho * cd * crossSection) / mass)) /
-                               Constants::g);
+    // Simplified massive formula for apogee estimation.
+    // Warning: log1p(x) = log(1 + x)
+    float temp = ((rho * cd * crossSection) / mass);
+    apogee     = step.mslAltitude +
+             1 / temp *
+                 log1p(0.5 * (step.verticalSpeed * step.verticalSpeed * temp) /
+                       Constants::g);
 }
 
 void MEA::updateState()
diff --git a/src/shared/algorithms/MEA/MEA.h b/src/shared/algorithms/MEA/MEA.h
index 4600df16ec19f3079ff0bba9c7f959c38dd4fa98..795761e43e8c0abf7f6cba62de4d9fef0f2d9cfd 100644
--- a/src/shared/algorithms/MEA/MEA.h
+++ b/src/shared/algorithms/MEA/MEA.h
@@ -128,8 +128,8 @@ private:
     float q     = 0.0f;  //< Latest computed dynamic pressure
     float force = 0.0f;  //< Latest computed force
 
-    float mass   = 0.0f;  //< Latest computed mass
     float apogee = 0.0f;  //< Latest computed apogee
+    float mass;           //< Latest computed mass
 
     float accelThresh;
     float speedThresh;
diff --git a/src/shared/algorithms/MEA/MEAData.h b/src/shared/algorithms/MEA/MEAData.h
index 472e8f165c369ed8703cbfb03a57d740932661ca..8e26d62a43bc27ec970fa3ed0d3bd65330a3fb15 100644
--- a/src/shared/algorithms/MEA/MEAData.h
+++ b/src/shared/algorithms/MEA/MEAData.h
@@ -32,20 +32,19 @@ struct MEAState
 {
     uint64_t timestamp;
 
-    float estimatedPressure;
-    float estimatedMass;
-    float estimatedApogee;
-    float estimatedForce;
+    float estimatedPressure;  ///< Estimated pressure in combustion chamber [Pa]
+    float estimatedMass;      ///< Estimated rocket mass [kg]
+    float estimatedApogee;    ///< Estimated apogee in msl [m]
+    float estimatedForce;     ///< Estimated drag force [N]
 
-    float x0;
-    float x1;
-    float x2;
+    float x0;  ///< first kalman state
+    float x1;  ///< second kalman state
+    float x2;  ///< third kalman state representing the mass
 
     static std::string header()
     {
         return "timestamp,estimatedPressure,estimatedMass,estimatedApogee,"
-               "estimatedForce,x0,"
-               "x1,x2\n";
+               "estimatedForce,x0,x1,x2\n";
     }
 
     void print(std::ostream &os) const