diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -8,6 +8,32 @@
 
 ## Unreleased
 
+## 0.2.2.0
+
+### Fixed
+
+- Fix `OpenCascade.GProps.fromSystemLocation`
+
+### Added 
+
+- Added OpenCascade.StlAPI.Reader
+- Added OpenCascade.ShapeFix.Solid
+- Added OpenCascade.ShapeExtend.Status
+- Added OpenCascade.STEPControl.Reader
+- Added OpenCascade.XSControl.Reader
+- Added OpenCascade.RWGltf.CafReader
+- Added OpenCascade.RWMesh.CafReader
+- Added OpenCascade.TopoDS.Builder
+- Added OpenCascade.BRepBuilderAPI.Copy
+- Added OpenCascade.BRepBuilderAPI.Sewing
+- Added OpenCascade.Poly.Triangulation
+- Added OpenCascade.Poly.Triangle
+- Added OpenCascade.BRep.Tool.triangulation
+- Added OpenCascade.BRepBuilderAPI.MakePolygon
+- Added OpenCascade.RWObj.CafWriter
+- Added OpenCascade.RWObj.CafReader
+- Added OpenCascade.BRepLib (orientClosedSolid)
+
 ## 0.2.1.0
 
 ### Added
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -1,5 +1,7 @@
 # OpenCASCADE-hs
 
