diff --git a/xs/src/libslic3r/SupportMaterial.cpp b/xs/src/libslic3r/SupportMaterial.cpp
index d64f135bf..9425b2f9f 100644
--- a/xs/src/libslic3r/SupportMaterial.cpp
+++ b/xs/src/libslic3r/SupportMaterial.cpp
@@ -268,7 +268,7 @@ void PrintObjectSupportMaterial::generate(PrintObject &object)
     MyLayersPtr intermediate_layers = this->raft_and_intermediate_support_layers(
         object, bottom_contacts, top_contacts, layer_storage, max_object_layer_height);
 
-    this->trim_support_layers_by_object(object, top_contacts, m_support_layer_height_min, 0., m_gap_xy);
+	this->trim_support_layers_by_object(object, top_contacts, m_slicing_params.soluble_interface ? 0. : m_support_layer_height_min, 0., m_gap_xy);
 
     BOOST_LOG_TRIVIAL(info) << "Support generator - Creating base layers";
 
@@ -683,13 +683,17 @@ PrintObjectSupportMaterial::MyLayersPtr PrintObjectSupportMaterial::top_contact_
             new_layer.idx_object_layer_above = layer_id;
             if (m_slicing_params.soluble_interface) {
                 // Align the contact surface height with a layer immediately below the supported layer.
-                new_layer.height = layer_below ? 
-                    // Interface layer will be synchronized with the object.
-                    object.layers[layer_id-1]->height : 
-                    // Don't know the thickness of the raft layer yet.
-                    0.;
-                new_layer.print_z = layer.print_z - layer.height;
-                new_layer.bottom_z = new_layer.print_z - new_layer.height;
+				new_layer.print_z = layer.print_z - layer.height;
+				if (layer_id == 0) {
+					// This is a raft contact layer sitting directly on the print bed.
+                    new_layer.height   = m_slicing_params.contact_raft_layer_height;
+					new_layer.bottom_z = m_slicing_params.raft_interface_top_z;
+				} else {
+					// Interface layer will be synchronized with the object.
+					assert(layer_below != nullptr);
+					new_layer.height = object.layers[layer_id - 1]->height;
+					new_layer.bottom_z = new_layer.print_z - new_layer.height;
+				}
 			} else {
                 // Contact layer will be printed with a normal flow, but
                 // it will support layers printed with a bridging flow.
@@ -958,7 +962,7 @@ PrintObjectSupportMaterial::MyLayersPtr PrintObjectSupportMaterial::bottom_conta
         std::reverse(bottom_contacts.begin(), bottom_contacts.end());
     } // ! top_contacts.empty()
 
-    trim_support_layers_by_object(object, bottom_contacts, m_support_layer_height_min, 0., m_gap_xy);
+    trim_support_layers_by_object(object, bottom_contacts,  m_slicing_params.soluble_interface ? 0. : m_support_layer_height_min, 0., m_gap_xy);
 
     return bottom_contacts;
 }
@@ -1269,7 +1273,7 @@ void PrintObjectSupportMaterial::generate_base_layers(
     ++ iRun;
 #endif /* SLIC3R_DEBUG */
 
-    trim_support_layers_by_object(object, intermediate_layers, m_support_layer_height_min, m_support_layer_height_min, m_gap_xy);
+    trim_support_layers_by_object(object, intermediate_layers,  m_slicing_params.soluble_interface ? 0. : m_support_layer_height_min,  m_slicing_params.soluble_interface ? 0. : m_support_layer_height_min, m_gap_xy);
 }
 
 void PrintObjectSupportMaterial::trim_support_layers_by_object(
@@ -1288,8 +1292,8 @@ void PrintObjectSupportMaterial::trim_support_layers_by_object(
             (it_layer - support_layers.begin()) << " of " << support_layers.size();
 
         MyLayer &support_layer = *(*it_layer);
-        if (support_layer.polygons.empty())
-            // Empty support layer, nothing to trim.
+        if (support_layer.polygons.empty() || support_layer.print_z < m_slicing_params.raft_contact_top_z + EPSILON)
+            // Empty support layer or a raft layer, nothing to trim.
             continue;
         // Find the overlapping object layers including the extra above / below gap.
         while (idx_object_layer_overlapping < object.layer_count() &&