diff --git a/src/libslic3r/Format/3mf.cpp b/src/libslic3r/Format/3mf.cpp
index 88e1a9047..376b34ca8 100644
--- a/src/libslic3r/Format/3mf.cpp
+++ b/src/libslic3r/Format/3mf.cpp
@@ -1713,7 +1713,9 @@ namespace Slic3r {
                     break;
                 }
             }
+#if !ENABLE_KEEP_LOADED_VOLUME_TRANSFORM_AS_STAND_ALONE
             Transform3d inv_matrix = volume_matrix_to_object.inverse();
+#endif // !ENABLE_KEEP_LOADED_VOLUME_TRANSFORM_AS_STAND_ALONE
 
             // splits volume out of imported geometry
 			TriangleMesh triangle_mesh;
@@ -1733,11 +1735,15 @@ namespace Slic3r {
                 for (unsigned int v = 0; v < 3; ++v)
                 {
                     unsigned int tri_id = geometry.triangles[src_start_id + ii + v] * 3;
+#if ENABLE_KEEP_LOADED_VOLUME_TRANSFORM_AS_STAND_ALONE
+                    facet.vertex[v] = Vec3f(geometry.vertices[tri_id + 0], geometry.vertices[tri_id + 1], geometry.vertices[tri_id + 2]);
+#else
                     Vec3f vertex(geometry.vertices[tri_id + 0], geometry.vertices[tri_id + 1], geometry.vertices[tri_id + 2]);
                     facet.vertex[v] = has_transform ?
                         // revert the vertices to the original mesh reference system
                         (inv_matrix * vertex.cast<double>()).cast<float>() :
                         vertex;
+#endif // ENABLE_KEEP_LOADED_VOLUME_TRANSFORM_AS_STAND_ALONE
                 }
             }
 
