diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -8,10 +8,20 @@
 
 ## Unreleased
 
+## 0.5.1.0
+
+### Added
+
+- Add `OpenCascade.BOPAlgo.Builder`
+- Add `OpenCascade.BOPAlgo.BOP`
+- Add `OpenCascade.BOPAlgo.Operation`
+
 ## 0.5.0.1
 
 ## 0.5.0.0
 
+### Added
+
 - Add `OpenCascade.BRepFilletAPI.MakeFillet` methods `reset`, `nbFaultyContours`, `faultyContour`, `nbEdges`, `edge` and `remove`
 - Add `OpenCascade.BRepBuilderAPI.MakeShape` method `build`
 - Add `OpenCascade.BRepOffsetAPI.MakePipe` constructor `fromWireShapeTrihedronModeAndForceC1`
@@ -33,6 +43,8 @@
 - Add `OpenCascade.Geom.Curve` methods `firstParameter` and `lastParameter`
 
 ## 0.4.0.0
+
+### Added
 
 - Add `OpenCascade.BRepBuilderAPI.MakeVertex`
 - Add `OpenCascade.BRepBuilderAPI.MakeWire.vertex`
diff --git a/cpp/hs_BOPAlgo_BOP.cpp b/cpp/hs_BOPAlgo_BOP.cpp
new file mode 100644
--- /dev/null
+++ b/cpp/hs_BOPAlgo_BOP.cpp
@@ -0,0 +1,19 @@
+#include <BOPAlgo_BOP.hxx>
+#include "hs_BOPAlgo_BOP.h"
+
+
+BOPAlgo_BOP * hs_new_BOPAlgo_BOP(){
+    return new BOPAlgo_BOP();
+}
+
+void hs_delete_BOPAlgo_BOP(BOPAlgo_BOP * bop){
+    delete bop;
+}
+
+void hs_BOPAlgo_BOP_AddTool(BOPAlgo_BOP *bop, TopoDS_Shape * tool){
+    bop->AddTool(*tool);
+}
+
+void hs_BOPAlgo_BOP_SetOperation(BOPAlgo_BOP *bop, BOPAlgo_Operation operation){
+    bop->SetOperation(operation);
+}
diff --git a/cpp/hs_BOPAlgo_BOP.h b/cpp/hs_BOPAlgo_BOP.h
new file mode 100644
--- /dev/null
+++ b/cpp/hs_BOPAlgo_BOP.h
@@ -0,0 +1,22 @@
+#ifndef HS_BOPALGO_BOP_H
+#define HS_BOPALGO_BOP_H
+
+#include "hs_types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+BOPAlgo_BOP * hs_new_BOPAlgo_BOP();
+
+void hs_delete_BOPAlgo_BOP(BOPAlgo_BOP * bop);
+
+void hs_BOPAlgo_BOP_AddTool(BOPAlgo_BOP *bop, TopoDS_Shape * tool);
+
+void hs_BOPAlgo_BOP_SetOperation(BOPAlgo_BOP *bop, BOPAlgo_Operation operation);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // HS_BOPALGO_BOP_H
diff --git a/cpp/hs_BOPAlgo_Builder.cpp b/cpp/hs_BOPAlgo_Builder.cpp
new file mode 100644
--- /dev/null
+++ b/cpp/hs_BOPAlgo_Builder.cpp
@@ -0,0 +1,27 @@
+#include <BOPAlgo_Builder.hxx>
+#include "hs_BOPAlgo_Builder.h"
+
+BOPAlgo_Builder * hs_new_BOPAlgo_Builder(){
+    return new BOPAlgo_Builder();
+}
+
+void hs_delete_BOPAlgo_Builder(BOPAlgo_Builder * builder){
+    delete builder;
+}
+
+void hs_BOPAlgo_Builder_AddArgument(BOPAlgo_Builder * builder, TopoDS_Shape * shape){
+    builder->AddArgument(*shape);
+}
+
+TopoDS_Shape * hs_BOPAlgo_Builder_Shape(BOPAlgo_Builder * builder){
+    return new TopoDS_Shape(builder->Shape());
+}
+
+void hs_BOPAlgo_Builder_SetRunParallel(BOPAlgo_Builder * builder, bool runParallel){
+    builder->SetRunParallel(runParallel);
+}
+
+void hs_BOPAlgo_Builder_Perform(BOPAlgo_Builder * builder){
+    builder->Perform();
+}
+
diff --git a/cpp/hs_BOPAlgo_Builder.h b/cpp/hs_BOPAlgo_Builder.h
new file mode 100644
--- /dev/null
+++ b/cpp/hs_BOPAlgo_Builder.h
@@ -0,0 +1,26 @@
+#ifndef HS_BOPALGO_BUILDER_H
+#define HS_BOPALGO_BUILDER_H
+
+#include "hs_types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+BOPAlgo_Builder * hs_new_BOPAlgo_Builder();
+
+void hs_delete_BOPAlgo_Builder(BOPAlgo_Builder * builder);
+
+void hs_BOPAlgo_Builder_AddArgument(BOPAlgo_Builder * builder, TopoDS_Shape * shape);
+
+TopoDS_Shape * hs_BOPAlgo_Builder_Shape(BOPAlgo_Builder * builder);
+
+void hs_BOPAlgo_Builder_SetRunParallel(BOPAlgo_Builder * builder, bool runParallel);
+
+void hs_BOPAlgo_Builder_Perform(BOPAlgo_Builder * builder);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // HS_BOPALGO_BUILDER_H
diff --git a/cpp/hs_BRepAlgoAPI_Fuse.h b/cpp/hs_BRepAlgoAPI_Fuse.h
--- a/cpp/hs_BRepAlgoAPI_Fuse.h
+++ b/cpp/hs_BRepAlgoAPI_Fuse.h
@@ -1,4 +1,3 @@
-
 #ifndef HS_BREPALGOAPI_FUSE_H
 #define HS_BREPALGOAPI_FUSE_H
 
