diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -8,6 +8,60 @@
 
 ## Unreleased
 
+## 0.7.0.0
+
+### Added
+
+- Support for OpenCASCADE 8.x
+- Added `OpenCascade.TCollection.AsciiString`
+- Added `OpenCascade.NCollection.IndexedDataMap`
+- Added `OpenCascade.NCollection.List`
+- Added `OpenCascade.TopExp.mapShapesAndAncestors`
+- Added `modified`, `generated` and `isDeleted` to `OpenCascade.BRepBuilderAPI.MakeShape` and `OpenCascade.BOPAlgo.Builder`
+- Added builder versions of some functions that used to be one-shot:
+  - `OpenCascade.BRepAlgoAPI.Fuse` 
+  - `OpenCascade.BRepAlgoAPI.Cut`
+  - `OpenCascade.BRepAlgoAPI.Common`
+  - `OpenCascade.BRepBuilderAPI.Transform` 
+  - `OpenCascade.BRepBuilderAPI.GTransform`
+- Added `OpenCascade.BRepBuilderAPI.Types.Transform`
+- Added `OpenCascade.BRepBuilderAPI.Types.GTransform`
+- Added `OpenCascade.TDF.Label.isNull`
+- Added `addSubShape` and `findShape` to `OpenCascade.XCAFDoc.ShapeTool`
+- Added `OpenCascade.BRepAlgoAPI`
+- Added `OpenCascade.Quantity`
+- Added `OpenCascade.HLRAlgo`
+- Added `OpenCascade.Quantity.Color`, `OpenCascade.Quantity.TypeOfColor`, `OpenCascade.XCAFDoc.ColorTool`,
+  `OpenCascade.XCAFDoc.ColorType`, `OpenCascade.XCAFDoc.VisMaterial`, `OpenCascade.XCAFDoc.VisMaterialPBR`,
+  `OpenCascade.XCAFDoc.VisMaterialTool`, `OpenCascade.Graphic3D.AlphaMode`, `OpenCascade.Quantity.ColorRGBA` 
+- Added `colorTool` and `visMaterialTool` to `OpenCascade.XCAFDoc.DocumentTool`
+- Added `OpenCascade.STEPCAFControl.Writer`
+- Added `OpenCascade.BOPAlgo.Tools` 
+- Added `OpenCascade.BOPAlgo.Builder.setFuzzyValue`
+- Added `OpenCascade.GP.Lin`
+- Added `OpenCascade.HLRAlgo.Projector.transformation` and `OpenCascade.HLRAlgo.Projector.invertedTransformation`
+- Added `OpenCascade.IntCurvesFace.ShapeIntersector`
+- Added `OpenCascade.IntCurvesFace.Types`
+- Added `OpenCascade.Poly.Triangulation.isNull`
+- Added `OpenCascade.NCollection.Vec3`
+- Added `OpenCascade.ShapeUpgrade.UnifySameDomain`
+- Added `OpenCascade.ShapeUpgrade.Types`
+- Added `OpenCascade.XCAFDoc.VisMaterial.setFaceCulling` and `OpenCascade.XCAFDoc.VisMaterial.setRawName`
+- Added `OpenCascade.Graphic3D.TypeOfBackfacingModel`
+- Added `OpenCascade.Standard.Failure.getTypeName`
+- Added `OpenCascade.BRepAlgoAPI.Types`
+- Added `OpenCascade.NCollection.List`
+
+### Changed
+
+- `OpenCascadeStandardFailure` now has an extra field, for a total of three fields: "type name", "message", "stack trace". "type name" is new.
+
+### Removed
+
+- In order to support building against OpenCASCADE 8.x:
+  - Removed `OpenCascade.TColStd.IndexedDataMapOfStringString` ( replaced by `OpenCascade.NCollection.IndexedDataMap TCollection.AsciiString TCollection.AsciiString` + `OpenCascade.NCollection.IndexedDataMap.newAsciiStringMap`)
+- Removed `fuse`, `cut`, `common`, `transform` and `gtransform`, in favour of `fromShapes` in `OpenCascade.BRepAlgoAPI.Fuse`, `OpenCascade.BRepAlgoAPI.Cut` and `OpenCascade.BRepAlgoAPI.Common`, `fromShapeTrsfAndCopy` in `OpenCascade.BRepBuilderAPI.Transform` and `fromShapeGTrsfAndCopy` in `OpenCascade.BRepBuilderAPI.GTransform`
+
 ## 0.6.3.2
 
 ## 0.6.3.1
diff --git a/cpp/hs_BOPAlgo_Builder.cpp b/cpp/hs_BOPAlgo_Builder.cpp
--- a/cpp/hs_BOPAlgo_Builder.cpp
+++ b/cpp/hs_BOPAlgo_Builder.cpp
@@ -1,4 +1,6 @@
 #include <BOPAlgo_Builder.hxx>
+#include <NCollection_List.hxx>
+#include <TopoDS_Shape.hxx>
 #include "hs_Exception.h"
 #include "hs_BOPAlgo_Builder.h"
 
@@ -53,3 +55,47 @@
     });
 }
 
+
+LIST(TopoDS_Shape) * hs_BOPAlgo_Builder_Modified(
+        BOPAlgo_Builder * builder, TopoDS_Shape * shape,
+        HSExceptionType* exType,
+        void** exPtr
+){
+    return hs_handleEx(
+        exType,
+        exPtr,
+        [builder, shape]{
+        return new NCollection_List<TopoDS_Shape>(builder->Modified(*shape));
+    });
+}
+
+LIST(TopoDS_Shape) * hs_BOPAlgo_Builder_Generated(
+        BOPAlgo_Builder * builder, TopoDS_Shape * shape,
+        HSExceptionType* exType,
+        void** exPtr
+){
+    return hs_handleEx(
+        exType,
+        exPtr,
+        [builder, shape]{
+        return new NCollection_List<TopoDS_Shape>(builder->Generated(*shape));
+    });
+}
+
+bool hs_BOPAlgo_Builder_IsDeleted(
+        BOPAlgo_Builder * builder, TopoDS_Shape * shape,
+        HSExceptionType* exType,
+        void** exPtr
+){
+    return hs_handleExWithDefault(
+        exType,
+        exPtr,
+        [builder, shape]{
+        return builder->IsDeleted(*shape);
+    },
+    false);
+}
+
+void hs_BOPAlgo_Builder_SetFuzzyValue(BOPAlgo_Builder * builder, double fuzz){
+    builder->SetFuzzyValue(fuzz);
+}
diff --git a/cpp/hs_BOPAlgo_Builder.h b/cpp/hs_BOPAlgo_Builder.h
--- a/cpp/hs_BOPAlgo_Builder.h
+++ b/cpp/hs_BOPAlgo_Builder.h
@@ -25,8 +25,28 @@
 
 void hs_BOPAlgo_Builder_SetRunParallel(BOPAlgo_Builder * builder, bool runParallel);
 
+void hs_BOPAlgo_Builder_SetFuzzyValue(BOPAlgo_Builder * builder, double fuzz);
+
 void hs_BOPAlgo_Builder_Perform(
     BOPAlgo_Builder * builder,
+    HSExceptionType* exType,
+    void** exPtr
+);
+
+LIST(TopoDS_Shape) * hs_BOPAlgo_Builder_Modified(
+    BOPAlgo_Builder * builder, TopoDS_Shape * shape,
+    HSExceptionType* exType,
+    void** exPtr
+);
+
+LIST(TopoDS_Shape) * hs_BOPAlgo_Builder_Generated(
+    BOPAlgo_Builder * builder, TopoDS_Shape * shape,
+    HSExceptionType* exType,
+    void** exPtr
+);
+
+bool hs_BOPAlgo_Builder_IsDeleted(
+    BOPAlgo_Builder * builder, TopoDS_Shape * shape,
     HSExceptionType* exType,
     void** exPtr
 );
diff --git a/cpp/hs_BOPAlgo_Tools.cpp b/cpp/hs_BOPAlgo_Tools.cpp
new file mode 100644
--- /dev/null
+++ b/cpp/hs_BOPAlgo_Tools.cpp
@@ -0,0 +1,20 @@
+#include <BOPAlgo_Tools.hxx>
+#include <TopoDS_Shape.hxx>
+#include "hs_Exception.h"
+#include "hs_BOPAlgo_Tools.h"
+
+int hs_BOPAlgo_Tools_EdgesToWires(TopoDS_Shape * edges, TopoDS_Shape * wires, bool shared, double angTol, HSExceptionType* exType, void ** exPtr){
+    return hs_handleExWithDefault(exType, exPtr, [edges, wires, shared, angTol]{
+        return BOPAlgo_Tools::EdgesToWires(*edges, *wires, shared, angTol);
+    }
+    , 0
+    );
+}
+
+bool hs_BOPAlgo_Tools_WiresToFaces(TopoDS_Shape * wires, TopoDS_Shape * faces, double angTol, HSExceptionType* exType, void ** exPtr){
+    return hs_handleExWithDefault(exType, exPtr, [wires, faces, angTol]{
+        return BOPAlgo_Tools::WiresToFaces(*wires, *faces, angTol);
+    } 
+    , false
+    );
+}
diff --git a/cpp/hs_BOPAlgo_Tools.h b/cpp/hs_BOPAlgo_Tools.h
new file mode 100644
--- /dev/null
+++ b/cpp/hs_BOPAlgo_Tools.h
@@ -0,0 +1,18 @@
+#ifndef HS_BOPALGO_TOOLS_H
+#define HS_BOPALGO_TOOLS_H
+
+#include "hs_types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+int hs_BOPAlgo_Tools_EdgesToWires(TopoDS_Shape * edges, TopoDS_Shape * wires, bool shared, double angTol, HSExceptionType* exType, void ** exPtr);
+
+bool hs_BOPAlgo_Tools_WiresToFaces(TopoDS_Shape * wires, TopoDS_Shape * faces, double angTol, HSExceptionType* exType, void ** exPtr);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // HS_BOPALGO_TOOLS_H
diff --git a/cpp/hs_BRepAlgoAPI_Common.cpp b/cpp/hs_BRepAlgoAPI_Common.cpp
--- a/cpp/hs_BRepAlgoAPI_Common.cpp
+++ b/cpp/hs_BRepAlgoAPI_Common.cpp
@@ -4,7 +4,7 @@
 
 #include <TopoDS_Shape.hxx>
 
-TopoDS_Shape * hs_BRepAlgoAPI_Common(
+BRepAlgoAPI_Common * hs_new_BRepAlgoAPI_Common_fromShapes(
         TopoDS_Shape * a, TopoDS_Shape * b,
         HSExceptionType* exType,
         void** exPtr
@@ -13,7 +13,10 @@
         exType,
         exPtr,
         [a, b]{
-        auto builder = BRepAlgoAPI_Common(*a, *b);
-        return new TopoDS_Shape(builder.Shape());
+        return new BRepAlgoAPI_Common(*a, *b);
     });
+}
+
+void hs_delete_BRepAlgoAPI_Common(BRepAlgoAPI_Common * builder){
+    delete builder;
 }
diff --git a/cpp/hs_BRepAlgoAPI_Common.h b/cpp/hs_BRepAlgoAPI_Common.h
--- a/cpp/hs_BRepAlgoAPI_Common.h
+++ b/cpp/hs_BRepAlgoAPI_Common.h
@@ -8,11 +8,13 @@
 extern "C" {
 #endif
 
-TopoDS_Shape * hs_BRepAlgoAPI_Common(
+BRepAlgoAPI_Common * hs_new_BRepAlgoAPI_Common_fromShapes(
     TopoDS_Shape * a, TopoDS_Shape * b,
     HSExceptionType* exType,
     void** exPtr
 );
+
+void hs_delete_BRepAlgoAPI_Common(BRepAlgoAPI_Common * builder);
 
 #ifdef __cplusplus
 }
diff --git a/cpp/hs_BRepAlgoAPI_Cut.cpp b/cpp/hs_BRepAlgoAPI_Cut.cpp
--- a/cpp/hs_BRepAlgoAPI_Cut.cpp
+++ b/cpp/hs_BRepAlgoAPI_Cut.cpp
@@ -4,7 +4,7 @@
 
 #include <TopoDS_Shape.hxx>
 
-TopoDS_Shape * hs_BRepAlgoAPI_Cut(
+BRepAlgoAPI_Cut * hs_new_BRepAlgoAPI_Cut_fromShapes(
         TopoDS_Shape * a, TopoDS_Shape * b,
         HSExceptionType* exType,
         void** exPtr
@@ -13,7 +13,10 @@
         exType,
         exPtr,
         [a, b]{
-        auto builder = BRepAlgoAPI_Cut(*a, *b);
-        return new TopoDS_Shape(builder.Shape());
+        return new BRepAlgoAPI_Cut(*a, *b);
     });
+}
+
+void hs_delete_BRepAlgoAPI_Cut(BRepAlgoAPI_Cut * builder){
+    delete builder;
 }
diff --git a/cpp/hs_BRepAlgoAPI_Cut.h b/cpp/hs_BRepAlgoAPI_Cut.h
--- a/cpp/hs_BRepAlgoAPI_Cut.h
+++ b/cpp/hs_BRepAlgoAPI_Cut.h
@@ -8,11 +8,13 @@
 extern "C" {
 #endif
 
-TopoDS_Shape * hs_BRepAlgoAPI_Cut(
+BRepAlgoAPI_Cut * hs_new_BRepAlgoAPI_Cut_fromShapes(
     TopoDS_Shape * a, TopoDS_Shape * b,
     HSExceptionType* exType,
     void** exPtr
 );
+
+void hs_delete_BRepAlgoAPI_Cut(BRepAlgoAPI_Cut * builder);
 
 #ifdef __cplusplus
 }
diff --git a/cpp/hs_BRepAlgoAPI_Fuse.cpp b/cpp/hs_BRepAlgoAPI_Fuse.cpp
--- a/cpp/hs_BRepAlgoAPI_Fuse.cpp
+++ b/cpp/hs_BRepAlgoAPI_Fuse.cpp
@@ -4,7 +4,7 @@
 
 #include <TopoDS_Shape.hxx>
 
-TopoDS_Shape * hs_BRepAlgoAPI_Fuse(
+BRepAlgoAPI_Fuse * hs_new_BRepAlgoAPI_Fuse_fromShapes(
         TopoDS_Shape * a, TopoDS_Shape * b,
         HSExceptionType* exType,
         void** exPtr
@@ -13,7 +13,10 @@
         exType,
         exPtr,
         [a, b]{
-        auto builder = BRepAlgoAPI_Fuse(*a, *b);
-        return new TopoDS_Shape(builder.Shape());
+        return new BRepAlgoAPI_Fuse(*a, *b);
     });
+}
+
+void hs_delete_BRepAlgoAPI_Fuse(BRepAlgoAPI_Fuse * builder){
+    delete builder;
 }
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
@@ -7,11 +7,13 @@
 extern "C" {
 #endif
 
-TopoDS_Shape * hs_BRepAlgoAPI_Fuse(
+BRepAlgoAPI_Fuse * hs_new_BRepAlgoAPI_Fuse_fromShapes(
     TopoDS_Shape * a, TopoDS_Shape * b,
     HSExceptionType* exType,
     void** exPtr
 );
+
+void hs_delete_BRepAlgoAPI_Fuse(BRepAlgoAPI_Fuse * builder);
 
 #ifdef __cplusplus
 }
diff --git a/cpp/hs_BRepBuilderAPI_GTransform.cpp b/cpp/hs_BRepBuilderAPI_GTransform.cpp
--- a/cpp/hs_BRepBuilderAPI_GTransform.cpp
+++ b/cpp/hs_BRepBuilderAPI_GTransform.cpp
@@ -3,7 +3,7 @@
 #include "hs_Exception.h"
 #include "hs_BRepBuilderAPI_GTransform.h"
 
-TopoDS_Shape * hs_BRepBuilderAPI_GTransform_gtransform(
+BRepBuilderAPI_GTransform * hs_new_BRepBuilderAPI_GTransform_fromShapeGTrsfAndCopy(
         TopoDS_Shape * shape, gp_GTrsf * trsf, bool copy,
         HSExceptionType* exType,
         void** exPtr
@@ -12,9 +12,10 @@
         exType,
         exPtr,
         [shape, trsf, copy]{
-        auto builder = BRepBuilderAPI_GTransform(*shape, *trsf, copy);
-        return new TopoDS_Shape(builder.Shape());
+        return new BRepBuilderAPI_GTransform(*shape, *trsf, copy);
     });
 }
 
-
+void hs_delete_BRepBuilderAPI_GTransform(BRepBuilderAPI_GTransform * builder){
+    delete builder;
+}
diff --git a/cpp/hs_BRepBuilderAPI_GTransform.h b/cpp/hs_BRepBuilderAPI_GTransform.h
--- a/cpp/hs_BRepBuilderAPI_GTransform.h
+++ b/cpp/hs_BRepBuilderAPI_GTransform.h
@@ -7,11 +7,13 @@
 extern "C" {
 #endif
 
-TopoDS_Shape * hs_BRepBuilderAPI_GTransform_gtransform(
+BRepBuilderAPI_GTransform * hs_new_BRepBuilderAPI_GTransform_fromShapeGTrsfAndCopy(
     TopoDS_Shape * shape, gp_GTrsf * trsf, bool copy,
     HSExceptionType* exType,
     void** exPtr
 );
+
+void hs_delete_BRepBuilderAPI_GTransform(BRepBuilderAPI_GTransform * builder);
 
 #ifdef __cplusplus
 }
diff --git a/cpp/hs_BRepBuilderAPI_MakeShape.cpp b/cpp/hs_BRepBuilderAPI_MakeShape.cpp
--- a/cpp/hs_BRepBuilderAPI_MakeShape.cpp
+++ b/cpp/hs_BRepBuilderAPI_MakeShape.cpp
@@ -1,5 +1,6 @@
 #include <BRepBuilderAPI_MakeShape.hxx>
 #include <TopoDS_Shape.hxx>
+#include <NCollection_List.hxx>
 #include "hs_Exception.h"
 #include "hs_BRepBuilderAPI_MakeShape.h"
 
@@ -32,5 +33,50 @@
         [builder]{
             builder->Build();
         }
+    );
+}
+LIST(TopoDS_Shape) * hs_BRepBuilderAPI_MakeShape_modified(
+        BRepBuilderAPI_MakeShape * builder,
+        TopoDS_Shape * shape,
+        HSExceptionType* exType,
+        void** exPtr
+    ){
+    return hs_handleEx(
+        exType,
+        exPtr,
+        [builder, shape]{
+            return new NCollection_List<TopoDS_Shape>(builder->Modified(*shape));
+        }
+    );
+}
+
+LIST(TopoDS_Shape) * hs_BRepBuilderAPI_MakeShape_generated(
+        BRepBuilderAPI_MakeShape * builder,
+        TopoDS_Shape * shape,
+        HSExceptionType* exType,
+        void** exPtr
+    ){
+    return hs_handleEx(
+        exType,
+        exPtr,
+        [builder, shape]{
+            return new NCollection_List<TopoDS_Shape>(builder->Generated(*shape));
+        }
+    );
+}
+
+bool hs_BRepBuilderAPI_MakeShape_isDeleted(
+        BRepBuilderAPI_MakeShape * builder,
+        TopoDS_Shape * shape,
+        HSExceptionType* exType,
+        void** exPtr
+    ){
+    return hs_handleExWithDefault(
+        exType,
+        exPtr,
+        [builder, shape]{
+            return builder->IsDeleted(*shape);
+        },
+        false
     );
 }
diff --git a/cpp/hs_BRepBuilderAPI_MakeShape.h b/cpp/hs_BRepBuilderAPI_MakeShape.h
--- a/cpp/hs_BRepBuilderAPI_MakeShape.h
+++ b/cpp/hs_BRepBuilderAPI_MakeShape.h
@@ -14,9 +14,30 @@
 );
 
 void hs_BRepBuilderAPI_MakeShape_build(
-        BRepBuilderAPI_MakeShape* builder, 
+        BRepBuilderAPI_MakeShape* builder,
         HSExceptionType* exType,
         void** exPtr
+);
+
+LIST(TopoDS_Shape) * hs_BRepBuilderAPI_MakeShape_modified(
+    BRepBuilderAPI_MakeShape * builder,
+    TopoDS_Shape * shape,
+    HSExceptionType* exType,
+    void** exPtr
+);
+
+LIST(TopoDS_Shape) * hs_BRepBuilderAPI_MakeShape_generated(
+    BRepBuilderAPI_MakeShape * builder,
+    TopoDS_Shape * shape,
+    HSExceptionType* exType,
+    void** exPtr
+);
+
+bool hs_BRepBuilderAPI_MakeShape_isDeleted(
+    BRepBuilderAPI_MakeShape * builder,
+    TopoDS_Shape * shape,
+    HSExceptionType* exType,
+    void** exPtr
 );
 
 #ifdef __cplusplus
diff --git a/cpp/hs_BRepBuilderAPI_MakeWire.cpp b/cpp/hs_BRepBuilderAPI_MakeWire.cpp
--- a/cpp/hs_BRepBuilderAPI_MakeWire.cpp
+++ b/cpp/hs_BRepBuilderAPI_MakeWire.cpp
@@ -1,5 +1,6 @@
 #include <BRepBuilderAPI_MakeWire.hxx>
-#include <TopTools_ListOfShape.hxx>
+#include <NCollection_List.hxx>
+#include <TopoDS_Shape.hxx>
 #include <TopoDS_Wire.hxx>
 #include "hs_Exception.h"
 #include "hs_BRepBuilderAPI_MakeWire.h"
@@ -39,7 +40,7 @@
 }
 
 void hs_BRepBuilderAPI_MakeWire_AddListOfShape(
-        BRepBuilderAPI_MakeWire* builder, TopTools_ListOfShape *list,
+        BRepBuilderAPI_MakeWire* builder, LIST(TopoDS_Shape) *list,
         HSExceptionType* exType,
         void** exPtr
 ){
diff --git a/cpp/hs_BRepBuilderAPI_MakeWire.h b/cpp/hs_BRepBuilderAPI_MakeWire.h
--- a/cpp/hs_BRepBuilderAPI_MakeWire.h
+++ b/cpp/hs_BRepBuilderAPI_MakeWire.h
@@ -24,7 +24,7 @@
 );
 
 void hs_BRepBuilderAPI_MakeWire_AddListOfShape(
-    BRepBuilderAPI_MakeWire* builder, TopTools_ListOfShape *list,
+    BRepBuilderAPI_MakeWire* builder, LIST(TopoDS_Shape) *list,
     HSExceptionType* exType,
     void** exPtr
 );
diff --git a/cpp/hs_BRepBuilderAPI_Transform.cpp b/cpp/hs_BRepBuilderAPI_Transform.cpp
--- a/cpp/hs_BRepBuilderAPI_Transform.cpp
+++ b/cpp/hs_BRepBuilderAPI_Transform.cpp
@@ -3,7 +3,7 @@
 #include "hs_Exception.h"
 #include "hs_BRepBuilderAPI_Transform.h"
 
-TopoDS_Shape * hs_BRepBuilderAPI_Transform_transform(
+BRepBuilderAPI_Transform * hs_new_BRepBuilderAPI_Transform_fromShapeTrsfAndCopy(
         TopoDS_Shape * shape, gp_Trsf * trsf, bool copy,
         HSExceptionType* exType,
         void** exPtr
@@ -12,9 +12,10 @@
         exType,
         exPtr,
         [shape, trsf, copy]{
-        auto builder = BRepBuilderAPI_Transform(*shape, *trsf, copy);
-        return new TopoDS_Shape(builder.Shape());
+        return new BRepBuilderAPI_Transform(*shape, *trsf, copy);
     });
 }
 
