diff --git a/lib/Slic3r/Fill.pm b/lib/Slic3r/Fill.pm
index 76c264c65..e08bc2e70 100644
--- a/lib/Slic3r/Fill.pm
+++ b/lib/Slic3r/Fill.pm
@@ -13,7 +13,7 @@ use Slic3r::Fill::PlanePath;
 use Slic3r::Fill::Rectilinear;
 use Slic3r::ExtrusionPath ':roles';
 use Slic3r::Geometry qw(X Y PI scale chained_path);
-use Slic3r::Geometry::Clipper qw(union_ex diff_ex);
+use Slic3r::Geometry::Clipper qw(union_ex diff diff_ex intersection_ex offset);
 use Slic3r::Surface ':types';
 
 
@@ -99,15 +99,46 @@ sub make_fill {
         }
     }
     
-    # add spacing between surfaces
+    # we need to detect any narrow surfaces that might collapse
+    # when adding spacing below
+    # such narrow surfaces are often generated in sloping walls
+    # by bridge_over_infill() and combine_infill() as a result of the
+    # subtraction of the combinable area from the layer infill area,
+    # which leaves small areas near the perimeters
+    # we are going to grow such regions by overlapping them with the void (if any)
+    # TODO: detect and investigate whether there could be narrow regions without
+    # any void neighbors
+    my $distance_between_surfaces = $layerm->solid_infill_flow->scaled_spacing;
     {
-        my $distance = $layerm->solid_infill_flow->scaled_spacing / 2;
-        @surfaces = map $_->offset(-$distance * &Slic3r::INFILL_OVERLAP_OVER_SPACING), @surfaces;
+        my $collapsed = diff(
+            [ map @{$_->expolygon}, @surfaces ],
+            [ offset(
+                [ offset([ map @{$_->expolygon}, @surfaces ], -$distance_between_surfaces/2) ],
+                +$distance_between_surfaces/2
+            ) ],
+            1,
+        );
+        push @surfaces, map Slic3r::Surface->new(
+            expolygon       => $_,
+            surface_type    => S_TYPE_INTERNALSOLID,
+        ), @{intersection_ex(
+            [ offset($collapsed, $distance_between_surfaces) ],
+            [
+                (map @{$_->expolygon}, grep $_->surface_type == S_TYPE_INTERNALVOID, @surfaces),
+                (@$collapsed),
+            ],
+            undef,
+            1,
+        )};
     }
     