diff --git a/cpp/hs_types.h b/cpp/hs_types.h
--- a/cpp/hs_types.h
+++ b/cpp/hs_types.h
@@ -100,6 +100,9 @@
 typedef void HLRBRep_Algo;
 typedef void HLRBRep_HLRToShape;
 typedef int HLRBRep_TypeOfResultingEdge;
+typedef void BOPAlgo_Builder;
+typedef void BOPAlgo_BOP;
+typedef int BOPAlgo_Operation;
 
 #define Handle(X) void
 #define ARRAY_1(X) void
diff --git a/opencascade-hs.cabal b/opencascade-hs.cabal
--- a/opencascade-hs.cabal
+++ b/opencascade-hs.cabal
@@ -5,7 +5,7 @@
 -- see: https://github.com/sol/hpack
 
 name:           opencascade-hs
-version:        0.5.0.1
+version:        0.5.1.0
 synopsis:       Thin Wrapper for the OpenCASCADE CAD Kernel
 description:    Please see the README on GitHub at <https://github.com/joe-warren/opencascade-hs#readme>
 category:       Graphics,FFI
@@ -23,6 +23,8 @@
     CHANGELOG.md
     cpp/hs_Bnd_Box.h
     cpp/hs_Bnd_OBB.h
+    cpp/hs_BOPAlgo_BOP.h
+    cpp/hs_BOPAlgo_Builder.h
     cpp/hs_BRep_Tool.h
     cpp/hs_BRepAdaptor_Curve.h
     cpp/hs_BRepAlgoAPI_Common.h
@@ -131,6 +133,11 @@
       OpenCascade.Bnd.Internal.Destructors
       OpenCascade.Bnd.OBB
       OpenCascade.Bnd.Types
+      OpenCascade.BOPAlgo.BOP
+      OpenCascade.BOPAlgo.Builder
+      OpenCascade.BOPAlgo.Internal.Destructors
+      OpenCascade.BOPAlgo.Operation
+      OpenCascade.BOPAlgo.Types
       OpenCascade.BRep.Tool
       OpenCascade.BRepAdaptor
       OpenCascade.BRepAdaptor.Curve
@@ -342,6 +349,8 @@
   cxx-sources:
       cpp/hs_Bnd_Box.cpp
       cpp/hs_Bnd_OBB.cpp
+      cpp/hs_BOPAlgo_BOP.cpp
+      cpp/hs_BOPAlgo_Builder.cpp
       cpp/hs_BRep_Tool.cpp
       cpp/hs_BRepAdaptor_Curve.cpp
       cpp/hs_BRepAlgoAPI_Common.cpp