-
+void hs_delete_BRepBuilderAPI_Transform(BRepBuilderAPI_Transform * builder){
+    delete builder;
+}
diff --git a/cpp/hs_BRepBuilderAPI_Transform.h b/cpp/hs_BRepBuilderAPI_Transform.h
--- a/cpp/hs_BRepBuilderAPI_Transform.h
+++ b/cpp/hs_BRepBuilderAPI_Transform.h
@@ -7,11 +7,13 @@
 extern "C" {
 #endif
 
-TopoDS_Shape * hs_BRepBuilderAPI_Transform_transform(
+BRepBuilderAPI_Transform * hs_new_BRepBuilderAPI_Transform_fromShapeTrsfAndCopy(
     TopoDS_Shape * shape, gp_Trsf * trsf, bool copy,
     HSExceptionType* exType,
     void** exPtr
 );
+
+void hs_delete_BRepBuilderAPI_Transform(BRepBuilderAPI_Transform * builder);
 
 #ifdef __cplusplus
 }
diff --git a/cpp/hs_Exception.h b/cpp/hs_Exception.h
--- a/cpp/hs_Exception.h
+++ b/cpp/hs_Exception.h
@@ -7,7 +7,23 @@
 
 #include <stdexcept>
 #include <Standard_Failure.hxx>
+#include <Standard_Version.hxx>
+#include <string>
 
+struct HSStandardFailure {
+  std::string typeName;
+  Standard_Failure failure;
+};
+
+inline HSStandardFailure* hs_copyStandardFailure(const Standard_Failure& e) {
+#if OCC_VERSION_HEX >= 0x080000
+  const char* typeName = e.ExceptionType();
+#else
+  const char* typeName = e.DynamicType()->Name();
+#endif
+  return new HSStandardFailure{ typeName ? typeName : "", Standard_Failure(e) };
+}
+
 enum HSExceptionType {
     NoException = 0,
     StandardFailureEx = 1,
@@ -23,7 +39,7 @@
   }
   catch (Standard_Failure &e) {
     *theType = StandardFailureEx;
-    *exPtr = new Standard_Failure(e);
+    *exPtr = hs_copyStandardFailure(e);
   }
   catch (std::exception &e) {
     *theType = StdExceptionEx;
@@ -48,7 +64,7 @@
   }
   catch (Standard_Failure &e) {
     *theType = StandardFailureEx;
-    *exPtr = new Standard_Failure(e);
+    *exPtr = hs_copyStandardFailure(e);
   }
   catch (std::exception &e) {
     *theType = StdExceptionEx;
diff --git a/cpp/hs_HLRAlgo_Projector.cpp b/cpp/hs_HLRAlgo_Projector.cpp
--- a/cpp/hs_HLRAlgo_Projector.cpp
+++ b/cpp/hs_HLRAlgo_Projector.cpp
@@ -1,4 +1,5 @@
 #include <HLRAlgo_Projector.hxx>
+#include <gp_Trsf.hxx>
 #include "hs_HLRAlgo_Projector.h"
 
 HLRAlgo_Projector * hs_new_HLRAlgo_Projector_fromAx2(gp_Ax2* axis){
@@ -7,4 +8,12 @@
 
 void hs_delete_HLRAlgo_Projector(HLRAlgo_Projector* projector){
     delete projector;
+}
+
+gp_Trsf * hs_HLRAlgo_Projector_Transformation(HLRAlgo_Projector* projector){
+    return new gp_Trsf(projector->Transformation());
+}
+
+gp_Trsf * hs_HLRAlgo_Projector_InvertedTransformation(HLRAlgo_Projector* projector){
+    return new gp_Trsf(projector->InvertedTransformation());
 }
diff --git a/cpp/hs_HLRAlgo_Projector.h b/cpp/hs_HLRAlgo_Projector.h
--- a/cpp/hs_HLRAlgo_Projector.h
+++ b/cpp/hs_HLRAlgo_Projector.h
@@ -10,9 +10,13 @@
 HLRAlgo_Projector * hs_new_HLRAlgo_Projector_fromAx2(gp_Ax2* axis);
 
 void hs_delete_HLRAlgo_Projector(HLRAlgo_Projector* projector);
+
+gp_Trsf * hs_HLRAlgo_Projector_Transformation(HLRAlgo_Projector* projector);
+
+gp_Trsf * hs_HLRAlgo_Projector_InvertedTransformation(HLRAlgo_Projector* projector);
+
 #ifdef __cplusplus
 }
 #endif
 
 #endif // HS_HLR_ALGO_PROJECTOR_H
-
diff --git a/cpp/hs_IntCurvesFace_ShapeIntersector.cpp b/cpp/hs_IntCurvesFace_ShapeIntersector.cpp
new file mode 100644
--- /dev/null
+++ b/cpp/hs_IntCurvesFace_ShapeIntersector.cpp
@@ -0,0 +1,71 @@
+#include <IntCurvesFace_ShapeIntersector.hxx>
+#include <TopoDS_Shape.hxx>
+#include <TopoDS_Face.hxx>
+#include <gp_Lin.hxx>
+#include <gp_Pnt.hxx>
+#include "hs_Exception.h"
+#include "hs_IntCurvesFace_ShapeIntersector.h"
+
+IntCurvesFace_ShapeIntersector * hs_new_IntCurvesFace_ShapeIntersector(){
+    return new IntCurvesFace_ShapeIntersector();
+}
+
+void hs_delete_IntCurvesFace_ShapeIntersector(IntCurvesFace_ShapeIntersector * intersector){
+    delete intersector;
+}
+
+void hs_IntCurvesFace_ShapeIntersector_Load(IntCurvesFace_ShapeIntersector * intersector, TopoDS_Shape * shape, double tol, HSExceptionType* exType, void ** exPtr){
+    hs_handleExVoid(exType, exPtr, [intersector, shape, tol]{
+        intersector->Load(*shape, tol);
+    });
+}
+
+void hs_IntCurvesFace_ShapeIntersector_Perform(IntCurvesFace_ShapeIntersector * intersector, gp_Lin * line, double pInf, double pSup, HSExceptionType* exType, void ** exPtr){
+    hs_handleExVoid(exType, exPtr, [intersector, line, pInf, pSup]{
+        intersector->Perform(*line, pInf, pSup);
+    });
+}
+
+void hs_IntCurvesFace_ShapeIntersector_PerformNearest(IntCurvesFace_ShapeIntersector * intersector, gp_Lin * line, double pInf, double pSup, HSExceptionType* exType, void ** exPtr){
+    hs_handleExVoid(exType, exPtr, [intersector, line, pInf, pSup]{
+        intersector->PerformNearest(*line, pInf, pSup);
+    });
+}
+
+bool hs_IntCurvesFace_ShapeIntersector_IsDone(IntCurvesFace_ShapeIntersector * intersector){
+    return intersector->IsDone();
+}
+
+int hs_IntCurvesFace_ShapeIntersector_NbPnt(IntCurvesFace_ShapeIntersector * intersector){
+    return intersector->NbPnt();
+}
+
+double hs_IntCurvesFace_ShapeIntersector_UParameter(IntCurvesFace_ShapeIntersector * intersector, int index, HSExceptionType* exType, void ** exPtr){
+    return hs_handleExWithDefault(exType, exPtr, [intersector, index]{
+        return intersector->UParameter(index);
+    }, 0.0);
+}
+
+double hs_IntCurvesFace_ShapeIntersector_VParameter(IntCurvesFace_ShapeIntersector * intersector, int index, HSExceptionType* exType, void ** exPtr){
+    return hs_handleExWithDefault(exType, exPtr, [intersector, index]{
+        return intersector->VParameter(index);
+    }, 0.0);
+}
+
+double hs_IntCurvesFace_ShapeIntersector_WParameter(IntCurvesFace_ShapeIntersector * intersector, int index, HSExceptionType* exType, void ** exPtr){
+    return hs_handleExWithDefault(exType, exPtr, [intersector, index]{
+        return intersector->WParameter(index);
+    }, 0.0);
+}
+
+gp_Pnt * hs_IntCurvesFace_ShapeIntersector_Pnt(IntCurvesFace_ShapeIntersector * intersector, int index, HSExceptionType* exType, void ** exPtr){
+    return hs_handleEx(exType, exPtr, [intersector, index]{
+        return new gp_Pnt(intersector->Pnt(index));
+    });
+}
+
+TopoDS_Face * hs_IntCurvesFace_ShapeIntersector_Face(IntCurvesFace_ShapeIntersector * intersector, int index, HSExceptionType* exType, void ** exPtr){
+    return hs_handleEx(exType, exPtr, [intersector, index]{
+        return new TopoDS_Face(intersector->Face(index));
+    });
+}
diff --git a/cpp/hs_IntCurvesFace_ShapeIntersector.h b/cpp/hs_IntCurvesFace_ShapeIntersector.h
new file mode 100644
--- /dev/null
+++ b/cpp/hs_IntCurvesFace_ShapeIntersector.h
@@ -0,0 +1,38 @@
+#ifndef HS_INTCURVESFACE_SHAPEINTERSECTOR_H
+#define HS_INTCURVESFACE_SHAPEINTERSECTOR_H
+
+#include "hs_types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+IntCurvesFace_ShapeIntersector * hs_new_IntCurvesFace_ShapeIntersector();
+
+void hs_delete_IntCurvesFace_ShapeIntersector(IntCurvesFace_ShapeIntersector * intersector);
+
+void hs_IntCurvesFace_ShapeIntersector_Load(IntCurvesFace_ShapeIntersector * intersector, TopoDS_Shape * shape, double tol, HSExceptionType* exType, void ** exPtr);
+
+void hs_IntCurvesFace_ShapeIntersector_Perform(IntCurvesFace_ShapeIntersector * intersector, gp_Lin * line, double pInf, double pSup, HSExceptionType* exType, void ** exPtr);
+
+void hs_IntCurvesFace_ShapeIntersector_PerformNearest(IntCurvesFace_ShapeIntersector * intersector, gp_Lin * line, double pInf, double pSup, HSExceptionType* exType, void ** exPtr);
+
+bool hs_IntCurvesFace_ShapeIntersector_IsDone(IntCurvesFace_ShapeIntersector * intersector);
+
+int hs_IntCurvesFace_ShapeIntersector_NbPnt(IntCurvesFace_ShapeIntersector * intersector);
+
+double hs_IntCurvesFace_ShapeIntersector_UParameter(IntCurvesFace_ShapeIntersector * intersector, int index, HSExceptionType* exType, void ** exPtr);
+
+double hs_IntCurvesFace_ShapeIntersector_VParameter(IntCurvesFace_ShapeIntersector * intersector, int index, HSExceptionType* exType, void ** exPtr);
+
+double hs_IntCurvesFace_ShapeIntersector_WParameter(IntCurvesFace_ShapeIntersector * intersector, int index, HSExceptionType* exType, void ** exPtr);
+
+gp_Pnt * hs_IntCurvesFace_ShapeIntersector_Pnt(IntCurvesFace_ShapeIntersector * intersector, int index, HSExceptionType* exType, void ** exPtr);
+
+TopoDS_Face * hs_IntCurvesFace_ShapeIntersector_Face(IntCurvesFace_ShapeIntersector * intersector, int index, HSExceptionType* exType, void ** exPtr);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // HS_INTCURVESFACE_SHAPEINTERSECTOR_H
diff --git a/cpp/hs_NCollection_IndexedDataMap.cpp b/cpp/hs_NCollection_IndexedDataMap.cpp
new file mode 100644
--- /dev/null
+++ b/cpp/hs_NCollection_IndexedDataMap.cpp
@@ -0,0 +1,74 @@
+#include <NCollection_IndexedDataMap.hxx>
+#include <NCollection_List.hxx>
+#include <TCollection_AsciiString.hxx>
+#include <TopoDS_Shape.hxx>
+#include <TopTools_ShapeMapHasher.hxx>
+#include "hs_Exception.h"
+#include "hs_NCollection_IndexedDataMap.h"
+
+INDEXED_DATA_MAP(TCollection_AsciiString, TCollection_AsciiString, DEFAULT_HASHER(TCollection_AsciiString)) * 
+    hs_new_NCollection_IndexedDataMap_TCollection_AsciiString_TCollection_AsciiString(){
+        return new NCollection_IndexedDataMap<TCollection_AsciiString, TCollection_AsciiString>();
+}
+
+void hs_delete_NCollection_IndexedDataMap_TCollection_AsciiString_TCollection_AsciiString(
+        INDEXED_DATA_MAP(TCollection_AsciiString, TCollection_AsciiString, DEFAULT_HASHER(TCollection_AsciiString)) * theMap
+    ){
+    delete theMap;
+}
+
+INDEXED_DATA_MAP(TopoDS_Shape, LIST(TopoDS_Shape), TopTools_ShapeMapHasher) *
+    hs_new_NCollection_IndexedDataMap_TopoDS_Shape_NCollection_List_TopoDS_Shape(){
+        return new NCollection_IndexedDataMap<TopoDS_Shape, NCollection_List<TopoDS_Shape>, TopTools_ShapeMapHasher>();
+}
+
+void hs_delete_NCollection_IndexedDataMap_TopoDS_Shape_NCollection_List_TopoDS_Shape(
+    INDEXED_DATA_MAP(TopoDS_Shape, LIST(TopoDS_Shape), TopTools_ShapeMapHasher) * theMap
+) {
+    delete theMap;
+}
+
+int hs_NCollection_IndexedDataMap_TopoDS_Shape_NCollection_List_TopoDS_Shape_extent(
+    INDEXED_DATA_MAP(TopoDS_Shape, LIST(TopoDS_Shape), TopTools_ShapeMapHasher) * theMap
+){
+    return theMap->Extent();
+}
+
+bool hs_NCollection_IndexedDataMap_TopoDS_Shape_NCollection_List_TopoDS_Shape_contains(
+    INDEXED_DATA_MAP(TopoDS_Shape, LIST(TopoDS_Shape), TopTools_ShapeMapHasher) * theMap,
+    TopoDS_Shape * shape
+){
+    return theMap->Contains(*shape);
+}
+
+LIST(TopoDS_Shape) * hs_NCollection_IndexedDataMap_TopoDS_Shape_NCollection_List_TopoDS_Shape_findFromKey(
+    INDEXED_DATA_MAP(TopoDS_Shape, LIST(TopoDS_Shape), TopTools_ShapeMapHasher) * theMap,
+    TopoDS_Shape * shape,
+    HSExceptionType* exType, void ** exPtr
+){
+    return hs_handleEx(exType, exPtr, [theMap, shape]{
+        return new NCollection_List<TopoDS_Shape>(theMap->FindFromKey(*shape));
+    });
+}
+
+// index is 1 based
+TopoDS_Shape * hs_NCollection_IndexedDataMap_TopoDS_Shape_NCollection_List_TopoDS_Shape_findKey(
+    INDEXED_DATA_MAP(TopoDS_Shape, LIST(TopoDS_Shape), TopTools_ShapeMapHasher) * theMap,
+    int index,
+    HSExceptionType* exType, void ** exPtr
+){
+    return hs_handleEx(exType, exPtr, [theMap, index]{
+        return new TopoDS_Shape(theMap->FindKey(index));
+    });
+}
+
+// index is 1 based
+LIST(TopoDS_Shape) * hs_NCollection_IndexedDataMap_TopoDS_Shape_NCollection_List_TopoDS_Shape_findFromIndex(
+    INDEXED_DATA_MAP(TopoDS_Shape, LIST(TopoDS_Shape), TopTools_ShapeMapHasher) * theMap,
+    int index,
+    HSExceptionType* exType, void ** exPtr
+){
+    return hs_handleEx(exType, exPtr, [theMap, index]{
+        return new NCollection_List<TopoDS_Shape>(theMap->FindFromIndex(index));
+    });
+}
diff --git a/cpp/hs_NCollection_IndexedDataMap.h b/cpp/hs_NCollection_IndexedDataMap.h
new file mode 100644
--- /dev/null
+++ b/cpp/hs_NCollection_IndexedDataMap.h
@@ -0,0 +1,55 @@
+#ifndef HS_NCOLLECTION_INDEXEDDATAMAP_H
+#define HS_NCOLLECTION_INDEXEDDATAMAP_H
+
+#include "hs_types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+INDEXED_DATA_MAP(TCollection_AsciiString, TCollection_AsciiString, DEFAULT_HASHER(TCollection_AsciiString)) *
+    hs_new_NCollection_IndexedDataMap_TCollection_AsciiString_TCollection_AsciiString();
+
+void hs_delete_NCollection_IndexedDataMap_TCollection_AsciiString_TCollection_AsciiString(
+    INDEXED_DATA_MAP(TCollection_AsciiString, TCollection_AsciiString, DEFAULT_HASHER(TCollection_AsciiString)) *theMap
+);
+
+INDEXED_DATA_MAP(TopoDS_Shape, LIST(TopoDS_Shape), TopTools_ShapeMapHasher) *
+    hs_new_NCollection_IndexedDataMap_TopoDS_Shape_NCollection_List_TopoDS_Shape();
+
+void hs_delete_NCollection_IndexedDataMap_TopoDS_Shape_NCollection_List_TopoDS_Shape(
+    INDEXED_DATA_MAP(TopoDS_Shape, LIST(TopoDS_Shape), TopTools_ShapeMapHasher) * theMap
+);
+
+int hs_NCollection_IndexedDataMap_TopoDS_Shape_NCollection_List_TopoDS_Shape_extent(
+    INDEXED_DATA_MAP(TopoDS_Shape, LIST(TopoDS_Shape), TopTools_ShapeMapHasher) * theMap
+);
+
+bool hs_NCollection_IndexedDataMap_TopoDS_Shape_NCollection_List_TopoDS_Shape_contains(
+    INDEXED_DATA_MAP(TopoDS_Shape, LIST(TopoDS_Shape), TopTools_ShapeMapHasher) * theMap,
+    TopoDS_Shape * shape
+);
+
+LIST(TopoDS_Shape) * hs_NCollection_IndexedDataMap_TopoDS_Shape_NCollection_List_TopoDS_Shape_findFromKey(
+    INDEXED_DATA_MAP(TopoDS_Shape, LIST(TopoDS_Shape), TopTools_ShapeMapHasher) * theMap,
+    TopoDS_Shape * shape,
+    HSExceptionType* exType, void ** exPtr
+);
+
+TopoDS_Shape * hs_NCollection_IndexedDataMap_TopoDS_Shape_NCollection_List_TopoDS_Shape_findKey(
+    INDEXED_DATA_MAP(TopoDS_Shape, LIST(TopoDS_Shape), TopTools_ShapeMapHasher) * theMap,
+    int index,
+    HSExceptionType* exType, void ** exPtr
+);
+
+LIST(TopoDS_Shape) * hs_NCollection_IndexedDataMap_TopoDS_Shape_NCollection_List_TopoDS_Shape_findFromIndex(
+    INDEXED_DATA_MAP(TopoDS_Shape, LIST(TopoDS_Shape), TopTools_ShapeMapHasher) * theMap,
+    int index,
+    HSExceptionType* exType, void ** exPtr
+);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // HS_NCOLLECTION_INDEXEDDATAMAP_H
diff --git a/cpp/hs_NCollection_List.cpp b/cpp/hs_NCollection_List.cpp
new file mode 100644
--- /dev/null
+++ b/cpp/hs_NCollection_List.cpp
@@ -0,0 +1,39 @@
+#include <NCollection_List.hxx>
+#include <TopoDS_Shape.hxx>
+#include "hs_NCollection_List.h"
+
+LIST(TopoDS_Shape) * hs_new_NCollection_List_TopoDS_Shape(){
+    return new NCollection_List<TopoDS_Shape>();
+}
+
+void hs_delete_NCollection_List_TopoDS_Shape(LIST(TopoDS_Shape) * list){
+    delete list;
+}
+
+int hs_NCollection_List_TopoDS_Shape_extent(LIST(TopoDS_Shape) * list){
+    return list->Extent();
+}
+
+void hs_NCollection_List_TopoDS_Shape_append(LIST(TopoDS_Shape) * list, TopoDS_Shape * shape){
+    list->Append(*shape);
+}
+
+LIST_ITERATOR(TopoDS_Shape) * hs_new_NCollection_List_TopoDS_Shape_Iterator(LIST(TopoDS_Shape) * list){
+    return new NCollection_List<TopoDS_Shape>::Iterator(*list);
+}
+
+void hs_delete_NCollection_List_TopoDS_Shape_Iterator(LIST_ITERATOR(TopoDS_Shape) * iterator){
+    delete iterator;
+}
+
+bool hs_NCollection_List_TopoDS_Shape_Iterator_more(LIST_ITERATOR(TopoDS_Shape) * iterator){
+    return iterator->More();
+}
+
+void hs_NCollection_List_TopoDS_Shape_Iterator_next(LIST_ITERATOR(TopoDS_Shape) * iterator){
+    iterator->Next();
+}
+
+TopoDS_Shape * hs_NCollection_List_TopoDS_Shape_Iterator_value(LIST_ITERATOR(TopoDS_Shape) * iterator){
+    return new TopoDS_Shape(iterator->Value());
+}
diff --git a/cpp/hs_NCollection_List.h b/cpp/hs_NCollection_List.h
new file mode 100644
--- /dev/null
+++ b/cpp/hs_NCollection_List.h
@@ -0,0 +1,32 @@
+#ifndef HS_NCOLLECTION_LIST_H
+#define HS_NCOLLECTION_LIST_H
+
+#include "hs_types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+LIST(TopoDS_Shape) * hs_new_NCollection_List_TopoDS_Shape();
+
+void hs_delete_NCollection_List_TopoDS_Shape(LIST(TopoDS_Shape) * list);
+
+int hs_NCollection_List_TopoDS_Shape_extent(LIST(TopoDS_Shape) * list);
+
+void hs_NCollection_List_TopoDS_Shape_append(LIST(TopoDS_Shape) * list, TopoDS_Shape * shape);
+
+LIST_ITERATOR(TopoDS_Shape) * hs_new_NCollection_List_TopoDS_Shape_Iterator(LIST(TopoDS_Shape) * list);
+
+void hs_delete_NCollection_List_TopoDS_Shape_Iterator(LIST_ITERATOR(TopoDS_Shape) * iterator);
+
+bool hs_NCollection_List_TopoDS_Shape_Iterator_more(LIST_ITERATOR(TopoDS_Shape) * iterator);
+
+void hs_NCollection_List_TopoDS_Shape_Iterator_next(LIST_ITERATOR(TopoDS_Shape) * iterator);
+
+TopoDS_Shape * hs_NCollection_List_TopoDS_Shape_Iterator_value(LIST_ITERATOR(TopoDS_Shape) * iterator);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // HS_NCOLLECTION_LIST_H
diff --git a/cpp/hs_NCollection_Vec3.cpp b/cpp/hs_NCollection_Vec3.cpp
new file mode 100644
--- /dev/null
+++ b/cpp/hs_NCollection_Vec3.cpp
@@ -0,0 +1,10 @@
+#include <NCollection_Vec3.hxx>
+#include "hs_NCollection_Vec3.h"
+
+VEC3(float) * hs_new_NCollection_Vec3_float(float x, float y, float z){
+    return new NCollection_Vec3<float>(x, y, z);
+}
+
+void hs_delete_NCollection_Vec3_float(VEC3(float) * vec){
+    delete vec;
+}
diff --git a/cpp/hs_NCollection_Vec3.h b/cpp/hs_NCollection_Vec3.h
new file mode 100644
--- /dev/null
+++ b/cpp/hs_NCollection_Vec3.h
@@ -0,0 +1,18 @@
+#ifndef HS_NCOLLECTION_VEC3_H
+#define HS_NCOLLECTION_VEC3_H
+
+#include "hs_types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+VEC3(float) * hs_new_NCollection_Vec3_float(float x, float y, float z);
+
+void hs_delete_NCollection_Vec3_float(VEC3(float) * vec);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // HS_NCOLLECTION_VEC3_H
diff --git a/cpp/hs_Poly_Triangulation.cpp b/cpp/hs_Poly_Triangulation.cpp
--- a/cpp/hs_Poly_Triangulation.cpp
+++ b/cpp/hs_Poly_Triangulation.cpp
@@ -79,3 +79,6 @@
         }
     );
 }
+bool hs_Poly_Triangulation_isNull(Handle(Poly_Triangulation) * triangulation){
+    return triangulation->IsNull();
+}
diff --git a/cpp/hs_Poly_Triangulation.h b/cpp/hs_Poly_Triangulation.h
--- a/cpp/hs_Poly_Triangulation.h
+++ b/cpp/hs_Poly_Triangulation.h
@@ -18,6 +18,8 @@
 
 int hs_Poly_Triangulation_nbTriangles(Handle(Poly_Triangulation) * triangulation);
 
+bool hs_Poly_Triangulation_isNull(Handle(Poly_Triangulation) * triangulation);
+
 gp_Pnt * hs_Poly_Triangulation_node(
     Handle(Poly_Triangulation) * triangulation, int index,
     HSExceptionType* exType, void ** exPtr
diff --git a/cpp/hs_Quantity_Color.cpp b/cpp/hs_Quantity_Color.cpp
new file mode 100644
--- /dev/null
+++ b/cpp/hs_Quantity_Color.cpp
@@ -0,0 +1,16 @@
+#include <Quantity_Color.hxx>
+#include "hs_Exception.h"
+#include "hs_Quantity_Color.h"
+
+Quantity_Color * hs_new_Quantity_Color(
+        double c1, double c2, double c3, Quantity_TypeOfColor theType,
+        HSExceptionType* exType, void ** exPtr
+    ){
+    return hs_handleEx(exType, exPtr, [c1, c2, c3, theType]{
+        return new Quantity_Color(c1, c2, c3, theType);
+    });
+}
+
+void hs_delete_Quantity_Color(Quantity_Color * color){
+    delete color;
+}
diff --git a/cpp/hs_Quantity_Color.h b/cpp/hs_Quantity_Color.h
new file mode 100644
--- /dev/null
+++ b/cpp/hs_Quantity_Color.h
@@ -0,0 +1,21 @@
+#ifndef HS_QUANTITY_COLOR_H
+#define HS_QUANTITY_COLOR_H
+
+#include "hs_types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+Quantity_Color * hs_new_Quantity_Color(
+    double c1, double c2, double c3, Quantity_TypeOfColor theType,
+    HSExceptionType* exType, void ** exPtr
+);
+
+void hs_delete_Quantity_Color(Quantity_Color * color);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // HS_QUANTITY_COLOR_H
diff --git a/cpp/hs_Quantity_ColorRGBA.cpp b/cpp/hs_Quantity_ColorRGBA.cpp
new file mode 100644
--- /dev/null
+++ b/cpp/hs_Quantity_ColorRGBA.cpp
@@ -0,0 +1,10 @@
+#include <Quantity_ColorRGBA.hxx>
+#include "hs_Quantity_ColorRGBA.h"
+
+Quantity_ColorRGBA * hs_new_Quantity_ColorRGBA(Quantity_Color * color, double alpha){
+    return new Quantity_ColorRGBA(*color, (float) alpha);
+}
+
+void hs_delete_Quantity_ColorRGBA(Quantity_ColorRGBA * color){
+    delete color;
+}
diff --git a/cpp/hs_Quantity_ColorRGBA.h b/cpp/hs_Quantity_ColorRGBA.h
new file mode 100644
--- /dev/null
+++ b/cpp/hs_Quantity_ColorRGBA.h
@@ -0,0 +1,18 @@
+#ifndef HS_QUANTITY_COLORRGBA_H
+#define HS_QUANTITY_COLORRGBA_H
+
+#include "hs_types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+Quantity_ColorRGBA * hs_new_Quantity_ColorRGBA(Quantity_Color * color, double alpha);
+
+void hs_delete_Quantity_ColorRGBA(Quantity_ColorRGBA * color);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // HS_QUANTITY_COLORRGBA_H
diff --git a/cpp/hs_RWGltf_CafWriter.cpp b/cpp/hs_RWGltf_CafWriter.cpp
--- a/cpp/hs_RWGltf_CafWriter.cpp
+++ b/cpp/hs_RWGltf_CafWriter.cpp
@@ -1,5 +1,6 @@
 #include <RWGltf_CafWriter.hxx>
-#include <TColStd_IndexedDataMapOfStringString.hxx>
+#include <NCollection_IndexedDataMap.hxx>
+#include <TCollection_AsciiString.hxx>
 #include "hs_Exception.h"
 #include "hs_RWGltf_CafWriter.h"
 