@@ -1745,9 +1751,15 @@ namespace Slic3r {
 			triangle_mesh.repair();
 
 			ModelVolume* volume = object.add_volume(std::move(triangle_mesh));
+#if ENABLE_KEEP_LOADED_VOLUME_TRANSFORM_AS_STAND_ALONE
+            // stores the volume matrix taken from the metadata, if present
+            if (has_transform)
+                volume->source.transform = Slic3r::Geometry::Transformation(volume_matrix_to_object);
+#else
             // apply the volume matrix taken from the metadata, if present
             if (has_transform)
                 volume->set_transformation(Slic3r::Geometry::Transformation(volume_matrix_to_object));
+#endif //ENABLE_KEEP_LOADED_VOLUME_TRANSFORM_AS_STAND_ALONE
             volume->calculate_convex_hull();
 
             // apply the remaining volume's metadata
@@ -2521,7 +2533,11 @@ namespace Slic3r {
 
                             // stores volume's local matrix
                             stream << "   <" << METADATA_TAG << " " << TYPE_ATTR << "=\"" << VOLUME_TYPE << "\" " << KEY_ATTR << "=\"" << MATRIX_KEY << "\" " << VALUE_ATTR << "=\"";
+#if ENABLE_KEEP_LOADED_VOLUME_TRANSFORM_AS_STAND_ALONE
+                            Transform3d matrix = volume->get_matrix() * volume->source.transform.get_matrix();
+#else
                             const Transform3d& matrix = volume->get_matrix();
+#endif // ENABLE_KEEP_LOADED_VOLUME_TRANSFORM_AS_STAND_ALONE
                             for (int r = 0; r < 4; ++r)
                             {
                                 for (int c = 0; c < 4; ++c)
diff --git a/src/libslic3r/Format/AMF.cpp b/src/libslic3r/Format/AMF.cpp
index 4b19b8060..847ac6f5c 100644
--- a/src/libslic3r/Format/AMF.cpp
+++ b/src/libslic3r/Format/AMF.cpp
@@ -585,24 +585,36 @@ void AMFParserContext::endElement(const char * /* name */)
         stl_allocate(&stl);
 
         bool has_transform = ! m_volume_transform.isApprox(Transform3d::Identity(), 1e-10);
+#if !ENABLE_KEEP_LOADED_VOLUME_TRANSFORM_AS_STAND_ALONE
         Transform3d inv_matrix = m_volume_transform.inverse();
+#endif // !ENABLE_KEEP_LOADED_VOLUME_TRANSFORM_AS_STAND_ALONE
         for (size_t i = 0; i < m_volume_facets.size();) {
             stl_facet &facet = stl.facet_start[i/3];
             for (unsigned int v = 0; v < 3; ++v)
             {
                 unsigned int tri_id = m_volume_facets[i++] * 3;
+#if ENABLE_KEEP_LOADED_VOLUME_TRANSFORM_AS_STAND_ALONE
+                facet.vertex[v] = Vec3f(m_object_vertices[tri_id + 0], m_object_vertices[tri_id + 1], m_object_vertices[tri_id + 2]);
+#else
                 Vec3f vertex(m_object_vertices[tri_id + 0], m_object_vertices[tri_id + 1], m_object_vertices[tri_id + 2]);
                 facet.vertex[v] = has_transform ?
                     // revert the vertices to the original mesh reference system
                     (inv_matrix * vertex.cast<double>()).cast<float>() :
                     vertex;
+#endif // ENABLE_KEEP_LOADED_VOLUME_TRANSFORM_AS_STAND_ALONE
             }
         }        
         stl_get_size(&stl);
         mesh.repair();
 		m_volume->set_mesh(std::move(mesh));
-		if (has_transform)
-			m_volume->set_transformation(m_volume_transform);
+#if ENABLE_KEEP_LOADED_VOLUME_TRANSFORM_AS_STAND_ALONE
+        // stores the volume matrix taken from the metadata, if present
+        if (has_transform)
+            m_volume->source.transform = Slic3r::Geometry::Transformation(m_volume_transform);
+#else
+        if (has_transform)
+            m_volume->set_transformation(m_volume_transform);
+#endif // ENABLE_KEEP_LOADED_VOLUME_TRANSFORM_AS_STAND_ALONE
         if (m_volume->source.input_file.empty() && (m_volume->type() == ModelVolumeType::MODEL_PART))
         {
             m_volume->source.object_idx = (int)m_model.objects.size() - 1;
@@ -1147,8 +1159,12 @@ bool store_amf(const char *path, Model *model, const DynamicPrintConfig *config)
                 stream << "        <metadata type=\"slic3r.modifier\">1</metadata>\n";
             stream << "        <metadata type=\"slic3r.volume_type\">" << ModelVolume::type_to_string(volume->type()) << "</metadata>\n";
             stream << "        <metadata type=\"slic3r.matrix\">";
+#if ENABLE_KEEP_LOADED_VOLUME_TRANSFORM_AS_STAND_ALONE
+            const Transform3d& matrix = volume->get_matrix() * volume->source.transform.get_matrix();
+#else
             const Transform3d& matrix = volume->get_matrix();
-			stream << std::setprecision(std::numeric_limits<double>::max_digits10);
+#endif // ENABLE_KEEP_LOADED_VOLUME_TRANSFORM_AS_STAND_ALONE
+            stream << std::setprecision(std::numeric_limits<double>::max_digits10);
             for (int r = 0; r < 4; ++r)
             {
                 for (int c = 0; c < 4; ++c)
@@ -1248,7 +1264,7 @@ bool store_amf(const char *path, Model *model, const DynamicPrintConfig *config)
             pt::write_xml(oss, tree);
             out = oss.str();
 
-            int del_header_pos = out.find("<custom_gcodes_per_height");
+            size_t del_header_pos = out.find("<custom_gcodes_per_height");
             if (del_header_pos != std::string::npos)
                 out.erase(out.begin(), out.begin() + del_header_pos);
 
diff --git a/src/libslic3r/Model.hpp b/src/libslic3r/Model.hpp
index a6ee04600..c5a992e49 100644
--- a/src/libslic3r/Model.hpp
+++ b/src/libslic3r/Model.hpp
@@ -399,8 +399,13 @@ public:
         int object_idx{ -1 };
         int volume_idx{ -1 };
         Vec3d mesh_offset{ Vec3d::Zero() };
+#if ENABLE_KEEP_LOADED_VOLUME_TRANSFORM_AS_STAND_ALONE
+        Geometry::Transformation transform;
 
+        template<class Archive> void serialize(Archive& ar) { ar(input_file, object_idx, volume_idx, mesh_offset, transform); }
+#else
         template<class Archive> void serialize(Archive& ar) { ar(input_file, object_idx, volume_idx, mesh_offset); }
+#endif // ENABLE_KEEP_LOADED_VOLUME_TRANSFORM_AS_STAND_ALONE
     };
     Source              source;
 
diff --git a/src/libslic3r/Technologies.hpp b/src/libslic3r/Technologies.hpp
index d503f0c64..3d1234cbf 100644
--- a/src/libslic3r/Technologies.hpp
+++ b/src/libslic3r/Technologies.hpp
@@ -56,4 +56,7 @@
 // Enable closing 3Dconnextion imgui settings dialog by clicking on [X] and [Close] buttons
 #define ENABLE_3DCONNEXION_DEVICES_CLOSE_SETTING_DIALOG (1 && ENABLE_2_2_0_ALPHA1)
 
+// Enable not applying volume transformation during 3mf and amf loading, but keeping it as a ModelVolume member
+#define ENABLE_KEEP_LOADED_VOLUME_TRANSFORM_AS_STAND_ALONE (1 && ENABLE_2_2_0_ALPHA1)
+
 #endif // _technologies_h_
diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp
index 8b452e9af..ef3dae8d6 100644
--- a/src/slic3r/GUI/Plater.cpp
+++ b/src/slic3r/GUI/Plater.cpp
@@ -3322,7 +3322,11 @@ void Plater::priv::reload_from_disk()
                     new_volume->config.apply(old_volume->config);
                     new_volume->set_type(old_volume->type());
                     new_volume->set_material_id(old_volume->material_id());
+#if ENABLE_KEEP_LOADED_VOLUME_TRANSFORM_AS_STAND_ALONE
+                    new_volume->set_transformation(old_volume->get_transformation() * old_volume->source.transform);
+#else
                     new_volume->set_transformation(old_volume->get_transformation());
+#endif // ENABLE_KEEP_LOADED_VOLUME_TRANSFORM_AS_STAND_ALONE
                     new_volume->translate(new_volume->get_transformation().get_matrix(true) * (new_volume->source.mesh_offset - old_volume->source.mesh_offset));
                     new_volume->source.input_file = path;
                     std::swap(old_model_object->volumes[old_v.volume_idx], old_model_object->volumes.back());