+![OpenCASCADE-hs](https://raw.githubusercontent.com/joe-warren/opencascade-hs/main/images/logo/opencascade-hs-logo-name.svg)
+
 A third party Haskell wrapper to [Open CASCADE](https://dev.opencascade.org) ([wiki](https://en.wikipedia.org/wiki/Open_Cascade_Technology)), which is the underlying framework behind [FreeCAD](https://www.freecad.org/).
 
 The API is only partially complete, and largely consists of the modeling functionality (BRep/Boolean Ops/Curves/etc), ignoring the visualization components. 
diff --git a/cpp/hs_BRepBuilderAPI_Copy.cpp b/cpp/hs_BRepBuilderAPI_Copy.cpp
new file mode 100644
--- /dev/null
+++ b/cpp/hs_BRepBuilderAPI_Copy.cpp
@@ -0,0 +1,6 @@
+#include <BRepBuilderAPI_Copy.hxx>
+#include "hs_BRepBuilderAPI_Copy.h"
+
+TopoDS_Shape * hs_BRepBuilderAPI_Copy_copy(TopoDS_Shape *shape, bool copyGeom, bool copyMesh){
+    return new TopoDS_Shape(BRepBuilderAPI_Copy(*shape, copyGeom, copyMesh).Shape());
+}
diff --git a/cpp/hs_BRepBuilderAPI_Copy.h b/cpp/hs_BRepBuilderAPI_Copy.h
new file mode 100644
--- /dev/null
+++ b/cpp/hs_BRepBuilderAPI_Copy.h
@@ -0,0 +1,19 @@
+
+#ifndef HS_BREPBUILDERAPI_COPY_H
+#define HS_BREPBUILDERAPI_COPY_H
+
+#include "hs_types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+TopoDS_Shape * hs_BRepBuilderAPI_Copy_copy(TopoDS_Shape *shape, bool copyGeom, bool copyMesh);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // BREPBUILDERAPI_COPY
+
+
diff --git a/cpp/hs_BRepBuilderAPI_MakePolygon.cpp b/cpp/hs_BRepBuilderAPI_MakePolygon.cpp
new file mode 100644
--- /dev/null
+++ b/cpp/hs_BRepBuilderAPI_MakePolygon.cpp
@@ -0,0 +1,8 @@
+#include <BRepBuilderAPI_MakePolygon.hxx>
+#include <TopoDS_Wire.hxx>
+#include "hs_BRepBuilderAPI_MakePolygon.h"
+
+TopoDS_Wire * hs_BRepBuilderAPI_MakePolygon_from3Pnts(gp_Pnt * n1, gp_Pnt *n2, gp_Pnt * n3, bool close){
+    auto builder = BRepBuilderAPI_MakePolygon(*n1, *n2, *n3, close);
+    return new TopoDS_Wire(builder.Wire());
+}
diff --git a/cpp/hs_BRepBuilderAPI_MakePolygon.h b/cpp/hs_BRepBuilderAPI_MakePolygon.h
new file mode 100644
--- /dev/null
+++ b/cpp/hs_BRepBuilderAPI_MakePolygon.h
@@ -0,0 +1,16 @@
+#ifndef HS_BREPBUILDERAPI_MAKEPOLYGON_H
+#define HS_BREPBUILDERAPI_MAKEPOLYGON_H
+
+#include "hs_types.h"
+
+#ifdef __cplusplus
+    extern "C" {
+#endif
+
+TopoDS_Wire * hs_BRepBuilderAPI_MakePolygon_from3Pnts(gp_Pnt * n1, gp_Pnt *n2, gp_Pnt * n3, bool close);
+
+#ifdef __cplusplus
+    }
+#endif
+
+#endif // HS_BREPBUILDERAPI_MAKEPOLYGON_H
diff --git a/cpp/hs_BRepBuilderAPI_Sewing.cpp b/cpp/hs_BRepBuilderAPI_Sewing.cpp
new file mode 100644
--- /dev/null
+++ b/cpp/hs_BRepBuilderAPI_Sewing.cpp
@@ -0,0 +1,40 @@
+#include <BRepBuilderAPI_Sewing.hxx>
+#include "hs_BRepBuilderAPI_Sewing.h"
+
+BRepBuilderAPI_Sewing * hs_new_BRepBuilderAPI_Sewing(double tolerance , bool option1, bool option2, bool option3, bool option4){
+    return new BRepBuilderAPI_Sewing(tolerance, option1, option2, option3, option4);
+}
+
+void hs_delete_BRepBuilderAPI_Sewing(BRepBuilderAPI_Sewing * builder){
+    delete builder;
+}
+
+void hs_BRepBuilderAPI_Sewing_load(BRepBuilderAPI_Sewing * builder, TopoDS_Shape * shape){
+    builder->Load(*shape);
+}
+
+void hs_BRepBuilderAPI_Sewing_add(BRepBuilderAPI_Sewing * builder, TopoDS_Shape * shape){
+    builder->Add(*shape);
+}
+
+void hs_BRepBuilderAPI_Sewing_perform(BRepBuilderAPI_Sewing * builder){
+    builder->Perform();
+}
+
+TopoDS_Shape * hs_BRepBuilderAPI_Sewing_sewedShape(BRepBuilderAPI_Sewing * builder){
+    return new TopoDS_Shape(builder->SewedShape());
+}
+
+
+int hs_BRepBuilderAPI_Sewing_nbFreeEdges(BRepBuilderAPI_Sewing * builder){
+    return builder->NbFreeEdges();
+}
+
+
+int hs_BRepBuilderAPI_Sewing_nbContigousEdges(BRepBuilderAPI_Sewing * builder){
+    return builder->NbContigousEdges();
+}
+
+int hs_BRepBuilderAPI_Sewing_nbMultipleEdges(BRepBuilderAPI_Sewing * builder){
+    return builder->NbMultipleEdges();
+}
diff --git a/cpp/hs_BRepBuilderAPI_Sewing.h b/cpp/hs_BRepBuilderAPI_Sewing.h
new file mode 100644
--- /dev/null
+++ b/cpp/hs_BRepBuilderAPI_Sewing.h
@@ -0,0 +1,32 @@
+#ifndef HS_BREPBUILDERAPI_SEWING_H
+#define HS_BREPBUILDERAPI_SEWING_H
+
+#include "hs_types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+BRepBuilderAPI_Sewing * hs_new_BRepBuilderAPI_Sewing(double tolerance , bool option1, bool option2, bool option3, bool option4);
+
+void hs_delete_BRepBuilderAPI_Sewing(BRepBuilderAPI_Sewing * builder);
+
+void hs_BRepBuilderAPI_Sewing_load(BRepBuilderAPI_Sewing * builder, TopoDS_Shape * shape);
+
+void hs_BRepBuilderAPI_Sewing_add(BRepBuilderAPI_Sewing * builder, TopoDS_Shape * shape);
+
+void hs_BRepBuilderAPI_Sewing_perform(BRepBuilderAPI_Sewing * builder);
+
+TopoDS_Shape * hs_BRepBuilderAPI_Sewing_sewedShape(BRepBuilderAPI_Sewing * builder);
+
+int hs_BRepBuilderAPI_Sewing_nbFreeEdges(BRepBuilderAPI_Sewing * builder);
+
+int hs_BRepBuilderAPI_Sewing_nbContigousEdges(BRepBuilderAPI_Sewing * builder);
+
+int hs_BRepBuilderAPI_Sewing_nbMultipleEdges(BRepBuilderAPI_Sewing * builder);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // HS_BREPBUILDERAPI_SEWING_H
diff --git a/cpp/hs_BRepLib.cpp b/cpp/hs_BRepLib.cpp
new file mode 100644
--- /dev/null
+++ b/cpp/hs_BRepLib.cpp
@@ -0,0 +1,6 @@
+#include <BRepLib.hxx>
+#include "hs_BRepLib.h"
+
+bool hs_BRepLib_orientClosedSolid(TopoDS_Solid * solid){
+    return BRepLib::OrientClosedSolid(*solid);
+}
diff --git a/cpp/hs_BRepLib.h b/cpp/hs_BRepLib.h
new file mode 100644
--- /dev/null
+++ b/cpp/hs_BRepLib.h
@@ -0,0 +1,16 @@
+#ifndef HS_BREPLIB_H
+#define HS_BREPLIB_H
+
+#include "hs_types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+bool hs_BRepLib_orientClosedSolid(TopoDS_Solid * solid);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // HS_BREPLIB_H
diff --git a/cpp/hs_BRep_Tool.cpp b/cpp/hs_BRep_Tool.cpp
--- a/cpp/hs_BRep_Tool.cpp
+++ b/cpp/hs_BRep_Tool.cpp
@@ -19,4 +19,8 @@
     return e;
 } 
 
+Handle(Poly_Triangulation) * hs_BRep_Tool_triangulation(TopoDS_Face * face, TopLoc_Location * loc){
+    return new opencascade::handle<Poly_Triangulation>(BRep_Tool::Triangulation(*face, *loc));
+}
+
 
diff --git a/cpp/hs_BRep_Tool.h b/cpp/hs_BRep_Tool.h
--- a/cpp/hs_BRep_Tool.h
+++ b/cpp/hs_BRep_Tool.h
@@ -13,6 +13,8 @@
 
 double hs_BRep_Tool_curveParamLast(TopoDS_Edge * edge);
 
+Handle(Poly_Triangulation) * hs_BRep_Tool_triangulation(TopoDS_Face * face, TopLoc_Location * loc);
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/cpp/hs_GC_MakeArcOfCircle.cpp b/cpp/hs_GC_MakeArcOfCircle.cpp
--- a/cpp/hs_GC_MakeArcOfCircle.cpp
+++ b/cpp/hs_GC_MakeArcOfCircle.cpp
@@ -8,3 +8,4 @@
 Handle(Geom_TrimmedCurve) * hs_GC_MakeArcOfCircle_fromPntsAndVec(gp_Pnt * a, gp_Vec * b, gp_Pnt * c){
     return new opencascade::handle(GC_MakeArcOfCircle(*a, *b, *c).Value());
 }
+
diff --git a/cpp/hs_Poly_Triangle.cpp b/cpp/hs_Poly_Triangle.cpp
new file mode 100644
--- /dev/null
+++ b/cpp/hs_Poly_Triangle.cpp
@@ -0,0 +1,18 @@
+#include <Poly_Triangle.hxx>
+#include "hs_Poly_Triangle.h"
+
+Poly_Triangle * hs_new_Poly_Triangle_fromIndices(int n1, int n2, int n3){
+    return new Poly_Triangle(n1, n2, n3);
+}
+
+void hs_delete_Poly_Triangle(Poly_Triangle * triangle){
+    delete triangle;
+}
+
+int hs_Poly_Triangle_value(Poly_Triangle * triangle, int index){
+    return triangle->Value(index);
+}
+
+void hs_Poly_Triangle_setValue(Poly_Triangle * triangle, int index, int node){
+    triangle->Set(index, node);
+}
diff --git a/cpp/hs_Poly_Triangle.h b/cpp/hs_Poly_Triangle.h
new file mode 100644
--- /dev/null
+++ b/cpp/hs_Poly_Triangle.h
@@ -0,0 +1,22 @@
+#ifndef HS_POLY_TRIANGLE_H
+#define HS_POLY_TRIANGLE_H
+
+#include "hs_types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+Poly_Triangle * hs_new_Poly_Triangle_fromIndices(int n1, int n2, int n3);
+
+void hs_delete_Poly_Triangle(Poly_Triangle * triangle);
+
+int hs_Poly_Triangle_value(Poly_Triangle * triangle, int index);
+
+void hs_Poly_Triangle_setValue(Poly_Triangle * triangle, int index, int node);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // HS_POLY_TRIANGLE_H
diff --git a/cpp/hs_Poly_Triangulation.cpp b/cpp/hs_Poly_Triangulation.cpp
new file mode 100644
--- /dev/null
+++ b/cpp/hs_Poly_Triangulation.cpp
@@ -0,0 +1,35 @@
+#include <Poly_Triangulation.hxx>
+#include "hs_Poly_Triangulation.h"
+
+Handle(Poly_Triangulation) * hs_new_Poly_Triangulation(int nbNodes, int nbTriangles, bool hasUVNodes, bool hasNormals){
+    return new opencascade::handle<Poly_Triangulation>(new Poly_Triangulation(nbNodes, nbTriangles, hasUVNodes, hasNormals));
+}
+
+void hs_delete_Poly_Triangulation(Handle(Poly_Triangulation) * triangulation){
+    delete triangulation;
+}
+
+int hs_Poly_Triangulation_nbNodes(Handle(Poly_Triangulation) * triangulation){
+    return triangulation->get()->NbNodes();
+}
+
+int hs_Poly_Triangulation_nbTriangles(Handle(Poly_Triangulation) * triangulation){
+    return triangulation->get()->NbTriangles();
+}
+
+
+gp_Pnt * hs_Poly_Triangulation_node(Handle(Poly_Triangulation) * triangulation, int index){
+    return new gp_Pnt(triangulation->get()->Node(index));
+}
+
+void hs_Poly_Triangulation_setNode(Handle(Poly_Triangulation) * triangulation, int index, gp_Pnt * pnt){
+    triangulation->get()->SetNode(index, *pnt);
+}
+
+Poly_Triangle * hs_Poly_Triangulation_triangle(Handle(Poly_Triangulation) * triangulation, int index){
+    return new Poly_Triangle(triangulation->get()->Triangle(index));
+}
+
+void hs_Poly_Triangulation_setTriangle(Handle(Poly_Triangulation) * triangulation, int index, Poly_Triangle * triangle){
+    triangulation->get()->SetTriangle(index, *triangle);
+}
diff --git a/cpp/hs_Poly_Triangulation.h b/cpp/hs_Poly_Triangulation.h
new file mode 100644
--- /dev/null
+++ b/cpp/hs_Poly_Triangulation.h
@@ -0,0 +1,30 @@
+#ifndef HS_POLY_TRIANGULATION_H
+#define HS_POLY_TRIANGULATION_H
+
+#include "hs_types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+Handle(Poly_Triangulation) * hs_new_Poly_Triangulation(int nbNodes, int nbTriangles, bool hasUVNodes, bool hasNormals);
+
+void hs_delete_Poly_Triangulation(Handle(Poly_Triangulation) * triangulation);
+
+int hs_Poly_Triangulation_nbNodes(Handle(Poly_Triangulation) * triangulation);
+
+int hs_Poly_Triangulation_nbTriangles(Handle(Poly_Triangulation) * triangulation);
+
+gp_Pnt * hs_Poly_Triangulation_node(Handle(Poly_Triangulation) * triangulation, int index);
+
+void hs_Poly_Triangulation_setNode(Handle(Poly_Triangulation) * triangulation, int index, gp_Pnt * pnt);
+
+Poly_Triangle * hs_Poly_Triangulation_triangle(Handle(Poly_Triangulation) * triangulation, int index);
+
+void hs_Poly_Triangulation_setTriangle(Handle(Poly_Triangulation) * triangulation, int index, Poly_Triangle * triangle);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // HS_POLY_TRIANGULATION_H
diff --git a/cpp/hs_RWGltf_CafReader.cpp b/cpp/hs_RWGltf_CafReader.cpp
new file mode 100644
--- /dev/null
+++ b/cpp/hs_RWGltf_CafReader.cpp
@@ -0,0 +1,14 @@
+#include <RWGltf_CafReader.hxx>
+#include "hs_RWGltf_CafReader.h"
+
+RWGltf_CafReader * hs_new_RWGltf_CafReader(void){
+    return new RWGltf_CafReader();
+}
+
+void hs_RWGltf_CafReader_setDoublePrecision(RWGltf_CafReader *reader, bool isDouble){
+    reader->SetDoublePrecision(isDouble);
+}
+
+void hs_delete_RWGltf_CafReader(RWGltf_CafReader *reader){
+    delete reader;
+}
diff --git a/cpp/hs_RWGltf_CafReader.h b/cpp/hs_RWGltf_CafReader.h
new file mode 100644
--- /dev/null
+++ b/cpp/hs_RWGltf_CafReader.h
@@ -0,0 +1,20 @@
+#ifndef HS_RWGLTF_CAFREADER_H
+#define HS_RWGLTF_CAFREADER_H
+
+#include "hs_types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+RWGltf_CafReader * hs_new_RWGltf_CafReader(void);
+
+void hs_RWGltf_CafReader_setDoublePrecision(RWGltf_CafReader *reader, bool isDouble);
+
+void hs_delete_RWGltf_CafReader(RWGltf_CafReader *reader);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // HS_RWGLTF_CAFREADER_H
diff --git a/cpp/hs_RWMesh_CafReader.cpp b/cpp/hs_RWMesh_CafReader.cpp
new file mode 100644
--- /dev/null
+++ b/cpp/hs_RWMesh_CafReader.cpp
@@ -0,0 +1,18 @@
+#include <RWMesh_CafReader.hxx>
+#include "hs_RWMesh_CafReader.h"
+
+void hs_RWMesh_CafReader_setDocument(RWMesh_CafReader * reader, Handle(TDocStd_Document) * document){
+    reader->SetDocument(*document);
+}
+
+void hs_RWMesh_CafReader_setFileLengthUnit(RWMesh_CafReader * reader, double scale){
+    reader->SetFileLengthUnit(scale);
+}
+
+TopoDS_Shape * hs_RWMesh_CafReader_singleShape(RWMesh_CafReader * reader){
+    return new TopoDS_Shape(reader->SingleShape());
+}
+
+bool hs_RWMesh_CafReader_perform(RWMesh_CafReader * reader, char * filename, Message_ProgressRange * progress){
+    return reader->Perform(filename, *progress);
+}
diff --git a/cpp/hs_RWMesh_CafReader.h b/cpp/hs_RWMesh_CafReader.h
new file mode 100644
--- /dev/null
+++ b/cpp/hs_RWMesh_CafReader.h
@@ -0,0 +1,22 @@
+#ifndef HS_RWMESH_CAFREADER_H
+#define HS_RWMESH_CAFREADER_H
+
+#include "hs_types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void hs_RWMesh_CafReader_setDocument(RWMesh_CafReader * reader, Handle(TDocStd_Document) * document);
+
+void hs_RWMesh_CafReader_setFileLengthUnit(RWMesh_CafReader * reader, double scale);
+
+TopoDS_Shape * hs_RWMesh_CafReader_singleShape(RWMesh_CafReader * reader);
+
+bool hs_RWMesh_CafReader_perform(RWMesh_CafReader * reader, char * filename, Message_ProgressRange * progress);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // HS_RWMESH_CAFREADER_H
diff --git a/cpp/hs_RWObj_CafReader.cpp b/cpp/hs_RWObj_CafReader.cpp
new file mode 100644
--- /dev/null
+++ b/cpp/hs_RWObj_CafReader.cpp
@@ -0,0 +1,14 @@
+#include <RWObj_CafReader.hxx>
+#include "hs_RWObj_CafReader.h"
+
+RWObj_CafReader * hs_new_RWObj_CafReader(void){
+    return new RWObj_CafReader();
+}
+
+void hs_RWObj_CafReader_setSinglePrecision(RWObj_CafReader *reader, bool isSingle){
+    reader->SetSinglePrecision(isSingle);
+}
+
+void hs_delete_RWObj_CafReader(RWObj_CafReader *reader){
+    delete reader;
+}
diff --git a/cpp/hs_RWObj_CafReader.h b/cpp/hs_RWObj_CafReader.h
new file mode 100644
--- /dev/null
+++ b/cpp/hs_RWObj_CafReader.h
@@ -0,0 +1,20 @@
+#ifndef HS_RWOBJ_CAFREADER_H
+#define HS_RWOBJ_CAFREADER_H
+
+#include "hs_types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+RWObj_CafReader * hs_new_RWObj_CafReader(void);
+
+void hs_RWObj_CafReader_setSinglePrecision(RWObj_CafReader *reader, bool isSingle);
+
+void hs_delete_RWObj_CafReader(RWObj_CafReader *reader);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // HS_RWOBJ_CAFREADER_H
diff --git a/cpp/hs_RWObj_CafWriter.cpp b/cpp/hs_RWObj_CafWriter.cpp
new file mode 100644
--- /dev/null
+++ b/cpp/hs_RWObj_CafWriter.cpp
@@ -0,0 +1,14 @@
+#include <RWObj_CafWriter.hxx>
+#include "hs_RWObj_CafWriter.h"
+
+RWObj_CafWriter * hs_new_RWObj_CafWriter(char * filename){
+    return new RWObj_CafWriter(filename);
+}
+
+void hs_delete_RWObj_CafWriter(RWObj_CafWriter * writer){
+    delete writer;
+}
+
+void hs_RWObj_CafWriter_Perform(RWObj_CafWriter * theWriter, Handle(TDocStd_Document) * theDocument, TColStd_IndexedDataMapOfStringString * theFileInfo, Message_ProgressRange * theProgress){
+    theWriter->Perform(*theDocument, *theFileInfo, *theProgress);
+}
diff --git a/cpp/hs_RWObj_CafWriter.h b/cpp/hs_RWObj_CafWriter.h
new file mode 100644
--- /dev/null
+++ b/cpp/hs_RWObj_CafWriter.h
@@ -0,0 +1,20 @@
+#ifndef HS_RWOBJ_CAFWRITER_H
+#define HS_RWOBJ_CAFWRITER_H
+
+#include "hs_types.h"
+
+#ifdef __cplusplus
+    extern "C" {
+#endif
+
+RWObj_CafWriter * hs_new_RWObj_CafWriter(char * theFile);
+
+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);
+
+#ifdef __cplusplus
+    }
+#endif
+
+#endif // HS_RWOBJ_CAFWRITER_H
diff --git a/cpp/hs_STEPControl_Reader.cpp b/cpp/hs_STEPControl_Reader.cpp
new file mode 100644
--- /dev/null
+++ b/cpp/hs_STEPControl_Reader.cpp
@@ -0,0 +1,10 @@
+#include <STEPControl_Reader.hxx>
+#include "hs_STEPControl_Reader.h"
+
+STEPControl_Reader * hs_new_STEPControl_Reader(void){
+    return new STEPControl_Reader();
+}
+
+void hs_delete_STEPControl_Reader(STEPControl_Reader * reader){
+    delete reader;
+}
diff --git a/cpp/hs_STEPControl_Reader.h b/cpp/hs_STEPControl_Reader.h
new file mode 100644
--- /dev/null
+++ b/cpp/hs_STEPControl_Reader.h
@@ -0,0 +1,18 @@
+#ifndef HS_STEPCONTROL_READER_H
+#define HS_STEPCONTROL_READER_H
+
+#include "hs_types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+STEPControl_Reader * hs_new_STEPControl_Reader(void);
+
+void hs_delete_STEPControl_Reader(STEPControl_Reader * reader);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // HS_STEPCONTROL_READER_H
diff --git a/cpp/hs_ShapeFix_Solid.cpp b/cpp/hs_ShapeFix_Solid.cpp
new file mode 100644
--- /dev/null
+++ b/cpp/hs_ShapeFix_Solid.cpp
@@ -0,0 +1,32 @@
+#include <Message_ProgressRange.hxx>
+#include <ShapeFix_Solid.hxx>
+#include <TopoDS_Solid.hxx>
+#include "hs_ShapeFix_Solid.h"
+
+ShapeFix_Solid * hs_new_ShapeFix_Solid(){
+    return new ShapeFix_Solid();
+}
+
+ShapeFix_Solid * hs_new_ShapeFix_Solid_fromSolid(TopoDS_Solid * solid){
+    return new ShapeFix_Solid(*solid);
+}
+
+void hs_delete_ShapeFix_Solid(ShapeFix_Solid * shapeFix){
+    delete shapeFix;
+}
+
+TopoDS_Solid * hs_ShapeFix_Solid_solidFromShell(ShapeFix_Solid * shapeFix, TopoDS_Shell * shell){
+    return new TopoDS_Solid(shapeFix->SolidFromShell(*shell));
+}
+
+bool hs_ShapeFix_Solid_perform(ShapeFix_Solid * shapeFix, Message_ProgressRange * progress){
+    return shapeFix->Perform(*progress);
+}
+
+TopoDS_Shape * hs_ShapeFix_Solid_solid(ShapeFix_Solid * shapeFix){
+    return new TopoDS_Shape(shapeFix->Solid());
+}
+
+bool hs_ShapeFix_Solid_status(ShapeFix_Solid * shapeFix, ShapeExtend_Status status){
+    return shapeFix->Status(status);
+}
diff --git a/cpp/hs_ShapeFix_Solid.h b/cpp/hs_ShapeFix_Solid.h
new file mode 100644
--- /dev/null
+++ b/cpp/hs_ShapeFix_Solid.h
@@ -0,0 +1,28 @@
+#ifndef HS_SHAPEFIX_SOLID_H
+#define HS_SHAPEFIX_SOLID_H
+
+#include "hs_types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+ShapeFix_Solid * hs_new_ShapeFix_Solid();
+
+ShapeFix_Solid * hs_new_ShapeFix_Solid_fromSolid(TopoDS_Solid * solid);
+
+void hs_delete_ShapeFix_Solid(ShapeFix_Solid * shapeFix);
+
+TopoDS_Solid * hs_ShapeFix_Solid_solidFromShell(ShapeFix_Solid * shapeFix, TopoDS_Shell * shell);
+
+bool hs_ShapeFix_Solid_perform(ShapeFix_Solid * shapeFix, Message_ProgressRange * progress);
+
+TopoDS_Shape * hs_ShapeFix_Solid_solid(ShapeFix_Solid * shapeFix);
+
+bool hs_ShapeFix_Solid_status(ShapeFix_Solid * shapeFix, ShapeExtend_Status status);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // HS_SHAPEFIX_SOLID_H
diff --git a/cpp/hs_StlAPI_Reader.cpp b/cpp/hs_StlAPI_Reader.cpp
new file mode 100644
--- /dev/null
+++ b/cpp/hs_StlAPI_Reader.cpp
@@ -0,0 +1,18 @@
+#include <StlAPI_Writer.hxx>
+#include "hs_StlAPI_Writer.h"
+
+StlAPI_Writer * hs_new_StlAPI_Writer(){
+    return new StlAPI_Writer();
+}
+
+void hs_delete_StlAPI_Writer(StlAPI_Writer * writer){
+    delete writer;
+}
+
+void hs_StlAPI_Writer_setAsciiMode(StlAPI_Writer * writer, bool asciiMode){
+    writer->ASCIIMode() = asciiMode;
+}
+
+bool hs_StlAPI_Writer_write(StlAPI_Writer * writer, TopoDS_Shape * shape, char* filename){
+    return writer->Write(*shape, filename);
+} 
diff --git a/cpp/hs_StlAPI_Reader.h b/cpp/hs_StlAPI_Reader.h
new file mode 100644
--- /dev/null
+++ b/cpp/hs_StlAPI_Reader.h
@@ -0,0 +1,22 @@
+
+#ifndef HS_STLAPI_READER_H
+#define HS_STLAPI_READER_H
+
+#include "hs_types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+StlAPI_Reader * hs_new_StlAPI_Reader();
+
+void hs_delete_StlAPI_Reader(StlAPI_Reader * reader);
+
+bool hs_StlAPI_Reader_read(StlAPI_Reader * reader, TopoDS_Shape * shape, char* filename);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // HS_STLAPI_READER_H
diff --git a/cpp/hs_StlAPI_Writer.cpp b/cpp/hs_StlAPI_Writer.cpp
--- a/cpp/hs_StlAPI_Writer.cpp
+++ b/cpp/hs_StlAPI_Writer.cpp
@@ -1,18 +1,14 @@
-#include <StlAPI_Writer.hxx>
-#include "hs_StlAPI_Writer.h"
-
-StlAPI_Writer * hs_new_StlAPI_Writer(){
-    return new StlAPI_Writer();
-}
+#include <StlAPI_Reader.hxx>
+#include "hs_StlAPI_Reader.h"
 