@@ -12,7 +13,10 @@
 }
 
 void hs_RWGltf_CafWriter_Perform(
-    RWGltf_CafWriter * theWriter, Handle(TDocStd_Document) * theDocument, TColStd_IndexedDataMapOfStringString * theFileInfo, Message_ProgressRange * theProgress,
+    RWGltf_CafWriter * theWriter,
+    Handle(TDocStd_Document) * theDocument,
+    INDEXED_DATA_MAP(TCollection_AsciiString, TCollection_AsciiString, DEFAULT_HASHER(TCollection_AsciiString)) * theFileInfo,
+    Message_ProgressRange * theProgress,
     HSExceptionType* exType, void ** exPtr
 ){
     hs_handleExVoid(
diff --git a/cpp/hs_RWGltf_CafWriter.h b/cpp/hs_RWGltf_CafWriter.h
--- a/cpp/hs_RWGltf_CafWriter.h
+++ b/cpp/hs_RWGltf_CafWriter.h
@@ -12,7 +12,10 @@
 void hs_delete_RWGltf_CafWriter(RWGltf_CafWriter * theWriter);
 
 void hs_RWGltf_CafWriter_Perform(
-    RWGltf_CafWriter * theWriter, Handle(TDocStd_Document) * theDocument, TColStd_IndexedDataMapOfStringString * theFileInfo, Message_ProgressRange * theProgress,
+    RWGltf_CafWriter * theWriter, 
+    Handle(TDocStd_Document) * theDocument,
+    INDEXED_DATA_MAP(TCollection_AsciiString, TCollection_AsciiString, DEFAULT_HASHER(TCollection_AsciiString)) * theFileInfo,
+    Message_ProgressRange * theProgress,
     HSExceptionType* exType, void ** exPtr
 );
 
diff --git a/cpp/hs_RWObj_CafWriter.cpp b/cpp/hs_RWObj_CafWriter.cpp
--- a/cpp/hs_RWObj_CafWriter.cpp
+++ b/cpp/hs_RWObj_CafWriter.cpp
@@ -1,5 +1,6 @@
 #include <RWObj_CafWriter.hxx>
-#include <TColStd_IndexedDataMapOfStringString.hxx>
+#include <NCollection_IndexedDataMap.hxx>
+#include <TCollection_AsciiString.hxx>
 #include "hs_Exception.h"
 #include "hs_RWObj_CafWriter.h"
 
@@ -12,7 +13,10 @@
 }
 
 void hs_RWObj_CafWriter_Perform(
-    RWObj_CafWriter * theWriter, Handle(TDocStd_Document) * theDocument, TColStd_IndexedDataMapOfStringString * theFileInfo, Message_ProgressRange * theProgress,
+    RWObj_CafWriter * theWriter,
+    Handle(TDocStd_Document) * theDocument,
+    INDEXED_DATA_MAP(TCollection_AsciiString, TCollection_AsciiString, DEFAULT_HASHER(TCollection_AsciiString)) * theFileInfo,
+    Message_ProgressRange * theProgress,
     HSExceptionType* exType, void ** exPtr
 ){
     hs_handleExVoid(
diff --git a/cpp/hs_RWObj_CafWriter.h b/cpp/hs_RWObj_CafWriter.h
--- a/cpp/hs_RWObj_CafWriter.h
+++ b/cpp/hs_RWObj_CafWriter.h
@@ -12,7 +12,7 @@
 void hs_delete_RWObj_CafWriter(RWObj_CafWriter * theWriter);
 
 void hs_RWObj_CafWriter_Perform(
-    RWObj_CafWriter * theWriter, Handle(TDocStd_Document) * theDocument, TColStd_IndexedDataMapOfStringString * theFileInfo, Message_ProgressRange * theProgress,
+    RWObj_CafWriter * theWriter, Handle(TDocStd_Document) * theDocument, INDEXED_DATA_MAP(TCollection_AsciiString, TCollection_AsciiString, DEFAULT_HASHER(TCollection_AsciiString)) * theFileInfo, Message_ProgressRange * theProgress,
     HSExceptionType* exType, void ** exPtr
 );
 
diff --git a/cpp/hs_STEPCAFControl_Writer.cpp b/cpp/hs_STEPCAFControl_Writer.cpp
new file mode 100644
--- /dev/null
+++ b/cpp/hs_STEPCAFControl_Writer.cpp
@@ -0,0 +1,48 @@
+#include <STEPCAFControl_Writer.hxx>
+#include <TDocStd_Document.hxx>
+#include "hs_Exception.h"
+#include "hs_STEPCAFControl_Writer.h"
+
+STEPCAFControl_Writer * hs_new_STEPCAFControl_Writer(){
+    return new STEPCAFControl_Writer();
+}
+
+void hs_delete_STEPCAFControl_Writer(STEPCAFControl_Writer * writer){
+    delete writer;
+}
+
+void hs_STEPCAFControl_Writer_setColorMode(STEPCAFControl_Writer * writer, bool colorMode){
+    writer->SetColorMode(colorMode);
+}
+
+void hs_STEPCAFControl_Writer_setNameMode(STEPCAFControl_Writer * writer, bool nameMode){
+    writer->SetNameMode(nameMode);
+}
+
+bool hs_STEPCAFControl_Writer_transfer(
+        STEPCAFControl_Writer * writer, Handle(TDocStd_Document) * document, STEPControl_StepModelType mode,
+        HSExceptionType* exType, void ** exPtr
+    ){
+    return hs_handleExWithDefault(
+        exType,
+        exPtr,
+        [writer, document, mode]{
+            return writer->Transfer(*document, mode);
+        },
+        false
+    );
+}
+
+IFSelect_ReturnStatus hs_STEPCAFControl_Writer_write(
+        STEPCAFControl_Writer * writer, char * filename,
+        HSExceptionType* exType, void ** exPtr
+    ){
+    return hs_handleExWithDefault(
+        exType,
+        exPtr,
+        [writer, filename]{
+            return writer->Write(filename);
+        },
+        IFSelect_RetError
+    );
+}
diff --git a/cpp/hs_STEPCAFControl_Writer.h b/cpp/hs_STEPCAFControl_Writer.h
new file mode 100644
--- /dev/null
+++ b/cpp/hs_STEPCAFControl_Writer.h
@@ -0,0 +1,32 @@
+#ifndef HS_STEPCAFCONTROL_WRITER_H
+#define HS_STEPCAFCONTROL_WRITER_H
+
+#include "hs_types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+STEPCAFControl_Writer * hs_new_STEPCAFControl_Writer();
+
+void hs_delete_STEPCAFControl_Writer(STEPCAFControl_Writer * writer);
+
+void hs_STEPCAFControl_Writer_setColorMode(STEPCAFControl_Writer * writer, bool colorMode);
+
+void hs_STEPCAFControl_Writer_setNameMode(STEPCAFControl_Writer * writer, bool nameMode);
+
+bool hs_STEPCAFControl_Writer_transfer(
+    STEPCAFControl_Writer * writer, Handle(TDocStd_Document) * document, STEPControl_StepModelType mode,
+    HSExceptionType* exType, void ** exPtr
+);
+
+IFSelect_ReturnStatus hs_STEPCAFControl_Writer_write(
+    STEPCAFControl_Writer * writer, char * filename,
+    HSExceptionType* exType, void ** exPtr
+);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // HS_STEPCAFCONTROL_WRITER_H
diff --git a/cpp/hs_ShapeUpgrade_UnifySameDomain.cpp b/cpp/hs_ShapeUpgrade_UnifySameDomain.cpp
new file mode 100644
--- /dev/null
+++ b/cpp/hs_ShapeUpgrade_UnifySameDomain.cpp
@@ -0,0 +1,38 @@
+#include <ShapeUpgrade_UnifySameDomain.hxx>
+#include <TopoDS_Shape.hxx>
+#include "hs_Exception.h"
+#include "hs_ShapeUpgrade_UnifySameDomain.h"
+
+ShapeUpgrade_UnifySameDomain * hs_new_ShapeUpgrade_UnifySameDomain_fromShape(
+        TopoDS_Shape * shape, bool unifyEdges, bool unifyFaces, bool concatBSplines,
+        HSExceptionType* exType, void ** exPtr
+){
+    return hs_handleEx(exType, exPtr, [shape, unifyEdges, unifyFaces, concatBSplines]{
+        return new ShapeUpgrade_UnifySameDomain(*shape, unifyEdges, unifyFaces, concatBSplines);
+    });
+}
+
+void hs_delete_ShapeUpgrade_UnifySameDomain(ShapeUpgrade_UnifySameDomain * unify){
+    delete unify;
+}
+
+void hs_ShapeUpgrade_UnifySameDomain_setSafeInputMode(ShapeUpgrade_UnifySameDomain * unify, bool value){
+    unify->SetSafeInputMode(value);
+}
+
+void hs_ShapeUpgrade_UnifySameDomain_allowInternalEdges(ShapeUpgrade_UnifySameDomain * unify, bool value){
+    unify->AllowInternalEdges(value);
+}
+
+void hs_ShapeUpgrade_UnifySameDomain_build(
+        ShapeUpgrade_UnifySameDomain * unify,
+        HSExceptionType* exType, void ** exPtr
+){
+    hs_handleExVoid(exType, exPtr, [unify]{
+        unify->Build();
+    });
+}
+
+TopoDS_Shape * hs_ShapeUpgrade_UnifySameDomain_shape(ShapeUpgrade_UnifySameDomain * unify){
+    return new TopoDS_Shape(unify->Shape());
+}
diff --git a/cpp/hs_ShapeUpgrade_UnifySameDomain.h b/cpp/hs_ShapeUpgrade_UnifySameDomain.h
new file mode 100644
--- /dev/null
+++ b/cpp/hs_ShapeUpgrade_UnifySameDomain.h
@@ -0,0 +1,32 @@
+#ifndef HS_SHAPEUPGRADE_UNIFYSAMEDOMAIN_H
+#define HS_SHAPEUPGRADE_UNIFYSAMEDOMAIN_H
+
+#include "hs_types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+ShapeUpgrade_UnifySameDomain * hs_new_ShapeUpgrade_UnifySameDomain_fromShape(
+    TopoDS_Shape * shape, bool unifyEdges, bool unifyFaces, bool concatBSplines,
+    HSExceptionType* exType, void ** exPtr
+);
+
+void hs_delete_ShapeUpgrade_UnifySameDomain(ShapeUpgrade_UnifySameDomain * unify);
+
+void hs_ShapeUpgrade_UnifySameDomain_setSafeInputMode(ShapeUpgrade_UnifySameDomain * unify, bool value);
+
+void hs_ShapeUpgrade_UnifySameDomain_allowInternalEdges(ShapeUpgrade_UnifySameDomain * unify, bool value);
+
+void hs_ShapeUpgrade_UnifySameDomain_build(
+    ShapeUpgrade_UnifySameDomain * unify,
+    HSExceptionType* exType, void ** exPtr
+);
+
+TopoDS_Shape * hs_ShapeUpgrade_UnifySameDomain_shape(ShapeUpgrade_UnifySameDomain * unify);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // HS_SHAPEUPGRADE_UNIFYSAMEDOMAIN_H
diff --git a/cpp/hs_Standard_Failure.cpp b/cpp/hs_Standard_Failure.cpp
--- a/cpp/hs_Standard_Failure.cpp
+++ b/cpp/hs_Standard_Failure.cpp
@@ -1,14 +1,24 @@
 #include <Standard_Failure.hxx>
+#include <Standard_Version.hxx>
+#include "hs_Exception.h"
 #include "hs_Standard_Failure.h"
 
-void hs_delete_Standard_Failure(Standard_Failure *ex) {
+void hs_delete_Standard_Failure(HS_STANDARD_FAILURE *ex) {
     delete ex;
 }
 
-char * hs_Standard_Failure_GetMessageString(Standard_Failure *ex) {
-    return const_cast<char *>(ex->GetMessageString());
+char * hs_Standard_Failure_GetTypeName(HS_STANDARD_FAILURE *ex) {
+    return const_cast<char *>(ex->typeName.c_str());
 }
 
-char * hs_Standard_Failure_GetStackString(Standard_Failure *ex) {
-    return const_cast<char *>(ex->GetStackString());
+char * hs_Standard_Failure_GetMessageString(HS_STANDARD_FAILURE *ex) {
+#if OCC_VERSION_HEX >= 0x080000
+    return const_cast<char *>(ex->failure.what());
+#else
+    return const_cast<char *>(ex->failure.GetMessageString());
+#endif
+}
+
+char * hs_Standard_Failure_GetStackString(HS_STANDARD_FAILURE *ex) {
+    return const_cast<char *>(ex->failure.GetStackString());
 }
diff --git a/cpp/hs_Standard_Failure.h b/cpp/hs_Standard_Failure.h
--- a/cpp/hs_Standard_Failure.h
+++ b/cpp/hs_Standard_Failure.h
@@ -7,11 +7,13 @@
 extern "C" {
 #endif
 
-void hs_delete_Standard_Failure(Standard_Failure * ex);
+void hs_delete_Standard_Failure(HS_STANDARD_FAILURE * ex);
 
-char * hs_Standard_Failure_GetMessageString(Standard_Failure * ex);
+char * hs_Standard_Failure_GetTypeName(HS_STANDARD_FAILURE * ex);
 
-char * hs_Standard_Failure_GetStackString(Standard_Failure * ex);
+char * hs_Standard_Failure_GetMessageString(HS_STANDARD_FAILURE * ex);
+
+char * hs_Standard_Failure_GetStackString(HS_STANDARD_FAILURE * ex);
 
 #ifdef __cplusplus
 }
diff --git a/cpp/hs_TColStd_IndexedDataMapOfStringString.cpp b/cpp/hs_TColStd_IndexedDataMapOfStringString.cpp
deleted file mode 100644
--- a/cpp/hs_TColStd_IndexedDataMapOfStringString.cpp
+++ /dev/null
@@ -1,10 +0,0 @@
-#include <TColStd_IndexedDataMapOfStringString.hxx>
-#include "hs_TColStd_IndexedDataMapOfStringString.h"
-
-TColStd_IndexedDataMapOfStringString * hs_new_TColStd_IndexedDataMapOfStringString(){
-    return new TColStd_IndexedDataMapOfStringString();
-}
-
-void hs_delete_TColStd_IndexedDataMapOfStringString(TColStd_IndexedDataMapOfStringString * theMap){
-    delete theMap;
-}
diff --git a/cpp/hs_TColStd_IndexedDataMapOfStringString.h b/cpp/hs_TColStd_IndexedDataMapOfStringString.h
deleted file mode 100644
--- a/cpp/hs_TColStd_IndexedDataMapOfStringString.h
+++ /dev/null
@@ -1,18 +0,0 @@
-#ifndef HS_TCOLSTD_INDEXEDDATAMAPOFSTRINGSTRING_H
-#define HS_TCOLSTD_INDEXEDDATAMAPOFSTRINGSTRING_H
-
-#include "hs_types.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-TColStd_IndexedDataMapOfStringString * hs_new_TColStd_IndexedDataMapOfStringString();
-
-void hs_delete_TColStd_IndexedDataMapOfStringString(TColStd_IndexedDataMapOfStringString * theMap);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif // HS_TCOLSTD_INDEXEDDATAMAPOFSTRINGSTRING_H
diff --git a/cpp/hs_TDF_Label.cpp b/cpp/hs_TDF_Label.cpp
--- a/cpp/hs_TDF_Label.cpp
+++ b/cpp/hs_TDF_Label.cpp
@@ -4,3 +4,6 @@
 void hs_delete_TDF_Label(TDF_Label * theLabel){
     delete theLabel;
 }
+bool hs_TDF_Label_isNull(TDF_Label * theLabel){
+    return theLabel->IsNull();
+}
diff --git a/cpp/hs_TDF_Label.h b/cpp/hs_TDF_Label.h
--- a/cpp/hs_TDF_Label.h
+++ b/cpp/hs_TDF_Label.h
@@ -9,6 +9,8 @@
 
 void hs_delete_TDF_Label(TDF_Label * theLabel);
 
+bool hs_TDF_Label_isNull(TDF_Label * theLabel);
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/cpp/hs_TopExp.cpp b/cpp/hs_TopExp.cpp
new file mode 100644
--- /dev/null
+++ b/cpp/hs_TopExp.cpp
@@ -0,0 +1,14 @@
+#include <TopExp.hxx>
+#include <TopoDS_Shape.hxx>
+#include "hs_Exception.h"
+#include "hs_TopExp.h"
+
+void hs_TopExp_mapShapesAndAncestors(
+        TopoDS_Shape * shape, TopAbs_ShapeEnum subshapeType, TopAbs_ShapeEnum ancestorType,
+        INDEXED_DATA_MAP(TopoDS_Shape, LIST(TopoDS_Shape), TopTools_ShapeMapHasher) * theMap,
+        HSExceptionType* exType, void ** exPtr
+    ){
+    hs_handleExVoid(exType, exPtr, [shape, subshapeType, ancestorType, theMap]{
+        TopExp::MapShapesAndAncestors(*shape, subshapeType, ancestorType, *theMap);
+    });
+}
diff --git a/cpp/hs_TopExp.h b/cpp/hs_TopExp.h
new file mode 100644
--- /dev/null
+++ b/cpp/hs_TopExp.h
@@ -0,0 +1,20 @@
+#ifndef HS_TOPEXP_H
+#define HS_TOPEXP_H
+
+#include "hs_types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void hs_TopExp_mapShapesAndAncestors(
+        TopoDS_Shape * shape, TopAbs_ShapeEnum subshapeType, TopAbs_ShapeEnum ancestorType,
+        INDEXED_DATA_MAP(TopoDS_Shape, LIST(TopoDS_Shape), TopTools_ShapeMapHasher) * theMap,
+        HSExceptionType* exType, void ** exPtr
+    );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // HS_TOPEXP_H
diff --git a/cpp/hs_XCAFDoc_ColorTool.cpp b/cpp/hs_XCAFDoc_ColorTool.cpp
new file mode 100644
--- /dev/null
+++ b/cpp/hs_XCAFDoc_ColorTool.cpp
@@ -0,0 +1,28 @@
+#include <XCAFDoc_ColorTool.hxx>
+#include <TDF_Label.hxx>
+#include <Quantity_Color.hxx>
+#include <TopoDS_Shape.hxx>
+#include "hs_Exception.h"
+#include "hs_XCAFDoc_ColorTool.h"
+
+void hs_delete_XCAFDoc_ColorTool(Handle(XCAFDoc_ColorTool) * colorTool){
+    delete colorTool;
+}
+
+void hs_XCAFDoc_ColorTool_setColor(
+        Handle(XCAFDoc_ColorTool) * colorTool, TDF_Label * label, Quantity_Color * color, XCAFDoc_ColorType colorType,
+        HSExceptionType* exType, void ** exPtr
+    ){
+    hs_handleExVoid(exType, exPtr, [colorTool, label, color, colorType]{
+        (*colorTool)->SetColor(*label, *color, colorType);
+    });
+}
+
+bool hs_XCAFDoc_ColorTool_setShapeColor(
+        Handle(XCAFDoc_ColorTool) * colorTool, TopoDS_Shape * shape, Quantity_Color * color, XCAFDoc_ColorType colorType,
+        HSExceptionType* exType, void ** exPtr
+    ){
+    return hs_handleExWithDefault(exType, exPtr, [colorTool, shape, color, colorType]{
+        return (*colorTool)->SetColor(*shape, *color, colorType);
+    }, false);
+}
diff --git a/cpp/hs_XCAFDoc_ColorTool.h b/cpp/hs_XCAFDoc_ColorTool.h
new file mode 100644
--- /dev/null
+++ b/cpp/hs_XCAFDoc_ColorTool.h
@@ -0,0 +1,26 @@
+#ifndef HS_XCAFDOC_COLORTOOL_H
+#define HS_XCAFDOC_COLORTOOL_H
+
+#include "hs_types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void hs_delete_XCAFDoc_ColorTool(Handle(XCAFDoc_ColorTool) * colorTool);
+
+void hs_XCAFDoc_ColorTool_setColor(
+    Handle(XCAFDoc_ColorTool) * colorTool, TDF_Label * label, Quantity_Color * color, XCAFDoc_ColorType colorType,
+    HSExceptionType* exType, void ** exPtr
+);
+
+bool hs_XCAFDoc_ColorTool_setShapeColor(
+    Handle(XCAFDoc_ColorTool) * colorTool, TopoDS_Shape * shape, Quantity_Color * color, XCAFDoc_ColorType colorType,
+    HSExceptionType* exType, void ** exPtr
+);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // HS_XCAFDOC_COLORTOOL_H
diff --git a/cpp/hs_XCAFDoc_DocumentTool.cpp b/cpp/hs_XCAFDoc_DocumentTool.cpp
--- a/cpp/hs_XCAFDoc_DocumentTool.cpp
+++ b/cpp/hs_XCAFDoc_DocumentTool.cpp
@@ -1,4 +1,6 @@
 #include <XCAFDoc_DocumentTool.hxx>
+#include <XCAFDoc_ColorTool.hxx>
+#include <XCAFDoc_VisMaterialTool.hxx>
 #include "hs_Exception.h"
 #include "hs_XCAFDoc_DocumentTool.h"
 
@@ -8,5 +10,22 @@
 ){
     return hs_handleEx(exType, exPtr, [label]{
         return new opencascade::handle<XCAFDoc_ShapeTool>(XCAFDoc_DocumentTool::ShapeTool(*label));
+    });
+}
+Handle (XCAFDoc_ColorTool) * hs_XCAFDoc_DocumentTool_colorTool(
+        TDF_Label * label,
+        HSExceptionType* exType, void ** exPtr
+){
+    return hs_handleEx(exType, exPtr, [label]{
+        return new opencascade::handle<XCAFDoc_ColorTool>(XCAFDoc_DocumentTool::ColorTool(*label));
+    });
+}
+
+Handle (XCAFDoc_VisMaterialTool) * hs_XCAFDoc_DocumentTool_visMaterialTool(
+        TDF_Label * label,
+        HSExceptionType* exType, void ** exPtr
+){
+    return hs_handleEx(exType, exPtr, [label]{
+        return new opencascade::handle<XCAFDoc_VisMaterialTool>(XCAFDoc_DocumentTool::VisMaterialTool(*label));
     });
 }
diff --git a/cpp/hs_XCAFDoc_DocumentTool.h b/cpp/hs_XCAFDoc_DocumentTool.h
--- a/cpp/hs_XCAFDoc_DocumentTool.h
+++ b/cpp/hs_XCAFDoc_DocumentTool.h
@@ -12,6 +12,16 @@
     HSExceptionType* exType, void ** exPtr
 );
 
+Handle (XCAFDoc_ColorTool) * hs_XCAFDoc_DocumentTool_colorTool(
+    TDF_Label * label,
+    HSExceptionType* exType, void ** exPtr
+);
+
+Handle (XCAFDoc_VisMaterialTool) * hs_XCAFDoc_DocumentTool_visMaterialTool(
+    TDF_Label * label,
+    HSExceptionType* exType, void ** exPtr
+);
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/cpp/hs_XCAFDoc_ShapeTool.cpp b/cpp/hs_XCAFDoc_ShapeTool.cpp
--- a/cpp/hs_XCAFDoc_ShapeTool.cpp
+++ b/cpp/hs_XCAFDoc_ShapeTool.cpp
@@ -1,4 +1,6 @@
 #include <XCAFDoc_ShapeTool.hxx>
+#include <TDF_Label.hxx>
+#include <TopoDS_Shape.hxx>
 #include "hs_Exception.h"
 #include "hs_XCAFDoc_ShapeTool.h"
 
@@ -12,5 +14,22 @@
 ){
     return hs_handleEx(exType, exPtr, [shapeTool, theShape, makeAssembly, makePrepare]{
         return new TDF_Label(shapeTool->get()->AddShape(*theShape, makeAssembly, makePrepare));
+    });
+}
+TDF_Label * hs_XCAFDoc_ShapeTool_addSubShape(
+        Handle(XCAFDoc_ShapeTool) *shapeTool, TDF_Label *shapeLabel, TopoDS_Shape *subShape,
+        HSExceptionType* exType, void ** exPtr
+){
+    return hs_handleEx(exType, exPtr, [shapeTool, shapeLabel, subShape]{
+        return new TDF_Label(shapeTool->get()->AddSubShape(*shapeLabel, *subShape));
+    });
+}
+
+TDF_Label * hs_XCAFDoc_ShapeTool_findShape(
+        Handle(XCAFDoc_ShapeTool) *shapeTool, TopoDS_Shape *theShape, bool findInstance,
+        HSExceptionType* exType, void ** exPtr
+){
+    return hs_handleEx(exType, exPtr, [shapeTool, theShape, findInstance]{
+        return new TDF_Label(shapeTool->get()->FindShape(*theShape, findInstance));
     });
 }
diff --git a/cpp/hs_XCAFDoc_ShapeTool.h b/cpp/hs_XCAFDoc_ShapeTool.h
--- a/cpp/hs_XCAFDoc_ShapeTool.h
+++ b/cpp/hs_XCAFDoc_ShapeTool.h
@@ -14,6 +14,16 @@
     HSExceptionType* exType, void ** exPtr
 );
 
