diff --git a/ProcessLib/TH2M/ConstitutiveRelations/ConstitutiveData.h b/ProcessLib/TH2M/ConstitutiveRelations/ConstitutiveData.h
index fc9b04d0feab300e5f9db3e4edb6fee908d3a971..3860d4374c6ba873623ea1f3fd881690681b48b2 100644
--- a/ProcessLib/TH2M/ConstitutiveRelations/ConstitutiveData.h
+++ b/ProcessLib/TH2M/ConstitutiveRelations/ConstitutiveData.h
@@ -171,6 +171,7 @@ struct ConstitutiveTempData
     FW2Data fW_2;
     FW3aData fW_3a;
     FW4LWpGData<DisplacementDim> fW_4_LWpG;
+    FW4LWpCData<DisplacementDim> fW_4_LWpC;
 
     using DisplacementDimVector = Eigen::Matrix<double, DisplacementDim, 1>;
     using DisplacementDimMatrix =
@@ -181,13 +182,6 @@ struct ConstitutiveTempData
     DisplacementDimVector drho_LR_h_w_eff_dp_cap_Npart;
     DisplacementDimMatrix drho_LR_h_w_eff_dp_cap_gradNpart;
     DisplacementDimVector drho_GR_h_w_eff_dT;
-    DisplacementDimMatrix dfW_4_LWpC_a_dp_GR;
-    DisplacementDimMatrix dfW_4_LWpC_a_dp_cap;
-    DisplacementDimMatrix dfW_4_LWpC_a_dT;
-    DisplacementDimMatrix dfW_4_LWpC_d_dp_GR;
-    DisplacementDimMatrix dfW_4_LWpC_d_dp_cap;
-    DisplacementDimMatrix dfW_4_LWpC_d_dT;
-    DisplacementDimMatrix dk_over_mu_L_dp_cap;
 };
 
 /// Data that stores intermediate values (derivatives), which are not needed
@@ -212,6 +206,7 @@ struct DerivativesData
     FW2DerivativeData dfW_2;
     FW3aDerivativeData dfW_3a;
     FW4LWpGDerivativeData<DisplacementDim> dfW_4_LWpG;
+    FW4LWpCDerivativeData<DisplacementDim> dfW_4_LWpC;
 };
 
 }  // namespace ConstitutiveRelations
diff --git a/ProcessLib/TH2M/ConstitutiveRelations/ConstitutiveModels.h b/ProcessLib/TH2M/ConstitutiveRelations/ConstitutiveModels.h
index 33c1eaf495e32b3c3ba0b128d0fe2a0cf2990ab4..3f0ee616b7b4b9a0a8b0ec22d57183d482e2c920 100644
--- a/ProcessLib/TH2M/ConstitutiveRelations/ConstitutiveModels.h
+++ b/ProcessLib/TH2M/ConstitutiveRelations/ConstitutiveModels.h
@@ -97,6 +97,7 @@ struct ConstitutiveModels
     FW2Model fW_2_model;
     FW3aModel fW_3a_model;
     FW4LWpGModel<DisplacementDim> fW_4_LWpG_model;
+    FW4LWpCModel<DisplacementDim> fW_4_LWpC_model;
 };
 }  // namespace ConstitutiveRelations
 }  // namespace ProcessLib::TH2M