-void hs_delete_StlAPI_Writer(StlAPI_Writer * writer){
-    delete writer;
+StlAPI_Reader * hs_new_StlAPI_Reader(){
+    return new StlAPI_Reader();
 }
 
-void hs_StlAPI_Writer_setAsciiMode(StlAPI_Writer * writer, bool asciiMode){
-    writer->ASCIIMode() = asciiMode;
+void hs_delete_StlAPI_Reader(StlAPI_Reader * reader){
+    delete reader;
 }
 
-bool hs_StlAPI_Writer_write(StlAPI_Writer * writer, TopoDS_Shape * shape, char* filename){
-    return writer->Write(*shape, filename);
+bool hs_StlAPI_Reader_read(StlAPI_Reader * reader, TopoDS_Shape * shape, char* filename){
+    return reader->Read(*shape, filename);
 } 
diff --git a/cpp/hs_TopoDS_Builder.cpp b/cpp/hs_TopoDS_Builder.cpp
new file mode 100644
--- /dev/null
+++ b/cpp/hs_TopoDS_Builder.cpp
@@ -0,0 +1,44 @@
+#include <TopoDS_Builder.hxx>
+#include "hs_TopoDS_Builder.h"
+
+TopoDS_Builder * hs_new_TopoDS_Builder(void){
+    return new TopoDS_Builder();
+}
+
+void hs_delete_TopoDS_Builder(TopoDS_Builder * builder){
+    delete builder;
+}
+
+
+void hs_TopoDS_Builder_makeWire(TopoDS_Builder * builder, TopoDS_Wire * wire){
+    builder->MakeWire(*wire);
+}
+
+
+void hs_TopoDS_Builder_makeShell(TopoDS_Builder * builder, TopoDS_Shell * shell){
+    builder->MakeShell(*shell);
+}
+
+void hs_TopoDS_Builder_makeSolid(TopoDS_Builder * builder, TopoDS_Solid * solid){
+    builder->MakeSolid(*solid);
+}
+
+void hs_TopoDS_Builder_makeCompSolid(TopoDS_Builder * builder, TopoDS_CompSolid * solid){
+    builder->MakeCompSolid(*solid);
+}
+
+void hs_TopoDS_Builder_makeCompound(TopoDS_Builder * builder, TopoDS_Compound * compound){
+    builder->MakeCompound(*compound);
+}
+
+void hs_TopoDS_Builder_add(TopoDS_Builder * builder, TopoDS_Shape * s, TopoDS_Shape * c){
+    builder->Add(*s, *c);
+}
+
+void hs_TopoDS_Builder_remove(TopoDS_Builder * builder, TopoDS_Shape * s, TopoDS_Shape * c){
+    builder->Remove(*s, *c);
+}
+
+
+
+
diff --git a/cpp/hs_TopoDS_Builder.h b/cpp/hs_TopoDS_Builder.h
new file mode 100644
--- /dev/null
+++ b/cpp/hs_TopoDS_Builder.h
@@ -0,0 +1,34 @@
+#ifndef HS_TOPODS_BUILDER_H
+#define HS_TOPODS_BUILDER_H
+
+#include "hs_types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+TopoDS_Builder * hs_new_TopoDS_Builder(void);
+
+void hs_delete_TopoDS_Builder(TopoDS_Builder * builder);
+
+void hs_TopoDS_Builder_makeWire(TopoDS_Builder * builder, TopoDS_Wire * wire);
+
+void hs_TopoDS_Builder_makeShell(TopoDS_Builder * builder, TopoDS_Shell * shell);
+
+void hs_TopoDS_Builder_makeSolid(TopoDS_Builder * builder, TopoDS_Solid * solid);
+
+void hs_TopoDS_Builder_makeCompSolid(TopoDS_Builder * builder, TopoDS_CompSolid * solid);
+
+void hs_TopoDS_Builder_makeCompound(TopoDS_Builder * builder, TopoDS_Compound * compound);
+
+void hs_TopoDS_Builder_add(TopoDS_Builder * builder, TopoDS_Shape * s, TopoDS_Shape * c);
+
+void hs_TopoDS_Builder_remove(TopoDS_Builder * builder, TopoDS_Shape * s, TopoDS_Shape * c);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // HS_TOPODS_BUILDER_H
+
+
diff --git a/cpp/hs_XSControl_Reader.cpp b/cpp/hs_XSControl_Reader.cpp
new file mode 100644
--- /dev/null
+++ b/cpp/hs_XSControl_Reader.cpp
@@ -0,0 +1,14 @@
+#include <XSControl_Reader.hxx>
+#include "hs_XSControl_Reader.h"
+
+IFSelect_ReturnStatus hs_XSControl_Reader_readFile(XSControl_Reader * reader, char * filename){
+    return reader->ReadFile(filename);
+}
+
+bool hs_XSControl_Reader_transferRoots(XSControl_Reader * reader){
+    return reader->TransferRoots();
+}
+
+TopoDS_Shape * hs_XSControl_Reader_oneShape(XSControl_Reader * reader){
+    return new TopoDS_Shape(reader->OneShape());
+}
diff --git a/cpp/hs_XSControl_Reader.h b/cpp/hs_XSControl_Reader.h
new file mode 100644
--- /dev/null
+++ b/cpp/hs_XSControl_Reader.h
@@ -0,0 +1,20 @@
+#ifndef HS_XSCONTROL_READER_H
+#define HS_XSCONTROL_READER_H
+
+#include "hs_types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+IFSelect_ReturnStatus hs_XSControl_Reader_readFile(XSControl_Reader * reader, char * filename);
+
+bool hs_XSControl_Reader_transferRoots(XSControl_Reader * reader);
+
+TopoDS_Shape * hs_XSControl_Reader_oneShape(XSControl_Reader * reader);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // HS_XSCONTROL_READER_H
diff --git a/cpp/hs_types.h b/cpp/hs_types.h
--- a/cpp/hs_types.h
+++ b/cpp/hs_types.h
@@ -12,6 +12,7 @@
 typedef void TopoDS_CompSolid;
 typedef void TopoDS_Solid;
 typedef void TopoDS_Shell;
+typedef void TopoDS_Builder;
 typedef void TopLoc_Location;
 typedef int TopAbs_Orientation;
 typedef int TopAbs_ShapeEnum;
@@ -35,6 +36,7 @@
 typedef void BRepBuilderAPI_MakeFace;
 typedef void BRepBuilderAPI_MakeSolid;
 typedef void BRepBuilderAPI_MakeShape;
+typedef void BRepBuilderAPI_Sewing;
 typedef int BRepBuilderAPI_WireError;
 typedef int BRepBuilderAPI_FaceError;
 typedef void BRepFilletAPI_MakeFillet;
@@ -52,8 +54,11 @@
 typedef void BRepOffsetAPI_ThruSections;
 typedef void BRepMesh_IncrementalMesh;
 typedef void StlAPI_Writer;
+typedef void StlAPI_Reader;
 typedef void STEPControl_Writer;
+typedef void STEPControl_Reader;
 typedef int STEPControl_StepModelType;
+typedef void XSControl_Reader;
 typedef int IFSelect_ReturnStatus;
 typedef void Font_BRepFont;
 typedef void Font_BRepTextBuilder;
@@ -68,10 +73,18 @@
 typedef void Bnd_OBB;
 typedef void Message_ProgressRange;
 typedef void RWGltf_CafWriter;
+typedef void RWGltf_CafReader;
+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 ShapeFix_Solid;
+typedef int ShapeExtend_Status;
+typedef void Poly_Triangulation;
+typedef void Poly_Triangle;
 #define Handle(X) void
 #define ARRAY_1(X) void
 #else // __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.2.1.0
+version:        0.2.2.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
@@ -28,15 +28,19 @@
     cpp/hs_BRepAlgoAPI_Cut.h
     cpp/hs_BRepAlgoAPI_Fuse.h
     cpp/hs_BRepBndLib.h
+    cpp/hs_BRepBuilderAPI_Copy.h
     cpp/hs_BRepBuilderAPI_GTransform.h
     cpp/hs_BRepBuilderAPI_MakeEdge.h
     cpp/hs_BRepBuilderAPI_MakeFace.h
+    cpp/hs_BRepBuilderAPI_MakePolygon.h
     cpp/hs_BRepBuilderAPI_MakeShape.h
     cpp/hs_BRepBuilderAPI_MakeSolid.h
     cpp/hs_BRepBuilderAPI_MakeWire.h
+    cpp/hs_BRepBuilderAPI_Sewing.h
     cpp/hs_BRepBuilderAPI_Transform.h
     cpp/hs_BRepFilletAPI_MakeFillet.h
     cpp/hs_BRepGProp.h
+    cpp/hs_BRepLib.h
     cpp/hs_BRepMesh_IncrementalMesh.h
     cpp/hs_BRepOffsetAPI_MakeOffsetShape.h
     cpp/hs_BRepOffsetAPI_MakePipe.h
@@ -72,14 +76,24 @@
     cpp/hs_GProp_GProps.h
     cpp/hs_Message_ProgressRange.h
     cpp/hs_NCollection_Array1.h
+    cpp/hs_Poly_Triangle.h
+    cpp/hs_Poly_Triangulation.h
+    cpp/hs_RWGltf_CafReader.h
     cpp/hs_RWGltf_CafWriter.h
+    cpp/hs_RWMesh_CafReader.h
+    cpp/hs_RWObj_CafReader.h
+    cpp/hs_RWObj_CafWriter.h
+    cpp/hs_ShapeFix_Solid.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_Explorer.h
     cpp/hs_TopLoc_Location.h
+    cpp/hs_TopoDS_Builder.h
     cpp/hs_TopoDS_Compound.h
     cpp/hs_TopoDS_CompSolid.h
     cpp/hs_TopoDS_Edge.h
@@ -92,6 +106,7 @@
     cpp/hs_types.h
     cpp/hs_XCAFDoc_DocumentTool.h
     cpp/hs_XCAFDoc_ShapeTool.h
+    cpp/hs_XSControl_Reader.h
 
 source-repository head
   type: git
@@ -109,14 +124,17 @@
       OpenCascade.BRepAlgoAPI.Fuse
       OpenCascade.BRepBndLib
       OpenCascade.BRepBuilderAPI
+      OpenCascade.BRepBuilderAPI.Copy
       OpenCascade.BRepBuilderAPI.FaceError
       OpenCascade.BRepBuilderAPI.GTransform
       OpenCascade.BRepBuilderAPI.Internal.Destructors
       OpenCascade.BRepBuilderAPI.MakeEdge
       OpenCascade.BRepBuilderAPI.MakeFace
+      OpenCascade.BRepBuilderAPI.MakePolygon
       OpenCascade.BRepBuilderAPI.MakeShape
       OpenCascade.BRepBuilderAPI.MakeSolid
       OpenCascade.BRepBuilderAPI.MakeWire
+      OpenCascade.BRepBuilderAPI.Sewing
       OpenCascade.BRepBuilderAPI.Transform
       OpenCascade.BRepBuilderAPI.Types
       OpenCascade.BRepBuilderAPI.WireError
@@ -125,6 +143,7 @@
       OpenCascade.BRepFilletAPI.MakeFillet
       OpenCascade.BRepFilletAPI.Types
       OpenCascade.BRepGProp
+      OpenCascade.BRepLib
       OpenCascade.BRepMesh
       OpenCascade.BRepMesh.IncrementalMesh
       OpenCascade.BRepMesh.Internal.Destructors
@@ -194,16 +213,33 @@
       OpenCascade.NCollection.Array1
       OpenCascade.NCollection.Internal.Destructors
       OpenCascade.NCollection.Types
+      OpenCascade.Poly.Internal.Destructors
+      OpenCascade.Poly.Triangle
+      OpenCascade.Poly.Triangulation
+      OpenCascade.Poly.Types
+      OpenCascade.RWGltf.CafReader
       OpenCascade.RWGltf.CafWriter
       OpenCascade.RWGltf.Internal.Destructors
       OpenCascade.RWGltf.Types
+      OpenCascade.RWMesh.CafReader
+      OpenCascade.RWMesh.Types
+      OpenCascade.RWObj.CafReader
+      OpenCascade.RWObj.CafWriter
+      OpenCascade.RWObj.Internal.Destructors
+      OpenCascade.RWObj.Types
+      OpenCascade.ShapeExtend.Status
+      OpenCascade.ShapeFix.Internal.Destructors
+      OpenCascade.ShapeFix.Solid
+      OpenCascade.ShapeFix.Types
       OpenCascade.STEPControl
       OpenCascade.STEPControl.Internal.Destructors
+      OpenCascade.STEPControl.Reader
       OpenCascade.STEPControl.StepModelType
       OpenCascade.STEPControl.Types
       OpenCascade.STEPControl.Writer
       OpenCascade.StlAPI
       OpenCascade.StlAPI.Internal.Destructors
+      OpenCascade.StlAPI.Reader
       OpenCascade.StlAPI.Types
       OpenCascade.StlAPI.Writer
       OpenCascade.TColStd.IndexedDataMapOfStringString
@@ -226,6 +262,7 @@
       OpenCascade.TopLoc.Location
       OpenCascade.TopLoc.Types
       OpenCascade.TopoDS
+      OpenCascade.TopoDS.Builder
       OpenCascade.TopoDS.Compound
       OpenCascade.TopoDS.CompSolid
       OpenCascade.TopoDS.Edge
@@ -243,6 +280,8 @@
       OpenCascade.XCAFDoc.Internal.Destructors
       OpenCascade.XCAFDoc.ShapeTool
       OpenCascade.XCAFDoc.Types
+      OpenCascade.XSControl.Reader
+      OpenCascade.XSControl.Types
   other-modules:
       Paths_opencascade_hs
   autogen-modules:
@@ -262,15 +301,19 @@
       cpp/hs_BRepAlgoAPI_Cut.cpp
       cpp/hs_BRepAlgoAPI_Fuse.cpp
       cpp/hs_BRepBndLib.cpp
+      cpp/hs_BRepBuilderAPI_Copy.cpp
       cpp/hs_BRepBuilderAPI_GTransform.cpp
       cpp/hs_BRepBuilderAPI_MakeEdge.cpp
       cpp/hs_BRepBuilderAPI_MakeFace.cpp
+      cpp/hs_BRepBuilderAPI_MakePolygon.cpp
       cpp/hs_BRepBuilderAPI_MakeShape.cpp
       cpp/hs_BRepBuilderAPI_MakeSolid.cpp
       cpp/hs_BRepBuilderAPI_MakeWire.cpp
+      cpp/hs_BRepBuilderAPI_Sewing.cpp
       cpp/hs_BRepBuilderAPI_Transform.cpp
       cpp/hs_BRepFilletAPI_MakeFillet.cpp
       cpp/hs_BRepGProp.cpp
+      cpp/hs_BRepLib.cpp
       cpp/hs_BRepMesh_IncrementalMesh.cpp
       cpp/hs_BRepOffsetAPI_MakeOffsetShape.cpp
       cpp/hs_BRepOffsetAPI_MakePipe.cpp
@@ -306,14 +349,24 @@
       cpp/hs_GProp_GProps.cpp
       cpp/hs_Message_ProgressRange.cpp
       cpp/hs_NCollection_Array1.cpp
+      cpp/hs_Poly_Triangle.cpp
+      cpp/hs_Poly_Triangulation.cpp
+      cpp/hs_RWGltf_CafReader.cpp
       cpp/hs_RWGltf_CafWriter.cpp
+      cpp/hs_RWMesh_CafReader.cpp
+      cpp/hs_RWObj_CafReader.cpp
+      cpp/hs_RWObj_CafWriter.cpp
+      cpp/hs_ShapeFix_Solid.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_Explorer.cpp
       cpp/hs_TopLoc_Location.cpp
+      cpp/hs_TopoDS_Builder.cpp
       cpp/hs_TopoDS_Compound.cpp
       cpp/hs_TopoDS_CompSolid.cpp
       cpp/hs_TopoDS_Edge.cpp
@@ -325,6 +378,7 @@
       cpp/hs_TopoDS_Wire.cpp
       cpp/hs_XCAFDoc_DocumentTool.cpp
       cpp/hs_XCAFDoc_ShapeTool.cpp
+      cpp/hs_XSControl_Reader.cpp
   extra-libraries:
       stdc++
       TKGeomBase
@@ -348,6 +402,8 @@
       TKLCAF
       TKXCAF
       TKService
+      TKShHealing
+      TKXSBase
   build-depends:
       base >=4.7 && <5
     , resourcet >=1.2 && <1.4
diff --git a/src/OpenCascade/BRep/Tool.hs b/src/OpenCascade/BRep/Tool.hs
--- a/src/OpenCascade/BRep/Tool.hs
+++ b/src/OpenCascade/BRep/Tool.hs
@@ -3,21 +3,25 @@
 ( curve
 , curveParamFirst
 , curveParamLast
+, triangulation
 ) where
 
 import qualified OpenCascade.Geom as Geom
 import qualified OpenCascade.TopoDS as TopoDS
+
+import qualified OpenCascade.TopLoc.Types as TopLoc
+import qualified OpenCascade.Poly.Types as Poly
+import OpenCascade.Poly.Internal.Destructors (deleteHandleTriangulation)
 import OpenCascade.Handle (Handle)
 import OpenCascade.Geom.Internal.Destructors (deleteHandleCurve)
 import Foreign.Ptr
 import Foreign.C
 import Data.Coerce
-import Data.Acquire
-import qualified Data.Acquire as Data
+import Data.Acquire (Acquire, mkAcquire)
 
 foreign import capi unsafe "hs_BRep_Tool.h hs_BRep_Tool_curve" rawCurve :: Ptr (TopoDS.Edge) -> IO(Ptr (Handle Geom.Curve))
 
-curve :: Ptr TopoDS.Edge -> Data.Acquire (Ptr (Handle Geom.Curve))
+curve :: Ptr TopoDS.Edge -> Acquire (Ptr (Handle Geom.Curve))
 curve edge = mkAcquire (rawCurve edge) deleteHandleCurve
 
 foreign import capi unsafe "hs_BRep_Tool.h hs_BRep_Tool_curveParamFirst" rawCurveParamFirst :: Ptr (TopoDS.Edge) -> IO(CDouble)
@@ -30,3 +34,7 @@
 curveParamLast :: Ptr TopoDS.Edge -> IO Double 
 curveParamLast = coerce rawCurveParamLast
 
+foreign import capi unsafe "hs_BRep_Tool.h hs_BRep_Tool_triangulation" rawTriangulation :: Ptr (TopoDS.Face) -> Ptr TopLoc.Location -> IO(Ptr (Handle Poly.Triangulation))
+
+triangulation :: Ptr TopoDS.Face -> Ptr TopLoc.Location -> Acquire (Ptr (Handle Poly.Triangulation))
+triangulation face loc = mkAcquire (rawTriangulation face loc) deleteHandleTriangulation
diff --git a/src/OpenCascade/BRepBuilderAPI/Copy.hs b/src/OpenCascade/BRepBuilderAPI/Copy.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/BRepBuilderAPI/Copy.hs
@@ -0,0 +1,16 @@
+{-# LANGUAGE CApiFFI #-}
+module OpenCascade.BRepBuilderAPI.Copy
+( copy
+) where
+
+import qualified OpenCascade.TopoDS as TopoDS
+import OpenCascade.Internal.Bool
+import qualified OpenCascade.TopoDS.Internal.Destructors as TopoDS.Destructors
+import Foreign.C
+import Foreign.Ptr
+import Data.Acquire 
+
+foreign import capi unsafe "hs_BRepBuilderAPI_Copy.h hs_BRepBuilderAPI_Copy_copy" rawCopy :: Ptr TopoDS.Shape -> CBool -> CBool -> IO (Ptr TopoDS.Shape)
+
+copy :: Ptr TopoDS.Shape -> Bool -> Bool -> Acquire (Ptr TopoDS.Shape)
+copy shape copyGeom copyMesh = mkAcquire (rawCopy shape (boolToCBool copyMesh) (boolToCBool copyGeom)) TopoDS.Destructors.deleteShape
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
@@ -3,6 +3,7 @@
 ( deleteMakeWire
 , deleteMakeFace
 , deleteMakeSolid
+, deleteSewing
 ) where
 
 import OpenCascade.BRepBuilderAPI.Types
@@ -12,5 +13,6 @@
 foreign import capi unsafe "hs_BRepBuilderAPI_MakeWire.h hs_delete_BRepBuilderAPI_MakeWire" deleteMakeWire :: Ptr MakeWire -> IO ()
 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 ()
 
 
diff --git a/src/OpenCascade/BRepBuilderAPI/MakePolygon.hs b/src/OpenCascade/BRepBuilderAPI/MakePolygon.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/BRepBuilderAPI/MakePolygon.hs
@@ -0,0 +1,18 @@
+{-# LANGUAGE CApiFFI #-}
+module OpenCascade.BRepBuilderAPI.MakePolygon
+( from3Pnts 
+) where
+
+import qualified OpenCascade.GP as GP
+import qualified OpenCascade.TopoDS as TopoDS
+import OpenCascade.TopoDS.Internal.Destructors (deleteShape)
+import OpenCascade.Inheritance (upcast)
+import Foreign.C (CBool (..))
+import Foreign.Ptr (Ptr)
+import Data.Acquire (Acquire, mkAcquire)
+import OpenCascade.Internal.Bool (boolToCBool)
+
+foreign import capi unsafe "hs_BRepBuilderAPI_MakePolygon.h hs_BRepBuilderAPI_MakePolygon_from3Pnts" rawFrom3Pnts :: Ptr GP.Pnt -> Ptr GP.Pnt -> Ptr GP.Pnt -> CBool -> IO (Ptr TopoDS.Wire)
+
+from3Pnts :: Ptr GP.Pnt -> Ptr GP.Pnt -> Ptr GP.Pnt -> Bool -> Acquire (Ptr TopoDS.Wire)
+from3Pnts p1 p2 p3 close = mkAcquire (rawFrom3Pnts p1 p2 p3 (boolToCBool close)) (deleteShape . upcast)
diff --git a/src/OpenCascade/BRepBuilderAPI/MakeSolid.hs b/src/OpenCascade/BRepBuilderAPI/MakeSolid.hs
--- a/src/OpenCascade/BRepBuilderAPI/MakeSolid.hs
+++ b/src/OpenCascade/BRepBuilderAPI/MakeSolid.hs
@@ -26,5 +26,5 @@
 foreign import capi unsafe "hs_BRepBuilderAPI_MakeSolid.h hs_BRepBuilderAPI_MakeSolid_solid" rawSolid :: Ptr MakeSolid -> IO (Ptr TopoDS.Solid)
 
 solid :: Ptr MakeSolid -> Acquire (Ptr TopoDS.Solid)
-solid builder = mkAcquire (rawSolid builder) (deleteShape . upcast)  
+solid builder = mkAcquire (rawSolid builder) (deleteShape . upcast)
 
diff --git a/src/OpenCascade/BRepBuilderAPI/Sewing.hs b/src/OpenCascade/BRepBuilderAPI/Sewing.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/BRepBuilderAPI/Sewing.hs
@@ -0,0 +1,55 @@
+{-# LANGUAGE CApiFFI #-}
+module OpenCascade.BRepBuilderAPI.Sewing
+( Sewing
+, new
+, load
+, add
+, perform
+, sewedShape
+, nbFreeEdges
+, nbContigousEdges
+, nbMultipleEdges
+) where 
+
+import qualified OpenCascade.TopoDS.Types as TopoDS
+import OpenCascade.TopoDS.Internal.Destructors (deleteShape)
+import OpenCascade.BRepBuilderAPI.Internal.Destructors (deleteSewing)
+import OpenCascade.BRepBuilderAPI.Types (Sewing)
+import Foreign.Ptr (Ptr)
+import Foreign.C (CBool (..), CDouble (..), CInt (..))
+import OpenCascade.Internal.Bool (boolToCBool)
+import Data.Acquire (Acquire, mkAcquire)
+import Data.Coerce (coerce)
+
+foreign import capi unsafe "hs_BRepBuilderAPI_Sewing.h hs_new_BRepBuilderAPI_Sewing" rawNew :: CDouble -> CBool -> CBool -> CBool -> CBool -> IO (Ptr Sewing)
+
+new :: Double -> Bool -> Bool -> Bool -> Bool -> Acquire (Ptr Sewing)
+new tolerance opt1 opt2 opt3 opt4 = mkAcquire (rawNew (coerce tolerance) (boolToCBool opt1) (boolToCBool opt2) (boolToCBool opt3) (boolToCBool opt4)) deleteSewing
+
+foreign import capi unsafe "hs_BRepBuilderAPI_Sewing.h hs_BRepBuilderAPI_Sewing_load" load :: Ptr Sewing -> Ptr TopoDS.Shape -> IO ()
+
+foreign import capi unsafe "hs_BRepBuilderAPI_Sewing.h hs_BRepBuilderAPI_Sewing_add" add :: Ptr Sewing -> Ptr TopoDS.Shape -> IO ()
+
+foreign import capi unsafe "hs_BRepBuilderAPI_Sewing.h hs_BRepBuilderAPI_Sewing_perform" perform :: Ptr Sewing -> IO ()
+
+foreign import capi unsafe "hs_BRepBuilderAPI_Sewing.h hs_BRepBuilderAPI_Sewing_sewedShape" rawSewedShape :: Ptr Sewing -> IO (Ptr TopoDS.Shape)
+
+sewedShape :: Ptr Sewing -> Acquire (Ptr TopoDS.Shape)
+sewedShape sewing = mkAcquire (rawSewedShape sewing) (deleteShape)
+
+foreign import capi unsafe "hs_BRepBuilderAPI_Sewing.h hs_BRepBuilderAPI_Sewing_nbFreeEdges" rawNbFreeEdges:: Ptr Sewing -> IO (CInt)
+
+nbFreeEdges :: Ptr Sewing -> IO Int
+nbFreeEdges = fmap fromIntegral <$> rawNbFreeEdges
+
+
+foreign import capi unsafe "hs_BRepBuilderAPI_Sewing.h hs_BRepBuilderAPI_Sewing_nbContigousEdges" rawNbContigousEdges:: Ptr Sewing -> IO (CInt)
+
+nbContigousEdges :: Ptr Sewing -> IO Int
+nbContigousEdges = fmap fromIntegral <$> rawNbContigousEdges
+
+
+foreign import capi unsafe "hs_BRepBuilderAPI_Sewing.h hs_BRepBuilderAPI_Sewing_nbMultipleEdges" rawNbMultipleEdges:: Ptr Sewing -> IO (CInt)
+
+nbMultipleEdges :: Ptr Sewing -> IO Int
+nbMultipleEdges = fmap fromIntegral <$> rawNbMultipleEdges
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
@@ -5,6 +5,7 @@
 , MakeFace
 , MakeSolid
 , MakeShape
+, Sewing
 ) where
 
 import qualified OpenCascade.Inheritance as Inheritance
@@ -14,6 +15,8 @@
 data MakeSolid
 
 data MakeShape
+
+data Sewing
 
 instance Inheritance.SubTypeOf MakeShape MakeWire
 instance Inheritance.SubTypeOf MakeShape MakeSolid
diff --git a/src/OpenCascade/BRepLib.hs b/src/OpenCascade/BRepLib.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/BRepLib.hs
@@ -0,0 +1,14 @@
+{-# LANGUAGE CApiFFI#-}
+module OpenCascade.BRepLib 
+( orientClosedSolid
+) where 
+
+import OpenCascade.TopoDS.Types (Solid)
+import Foreign.Ptr (Ptr)
+import Foreign.C (CBool (..))
+import OpenCascade.Internal.Bool (cBoolToBool)
+
+foreign import capi unsafe "hs_BRepLib.h hs_BRepLib_orientClosedSolid" rawOrientClosedSolid ::  Ptr Solid -> IO (CBool)
+
+orientClosedSolid :: Ptr Solid -> IO Bool
+orientClosedSolid s = cBoolToBool <$> rawOrientClosedSolid s
diff --git a/src/OpenCascade/GProp/GProps.hs b/src/OpenCascade/GProp/GProps.hs
--- a/src/OpenCascade/GProp/GProps.hs
+++ b/src/OpenCascade/GProp/GProps.hs
@@ -22,7 +22,7 @@
 new :: Acquire (Ptr GProps)
 new = mkAcquire rawNew deleteGProps
 
-foreign import capi unsafe "hs_GProp_GProps.h hs_new_GProp_GProps" rawFromSystemLocation :: Ptr Pnt -> IO (Ptr GProps)
+foreign import capi unsafe "hs_GProp_GProps.h hs_new_GProp_GProps_fromSystemLocation" rawFromSystemLocation :: Ptr Pnt -> IO (Ptr GProps)
 
 fromSystemLocation :: Ptr Pnt -> Acquire (Ptr GProps)
 fromSystemLocation pnt = mkAcquire (rawFromSystemLocation pnt) deleteGProps
diff --git a/src/OpenCascade/IFSelect/ReturnStatus.hs b/src/OpenCascade/IFSelect/ReturnStatus.hs
--- a/src/OpenCascade/IFSelect/ReturnStatus.hs
+++ b/src/OpenCascade/IFSelect/ReturnStatus.hs
@@ -3,4 +3,4 @@
 ) where
 
 -- Should match the order in IFSelect_ReturnStatus.hxx
-data ReturnStatus = Void | Done | Error | Fail | Stop deriving Enum
+data ReturnStatus = Void | Done | Error | Fail | Stop deriving (Eq, Enum, Show)
diff --git a/src/OpenCascade/Poly/Internal/Destructors.hs b/src/OpenCascade/Poly/Internal/Destructors.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/Poly/Internal/Destructors.hs
@@ -0,0 +1,13 @@
+{-# LANGUAGE CApiFFI #-}
+module OpenCascade.Poly.Internal.Destructors
+( deleteHandleTriangulation
+, deleteTriangle
+) where
+
+import OpenCascade.Poly.Types 
+import OpenCascade.Handle (Handle)
+import Foreign.Ptr (Ptr)
+
+foreign import capi unsafe "hs_Poly_Triangulation.h hs_delete_Poly_Triangulation" deleteHandleTriangulation :: Ptr (Handle Triangulation) -> IO ()
+
+foreign import capi unsafe "hs_Poly_Triangle.h hs_delete_Poly_Triangle" deleteTriangle :: Ptr Triangle -> IO ()
diff --git a/src/OpenCascade/Poly/Triangle.hs b/src/OpenCascade/Poly/Triangle.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/Poly/Triangle.hs
@@ -0,0 +1,28 @@
+{-# LANGUAGE CApiFFI #-}
+module OpenCascade.Poly.Triangle 
+( Triangle
+, fromIndices
+, value
+, setValue
+) where
+
+import OpenCascade.Poly.Types (Triangle)
+import OpenCascade.Poly.Internal.Destructors (deleteTriangle)
+import Foreign.C (CInt (..))
+import Foreign.Ptr (Ptr)
+import Data.Acquire (Acquire, mkAcquire)
+
+foreign import capi unsafe "hs_Poly_Triangle.h hs_new_Poly_Triangle_fromIndices" rawFromIndices :: CInt -> CInt -> CInt -> IO (Ptr Triangle)
+
+fromIndices :: Int -> Int -> Int -> Acquire (Ptr Triangle)
+fromIndices n1 n2 n3 = mkAcquire (rawFromIndices (fromIntegral n1) (fromIntegral n2) (fromIntegral n3)) deleteTriangle
+
+foreign import capi unsafe "hs_Poly_Triangle.h hs_Poly_Triangle_value" rawValue :: Ptr Triangle -> CInt -> IO CInt
+
+value :: Ptr Triangle -> Int -> IO Int
+value tri index = fromIntegral <$> rawValue tri (fromIntegral index)
+
+foreign import capi unsafe "hs_Poly_Triangle.h hs_Poly_Triangle_setValue" rawSetValue :: Ptr Triangle -> CInt -> CInt -> IO ()
+
+setValue :: Ptr Triangle -> Int -> Int -> IO ()
+setValue tri index node = rawSetValue tri (fromIntegral index) (fromIntegral node)
diff --git a/src/OpenCascade/Poly/Triangulation.hs b/src/OpenCascade/Poly/Triangulation.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/Poly/Triangulation.hs
@@ -0,0 +1,56 @@
+{-# LANGUAGE CApiFFI #-}
+module OpenCascade.Poly.Triangulation 
+(Triangulation
+, new
+, nbNodes
+, nbTriangles
+, node 
+, setNode
+, triangle
+, setTriangle
+) where
+
+import OpenCascade.Poly.Types (Triangle, Triangulation)
+import OpenCascade.Poly.Internal.Destructors (deleteHandleTriangulation, deleteTriangle)
+import OpenCascade.GP.Types as GP
+import OpenCascade.GP.Internal.Destructors (deletePnt)
+import OpenCascade.Handle (Handle)
+import Foreign.Ptr (Ptr)
+import Foreign.C (CInt (..), CBool (..))
+import OpenCascade.Internal.Bool (boolToCBool)
+import Data.Acquire (Acquire, mkAcquire)
+
+foreign import capi unsafe "hs_Poly_Triangulation.h hs_new_Poly_Triangulation" rawNew :: CInt -> CInt -> CBool -> CBool -> IO (Ptr (Handle Triangulation))
+
+new :: Int -> Int -> Bool -> Bool -> Acquire (Ptr (Handle Triangulation))
+new nNodes nTriangles hasUVNodes hasNormals = mkAcquire (rawNew (fromIntegral nNodes) (fromIntegral nTriangles) (boolToCBool hasUVNodes) (boolToCBool hasNormals)) deleteHandleTriangulation
+
+foreign import capi unsafe "hs_Poly_Triangulation.h hs_Poly_Triangulation_nbNodes" rawNbNodes :: Ptr (Handle Triangulation) -> IO CInt
+
+nbNodes :: Ptr (Handle Triangulation) -> IO Int
+nbNodes tri = fromIntegral <$> rawNbNodes tri
+
+foreign import capi unsafe "hs_Poly_Triangulation.h hs_Poly_Triangulation_nbTriangles" rawNbTriangles :: Ptr (Handle Triangulation) -> IO CInt
+
+nbTriangles :: Ptr (Handle Triangulation) -> IO Int
+nbTriangles tri = fromIntegral <$> rawNbTriangles tri
+
+foreign import capi unsafe "hs_Poly_Triangulation.h hs_Poly_Triangulation_node" rawNode :: Ptr (Handle Triangulation) -> CInt -> IO (Ptr GP.Pnt)
+
+node :: Ptr (Handle Triangulation) -> Int -> Acquire (Ptr GP.Pnt)
+node tri index = mkAcquire (rawNode tri (fromIntegral index)) deletePnt
+
+foreign import capi unsafe "hs_Poly_Triangulation.h hs_Poly_Triangulation_setNode" rawSetNode :: Ptr (Handle Triangulation) -> CInt -> Ptr GP.Pnt -> IO()
+
+setNode :: Ptr (Handle Triangulation) -> Int -> Ptr GP.Pnt -> IO ()
+setNode tri index pnt = rawSetNode tri (fromIntegral index) pnt
+
+foreign import capi unsafe "hs_Poly_Triangulation.h hs_Poly_Triangulation_triangle" rawTriangle :: Ptr (Handle Triangulation) -> CInt -> IO (Ptr Triangle)
+
+triangle :: Ptr (Handle Triangulation) -> Int -> Acquire (Ptr Triangle)
+triangle tri index = mkAcquire (rawTriangle tri (fromIntegral index)) deleteTriangle
+
+foreign import capi unsafe "hs_Poly_Triangulation.h hs_Poly_Triangulation_setTriangle" rawSetTriangle :: Ptr (Handle Triangulation) -> CInt -> Ptr Triangle -> IO ()
+
+setTriangle :: Ptr (Handle Triangulation) -> Int -> Ptr Triangle -> IO ()
+setTriangle tri index theTriangle = rawSetTriangle tri (fromIntegral index) theTriangle 
diff --git a/src/OpenCascade/Poly/Types.hs b/src/OpenCascade/Poly/Types.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/Poly/Types.hs
@@ -0,0 +1,8 @@
+{-# LANGUAGE EmptyDataDecls #-}
+module OpenCascade.Poly.Types 
+(Triangulation
+, Triangle
+) where
+
+data Triangulation
+data Triangle
diff --git a/src/OpenCascade/RWGltf/CafReader.hs b/src/OpenCascade/RWGltf/CafReader.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/RWGltf/CafReader.hs
@@ -0,0 +1,24 @@
+{-# LANGUAGE CApiFFI #-}
+module OpenCascade.RWGltf.CafReader 
+( CafReader
+, new
+, setDoublePrecision
+) where
+
+import OpenCascade.RWGltf.Types (CafReader)
+import OpenCascade.RWGltf.Internal.Destructors (deleteCafReader)
+import Data.Acquire (Acquire, mkAcquire)
+import OpenCascade.Internal.Bool (boolToCBool)
+import Foreign.C (CBool (..))
+import Foreign.Ptr (Ptr)
+
+foreign import capi unsafe "hs_RWGltf_CafReader.h hs_new_RWGltf_CafReader" rawNew :: IO (Ptr CafReader)
+
+new :: Acquire (Ptr CafReader)
+new = mkAcquire rawNew deleteCafReader
+
+
+foreign import capi unsafe "hs_RWGltf_CafReader.h hs_RWGltf_CafReader_setDoublePrecision" rawSetDoublePrecision :: Ptr CafReader -> CBool -> IO ()
+
+setDoublePrecision :: Ptr CafReader -> Bool -> IO ()
+setDoublePrecision reader isDouble = rawSetDoublePrecision reader (boolToCBool isDouble)
diff --git a/src/OpenCascade/RWGltf/Internal/Destructors.hs b/src/OpenCascade/RWGltf/Internal/Destructors.hs
--- a/src/OpenCascade/RWGltf/Internal/Destructors.hs
+++ b/src/OpenCascade/RWGltf/Internal/Destructors.hs
@@ -1,9 +1,11 @@
 {-# LANGUAGE CApiFFI #-}
 module OpenCascade.RWGltf.Internal.Destructors
 ( deleteCafWriter
+, deleteCafReader
 ) where
 
 import OpenCascade.RWGltf.Types
 import Foreign.Ptr 
 
 foreign import capi unsafe "hs_RWGltf_CafWriter.h hs_delete_RWGltf_CafWriter" deleteCafWriter :: Ptr CafWriter -> IO ()
+foreign import capi unsafe "hs_RWGltf_CafReader.h hs_delete_RWGltf_CafReader" deleteCafReader :: Ptr CafReader -> IO ()
diff --git a/src/OpenCascade/RWGltf/Types.hs b/src/OpenCascade/RWGltf/Types.hs
--- a/src/OpenCascade/RWGltf/Types.hs
+++ b/src/OpenCascade/RWGltf/Types.hs
@@ -1,6 +1,14 @@
 {-# LANGUAGE EmptyDataDecls #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
 module OpenCascade.RWGltf.Types
 ( CafWriter
+, CafReader
 ) where
 
+import OpenCascade.Inheritance (SubTypeOf)
+import qualified OpenCascade.RWMesh.Types as RWMesh
+
 data CafWriter
+data CafReader
+
+instance SubTypeOf RWMesh.CafReader CafReader
diff --git a/src/OpenCascade/RWMesh/CafReader.hs b/src/OpenCascade/RWMesh/CafReader.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/RWMesh/CafReader.hs
@@ -0,0 +1,39 @@
+{-# LANGUAGE CApiFFI #-}
+module OpenCascade.RWMesh.CafReader
+( CafReader
+, setDocument
+, perform
+, singleShape
+, setFileLengthUnit
+) where
+
+import OpenCascade.RWMesh.Types (CafReader)
+import qualified OpenCascade.TDocStd.Types as TDocStd
+import qualified OpenCascade.Message.Types as Message
+import qualified OpenCascade.TopoDS.Types as TopoDS
+import OpenCascade.TopoDS.Internal.Destructors (deleteShape)
+import OpenCascade.Handle (Handle)
+import OpenCascade.Internal.Bool (cBoolToBool)
+import Foreign.C (CBool (..), CDouble (..))
+import Foreign.C.String (CString, withCString)
+import Foreign.Ptr (Ptr)
+import Data.Coerce (coerce)
+import Data.Acquire (Acquire, mkAcquire)
+
+foreign import capi unsafe "hs_RWMesh_CafReader.h hs_RWMesh_CafReader_setDocument" setDocument :: Ptr CafReader -> Ptr (Handle TDocStd.Document) -> IO ()
+
+foreign import capi unsafe "hs_RWMesh_CafReader.h hs_RWMesh_CafReader_setFileLengthUnit" rawSetFileLengthUnit :: Ptr CafReader -> CDouble -> IO ()
+
+setFileLengthUnit :: Ptr CafReader -> Double -> IO ()
+setFileLengthUnit = coerce rawSetFileLengthUnit
+
+foreign import capi unsafe "hs_RWMesh_CafReader.h hs_RWMesh_CafReader_perform" rawPerform :: Ptr CafReader -> CString -> Ptr Message.ProgressRange -> IO CBool
+
+perform :: Ptr CafReader -> String -> Ptr Message.ProgressRange -> IO Bool
+perform reader filename progress = cBoolToBool <$> (withCString filename $ \str -> rawPerform reader str progress)
+
+foreign import capi unsafe "hs_RWMesh_CafReader.h hs_RWMesh_CafReader_singleShape" rawSingleShape :: Ptr CafReader -> IO (Ptr TopoDS.Shape)
+
+singleShape :: Ptr CafReader -> Acquire (Ptr TopoDS.Shape)
+singleShape reader = mkAcquire (rawSingleShape reader) deleteShape
+
diff --git a/src/OpenCascade/RWMesh/Types.hs b/src/OpenCascade/RWMesh/Types.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/RWMesh/Types.hs
@@ -0,0 +1,6 @@
+{-# LANGUAGE EmptyDataDecls #-}
+module OpenCascade.RWMesh.Types 
+( CafReader
+) where
+
+data CafReader
diff --git a/src/OpenCascade/RWObj/CafReader.hs b/src/OpenCascade/RWObj/CafReader.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/RWObj/CafReader.hs
@@ -0,0 +1,24 @@
+{-# LANGUAGE CApiFFI #-}
+module OpenCascade.RWObj.CafReader 
+( CafReader
+, new
+, setSinglePrecision
+) where
+
+import OpenCascade.RWObj.Types (CafReader)
+import OpenCascade.RWObj.Internal.Destructors (deleteCafReader)
+import Data.Acquire (Acquire, mkAcquire)
+import OpenCascade.Internal.Bool (boolToCBool)
+import Foreign.C (CBool (..))
+import Foreign.Ptr (Ptr)
+
+foreign import capi unsafe "hs_RWObj_CafReader.h hs_new_RWObj_CafReader" rawNew :: IO (Ptr CafReader)
+
+new :: Acquire (Ptr CafReader)
+new = mkAcquire rawNew deleteCafReader
+
+
+foreign import capi unsafe "hs_RWObj_CafReader.h hs_RWObj_CafReader_setSinglePrecision" rawSetSinglePrecision :: Ptr CafReader -> CBool -> IO ()
+
+setSinglePrecision :: Ptr CafReader -> Bool -> IO ()
+setSinglePrecision reader isSingle = rawSetSinglePrecision reader (boolToCBool isSingle)
diff --git a/src/OpenCascade/RWObj/CafWriter.hs b/src/OpenCascade/RWObj/CafWriter.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/RWObj/CafWriter.hs
@@ -0,0 +1,23 @@
+{-# LANGUAGE CApiFFI #-}
+module OpenCascade.RWObj.CafWriter
+( CafWriter
+, new
+, perform
+) where
+
+import OpenCascade.RWObj.Types (CafWriter)
+import OpenCascade.RWObj.Internal.Destructors (deleteCafWriter)
+import Foreign.Ptr (Ptr)
+import Foreign.C.String (CString, withCString)
+import Data.Acquire (Acquire, mkAcquire)
+import OpenCascade.Handle (Handle)
+import qualified OpenCascade.TDocStd.Types as TDocStd
+import qualified OpenCascade.TColStd.Types as TColStd
+import qualified OpenCascade.Message.Types as Message
+
+foreign import capi unsafe "hs_RWObj_CafWriter.h hs_new_RWObj_CafWriter" rawNew :: CString -> IO (Ptr CafWriter)
+
+new :: String -> Acquire (Ptr CafWriter)
+new filepath = mkAcquire (withCString filepath rawNew) deleteCafWriter
+
+foreign import capi unsafe "hs_RWObj_CafWriter.h hs_RWObj_CafWriter_Perform" perform :: Ptr CafWriter -> Ptr (Handle TDocStd.Document) -> Ptr (TColStd.IndexedDataMapOfStringString) -> Ptr (Message.ProgressRange) -> IO ()
diff --git a/src/OpenCascade/RWObj/Internal/Destructors.hs b/src/OpenCascade/RWObj/Internal/Destructors.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/RWObj/Internal/Destructors.hs
@@ -0,0 +1,12 @@
+
+{-# LANGUAGE CApiFFI #-}
+module OpenCascade.RWObj.Internal.Destructors
+( deleteCafWriter
+, deleteCafReader
+) where
+
+import OpenCascade.RWObj.Types
+import Foreign.Ptr 
+
+foreign import capi unsafe "hs_RWObj_CafWriter.h hs_delete_RWObj_CafWriter" deleteCafWriter :: Ptr CafWriter -> IO ()
+foreign import capi unsafe "hs_RWObj_CafReader.h hs_delete_RWObj_CafReader" deleteCafReader :: Ptr CafReader -> IO ()
diff --git a/src/OpenCascade/RWObj/Types.hs b/src/OpenCascade/RWObj/Types.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/RWObj/Types.hs
@@ -0,0 +1,14 @@
+{-# LANGUAGE EmptyDataDecls #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+module OpenCascade.RWObj.Types 
+( CafWriter
+, CafReader
+) where
+
+import OpenCascade.Inheritance (SubTypeOf)
+import qualified OpenCascade.RWMesh.Types as RWMesh
+
+data CafWriter
+data CafReader
+
+instance SubTypeOf RWMesh.CafReader CafReader
diff --git a/src/OpenCascade/STEPControl/Internal/Destructors.hs b/src/OpenCascade/STEPControl/Internal/Destructors.hs
--- a/src/OpenCascade/STEPControl/Internal/Destructors.hs
+++ b/src/OpenCascade/STEPControl/Internal/Destructors.hs
@@ -1,6 +1,7 @@
 {-# LANGUAGE CApiFFI #-}
 module OpenCascade.STEPControl.Internal.Destructors 
 ( deleteWriter
+, deleteReader
 ) where
 
 import OpenCascade.STEPControl.Types
@@ -8,3 +9,4 @@
 import Foreign.Ptr
 
 foreign import capi unsafe "hs_STEPControl_Writer.h hs_delete_STEPControl_Writer" deleteWriter :: Ptr Writer -> IO ()
+foreign import capi unsafe "hs_STEPControl_Reader.h hs_delete_STEPControl_Reader" deleteReader :: Ptr Reader -> IO ()
diff --git a/src/OpenCascade/STEPControl/Reader.hs b/src/OpenCascade/STEPControl/Reader.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/STEPControl/Reader.hs
@@ -0,0 +1,16 @@
+{-# LANGUAGE CApiFFI #-}
+module OpenCascade.STEPControl.Reader
+( Reader
+, new
+) where
+
+import OpenCascade.STEPControl.Types (Reader)
+import OpenCascade.STEPControl.Internal.Destructors (deleteReader)
+import Foreign.Ptr (Ptr)
+import Data.Acquire (Acquire, mkAcquire)
+
+
+foreign import capi unsafe "hs_STEPControl_Reader.h hs_new_STEPControl_Reader" rawNew :: IO (Ptr Reader)
+
+new :: Acquire (Ptr Reader)
+new = mkAcquire rawNew deleteReader
diff --git a/src/OpenCascade/STEPControl/Types.hs b/src/OpenCascade/STEPControl/Types.hs
--- a/src/OpenCascade/STEPControl/Types.hs
+++ b/src/OpenCascade/STEPControl/Types.hs
@@ -1,6 +1,13 @@
 {-# LANGUAGE EmptyDataDecls #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
 module OpenCascade.STEPControl.Types
 ( Writer
+, Reader
 ) where
 
+import OpenCascade.Inheritance
+import qualified OpenCascade.XSControl.Types as XSControl
 data Writer
+data Reader
+
+instance SubTypeOf XSControl.Reader Reader
diff --git a/src/OpenCascade/ShapeExtend/Status.hs b/src/OpenCascade/ShapeExtend/Status.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/ShapeExtend/Status.hs
@@ -0,0 +1,25 @@
+module OpenCascade.ShapeExtend.Status 
+( Status (..)
+) where
+
+-- This needs to match the definition in ShapeExtend_Status.hxx
+data Status = 
+    OK |
+    DONE1 |
+    DONE2 |
+    DONE3 |
+    DONE4 |
+    DONE5 |
+    DONE6 |
+    DONE7 |
+    DONE8 |
+    DONE |
+    FAIL1 |
+    FAIL2 |
+    FAIL3 |
+    FAIL4 |
+    FAIL5 |
+    FAIL6 |
+    FAIL7 |
+    FAIL8 |
+    FAIL deriving (Show, Eq, Enum)
diff --git a/src/OpenCascade/ShapeFix/Internal/Destructors.hs b/src/OpenCascade/ShapeFix/Internal/Destructors.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/ShapeFix/Internal/Destructors.hs
@@ -0,0 +1,7 @@
+{-# LANGUAGE CApiFFI #-}
+module OpenCascade.ShapeFix.Internal.Destructors (deleteSolid) where
+
+import OpenCascade.ShapeFix.Types (Solid)
+import Foreign.Ptr (Ptr)
+
+foreign import capi unsafe "hs_ShapeFix_Solid.h hs_delete_ShapeFix_Solid" deleteSolid :: Ptr Solid -> IO ()
diff --git a/src/OpenCascade/ShapeFix/Solid.hs b/src/OpenCascade/ShapeFix/Solid.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/ShapeFix/Solid.hs
@@ -0,0 +1,53 @@
+{-# LANGUAGE CApiFFI #-}
+module OpenCascade.ShapeFix.Solid
+( Solid
+, new
+, fromSolid
+, solidFromShell
+, perform
+, solid
+, status
+) where
+
+import OpenCascade.ShapeFix.Types (Solid)
+import OpenCascade.ShapeFix.Internal.Destructors (deleteSolid)
+import OpenCascade.TopoDS.Internal.Destructors (deleteShape)
+import qualified OpenCascade.TopoDS.Types as TopoDS
+import qualified OpenCascade.Message.Types as Message
+import Data.Acquire (Acquire, mkAcquire)
+import Foreign.Ptr (Ptr)
+import Foreign.C (CInt (..), CBool (..))
+import OpenCascade.Internal.Bool (cBoolToBool)
+import OpenCascade.ShapeExtend.Status (Status)
+import OpenCascade.Inheritance (upcast)
+
+
+foreign import capi unsafe "hs_ShapeFix_Solid.h hs_new_ShapeFix_Solid" rawNew :: IO (Ptr Solid)
+
+new :: Acquire (Ptr Solid)
+new = mkAcquire rawNew deleteSolid
+
+foreign import capi unsafe "hs_ShapeFix_Solid.h hs_new_ShapeFix_Solid_fromSolid" rawFromSolid :: Ptr TopoDS.Solid -> IO (Ptr Solid)
+
+fromSolid :: Ptr TopoDS.Solid -> Acquire (Ptr Solid)
+fromSolid s = mkAcquire (rawFromSolid s) deleteSolid
+
+foreign import capi unsafe "hs_ShapeFix_Solid.h hs_ShapeFix_Solid_perform" rawPerform :: Ptr Solid -> Ptr Message.ProgressRange -> IO (CBool)
+
+perform :: Ptr Solid -> Ptr Message.ProgressRange-> IO Bool
+perform = (fmap cBoolToBool .) . rawPerform
+
+foreign import capi unsafe "hs_ShapeFix_Solid.h hs_ShapeFix_Solid_solid" rawSolid :: Ptr Solid -> IO (Ptr TopoDS.Shape)
+
+solid :: Ptr Solid -> Acquire (Ptr TopoDS.Shape)
+solid s = mkAcquire (rawSolid s) deleteShape
+
+foreign import capi unsafe "hs_ShapeFix_Solid.h hs_ShapeFix_Solid_solidFromShell" rawSolidFromShell :: Ptr Solid -> Ptr TopoDS.Shell -> IO (Ptr TopoDS.Solid)
+
+solidFromShell :: Ptr Solid -> Ptr TopoDS.Shell -> Acquire (Ptr TopoDS.Solid)
+solidFromShell s shell = mkAcquire (rawSolidFromShell s shell) (deleteShape . upcast)
+
+foreign import capi unsafe "hs_ShapeFix_Solid.h hs_ShapeFix_Solid_status" rawStatus :: Ptr Solid -> CInt -> IO CBool
+
+status :: Ptr Solid  -> Status -> IO Bool
+status s toCheck = cBoolToBool <$> rawStatus s (fromIntegral . fromEnum $ toCheck) 
diff --git a/src/OpenCascade/ShapeFix/Types.hs b/src/OpenCascade/ShapeFix/Types.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/ShapeFix/Types.hs
@@ -0,0 +1,6 @@
+{-# LANGUAGE EmptyDataDecls #-}
+module OpenCascade.ShapeFix.Types
+( Solid
+) where
+
+data Solid
diff --git a/src/OpenCascade/StlAPI/Internal/Destructors.hs b/src/OpenCascade/StlAPI/Internal/Destructors.hs
--- a/src/OpenCascade/StlAPI/Internal/Destructors.hs
+++ b/src/OpenCascade/StlAPI/Internal/Destructors.hs
@@ -1,6 +1,7 @@
 {-# LANGUAGE CApiFFI #-}
 module OpenCascade.StlAPI.Internal.Destructors 
 ( deleteWriter
+, deleteReader
 ) where
 
 import OpenCascade.StlAPI.Types
@@ -8,3 +9,4 @@
 import Foreign.Ptr
 
 foreign import capi unsafe "hs_StlAPI_Writer.h hs_delete_StlAPI_Writer" deleteWriter :: Ptr Writer -> IO ()
+foreign import capi unsafe "hs_StlAPI_Reader.h hs_delete_StlAPI_Reader" deleteReader :: Ptr Reader -> IO ()
diff --git a/src/OpenCascade/StlAPI/Reader.hs b/src/OpenCascade/StlAPI/Reader.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/StlAPI/Reader.hs
@@ -0,0 +1,25 @@
+{-# LANGUAGE CApiFFI #-}
+module OpenCascade.StlAPI.Reader
+( Reader
+, new
+, read
+) where
+
+import Prelude hiding (read)
+import OpenCascade.StlAPI.Types (Reader)
+import OpenCascade.StlAPI.Internal.Destructors (deleteReader)
+import qualified OpenCascade.TopoDS as TopoDS
+import Foreign.C
+import Foreign.Ptr
+import Data.Acquire
+import OpenCascade.Internal.Bool (cBoolToBool)
+
+foreign import capi unsafe "hs_StlAPI_Reader.h hs_new_StlAPI_Reader" rawNew :: IO (Ptr Reader)
+
+new :: Acquire (Ptr Reader)
+new = mkAcquire rawNew deleteReader
+
+foreign import capi unsafe "hs_StlAPI_Reader.h hs_StlAPI_Reader_read" rawRead :: Ptr Reader -> Ptr TopoDS.Shape -> CString -> IO (CBool)
+
+read :: Ptr Reader -> Ptr TopoDS.Shape -> String -> IO (Bool)
+read reader shape filename = cBoolToBool <$> withCString filename (rawRead reader shape)
diff --git a/src/OpenCascade/StlAPI/Types.hs b/src/OpenCascade/StlAPI/Types.hs
--- a/src/OpenCascade/StlAPI/Types.hs
+++ b/src/OpenCascade/StlAPI/Types.hs
@@ -2,6 +2,8 @@
 {-# LANGUAGE EmptyDataDecls #-}
 module OpenCascade.StlAPI.Types 
 ( Writer
+, Reader
 ) where
 
 data Writer
+data Reader
diff --git a/src/OpenCascade/StlAPI/Writer.hs b/src/OpenCascade/StlAPI/Writer.hs
--- a/src/OpenCascade/StlAPI/Writer.hs
+++ b/src/OpenCascade/StlAPI/Writer.hs
@@ -1,6 +1,7 @@
 {-# LANGUAGE CApiFFI #-}
 module OpenCascade.StlAPI.Writer
-( new
+( Writer
+, new
 , setAsciiMode
 , write
 ) where
diff --git a/src/OpenCascade/TopAbs/Orientation.hs b/src/OpenCascade/TopAbs/Orientation.hs
--- a/src/OpenCascade/TopAbs/Orientation.hs
+++ b/src/OpenCascade/TopAbs/Orientation.hs
@@ -3,4 +3,4 @@
 ) where
 
 -- this should match the orientation in TopAbs_Orientation
-data Orientation = Forward | Reversed | Internal | External deriving (Show, Enum)
+data Orientation = Forward | Reversed | Internal | External deriving (Show, Enum, Eq)
diff --git a/src/OpenCascade/TopoDS/Builder.hs b/src/OpenCascade/TopoDS/Builder.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/TopoDS/Builder.hs
@@ -0,0 +1,36 @@
+{-# LANGUAGE CApiFFI #-}
+module OpenCascade.TopoDS.Builder 
+( Builder 
+, new
+, makeWire
+, makeShell
+, makeSolid
+, makeCompSolid
+, makeCompound
+, add
+, remove
+) where
+
+import OpenCascade.TopoDS.Types 
+import OpenCascade.TopoDS.Internal.Destructors (deleteBuilder)
+import Foreign.Ptr (Ptr)
+import Data.Acquire (Acquire, mkAcquire)
+
+foreign import capi unsafe "hs_TopoDS_Builder.h hs_new_TopoDS_Builder" rawNew :: IO (Ptr Builder)
+
+new :: Acquire (Ptr Builder)
+new = mkAcquire rawNew deleteBuilder
+
+foreign import capi unsafe "hs_TopoDS_Builder.h hs_TopoDS_Builder_makeWire" makeWire :: Ptr Builder -> Ptr Wire -> IO ()
+
+foreign import capi unsafe "hs_TopoDS_Builder.h hs_TopoDS_Builder_makeShell" makeShell :: Ptr Builder -> Ptr Shell -> IO ()
+
+foreign import capi unsafe "hs_TopoDS_Builder.h hs_TopoDS_Builder_makeSolid" makeSolid :: Ptr Builder -> Ptr Solid -> IO ()
+
+foreign import capi unsafe "hs_TopoDS_Builder.h hs_TopoDS_Builder_makeCompSolid" makeCompSolid :: Ptr Builder -> Ptr CompSolid -> IO ()
+
+foreign import capi unsafe "hs_TopoDS_Builder.h hs_TopoDS_Builder_makeCompound" makeCompound :: Ptr Builder -> Ptr Compound -> IO ()
+
+foreign import capi unsafe "hs_TopoDS_Builder.h hs_TopoDS_Builder_add" add :: Ptr Builder -> Ptr Shape -> Ptr Shape -> IO ()
+
+foreign import capi unsafe "hs_TopoDS_Builder.h hs_TopoDS_Builder_remove" remove :: Ptr Builder -> Ptr Shape -> Ptr Shape -> IO ()
diff --git a/src/OpenCascade/TopoDS/Internal/Destructors.hs b/src/OpenCascade/TopoDS/Internal/Destructors.hs
--- a/src/OpenCascade/TopoDS/Internal/Destructors.hs
+++ b/src/OpenCascade/TopoDS/Internal/Destructors.hs
@@ -1,6 +1,7 @@
 {-# LANGUAGE CApiFFI #-}
 module OpenCascade.TopoDS.Internal.Destructors 
 ( deleteShape
+, deleteBuilder
 ) where
 
 import OpenCascade.TopoDS.Types
@@ -9,4 +10,5 @@
 
 foreign import capi unsafe "hs_TopoDS_Shape.h hs_delete_TopoDS_Shape" deleteShape :: Ptr Shape -> IO ()
 
+foreign import capi unsafe "hs_TopoDS_Builder.h hs_delete_TopoDS_Builder" deleteBuilder :: Ptr Builder -> IO ()
 
diff --git a/src/OpenCascade/TopoDS/Types.hs b/src/OpenCascade/TopoDS/Types.hs
--- a/src/OpenCascade/TopoDS/Types.hs
+++ b/src/OpenCascade/TopoDS/Types.hs
@@ -11,6 +11,7 @@
 , Solid
 , Vertex
 , Wire
+, Builder
 )
 
 where
@@ -32,6 +33,8 @@
 data Solid
 data Vertex
 data Wire
+
+data Builder
 
 -- duplicate definition of shape type from TopoDS.Shape
 -- to simultaniously avoid Orphan Instances + circular dependencies
diff --git a/src/OpenCascade/XSControl/Reader.hs b/src/OpenCascade/XSControl/Reader.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/XSControl/Reader.hs
@@ -0,0 +1,34 @@
+{-# LANGUAGE CApiFFI #-}
+module OpenCascade.XSControl.Reader 
+( Reader
+, readFile
+, transferRoots
+, oneShape
+) where
+
+import Prelude hiding (readFile)
+import OpenCascade.XSControl.Types (Reader)
+import OpenCascade.IFSelect.ReturnStatus (ReturnStatus)
+import qualified OpenCascade.TopoDS.Types as TopoDS
+import OpenCascade.TopoDS.Internal.Destructors (deleteShape)
+import OpenCascade.Internal.Bool (cBoolToBool)
+import Foreign.C.String (CString, withCString)
+import Foreign.C (CInt (..), CBool (..))
+import Foreign.Ptr (Ptr)
+import Data.Acquire (Acquire, mkAcquire)
+
+foreign import capi unsafe "hs_XSControl_Reader.h hs_XSControl_Reader_readFile" rawReadFile :: Ptr Reader -> CString -> IO CInt
+
+readFile :: Ptr Reader -> String -> IO ReturnStatus
+readFile reader s = toEnum . fromIntegral <$> withCString s (rawReadFile reader)
+
+
+foreign import capi unsafe "hs_XSControl_Reader.h hs_XSControl_Reader_transferRoots" rawTransferRoots :: Ptr Reader  -> IO (CBool)
+
+transferRoots :: Ptr Reader -> IO Bool
+transferRoots reader = cBoolToBool <$> rawTransferRoots reader
+
+foreign import capi unsafe "hs_XSControl_Reader.h hs_XSControl_Reader_oneShape" rawOneShape :: Ptr Reader  -> IO (Ptr TopoDS.Shape) 
+
+oneShape :: Ptr Reader -> Acquire (Ptr TopoDS.Shape)
+oneShape reader  = mkAcquire (rawOneShape reader) deleteShape
diff --git a/src/OpenCascade/XSControl/Types.hs b/src/OpenCascade/XSControl/Types.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/XSControl/Types.hs
@@ -0,0 +1,6 @@
+{-# LANGUAGE EmptyDataDecls #-}
+module OpenCascade.XSControl.Types
+( Reader
+) where
+
+data Reader 
