diff --git a/src/libslic3r/CMakeLists.txt b/src/libslic3r/CMakeLists.txt
index 53074d3bd..32d44cb5c 100644
--- a/src/libslic3r/CMakeLists.txt
+++ b/src/libslic3r/CMakeLists.txt
@@ -276,10 +276,12 @@ set(SLIC3R_SOURCES
     SlicingAdaptive.hpp
     Subdivide.cpp
     Subdivide.hpp
-    SupportSpotsGenerator.cpp
-    SupportSpotsGenerator.hpp
+    Support/SupportLayer.hpp
+    Support/SupportParameters.hpp
     SupportMaterial.cpp
     SupportMaterial.hpp
+    SupportSpotsGenerator.cpp
+    SupportSpotsGenerator.hpp
     Surface.cpp
     Surface.hpp
     SurfaceCollection.cpp
diff --git a/src/libslic3r/Support/SupportLayer.hpp b/src/libslic3r/Support/SupportLayer.hpp
new file mode 100644
index 000000000..913e28136
--- /dev/null
+++ b/src/libslic3r/Support/SupportLayer.hpp
@@ -0,0 +1,130 @@
+#ifndef slic3r_SupportLayer_hpp_
+#define slic3r_SupportLayer_hpp_
+
+#include <oneapi/tbb/scalable_allocator.h>
+#include <oneapi/tbb/spin_mutex.h>
+
+namespace Slic3r {
+
+// Support layer type to be used by SupportGeneratorLayer. This type carries a much more detailed information
+// about the support layer type than the final support layers stored in a PrintObject.
+enum class SupporLayerType {
+	Unknown = 0,
+	// Ratft base layer, to be printed with the support material.
+	RaftBase,
+	// Raft interface layer, to be printed with the support interface material. 
+	RaftInterface,
+	// Bottom contact layer placed over a top surface of an object. To be printed with a support interface material.
+	BottomContact,
+	// Dense interface layer, to be printed with the support interface material.
+	// This layer is separated from an object by an BottomContact layer.
+	BottomInterface,
+	// Sparse base support layer, to be printed with a support material.
+	Base,
+	// Dense interface layer, to be printed with the support interface material.
+	// This layer is separated from an object with TopContact layer.
+	TopInterface,
+	// Top contact layer directly supporting an overhang. To be printed with a support interface material.
+	TopContact,
+	// Some undecided type yet. It will turn into Base first, then it may turn into BottomInterface or TopInterface.
+	Intermediate,
+};
+
+// A support layer type used internally by the SupportMaterial class. This class carries a much more detailed
+// information about the support layer than the layers stored in the PrintObject, mainly
+// the SupportGeneratorLayer is aware of the bridging flow and the interface gaps between the object and the support.
+class SupportGeneratorLayer
+{
+public:
+	void reset() {
+		*this = SupportGeneratorLayer();
+	}
+
+	bool operator==(const SupportGeneratorLayer &layer2) const {
+		return print_z == layer2.print_z && height == layer2.height && bridging == layer2.bridging;
+	}
+
+	// Order the layers by lexicographically by an increasing print_z and a decreasing layer height.
+	bool operator<(const SupportGeneratorLayer &layer2) const {
+		if (print_z < layer2.print_z) {
+			return true;
+		} else if (print_z == layer2.print_z) {
+		 	if (height > layer2.height)
+		 		return true;
+		 	else if (height == layer2.height) {
+		 		// Bridging layers first.
+		 	 	return bridging && ! layer2.bridging;
+		 	} else
+		 		return false;
+		} else
+			return false;
+	}
+
+	void merge(SupportGeneratorLayer &&rhs) {
+        // The union_() does not support move semantic yet, but maybe one day it will.
+        this->polygons = union_(this->polygons, std::move(rhs.polygons));
+        auto merge = [](std::unique_ptr<Polygons> &dst, std::unique_ptr<Polygons> &src) {
+        	if (! dst || dst->empty())
+        		dst = std::move(src);
+        	else if (src && ! src->empty())
+    			*dst = union_(*dst, std::move(*src));
+        };
+        merge(this->contact_polygons,  rhs.contact_polygons);
+        merge(this->overhang_polygons, rhs.overhang_polygons);
+        merge(this->enforcer_polygons, rhs.enforcer_polygons);
+        rhs.reset();
+    }
+
+	// For the bridging flow, bottom_print_z will be above bottom_z to account for the vertical separation.
+	// For the non-bridging flow, bottom_print_z will be equal to bottom_z.
+	coordf_t bottom_print_z() const { return print_z - height; }
+
+	// To sort the extremes of top / bottom interface layers.
+	coordf_t extreme_z() const { return (this->layer_type == SupporLayerType::TopContact) ? this->bottom_z : this->print_z; }
+
+	SupporLayerType layer_type { SupporLayerType::Unknown };
+	// Z used for printing, in unscaled coordinates.
+	coordf_t print_z { 0 };
+	// Bottom Z of this layer. For soluble layers, bottom_z + height = print_z,
+	// otherwise bottom_z + gap + height = print_z.
+	coordf_t bottom_z { 0 };
+	// Layer height in unscaled coordinates.
+	coordf_t height { 0 };
+	// Index of a PrintObject layer_id supported by this layer. This will be set for top contact layers.
+	// If this is not a contact layer, it will be set to size_t(-1).
+	size_t 	 idx_object_layer_above { size_t(-1) };
+	// Index of a PrintObject layer_id, which supports this layer. This will be set for bottom contact layers.
+	// If this is not a contact layer, it will be set to size_t(-1).
+	size_t 	 idx_object_layer_below { size_t(-1) };
+	// Use a bridging flow when printing this support layer.
+	bool 	 bridging { false };
+
+	// Polygons to be filled by the support pattern.
+	Polygons polygons;
+	// Currently for the contact layers only.
+	std::unique_ptr<Polygons> contact_polygons;
+	std::unique_ptr<Polygons> overhang_polygons;
+	// Enforcers need to be propagated independently in case the "support on build plate only" option is enabled.
+	std::unique_ptr<Polygons> enforcer_polygons;
+};
+
+// Layers are allocated and owned by a deque. Once a layer is allocated, it is maintained
+// up to the end of a generate() method. The layer storage may be replaced by an allocator class in the future, 
+// which would allocate layers by multiple chunks.
+#if 0
+class SupportGeneratorLayerStorage {
+public:
+private:
+	template<typename BaseType>
+	using Allocator = tbb::scalable_allocator<BaseType>;
+	Slic3r::deque<SupportGeneratorLayer, Allocator<SupportGeneratorLayer>> 		m_data;
+	tbb::spin_mutex                         									m_mutex;
+};
+#else
+#endif
+using SupportGeneratorLayerStorage	= std::deque<SupportGeneratorLayer>;
+using SupportGeneratorLayersPtr		= std::vector<SupportGeneratorLayer*>;
+
+} // namespace Slic3r
+
+#endif /* slic3r_SupportLayer_hpp_ */
diff --git a/src/libslic3r/Support/SupportParameters.hpp b/src/libslic3r/Support/SupportParameters.hpp
new file mode 100644
index 000000000..fd4f1f8b7
--- /dev/null
+++ b/src/libslic3r/Support/SupportParameters.hpp
@@ -0,0 +1,66 @@
+#ifndef slic3r_SupportParameters_hpp_
+#define slic3r_SupportParameters_hpp_
+
+#include "../libslic3r.h"
+#include "../Flow.hpp"
+
+namespace Slic3r {
+
+class PrintObject;
+enum InfillPattern : int;
+
+struct SupportParameters {
+	SupportParameters(const PrintObject &object);
+
+	// Flow at the 1st print layer.
+	Flow 					first_layer_flow;
+	// Flow at the support base (neither top, nor bottom interface).
+	// Also flow at the raft base with the exception of raft interface and contact layers.
+	Flow 					support_material_flow;
+	// Flow at the top interface and contact layers.
+	Flow 					support_material_interface_flow;
+	// Flow at the bottom interfaces and contacts.
+	Flow 					support_material_bottom_interface_flow;
+	// Flow at raft inteface & contact layers.
+	Flow    				raft_interface_flow;
+	// Is merging of regions allowed? Could the interface & base support regions be printed with the same extruder?
+	bool 					can_merge_support_regions;
+
+    coordf_t 				support_layer_height_min;
+//	coordf_t				support_layer_height_max;
+
+	coordf_t				gap_xy;
+
+    float    				base_angle;
+    float    				interface_angle;
+
+    // Density of the top / bottom interface and contact layers.
+    coordf_t 				interface_density;
+    // Density of the raft interface and contact layers.
+    coordf_t 				raft_interface_density;
+    // Density of the base support layers.
+    coordf_t 				support_density;
+
+    // Pattern of the sparse infill including sparse raft layers.
+    InfillPattern           base_fill_pattern;
+    // Pattern of the top / bottom interface and contact layers.
+    InfillPattern           interface_fill_pattern;
+    // Pattern of the raft interface and contact layers.
+    InfillPattern           raft_interface_fill_pattern;
+    // Pattern of the contact layers.
+    InfillPattern 			contact_fill_pattern;
+    // Shall the sparse (base) layers be printed with a single perimeter line (sheath) for robustness?
+    bool                    with_sheath;
+
+    float 					raft_angle_1st_layer;
+    float 					raft_angle_base;
+    float 					raft_angle_interface;
+
+    // Produce a raft interface angle for a given SupportLayer::interface_id()
+    float 					raft_interface_angle(size_t interface_id) const 
+    	{ return this->raft_angle_interface + ((interface_id & 1) ? float(- M_PI / 4.) : float(+ M_PI / 4.)); }
+};
+
+} // namespace Slic3r
+
+#endif /* slic3r_SupportParameters_hpp_ */
diff --git a/src/libslic3r/SupportMaterial.hpp b/src/libslic3r/SupportMaterial.hpp
index 2bd321144..24dc8507e 100644
--- a/src/libslic3r/SupportMaterial.hpp
+++ b/src/libslic3r/SupportMaterial.hpp
@@ -5,171 +5,12 @@
 #include "PrintConfig.hpp"
 #include "Slicing.hpp"
 
+#include "Support/SupportLayer.hpp"
+#include "Support/SupportParameters.hpp"
+
 namespace Slic3r {
 
 class PrintObject;
-class PrintConfig;
-class PrintObjectConfig;
-
-// Support layer type to be used by SupportGeneratorLayer. This type carries a much more detailed information
-// about the support layer type than the final support layers stored in a PrintObject.
-enum class SupporLayerType {
-	Unknown = 0,
-	// Ratft base layer, to be printed with the support material.
-	RaftBase,
-	// Raft interface layer, to be printed with the support interface material. 
-	RaftInterface,
-	// Bottom contact layer placed over a top surface of an object. To be printed with a support interface material.
-	BottomContact,
-	// Dense interface layer, to be printed with the support interface material.
-	// This layer is separated from an object by an BottomContact layer.
-	BottomInterface,
-	// Sparse base support layer, to be printed with a support material.
-	Base,
-	// Dense interface layer, to be printed with the support interface material.
-	// This layer is separated from an object with TopContact layer.
-	TopInterface,
-	// Top contact layer directly supporting an overhang. To be printed with a support interface material.
-	TopContact,
-	// Some undecided type yet. It will turn into Base first, then it may turn into BottomInterface or TopInterface.
-	Intermediate,
-};
-
-// A support layer type used internally by the SupportMaterial class. This class carries a much more detailed
-// information about the support layer than the layers stored in the PrintObject, mainly
-// the SupportGeneratorLayer is aware of the bridging flow and the interface gaps between the object and the support.
-class SupportGeneratorLayer
-{
-public:
-	void reset() {
-		*this = SupportGeneratorLayer();
-	}
-
-	bool operator==(const SupportGeneratorLayer &layer2) const {
-		return print_z == layer2.print_z && height == layer2.height && bridging == layer2.bridging;
-	}
-
-	// Order the layers by lexicographically by an increasing print_z and a decreasing layer height.
-	bool operator<(const SupportGeneratorLayer &layer2) const {
-		if (print_z < layer2.print_z) {
-			return true;
-		} else if (print_z == layer2.print_z) {
-		 	if (height > layer2.height)
-		 		return true;
-		 	else if (height == layer2.height) {
-		 		// Bridging layers first.
-		 	 	return bridging && ! layer2.bridging;
-		 	} else
-		 		return false;
-		} else
-			return false;
-	}
-
-	void merge(SupportGeneratorLayer &&rhs) {
-        // The union_() does not support move semantic yet, but maybe one day it will.
-        this->polygons = union_(this->polygons, std::move(rhs.polygons));
-        auto merge = [](std::unique_ptr<Polygons> &dst, std::unique_ptr<Polygons> &src) {
-        	if (! dst || dst->empty())
-        		dst = std::move(src);
-        	else if (src && ! src->empty())
-    			*dst = union_(*dst, std::move(*src));
-        };
-        merge(this->contact_polygons,  rhs.contact_polygons);
-        merge(this->overhang_polygons, rhs.overhang_polygons);
-        merge(this->enforcer_polygons, rhs.enforcer_polygons);
-        rhs.reset();
-    }
-
-	// For the bridging flow, bottom_print_z will be above bottom_z to account for the vertical separation.
-	// For the non-bridging flow, bottom_print_z will be equal to bottom_z.
-	coordf_t bottom_print_z() const { return print_z - height; }
-
-	// To sort the extremes of top / bottom interface layers.
-	coordf_t extreme_z() const { return (this->layer_type == SupporLayerType::TopContact) ? this->bottom_z : this->print_z; }
-
-	SupporLayerType layer_type { SupporLayerType::Unknown };
-	// Z used for printing, in unscaled coordinates.
-	coordf_t print_z { 0 };
-	// Bottom Z of this layer. For soluble layers, bottom_z + height = print_z,
-	// otherwise bottom_z + gap + height = print_z.
-	coordf_t bottom_z { 0 };
-	// Layer height in unscaled coordinates.
-	coordf_t height { 0 };
-	// Index of a PrintObject layer_id supported by this layer. This will be set for top contact layers.
-	// If this is not a contact layer, it will be set to size_t(-1).
-	size_t 	 idx_object_layer_above { size_t(-1) };
-	// Index of a PrintObject layer_id, which supports this layer. This will be set for bottom contact layers.
-	// If this is not a contact layer, it will be set to size_t(-1).
-	size_t 	 idx_object_layer_below { size_t(-1) };
-	// Use a bridging flow when printing this support layer.
-	bool 	 bridging { false };
-
-	// Polygons to be filled by the support pattern.
-	Polygons polygons;
-	// Currently for the contact layers only.
-	std::unique_ptr<Polygons> contact_polygons;
-	std::unique_ptr<Polygons> overhang_polygons;
-	// Enforcers need to be propagated independently in case the "support on build plate only" option is enabled.
-	std::unique_ptr<Polygons> enforcer_polygons;
-};
-
-// Layers are allocated and owned by a deque. Once a layer is allocated, it is maintained
-// up to the end of a generate() method. The layer storage may be replaced by an allocator class in the future, 
-// which would allocate layers by multiple chunks.
-using SupportGeneratorLayerStorage	= std::deque<SupportGeneratorLayer>;
-using SupportGeneratorLayersPtr		= std::vector<SupportGeneratorLayer*>;
-
-struct SupportParameters {
-	SupportParameters(const PrintObject &object);
-
-	// Flow at the 1st print layer.
-	Flow 					first_layer_flow;
-	// Flow at the support base (neither top, nor bottom interface).
-	// Also flow at the raft base with the exception of raft interface and contact layers.
-	Flow 					support_material_flow;
-	// Flow at the top interface and contact layers.
-	Flow 					support_material_interface_flow;
-	// Flow at the bottom interfaces and contacts.
-	Flow 					support_material_bottom_interface_flow;
-	// Flow at raft inteface & contact layers.
-	Flow    				raft_interface_flow;
-	// Is merging of regions allowed? Could the interface & base support regions be printed with the same extruder?
-	bool 					can_merge_support_regions;
-
-    coordf_t 				support_layer_height_min;
-//	coordf_t				support_layer_height_max;
-
-	coordf_t				gap_xy;
-
-    float    				base_angle;
-    float    				interface_angle;
-
-    // Density of the top / bottom interface and contact layers.
-    coordf_t 				interface_density;
-    // Density of the raft interface and contact layers.
-    coordf_t 				raft_interface_density;
-    // Density of the base support layers.
-    coordf_t 				support_density;
-
-    // Pattern of the sparse infill including sparse raft layers.
-    InfillPattern           base_fill_pattern;
-    // Pattern of the top / bottom interface and contact layers.
-    InfillPattern           interface_fill_pattern;
-    // Pattern of the raft interface and contact layers.
-    InfillPattern           raft_interface_fill_pattern;
-    // Pattern of the contact layers.
-    InfillPattern 			contact_fill_pattern;
-    // Shall the sparse (base) layers be printed with a single perimeter line (sheath) for robustness?
-    bool                    with_sheath;
-
-    float 					raft_angle_1st_layer;
-    float 					raft_angle_base;
-    float 					raft_angle_interface;
-
-    // Produce a raft interface angle for a given SupportLayer::interface_id()
-    float 					raft_interface_angle(size_t interface_id) const 
-    	{ return this->raft_angle_interface + ((interface_id & 1) ? float(- M_PI / 4.) : float(+ M_PI / 4.)); }
-};
 
 // Remove bridges from support contact areas.
 // To be called if PrintObjectConfig::dont_support_bridges.
diff --git a/src/libslic3r/TreeSupport.hpp b/src/libslic3r/TreeSupport.hpp
index 2c87a132d..2ed5d50ec 100644
--- a/src/libslic3r/TreeSupport.hpp
+++ b/src/libslic3r/TreeSupport.hpp
@@ -11,6 +11,7 @@
 
 #include "TreeModelVolumes.hpp"
 #include "Point.hpp"
+#include "Support/SupportLayer.hpp"
 
 #include <boost/container/small_vector.hpp>
 
@@ -39,10 +40,7 @@ namespace Slic3r
 // Forward declarations
 class Print;
 class PrintObject;
-class SupportGeneratorLayer;
 struct SlicingParameters;
-using SupportGeneratorLayerStorage  = std::deque<SupportGeneratorLayer>;
-using SupportGeneratorLayersPtr     = std::vector<SupportGeneratorLayer*>;
 
 namespace FFFTreeSupport
 {
diff --git a/src/libslic3r/pchheader.hpp b/src/libslic3r/pchheader.hpp
index 9017a5dea..e71b1461c 100644
--- a/src/libslic3r/pchheader.hpp
+++ b/src/libslic3r/pchheader.hpp
@@ -107,6 +107,7 @@
 #include <boost/version.hpp>
 
 #include <tbb/parallel_for.h>
+#include <tbb/scalable_allocator.h>
 #include <tbb/spin_mutex.h>
 #include <tbb/task_group.h>