diff --git a/ProcessLib/TH2M/ConstitutiveRelations/WEquation.cpp b/ProcessLib/TH2M/ConstitutiveRelations/WEquation.cpp
index dc127ce8621f132d40464d0b728d17106aed6914..27495f7dbe0892ecd2ceb49f15272753b747c179 100644
--- a/ProcessLib/TH2M/ConstitutiveRelations/WEquation.cpp
+++ b/ProcessLib/TH2M/ConstitutiveRelations/WEquation.cpp
@@ -254,5 +254,96 @@ void FW4LWpGModel<DisplacementDim>::dEval(
 template struct FW4LWpGModel<2>;
 template struct FW4LWpGModel<3>;
 
+template <int DisplacementDim>
+void FW4LWpCModel<DisplacementDim>::eval(
+    AdvectionData<DisplacementDim> const& advection_data,
+    FluidDensityData const& fluid_density_data,
+    PhaseTransitionData const& phase_transition_data,
+    PorosityData const& porosity_data,
+    SaturationData const& S_L_data,
+    FW4LWpCData<DisplacementDim>& fW_4_LWpC) const
+{
+    double const sD_G = phase_transition_data.diffusion_coefficient_vapour;
+    double const sD_L = phase_transition_data.diffusion_coefficient_solute;
+
+    double const phi_G = (1 - S_L_data.S_L) * porosity_data.phi;
+    double const phi_L = S_L_data.S_L * porosity_data.phi;
+
+    double const diffusion_WGpCap = phi_G * fluid_density_data.rho_GR * sD_G *
+                                    phase_transition_data.dxmWG_dpCap;
+    double const diffusion_WLpCap = phi_L * fluid_density_data.rho_LR * sD_L *
+                                    phase_transition_data.dxmWL_dpCap;
+
+    double const diffusion_W_pCap = diffusion_WGpCap + diffusion_WLpCap;
+
+    auto const I =
+        Eigen::Matrix<double, DisplacementDim, DisplacementDim>::Identity();
+
+    fW_4_LWpC.L.noalias() = diffusion_W_pCap * I - advection_data.advection_W_L;
+
+    // Jac wrong?
+    // double const diffusion_W_L_p = phi_L * fluid_density_data.rho_LR * sD_L *
+    //                               phase_transition_data.dxmWL_dpLR;
+    //
+    // fW_4_LWpC.L.noalias() = diffusion_W_L_p * I +
+    // advection_data.advection_W_L;
+}
+
+template <int DisplacementDim>
+void FW4LWpCModel<DisplacementDim>::dEval(
+    AdvectionData<DisplacementDim> const& advection_data,
+    FluidDensityData const& fluid_density_data,
+    PermeabilityData<DisplacementDim> const& permeability_data,
+    PhaseTransitionData const& phase_transition_data,
+    PorosityData const& porosity_data,
+    PureLiquidDensityData const& rho_W_LR,
+    SaturationData const& S_L_data,
+    SaturationDataDeriv const& dS_L_dp_cap,
+    ViscosityData const& viscosity_data,
+    FW4LWpCDerivativeData<DisplacementDim>& dfW_4_LWpC) const
+{
+    ////// Diffusion Part /////
+    // TODO (naumov) d(diffusion_W_pCap)/dX for dxmW*/d* != 0
+
+    ////// Advection part /////
+    GlobalDimMatrix<DisplacementDim> const k_over_mu_L =
+        permeability_data.Ki * permeability_data.k_rel_L / viscosity_data.mu_LR;
+
+    dfW_4_LWpC.dp_GR = phase_transition_data.drho_W_LR_dp_GR * k_over_mu_L
+        //+ rhoWLR * (dk_over_mu_L_dp_GR = 0)
+        ;
+
+    double const sD_G = phase_transition_data.diffusion_coefficient_vapour;
+    double const sD_L = phase_transition_data.diffusion_coefficient_solute;
+
+    double const phi_G = (1 - S_L_data.S_L) * porosity_data.phi;
+    double const phi_L = S_L_data.S_L * porosity_data.phi;
+
+    double const diffusion_WGpCap = phi_G * fluid_density_data.rho_GR * sD_G *
+                                    phase_transition_data.dxmWG_dpCap;
+    double const diffusion_WLpCap = phi_L * fluid_density_data.rho_LR * sD_L *
+                                    phase_transition_data.dxmWL_dpCap;
+
+    double const diffusion_W_pCap = diffusion_WGpCap + diffusion_WLpCap;
+
+    auto const I =
+        Eigen::Matrix<double, DisplacementDim, DisplacementDim>::Identity();
+
+    dfW_4_LWpC.dp_cap = diffusion_W_pCap * I - advection_data.advection_W_L;
+
+    auto const dk_over_mu_L_dp_cap = permeability_data.Ki *
+                                     permeability_data.dk_rel_L_dS_L *
+                                     dS_L_dp_cap() / viscosity_data.mu_LR;
+    dfW_4_LWpC.dp_cap = -phase_transition_data.drho_W_LR_dp_LR * k_over_mu_L +
+                        rho_W_LR() * dk_over_mu_L_dp_cap;
+
+    dfW_4_LWpC.dT = phase_transition_data.drho_W_LR_dT * k_over_mu_L
+        //+ rhoWLR * (dk_over_mu_L_dT != 0 TODO for mu_L(T))
+        ;
+}
+
+template struct FW4LWpCModel<2>;
+template struct FW4LWpCModel<3>;
+
 }  // namespace ConstitutiveRelations
 }  // namespace ProcessLib::TH2M
