diff --git a/MaterialLib/FractureModels/MohrCoulomb.cpp b/MaterialLib/FractureModels/MohrCoulomb.cpp
index e4a4974398ac2154a4cbd5935f8cdf74948282d9..1341cef13ab3dadde21a8887b4aa402f70008994 100644
--- a/MaterialLib/FractureModels/MohrCoulomb.cpp
+++ b/MaterialLib/FractureModels/MohrCoulomb.cpp
@@ -55,13 +55,13 @@ void MohrCoulomb<DisplacementDim>::computeConstitutiveRelation(
     ParameterLib::SpatialPosition const& x,
     double const aperture0,
     Eigen::Ref<Eigen::VectorXd const>
-        sigma0,
+    /*sigma0*/,
     Eigen::Ref<Eigen::VectorXd const>
-    /*w_prev*/,
+        w_prev,
     Eigen::Ref<Eigen::VectorXd const>
         w,
     Eigen::Ref<Eigen::VectorXd const>
-    /*sigma_prev*/,
+        sigma_prev,
     Eigen::Ref<Eigen::VectorXd>
         sigma,
     Eigen::Ref<Eigen::MatrixXd>
@@ -96,23 +96,21 @@ void MohrCoulomb<DisplacementDim>::computeConstitutiveRelation(
     // condition of the w0 = 0. Therefore the initial state is not associated
     // with a plastic aperture change.
     {  // Exact elastic predictor
-        sigma.noalias() = Ke * (w - state.w_p_prev);
+        sigma.noalias() = Ke * (w - w_prev);
 
         sigma.coeffRef(index_ns) *=
-            logPenalty(aperture0, aperture, _penalty_aperture_cutoff);
+            logPenaltyDerivative(aperture0, aperture, _penalty_aperture_cutoff);
+        sigma.noalias() += sigma_prev;
     }
 
-    sigma.noalias() += sigma0;
-
     // correction for an opening fracture
     if (_tension_cutoff && sigma[DisplacementDim - 1] >= 0)
     {
         Kep.setZero();
         sigma.setZero();
+        state.w_p = w;
         material_state_variables.setTensileStress(true);
         return;
-
-        // TODO (nagel); Update w_p for fracture opening and closing.
     }
 
     auto yield_function = [&mat](Eigen::VectorXd const& s) {
@@ -178,9 +176,12 @@ void MohrCoulomb<DisplacementDim>::computeConstitutiveRelation(
                  */
             state.w_p = state.w_p_prev +
                         solution[0] * plastic_potential_derivative(sigma);
-            sigma.noalias() = sigma0 + (Ke * (w - state.w_p)) *
-                                           logPenalty(aperture0, aperture,
-                                                      _penalty_aperture_cutoff);
+
+            sigma.noalias() = Ke * (w - w_prev - state.w_p + state.w_p_prev);
+
+            sigma.coeffRef(index_ns) *= logPenaltyDerivative(
+                aperture0, aperture, _penalty_aperture_cutoff);
+            sigma.noalias() += sigma_prev;
         };
 
         auto newton_solver =