diff --git a/src/Avalonia.Base/Animation/Easings/SpringEasing.cs b/src/Avalonia.Base/Animation/Easings/SpringEasing.cs
new file mode 100644
index 0000000000..70e74c639f
--- /dev/null
+++ b/src/Avalonia.Base/Animation/Easings/SpringEasing.cs
@@ -0,0 +1,80 @@
+namespace Avalonia.Animation.Easings;
+
+///
+/// Eases a value using a user-defined spring formula.
+///
+public class SpringEasing : Easing
+{
+ private readonly Spring _internalSpring;
+
+ ///
+ /// The spring mass.
+ ///
+ public double Mass
+ {
+ get => _internalSpring.Mass;
+ set
+ {
+ _internalSpring.Mass = value;
+ }
+ }
+
+ ///
+ /// The spring stiffness.
+ ///
+ public double Stiffness
+ {
+ get => _internalSpring.Stiffness;
+ set
+ {
+ _internalSpring.Stiffness = value;
+ }
+ }
+
+ ///
+ /// The spring damping.
+ ///
+ public double Damping
+ {
+ get => _internalSpring.Damping;
+ set
+ {
+ _internalSpring.Damping = value;
+ }
+ }
+
+ ///
+ /// The spring initial velocity.
+ ///
+ public double InitialVelocity
+ {
+ get => _internalSpring.InitialVelocity;
+ set
+ {
+ _internalSpring.InitialVelocity = value;
+ }
+ }
+
+ public SpringEasing(double mass = 0d, double stiffness = 0d, double damping = 0d, double initialVelocity = 0d)
+ {
+ _internalSpring = new Spring();
+
+ Mass = mass;
+ Stiffness = stiffness;
+ Damping = damping;
+ InitialVelocity = initialVelocity;
+ }
+
+ public SpringEasing(Spring keySpline)
+ {
+ _internalSpring = keySpline;
+ }
+
+ public SpringEasing()
+ {
+ _internalSpring = new Spring();
+ }
+
+ ///
+ public override double Ease(double progress) => _internalSpring.GetSpringProgress(progress);
+}