diff --git a/ProcessLib/TH2M/ConstitutiveRelations/WEquation.h b/ProcessLib/TH2M/ConstitutiveRelations/WEquation.h
index 8d88c9e7eff26175c195dc1171de48325482ba7a..206d3fedafe237263956d7b3405a534742a82505 100644
--- a/ProcessLib/TH2M/ConstitutiveRelations/WEquation.h
+++ b/ProcessLib/TH2M/ConstitutiveRelations/WEquation.h
@@ -149,5 +149,44 @@ struct FW4LWpGModel
 extern template struct FW4LWpGModel<2>;
 extern template struct FW4LWpGModel<3>;
 
+template <int DisplacementDim>
+struct FW4LWpCData
+{
+    GlobalDimMatrix<DisplacementDim> L;
+};
+
+template <int DisplacementDim>
+struct FW4LWpCDerivativeData
+{
+    GlobalDimMatrix<DisplacementDim> dp_GR;
+    GlobalDimMatrix<DisplacementDim> dp_cap;
+    GlobalDimMatrix<DisplacementDim> dT;
+};
+
+template <int DisplacementDim>
+struct FW4LWpCModel
+{
+    void eval(AdvectionData<DisplacementDim> const& advection_data,
+              FluidDensityData const& fluid_density_data,
+              PhaseTransitionData const& phase_transition_data,
+              PorosityData const& porosity_data,
+              SaturationData const& S_L_data,
+              FW4LWpCData<DisplacementDim>& fW_4_LWpC) const;
+
+    void dEval(AdvectionData<DisplacementDim> const& advection_data,
+               FluidDensityData const& fluid_density_data,
+               PermeabilityData<DisplacementDim> const& permeability_data,
+               PhaseTransitionData const& phase_transition_data,
+               PorosityData const& porosity_data,
+               PureLiquidDensityData const& rho_W_LR,
+               SaturationData const& S_L_data,
+               SaturationDataDeriv const& dS_L_dp_cap,
+               ViscosityData const& viscosity_data,
+               FW4LWpCDerivativeData<DisplacementDim>& dfW_4_LWpC) const;
+};
+
+extern template struct FW4LWpCModel<2>;
+extern template struct FW4LWpCModel<3>;
+
 }  // namespace ConstitutiveRelations
 }  // namespace ProcessLib::TH2M
diff --git a/ProcessLib/TH2M/TH2MFEM-impl.h b/ProcessLib/TH2M/TH2MFEM-impl.h
index 934bf873412441bcc33dfc227d16452b63a05c26..394beeabb9b14b173df127d51426cb4b67bb9c59 100644
--- a/ProcessLib/TH2M/TH2MFEM-impl.h
+++ b/ProcessLib/TH2M/TH2MFEM-impl.h
@@ -380,6 +380,13 @@ TH2MLocalAssembler<ShapeFunctionDisplacement, ShapeFunctionPressure,
                                     current_state.S_L_data,
                                     ip_cv.fW_4_LWpG);
 