+TDF_Label * hs_XCAFDoc_ShapeTool_addSubShape(
+    Handle(XCAFDoc_ShapeTool) *shapeTool, TDF_Label *shapeLabel, TopoDS_Shape *subShape,
+    HSExceptionType* exType, void ** exPtr
+);
+
+TDF_Label * hs_XCAFDoc_ShapeTool_findShape(
+    Handle(XCAFDoc_ShapeTool) *shapeTool, TopoDS_Shape *theShape, bool findInstance,
+    HSExceptionType* exType, void ** exPtr
+);
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/cpp/hs_XCAFDoc_VisMaterial.cpp b/cpp/hs_XCAFDoc_VisMaterial.cpp
new file mode 100644
--- /dev/null
+++ b/cpp/hs_XCAFDoc_VisMaterial.cpp
@@ -0,0 +1,49 @@
+#include <XCAFDoc_VisMaterial.hxx>
+#include <XCAFDoc_VisMaterialPBR.hxx>
+#include <TCollection_HAsciiString.hxx>
+#include "hs_Exception.h"
+#include "hs_XCAFDoc_VisMaterial.h"
+
+Handle(XCAFDoc_VisMaterial) * hs_new_XCAFDoc_VisMaterial(){
+    return new opencascade::handle<XCAFDoc_VisMaterial>(new XCAFDoc_VisMaterial());
+}
+
+void hs_delete_XCAFDoc_VisMaterial(Handle(XCAFDoc_VisMaterial) * material){
+    delete material;
+}
+
+void hs_XCAFDoc_VisMaterial_setPbrMaterial(
+        Handle(XCAFDoc_VisMaterial) * material, XCAFDoc_VisMaterialPBR * pbr,
+        HSExceptionType* exType, void ** exPtr
+){
+    hs_handleExVoid(exType, exPtr, [material, pbr]{
+        (*material)->SetPbrMaterial(*pbr);
+    });
+}
+
+void hs_XCAFDoc_VisMaterial_setAlphaMode(
+        Handle(XCAFDoc_VisMaterial) * material, Graphic3d_AlphaMode mode, double cutOff,
+        HSExceptionType* exType, void ** exPtr
+){
+    hs_handleExVoid(exType, exPtr, [material, mode, cutOff]{
+        (*material)->SetAlphaMode(mode, (float) cutOff);
+    });
+}
+
+void hs_XCAFDoc_VisMaterial_setFaceCulling(
+        Handle(XCAFDoc_VisMaterial) * material, Graphic3d_TypeOfBackfacingModel faceCulling,
+        HSExceptionType* exType, void ** exPtr
+){
+    hs_handleExVoid(exType, exPtr, [material, faceCulling]{
+        (*material)->SetFaceCulling(faceCulling);
+    });
+}
+
+void hs_XCAFDoc_VisMaterial_setRawName(
+        Handle(XCAFDoc_VisMaterial) * material, char * name,
+        HSExceptionType* exType, void ** exPtr
+){
+    hs_handleExVoid(exType, exPtr, [material, name]{
+        (*material)->SetRawName(new TCollection_HAsciiString(name));
+    });
+}
diff --git a/cpp/hs_XCAFDoc_VisMaterial.h b/cpp/hs_XCAFDoc_VisMaterial.h
new file mode 100644
--- /dev/null
+++ b/cpp/hs_XCAFDoc_VisMaterial.h
@@ -0,0 +1,38 @@
+#ifndef HS_XCAFDOC_VISMATERIAL_H
+#define HS_XCAFDOC_VISMATERIAL_H
+
+#include "hs_types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+Handle(XCAFDoc_VisMaterial) * hs_new_XCAFDoc_VisMaterial();
+
+void hs_delete_XCAFDoc_VisMaterial(Handle(XCAFDoc_VisMaterial) * material);
+
+void hs_XCAFDoc_VisMaterial_setPbrMaterial(
+    Handle(XCAFDoc_VisMaterial) * material, XCAFDoc_VisMaterialPBR * pbr,
+    HSExceptionType* exType, void ** exPtr
+);
+
+void hs_XCAFDoc_VisMaterial_setAlphaMode(
+    Handle(XCAFDoc_VisMaterial) * material, Graphic3d_AlphaMode mode, double cutOff,
+    HSExceptionType* exType, void ** exPtr
+);
+
+void hs_XCAFDoc_VisMaterial_setFaceCulling(
+    Handle(XCAFDoc_VisMaterial) * material, Graphic3d_TypeOfBackfacingModel faceCulling,
+    HSExceptionType* exType, void ** exPtr
+);
+
+void hs_XCAFDoc_VisMaterial_setRawName(
+    Handle(XCAFDoc_VisMaterial) * material, char * name,
+    HSExceptionType* exType, void ** exPtr
+);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // HS_XCAFDOC_VISMATERIAL_H
diff --git a/cpp/hs_XCAFDoc_VisMaterialPBR.cpp b/cpp/hs_XCAFDoc_VisMaterialPBR.cpp
new file mode 100644
--- /dev/null
+++ b/cpp/hs_XCAFDoc_VisMaterialPBR.cpp
@@ -0,0 +1,32 @@
+#include <XCAFDoc_VisMaterialPBR.hxx>
+#include <Quantity_ColorRGBA.hxx>
+#include <NCollection_Vec3.hxx>
+#include "hs_XCAFDoc_VisMaterialPBR.h"
+
+XCAFDoc_VisMaterialPBR * hs_new_XCAFDoc_VisMaterialPBR(){
+    return new XCAFDoc_VisMaterialPBR();
+}
+
+void hs_delete_XCAFDoc_VisMaterialPBR(XCAFDoc_VisMaterialPBR * pbr){
+    delete pbr;
+}
+
+void hs_XCAFDoc_VisMaterialPBR_setBaseColor(XCAFDoc_VisMaterialPBR * pbr, Quantity_ColorRGBA * color){
+    pbr->BaseColor = *color;
+}
+
+void hs_XCAFDoc_VisMaterialPBR_setMetallic(XCAFDoc_VisMaterialPBR * pbr, double metallic){
+    pbr->Metallic = (float) metallic;
+}
+
+void hs_XCAFDoc_VisMaterialPBR_setRoughness(XCAFDoc_VisMaterialPBR * pbr, double roughness){
+    pbr->Roughness = (float) roughness;
+}
+
+void hs_XCAFDoc_VisMaterialPBR_setEmissiveFactor(XCAFDoc_VisMaterialPBR * pbr, VEC3(float) * factor){
+    pbr->EmissiveFactor = *factor;
+}
+
+void hs_XCAFDoc_VisMaterialPBR_setRefractionIndex(XCAFDoc_VisMaterialPBR * pbr, double refractionIndex){
+    pbr->RefractionIndex = (float) refractionIndex;
+}
diff --git a/cpp/hs_XCAFDoc_VisMaterialPBR.h b/cpp/hs_XCAFDoc_VisMaterialPBR.h
new file mode 100644
--- /dev/null
+++ b/cpp/hs_XCAFDoc_VisMaterialPBR.h
@@ -0,0 +1,28 @@
+#ifndef HS_XCAFDOC_VISMATERIALPBR_H
+#define HS_XCAFDOC_VISMATERIALPBR_H
+
+#include "hs_types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+XCAFDoc_VisMaterialPBR * hs_new_XCAFDoc_VisMaterialPBR();
+
+void hs_delete_XCAFDoc_VisMaterialPBR(XCAFDoc_VisMaterialPBR * pbr);
+
+void hs_XCAFDoc_VisMaterialPBR_setBaseColor(XCAFDoc_VisMaterialPBR * pbr, Quantity_ColorRGBA * color);
+
+void hs_XCAFDoc_VisMaterialPBR_setMetallic(XCAFDoc_VisMaterialPBR * pbr, double metallic);
+
+void hs_XCAFDoc_VisMaterialPBR_setRoughness(XCAFDoc_VisMaterialPBR * pbr, double roughness);
+
+void hs_XCAFDoc_VisMaterialPBR_setEmissiveFactor(XCAFDoc_VisMaterialPBR * pbr, VEC3(float) * factor);
+
+void hs_XCAFDoc_VisMaterialPBR_setRefractionIndex(XCAFDoc_VisMaterialPBR * pbr, double refractionIndex);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // HS_XCAFDOC_VISMATERIALPBR_H
diff --git a/cpp/hs_XCAFDoc_VisMaterialTool.cpp b/cpp/hs_XCAFDoc_VisMaterialTool.cpp
new file mode 100644
--- /dev/null
+++ b/cpp/hs_XCAFDoc_VisMaterialTool.cpp
@@ -0,0 +1,38 @@
+#include <XCAFDoc_VisMaterialTool.hxx>
+#include <XCAFDoc_VisMaterial.hxx>
+#include <TDF_Label.hxx>
+#include <TopoDS_Shape.hxx>
+#include <TCollection_AsciiString.hxx>
+#include "hs_Exception.h"
+#include "hs_XCAFDoc_VisMaterialTool.h"
+
+void hs_delete_XCAFDoc_VisMaterialTool(Handle(XCAFDoc_VisMaterialTool) * materialTool){
+    delete materialTool;
+}
+
+TDF_Label * hs_XCAFDoc_VisMaterialTool_addMaterial(
+        Handle(XCAFDoc_VisMaterialTool) * materialTool, Handle(XCAFDoc_VisMaterial) * material, char * name,
+        HSExceptionType* exType, void ** exPtr
+){
+    return hs_handleEx(exType, exPtr, [materialTool, material, name]{
+        return new TDF_Label((*materialTool)->AddMaterial(*material, TCollection_AsciiString(name)));
+    });
+}
+
+void hs_XCAFDoc_VisMaterialTool_setShapeMaterial(
+        Handle(XCAFDoc_VisMaterialTool) * materialTool, TDF_Label * shapeLabel, TDF_Label * materialLabel,
+        HSExceptionType* exType, void ** exPtr
+){
+    hs_handleExVoid(exType, exPtr, [materialTool, shapeLabel, materialLabel]{
+        (*materialTool)->SetShapeMaterial(*shapeLabel, *materialLabel);
+    });
+}
+
+bool hs_XCAFDoc_VisMaterialTool_setShapeMaterialFromShape(
+        Handle(XCAFDoc_VisMaterialTool) * materialTool, TopoDS_Shape * shape, TDF_Label * materialLabel,
+        HSExceptionType* exType, void ** exPtr
+){
+    return hs_handleExWithDefault(exType, exPtr, [materialTool, shape, materialLabel]{
+        return (*materialTool)->SetShapeMaterial(*shape, *materialLabel);
+    }, false);
+}
diff --git a/cpp/hs_XCAFDoc_VisMaterialTool.h b/cpp/hs_XCAFDoc_VisMaterialTool.h
new file mode 100644
--- /dev/null
+++ b/cpp/hs_XCAFDoc_VisMaterialTool.h
@@ -0,0 +1,31 @@
+#ifndef HS_XCAFDOC_VISMATERIALTOOL_H
+#define HS_XCAFDOC_VISMATERIALTOOL_H
+
+#include "hs_types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void hs_delete_XCAFDoc_VisMaterialTool(Handle(XCAFDoc_VisMaterialTool) * materialTool);
+
+TDF_Label * hs_XCAFDoc_VisMaterialTool_addMaterial(
+    Handle(XCAFDoc_VisMaterialTool) * materialTool, Handle(XCAFDoc_VisMaterial) * material, char * name,
+    HSExceptionType* exType, void ** exPtr
+);
+
+void hs_XCAFDoc_VisMaterialTool_setShapeMaterial(
+    Handle(XCAFDoc_VisMaterialTool) * materialTool, TDF_Label * shapeLabel, TDF_Label * materialLabel,
+    HSExceptionType* exType, void ** exPtr
+);
+
+bool hs_XCAFDoc_VisMaterialTool_setShapeMaterialFromShape(
+    Handle(XCAFDoc_VisMaterialTool) * materialTool, TopoDS_Shape * shape, TDF_Label * materialLabel,
+    HSExceptionType* exType, void ** exPtr
+);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // HS_XCAFDOC_VISMATERIALTOOL_H
diff --git a/cpp/hs_gp_Lin.cpp b/cpp/hs_gp_Lin.cpp
new file mode 100644
--- /dev/null
+++ b/cpp/hs_gp_Lin.cpp
@@ -0,0 +1,18 @@
+#include <gp_Lin.hxx>
+#include "hs_gp_Lin.h"
+
+gp_Lin * hs_new_gp_Lin(gp_Pnt * origin, gp_Dir * direction){
+    return new gp_Lin(*origin, *direction);
+}
+
+void hs_delete_gp_Lin(gp_Lin* lin){
+    delete lin;
+}
+
+gp_Pnt * hs_gp_Lin_Location(gp_Lin* lin){
+    return new gp_Pnt(lin->Location());
+}
+
+gp_Dir * hs_gp_Lin_Direction(gp_Lin* lin){
+    return new gp_Dir(lin->Direction());
+}
diff --git a/cpp/hs_gp_Lin.h b/cpp/hs_gp_Lin.h
new file mode 100644
--- /dev/null
+++ b/cpp/hs_gp_Lin.h
@@ -0,0 +1,22 @@
+#ifndef HS_GP_LIN_H
+#define HS_GP_LIN_H
+
+#include "hs_types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+gp_Lin * hs_new_gp_Lin(gp_Pnt * origin, gp_Dir * direction);
+
+void hs_delete_gp_Lin(gp_Lin* lin);
+
+gp_Pnt * hs_gp_Lin_Location(gp_Lin* lin);
+
+gp_Dir * hs_gp_Lin_Direction(gp_Lin* lin);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // HS_GP_LIN_H
diff --git a/cpp/hs_types.h b/cpp/hs_types.h
--- a/cpp/hs_types.h
+++ b/cpp/hs_types.h
@@ -28,10 +28,12 @@
 typedef void gp_Vec2d;
 typedef void gp_Trsf;
 typedef void gp_GTrsf;
+typedef void gp_Lin;
 typedef void gp_Trsf2d;
 typedef void gp_XYZ;
 typedef void BRep_Builder;
 typedef void BRepBuilderAPI_Transform;
+typedef void BRepBuilderAPI_GTransform;
 typedef void BRepBuilderAPI_MakeVertex;
 typedef void BRepBuilderAPI_MakeWire;
 typedef void BRepBuilderAPI_MakeFace;
@@ -48,7 +50,6 @@
 typedef void BRepPrimAPI_MakeCylinder;
 typedef void BRepPrimAPI_MakeRevol;
 typedef void BRepOffsetAPI_MakePipe;
-typedef void TopTools_ListOfShape;
 typedef void BRepTools_WireExplorer;
 typedef void BRepOffsetAPI_MakeThickSolid;
 typedef void Geom2d_Ellipse;
@@ -82,11 +83,22 @@
 typedef void RWObj_CafWriter;
 typedef void RWObj_CafReader;
 typedef void RWMesh_CafReader;
-typedef void TColStd_IndexedDataMapOfStringString;
 typedef void TDF_Label;
 typedef void TDocStd_Document;
 typedef void XCAFDoc_ShapeTool;
+typedef void XCAFDoc_ColorTool;
+typedef int XCAFDoc_ColorType;
+typedef void XCAFDoc_VisMaterialTool;
+typedef void XCAFDoc_VisMaterial;
+typedef void XCAFDoc_VisMaterialPBR;
+typedef int Graphic3d_AlphaMode;
+typedef int Graphic3d_TypeOfBackfacingModel;
+typedef void Quantity_Color;
+typedef void Quantity_ColorRGBA;
+typedef int Quantity_TypeOfColor;
+typedef void STEPCAFControl_Writer;
 typedef void ShapeFix_Solid;
+typedef void ShapeUpgrade_UnifySameDomain;
 typedef void ShapeExtend_WireData;
 typedef int ShapeExtend_Status;
 typedef void Poly_Triangulation;
@@ -102,11 +114,16 @@
 typedef void HLRBRep_Algo;
 typedef void HLRBRep_HLRToShape;
 typedef int HLRBRep_TypeOfResultingEdge;
+typedef void BRepAlgoAPI_Fuse;
+typedef void BRepAlgoAPI_Cut;
+typedef void BRepAlgoAPI_Common;
 typedef void BOPAlgo_Builder;
 typedef void BOPAlgo_BOP;
 typedef int BOPAlgo_Operation;
+typedef void IntCurvesFace_ShapeIntersector;
 typedef void GCPnts_AbscissaPoint;
 typedef void Standard_Failure;
+typedef void HS_STANDARD_FAILURE;
 typedef void STD_EXCEPTION;
 typedef void STD_RUNTIME_ERROR;
 
@@ -114,11 +131,22 @@
 
 #define Handle(X) void
 #define ARRAY_1(X) void
+#define LIST(X) void
+#define LIST_ITERATOR(X) void
+#define VEC3(X) void
+#define INDEXED_DATA_MAP(K, V, Hasher) void
 #else // __cplusplus
 #include <exception>
 #include <stdexcept>
 
 #define ARRAY_1(X) NCollection_Array1<X>
+#define LIST(X) NCollection_List<X>
+#define LIST_ITERATOR(X) NCollection_List<X>::Iterator
+#define VEC3(X) NCollection_Vec3<X>
+#define INDEXED_DATA_MAP(K, V, Hasher) NCollection_IndexedDataMap<K, V, Hasher>
+#define DEFAULT_HASHER(K) NCollection_DefaultHasher<K>
+struct HSStandardFailure;
+typedef HSStandardFailure HS_STANDARD_FAILURE;
 typedef std::exception STD_EXCEPTION;
 typedef std::runtime_error STD_RUNTIME_ERROR;
 #endif // __cplusplus
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.6.3.2
+version:        0.7.0.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
@@ -25,6 +25,7 @@
     cpp/hs_Bnd_OBB.h
     cpp/hs_BOPAlgo_BOP.h
     cpp/hs_BOPAlgo_Builder.h
+    cpp/hs_BOPAlgo_Tools.h
     cpp/hs_BRep_Tool.h
     cpp/hs_BRepAdaptor_Curve.h
     cpp/hs_BRepAlgoAPI_Common.h
@@ -79,6 +80,7 @@
     cpp/hs_gp_Dir.h
     cpp/hs_gp_Dir2d.h
     cpp/hs_gp_GTrsf.h
+    cpp/hs_gp_Lin.h
     cpp/hs_gp_Pnt.h
     cpp/hs_gp_Pnt2d.h
     cpp/hs_gp_Trsf.h
@@ -90,10 +92,16 @@
     cpp/hs_HLRAlgo_Projector.h
     cpp/hs_HLRBRep_Algo.h
     cpp/hs_HLRBRep_HLRToShape.h
+    cpp/hs_IntCurvesFace_ShapeIntersector.h
     cpp/hs_Message_ProgressRange.h
     cpp/hs_NCollection_Array1.h
+    cpp/hs_NCollection_IndexedDataMap.h
+    cpp/hs_NCollection_List.h
+    cpp/hs_NCollection_Vec3.h
     cpp/hs_Poly_Triangle.h
     cpp/hs_Poly_Triangulation.h
+    cpp/hs_Quantity_Color.h
+    cpp/hs_Quantity_ColorRGBA.h
     cpp/hs_RWGltf_CafReader.h
     cpp/hs_RWGltf_CafWriter.h
     cpp/hs_RWMesh_CafReader.h
@@ -102,14 +110,16 @@
     cpp/hs_ShapeConstruct_Curve.h
     cpp/hs_ShapeExtend_WireData.h
     cpp/hs_ShapeFix_Solid.h
+    cpp/hs_ShapeUpgrade_UnifySameDomain.h
     cpp/hs_Standard_Failure.h
+    cpp/hs_STEPCAFControl_Writer.h
     cpp/hs_STEPControl_Reader.h
     cpp/hs_STEPControl_Writer.h
     cpp/hs_StlAPI_Reader.h
     cpp/hs_StlAPI_Writer.h
-    cpp/hs_TColStd_IndexedDataMapOfStringString.h
     cpp/hs_TDF_Label.h
     cpp/hs_TDocStd_Document.h
+    cpp/hs_TopExp.h
     cpp/hs_TopExp_Explorer.h
     cpp/hs_TopLoc_Location.h
     cpp/hs_TopoDS_Builder.h
@@ -124,8 +134,12 @@
     cpp/hs_TopoDS_Wire.h
     cpp/hs_TopTools_ShapeMapHasher.h
     cpp/hs_types.h
+    cpp/hs_XCAFDoc_ColorTool.h
     cpp/hs_XCAFDoc_DocumentTool.h
     cpp/hs_XCAFDoc_ShapeTool.h
+    cpp/hs_XCAFDoc_VisMaterial.h
+    cpp/hs_XCAFDoc_VisMaterialPBR.h
+    cpp/hs_XCAFDoc_VisMaterialTool.h
     cpp/hs_XSControl_Reader.h
 
 source-repository head
@@ -142,15 +156,19 @@
       OpenCascade.BOPAlgo.Builder
       OpenCascade.BOPAlgo.Internal.Destructors
       OpenCascade.BOPAlgo.Operation
+      OpenCascade.BOPAlgo.Tools
       OpenCascade.BOPAlgo.Types
       OpenCascade.BRep.Tool
       OpenCascade.BRepAdaptor
       OpenCascade.BRepAdaptor.Curve
       OpenCascade.BRepAdaptor.Internal.Destructors
       OpenCascade.BRepAdaptor.Types
+      OpenCascade.BRepAlgoAPI
       OpenCascade.BRepAlgoAPI.Common
       OpenCascade.BRepAlgoAPI.Cut
       OpenCascade.BRepAlgoAPI.Fuse
+      OpenCascade.BRepAlgoAPI.Internal.Destructors
+      OpenCascade.BRepAlgoAPI.Types
       OpenCascade.BRepBndLib
       OpenCascade.BRepBuilderAPI
       OpenCascade.BRepBuilderAPI.Copy
@@ -237,6 +255,7 @@
       OpenCascade.GP.Dir2d
       OpenCascade.GP.GTrsf
       OpenCascade.GP.Internal.Destructors
+      OpenCascade.GP.Lin
       OpenCascade.GP.Pnt
       OpenCascade.GP.Pnt2d
       OpenCascade.GP.Trsf
@@ -248,9 +267,12 @@
       OpenCascade.GProp.GProps
       OpenCascade.GProp.Internal.Destructors
       OpenCascade.GProp.Types
+      OpenCascade.Graphic3D.AlphaMode
       OpenCascade.Graphic3D.HorizontalTextAlignment
+      OpenCascade.Graphic3D.TypeOfBackfacingModel
       OpenCascade.Graphic3D.VerticalTextAlignment
       OpenCascade.Handle
+      OpenCascade.HLRAlgo
       OpenCascade.HLRAlgo.Internal.Destructors
       OpenCascade.HLRAlgo.Projector
       OpenCascade.HLRAlgo.Types
@@ -261,6 +283,9 @@
       OpenCascade.HLRBRep.Types
       OpenCascade.IFSelect.ReturnStatus
       OpenCascade.Inheritance
+      OpenCascade.IntCurvesFace.Internal.Destructors
+      OpenCascade.IntCurvesFace.ShapeIntersector
+      OpenCascade.IntCurvesFace.Types
       OpenCascade.Internal.Bool
       OpenCascade.Internal.Exception
       OpenCascade.Message.Internal.Destructors
@@ -268,12 +293,22 @@
       OpenCascade.Message.Types
       OpenCascade.NCollection
       OpenCascade.NCollection.Array1
+      OpenCascade.NCollection.IndexedDataMap
       OpenCascade.NCollection.Internal.Destructors
+      OpenCascade.NCollection.List
+      OpenCascade.NCollection.List.Iterator
       OpenCascade.NCollection.Types
+      OpenCascade.NCollection.Vec3
       OpenCascade.Poly.Internal.Destructors
       OpenCascade.Poly.Triangle
       OpenCascade.Poly.Triangulation
       OpenCascade.Poly.Types
+      OpenCascade.Quantity
+      OpenCascade.Quantity.Color
+      OpenCascade.Quantity.ColorRGBA
+      OpenCascade.Quantity.Internal.Destructors
+      OpenCascade.Quantity.TypeOfColor
+      OpenCascade.Quantity.Types
       OpenCascade.RWGltf.CafReader
       OpenCascade.RWGltf.CafWriter
       OpenCascade.RWGltf.Internal.Destructors
@@ -294,6 +329,9 @@
       OpenCascade.ShapeFix.Internal.Destructors
       OpenCascade.ShapeFix.Solid
       OpenCascade.ShapeFix.Types
+      OpenCascade.ShapeUpgrade.Internal.Destructors
+      OpenCascade.ShapeUpgrade.Types
+      OpenCascade.ShapeUpgrade.UnifySameDomain
       OpenCascade.Standard.Failure
       OpenCascade.Standard.Internal.Destructors
       OpenCascade.Standard.Types
@@ -301,6 +339,9 @@
       OpenCascade.Std.Internal.Destructors
       OpenCascade.Std.RuntimeError
       OpenCascade.Std.Types
+      OpenCascade.STEPCAFControl.Internal.Destructors
+      OpenCascade.STEPCAFControl.Types
+      OpenCascade.STEPCAFControl.Writer
       OpenCascade.STEPControl
       OpenCascade.STEPControl.Internal.Destructors
       OpenCascade.STEPControl.Reader
@@ -312,10 +353,10 @@
       OpenCascade.StlAPI.Reader
       OpenCascade.StlAPI.Types
       OpenCascade.StlAPI.Writer
-      OpenCascade.TColStd.IndexedDataMapOfStringString
-      OpenCascade.TColStd.Internal.Destructors
-      OpenCascade.TColStd.Types
+      OpenCascade.TCollection
+      OpenCascade.TCollection.Types
       OpenCascade.TDF.Internal.Destructors
+      OpenCascade.TDF.Label
       OpenCascade.TDF.Types
       OpenCascade.TDocStd.Document
       OpenCascade.TDocStd.Internal.Destructors
@@ -344,13 +385,16 @@
       OpenCascade.TopoDS.Types
       OpenCascade.TopoDS.Vertex
       OpenCascade.TopoDS.Wire
-      OpenCascade.TopTools
       OpenCascade.TopTools.ShapeMapHasher
-      OpenCascade.TopTools.Types
+      OpenCascade.XCAFDoc.ColorTool
+      OpenCascade.XCAFDoc.ColorType
       OpenCascade.XCAFDoc.DocumentTool
       OpenCascade.XCAFDoc.Internal.Destructors
       OpenCascade.XCAFDoc.ShapeTool
       OpenCascade.XCAFDoc.Types
+      OpenCascade.XCAFDoc.VisMaterial
+      OpenCascade.XCAFDoc.VisMaterialPBR
+      OpenCascade.XCAFDoc.VisMaterialTool
       OpenCascade.XSControl.Reader
       OpenCascade.XSControl.Types
   other-modules:
@@ -381,6 +425,7 @@
         cpp/hs_Bnd_OBB.cpp
         cpp/hs_BOPAlgo_BOP.cpp
         cpp/hs_BOPAlgo_Builder.cpp
+        cpp/hs_BOPAlgo_Tools.cpp
         cpp/hs_BRep_Tool.cpp
         cpp/hs_BRepAdaptor_Curve.cpp
         cpp/hs_BRepAlgoAPI_Common.cpp
@@ -435,6 +480,7 @@
         cpp/hs_gp_Dir.cpp
         cpp/hs_gp_Dir2d.cpp
         cpp/hs_gp_GTrsf.cpp
+        cpp/hs_gp_Lin.cpp
         cpp/hs_gp_Pnt.cpp
         cpp/hs_gp_Pnt2d.cpp
         cpp/hs_gp_Trsf.cpp
