diff --git a/ProcessLib/ThermoRichardsMechanics/ConstitutiveCommon/PermeabilityModel.cpp b/ProcessLib/ThermoRichardsMechanics/ConstitutiveCommon/PermeabilityModel.cpp
index 1f9066b8ba781bd23ee439e9f8077730763b3bf3..42ce02a497959aa42574792c1ae9445be1fb2e47 100644
--- a/ProcessLib/ThermoRichardsMechanics/ConstitutiveCommon/PermeabilityModel.cpp
+++ b/ProcessLib/ThermoRichardsMechanics/ConstitutiveCommon/PermeabilityModel.cpp
@@ -17,17 +17,12 @@ namespace ProcessLib::ThermoRichardsMechanics
 template <int DisplacementDim>
 void PermeabilityModel<DisplacementDim>::eval(
     SpaceTimeData const& x_t, MediaData const& media_data,
-    SolidCompressibilityData const& solid_compressibility_data,
-    SaturationData const& S_L_data, BishopsData const& bishops_data,
-    BishopsData const& bishops_data_prev,
+    SaturationData const& S_L_data,
     CapillaryPressureData<DisplacementDim> const& p_cap_data,
     TemperatureData<DisplacementDim> const& T_data,
-    PorosityData const& poro_data, LiquidViscosityData const& mu_L_data,
-    TransportPorosityData& transport_poro_data,
-    TransportPorosityData const& transport_poro_data_prev,
+    LiquidViscosityData const& mu_L_data,
+    TransportPorosityData const& transport_poro_data,
     TotalStressData<DisplacementDim> const& total_stress_data,
-    StrainData<DisplacementDim> const& eps_data,
-    StrainData<DisplacementDim> const& eps_prev_data,
     EquivalentPlasticStrainData const& equiv_plast_strain_data,
     PermeabilityData<DisplacementDim>& out) const
 {
@@ -39,44 +34,7 @@ void PermeabilityModel<DisplacementDim>::eval(
     variables.liquid_saturation = S_L_data.S_L;
     variables.temperature = T_data.T;
     variables.capillary_pressure = p_cap_data.p_cap;
-    MPL::VariableArray variables_prev;
-
-    if (medium.hasProperty(MPL::PropertyType::transport_porosity))
-    {
-        static constexpr int kelvin_vector_size =
-            MathLib::KelvinVector::kelvin_vector_dimensions(DisplacementDim);
-        using Invariants =
-            MathLib::KelvinVector::Invariants<kelvin_vector_size>;
-        // Used in
-        // MaterialLib/MPL/Properties/PermeabilityOrthotropicPowerLaw.cpp
-        variables_prev.transport_porosity = transport_poro_data_prev.phi;
-
-        // Used in
-        // MaterialLib/MPL/Properties/TransportPorosityFromMassBalance.cpp
-        variables.grain_compressibility = solid_compressibility_data.beta_SR;
-        // Set volumetric strain rate for the general case without swelling.
-        variables.volumetric_strain = Invariants::trace(eps_data.eps);
-        variables_prev.volumetric_strain = Invariants::trace(eps_prev_data.eps);
-        variables.effective_pore_pressure =
-            -bishops_data.chi_S_L * p_cap_data.p_cap;
-        variables.porosity = poro_data.phi;
-
-        // Used in MaterialLib/MPL/Properties/PorosityFromMassBalance.cpp
-        // and MaterialLib/MPL/Properties/TransportPorosityFromMassBalance.cpp
-        variables_prev.effective_pore_pressure =
-            -bishops_data_prev.chi_S_L *
-            (p_cap_data.p_cap - p_cap_data.p_cap_dot * x_t.dt);
-
-        transport_poro_data.phi =
-            medium.property(MPL::PropertyType::transport_porosity)
-                .template value<double>(variables, variables_prev, x_t.x, x_t.t,
-                                        x_t.dt);
-        variables.transport_porosity = transport_poro_data.phi;
-    }
-    else
-    {
-        variables.transport_porosity = poro_data.phi;
-    }
+    variables.transport_porosity = transport_poro_data.phi;
 
     out.k_rel = medium.property(MPL::PropertyType::relative_permeability)
                     .template value<double>(variables, x_t.x, x_t.t, x_t.dt);
diff --git a/ProcessLib/ThermoRichardsMechanics/ConstitutiveCommon/PermeabilityModel.h b/ProcessLib/ThermoRichardsMechanics/ConstitutiveCommon/PermeabilityModel.h
index a1aeba9997539d7cfa9e4adbbbad216e631e778c..176482a9989caa307f8c61cbfa2c27d6048b9ea0 100644
--- a/ProcessLib/ThermoRichardsMechanics/ConstitutiveCommon/PermeabilityModel.h
+++ b/ProcessLib/ThermoRichardsMechanics/ConstitutiveCommon/PermeabilityModel.h
@@ -13,8 +13,8 @@
 #include "ProcessLib/ThermoRichardsMechanics/ConstitutiveCommon/EquivalentPlasticStrainData.h"
 #include "ProcessLib/ThermoRichardsMechanics/ConstitutiveCommon/LiquidViscosity.h"
 #include "ProcessLib/ThermoRichardsMechanics/ConstitutiveCommon/PermeabilityData.h"
-#include "ProcessLib/ThermoRichardsMechanics/ConstitutiveCommon/Porosity.h"
 #include "ProcessLib/ThermoRichardsMechanics/ConstitutiveCommon/TotalStressData.h"
+#include "ProcessLib/ThermoRichardsMechanics/ConstitutiveCommon/TransportPorosity.h"
 
 namespace ProcessLib::ThermoRichardsMechanics
 {
@@ -22,19 +22,12 @@ template <int DisplacementDim>
 struct PermeabilityModel
 {
     void eval(SpaceTimeData const& x_t, MediaData const& media_data,
-              SolidCompressibilityData const& solid_compressibility_data,
-              SaturationData const& S_L_data, BishopsData const& bishops_data,
-              BishopsData const& bishops_data_prev,
+              SaturationData const& S_L_data,
               CapillaryPressureData<DisplacementDim> const& p_cap_data,
               TemperatureData<DisplacementDim> const& T_data,
-              PorosityData const& poro_data,
               LiquidViscosityData const& mu_L_data,
-              // TODO evaluate transport porosity evolution separately
-              TransportPorosityData& transport_poro_data,
-              TransportPorosityData const& transport_poro_data_prev,
+              TransportPorosityData const& transport_poro_data,
               TotalStressData<DisplacementDim> const& total_stress_data,
-              StrainData<DisplacementDim> const& eps_data,
-              StrainData<DisplacementDim> const& eps_prev_data,
               EquivalentPlasticStrainData const& equiv_plast_strain_data,
               PermeabilityData<DisplacementDim>& out) const;
 };
diff --git a/ProcessLib/ThermoRichardsMechanics/ConstitutiveCommon/Porosity.h b/ProcessLib/ThermoRichardsMechanics/ConstitutiveCommon/Porosity.h
index 7bafb13b290f185e1137eb8b106046d33bee9b55..edbb8aaffaab51aa0e6d04cb8b88fc36f1d629bd 100644
--- a/ProcessLib/ThermoRichardsMechanics/ConstitutiveCommon/Porosity.h
+++ b/ProcessLib/ThermoRichardsMechanics/ConstitutiveCommon/Porosity.h
@@ -27,17 +27,6 @@ struct PorosityData
     }
 };
 
-struct TransportPorosityData
-{
-    double phi;
-
-    static auto reflect()
-    {
-        return ProcessLib::Reflection::reflectWithName(
-            "transport_porosity", &TransportPorosityData::phi);
-    }
-};
-
 template <int DisplacementDim>
 struct PorosityModel
 {
diff --git a/ProcessLib/ThermoRichardsMechanics/ConstitutiveCommon/TransportPorosity.cpp b/ProcessLib/ThermoRichardsMechanics/ConstitutiveCommon/TransportPorosity.cpp
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..9473708eb9c841ad9cd56bbc07342e9e3d15e8a6 100644
--- a/ProcessLib/ThermoRichardsMechanics/ConstitutiveCommon/TransportPorosity.cpp
+++ b/ProcessLib/ThermoRichardsMechanics/ConstitutiveCommon/TransportPorosity.cpp
@@ -0,0 +1,73 @@
+/**
+ * \file
+ * \copyright
+ * Copyright (c) 2012-2022, OpenGeoSys Community (http://www.opengeosys.org)
+ *            Distributed under a Modified BSD License.
+ *              See accompanying file LICENSE.txt or
+ *              http://www.opengeosys.org/project/license
+ *
+ */
+
+#include "TransportPorosity.h"
+
+namespace ProcessLib::ThermoRichardsMechanics
+{
+
+template <int DisplacementDim>
+
+void TransportPorosityModel<DisplacementDim>::eval(
+    SpaceTimeData const& x_t, MediaData const& media_data,
+    SolidCompressibilityData const& solid_compressibility_data,
+    BishopsData const& bishops_data, BishopsData const& bishops_data_prev,
+    CapillaryPressureData<DisplacementDim> const& p_cap_data,
+    PorosityData const& poro_data, StrainData<DisplacementDim> const& eps_data,
+    StrainData<DisplacementDim> const& eps_prev_data,
+    TransportPorosityData const& transport_poro_data_prev,
+    TransportPorosityData& transport_poro_data) const
+{
+    namespace MPL = MaterialPropertyLib;
+
+    auto const& medium = media_data.medium;
+
+    if (!medium.hasProperty(MPL::PropertyType::transport_porosity))
+    {
+        transport_poro_data.phi = poro_data.phi;
+        return;
+    }
+
+    MPL::VariableArray variables;
+    MPL::VariableArray variables_prev;
+
+    static constexpr int kelvin_vector_size =
+        MathLib::KelvinVector::kelvin_vector_dimensions(DisplacementDim);
+    using Invariants = MathLib::KelvinVector::Invariants<kelvin_vector_size>;
+    // Used in
+    // MaterialLib/MPL/Properties/PermeabilityOrthotropicPowerLaw.cpp
+    variables_prev.transport_porosity = transport_poro_data_prev.phi;
+
+    // Used in
+    // MaterialLib/MPL/Properties/TransportPorosityFromMassBalance.cpp
+    variables.grain_compressibility = solid_compressibility_data.beta_SR;
+    // Set volumetric strain rate for the general case without swelling.
+    variables.volumetric_strain = Invariants::trace(eps_data.eps);
+    variables_prev.volumetric_strain = Invariants::trace(eps_prev_data.eps);
+    variables.effective_pore_pressure =
+        -bishops_data.chi_S_L * p_cap_data.p_cap;
+    variables.porosity = poro_data.phi;
+
+    // Used in MaterialLib/MPL/Properties/PorosityFromMassBalance.cpp
+    // and MaterialLib/MPL/Properties/TransportPorosityFromMassBalance.cpp
+    variables_prev.effective_pore_pressure =
+        -bishops_data_prev.chi_S_L *
+        (p_cap_data.p_cap - p_cap_data.p_cap_dot * x_t.dt);
+
+    transport_poro_data.phi =
+        medium.property(MPL::PropertyType::transport_porosity)
+            .template value<double>(variables, variables_prev, x_t.x, x_t.t,
+                                    x_t.dt);
+}
+
+template struct TransportPorosityModel<2>;
+template struct TransportPorosityModel<3>;
+
+}  // namespace ProcessLib::ThermoRichardsMechanics
diff --git a/ProcessLib/ThermoRichardsMechanics/ConstitutiveCommon/TransportPorosity.h b/ProcessLib/ThermoRichardsMechanics/ConstitutiveCommon/TransportPorosity.h
index 6f70f09beec2219624baeca92e2cd7deaa104fb4..58b7f532cc800dcd5eb90f3a630a64b7b7cf5a9f 100644
--- a/ProcessLib/ThermoRichardsMechanics/ConstitutiveCommon/TransportPorosity.h
+++ b/ProcessLib/ThermoRichardsMechanics/ConstitutiveCommon/TransportPorosity.h
@@ -1 +1,48 @@
+/**
+ * \file
+ * \copyright
+ * Copyright (c) 2012-2022, OpenGeoSys Community (http://www.opengeosys.org)
+ *            Distributed under a Modified BSD License.
+ *              See accompanying file LICENSE.txt or
+ *              http://www.opengeosys.org/project/license
+ *
+ */
+
 #pragma once
+
+#include "ProcessLib/ThermoRichardsMechanics/ConstitutiveCommon/Bishops.h"
+#include "ProcessLib/ThermoRichardsMechanics/ConstitutiveCommon/Porosity.h"
+#include "ProcessLib/ThermoRichardsMechanics/ConstitutiveCommon/SolidCompressibility.h"
+
+namespace ProcessLib::ThermoRichardsMechanics
+{
+
+struct TransportPorosityData
+{
+    double phi;
+
+    static auto reflect()
+    {
+        return ProcessLib::Reflection::reflectWithName(
+            "transport_porosity", &TransportPorosityData::phi);
+    }
+};
+
+template <int DisplacementDim>
+struct TransportPorosityModel
+{
+    void eval(SpaceTimeData const& x_t, MediaData const& media_data,
+              SolidCompressibilityData const& solid_compressibility_data,
+              BishopsData const& bishops_data,
+              BishopsData const& bishops_data_prev,
+              CapillaryPressureData<DisplacementDim> const& p_cap_data,
+              PorosityData const& poro_data,
+              StrainData<DisplacementDim> const& eps_data,
+              StrainData<DisplacementDim> const& eps_prev_data,
+              TransportPorosityData const& transport_poro_data_prev,
+              TransportPorosityData& transport_poro_data) const;
+};
+
+extern template struct TransportPorosityModel<2>;
+extern template struct TransportPorosityModel<3>;
+}  // namespace ProcessLib::ThermoRichardsMechanics
diff --git a/ProcessLib/ThermoRichardsMechanics/ConstitutiveOriginal/ConstitutiveData.h b/ProcessLib/ThermoRichardsMechanics/ConstitutiveOriginal/ConstitutiveData.h
index 60f328a6ebca05587abb4af20fe262e426b02632..7bf22ee9143bfc2ddc31ddf182b831e910f71ff5 100644
--- a/ProcessLib/ThermoRichardsMechanics/ConstitutiveOriginal/ConstitutiveData.h
+++ b/ProcessLib/ThermoRichardsMechanics/ConstitutiveOriginal/ConstitutiveData.h
@@ -24,6 +24,7 @@
 #include "ProcessLib/ThermoRichardsMechanics/ConstitutiveCommon/TRMStorage.h"
 #include "ProcessLib/ThermoRichardsMechanics/ConstitutiveCommon/TRMVaporDiffusion.h"
 #include "ProcessLib/ThermoRichardsMechanics/ConstitutiveCommon/TotalStressData.h"
+#include "ProcessLib/ThermoRichardsMechanics/ConstitutiveCommon/TransportPorosity.h"
 #include "ProcessLib/ThermoRichardsMechanics/ConstitutiveOriginal/SolidMechanics.h"
 
 namespace ProcessLib::ThermoRichardsMechanics::ConstitutiveOriginal
diff --git a/ProcessLib/ThermoRichardsMechanics/ConstitutiveOriginal/ConstitutiveModels.h b/ProcessLib/ThermoRichardsMechanics/ConstitutiveOriginal/ConstitutiveModels.h
index 78532c31a527c0f0f133dd02c5392eb6d9ec5d19..db1c3855d49c8657a908f418921e8c942f6245fe 100644
--- a/ProcessLib/ThermoRichardsMechanics/ConstitutiveOriginal/ConstitutiveModels.h
+++ b/ProcessLib/ThermoRichardsMechanics/ConstitutiveOriginal/ConstitutiveModels.h
@@ -18,9 +18,11 @@
 #include "ProcessLib/ThermoRichardsMechanics/ConstitutiveCommon/Gravity.h"
 #include "ProcessLib/ThermoRichardsMechanics/ConstitutiveCommon/PermeabilityModel.h"
 #include "ProcessLib/ThermoRichardsMechanics/ConstitutiveCommon/SolidDensity.h"
+#include "ProcessLib/ThermoRichardsMechanics/ConstitutiveCommon/Swelling.h"
 #include "ProcessLib/ThermoRichardsMechanics/ConstitutiveCommon/TRMHeatStorageAndFlux.h"
 #include "ProcessLib/ThermoRichardsMechanics/ConstitutiveCommon/TRMStorage.h"
 #include "ProcessLib/ThermoRichardsMechanics/ConstitutiveCommon/TRMVaporDiffusion.h"
+#include "ProcessLib/ThermoRichardsMechanics/ConstitutiveOriginal/SolidMechanics.h"
 
 namespace ProcessLib::ThermoRichardsMechanics::ConstitutiveOriginal
 {
@@ -50,6 +52,7 @@ struct ConstitutiveModels
     SaturationModel<DisplacementDim> S_L_model;
     BishopsModel bishops_model;
     PorosityModel<DisplacementDim> poro_model;
+    TransportPorosityModel<DisplacementDim> transport_poro_model;
     SwellingModel<DisplacementDim> swelling_model;
     SolidThermalExpansionModel<DisplacementDim> s_therm_exp_model;
     SolidMechanicsModel<DisplacementDim> s_mech_model;
diff --git a/ProcessLib/ThermoRichardsMechanics/ConstitutiveOriginal/ConstitutiveSetting.cpp b/ProcessLib/ThermoRichardsMechanics/ConstitutiveOriginal/ConstitutiveSetting.cpp
index 3f9819a0638a1f8b8164145e9173481aa8b09590..99ca3c957c38cf299c9f72522fc31af52c9a6cf7 100644
--- a/ProcessLib/ThermoRichardsMechanics/ConstitutiveOriginal/ConstitutiveSetting.cpp
+++ b/ProcessLib/ThermoRichardsMechanics/ConstitutiveOriginal/ConstitutiveSetting.cpp
@@ -123,14 +123,17 @@ void ConstitutiveSetting<DisplacementDim>::eval(
 
     models.mu_L_model.eval(x_t, media_data, T_data, mu_L_data);
 
-    models.perm_model.eval(
-        x_t, media_data, solid_compressibility_data, S_L_data, bishops_data,
-        bishops_data_prev, p_cap_data, T_data, poro_data, mu_L_data,
-        state.transport_poro_data, prev_state.transport_poro_data,
-        cd.total_stress_data, state.eps_data,
+    models.transport_poro_model.eval(
+        x_t, media_data, solid_compressibility_data, bishops_data,
+        bishops_data_prev, p_cap_data, poro_data, state.eps_data,
         StrainData<DisplacementDim>{
             eps_prev_arg} /* TODO why not eqU.eps_prev? */,
-        tmp.equiv_plast_strain_data, perm_data);
+        prev_state.transport_poro_data, state.transport_poro_data);
+
+    models.perm_model.eval(x_t, media_data, S_L_data, p_cap_data, T_data,
+                           mu_L_data, state.transport_poro_data,
+                           cd.total_stress_data, tmp.equiv_plast_strain_data,
+                           perm_data);
 
     models.th_osmosis_model.eval(x_t, media_data, T_data, rho_L_data,
                                  cd.th_osmosis_data);