+        models.fW_4_LWpC_model.eval(ip_cv.advection_data,
+                                    ip_out.fluid_density_data,
+                                    ip_cv.phase_transition_data,
+                                    ip_out.porosity_data,
+                                    current_state.S_L_data,
+                                    ip_cv.fW_4_LWpC);
+
         // for variable output
         auto const xmCL = 1. - ip_out.mass_mole_fractions_data.xmWL;
 
@@ -436,11 +443,6 @@ TH2MLocalAssembler<ShapeFunctionDisplacement, ShapeFunctionPressure,
             ip_out.permeability_data.Ki * ip_out.permeability_data.k_rel_L /
             ip_cv.viscosity_data.mu_LR;
 
-        ip_cv.dk_over_mu_L_dp_cap = ip_out.permeability_data.Ki *
-                                    ip_out.permeability_data.dk_rel_L_dS_L *
-                                    ip_cv.dS_L_dp_cap() /
-                                    ip_cv.viscosity_data.mu_LR;
-
         ip_out.darcy_velocity_data.w_GS =
             k_over_mu_G * ip_out.fluid_density_data.rho_GR * b -
             k_over_mu_G * gradpGR;
@@ -487,24 +489,6 @@ TH2MLocalAssembler<ShapeFunctionDisplacement, ShapeFunctionPressure,
                 ip_out.darcy_velocity_data.w_LS;
         // TODO (naumov) + k_over_mu_G * drho_GR_dT * b + k_over_mu_L *
         // drho_LR_dT * b
-
-        ip_cv.dfW_4_LWpC_a_dp_GR = c.drho_W_LR_dp_GR * k_over_mu_L
-            //+ rhoWLR * (dk_over_mu_L_dp_GR = 0)
-            ;
-        ip_cv.dfW_4_LWpC_a_dp_cap =
-            -c.drho_W_LR_dp_LR * k_over_mu_L +
-            current_state.rho_W_LR() * ip_cv.dk_over_mu_L_dp_cap;
-        ip_cv.dfW_4_LWpC_a_dT = c.drho_W_LR_dT * k_over_mu_L
-            //+ rhoWLR * (dk_over_mu_L_dT != 0 TODO for mu_L(T))
-            ;
-
-        // TODO (naumov) for dxmW*/d* != 0
-        ip_cv.dfW_4_LWpC_d_dp_GR =
-            Eigen::Matrix<double, DisplacementDim, DisplacementDim>::Zero();
-        ip_cv.dfW_4_LWpC_d_dp_cap =
-            Eigen::Matrix<double, DisplacementDim, DisplacementDim>::Zero();
-        ip_cv.dfW_4_LWpC_d_dT =
-            Eigen::Matrix<double, DisplacementDim, DisplacementDim>::Zero();
     }
 
     return {ip_constitutive_data, ip_constitutive_variables};
@@ -708,6 +692,17 @@ TH2MLocalAssembler<ShapeFunctionDisplacement, ShapeFunctionPressure,
                                      ip_cv.dS_L_dp_cap,
                                      ip_cv.viscosity_data,
                                      ip_dd.dfW_4_LWpG);
+
+        models.fW_4_LWpC_model.dEval(ip_cv.advection_data,
+                                     ip_out.fluid_density_data,
+                                     ip_out.permeability_data,
+                                     ip_cv.phase_transition_data,
+                                     ip_out.porosity_data,
+                                     current_state.rho_W_LR,
+                                     current_state.S_L_data,
+                                     ip_cv.dS_L_dp_cap,
+                                     ip_cv.viscosity_data,
+                                     ip_dd.dfW_4_LWpC);
     }
 
     return ip_d_data;
@@ -1177,27 +1172,17 @@ void TH2MLocalAssembler<
         using DisplacementDimMatrix =
             Eigen::Matrix<double, DisplacementDim, DisplacementDim>;
 