diff --git a/src/OpenCascade/BOPAlgo/BOP.hs b/src/OpenCascade/BOPAlgo/BOP.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/BOPAlgo/BOP.hs
@@ -0,0 +1,29 @@
+{-# LANGUAGE CApiFFI #-} 
+module OpenCascade.BOPAlgo.BOP 
+( BOP
+, new
+, addTool
+, setOperation
+) where
+
+import OpenCascade.BOPAlgo.Types
+import OpenCascade.BOPAlgo.Internal.Destructors (deleteBOP)
+import OpenCascade.BOPAlgo.Operation (Operation)
+import qualified OpenCascade.TopoDS.Types as TopoDS
+
+import Foreign.Ptr (Ptr)
+import Data.Acquire (Acquire, mkAcquire)
+import Foreign.C (CInt (..))
+
+
+foreign import capi unsafe "hs_BOPAlgo_BOP.h hs_new_BOPAlgo_BOP" rawNew :: IO (Ptr BOP)
+
+new :: Acquire (Ptr BOP)
+new = mkAcquire rawNew deleteBOP
+
+foreign import capi unsafe "hs_BOPAlgo_BOP.h hs_BOPAlgo_BOP_AddTool" addTool :: Ptr BOP -> Ptr TopoDS.Shape -> IO ()
+
+foreign import capi unsafe "hs_BOPAlgo_BOP.h hs_BOPAlgo_BOP_SetOperation" rawSetOperation :: Ptr BOP -> CInt -> IO ()
+
+setOperation :: Ptr BOP -> Operation -> IO ()
+setOperation bop op = rawSetOperation bop (fromIntegral . fromEnum $ op)
diff --git a/src/OpenCascade/BOPAlgo/Builder.hs b/src/OpenCascade/BOPAlgo/Builder.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/BOPAlgo/Builder.hs
@@ -0,0 +1,39 @@
+{-# LANGUAGE CApiFFI #-} 
+module OpenCascade.BOPAlgo.Builder
+( Builder
+, new
+, addArgument
+, setRunParallel
+, shape
+, perform
+) where
+
+import OpenCascade.BOPAlgo.Types
+import OpenCascade.BOPAlgo.Internal.Destructors (deleteBuilder)
+import qualified OpenCascade.TopoDS.Types as TopoDS
+import OpenCascade.TopoDS.Internal.Destructors (deleteShape)
+import Foreign.Ptr (Ptr)
+import Foreign.C (CBool (..))
+import Data.Acquire (Acquire, mkAcquire)
+import OpenCascade.Internal.Bool (boolToCBool)
+
+foreign import capi unsafe "hs_BOPAlgo_Builder.h hs_new_BOPAlgo_Builder" rawNew :: IO (Ptr Builder)
+
+new :: Acquire (Ptr Builder)
+new = mkAcquire rawNew deleteBuilder
+
+foreign import capi unsafe "hs_BOPAlgo_Builder.h hs_BOPAlgo_Builder_AddArgument" addArgument :: Ptr Builder -> Ptr TopoDS.Shape -> IO ()
+
+foreign import capi unsafe "hs_BOPAlgo_Builder.h hs_BOPAlgo_Builder_SetRunParallel" rawSetRunParallel :: Ptr Builder -> CBool -> IO ()
+
+setRunParallel :: Ptr Builder -> Bool -> IO ()
+setRunParallel builder = rawSetRunParallel builder . boolToCBool
+
+foreign import capi unsafe "hs_BOPAlgo_Builder.h hs_BOPAlgo_Builder_Shape" rawShape :: Ptr Builder -> IO (Ptr TopoDS.Shape)
+
+shape :: Ptr Builder -> Acquire (Ptr TopoDS.Shape)
+shape builder = mkAcquire (rawShape builder) deleteShape  
+
+
+foreign import capi unsafe "hs_BOPAlgo_Builder.h hs_BOPAlgo_Builder_Perform" perform :: Ptr Builder -> IO ()
+
diff --git a/src/OpenCascade/BOPAlgo/Internal/Destructors.hs b/src/OpenCascade/BOPAlgo/Internal/Destructors.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/BOPAlgo/Internal/Destructors.hs
@@ -0,0 +1,11 @@
+{-# LANGUAGE CApiFFI #-}
+module OpenCascade.BOPAlgo.Internal.Destructors 
+( deleteBuilder
+, deleteBOP
+) where
+
+import OpenCascade.BOPAlgo.Types
+import Foreign.Ptr
+
+foreign import capi unsafe "hs_BOPAlgo_Builder.h hs_delete_BOPAlgo_Builder" deleteBuilder :: Ptr Builder -> IO ()
+foreign import capi unsafe "hs_BOPAlgo_BOP.h hs_delete_BOPAlgo_BOP" deleteBOP :: Ptr BOP -> IO ()
diff --git a/src/OpenCascade/BOPAlgo/Operation.hs b/src/OpenCascade/BOPAlgo/Operation.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/BOPAlgo/Operation.hs
@@ -0,0 +1,7 @@
+module OpenCascade.BOPAlgo.Operation
+( Operation (..)
+) where
+
+-- this should match the enumeration in BOPAlgo_Operation
+data Operation = Common | Fuse | Cut | Cut21 | Section | Unknown
+    deriving (Show, Eq, Enum)
diff --git a/src/OpenCascade/BOPAlgo/Types.hs b/src/OpenCascade/BOPAlgo/Types.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/BOPAlgo/Types.hs
@@ -0,0 +1,13 @@
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE EmptyDataDecls #-}
+module OpenCascade.BOPAlgo.Types
+( Builder
+, BOP
+) where
+
+import qualified OpenCascade.Inheritance as Inheritance
+
+data Builder
+data BOP
+
+instance Inheritance.SubTypeOf Builder BOP
