diff --git a/src/libslic3r/Brim.cpp b/src/libslic3r/Brim.cpp
index 29ec60c46..49f6a9c83 100644
--- a/src/libslic3r/Brim.cpp
+++ b/src/libslic3r/Brim.cpp
@@ -402,9 +402,13 @@ ExtrusionEntityCollection make_brim(const Print &print, PrintTryCancel try_cance
         const BrimType &bt = object->config().brim_type;
         return (bt == btOuterOnly || bt == btOuterAndInner) && print.config().skirt_distance.value < object->config().brim_width;
     });
+
+    const bool draft_shield = print.config().draft_shield;
+
+
     // If there is a possibility that brim intersects skirt, go through loops and split those extrusions
     // The result is either the original Polygon or a list of Polylines
-    if (! print.skirt().empty() && could_brim_intersects_skirt)
+    if (draft_shield && ! print.skirt().empty() && could_brim_intersects_skirt)
     {
         // Find the bounding polygons of the skirt
         const Polygons skirt_inners = offset(dynamic_cast<ExtrusionLoop*>(print.skirt().entities.back())->polygon(),
diff --git a/src/libslic3r/Print.cpp b/src/libslic3r/Print.cpp
index 975c9d57e..22b10315c 100644
--- a/src/libslic3r/Print.cpp
+++ b/src/libslic3r/Print.cpp
@@ -859,25 +859,36 @@ void Print::process()
         this->set_done(psWipeTower);
     }
     if (this->set_started(psSkirtBrim)) {
+        this->set_status(88, L("Generating skirt and brim"));
+
         m_skirt.clear();
         m_skirt_convex_hull.clear();
         m_first_layer_convex_hull.points.clear();
-        if (this->has_skirt()) {
-            this->set_status(88, L("Generating skirt"));
-            this->_make_skirt();
+        const bool draft_shield = config().draft_shield;
+
+        if (this->has_skirt() && draft_shield) {
+            // In case that draft shield is active, generate skirt first so brim
+            // can be trimmed to make room for it.
+            _make_skirt();
         }
 
         m_brim.clear();
         m_first_layer_convex_hull.points.clear();
         if (this->has_brim()) {
-            this->set_status(88, L("Generating brim"));
             Polygons islands_area;
             m_brim = make_brim(*this, this->make_try_cancel(), islands_area);
             for (Polygon &poly : union_(this->first_layer_islands(), islands_area))
                 append(m_first_layer_convex_hull.points, std::move(poly.points));
         }
-        // Brim depends on skirt (brim lines are trimmed by the skirt lines), therefore if
-        // the skirt gets invalidated, brim gets invalidated as well and the following line is called.
+
+
+        if (has_skirt() && ! draft_shield) {
+            // In case that draft shield is NOT active, generate skirt now.
+            // It will be placed around the brim, so brim has to be ready.
+            assert(m_skirt.empty());
+            _make_skirt();
+        }
+
         this->finalize_first_layer_convex_hull();
         this->set_done(psSkirtBrim);
     }
@@ -959,6 +970,10 @@ void Print::_make_skirt()
     // Include the wipe tower.
     append(points, this->first_layer_wipe_tower_corners());
 
+    // Unless draft shield is enabled, include all brims as well.
+    if (! config().draft_shield)
+        append(points, m_first_layer_convex_hull.points);
+
     if (points.size() < 3)
         // At least three points required for a convex hull.
         return;