-        DisplacementDimMatrix const diffusion_WGpCap =
-            phi_G * rhoGR * D_W_G * ip_cv.phase_transition_data.dxmWG_dpCap;
-        DisplacementDimMatrix const diffusion_WLpCap =
-            phi_L * rhoLR * D_W_L * ip_cv.phase_transition_data.dxmWL_dpCap;
-
         DisplacementDimMatrix const diffusion_WGT =
             phi_G * rhoGR * D_W_G * ip_cv.phase_transition_data.dxmWG_dT;
         DisplacementDimMatrix const diffusion_WLT =
             phi_L * rhoLR * D_W_L * ip_cv.phase_transition_data.dxmWL_dT;
 
-        DisplacementDimMatrix const diffusion_W_pCap =
-            diffusion_WGpCap + diffusion_WLpCap;
-
         DisplacementDimMatrix const diffusion_W_T =
             diffusion_WGT + diffusion_WLT;
 
         LWpG.noalias() += gradNpT * ip_cv.fW_4_LWpG.L * gradNp * w;
 
-        LWpC.noalias() +=
-            gradNpT * (diffusion_W_pCap - ip_cv.advection_data.advection_W_L) *
-            gradNp * w;
+        LWpC.noalias() += gradNpT * ip_cv.fW_4_LWpC.L * gradNp * w;
 
         LWT.noalias() += gradNpT * (diffusion_W_T)*gradNp * w;
 
@@ -1665,8 +1650,6 @@ void TH2MLocalAssembler<ShapeFunctionDisplacement, ShapeFunctionPressure,
 
         MWu.noalias() += NpT * rho_W_FR * alpha_B * mT * Bu * w;
 
-        GlobalDimMatrixType const diffusion_W_L_p =
-            phi_L * rhoLR * D_W_L * ip_cv.phase_transition_data.dxmWL_dpLR;
         GlobalDimMatrixType const diffusion_W_G_T =
             phi_G * rhoGR * D_W_G * ip_cv.phase_transition_data.dxmWG_dT;
         GlobalDimMatrixType const diffusion_W_L_T =
@@ -1689,25 +1672,19 @@ void TH2MLocalAssembler<ShapeFunctionDisplacement, ShapeFunctionPressure,
                                                       temperature_index)
             .noalias() += gradNpT * ip_dd.dfW_4_LWpG.dT * gradpGR * NT * w;
 
-        LWpC.noalias() -=
-            gradNpT * (ip_cv.advection_data.advection_W_L + diffusion_W_L_p) *
-            gradNp * w;
+        LWpC.noalias() += gradNpT * ip_cv.fW_4_LWpC.L * gradNp * w;
 
         // fW_4 LWp_cap' parts; LWpC = \int grad (a + d) grad
         local_Jac.template block<W_size, C_size>(W_index, C_index).noalias() -=
-            gradNpT * (ip_cv.dfW_4_LWpC_a_dp_GR + ip_cv.dfW_4_LWpC_d_dp_GR) *
-            gradpCap * Np * w;
+            gradNpT * ip_dd.dfW_4_LWpC.dp_GR * gradpCap * Np * w;
 
         local_Jac.template block<W_size, W_size>(W_index, W_index).noalias() -=
-            gradNpT * (ip_cv.dfW_4_LWpC_a_dp_cap + ip_cv.dfW_4_LWpC_d_dp_cap) *
-            gradpCap * Np * w;
+            gradNpT * ip_dd.dfW_4_LWpC.dp_cap * gradpCap * Np * w;
 
         local_Jac
             .template block<W_size, temperature_size>(W_index,
                                                       temperature_index)
-            .noalias() -= gradNpT *
-                          (ip_cv.dfW_4_LWpC_a_dT + ip_cv.dfW_4_LWpC_d_dT) *
-                          gradpCap * NT * w;
+            .noalias() -= gradNpT * ip_dd.dfW_4_LWpC.dT * gradpCap * NT * w;
 
         LWT.noalias() += gradNpT * (diffusion_W_T)*gradNp * w;