diff --git a/MaterialLib/SolidModels/Ehlers.cpp b/MaterialLib/SolidModels/Ehlers.cpp
index 22beb5e4f317ad9079d6795e5dc8dacd4452dfd1..6441dfe15046db80e7e73d61ce39946111a7e52b 100644
--- a/MaterialLib/SolidModels/Ehlers.cpp
+++ b/MaterialLib/SolidModels/Ehlers.cpp
@@ -46,6 +46,11 @@ namespace Solids
 {
 namespace Ehlers
 {
+template <int DisplacementDim>
+double StateVariables<DisplacementDim>::getEquivalentPlasticStrain() const
+{
+    return std::sqrt(2.0 / 3.0 * Invariants::FrobeniusNorm(eps_p.D.eval()));
+}
 
 /// Special product of \c v with itself: \f$v \odot v\f$.
 /// The tensor \c v is given in Kelvin mapping.
diff --git a/MaterialLib/SolidModels/Ehlers.h b/MaterialLib/SolidModels/Ehlers.h
index cba3c48143eba92cecdb70184038630ab65e1d9f..8cbc59da90f9530aeba3fe3ec99614085cd0f240 100644
--- a/MaterialLib/SolidModels/Ehlers.h
+++ b/MaterialLib/SolidModels/Ehlers.h
@@ -232,6 +232,11 @@ struct StateVariables
         damage_prev = damage;
     }
 
+    double getEquivalentPlasticStrain() const override;
+
+    static int const KelvinVectorSize =
+        MathLib::KelvinVector::KelvinVectorDimensions<DisplacementDim>::value;
+    using Invariants = MathLib::KelvinVector::Invariants<KelvinVectorSize>;
     using KelvinVector =
         MathLib::KelvinVector::KelvinVectorType<DisplacementDim>;
 
diff --git a/MaterialLib/SolidModels/MechanicsBase.h b/MaterialLib/SolidModels/MechanicsBase.h
index 52d66f4840f681e49cc0da4bbfcfc4c04442e3cf..936a372be4b64c321ec3946c478045760c9e87d9 100644
--- a/MaterialLib/SolidModels/MechanicsBase.h
+++ b/MaterialLib/SolidModels/MechanicsBase.h
@@ -59,6 +59,7 @@ struct MechanicsBase
     {
         virtual ~MaterialStateVariables() = default;
         virtual void pushBackState(){};
+        virtual double getEquivalentPlasticStrain() const { return 0.0; }
     };
 
     /// Polymorphic creator for MaterialStateVariables objects specific for a