@@ -446,10 +492,16 @@
         cpp/hs_HLRAlgo_Projector.cpp
         cpp/hs_HLRBRep_Algo.cpp
         cpp/hs_HLRBRep_HLRToShape.cpp
+        cpp/hs_IntCurvesFace_ShapeIntersector.cpp
         cpp/hs_Message_ProgressRange.cpp
         cpp/hs_NCollection_Array1.cpp
+        cpp/hs_NCollection_IndexedDataMap.cpp
+        cpp/hs_NCollection_List.cpp
+        cpp/hs_NCollection_Vec3.cpp
         cpp/hs_Poly_Triangle.cpp
         cpp/hs_Poly_Triangulation.cpp
+        cpp/hs_Quantity_Color.cpp
+        cpp/hs_Quantity_ColorRGBA.cpp
         cpp/hs_RWGltf_CafReader.cpp
         cpp/hs_RWGltf_CafWriter.cpp
         cpp/hs_RWMesh_CafReader.cpp
@@ -458,14 +510,16 @@
         cpp/hs_ShapeConstruct_Curve.cpp
         cpp/hs_ShapeExtend_WireData.cpp
         cpp/hs_ShapeFix_Solid.cpp
+        cpp/hs_ShapeUpgrade_UnifySameDomain.cpp
         cpp/hs_Standard_Failure.cpp
+        cpp/hs_STEPCAFControl_Writer.cpp
         cpp/hs_STEPControl_Reader.cpp
         cpp/hs_STEPControl_Writer.cpp
         cpp/hs_StlAPI_Reader.cpp
         cpp/hs_StlAPI_Writer.cpp
-        cpp/hs_TColStd_IndexedDataMapOfStringString.cpp
         cpp/hs_TDF_Label.cpp
         cpp/hs_TDocStd_Document.cpp
+        cpp/hs_TopExp.cpp
         cpp/hs_TopExp_Explorer.cpp
         cpp/hs_TopLoc_Location.cpp
         cpp/hs_TopoDS_Builder.cpp
@@ -479,8 +533,12 @@
         cpp/hs_TopoDS_Vertex.cpp
         cpp/hs_TopoDS_Wire.cpp
         cpp/hs_TopTools_ShapeMapHasher.cpp
+        cpp/hs_XCAFDoc_ColorTool.cpp
         cpp/hs_XCAFDoc_DocumentTool.cpp
         cpp/hs_XCAFDoc_ShapeTool.cpp
+        cpp/hs_XCAFDoc_VisMaterial.cpp
+        cpp/hs_XCAFDoc_VisMaterialPBR.cpp
+        cpp/hs_XCAFDoc_VisMaterialTool.cpp
         cpp/hs_XSControl_Reader.cpp
     extra-libraries:
         stdc++
diff --git a/src/OpenCascade/BOPAlgo/Builder.hs b/src/OpenCascade/BOPAlgo/Builder.hs
--- a/src/OpenCascade/BOPAlgo/Builder.hs
+++ b/src/OpenCascade/BOPAlgo/Builder.hs
@@ -4,8 +4,12 @@
 , new
 , addArgument
 , setRunParallel
+, setFuzzyValue
 , shape
 , perform
+, modified
+, generated
+, isDeleted
 ) where
 
 import OpenCascade.BOPAlgo.Types
@@ -13,10 +17,13 @@
 import qualified OpenCascade.TopoDS.Types as TopoDS
 import OpenCascade.TopoDS.Internal.Destructors (deleteShape)
 import OpenCascade.Internal.Exception (wrapException)
+import qualified OpenCascade.NCollection.Types as NCollection
+import OpenCascade.NCollection.Internal.Destructors (deleteListOfShape)
 import Foreign.Ptr (Ptr)
-import Foreign.C (CBool (..), CInt)
+import Foreign.C (CBool (..), CInt, CDouble (..))
+import Data.Coerce (coerce)
 import Data.Acquire (Acquire, mkAcquire)
-import OpenCascade.Internal.Bool (boolToCBool)
+import OpenCascade.Internal.Bool (boolToCBool, cBoolToBool)
 
 foreign import capi unsafe "hs_BOPAlgo_Builder.h hs_new_BOPAlgo_Builder" rawNew :: IO (Ptr Builder)
 
@@ -57,3 +64,38 @@
 perform :: Ptr Builder -> IO ()
 perform builder = wrapException $ rawPerform builder
 
