diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -9,6 +9,12 @@
 
 ## Unreleased
 
+## 0.5.1.0
+
+### Added
+
+- Added `unions`, `intersections`, and specialized mconcat for `Solid` to improve performance
+
 ## 0.5.0.1
 
 ### Fixed
diff --git a/src/Waterfall/Booleans.hs b/src/Waterfall/Booleans.hs
--- a/src/Waterfall/Booleans.hs
+++ b/src/Waterfall/Booleans.hs
@@ -6,6 +6,8 @@
 , difference
 , intersection
 , complement
+, unions
+, intersections
 ) where
 
-import Waterfall.Internal.Solid(union, difference, intersection, complement)
+import Waterfall.Internal.Solid(union, unions, difference, intersection, intersections, complement)
diff --git a/src/Waterfall/Internal/Solid.hs b/src/Waterfall/Internal/Solid.hs
--- a/src/Waterfall/Internal/Solid.hs
+++ b/src/Waterfall/Internal/Solid.hs
@@ -7,6 +7,8 @@
 , union
 , difference
 , intersection
+, unions
+, intersections
 , nowhere
 , complement
 , debug
@@ -22,8 +24,13 @@
 import qualified OpenCascade.BRepAlgoAPI.Cut as Cut
 import qualified OpenCascade.BRepAlgoAPI.Common as Common
 import qualified OpenCascade.BRepBuilderAPI.MakeSolid as MakeSolid
+import qualified OpenCascade.BOPAlgo.Operation as BOPAlgo.Operation
+import qualified OpenCascade.BOPAlgo.BOP as BOPAlgo.BOP
+import qualified OpenCascade.BOPAlgo.Builder as BOPAlgo.Builder
 import OpenCascade.Inheritance (upcast)
 import Waterfall.Internal.Finalizers (toAcquire, unsafeFromAcquire)
+import qualified OpenCascade.BOPAlgo.Builder as BOPAlgo
+import Data.Foldable (traverse_)
 
 -- | The Boundary Representation of a solid object.
 --
@@ -43,6 +50,7 @@
 solidFromAcquire :: Acquire (Ptr TopoDS.Shape.Shape) -> Solid
 solidFromAcquire = Solid . unsafeFromAcquire
 
+
 -- | print debug information about a Solid when it's evaluated 
 -- exposes the properties of the underlying OpenCacade.TopoDS.Shape
 debug :: Solid -> String
@@ -105,6 +113,29 @@
 union :: Solid -> Solid -> Solid
 union = toBoolean Fuse.fuse
 
+
+toBooleans :: BOPAlgo.Operation.Operation -> [Solid] -> Solid
+toBooleans _ [] = nowhere
+toBooleans _ [x] = x
+toBooleans op (h:solids) = Solid . unsafeFromAcquire $ do
+    firstPtr <- toAcquire . rawSolid $ h
+    ptrs <- traverse (toAcquire . rawSolid) solids
+    bop <- BOPAlgo.BOP.new
+    let builder = upcast bop
+    liftIO $ do
+        BOPAlgo.BOP.setOperation bop op
+        BOPAlgo.Builder.addArgument builder firstPtr
+        traverse_ (BOPAlgo.BOP.addTool bop) ptrs
+        BOPAlgo.setRunParallel builder True
+        BOPAlgo.Builder.perform builder
+    BOPAlgo.Builder.shape builder
+
+-- | Take the sum of a list of solids 
+-- 
+-- May be more performant than chaining multiple applications of `union`
+unions :: [Solid] -> Solid
+unions = toBooleans BOPAlgo.Operation.Fuse
+
 -- | Take the difference of two solids
 -- 
 -- The region occupied by the first, but not the second.
@@ -117,6 +148,13 @@
 intersection :: Solid -> Solid -> Solid
 intersection = toBoolean Common.common
 
+
+-- | Take the intersection of a list of solids 
+-- 
+-- May be more performant than chaining multiple applications of `intersection`
+intersections :: [Solid] -> Solid
+intersections = toBooleans BOPAlgo.Operation.Common
+
 -- | While `Solid` could form a Semigroup via either `union` or `intersection`.
 -- the default Semigroup is from `union`.
 --
@@ -127,6 +165,7 @@
 
 instance Monoid Solid where
     mempty = nowhere
+    mconcat = unions
 
 instance Lattice Solid where 
     (/\) = intersection
diff --git a/waterfall-cad.cabal b/waterfall-cad.cabal
--- a/waterfall-cad.cabal
+++ b/waterfall-cad.cabal
@@ -5,7 +5,7 @@
 -- see: https://github.com/sol/hpack
 
 name:           waterfall-cad
-version:        0.5.0.1
+version:        0.5.1.0
 synopsis:       Declarative CAD/Solid Modeling Library
 description:    Please see the README on GitHub at <https://github.com/joe-warren/opencascade-hs#readme>
 category:       Graphics
@@ -70,7 +70,7 @@
     , lattices >=2.0 && <3
     , lens ==5.*
     , linear >=1.21 && <2
-    , opencascade-hs >=0.5.0.1 && <0.6
+    , opencascade-hs >=0.5.1.0 && <0.6
     , primitive >=0.7 && <0.10
     , resourcet >=1.2 && <1.4
   default-language: Haskell2010
