diff --git a/src/Avalonia.Visuals/Media/PolyLineSegment.cs b/src/Avalonia.Visuals/Media/PolyLineSegment.cs
new file mode 100644
index 0000000000..55bfb33041
--- /dev/null
+++ b/src/Avalonia.Visuals/Media/PolyLineSegment.cs
@@ -0,0 +1,61 @@
+using System.Collections.Generic;
+using Avalonia.Collections;
+
+namespace Avalonia.Media
+{
+ ///
+ /// Represents a set of line segments defined by a points collection with each Point specifying the end point of a line segment.
+ ///
+ public sealed class PolyLineSegment : PathSegment
+ {
+ ///
+ /// Defines the property.
+ ///
+ public static readonly StyledProperty PointsProperty
+ = AvaloniaProperty.Register(nameof(Points));
+
+ ///
+ /// Gets or sets the points.
+ ///
+ ///
+ /// The points.
+ ///
+ public AvaloniaList Points
+ {
+ get => GetValue(PointsProperty);
+ set => SetValue(PointsProperty, value);
+ }
+
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ public PolyLineSegment()
+ {
+ Points = new Points();
+ }
+
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ /// The points.
+ public PolyLineSegment(IEnumerable points) : this()
+ {
+ Points.AddRange(points);
+ }
+
+ protected internal override void ApplyTo(StreamGeometryContext ctx)
+ {
+ var points = Points;
+ if (points.Count > 0)
+ {
+ for (int i = 0; i < points.Count; i++)
+ {
+ ctx.LineTo(points[i]);
+ }
+ }
+ }
+
+ public override string ToString()
+ => Points.Count >= 1 ? "L " + string.Join(" ", Points) : "";
+ }
+}