diff --git a/xs/src/TriangleMesh.cpp b/xs/src/TriangleMesh.cpp
index 34dc0943c..4ed53f3fc 100644
--- a/xs/src/TriangleMesh.cpp
+++ b/xs/src/TriangleMesh.cpp
@@ -102,4 +102,9 @@ TriangleMesh::WriteOBJFile(char* output_file) {
     stl_write_obj(&stl, output_file);
 }
 
+void TriangleMesh::scale(float factor)
+{
+    stl_scale(&(this->stl), factor);
+}
+
 }
diff --git a/xs/src/TriangleMesh.hpp b/xs/src/TriangleMesh.hpp
index 27aca770b..ecd597173 100644
--- a/xs/src/TriangleMesh.hpp
+++ b/xs/src/TriangleMesh.hpp
@@ -15,6 +15,7 @@ class TriangleMesh
     void ReadFromPerl(SV* vertices, SV* facets);
     void Repair();
     void WriteOBJFile(char* output_file);
+    void scale(float factor);
     stl_file stl;
 };
 
diff --git a/xs/src/admesh/util.c b/xs/src/admesh/util.c
index 6b951e190..6ff6488ed 100644
--- a/xs/src/admesh/util.c
+++ b/xs/src/admesh/util.c
@@ -106,6 +106,7 @@ stl_scale(stl_file *stl, float factor)
   int i;
   int j;
   
+  // scale extents
   stl->stats.min.x *= factor;
   stl->stats.min.y *= factor;
   stl->stats.min.z *= factor;
@@ -113,6 +114,11 @@ stl_scale(stl_file *stl, float factor)
   stl->stats.max.y *= factor;
   stl->stats.max.z *= factor;
   
+  // scale volume
+  if (stl->stats.volume > 0.0) {
+    stl->stats.volume *= (factor * factor * factor);
+  }
+  
   for(i = 0; i < stl->stats.number_of_facets; i++)
     {
       for(j = 0; j < 3; j++)
diff --git a/xs/t/01_trianglemesh.t b/xs/t/01_trianglemesh.t
index cc08f6216..e766306a0 100644
--- a/xs/t/01_trianglemesh.t
+++ b/xs/t/01_trianglemesh.t
@@ -4,7 +4,7 @@ use strict;
 use warnings;
 
 use Slic3r::XS;
-use Test::More tests => 5;
+use Test::More tests => 6;
 
 is Slic3r::TriangleMesh::XS::hello_world(), 'Hello world!',
     'hello world';
@@ -23,9 +23,14 @@ my $cube = {
     is_deeply $vertices, $cube->{vertices}, 'vertices arrayref roundtrip';
     is_deeply $facets, $cube->{facets}, 'facets arrayref roundtrip';
     
-    my $stats = $m->stats;
-    is $stats->{number_of_facets}, scalar(@{ $cube->{facets} }), 'stats.number_of_facets';
-    ok abs($stats->{volume} - 20*20*20) < 1E-3, 'stats.volume';
+    {
+        my $stats = $m->stats;
+        is $stats->{number_of_facets}, scalar(@{ $cube->{facets} }), 'stats.number_of_facets';
+        ok abs($stats->{volume} - 20*20*20) < 1E-2, 'stats.volume';
+    }
+    
+    $m->scale(2);
+    ok abs($m->stats->{volume} - 40*40*40) < 1E-2, 'scale';
 }
 
 __END__
diff --git a/xs/xsp/TriangleMesh.xsp b/xs/xsp/TriangleMesh.xsp
index 3eb40eea8..75753971a 100644
--- a/xs/xsp/TriangleMesh.xsp
+++ b/xs/xsp/TriangleMesh.xsp
@@ -12,6 +12,7 @@
     void ReadFromPerl(SV* vertices, SV* facets);
     void Repair();
     void WriteOBJFile(char* output_file);
+    void scale(float factor);
 %{
 
 SV*