diff --git a/xs/src/Line.hpp b/xs/src/Line.hpp
index 94e400595..466f5efae 100644
--- a/xs/src/Line.hpp
+++ b/xs/src/Line.hpp
@@ -23,6 +23,7 @@ class Line
     void from_SV(SV* line_sv);
     void from_SV_check(SV* line_sv);
     SV* to_SV();
+    SV* to_SV_ref();
     SV* to_SV_pureperl();
     void scale(double factor);
     void translate(double x, double y);
@@ -93,6 +94,13 @@ Line::to_SV() {
     return newRV_noinc((SV*)av);
 }
 
+SV*
+Line::to_SV_ref() {
+    SV* sv = newSV(0);
+    sv_setref_pv( sv, "Slic3r::Line", new Line(*this) );
+    return sv;
+}
+
 SV*
 Line::to_SV_pureperl() {
     AV* av = newAV();
@@ -102,6 +110,19 @@ Line::to_SV_pureperl() {
     return newRV_noinc((SV*)av);
 }
 
+SV*
+lines2perl(pTHX_ Lines& lines)
+{
+    AV* av = newAV();
+    av_extend(av, lines.size()-1);
+    int i = 0;
+    for (Lines::iterator it = lines.begin(); it != lines.end(); ++it) {
+        SV* sv = (*it).to_SV_ref();
+        av_store(av, i++, sv);
+    }
+    return (SV*)newRV_noinc((SV*)av);
+}
+
 }
 
 #endif
diff --git a/xs/t/06_polygon.t b/xs/t/06_polygon.t
index d024fd76c..566120021 100644
--- a/xs/t/06_polygon.t
+++ b/xs/t/06_polygon.t
@@ -14,7 +14,7 @@ my $square = [  # ccw
 ];
 
 my $polygon = Slic3r::Polygon->new(@$square);
-is_deeply [ @{$polygon->pp} ], [ @$square ], 'polygon roundtrip';
+is_deeply $polygon->pp, $square, 'polygon roundtrip';
 
 is ref($polygon->arrayref), 'ARRAY', 'polygon arrayref is unblessed';
 isa_ok $polygon->[0], 'Slic3r::Point', 'polygon point is blessed';
diff --git a/xs/xsp/Polyline.xsp b/xs/xsp/Polyline.xsp
index 11e0500d5..acce6b560 100644
--- a/xs/xsp/Polyline.xsp
+++ b/xs/xsp/Polyline.xsp
@@ -16,6 +16,7 @@
     void pop_back()
         %code{% THIS->points.pop_back(); %};
     void reverse();
+    Lines lines();
 %{
 
 Polyline*
diff --git a/xs/xsp/my.map b/xs/xsp/my.map
index a1f66e08e..c6c55c3d6 100644
--- a/xs/xsp/my.map
+++ b/xs/xsp/my.map
@@ -13,3 +13,17 @@ SurfaceCollection*      O_OBJECT
 
 ExtrusionRole     T_UV
 SurfaceType     T_UV
+
+Lines           T_LINES
+Lines*          T_LINES_PTR
+
+INPUT
+
+OUTPUT
+
+T_LINES
+	$arg = lines2perl(aTHX_ $var);
+
+T_LINES_PTR
+	$arg = lines2perl(aTHX_ *$var);
+	delete $var;
diff --git a/xs/xsp/typemap.xspt b/xs/xsp/typemap.xspt
index 62c73e92b..2357bdf8e 100644
--- a/xs/xsp/typemap.xspt
+++ b/xs/xsp/typemap.xspt
@@ -6,6 +6,8 @@
 %typemap{ExPolygon*};
 %typemap{Polyline*};
 %typemap{Polygon*};
+%typemap{Lines};
+
 %typemap{SurfaceType}{parsed}{
   %cpp_type{SurfaceType};
   %precall_code{%