+foreign import capi unsafe "hs_BOPAlgo_Builder.h hs_BOPAlgo_Builder_Modified" rawModified
+    :: Ptr Builder
+    -> Ptr TopoDS.Shape
+    -> Ptr CInt
+    -> Ptr (Ptr ())
+    -> IO (Ptr (NCollection.List TopoDS.Shape))
+
+modified :: Ptr Builder -> Ptr TopoDS.Shape -> Acquire (Ptr (NCollection.List TopoDS.Shape))
+modified builder shape' = mkAcquire (wrapException $ rawModified builder shape') deleteListOfShape
+
+foreign import capi unsafe "hs_BOPAlgo_Builder.h hs_BOPAlgo_Builder_Generated" rawGenerated
+    :: Ptr Builder
+    -> Ptr TopoDS.Shape
+    -> Ptr CInt
+    -> Ptr (Ptr ())
+    -> IO (Ptr (NCollection.List TopoDS.Shape))
+
+generated :: Ptr Builder -> Ptr TopoDS.Shape -> Acquire (Ptr (NCollection.List TopoDS.Shape))
+generated builder shape' = mkAcquire (wrapException $ rawGenerated builder shape') deleteListOfShape
+
+foreign import capi unsafe "hs_BOPAlgo_Builder.h hs_BOPAlgo_Builder_IsDeleted" rawIsDeleted
+    :: Ptr Builder
+    -> Ptr TopoDS.Shape
+    -> Ptr CInt
+    -> Ptr (Ptr ())
+    -> IO CBool
+
+isDeleted :: Ptr Builder -> Ptr TopoDS.Shape -> IO Bool
+isDeleted builder shape' = cBoolToBool <$> wrapException (rawIsDeleted builder shape')
+
+
+foreign import capi unsafe "hs_BOPAlgo_Builder.h hs_BOPAlgo_Builder_SetFuzzyValue" rawSetFuzzyValue :: Ptr Builder -> CDouble -> IO ()
+
+setFuzzyValue :: Ptr Builder -> Double -> IO ()
+setFuzzyValue builder = rawSetFuzzyValue builder . coerce
diff --git a/src/OpenCascade/BOPAlgo/Tools.hs b/src/OpenCascade/BOPAlgo/Tools.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/BOPAlgo/Tools.hs
@@ -0,0 +1,37 @@
+{-# LANGUAGE CApiFFI #-}
+module OpenCascade.BOPAlgo.Tools
+( edgesToWires
+, wiresToFaces
+) where
+
+import qualified OpenCascade.TopoDS.Types as TopoDS
+import OpenCascade.Internal.Exception (wrapException)
+import OpenCascade.Internal.Bool (boolToCBool, cBoolToBool)
+import Foreign.Ptr (Ptr)
+import Foreign.C (CInt (..), CBool (..), CDouble (..))
+import Data.Coerce (coerce)
+
+foreign import capi unsafe "hs_BOPAlgo_Tools.h hs_BOPAlgo_Tools_EdgesToWires" rawEdgesToWires
+    :: Ptr TopoDS.Shape
+    -> Ptr TopoDS.Shape
+    -> CBool
+    -> CDouble
+    -> Ptr CInt
+    -> Ptr (Ptr ())
+    -> IO CInt
+
+edgesToWires :: Ptr TopoDS.Shape -> Ptr TopoDS.Shape -> Bool -> Double -> IO Int
+edgesToWires edges wires shared angTol =
+    fmap fromIntegral . wrapException $ rawEdgesToWires edges wires (boolToCBool shared) (coerce angTol) 
+
+foreign import capi unsafe "hs_BOPAlgo_Tools.h hs_BOPAlgo_Tools_WiresToFaces" rawWiresToFaces
+    :: Ptr TopoDS.Shape
+    -> Ptr TopoDS.Shape
+    -> CDouble
+    -> Ptr CInt
+    -> Ptr (Ptr ())
+    -> IO CBool
+
+wiresToFaces :: Ptr TopoDS.Shape -> Ptr TopoDS.Shape -> Double -> IO Bool
+wiresToFaces wires faces angTol =
+    fmap cBoolToBool . wrapException $ rawWiresToFaces wires faces (coerce angTol)
diff --git a/src/OpenCascade/BRepAlgoAPI.hs b/src/OpenCascade/BRepAlgoAPI.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/BRepAlgoAPI.hs
@@ -0,0 +1,5 @@
+module OpenCascade.BRepAlgoAPI
+( module OpenCascade.BRepAlgoAPI.Types
+) where
+
+import OpenCascade.BRepAlgoAPI.Types
diff --git a/src/OpenCascade/BRepAlgoAPI/Common.hs b/src/OpenCascade/BRepAlgoAPI/Common.hs
--- a/src/OpenCascade/BRepAlgoAPI/Common.hs
+++ b/src/OpenCascade/BRepAlgoAPI/Common.hs
@@ -1,22 +1,23 @@
 {-# LANGUAGE CApiFFI #-}
 module OpenCascade.BRepAlgoAPI.Common
-( common
+( Common
+, fromShapes
 ) where
 
+import OpenCascade.BRepAlgoAPI.Types (Common)
+import OpenCascade.BRepAlgoAPI.Internal.Destructors (deleteCommon)
 import qualified OpenCascade.TopoDS as TopoDS
-import OpenCascade.TopoDS.Internal.Destructors (deleteShape)
 import OpenCascade.Internal.Exception (wrapException)
 import Foreign.C (CInt)
 import Foreign.Ptr
 import Data.Acquire
 
-
-foreign import capi unsafe "hs_BRepAlgoAPI_Common.h hs_BRepAlgoAPI_Common" rawCommon
+foreign import capi unsafe "hs_BRepAlgoAPI_Common.h hs_new_BRepAlgoAPI_Common_fromShapes" rawFromShapes
     :: Ptr TopoDS.Shape
     -> Ptr TopoDS.Shape
     -> Ptr CInt
     -> Ptr (Ptr ())
-    -> IO (Ptr TopoDS.Shape)
+    -> IO (Ptr Common)
 
-common :: Ptr TopoDS.Shape -> Ptr TopoDS.Shape -> Acquire (Ptr TopoDS.Shape)
-common a b = mkAcquire (wrapException $ rawCommon a b) deleteShape
+fromShapes :: Ptr TopoDS.Shape -> Ptr TopoDS.Shape -> Acquire (Ptr Common)
+fromShapes a b = mkAcquire (wrapException $ rawFromShapes a b) deleteCommon
diff --git a/src/OpenCascade/BRepAlgoAPI/Cut.hs b/src/OpenCascade/BRepAlgoAPI/Cut.hs
--- a/src/OpenCascade/BRepAlgoAPI/Cut.hs
+++ b/src/OpenCascade/BRepAlgoAPI/Cut.hs
@@ -1,22 +1,23 @@
 {-# LANGUAGE CApiFFI #-}
 module OpenCascade.BRepAlgoAPI.Cut
-( cut
+( Cut
+, fromShapes
 ) where
 
+import OpenCascade.BRepAlgoAPI.Types (Cut)
+import OpenCascade.BRepAlgoAPI.Internal.Destructors (deleteCut)
 import qualified OpenCascade.TopoDS as TopoDS
-import OpenCascade.TopoDS.Internal.Destructors (deleteShape)
 import OpenCascade.Internal.Exception (wrapException)
 import Foreign.C (CInt)
 import Foreign.Ptr
 import Data.Acquire
 
-
-foreign import capi unsafe "hs_BRepAlgoAPI_Cut.h hs_BRepAlgoAPI_Cut" rawCut
+foreign import capi unsafe "hs_BRepAlgoAPI_Cut.h hs_new_BRepAlgoAPI_Cut_fromShapes" rawFromShapes
     :: Ptr TopoDS.Shape
     -> Ptr TopoDS.Shape
     -> Ptr CInt
     -> Ptr (Ptr ())
-    -> IO (Ptr TopoDS.Shape)
+    -> IO (Ptr Cut)
 
-cut :: Ptr TopoDS.Shape -> Ptr TopoDS.Shape -> Acquire (Ptr TopoDS.Shape)
-cut a b = mkAcquire (wrapException $ rawCut a b) deleteShape
+fromShapes :: Ptr TopoDS.Shape -> Ptr TopoDS.Shape -> Acquire (Ptr Cut)
+fromShapes a b = mkAcquire (wrapException $ rawFromShapes a b) deleteCut
diff --git a/src/OpenCascade/BRepAlgoAPI/Fuse.hs b/src/OpenCascade/BRepAlgoAPI/Fuse.hs
--- a/src/OpenCascade/BRepAlgoAPI/Fuse.hs
+++ b/src/OpenCascade/BRepAlgoAPI/Fuse.hs
@@ -1,22 +1,23 @@
 {-# LANGUAGE CApiFFI #-}
 module OpenCascade.BRepAlgoAPI.Fuse
-( fuse
+( Fuse
+, fromShapes
 ) where
 
+import OpenCascade.BRepAlgoAPI.Types (Fuse)
+import OpenCascade.BRepAlgoAPI.Internal.Destructors (deleteFuse)
 import qualified OpenCascade.TopoDS as TopoDS
-import OpenCascade.TopoDS.Internal.Destructors (deleteShape)
 import OpenCascade.Internal.Exception (wrapException)
 import Foreign.C (CInt)
 import Foreign.Ptr
 import Data.Acquire
 
-
-foreign import capi unsafe "hs_BRepAlgoAPI_Fuse.h hs_BRepAlgoAPI_Fuse" rawFuse
+foreign import capi unsafe "hs_BRepAlgoAPI_Fuse.h hs_new_BRepAlgoAPI_Fuse_fromShapes" rawFromShapes
     :: Ptr TopoDS.Shape
     -> Ptr TopoDS.Shape
     -> Ptr CInt
     -> Ptr (Ptr ())
-    -> IO (Ptr TopoDS.Shape)
+    -> IO (Ptr Fuse)
 
-fuse :: Ptr TopoDS.Shape -> Ptr TopoDS.Shape -> Acquire (Ptr TopoDS.Shape)
-fuse a b = mkAcquire (wrapException $ rawFuse a b) deleteShape
+fromShapes :: Ptr TopoDS.Shape -> Ptr TopoDS.Shape -> Acquire (Ptr Fuse)
+fromShapes a b = mkAcquire (wrapException $ rawFromShapes a b) deleteFuse
diff --git a/src/OpenCascade/BRepAlgoAPI/Internal/Destructors.hs b/src/OpenCascade/BRepAlgoAPI/Internal/Destructors.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/BRepAlgoAPI/Internal/Destructors.hs
@@ -0,0 +1,13 @@
+{-# LANGUAGE CApiFFI #-}
+module OpenCascade.BRepAlgoAPI.Internal.Destructors
+( deleteFuse
+, deleteCut
+, deleteCommon
+) where
+
+import OpenCascade.BRepAlgoAPI.Types
+import Foreign.Ptr
+
+foreign import capi unsafe "hs_BRepAlgoAPI_Fuse.h hs_delete_BRepAlgoAPI_Fuse" deleteFuse :: Ptr Fuse -> IO ()
+foreign import capi unsafe "hs_BRepAlgoAPI_Cut.h hs_delete_BRepAlgoAPI_Cut" deleteCut :: Ptr Cut -> IO ()
+foreign import capi unsafe "hs_BRepAlgoAPI_Common.h hs_delete_BRepAlgoAPI_Common" deleteCommon :: Ptr Common -> IO ()
diff --git a/src/OpenCascade/BRepAlgoAPI/Types.hs b/src/OpenCascade/BRepAlgoAPI/Types.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/BRepAlgoAPI/Types.hs
@@ -0,0 +1,18 @@
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE EmptyDataDecls #-}
+module OpenCascade.BRepAlgoAPI.Types
+( Fuse
+, Cut
+, Common
+) where
+
+import qualified OpenCascade.Inheritance as Inheritance
+import OpenCascade.BRepBuilderAPI.Types (MakeShape)
+
+data Fuse
+data Cut
+data Common
+
+instance Inheritance.SubTypeOf MakeShape Fuse
+instance Inheritance.SubTypeOf MakeShape Cut
+instance Inheritance.SubTypeOf MakeShape Common
diff --git a/src/OpenCascade/BRepBuilderAPI/GTransform.hs b/src/OpenCascade/BRepBuilderAPI/GTransform.hs
--- a/src/OpenCascade/BRepBuilderAPI/GTransform.hs
+++ b/src/OpenCascade/BRepBuilderAPI/GTransform.hs
@@ -1,24 +1,26 @@
 {-# LANGUAGE CApiFFI #-}
 module OpenCascade.BRepBuilderAPI.GTransform 
-( gtransform
+( GTransform
+, fromShapeGTrsfAndCopy
 ) where
 
+import OpenCascade.BRepBuilderAPI.Types (GTransform)
+import OpenCascade.BRepBuilderAPI.Internal.Destructors (deleteGTransform)
 import qualified OpenCascade.GP as GP
 import qualified OpenCascade.TopoDS as TopoDS
 import OpenCascade.Internal.Bool
-import qualified OpenCascade.TopoDS.Internal.Destructors as TopoDS.Destructors
 import OpenCascade.Internal.Exception (wrapException)
 import Foreign.C
 import Foreign.Ptr
 import Data.Acquire
 
-foreign import capi unsafe "hs_BRepBuilderAPI_GTransform.h hs_BRepBuilderAPI_GTransform_gtransform" rawGTransform
+foreign import capi unsafe "hs_BRepBuilderAPI_GTransform.h hs_new_BRepBuilderAPI_GTransform_fromShapeGTrsfAndCopy" rawFromShapeGTrsfAndCopy
     :: Ptr TopoDS.Shape
     -> Ptr GP.GTrsf
     -> CBool
     -> Ptr CInt
     -> Ptr (Ptr ())
-    -> IO (Ptr TopoDS.Shape)
+    -> IO (Ptr GTransform)
 
-gtransform :: Ptr TopoDS.Shape -> Ptr GP.GTrsf -> Bool -> Acquire (Ptr TopoDS.Shape)
-gtransform shape trsf copy = mkAcquire (wrapException $ rawGTransform shape trsf (boolToCBool copy)) TopoDS.Destructors.deleteShape
+fromShapeGTrsfAndCopy :: Ptr TopoDS.Shape -> Ptr GP.GTrsf -> Bool -> Acquire (Ptr GTransform)
+fromShapeGTrsfAndCopy shape trsf copy = mkAcquire (wrapException $ rawFromShapeGTrsfAndCopy shape trsf (boolToCBool copy)) deleteGTransform
diff --git a/src/OpenCascade/BRepBuilderAPI/Internal/Destructors.hs b/src/OpenCascade/BRepBuilderAPI/Internal/Destructors.hs
--- a/src/OpenCascade/BRepBuilderAPI/Internal/Destructors.hs
+++ b/src/OpenCascade/BRepBuilderAPI/Internal/Destructors.hs
@@ -5,6 +5,8 @@
 , deleteMakeFace
 , deleteMakeSolid
 , deleteSewing
+, deleteTransform
+, deleteGTransform
 ) where
 
 import OpenCascade.BRepBuilderAPI.Types
@@ -16,5 +18,5 @@
 foreign import capi unsafe "hs_BRepBuilderAPI_MakeFace.h hs_delete_BRepBuilderAPI_MakeFace" deleteMakeFace :: Ptr MakeFace -> IO ()
 foreign import capi unsafe "hs_BRepBuilderAPI_MakeSolid.h hs_delete_BRepBuilderAPI_MakeSolid" deleteMakeSolid :: Ptr MakeSolid -> IO ()
 foreign import capi unsafe "hs_BRepBuilderAPI_Sewing.h hs_delete_BRepBuilderAPI_Sewing" deleteSewing :: Ptr Sewing -> IO ()
-
-
+foreign import capi unsafe "hs_BRepBuilderAPI_Transform.h hs_delete_BRepBuilderAPI_Transform" deleteTransform :: Ptr Transform -> IO ()
+foreign import capi unsafe "hs_BRepBuilderAPI_GTransform.h hs_delete_BRepBuilderAPI_GTransform" deleteGTransform :: Ptr GTransform -> IO ()
diff --git a/src/OpenCascade/BRepBuilderAPI/MakeShape.hs b/src/OpenCascade/BRepBuilderAPI/MakeShape.hs
--- a/src/OpenCascade/BRepBuilderAPI/MakeShape.hs
+++ b/src/OpenCascade/BRepBuilderAPI/MakeShape.hs
@@ -3,14 +3,20 @@
 ( MakeShape
 , shape
 , build
+, modified
+, generated
+, isDeleted
 ) where
 import OpenCascade.BRepBuilderAPI.Types
 import qualified OpenCascade.TopoDS as TopoDS
 import OpenCascade.TopoDS.Internal.Destructors (deleteShape)
+import OpenCascade.Internal.Bool (cBoolToBool)
 import OpenCascade.Internal.Exception (wrapException)
 import Foreign.Ptr
-import Data.Acquire 
-import Foreign.C (CInt)
+import Data.Acquire
+import Foreign.C (CBool (..), CInt)
+import qualified OpenCascade.NCollection.Types as NCollection
+import OpenCascade.NCollection.Internal.Destructors (deleteListOfShape)
 
 foreign import capi unsafe "hs_BRepBuilderAPI_MakeShape.h hs_BRepBuilderAPI_MakeShape_shape" rawShape
     :: Ptr MakeShape 
@@ -29,3 +35,33 @@
 
 build :: Ptr MakeShape -> IO ()
 build builder = wrapException $ rawBuild builder
+
+foreign import capi unsafe "hs_BRepBuilderAPI_MakeShape.h hs_BRepBuilderAPI_MakeShape_modified" rawModified
+    :: Ptr MakeShape
+    -> Ptr TopoDS.Shape
+    -> Ptr CInt
+    -> Ptr (Ptr ())
+    -> IO (Ptr (NCollection.List TopoDS.Shape))
+
+modified :: Ptr MakeShape -> Ptr TopoDS.Shape -> Acquire (Ptr (NCollection.List TopoDS.Shape))
+modified builder s = mkAcquire (wrapException $ rawModified builder s) deleteListOfShape
+
+foreign import capi unsafe "hs_BRepBuilderAPI_MakeShape.h hs_BRepBuilderAPI_MakeShape_generated" rawGenerated
+    :: Ptr MakeShape
+    -> Ptr TopoDS.Shape
+    -> Ptr CInt
+    -> Ptr (Ptr ())
+    -> IO (Ptr (NCollection.List TopoDS.Shape))
+
+generated :: Ptr MakeShape -> Ptr TopoDS.Shape -> Acquire (Ptr (NCollection.List TopoDS.Shape))
+generated builder s = mkAcquire (wrapException $ rawGenerated builder s) deleteListOfShape
+
+foreign import capi unsafe "hs_BRepBuilderAPI_MakeShape.h hs_BRepBuilderAPI_MakeShape_isDeleted" rawIsDeleted
+    :: Ptr MakeShape
+    -> Ptr TopoDS.Shape
+    -> Ptr CInt
+    -> Ptr (Ptr ())
+    -> IO CBool
+
+isDeleted :: Ptr MakeShape -> Ptr TopoDS.Shape -> IO Bool
+isDeleted builder s = cBoolToBool <$> wrapException (rawIsDeleted builder s)
diff --git a/src/OpenCascade/BRepBuilderAPI/MakeWire.hs b/src/OpenCascade/BRepBuilderAPI/MakeWire.hs
--- a/src/OpenCascade/BRepBuilderAPI/MakeWire.hs
+++ b/src/OpenCascade/BRepBuilderAPI/MakeWire.hs
@@ -18,7 +18,7 @@
 import OpenCascade.Internal.Bool
 import qualified OpenCascade.TopoDS as TopoDS
 import qualified OpenCascade.TopoDS.Internal.Destructors as TopoDS.Destructors
-import qualified OpenCascade.TopTools as TopTools
+import qualified OpenCascade.NCollection.Types as NCollection
 import OpenCascade.BRepBuilderAPI.WireError (WireError)
 import OpenCascade.Internal.Exception (wrapException)
 import Foreign.C
@@ -62,12 +62,12 @@
 
 foreign import capi unsafe "hs_BRepBuilderAPI_MakeWire.h hs_BRepBuilderAPI_MakeWire_AddListOfShape" rawAddListOfShape
     :: Ptr MakeWire
-    -> Ptr TopTools.ListOfShape
+    -> Ptr (NCollection.List TopoDS.Shape)
     -> Ptr CInt
     -> Ptr (Ptr ())
     -> IO ()
 
-addListOfShape :: Ptr MakeWire -> Ptr TopTools.ListOfShape -> IO ()
+addListOfShape :: Ptr MakeWire -> Ptr (NCollection.List TopoDS.Shape) -> IO ()
 addListOfShape builder list = wrapException $ rawAddListOfShape builder list
 
 -- wire
diff --git a/src/OpenCascade/BRepBuilderAPI/Transform.hs b/src/OpenCascade/BRepBuilderAPI/Transform.hs
--- a/src/OpenCascade/BRepBuilderAPI/Transform.hs
+++ b/src/OpenCascade/BRepBuilderAPI/Transform.hs
@@ -1,24 +1,26 @@
 {-# LANGUAGE CApiFFI #-}
 module OpenCascade.BRepBuilderAPI.Transform 
-( transform
+( Transform
+, fromShapeTrsfAndCopy
 ) where
 
+import OpenCascade.BRepBuilderAPI.Types (Transform)
+import OpenCascade.BRepBuilderAPI.Internal.Destructors (deleteTransform)
 import qualified OpenCascade.GP as GP
 import qualified OpenCascade.TopoDS as TopoDS
 import OpenCascade.Internal.Bool
-import qualified OpenCascade.TopoDS.Internal.Destructors as TopoDS.Destructors
 import OpenCascade.Internal.Exception (wrapException)
 import Foreign.C
 import Foreign.Ptr
 import Data.Acquire
 
-foreign import capi unsafe "hs_BRepBuilderAPI_Transform.h hs_BRepBuilderAPI_Transform_transform" rawTransform
+foreign import capi unsafe "hs_BRepBuilderAPI_Transform.h hs_new_BRepBuilderAPI_Transform_fromShapeTrsfAndCopy" rawFromShapeTrsfAndCopy
     :: Ptr TopoDS.Shape
     -> Ptr GP.Trsf
     -> CBool
     -> Ptr CInt
     -> Ptr (Ptr ())
-    -> IO (Ptr TopoDS.Shape)
+    -> IO (Ptr Transform)
 
-transform :: Ptr TopoDS.Shape -> Ptr GP.Trsf -> Bool -> Acquire (Ptr TopoDS.Shape)
-transform shape trsf copy = mkAcquire (wrapException $ rawTransform shape trsf (boolToCBool copy)) TopoDS.Destructors.deleteShape
+fromShapeTrsfAndCopy :: Ptr TopoDS.Shape -> Ptr GP.Trsf -> Bool -> Acquire (Ptr Transform)
+fromShapeTrsfAndCopy shape trsf copy = mkAcquire (wrapException $ rawFromShapeTrsfAndCopy shape trsf (boolToCBool copy)) deleteTransform
diff --git a/src/OpenCascade/BRepBuilderAPI/Types.hs b/src/OpenCascade/BRepBuilderAPI/Types.hs
--- a/src/OpenCascade/BRepBuilderAPI/Types.hs
+++ b/src/OpenCascade/BRepBuilderAPI/Types.hs
@@ -7,6 +7,8 @@
 , MakeSolid
 , MakeShape
 , Sewing
+, Transform
+, GTransform
 ) where
 
 import qualified OpenCascade.Inheritance as Inheritance
@@ -20,8 +22,12 @@
 
 data Sewing
 
+data Transform
+data GTransform
+
 instance Inheritance.SubTypeOf MakeShape MakeVertex
 instance Inheritance.SubTypeOf MakeShape MakeWire
 instance Inheritance.SubTypeOf MakeShape MakeSolid
 instance Inheritance.SubTypeOf MakeShape MakeFace
-
+instance Inheritance.SubTypeOf MakeShape Transform
+instance Inheritance.SubTypeOf MakeShape GTransform
diff --git a/src/OpenCascade/GP/Internal/Destructors.hs b/src/OpenCascade/GP/Internal/Destructors.hs
--- a/src/OpenCascade/GP/Internal/Destructors.hs
+++ b/src/OpenCascade/GP/Internal/Destructors.hs
@@ -13,6 +13,7 @@
 , deleteTrsf
 , deleteTrsf2d
 , deleteGTrsf
+, deleteLin
 , deleteXYZ
 ) where
 
@@ -35,3 +36,4 @@
 foreign import capi unsafe "hs_gp_Trsf2d.h hs_delete_gp_Trsf2d" deleteTrsf2d :: Ptr Trsf2d -> IO ()
 foreign import capi unsafe "hs_gp_XYZ.h hs_delete_gp_XYZ" deleteXYZ :: Ptr XYZ -> IO ()
 
+foreign import capi unsafe "hs_gp_Lin.h hs_delete_gp_Lin" deleteLin :: Ptr Lin -> IO ()
diff --git a/src/OpenCascade/GP/Lin.hs b/src/OpenCascade/GP/Lin.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/GP/Lin.hs
@@ -0,0 +1,27 @@
+{-# LANGUAGE CApiFFI #-}
+module OpenCascade.GP.Lin
+( Lin
+, new
+, location
+, direction
+) where
+
+import OpenCascade.GP.Types
+import OpenCascade.GP.Internal.Destructors
+import Foreign.Ptr
+import Data.Acquire
+
+foreign import capi unsafe "hs_gp_Lin.h hs_new_gp_Lin" rawNew :: Ptr Pnt -> Ptr Dir -> IO (Ptr Lin)
+
+new :: Ptr Pnt -> Ptr Dir -> Acquire (Ptr Lin)
+new origin dir = mkAcquire (rawNew origin dir) deleteLin
+
+foreign import capi unsafe "hs_gp_Lin.h hs_gp_Lin_Location" rawLocation :: Ptr Lin -> IO (Ptr Pnt)
+
+location :: Ptr Lin -> Acquire (Ptr Pnt)
+location lin = mkAcquire (rawLocation lin) deletePnt
+
+foreign import capi unsafe "hs_gp_Lin.h hs_gp_Lin_Direction" rawDirection :: Ptr Lin -> IO (Ptr Dir)
+
+direction :: Ptr Lin -> Acquire (Ptr Dir)
+direction lin = mkAcquire (rawDirection lin) deleteDir
diff --git a/src/OpenCascade/GP/Types.hs b/src/OpenCascade/GP/Types.hs
--- a/src/OpenCascade/GP/Types.hs
+++ b/src/OpenCascade/GP/Types.hs
@@ -13,6 +13,7 @@
 , Trsf
 , Trsf2d
 , GTrsf
+, Lin
 , XYZ
 ) where
 
@@ -29,4 +30,5 @@
 data Trsf
 data Trsf2d
 data GTrsf
+data Lin
 data XYZ
diff --git a/src/OpenCascade/Graphic3D/AlphaMode.hs b/src/OpenCascade/Graphic3D/AlphaMode.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/Graphic3D/AlphaMode.hs
@@ -0,0 +1,20 @@
+module OpenCascade.Graphic3D.AlphaMode
+( AlphaMode (..)
+) where
+
+-- Should match the values in Graphic3D_AlphaMode.hxx
+data AlphaMode = BlendAuto | Opaque | Mask | Blend | MaskBlend deriving (Show, Eq)
+
+-- this can't derive Enum, because Graphic3d_AlphaMode_BlendAuto is defined as -1
+instance Enum AlphaMode where
+    fromEnum BlendAuto = -1
+    fromEnum Opaque = 0
+    fromEnum Mask = 1
+    fromEnum Blend = 2
+    fromEnum MaskBlend = 3
+    toEnum (-1) = BlendAuto
+    toEnum 0 = Opaque
+    toEnum 1 = Mask
+    toEnum 2 = Blend
+    toEnum 3 = MaskBlend
+    toEnum _ = error "toEnum: out of range for Graphic3D.AlphaMode"
diff --git a/src/OpenCascade/Graphic3D/TypeOfBackfacingModel.hs b/src/OpenCascade/Graphic3D/TypeOfBackfacingModel.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/Graphic3D/TypeOfBackfacingModel.hs
@@ -0,0 +1,6 @@
+module OpenCascade.Graphic3D.TypeOfBackfacingModel
+( TypeOfBackfacingModel (..)
+) where
+
+-- Should match the values in Graphic3d_TypeOfBackfacingModel.hxx
+data TypeOfBackfacingModel = Auto | DoubleSided | BackCulled | FrontCulled deriving (Show, Eq, Enum)
diff --git a/src/OpenCascade/HLRAlgo.hs b/src/OpenCascade/HLRAlgo.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/HLRAlgo.hs
@@ -0,0 +1,5 @@
+module OpenCascade.HLRAlgo
+( module OpenCascade.HLRAlgo.Types
+) where
+
+import OpenCascade.HLRAlgo.Types
diff --git a/src/OpenCascade/HLRAlgo/Projector.hs b/src/OpenCascade/HLRAlgo/Projector.hs
--- a/src/OpenCascade/HLRAlgo/Projector.hs
+++ b/src/OpenCascade/HLRAlgo/Projector.hs
@@ -2,8 +2,11 @@
 module OpenCascade.HLRAlgo.Projector
 ( Projector
 , fromAx2
+, transformation
+, invertedTransformation
 ) where
 import qualified OpenCascade.GP.Types as GP
+import OpenCascade.GP.Internal.Destructors (deleteTrsf)
 import OpenCascade.HLRAlgo.Types (Projector)
 import OpenCascade.HLRAlgo.Internal.Destructors (deleteProjector)
 import Foreign.Ptr 
@@ -14,3 +17,12 @@
 fromAx2 :: Ptr GP.Ax2 -> Acquire (Ptr Projector)
 fromAx2 ax2 = mkAcquire (rawFromAx2 ax2) deleteProjector
 
+foreign import capi unsafe "hs_HLRAlgo_Projector.h hs_HLRAlgo_Projector_Transformation" rawTransformation :: Ptr Projector -> IO (Ptr GP.Trsf)
+
+transformation :: Ptr Projector -> Acquire (Ptr GP.Trsf)
+transformation projector = mkAcquire (rawTransformation projector) deleteTrsf
+
+foreign import capi unsafe "hs_HLRAlgo_Projector.h hs_HLRAlgo_Projector_InvertedTransformation" rawInvertedTransformation :: Ptr Projector -> IO (Ptr GP.Trsf)
+
+invertedTransformation :: Ptr Projector -> Acquire (Ptr GP.Trsf)
+invertedTransformation projector = mkAcquire (rawInvertedTransformation projector) deleteTrsf
diff --git a/src/OpenCascade/IntCurvesFace/Internal/Destructors.hs b/src/OpenCascade/IntCurvesFace/Internal/Destructors.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/IntCurvesFace/Internal/Destructors.hs
@@ -0,0 +1,9 @@
+{-# LANGUAGE CApiFFI #-}
+module OpenCascade.IntCurvesFace.Internal.Destructors
+( deleteShapeIntersector
+) where
+
+import OpenCascade.IntCurvesFace.Types
+import Foreign.Ptr
+
+foreign import capi unsafe "hs_IntCurvesFace_ShapeIntersector.h hs_delete_IntCurvesFace_ShapeIntersector" deleteShapeIntersector :: Ptr ShapeIntersector -> IO ()
diff --git a/src/OpenCascade/IntCurvesFace/ShapeIntersector.hs b/src/OpenCascade/IntCurvesFace/ShapeIntersector.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/IntCurvesFace/ShapeIntersector.hs
@@ -0,0 +1,84 @@
+{-# LANGUAGE CApiFFI #-}
+module OpenCascade.IntCurvesFace.ShapeIntersector
+( ShapeIntersector
+, new
+, load
+, perform
+, performNearest
+, isDone
+, nbPnt
+, uParameter
+, vParameter
+, wParameter
+, pnt
+, face
+) where
+
+import OpenCascade.IntCurvesFace.Types (ShapeIntersector)
+import OpenCascade.IntCurvesFace.Internal.Destructors (deleteShapeIntersector)
+import qualified OpenCascade.TopoDS.Types as TopoDS
+import OpenCascade.TopoDS.Internal.Destructors (deleteShape)
+import qualified OpenCascade.GP.Types as GP
+import OpenCascade.GP.Internal.Destructors (deletePnt)
+import OpenCascade.Inheritance (upcast)
+import OpenCascade.Internal.Exception (wrapException)
+import OpenCascade.Internal.Bool (cBoolToBool)
+import Foreign.Ptr (Ptr)
+import Foreign.C (CInt (..), CBool (..), CDouble (..))
+import Data.Acquire (Acquire, mkAcquire)
+import Data.Coerce (coerce)
+
+foreign import capi unsafe "hs_IntCurvesFace_ShapeIntersector.h hs_new_IntCurvesFace_ShapeIntersector" rawNew :: IO (Ptr ShapeIntersector)
+
+new :: Acquire (Ptr ShapeIntersector)
+new = mkAcquire rawNew deleteShapeIntersector
+
+foreign import capi unsafe "hs_IntCurvesFace_ShapeIntersector.h hs_IntCurvesFace_ShapeIntersector_Load" rawLoad :: Ptr ShapeIntersector -> Ptr TopoDS.Shape -> CDouble -> Ptr CInt -> Ptr (Ptr ()) -> IO ()
+
+load :: Ptr ShapeIntersector -> Ptr TopoDS.Shape -> Double -> IO ()
+load intersector shape tol = wrapException $ rawLoad intersector shape (coerce tol)
+
+foreign import capi unsafe "hs_IntCurvesFace_ShapeIntersector.h hs_IntCurvesFace_ShapeIntersector_Perform" rawPerform :: Ptr ShapeIntersector -> Ptr GP.Lin -> CDouble -> CDouble -> Ptr CInt -> Ptr (Ptr ()) -> IO ()
+
+perform :: Ptr ShapeIntersector -> Ptr GP.Lin -> Double -> Double -> IO ()
+perform intersector line pInf pSup = wrapException $ rawPerform intersector line (coerce pInf) (coerce pSup)
+
+foreign import capi unsafe "hs_IntCurvesFace_ShapeIntersector.h hs_IntCurvesFace_ShapeIntersector_PerformNearest" rawPerformNearest :: Ptr ShapeIntersector -> Ptr GP.Lin -> CDouble -> CDouble -> Ptr CInt -> Ptr (Ptr ()) -> IO ()
+
+performNearest :: Ptr ShapeIntersector -> Ptr GP.Lin -> Double -> Double -> IO ()
+performNearest intersector line pInf pSup = wrapException $ rawPerformNearest intersector line (coerce pInf) (coerce pSup)
+
+foreign import capi unsafe "hs_IntCurvesFace_ShapeIntersector.h hs_IntCurvesFace_ShapeIntersector_IsDone" rawIsDone :: Ptr ShapeIntersector -> IO CBool
+
+isDone :: Ptr ShapeIntersector -> IO Bool
+isDone intersector = cBoolToBool <$> rawIsDone intersector
+
+foreign import capi unsafe "hs_IntCurvesFace_ShapeIntersector.h hs_IntCurvesFace_ShapeIntersector_NbPnt" rawNbPnt :: Ptr ShapeIntersector -> IO CInt
+
+nbPnt :: Ptr ShapeIntersector -> IO Int
+nbPnt intersector = fromIntegral <$> rawNbPnt intersector
+
+foreign import capi unsafe "hs_IntCurvesFace_ShapeIntersector.h hs_IntCurvesFace_ShapeIntersector_UParameter" rawUParameter :: Ptr ShapeIntersector -> CInt -> Ptr CInt -> Ptr (Ptr ()) -> IO CDouble
+
+uParameter :: Ptr ShapeIntersector -> Int -> IO Double
+uParameter intersector index = coerce <$> wrapException (rawUParameter intersector (fromIntegral index))
+
+foreign import capi unsafe "hs_IntCurvesFace_ShapeIntersector.h hs_IntCurvesFace_ShapeIntersector_VParameter" rawVParameter :: Ptr ShapeIntersector -> CInt -> Ptr CInt -> Ptr (Ptr ()) -> IO CDouble
+
+vParameter :: Ptr ShapeIntersector -> Int -> IO Double
+vParameter intersector index = coerce <$> wrapException (rawVParameter intersector (fromIntegral index))
+
+foreign import capi unsafe "hs_IntCurvesFace_ShapeIntersector.h hs_IntCurvesFace_ShapeIntersector_WParameter" rawWParameter :: Ptr ShapeIntersector -> CInt -> Ptr CInt -> Ptr (Ptr ()) -> IO CDouble
+
+wParameter :: Ptr ShapeIntersector -> Int -> IO Double
+wParameter intersector index = coerce <$> wrapException (rawWParameter intersector (fromIntegral index))
+
+foreign import capi unsafe "hs_IntCurvesFace_ShapeIntersector.h hs_IntCurvesFace_ShapeIntersector_Pnt" rawPnt :: Ptr ShapeIntersector -> CInt -> Ptr CInt -> Ptr (Ptr ()) -> IO (Ptr GP.Pnt)
+
+pnt :: Ptr ShapeIntersector -> Int -> Acquire (Ptr GP.Pnt)
+pnt intersector index = mkAcquire (wrapException $ rawPnt intersector (fromIntegral index)) deletePnt
+
+foreign import capi unsafe "hs_IntCurvesFace_ShapeIntersector.h hs_IntCurvesFace_ShapeIntersector_Face" rawFace :: Ptr ShapeIntersector -> CInt -> Ptr CInt -> Ptr (Ptr ()) -> IO (Ptr TopoDS.Face)
+
+face :: Ptr ShapeIntersector -> Int -> Acquire (Ptr TopoDS.Face)
+face intersector index = mkAcquire (wrapException $ rawFace intersector (fromIntegral index)) (deleteShape . upcast)
diff --git a/src/OpenCascade/IntCurvesFace/Types.hs b/src/OpenCascade/IntCurvesFace/Types.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/IntCurvesFace/Types.hs
@@ -0,0 +1,6 @@
+{-# LANGUAGE EmptyDataDecls #-}
+module OpenCascade.IntCurvesFace.Types
+( ShapeIntersector
+) where
+
+data ShapeIntersector
diff --git a/src/OpenCascade/Internal/Exception.hs b/src/OpenCascade/Internal/Exception.hs
--- a/src/OpenCascade/Internal/Exception.hs
+++ b/src/OpenCascade/Internal/Exception.hs
@@ -22,7 +22,7 @@
     deriving (Show, Eq, Ord, Enum, Bounded)
 
 data OpenCascadeException 
-    = OpenCascadeStandardFailure String String
+    = OpenCascadeStandardFailure String String String
     | OpenCascadeStdException String
     | OpenCascadeOtherException
     deriving (Eq, Ord, Typeable, Show)
@@ -42,10 +42,11 @@
         NoException -> pure ()
         StandardFailureException -> do
             stdFailure <- castPtr <$> peek exPtr
+            typeString <- safePeekCString =<< Standard.Failure.getTypeName stdFailure
             msgString <- safePeekCString =<< Standard.Failure.getMessageString stdFailure
             stackString <- safePeekCString =<< Standard.Failure.getStackString stdFailure
             deleteFailure stdFailure
-            throw (OpenCascadeStandardFailure msgString stackString)
+            throw (OpenCascadeStandardFailure typeString msgString stackString)
         StdException -> do
             stdException <- castPtr <$> peek exPtr
             msgString <- safePeekCString =<< Std.Exception.what stdException
diff --git a/src/OpenCascade/NCollection/IndexedDataMap.hs b/src/OpenCascade/NCollection/IndexedDataMap.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/NCollection/IndexedDataMap.hs
@@ -0,0 +1,78 @@
+{-# LANGUAGE CApiFFI #-}
+module OpenCascade.NCollection.IndexedDataMap
+( IndexedDataMap
+, newAsciiStringMap
+, newShapeListOfShapeMap
+, extentShapeListOfShapeMap
+, containsShapeListOfShapeMap
+, findFromKeyShapeListOfShapeMap
+, findKeyShapeListOfShapeMap
+, findFromIndexShapeListOfShapeMap
+) where
+
+import OpenCascade.NCollection.Types (IndexedDataMap, List)
+import OpenCascade.NCollection.Internal.Destructors (deleteAsciiStringMap, deleteIndexedDataMapOfShapeListOfShape, deleteListOfShape)
+import qualified OpenCascade.TCollection.Types as TCollection
+import qualified OpenCascade.TopoDS.Types as TopoDS
+import OpenCascade.TopoDS.Internal.Destructors (deleteShape)
+import OpenCascade.Internal.Bool (cBoolToBool)
+import OpenCascade.Internal.Exception (wrapException)
+import Foreign.Ptr (Ptr)
+import Foreign.C (CBool (..), CInt (..))
+import Data.Acquire (Acquire, mkAcquire)
+
+foreign import capi unsafe "hs_NCollection_IndexedDataMap.h hs_new_NCollection_IndexedDataMap_TCollection_AsciiString_TCollection_AsciiString" rawNewAsciiStringMap
+    :: IO (Ptr (IndexedDataMap TCollection.AsciiString TCollection.AsciiString))
+
+newAsciiStringMap :: Acquire (Ptr (IndexedDataMap TCollection.AsciiString TCollection.AsciiString))
+newAsciiStringMap = mkAcquire rawNewAsciiStringMap deleteAsciiStringMap
+
+foreign import capi unsafe "hs_NCollection_IndexedDataMap.h hs_new_NCollection_IndexedDataMap_TopoDS_Shape_NCollection_List_TopoDS_Shape" rawNewShapeListOfShapeMap
+    :: IO (Ptr (IndexedDataMap TopoDS.Shape (List TopoDS.Shape)))
+
+newShapeListOfShapeMap :: Acquire (Ptr (IndexedDataMap TopoDS.Shape (List TopoDS.Shape)))
+newShapeListOfShapeMap = mkAcquire rawNewShapeListOfShapeMap deleteIndexedDataMapOfShapeListOfShape
+
+foreign import capi unsafe "hs_NCollection_IndexedDataMap.h hs_NCollection_IndexedDataMap_TopoDS_Shape_NCollection_List_TopoDS_Shape_extent" rawExtentShapeListOfShapeMap
+    :: Ptr (IndexedDataMap TopoDS.Shape (List TopoDS.Shape)) -> IO CInt
+
+extentShapeListOfShapeMap :: Ptr (IndexedDataMap TopoDS.Shape (List TopoDS.Shape)) -> IO Int
+extentShapeListOfShapeMap = fmap fromIntegral . rawExtentShapeListOfShapeMap
+
+foreign import capi unsafe "hs_NCollection_IndexedDataMap.h hs_NCollection_IndexedDataMap_TopoDS_Shape_NCollection_List_TopoDS_Shape_contains" rawContainsShapeListOfShapeMap
+    :: Ptr (IndexedDataMap TopoDS.Shape (List TopoDS.Shape)) -> Ptr TopoDS.Shape -> IO CBool
+
+containsShapeListOfShapeMap :: Ptr (IndexedDataMap TopoDS.Shape (List TopoDS.Shape)) -> Ptr TopoDS.Shape -> IO Bool
+containsShapeListOfShapeMap theMap shape = cBoolToBool <$> rawContainsShapeListOfShapeMap theMap shape
+
+foreign import capi unsafe "hs_NCollection_IndexedDataMap.h hs_NCollection_IndexedDataMap_TopoDS_Shape_NCollection_List_TopoDS_Shape_findFromKey" rawFindFromKeyShapeListOfShapeMap
+    :: Ptr (IndexedDataMap TopoDS.Shape (List TopoDS.Shape))
+    -> Ptr TopoDS.Shape
+    -> Ptr CInt
+    -> Ptr (Ptr ())
+    -> IO (Ptr (List TopoDS.Shape))
+
+findFromKeyShapeListOfShapeMap :: Ptr (IndexedDataMap TopoDS.Shape (List TopoDS.Shape)) -> Ptr TopoDS.Shape -> Acquire (Ptr (List TopoDS.Shape))
+findFromKeyShapeListOfShapeMap theMap shape = mkAcquire (wrapException $ rawFindFromKeyShapeListOfShapeMap theMap shape) deleteListOfShape
+
+foreign import capi unsafe "hs_NCollection_IndexedDataMap.h hs_NCollection_IndexedDataMap_TopoDS_Shape_NCollection_List_TopoDS_Shape_findKey" rawFindKeyShapeListOfShapeMap
+    :: Ptr (IndexedDataMap TopoDS.Shape (List TopoDS.Shape))
+    -> CInt
+    -> Ptr CInt
+    -> Ptr (Ptr ())
+    -> IO (Ptr TopoDS.Shape)
+
+-- | The key at a (1-based) index.
+findKeyShapeListOfShapeMap :: Ptr (IndexedDataMap TopoDS.Shape (List TopoDS.Shape)) -> Int -> Acquire (Ptr TopoDS.Shape)
+findKeyShapeListOfShapeMap theMap index = mkAcquire (wrapException $ rawFindKeyShapeListOfShapeMap theMap (fromIntegral index)) deleteShape
+
+foreign import capi unsafe "hs_NCollection_IndexedDataMap.h hs_NCollection_IndexedDataMap_TopoDS_Shape_NCollection_List_TopoDS_Shape_findFromIndex" rawFindFromIndexShapeListOfShapeMap
+    :: Ptr (IndexedDataMap TopoDS.Shape (List TopoDS.Shape))
+    -> CInt
+    -> Ptr CInt
+    -> Ptr (Ptr ())
+    -> IO (Ptr (List TopoDS.Shape))
+
+-- | The list at a (1-based) index.
+findFromIndexShapeListOfShapeMap :: Ptr (IndexedDataMap TopoDS.Shape (List TopoDS.Shape)) -> Int -> Acquire (Ptr (List TopoDS.Shape))
+findFromIndexShapeListOfShapeMap theMap index = mkAcquire (wrapException $ rawFindFromIndexShapeListOfShapeMap theMap (fromIntegral index)) deleteListOfShape
diff --git a/src/OpenCascade/NCollection/Internal/Destructors.hs b/src/OpenCascade/NCollection/Internal/Destructors.hs
--- a/src/OpenCascade/NCollection/Internal/Destructors.hs
+++ b/src/OpenCascade/NCollection/Internal/Destructors.hs
@@ -1,11 +1,27 @@
 {-# LANGUAGE CApiFFI #-}
 module OpenCascade.NCollection.Internal.Destructors
 ( deletePntArray
+, deleteListOfShape
+, deleteListOfShapeIterator
+, deleteAsciiStringMap
+, deleteIndexedDataMapOfShapeListOfShape
+, deleteVec3Float
 ) where
 
 import OpenCascade.NCollection.Types
 import OpenCascade.GP.Types
+import qualified OpenCascade.TopoDS.Types as TopoDS
+import qualified OpenCascade.TCollection.Types as TCollection
 import Foreign.Ptr
 
 foreign import capi unsafe "hs_NCollection_Array1.h hs_delete_NCollection_Array1_gp_Pnt" deletePntArray :: Ptr (Array1 Pnt) -> IO ()
 
+foreign import capi unsafe "hs_NCollection_List.h hs_delete_NCollection_List_TopoDS_Shape" deleteListOfShape :: Ptr (List TopoDS.Shape) -> IO ()
+
+foreign import capi unsafe "hs_NCollection_IndexedDataMap.h hs_delete_NCollection_IndexedDataMap_TCollection_AsciiString_TCollection_AsciiString" deleteAsciiStringMap :: Ptr (IndexedDataMap TCollection.AsciiString TCollection.AsciiString) -> IO ()
+
+foreign import capi unsafe "hs_NCollection_IndexedDataMap.h hs_delete_NCollection_IndexedDataMap_TopoDS_Shape_NCollection_List_TopoDS_Shape" deleteIndexedDataMapOfShapeListOfShape :: Ptr (IndexedDataMap TopoDS.Shape (List TopoDS.Shape)) -> IO ()
+
+foreign import capi unsafe "hs_NCollection_Vec3.h hs_delete_NCollection_Vec3_float" deleteVec3Float :: Ptr (Vec3 Float) -> IO ()
+
+foreign import capi unsafe "hs_NCollection_List.h hs_delete_NCollection_List_TopoDS_Shape_Iterator" deleteListOfShapeIterator :: Ptr (ListIterator TopoDS.Shape) -> IO ()
diff --git a/src/OpenCascade/NCollection/List.hs b/src/OpenCascade/NCollection/List.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/NCollection/List.hs
@@ -0,0 +1,29 @@
+{-# LANGUAGE CApiFFI #-}
+module OpenCascade.NCollection.List
+( List
+, newListOfShape
+, extentListOfShape
+, appendListOfShape
+) where
+
+import OpenCascade.NCollection.Types (List)
+import OpenCascade.NCollection.Internal.Destructors (deleteListOfShape)
+import OpenCascade.NCollection.List.Iterator (newListOfShapeIterator, moreListOfShapeIterator, nextListOfShapeIterator, valueListOfShapeIterator)
+import qualified OpenCascade.TopoDS.Types as TopoDS
+import Control.Monad.IO.Class (liftIO)
+import Foreign.Ptr (Ptr)
+import Foreign.C (CInt (..))
+import Data.Acquire (Acquire, mkAcquire)
+
+foreign import capi unsafe "hs_NCollection_List.h hs_new_NCollection_List_TopoDS_Shape" rawNewListOfShape :: IO (Ptr (List TopoDS.Shape))
+
+newListOfShape :: Acquire (Ptr (List TopoDS.Shape))
+newListOfShape = mkAcquire rawNewListOfShape deleteListOfShape
+
+foreign import capi unsafe "hs_NCollection_List.h hs_NCollection_List_TopoDS_Shape_extent" rawExtentListOfShape :: Ptr (List TopoDS.Shape) -> IO CInt
+
+extentListOfShape :: Ptr (List TopoDS.Shape) -> IO Int
+extentListOfShape = fmap fromIntegral . rawExtentListOfShape
+
+foreign import capi unsafe "hs_NCollection_List.h hs_NCollection_List_TopoDS_Shape_append" appendListOfShape :: Ptr (List TopoDS.Shape) -> Ptr TopoDS.Shape -> IO ()
+
diff --git a/src/OpenCascade/NCollection/List/Iterator.hs b/src/OpenCascade/NCollection/List/Iterator.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/NCollection/List/Iterator.hs
@@ -0,0 +1,34 @@
+{-# LANGUAGE CApiFFI #-}
+module OpenCascade.NCollection.List.Iterator
+( ListIterator
+, newListOfShapeIterator
+, moreListOfShapeIterator
+, nextListOfShapeIterator
+, valueListOfShapeIterator
+) where
+
+import OpenCascade.NCollection.Types (List, ListIterator)
+import OpenCascade.NCollection.Internal.Destructors (deleteListOfShapeIterator)
+import qualified OpenCascade.TopoDS.Types as TopoDS
+import OpenCascade.TopoDS.Internal.Destructors (deleteShape)
+import OpenCascade.Internal.Bool (cBoolToBool)
+import Foreign.Ptr (Ptr)
+import Foreign.C (CBool (..))
+import Data.Acquire (Acquire, mkAcquire)
+
+foreign import capi unsafe "hs_NCollection_List.h hs_new_NCollection_List_TopoDS_Shape_Iterator" rawNewListOfShapeIterator :: Ptr (List TopoDS.Shape) -> IO (Ptr (ListIterator TopoDS.Shape))
+
+newListOfShapeIterator :: Ptr (List TopoDS.Shape) -> Acquire (Ptr (ListIterator TopoDS.Shape))
+newListOfShapeIterator list = mkAcquire (rawNewListOfShapeIterator list) deleteListOfShapeIterator
+
+foreign import capi unsafe "hs_NCollection_List.h hs_NCollection_List_TopoDS_Shape_Iterator_more" rawMoreListOfShapeIterator :: Ptr (ListIterator TopoDS.Shape) -> IO CBool
+
+moreListOfShapeIterator :: Ptr (ListIterator TopoDS.Shape) -> IO Bool
+moreListOfShapeIterator = fmap cBoolToBool . rawMoreListOfShapeIterator
+
+foreign import capi unsafe "hs_NCollection_List.h hs_NCollection_List_TopoDS_Shape_Iterator_next" nextListOfShapeIterator :: Ptr (ListIterator TopoDS.Shape) -> IO ()
+
+foreign import capi unsafe "hs_NCollection_List.h hs_NCollection_List_TopoDS_Shape_Iterator_value" rawValueListOfShapeIterator :: Ptr (ListIterator TopoDS.Shape) -> IO (Ptr TopoDS.Shape)
+
+valueListOfShapeIterator :: Ptr (ListIterator TopoDS.Shape) -> Acquire (Ptr TopoDS.Shape)
+valueListOfShapeIterator iterator = mkAcquire (rawValueListOfShapeIterator iterator) deleteShape
diff --git a/src/OpenCascade/NCollection/Types.hs b/src/OpenCascade/NCollection/Types.hs
--- a/src/OpenCascade/NCollection/Types.hs
+++ b/src/OpenCascade/NCollection/Types.hs
@@ -1,6 +1,14 @@
 {-# LANGUAGE EmptyDataDecls #-}
 module OpenCascade.NCollection.Types 
 ( Array1
+, List
+, ListIterator
+, IndexedDataMap
+, Vec3
 ) where
 
 data Array1 a
+data List a
+data IndexedDataMap k v
+data Vec3 a
+data ListIterator a
diff --git a/src/OpenCascade/NCollection/Vec3.hs b/src/OpenCascade/NCollection/Vec3.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/NCollection/Vec3.hs
@@ -0,0 +1,16 @@
+{-# LANGUAGE CApiFFI #-}
+module OpenCascade.NCollection.Vec3
+( Vec3
+, newVec3Float
+) where
+
+import OpenCascade.NCollection.Types (Vec3)
+import OpenCascade.NCollection.Internal.Destructors (deleteVec3Float)
+import Foreign.Ptr (Ptr)
+import Foreign.C (CFloat (..))
+import Data.Acquire (Acquire, mkAcquire)
+
+foreign import capi unsafe "hs_NCollection_Vec3.h hs_new_NCollection_Vec3_float" rawNewVec3Float :: CFloat -> CFloat -> CFloat -> IO (Ptr (Vec3 Float))
+
+newVec3Float :: Float -> Float -> Float -> Acquire (Ptr (Vec3 Float))
+newVec3Float x y z = mkAcquire (rawNewVec3Float (realToFrac x) (realToFrac y) (realToFrac z)) deleteVec3Float
diff --git a/src/OpenCascade/Poly/Triangulation.hs b/src/OpenCascade/Poly/Triangulation.hs
--- a/src/OpenCascade/Poly/Triangulation.hs
+++ b/src/OpenCascade/Poly/Triangulation.hs
@@ -4,6 +4,7 @@
 , new
 , nbNodes
 , nbTriangles
+, isNull
 , node 
 , setNode
 , triangle
@@ -17,7 +18,7 @@
 import OpenCascade.Handle (Handle)
 import Foreign.Ptr (Ptr)
 import Foreign.C (CInt (..), CBool (..))
-import OpenCascade.Internal.Bool (boolToCBool)
+import OpenCascade.Internal.Bool (boolToCBool, cBoolToBool)
 import OpenCascade.Internal.Exception (wrapException)
 import Data.Acquire (Acquire, mkAcquire)
 
@@ -84,3 +85,8 @@
 
 setTriangle :: Ptr (Handle Triangulation) -> Int -> Ptr Triangle -> IO ()
 setTriangle tri index theTriangle = wrapException $ rawSetTriangle tri (fromIntegral index) theTriangle
+
+foreign import capi unsafe "hs_Poly_Triangulation.h hs_Poly_Triangulation_isNull" rawIsNull :: Ptr (Handle Triangulation) -> IO CBool
+
+isNull :: Ptr (Handle Triangulation) -> IO Bool
+isNull tri = cBoolToBool <$> rawIsNull tri
diff --git a/src/OpenCascade/Quantity.hs b/src/OpenCascade/Quantity.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/Quantity.hs
@@ -0,0 +1,5 @@
+module OpenCascade.Quantity
+( module OpenCascade.Quantity.Types
+) where
+    
+import OpenCascade.Quantity.Types
diff --git a/src/OpenCascade/Quantity/Color.hs b/src/OpenCascade/Quantity/Color.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/Quantity/Color.hs
@@ -0,0 +1,28 @@
+{-# LANGUAGE CApiFFI #-}
+module OpenCascade.Quantity.Color
+( Color
+, new
+) where
+
+import OpenCascade.Quantity.Types (Color)
+import OpenCascade.Quantity.TypeOfColor (TypeOfColor)
+import OpenCascade.Quantity.Internal.Destructors (deleteColor)
+import OpenCascade.Internal.Exception (wrapException)
+import Foreign.Ptr (Ptr)
+import Foreign.C (CDouble (..), CInt (..))
+import Data.Acquire (Acquire, mkAcquire)
+
+foreign import capi unsafe "hs_Quantity_Color.h hs_new_Quantity_Color" rawNew
+    :: CDouble
+    -> CDouble
+    -> CDouble
+    -> CInt
+    -> Ptr CInt
+    -> Ptr (Ptr ())
+    -> IO (Ptr Color)
+
+new :: Double -> Double -> Double -> TypeOfColor -> Acquire (Ptr Color)
+new c1 c2 c3 theType =
+    mkAcquire
+        (wrapException $ rawNew (realToFrac c1) (realToFrac c2) (realToFrac c3) (fromIntegral . fromEnum $ theType))
+        deleteColor
diff --git a/src/OpenCascade/Quantity/ColorRGBA.hs b/src/OpenCascade/Quantity/ColorRGBA.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/Quantity/ColorRGBA.hs
@@ -0,0 +1,16 @@
+{-# LANGUAGE CApiFFI #-}
+module OpenCascade.Quantity.ColorRGBA
+( ColorRGBA
+, new
+) where
+
+import OpenCascade.Quantity.Types (Color, ColorRGBA)
+import OpenCascade.Quantity.Internal.Destructors (deleteColorRGBA)
+import Foreign.Ptr (Ptr)
+import Foreign.C (CDouble (..))
+import Data.Acquire (Acquire, mkAcquire)
+
+foreign import capi unsafe "hs_Quantity_ColorRGBA.h hs_new_Quantity_ColorRGBA" rawNew :: Ptr Color -> CDouble -> IO (Ptr ColorRGBA)
+
+new :: Ptr Color -> Double -> Acquire (Ptr ColorRGBA)
+new color alpha = mkAcquire (rawNew color (realToFrac alpha)) deleteColorRGBA
diff --git a/src/OpenCascade/Quantity/Internal/Destructors.hs b/src/OpenCascade/Quantity/Internal/Destructors.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/Quantity/Internal/Destructors.hs
@@ -0,0 +1,12 @@
+{-# LANGUAGE CApiFFI #-}
+module OpenCascade.Quantity.Internal.Destructors
+( deleteColor
+, deleteColorRGBA
+) where
+
+import OpenCascade.Quantity.Types
+import Foreign.Ptr
+
+foreign import capi unsafe "hs_Quantity_Color.h hs_delete_Quantity_Color" deleteColor :: Ptr Color -> IO ()
+
+foreign import capi unsafe "hs_Quantity_ColorRGBA.h hs_delete_Quantity_ColorRGBA" deleteColorRGBA :: Ptr ColorRGBA -> IO ()
diff --git a/src/OpenCascade/Quantity/TypeOfColor.hs b/src/OpenCascade/Quantity/TypeOfColor.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/Quantity/TypeOfColor.hs
@@ -0,0 +1,6 @@
+module OpenCascade.Quantity.TypeOfColor
+( TypeOfColor (..)
+) where
+
+-- this should match the enumeration in Quantity_TypeOfColor
+data TypeOfColor = RGB | SRGB | HLS | CIELab | CIELch deriving (Show, Eq, Enum)
diff --git a/src/OpenCascade/Quantity/Types.hs b/src/OpenCascade/Quantity/Types.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/Quantity/Types.hs
@@ -0,0 +1,8 @@
+{-# LANGUAGE EmptyDataDecls #-}
+module OpenCascade.Quantity.Types
+( Color
+, ColorRGBA
+) where
+
+data Color
+data ColorRGBA
diff --git a/src/OpenCascade/RWGltf/CafWriter.hs b/src/OpenCascade/RWGltf/CafWriter.hs
--- a/src/OpenCascade/RWGltf/CafWriter.hs
+++ b/src/OpenCascade/RWGltf/CafWriter.hs
@@ -15,7 +15,8 @@
 import OpenCascade.Internal.Exception (wrapException)
 import OpenCascade.Handle (Handle)
 import qualified OpenCascade.TDocStd.Types as TDocStd
-import qualified OpenCascade.TColStd.Types as TColStd
+import qualified OpenCascade.NCollection.Types as NCollection
+import qualified OpenCascade.TCollection.Types as TCollection
 import qualified OpenCascade.Message.Types as Message
 
 foreign import capi unsafe "hs_RWGltf_CafWriter.h hs_new_RWGltf_CafWriter" rawNew :: CString -> CBool -> IO (Ptr CafWriter)
@@ -26,11 +27,11 @@
 foreign import capi unsafe "hs_RWGltf_CafWriter.h hs_RWGltf_CafWriter_Perform" rawPerform
     :: Ptr CafWriter
     -> Ptr (Handle TDocStd.Document)
-    -> Ptr (TColStd.IndexedDataMapOfStringString)
+    -> Ptr (NCollection.IndexedDataMap TCollection.AsciiString TCollection.AsciiString)
     -> Ptr (Message.ProgressRange)
     -> Ptr CInt
     -> Ptr (Ptr ())
     -> IO ()
 
-perform :: Ptr CafWriter -> Ptr (Handle TDocStd.Document) -> Ptr (TColStd.IndexedDataMapOfStringString) -> Ptr (Message.ProgressRange) -> IO ()
+perform :: Ptr CafWriter -> Ptr (Handle TDocStd.Document) -> Ptr (NCollection.IndexedDataMap TCollection.AsciiString TCollection.AsciiString) -> Ptr (Message.ProgressRange) -> IO ()
 perform writer doc fileInfo progress = wrapException $ rawPerform writer doc fileInfo progress
diff --git a/src/OpenCascade/RWObj/CafWriter.hs b/src/OpenCascade/RWObj/CafWriter.hs
--- a/src/OpenCascade/RWObj/CafWriter.hs
+++ b/src/OpenCascade/RWObj/CafWriter.hs
@@ -14,7 +14,8 @@
 import OpenCascade.Internal.Exception (wrapException)
 import OpenCascade.Handle (Handle)
 import qualified OpenCascade.TDocStd.Types as TDocStd
-import qualified OpenCascade.TColStd.Types as TColStd
+import qualified OpenCascade.NCollection.Types as NCollection
+import qualified OpenCascade.TCollection.Types as TCollection
 import qualified OpenCascade.Message.Types as Message
 
 foreign import capi unsafe "hs_RWObj_CafWriter.h hs_new_RWObj_CafWriter" rawNew :: CString -> IO (Ptr CafWriter)
@@ -25,11 +26,11 @@
 foreign import capi unsafe "hs_RWObj_CafWriter.h hs_RWObj_CafWriter_Perform" rawPerform
     :: Ptr CafWriter
     -> Ptr (Handle TDocStd.Document)
-    -> Ptr (TColStd.IndexedDataMapOfStringString)
+    -> Ptr (NCollection.IndexedDataMap TCollection.AsciiString TCollection.AsciiString)
     -> Ptr (Message.ProgressRange)
     -> Ptr CInt
     -> Ptr (Ptr ())
     -> IO ()
 
-perform :: Ptr CafWriter -> Ptr (Handle TDocStd.Document) -> Ptr (TColStd.IndexedDataMapOfStringString) -> Ptr (Message.ProgressRange) -> IO ()
+perform :: Ptr CafWriter -> Ptr (Handle TDocStd.Document) -> Ptr (NCollection.IndexedDataMap TCollection.AsciiString TCollection.AsciiString) -> Ptr (Message.ProgressRange) -> IO ()
 perform writer doc fileInfo progress = wrapException $ rawPerform writer doc fileInfo progress
diff --git a/src/OpenCascade/STEPCAFControl/Internal/Destructors.hs b/src/OpenCascade/STEPCAFControl/Internal/Destructors.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/STEPCAFControl/Internal/Destructors.hs
@@ -0,0 +1,10 @@
+{-# LANGUAGE CApiFFI #-}
+module OpenCascade.STEPCAFControl.Internal.Destructors
+( deleteWriter
+) where
+
+import OpenCascade.STEPCAFControl.Types
+
+import Foreign.Ptr
+
+foreign import capi unsafe "hs_STEPCAFControl_Writer.h hs_delete_STEPCAFControl_Writer" deleteWriter :: Ptr Writer -> IO ()
diff --git a/src/OpenCascade/STEPCAFControl/Types.hs b/src/OpenCascade/STEPCAFControl/Types.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/STEPCAFControl/Types.hs
@@ -0,0 +1,6 @@
+{-# LANGUAGE EmptyDataDecls #-}
+module OpenCascade.STEPCAFControl.Types
+( Writer
+) where
+
+data Writer
diff --git a/src/OpenCascade/STEPCAFControl/Writer.hs b/src/OpenCascade/STEPCAFControl/Writer.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/STEPCAFControl/Writer.hs
@@ -0,0 +1,57 @@
+{-# LANGUAGE CApiFFI #-}
+module OpenCascade.STEPCAFControl.Writer
+( Writer
+, new
+, setColorMode
+, setNameMode
+, transfer
+, write
+) where
+
+import OpenCascade.STEPCAFControl.Types (Writer)
+import OpenCascade.STEPCAFControl.Internal.Destructors (deleteWriter)
+import qualified OpenCascade.TDocStd.Types as TDocStd
+import OpenCascade.Handle (Handle)
+import OpenCascade.STEPControl.StepModelType (StepModelType)
+import qualified OpenCascade.IFSelect.ReturnStatus as IFSelect.ReturnStatus
+import OpenCascade.Internal.Bool (boolToCBool, cBoolToBool)
+import OpenCascade.Internal.Exception (wrapException)
+import Foreign.C
+import Foreign.Ptr
+import Data.Acquire
+
+foreign import capi unsafe "hs_STEPCAFControl_Writer.h hs_new_STEPCAFControl_Writer" rawNew :: IO (Ptr Writer)
+
+new :: Acquire (Ptr Writer)
+new = mkAcquire rawNew deleteWriter
+
+foreign import capi unsafe "hs_STEPCAFControl_Writer.h hs_STEPCAFControl_Writer_setColorMode" rawSetColorMode :: Ptr Writer -> CBool -> IO ()
+
+setColorMode :: Ptr Writer -> Bool -> IO ()
+setColorMode writer = rawSetColorMode writer . boolToCBool
+
+foreign import capi unsafe "hs_STEPCAFControl_Writer.h hs_STEPCAFControl_Writer_setNameMode" rawSetNameMode :: Ptr Writer -> CBool -> IO ()
+
+setNameMode :: Ptr Writer -> Bool -> IO ()
+setNameMode writer = rawSetNameMode writer . boolToCBool
+
+foreign import capi unsafe "hs_STEPCAFControl_Writer.h hs_STEPCAFControl_Writer_transfer" rawTransfer
+    :: Ptr Writer
+    -> Ptr (Handle TDocStd.Document)
+    -> CInt
+    -> Ptr CInt
+    -> Ptr (Ptr ())
+    -> IO CBool
+
+transfer :: Ptr Writer -> Ptr (Handle TDocStd.Document) -> StepModelType -> IO Bool
+transfer writer doc mode = cBoolToBool <$> wrapException (rawTransfer writer doc (fromIntegral . fromEnum $ mode))
+
+foreign import capi unsafe "hs_STEPCAFControl_Writer.h hs_STEPCAFControl_Writer_write" rawWrite
+    :: Ptr Writer
+    -> CString
+    -> Ptr CInt
+    -> Ptr (Ptr ())
+    -> IO CInt
+
+write :: Ptr Writer -> String -> IO IFSelect.ReturnStatus.ReturnStatus
+write writer filename = toEnum . fromIntegral <$> withCString filename (wrapException . rawWrite writer)
diff --git a/src/OpenCascade/ShapeUpgrade/Internal/Destructors.hs b/src/OpenCascade/ShapeUpgrade/Internal/Destructors.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/ShapeUpgrade/Internal/Destructors.hs
@@ -0,0 +1,9 @@
+{-# LANGUAGE CApiFFI #-}
+module OpenCascade.ShapeUpgrade.Internal.Destructors
+( deleteUnifySameDomain
+) where
+
+import OpenCascade.ShapeUpgrade.Types (UnifySameDomain)
+import Foreign.Ptr (Ptr)
+
+foreign import capi unsafe "hs_ShapeUpgrade_UnifySameDomain.h hs_delete_ShapeUpgrade_UnifySameDomain" deleteUnifySameDomain :: Ptr UnifySameDomain -> IO ()
diff --git a/src/OpenCascade/ShapeUpgrade/Types.hs b/src/OpenCascade/ShapeUpgrade/Types.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/ShapeUpgrade/Types.hs
@@ -0,0 +1,6 @@
+{-# LANGUAGE EmptyDataDecls #-}
+module OpenCascade.ShapeUpgrade.Types
+( UnifySameDomain
+) where
+
+data UnifySameDomain
diff --git a/src/OpenCascade/ShapeUpgrade/UnifySameDomain.hs b/src/OpenCascade/ShapeUpgrade/UnifySameDomain.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/ShapeUpgrade/UnifySameDomain.hs
@@ -0,0 +1,54 @@
+{-# LANGUAGE CApiFFI #-}
+module OpenCascade.ShapeUpgrade.UnifySameDomain
+( UnifySameDomain
+, fromShape
+, setSafeInputMode
+, allowInternalEdges
+, build
+, shape
+) where
+
+import OpenCascade.ShapeUpgrade.Types (UnifySameDomain)
+import OpenCascade.ShapeUpgrade.Internal.Destructors (deleteUnifySameDomain)
+import OpenCascade.TopoDS.Internal.Destructors (deleteShape)
+import qualified OpenCascade.TopoDS.Types as TopoDS
+import OpenCascade.Internal.Bool (boolToCBool)
+import OpenCascade.Internal.Exception (wrapException)
+import Data.Acquire (Acquire, mkAcquire)
+import Foreign.Ptr (Ptr)
+import Foreign.C (CInt (..), CBool (..))
+
+foreign import capi unsafe "hs_ShapeUpgrade_UnifySameDomain.h hs_new_ShapeUpgrade_UnifySameDomain_fromShape" rawFromShape
+    :: Ptr TopoDS.Shape
+    -> CBool
+    -> CBool
+    -> CBool
+    -> Ptr CInt
+    -> Ptr (Ptr ())
+    -> IO (Ptr UnifySameDomain)
+
+fromShape :: Ptr TopoDS.Shape -> Bool -> Bool -> Bool -> Acquire (Ptr UnifySameDomain)
+fromShape s unifyEdges unifyFaces concatBSplines =
+    mkAcquire
+        (wrapException $ rawFromShape s (boolToCBool unifyEdges) (boolToCBool unifyFaces) (boolToCBool concatBSplines))
+        deleteUnifySameDomain
+
+foreign import capi unsafe "hs_ShapeUpgrade_UnifySameDomain.h hs_ShapeUpgrade_UnifySameDomain_setSafeInputMode" rawSetSafeInputMode :: Ptr UnifySameDomain -> CBool -> IO ()
+
+setSafeInputMode :: Ptr UnifySameDomain -> Bool -> IO ()
+setSafeInputMode unify = rawSetSafeInputMode unify . boolToCBool
+
+foreign import capi unsafe "hs_ShapeUpgrade_UnifySameDomain.h hs_ShapeUpgrade_UnifySameDomain_allowInternalEdges" rawAllowInternalEdges :: Ptr UnifySameDomain -> CBool -> IO ()
+
+allowInternalEdges :: Ptr UnifySameDomain -> Bool -> IO ()
+allowInternalEdges unify = rawAllowInternalEdges unify . boolToCBool
+
+foreign import capi unsafe "hs_ShapeUpgrade_UnifySameDomain.h hs_ShapeUpgrade_UnifySameDomain_build" rawBuild :: Ptr UnifySameDomain -> Ptr CInt -> Ptr (Ptr ()) -> IO ()
+
+build :: Ptr UnifySameDomain -> IO ()
+build unify = wrapException $ rawBuild unify
+
+foreign import capi unsafe "hs_ShapeUpgrade_UnifySameDomain.h hs_ShapeUpgrade_UnifySameDomain_shape" rawShape :: Ptr UnifySameDomain -> IO (Ptr TopoDS.Shape)
+
+shape :: Ptr UnifySameDomain -> Acquire (Ptr TopoDS.Shape)
+shape unify = mkAcquire (rawShape unify) deleteShape
diff --git a/src/OpenCascade/Standard/Failure.hs b/src/OpenCascade/Standard/Failure.hs
--- a/src/OpenCascade/Standard/Failure.hs
+++ b/src/OpenCascade/Standard/Failure.hs
@@ -1,6 +1,7 @@
 {-# LANGUAGE CApiFFI #-}
 module OpenCascade.Standard.Failure
 ( Failure
+, getTypeName
 , getMessageString
 , getStackString 
 ) where
@@ -8,6 +9,8 @@
 import OpenCascade.Standard.Types (Failure)
 import Foreign.C (CString)
 import Foreign.Ptr (Ptr)
+
+foreign import capi unsafe "hs_Standard_Failure.h hs_Standard_Failure_GetTypeName" getTypeName :: Ptr Failure -> IO CString
 
 foreign import capi unsafe "hs_Standard_Failure.h hs_Standard_Failure_GetMessageString" getMessageString :: Ptr Failure -> IO CString
 
diff --git a/src/OpenCascade/TColStd/IndexedDataMapOfStringString.hs b/src/OpenCascade/TColStd/IndexedDataMapOfStringString.hs
deleted file mode 100644
--- a/src/OpenCascade/TColStd/IndexedDataMapOfStringString.hs
+++ /dev/null
@@ -1,15 +0,0 @@
-{-# LANGUAGE CApiFFI #-}
-module OpenCascade.TColStd.IndexedDataMapOfStringString
-( IndexedDataMapOfStringString
-, new
-) where
-
-import OpenCascade.TColStd.Types (IndexedDataMapOfStringString)
-import OpenCascade.TColStd.Internal.Destructors (deleteIndexedDataMapOfStringString)
-import Foreign.Ptr (Ptr)
-import Data.Acquire (Acquire, mkAcquire)
-
-foreign import capi unsafe "hs_TColStd_IndexedDataMapOfStringString.h hs_new_TColStd_IndexedDataMapOfStringString" rawNew :: IO (Ptr IndexedDataMapOfStringString)
-
-new :: Acquire (Ptr IndexedDataMapOfStringString)
-new = mkAcquire rawNew deleteIndexedDataMapOfStringString
diff --git a/src/OpenCascade/TColStd/Internal/Destructors.hs b/src/OpenCascade/TColStd/Internal/Destructors.hs
deleted file mode 100644
--- a/src/OpenCascade/TColStd/Internal/Destructors.hs
+++ /dev/null
@@ -1,9 +0,0 @@
-{-# LANGUAGE CApiFFI #-}
-module OpenCascade.TColStd.Internal.Destructors
-( deleteIndexedDataMapOfStringString
-) where
-
-import OpenCascade.TColStd.Types
-import Foreign.Ptr 
-
-foreign import capi unsafe "hs_TColStd_IndexedDataMapOfStringString.h hs_delete_TColStd_IndexedDataMapOfStringString" deleteIndexedDataMapOfStringString :: Ptr (IndexedDataMapOfStringString) -> IO ()
diff --git a/src/OpenCascade/TColStd/Types.hs b/src/OpenCascade/TColStd/Types.hs
deleted file mode 100644
--- a/src/OpenCascade/TColStd/Types.hs
+++ /dev/null
@@ -1,6 +0,0 @@
-{-# LANGUAGE EmptyDataDecls #-}
-module OpenCascade.TColStd.Types
-( IndexedDataMapOfStringString
-) where
-
-data IndexedDataMapOfStringString
diff --git a/src/OpenCascade/TCollection.hs b/src/OpenCascade/TCollection.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/TCollection.hs
@@ -0,0 +1,4 @@
+module OpenCascade.TCollection
+( module OpenCascade.TCollection.Types
+) where
+import OpenCascade.TCollection.Types
diff --git a/src/OpenCascade/TCollection/Types.hs b/src/OpenCascade/TCollection/Types.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/TCollection/Types.hs
@@ -0,0 +1,6 @@
+{-# LANGUAGE EmptyDataDecls #-}
+module OpenCascade.TCollection.Types
+( AsciiString
+) where
+
+data AsciiString
diff --git a/src/OpenCascade/TDF/Label.hs b/src/OpenCascade/TDF/Label.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/TDF/Label.hs
@@ -0,0 +1,15 @@
+{-# LANGUAGE CApiFFI #-}
+module OpenCascade.TDF.Label
+( Label
+, isNull
+) where
+
+import OpenCascade.TDF.Types (Label)
+import OpenCascade.Internal.Bool (cBoolToBool)
+import Foreign.Ptr (Ptr)
+import Foreign.C (CBool (..))
+
+foreign import capi unsafe "hs_TDF_Label.h hs_TDF_Label_isNull" rawIsNull :: Ptr Label -> IO CBool
+
+isNull :: Ptr Label -> IO Bool
+isNull = fmap cBoolToBool . rawIsNull
diff --git a/src/OpenCascade/TopExp.hs b/src/OpenCascade/TopExp.hs
--- a/src/OpenCascade/TopExp.hs
+++ b/src/OpenCascade/TopExp.hs
@@ -1,5 +1,35 @@
+{-# LANGUAGE CApiFFI #-}
 module OpenCascade.TopExp
 ( module OpenCascade.TopExp.Types
+, mapShapesAndAncestors
 ) where
 
 import OpenCascade.TopExp.Types
+import qualified OpenCascade.TopoDS.Types as TopoDS
+import qualified OpenCascade.TopAbs as TopAbs
+import qualified OpenCascade.NCollection.Types as NCollection
+import OpenCascade.Internal.Exception (wrapException)
+import Foreign.Ptr (Ptr)
+import Foreign.C (CInt (..))
+
+foreign import capi unsafe "hs_TopExp.h hs_TopExp_mapShapesAndAncestors" rawMapShapesAndAncestors
+    :: Ptr TopoDS.Shape
+    -> CInt
+    -> CInt
+    -> (Ptr (NCollection.IndexedDataMap TopoDS.Shape (NCollection.List TopoDS.Shape)))
+    -> Ptr CInt
+    -> Ptr (Ptr ())
+    -> IO ()
+
+mapShapesAndAncestors 
+    :: Ptr TopoDS.Shape
+    -> TopAbs.ShapeEnum
+    -> TopAbs.ShapeEnum
+    -> (Ptr (NCollection.IndexedDataMap TopoDS.Shape (NCollection.List TopoDS.Shape)))
+    -> IO () 
+mapShapesAndAncestors shape subshapeType ancestorType theMap =
+    wrapException $ rawMapShapesAndAncestors
+        shape 
+        (fromIntegral . fromEnum $ subshapeType)
+        (fromIntegral . fromEnum $ ancestorType)
+        theMap
diff --git a/src/OpenCascade/TopTools.hs b/src/OpenCascade/TopTools.hs
deleted file mode 100644
--- a/src/OpenCascade/TopTools.hs
+++ /dev/null
@@ -1,4 +0,0 @@
-module OpenCascade.TopTools 
-( module OpenCascade.TopTools.Types
-) where
-import OpenCascade.TopTools.Types
diff --git a/src/OpenCascade/TopTools/Types.hs b/src/OpenCascade/TopTools/Types.hs
deleted file mode 100644
--- a/src/OpenCascade/TopTools/Types.hs
+++ /dev/null
@@ -1,6 +0,0 @@
-{-# LANGUAGE EmptyDataDecls #-}
-module OpenCascade.TopTools.Types 
-( ListOfShape
-) where
-
-data ListOfShape
diff --git a/src/OpenCascade/XCAFDoc/ColorTool.hs b/src/OpenCascade/XCAFDoc/ColorTool.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/XCAFDoc/ColorTool.hs
@@ -0,0 +1,41 @@
+{-# LANGUAGE CApiFFI #-}
+module OpenCascade.XCAFDoc.ColorTool
+( ColorTool
+, setColor
+, setShapeColor
+) where
+
+import OpenCascade.XCAFDoc.Types (ColorTool)
+import OpenCascade.XCAFDoc.ColorType (ColorType)
+import qualified OpenCascade.TopoDS.Types as TopoDS
+import qualified OpenCascade.Quantity.Types as Quantity
+import OpenCascade.Handle (Handle)
+import OpenCascade.TDF.Types (Label)
+import OpenCascade.Internal.Bool (cBoolToBool)
+import OpenCascade.Internal.Exception (wrapException)
+import Foreign.C (CBool (..), CInt (..))
+import Foreign.Ptr (Ptr)
+
+foreign import capi unsafe "hs_XCAFDoc_ColorTool.h hs_XCAFDoc_ColorTool_setColor" rawSetColor
+    :: Ptr (Handle ColorTool)
+    -> Ptr Label
+    -> Ptr Quantity.Color
+    -> CInt
+    -> Ptr CInt
+    -> Ptr (Ptr ())
+    -> IO ()
+
+setColor :: Ptr (Handle ColorTool) -> Ptr Label -> Ptr Quantity.Color -> ColorType -> IO ()
+setColor tool label color colorType = wrapException $ rawSetColor tool label color (fromIntegral . fromEnum $ colorType)
+
+foreign import capi unsafe "hs_XCAFDoc_ColorTool.h hs_XCAFDoc_ColorTool_setShapeColor" rawSetShapeColor
+    :: Ptr (Handle ColorTool)
+    -> Ptr TopoDS.Shape
+    -> Ptr Quantity.Color
+    -> CInt
+    -> Ptr CInt
+    -> Ptr (Ptr ())
+    -> IO CBool
+
+setShapeColor :: Ptr (Handle ColorTool) -> Ptr TopoDS.Shape -> Ptr Quantity.Color -> ColorType -> IO Bool
+setShapeColor tool shape color colorType = cBoolToBool <$> wrapException (rawSetShapeColor tool shape color (fromIntegral . fromEnum $ colorType))
diff --git a/src/OpenCascade/XCAFDoc/ColorType.hs b/src/OpenCascade/XCAFDoc/ColorType.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/XCAFDoc/ColorType.hs
@@ -0,0 +1,6 @@
+module OpenCascade.XCAFDoc.ColorType
+( ColorType (..)
+) where
+
+-- this should match the enumeration in XCAFDoc_ColorType
+data ColorType = ColorGen | ColorSurf | ColorCurv deriving (Show, Eq, Enum)
diff --git a/src/OpenCascade/XCAFDoc/DocumentTool.hs b/src/OpenCascade/XCAFDoc/DocumentTool.hs
--- a/src/OpenCascade/XCAFDoc/DocumentTool.hs
+++ b/src/OpenCascade/XCAFDoc/DocumentTool.hs
@@ -1,10 +1,12 @@
 {-# LANGUAGE CApiFFI #-}
 module OpenCascade.XCAFDoc.DocumentTool
 ( shapeTool
+, colorTool
+, visMaterialTool
 ) where
 
-import OpenCascade.XCAFDoc.Types (ShapeTool)
-import OpenCascade.XCAFDoc.Internal.Destructors (deleteShapeToolHandle)
+import OpenCascade.XCAFDoc.Types (ShapeTool, ColorTool, VisMaterialTool)
+import OpenCascade.XCAFDoc.Internal.Destructors (deleteShapeToolHandle, deleteColorToolHandle, deleteVisMaterialToolHandle)
 import OpenCascade.TDF.Types (Label)
 import OpenCascade.Handle (Handle)
 import OpenCascade.Internal.Exception (wrapException)
@@ -20,3 +22,21 @@
 
 shapeTool :: Ptr Label -> Acquire (Ptr (Handle ShapeTool))
 shapeTool label = mkAcquire (wrapException $ rawShapeTool label) deleteShapeToolHandle
+
+foreign import capi unsafe "hs_XCAFDoc_DocumentTool.h hs_XCAFDoc_DocumentTool_colorTool" rawColorTool
+    :: Ptr Label
+    -> Ptr CInt
+    -> Ptr (Ptr ())
+    -> IO (Ptr (Handle ColorTool))
+
+colorTool :: Ptr Label -> Acquire (Ptr (Handle ColorTool))
+colorTool label = mkAcquire (wrapException $ rawColorTool label) deleteColorToolHandle
+
+foreign import capi unsafe "hs_XCAFDoc_DocumentTool.h hs_XCAFDoc_DocumentTool_visMaterialTool" rawVisMaterialTool
+    :: Ptr Label
+    -> Ptr CInt
+    -> Ptr (Ptr ())
+    -> IO (Ptr (Handle VisMaterialTool))
+
+visMaterialTool :: Ptr Label -> Acquire (Ptr (Handle VisMaterialTool))
+visMaterialTool label = mkAcquire (wrapException $ rawVisMaterialTool label) deleteVisMaterialToolHandle
diff --git a/src/OpenCascade/XCAFDoc/Internal/Destructors.hs b/src/OpenCascade/XCAFDoc/Internal/Destructors.hs
--- a/src/OpenCascade/XCAFDoc/Internal/Destructors.hs
+++ b/src/OpenCascade/XCAFDoc/Internal/Destructors.hs
@@ -1,10 +1,22 @@
 {-# LANGUAGE CApiFFI #-}
-module OpenCascade.XCAFDoc.Internal.Destructors 
-( deleteShapeToolHandle 
+module OpenCascade.XCAFDoc.Internal.Destructors
+( deleteShapeToolHandle
+, deleteColorToolHandle
+, deleteVisMaterialToolHandle
+, deleteVisMaterialHandle
+, deleteVisMaterialPBR
 ) where
 
 import OpenCascade.XCAFDoc.Types
 import OpenCascade.Handle
-import Foreign.Ptr 
+import Foreign.Ptr
 
 foreign import capi unsafe "hs_XCAFDoc_ShapeTool.h hs_delete_XCAFDoc_ShapeTool" deleteShapeToolHandle :: Ptr (Handle ShapeTool) -> IO ()
+
+foreign import capi unsafe "hs_XCAFDoc_ColorTool.h hs_delete_XCAFDoc_ColorTool" deleteColorToolHandle :: Ptr (Handle ColorTool) -> IO ()
+
+foreign import capi unsafe "hs_XCAFDoc_VisMaterialTool.h hs_delete_XCAFDoc_VisMaterialTool" deleteVisMaterialToolHandle :: Ptr (Handle VisMaterialTool) -> IO ()
+
+foreign import capi unsafe "hs_XCAFDoc_VisMaterial.h hs_delete_XCAFDoc_VisMaterial" deleteVisMaterialHandle :: Ptr (Handle VisMaterial) -> IO ()
+
+foreign import capi unsafe "hs_XCAFDoc_VisMaterialPBR.h hs_delete_XCAFDoc_VisMaterialPBR" deleteVisMaterialPBR :: Ptr VisMaterialPBR -> IO ()
diff --git a/src/OpenCascade/XCAFDoc/ShapeTool.hs b/src/OpenCascade/XCAFDoc/ShapeTool.hs
--- a/src/OpenCascade/XCAFDoc/ShapeTool.hs
+++ b/src/OpenCascade/XCAFDoc/ShapeTool.hs
@@ -2,6 +2,8 @@
 module OpenCascade.XCAFDoc.ShapeTool
 ( ShapeTool
 , addShape
+, addSubShape
+, findShape
 ) where
 
 import OpenCascade.XCAFDoc.Types (ShapeTool)
@@ -26,3 +28,29 @@
 
 addShape :: Ptr (Handle ShapeTool) -> Ptr TopoDS.Shape -> Bool -> Bool -> Acquire (Ptr Label)
 addShape tool shape makeAssembly makePrepare = mkAcquire (wrapException $ rawAddShape tool shape (boolToCBool makeAssembly) (boolToCBool makePrepare)) deleteLabel
+
+foreign import capi unsafe "hs_XCAFDoc_ShapeTool.h hs_XCAFDoc_ShapeTool_addSubShape" rawAddSubShape
+    :: Ptr (Handle ShapeTool)
+    -> Ptr Label
+    -> Ptr TopoDS.Shape
+    -> Ptr CInt
+    -> Ptr (Ptr ())
+    -> IO (Ptr Label)
+
+-- | the returned Label may be null
+-- if the sub shape is not valid for the shape at the given label
+addSubShape :: Ptr (Handle ShapeTool) -> Ptr Label -> Ptr TopoDS.Shape -> Acquire (Ptr Label)
+addSubShape tool shapeLabel subShape = mkAcquire (wrapException $ rawAddSubShape tool shapeLabel subShape) deleteLabel
+
+foreign import capi unsafe "hs_XCAFDoc_ShapeTool.h hs_XCAFDoc_ShapeTool_findShape" rawFindShape
+    :: Ptr (Handle ShapeTool)
+    -> Ptr TopoDS.Shape
+    -> CBool
+    -> Ptr CInt
+    -> Ptr (Ptr ())
+    -> IO (Ptr Label)
+
+-- | the returned Label may be null,
+-- if the shape is not in the document
+findShape :: Ptr (Handle ShapeTool) -> Ptr TopoDS.Shape -> Bool -> Acquire (Ptr Label)
+findShape tool shape findInstance = mkAcquire (wrapException $ rawFindShape tool shape (boolToCBool findInstance)) deleteLabel
diff --git a/src/OpenCascade/XCAFDoc/Types.hs b/src/OpenCascade/XCAFDoc/Types.hs
--- a/src/OpenCascade/XCAFDoc/Types.hs
+++ b/src/OpenCascade/XCAFDoc/Types.hs
@@ -1,6 +1,14 @@
 {-# LANGUAGE EmptyDataDecls #-}
-module OpenCascade.XCAFDoc.Types 
+module OpenCascade.XCAFDoc.Types
 ( ShapeTool
+, ColorTool
+, VisMaterialTool
+, VisMaterial
+, VisMaterialPBR
 ) where
 
 data ShapeTool
+data ColorTool
+data VisMaterialTool
+data VisMaterial
+data VisMaterialPBR
diff --git a/src/OpenCascade/XCAFDoc/VisMaterial.hs b/src/OpenCascade/XCAFDoc/VisMaterial.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/XCAFDoc/VisMaterial.hs
@@ -0,0 +1,66 @@
+{-# LANGUAGE CApiFFI #-}
+module OpenCascade.XCAFDoc.VisMaterial
+( VisMaterial
+, new
+, setPbrMaterial
+, setAlphaMode
+, setFaceCulling
+, setRawName
+) where
+
+import OpenCascade.XCAFDoc.Types (VisMaterial, VisMaterialPBR)
+import OpenCascade.XCAFDoc.Internal.Destructors (deleteVisMaterialHandle)
+import OpenCascade.Graphic3D.AlphaMode (AlphaMode)
+import OpenCascade.Graphic3D.TypeOfBackfacingModel (TypeOfBackfacingModel)
+import OpenCascade.Handle (Handle)
+import OpenCascade.Internal.Exception (wrapException)
+import Foreign.Ptr (Ptr)
+import Foreign.C (CDouble (..), CInt (..))
+import Foreign.C.String (CString, withCString)
+import Data.Acquire (Acquire, mkAcquire)
+
+foreign import capi unsafe "hs_XCAFDoc_VisMaterial.h hs_new_XCAFDoc_VisMaterial" rawNew :: IO (Ptr (Handle VisMaterial))
+
+new :: Acquire (Ptr (Handle VisMaterial))
+new = mkAcquire rawNew deleteVisMaterialHandle
+
+foreign import capi unsafe "hs_XCAFDoc_VisMaterial.h hs_XCAFDoc_VisMaterial_setPbrMaterial" rawSetPbrMaterial
+    :: Ptr (Handle VisMaterial)
+    -> Ptr VisMaterialPBR
+    -> Ptr CInt
+    -> Ptr (Ptr ())
+    -> IO ()
+
+setPbrMaterial :: Ptr (Handle VisMaterial) -> Ptr VisMaterialPBR -> IO ()
+setPbrMaterial material pbr = wrapException $ rawSetPbrMaterial material pbr
+
+foreign import capi unsafe "hs_XCAFDoc_VisMaterial.h hs_XCAFDoc_VisMaterial_setAlphaMode" rawSetAlphaMode
+    :: Ptr (Handle VisMaterial)
+    -> CInt
+    -> CDouble
+    -> Ptr CInt
+    -> Ptr (Ptr ())
+    -> IO ()
+
+setAlphaMode :: Ptr (Handle VisMaterial) -> AlphaMode -> Double -> IO ()
+setAlphaMode material mode cutOff = wrapException $ rawSetAlphaMode material (fromIntegral . fromEnum $ mode) (realToFrac cutOff)
+
+foreign import capi unsafe "hs_XCAFDoc_VisMaterial.h hs_XCAFDoc_VisMaterial_setFaceCulling" rawSetFaceCulling
+    :: Ptr (Handle VisMaterial)
+    -> CInt
+    -> Ptr CInt
+    -> Ptr (Ptr ())
+    -> IO ()
+
+setFaceCulling :: Ptr (Handle VisMaterial) -> TypeOfBackfacingModel -> IO ()
+setFaceCulling material faceCulling = wrapException $ rawSetFaceCulling material (fromIntegral . fromEnum $ faceCulling)
+
+foreign import capi unsafe "hs_XCAFDoc_VisMaterial.h hs_XCAFDoc_VisMaterial_setRawName" rawSetRawName
+    :: Ptr (Handle VisMaterial)
+    -> CString
+    -> Ptr CInt
+    -> Ptr (Ptr ())
+    -> IO ()
+
+setRawName :: Ptr (Handle VisMaterial) -> String -> IO ()
+setRawName material name = withCString name $ \str -> wrapException $ rawSetRawName material str
diff --git a/src/OpenCascade/XCAFDoc/VisMaterialPBR.hs b/src/OpenCascade/XCAFDoc/VisMaterialPBR.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/XCAFDoc/VisMaterialPBR.hs
@@ -0,0 +1,43 @@
+{-# LANGUAGE CApiFFI #-}
+module OpenCascade.XCAFDoc.VisMaterialPBR
+( VisMaterialPBR
+, new
+, setBaseColor
+, setMetallic
+, setRoughness
+, setEmissiveFactor
+, setRefractionIndex
+) where
+
+import OpenCascade.XCAFDoc.Types (VisMaterialPBR)
+import qualified OpenCascade.Quantity.Types as Quantity
+import qualified OpenCascade.NCollection.Types as NCollection
+import OpenCascade.XCAFDoc.Internal.Destructors (deleteVisMaterialPBR)
+import Foreign.Ptr (Ptr)
+import Foreign.C (CDouble (..))
+import Data.Acquire (Acquire, mkAcquire)
+import Data.Coerce (coerce)
+
+foreign import capi unsafe "hs_XCAFDoc_VisMaterialPBR.h hs_new_XCAFDoc_VisMaterialPBR" rawNew :: IO (Ptr VisMaterialPBR)
+
+new :: Acquire (Ptr VisMaterialPBR)
+new = mkAcquire rawNew deleteVisMaterialPBR
+
+foreign import capi unsafe "hs_XCAFDoc_VisMaterialPBR.h hs_XCAFDoc_VisMaterialPBR_setBaseColor" setBaseColor :: Ptr VisMaterialPBR -> Ptr Quantity.ColorRGBA -> IO ()
+
+foreign import capi unsafe "hs_XCAFDoc_VisMaterialPBR.h hs_XCAFDoc_VisMaterialPBR_setMetallic" rawSetMetallic :: Ptr VisMaterialPBR -> CDouble -> IO ()
+
+setMetallic :: Ptr VisMaterialPBR -> Double -> IO ()
+setMetallic = coerce rawSetMetallic
+
+foreign import capi unsafe "hs_XCAFDoc_VisMaterialPBR.h hs_XCAFDoc_VisMaterialPBR_setRoughness" rawSetRoughness :: Ptr VisMaterialPBR -> CDouble -> IO ()
+
+setRoughness :: Ptr VisMaterialPBR -> Double -> IO ()
+setRoughness = coerce rawSetRoughness
+
+foreign import capi unsafe "hs_XCAFDoc_VisMaterialPBR.h hs_XCAFDoc_VisMaterialPBR_setEmissiveFactor" setEmissiveFactor :: Ptr VisMaterialPBR -> Ptr (NCollection.Vec3 Float) -> IO ()
+
+foreign import capi unsafe "hs_XCAFDoc_VisMaterialPBR.h hs_XCAFDoc_VisMaterialPBR_setRefractionIndex" rawSetRefractionIndex :: Ptr VisMaterialPBR -> CDouble -> IO ()
+
+setRefractionIndex :: Ptr VisMaterialPBR -> Double -> IO ()
+setRefractionIndex = coerce rawSetRefractionIndex
diff --git a/src/OpenCascade/XCAFDoc/VisMaterialTool.hs b/src/OpenCascade/XCAFDoc/VisMaterialTool.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/XCAFDoc/VisMaterialTool.hs
@@ -0,0 +1,52 @@
+{-# LANGUAGE CApiFFI #-}
+module OpenCascade.XCAFDoc.VisMaterialTool
+( VisMaterialTool
+, addMaterial
+, setShapeMaterial
+, setShapeMaterialFromShape
+) where
+
+import OpenCascade.XCAFDoc.Types (VisMaterialTool, VisMaterial)
+import qualified OpenCascade.TopoDS.Types as TopoDS
+import OpenCascade.Handle (Handle)
+import OpenCascade.TDF.Types (Label)
+import OpenCascade.TDF.Internal.Destructors (deleteLabel)
+import OpenCascade.Internal.Bool (cBoolToBool)
+import OpenCascade.Internal.Exception (wrapException)
+import Data.Acquire (Acquire, mkAcquire)
+import Foreign.C (CBool (..), CInt)
+import Foreign.C.String (CString, withCString)
+import Foreign.Ptr (Ptr)
+
+foreign import capi unsafe "hs_XCAFDoc_VisMaterialTool.h hs_XCAFDoc_VisMaterialTool_addMaterial" rawAddMaterial
+    :: Ptr (Handle VisMaterialTool)
+    -> Ptr (Handle VisMaterial)
+    -> CString
+    -> Ptr CInt
+    -> Ptr (Ptr ())
+    -> IO (Ptr Label)
+
+addMaterial :: Ptr (Handle VisMaterialTool) -> Ptr (Handle VisMaterial) -> String -> Acquire (Ptr Label)
+addMaterial tool material name = mkAcquire (withCString name $ \str -> wrapException $ rawAddMaterial tool material str) deleteLabel
+
+foreign import capi unsafe "hs_XCAFDoc_VisMaterialTool.h hs_XCAFDoc_VisMaterialTool_setShapeMaterial" rawSetShapeMaterial
+    :: Ptr (Handle VisMaterialTool)
+    -> Ptr Label
+    -> Ptr Label
+    -> Ptr CInt
+    -> Ptr (Ptr ())
+    -> IO ()
+
+setShapeMaterial :: Ptr (Handle VisMaterialTool) -> Ptr Label -> Ptr Label -> IO ()
+setShapeMaterial tool shapeLabel materialLabel = wrapException $ rawSetShapeMaterial tool shapeLabel materialLabel
+
+foreign import capi unsafe "hs_XCAFDoc_VisMaterialTool.h hs_XCAFDoc_VisMaterialTool_setShapeMaterialFromShape" rawSetShapeMaterialFromShape
+    :: Ptr (Handle VisMaterialTool)
+    -> Ptr TopoDS.Shape
+    -> Ptr Label
+    -> Ptr CInt
+    -> Ptr (Ptr ())
+    -> IO CBool
+
+setShapeMaterialFromShape :: Ptr (Handle VisMaterialTool) -> Ptr TopoDS.Shape -> Ptr Label -> IO Bool
+setShapeMaterialFromShape tool shape materialLabel = cBoolToBool <$> wrapException (rawSetShapeMaterialFromShape tool shape materialLabel)