+    # add spacing between surfaces
+    @surfaces = map $_->offset(-$distance_between_surfaces / 2 * &Slic3r::INFILL_OVERLAP_OVER_SPACING), @surfaces;
+    
     my @fills = ();
     my @fills_ordering_points =  ();
     SURFACE: foreach my $surface (@surfaces) {
+        next if $surface->surface_type == S_TYPE_INTERNALVOID;
         my $filler          = $Slic3r::Config->fill_pattern;
         my $density         = $Slic3r::Config->fill_density;
         my $flow            = ($surface->surface_type == S_TYPE_TOP)
@@ -124,9 +155,7 @@ sub make_fill {
             $density = 1;
             $filler = $Slic3r::Config->solid_fill_pattern;
             if ($is_bridge) {
-                $filler = $surface->surface_type == S_TYPE_INTERNALBRIDGE
-                    ? 'concentric'
-                    : 'rectilinear';
+                $filler = 'rectilinear';
                 $flow_spacing = $layerm->extruders->{infill}->bridge_flow->spacing;
             } elsif ($surface->surface_type == S_TYPE_INTERNALSOLID) {
                 $filler = 'rectilinear';
diff --git a/lib/Slic3r/Geometry/Clipper.pm b/lib/Slic3r/Geometry/Clipper.pm
index 0cc78b188..0196460fb 100644
--- a/lib/Slic3r/Geometry/Clipper.pm
+++ b/lib/Slic3r/Geometry/Clipper.pm
@@ -45,7 +45,15 @@ sub diff_ex {
 }
 
 sub diff {
-    return [ map @$_, diff_ex(@_) ];
+    my ($subject, $clip, $safety_offset) = @_;
+    
+    $clipper->clear;
+    $clipper->add_subject_polygons($subject);
+    $clipper->add_clip_polygons($safety_offset ? safety_offset($clip) : $clip);
+    return [
+        map Slic3r::Polygon->new($_),
+            @{ $clipper->execute(CT_DIFFERENCE, PFT_NONZERO, PFT_NONZERO) },
+    ];
 }
 
 sub union_ex {
diff --git a/lib/Slic3r/Print/Object.pm b/lib/Slic3r/Print/Object.pm
index 782c997cd..dcca26096 100644
--- a/lib/Slic3r/Print/Object.pm
+++ b/lib/Slic3r/Print/Object.pm
@@ -509,7 +509,8 @@ sub bridge_over_infill {
             
             # exclude infill from the layers below if needed
             # see discussion at https://github.com/alexrj/Slic3r/issues/240
-            {
+            # Update: do not exclude any infill. Sparse infill is able to absorb the excess material.
+            if (0) {
                 my $excess = $layerm->extruders->{infill}->bridge_flow->width - $layerm->height;
                 for (my $i = $layer_id-1; $excess >= $self->layers->[$i]->height; $i--) {
                     Slic3r::debugf "  skipping infill below those areas at layer %d\n", $i;
@@ -524,6 +525,13 @@ sub bridge_over_infill {
                                 [ map $_->p, @$group ],
                                 [ map @$_, @$to_bridge ],
                             )};
+                            push @new_surfaces, map Slic3r::Surface->new(
+                                expolygon       => $_,
+                                surface_type    => S_TYPE_INTERNALVOID,
+                            ), @{intersection_ex(
+                                [ map $_->p, @$group ],
+                                [ map @$_, @$to_bridge ],
+                            )};
                         }
                         @{$lower_layerm->fill_surfaces} = @new_surfaces;
                     }
@@ -722,7 +730,7 @@ sub combine_infill {
                     my @this_type   = grep $_->surface_type == $type, @{$layerm->fill_surfaces};
                     my @other_types = grep $_->surface_type != $type, @{$layerm->fill_surfaces};
                     
-                    @this_type = map Slic3r::Surface->new(expolygon => $_, surface_type => $type),
+                    my @new_this_type = map Slic3r::Surface->new(expolygon => $_, surface_type => $type),
                         @{diff_ex(
                             [ map @{$_->expolygon}, @this_type ],
                             [ @intersection_with_clearance ],
@@ -730,7 +738,7 @@ sub combine_infill {
                     
                     # apply surfaces back with adjusted depth to the uppermost layer
                     if ($layerm->id == $layer_id) {
-                        push @this_type,
+                        push @new_this_type,
                             map Slic3r::Surface->new(
                                 expolygon        => $_,
                                 surface_type     => $type,
@@ -738,9 +746,17 @@ sub combine_infill {
                                 thickness_layers => scalar(@layerms),
                             ),
                             @$intersection;
+                    } else {
+                        # save void surfaces
+                        push @this_type,
+                            map Slic3r::Surface->new(expolygon => $_, surface_type => S_TYPE_INTERNALVOID),
+                            @{intersection_ex(
+                                [ map @{$_->expolygon}, @this_type ],
+                                [ @intersection_with_clearance ],
+                            )};
                     }
                     
-                    @{$layerm->fill_surfaces} = (@this_type, @other_types);
+                    @{$layerm->fill_surfaces} = (@new_this_type, @other_types);
                 }
             }
         }
diff --git a/lib/Slic3r/Surface.pm b/lib/Slic3r/Surface.pm
index 0b0ad1465..966dcde41 100644
--- a/lib/Slic3r/Surface.pm
+++ b/lib/Slic3r/Surface.pm
@@ -4,7 +4,7 @@ use warnings;
 
 require Exporter;
 our @ISA = qw(Exporter);
-our @EXPORT_OK   = qw(S_TYPE_TOP S_TYPE_BOTTOM S_TYPE_INTERNAL S_TYPE_INTERNALSOLID S_TYPE_INTERNALBRIDGE);
+our @EXPORT_OK   = qw(S_TYPE_TOP S_TYPE_BOTTOM S_TYPE_INTERNAL S_TYPE_INTERNALSOLID S_TYPE_INTERNALBRIDGE S_TYPE_INTERNALVOID);
 our %EXPORT_TAGS = (types => \@EXPORT_OK);
 
 use constant S_EXPOLYGON            => 0;
@@ -19,6 +19,7 @@ use constant S_TYPE_BOTTOM          => 1;
 use constant S_TYPE_INTERNAL        => 2;
 use constant S_TYPE_INTERNALSOLID   => 3;
 use constant S_TYPE_INTERNALBRIDGE  => 4;
+use constant S_TYPE_INTERNALVOID    => 5;
 
 sub new {
     my $class = shift;
@@ -102,17 +103,6 @@ sub _inflate_expolygon {
     );
 }
 
-sub clipper_polygon {
-    my $self = shift;
-    
-    return {
-        outer => $self->contour->p,
-        holes => [
-            map $_->p, @{$self->holes}
-        ],
-    };
-}
-
 sub p {
     my $self = shift;
     return @{$self->expolygon};
@@ -127,14 +117,6 @@ sub is_solid {
         || $type == S_TYPE_INTERNALSOLID;
 }
 
-sub is_internal {
-    my $self = shift;
-    my $type = $self->surface_type;
-    return $type == S_TYPE_INTERNAL
-        || $type == S_TYPE_INTERNALSOLID
-        || $type == S_TYPE_INTERNALBRIDGE;
-}
-
 sub is_bridge {
     my $self = shift;
     my $type = $self->surface_type;