     }
     
     internal func booleanOperation(_ operation: BooleanPathOperation) -> Path {
-        // handle components that have no crossings
+        
+        // special cases for components which do not cross
+        let nonCrossingComponents1: [PathComponent] = self.list1.nonCrossingComponents()
+        let nonCrossingComponents2: [PathComponent] = self.list2.nonCrossingComponents()
+        
         func anyPointOnComponent(_ c: PathComponent) -> CGPoint {
             return c.curves[0].startingPoint
         }
         var pathComponents: [PathComponent] = []
         switch operation {
         case .removeCrossings:
-            pathComponents += nonCrossingComponents1 // TODO: hmm7
+            pathComponents += nonCrossingComponents1
         case .union:
             pathComponents += nonCrossingComponents1.filter { path2.contains(anyPointOnComponent($0)) == false }
             pathComponents += nonCrossingComponents2.filter { path1.contains(anyPointOnComponent($0)) == false }

                    }
                    break
                }
                
                if !v.isCrossing {
                    print("consistency error detected -- bailing out. Needs debugging.")
                    unvisitedCrossings = unvisitedCrossings.filter { $0 !== v }
                    v = v.intersectionInfo.neighbor! // jump back to avoid infinite loop
                    isOnFirstCurve = !isOnFirstCurve
                }
            } while v !== start
            pathComponents.append(PathComponent(curves: curves))
        }
        // TODO: non-deterministic behavior from usage of Set when choosing starting vertex
        return Path(subpaths: pathComponents)
    }
}

                if useRelativeWinding {
                    isInside = windingCountImpliesContainment(windingCount, using: fillRule) && windingCountImpliesContainment(windingCount+1, using: fillRule)
                }
                v.intersectionInfo.isEntry = wasInside == false && isInside == true
                v.intersectionInfo.isExit = wasInside == true && isInside == false
            }
        }
    }
