diff --git a/src/libslic3r/MultiMaterialSegmentation.cpp b/src/libslic3r/MultiMaterialSegmentation.cpp
index 011851614..cccb67f37 100644
--- a/src/libslic3r/MultiMaterialSegmentation.cpp
+++ b/src/libslic3r/MultiMaterialSegmentation.cpp
@@ -1360,25 +1360,27 @@ std::vector<std::vector<std::pair<ExPolygon, size_t>>> multi_material_segmentati
     std::vector<Polygons>                                  input_polygons(layers.size());
 
     // Merge all regions and remove small holes
-    for(size_t layer_idx = 0; layer_idx < layers.size(); layer_idx += 1) {
-        ExPolygons ex_polygons;
-        for (LayerRegion *region : layers[layer_idx]->regions())
-            for (const Surface &surface : region->slices.surfaces)
-                Slic3r::append(ex_polygons, offset_ex(surface.expolygon, SCALED_EPSILON));
-        // All expolygons are expanded by SCALED_EPSILON, merged, and then shrunk again by SCALED_EPSILON
-        // to ensure that very close polygons will be merged.
-        ex_polygons = union_ex(ex_polygons);
-        // Remove all expolygons and holes with an area less than 0.01mm^2
-        remove_small_and_small_holes(ex_polygons, Slic3r::sqr(scale_(0.1f)));
-        // Occasionally, some input polygons contained self-intersections that caused problems with Voronoi diagrams
-        // and consequently with the extraction of colored segments by function extract_colored_segments.
-        // Calling simplify_polygons removes these self-intersections.
-        // Also, occasionally input polygons contained several points very close together (distance between points is 1 or so).
-        // Such close points sometimes caused that the Voronoi diagram has self-intersecting edges around these vertices.
-        // This consequently leads to issues with the extraction of colored segments by function extract_colored_segments.
-        // Calling expolygons_simplify fixed these issues.
-        input_polygons[layer_idx] = simplify_polygons(to_polygons(expolygons_simplify(offset_ex(ex_polygons, -SCALED_EPSILON), SCALED_EPSILON)));
-    }
+    tbb::parallel_for(tbb::blocked_range<size_t>(0, layers.size()), [&](const tbb::blocked_range<size_t> &range) {
+        for (size_t layer_idx = range.begin(); layer_idx < range.end(); ++layer_idx) {
+            ExPolygons ex_polygons;
+            for (LayerRegion *region : layers[layer_idx]->regions())
+                for (const Surface &surface : region->slices.surfaces)
+                    Slic3r::append(ex_polygons, offset_ex(surface.expolygon, SCALED_EPSILON));
+            // All expolygons are expanded by SCALED_EPSILON, merged, and then shrunk again by SCALED_EPSILON
+            // to ensure that very close polygons will be merged.
+            ex_polygons = union_ex(ex_polygons);
+            // Remove all expolygons and holes with an area less than 0.01mm^2
+            remove_small_and_small_holes(ex_polygons, Slic3r::sqr(scale_(0.1f)));
+            // Occasionally, some input polygons contained self-intersections that caused problems with Voronoi diagrams
+            // and consequently with the extraction of colored segments by function extract_colored_segments.
+            // Calling simplify_polygons removes these self-intersections.
+            // Also, occasionally input polygons contained several points very close together (distance between points is 1 or so).
+            // Such close points sometimes caused that the Voronoi diagram has self-intersecting edges around these vertices.
+            // This consequently leads to issues with the extraction of colored segments by function extract_colored_segments.
+            // Calling expolygons_simplify fixed these issues.
+            input_polygons[layer_idx] = simplify_polygons(to_polygons(expolygons_simplify(offset_ex(ex_polygons, -SCALED_EPSILON), SCALED_EPSILON)));
+        }
+    }); // end of parallel_for
 
     for (size_t layer_idx = 0; layer_idx < layers.size(); ++layer_idx) {
         BoundingBox  bbox(get_extents(input_polygons[layer_idx]));