diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -8,6 +8,26 @@
 
 ## Unreleased
 
+- Add `OpenCascade.BRepFilletAPI.MakeFillet` methods `reset`, `nbFaultyContours`, `faultyContour`, `nbEdges`, `edge` and `remove`
+- Add `OpenCascade.BRepBuilderAPI.MakeShape` method `build`
+- Add `OpenCascade.BRepOffsetAPI.MakePipe` constructor `fromWireShapeTrihedronModeAndForceC1`
+- Add `OpenCascade.GeomFill.Trihedron`
+- Add `OpenCascade.BRepAdaptor.Curve`
+- Add `OpenCascade.GeomAbs.CurveType`
+- Add `OpenCascade.GeomAbs.Shape`
+- Add `OpenCascade.GeomConvert.BSplineCurveToBezierCurve`
+- Add `OpenCascade.GeomConvert.ApproxCurve`
+- Add `OpenCascade.Geom.BSplineCurve`
+- Add `OpenCascade.Geom.BezierCurve` methods `pole`, `nbPoles` and `isRational`
+- Add `OpenCascade.GeomAdaptor.Curve`
+- Add `OpenCascade.ShapeConstruct.Curve`
+- Add `OpenCascade.HLRAlgo.Projector`
+- Add `OpenCascade.HLRBRep.Algo`
+- Add `OpenCascade.HLRBRep.HLRToShape`
+- Add `OpenCascade.HLRBRep.TypeOfResultingEdge`
+- Add `OpenCascade.BRepLib` method `buildCurve3d`
+- Add `OpenCascade.Geom.Curve` methods `firstParameter` and `lastParameter`
+
 ## 0.4.0.0
 
 - Add `OpenCascade.BRepBuilderAPI.MakeVertex`
diff --git a/cpp/hs_BRepAdaptor_Curve.cpp b/cpp/hs_BRepAdaptor_Curve.cpp
new file mode 100644
--- /dev/null
+++ b/cpp/hs_BRepAdaptor_Curve.cpp
@@ -0,0 +1,35 @@
+#include <GeomAbs_CurveType.hxx>
+#include <BRepAdaptor_Curve.hxx>
+#include "hs_BRepAdaptor_Curve.h"
+
+BRepAdaptor_Curve * hs_new_BRepAdaptor_Curve_fromEdge(TopoDS_Edge * edge){
+    return new BRepAdaptor_Curve(*edge);
+}
+
+void hs_delete_BRepAdaptor_Curve(BRepAdaptor_Curve * curve){
+    delete curve;
+}
+
+GeomAbs_CurveType hs_BRepAdaptor_Curve_curveType(BRepAdaptor_Curve* curve){
+    return curve->GetType();   
+}
+
+Handle(Geom_BezierCurve) * hs_BRepAdaptor_Curve_bezier(BRepAdaptor_Curve * curve){
+    return new opencascade::handle(curve->Bezier());
+}
+
+Handle(Geom_BSplineCurve) * hs_BRepAdaptor_Curve_bspline(BRepAdaptor_Curve * curve){
+    return new opencascade::handle(curve->BSpline());
+}
+
+GeomAdaptor_Curve * hs_BRepAdaptor_Curve_curve(BRepAdaptor_Curve * curve){
+    return new GeomAdaptor_Curve(curve->Curve());
+}
+
+double hs_BRepAdaptor_Curve_firstParameter(BRepAdaptor_Curve *curve){
+    return curve->FirstParameter();
+}
+
+double hs_BRepAdaptor_Curve_lastParameter(BRepAdaptor_Curve *curve){
+    return curve->LastParameter();
+}
diff --git a/cpp/hs_BRepAdaptor_Curve.h b/cpp/hs_BRepAdaptor_Curve.h
new file mode 100644
--- /dev/null
+++ b/cpp/hs_BRepAdaptor_Curve.h
@@ -0,0 +1,30 @@
+#ifndef HS_BREP_ADAPTOR_CURVE_H
+#define HS_BREP_ADAPTOR_CURVE_H
+
+#include "hs_types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+BRepAdaptor_Curve * hs_new_BRepAdaptor_Curve_fromEdge(TopoDS_Edge * edge);
+
+void hs_delete_BRepAdaptor_Curve(BRepAdaptor_Curve * curve);
+
+GeomAbs_CurveType hs_BRepAdaptor_Curve_curveType(BRepAdaptor_Curve* curve);
+
+Handle(Geom_BezierCurve) * hs_BRepAdaptor_Curve_bezier(BRepAdaptor_Curve * curve);
+
+Handle(Geom_BSplineCurve) * hs_BRepAdaptor_Curve_bspline(BRepAdaptor_Curve * curve);
+
+GeomAdaptor_Curve * hs_BRepAdaptor_Curve_curve(BRepAdaptor_Curve * curve);
+
+double hs_BRepAdaptor_Curve_firstParameter(BRepAdaptor_Curve *curve);
+
+double hs_BRepAdaptor_Curve_lastParameter(BRepAdaptor_Curve *curve);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // HS_BREP_ADAPTOR_CURVE_H
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
@@ -5,3 +5,7 @@
 TopoDS_Shape * hs_BRepBuilderAPI_MakeShape_shape(BRepBuilderAPI_MakeShape* builder){
     return new TopoDS_Shape(builder->Shape());
 }
+
+void hs_BRepBuilderAPI_MakeShape_build(BRepBuilderAPI_MakeShape* builder){
+    builder->Build();
+}
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
@@ -9,6 +9,7 @@
 
 TopoDS_Shape * hs_BRepBuilderAPI_MakeShape_shape(BRepBuilderAPI_MakeShape * builder);
 
+void hs_BRepBuilderAPI_MakeShape_build(BRepBuilderAPI_MakeShape* builder);
 
 #ifdef __cplusplus
 }
diff --git a/cpp/hs_BRepFilletAPI_MakeFillet.cpp b/cpp/hs_BRepFilletAPI_MakeFillet.cpp
--- a/cpp/hs_BRepFilletAPI_MakeFillet.cpp
+++ b/cpp/hs_BRepFilletAPI_MakeFillet.cpp
@@ -18,8 +18,30 @@
     builder->Add(r, *edge);
 }
 
-
 void hs_BRepFilletAPI_MakeFillet_addEdgeWithTwoRadiuses(BRepFilletAPI_MakeFillet * builder, double r1, double r2, TopoDS_Edge *edge ){
     builder->Add(r1, r2, *edge);
 }
 
+void hs_BRepFilletAPI_MakeFillet_reset(BRepFilletAPI_MakeFillet * builder){
+    builder->Reset();
+}
+
+int hs_BRepFilletAPI_MakeFillet_nbFaultyContours(BRepFilletAPI_MakeFillet * builder){
+    return builder->NbFaultyContours();
+}
+
+int hs_BRepFilletAPI_MakeFillet_faultyContour(BRepFilletAPI_MakeFillet * builder, int index){
+    return builder->FaultyContour(index);
+}
+
+int hs_BRepFilletAPI_MakeFillet_nbEdges(BRepFilletAPI_MakeFillet * builder, int contourIndex){
+    return builder->NbEdges(contourIndex);
+}
+
+TopoDS_Edge * hs_BRepFilletAPI_MakeFillet_edge(BRepFilletAPI_MakeFillet * builder, int contourIndex, int edgeIndex){
+    return new TopoDS_Edge(builder->Edge(contourIndex, edgeIndex));
+}
+
+void hs_BRepFilletAPI_MakeFillet_remove(BRepFilletAPI_MakeFillet * builder, TopoDS_Edge * edge){
+    builder->Remove(*edge);
+}
diff --git a/cpp/hs_BRepFilletAPI_MakeFillet.h b/cpp/hs_BRepFilletAPI_MakeFillet.h
--- a/cpp/hs_BRepFilletAPI_MakeFillet.h
+++ b/cpp/hs_BRepFilletAPI_MakeFillet.h
@@ -17,6 +17,18 @@
 
 void hs_BRepFilletAPI_MakeFillet_addEdgeWithTwoRadiuses(BRepFilletAPI_MakeFillet * builder, double r1, double r2, TopoDS_Edge *edge );
 
+void hs_BRepFilletAPI_MakeFillet_reset(BRepFilletAPI_MakeFillet * builder);
+
+int hs_BRepFilletAPI_MakeFillet_nbFaultyContours(BRepFilletAPI_MakeFillet * builder);
+
+int hs_BRepFilletAPI_MakeFillet_faultyContour(BRepFilletAPI_MakeFillet * builder, int index);
+
+int hs_BRepFilletAPI_MakeFillet_nbEdges(BRepFilletAPI_MakeFillet * builder, int contourIndex);
+
+TopoDS_Edge * hs_BRepFilletAPI_MakeFillet_edge(BRepFilletAPI_MakeFillet * builder, int contourIndex, int edgeIndex);
+
+void hs_BRepFilletAPI_MakeFillet_remove(BRepFilletAPI_MakeFillet * builder, TopoDS_Edge * edge);
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/cpp/hs_BRepLib.cpp b/cpp/hs_BRepLib.cpp
--- a/cpp/hs_BRepLib.cpp
+++ b/cpp/hs_BRepLib.cpp
@@ -4,3 +4,7 @@
 bool hs_BRepLib_orientClosedSolid(TopoDS_Solid * solid){
     return BRepLib::OrientClosedSolid(*solid);
 }
+
+bool hs_BRepLib_buildCurve3d(TopoDS_Edge* edge, double tolerance, GeomAbs_Shape continuity, int maxDegree, int maxSegment){
+    return BRepLib::BuildCurve3d(*edge, tolerance, continuity, maxDegree, maxSegment);
+}
diff --git a/cpp/hs_BRepLib.h b/cpp/hs_BRepLib.h
--- a/cpp/hs_BRepLib.h
+++ b/cpp/hs_BRepLib.h
@@ -9,6 +9,8 @@
 
 bool hs_BRepLib_orientClosedSolid(TopoDS_Solid * solid);
 
+bool hs_BRepLib_buildCurve3d(TopoDS_Edge* edge, double tolerance, GeomAbs_Shape continuity, int maxDegree, int maxSegment);
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/cpp/hs_BRepOffsetAPI_MakePipe.cpp b/cpp/hs_BRepOffsetAPI_MakePipe.cpp
--- a/cpp/hs_BRepOffsetAPI_MakePipe.cpp
+++ b/cpp/hs_BRepOffsetAPI_MakePipe.cpp
@@ -5,6 +5,13 @@
     return new BRepOffsetAPI_MakePipe(*wire, *profile);
 }
 
+BRepOffsetAPI_MakePipe * hs_new_BRepOffsetAPI_MakePipe_fromWireShapeTrihedronModeAndForceC1(
+    TopoDS_Wire * wire,
+    TopoDS_Shape * profile,
+    GeomFill_Trihedron mode, 
+    bool forceApproxC1 ){
+    return new BRepOffsetAPI_MakePipe(*wire, *profile, mode, forceApproxC1);
+}
 
 void hs_delete_BRepOffsetAPI_MakePipe(BRepOffsetAPI_MakePipe * builder){
     delete builder;
diff --git a/cpp/hs_BRepOffsetAPI_MakePipe.h b/cpp/hs_BRepOffsetAPI_MakePipe.h
--- a/cpp/hs_BRepOffsetAPI_MakePipe.h
+++ b/cpp/hs_BRepOffsetAPI_MakePipe.h
@@ -9,6 +9,12 @@
 
 BRepOffsetAPI_MakePipe * hs_new_BRepOffsetAPI_MakePipe_fromWireAndShape(TopoDS_Wire * wire, TopoDS_Shape * profile);
 
+BRepOffsetAPI_MakePipe * hs_new_BRepOffsetAPI_MakePipe_fromWireShapeTrihedronModeAndForceC1(
+    TopoDS_Wire * wire,
+    TopoDS_Shape * profile,
+    GeomFill_Trihedron mode, 
+    bool forceApproxC1 );
+
 void hs_delete_BRepOffsetAPI_MakePipe(BRepOffsetAPI_MakePipe * builder);
 
 #ifdef __cplusplus
diff --git a/cpp/hs_GeomAdaptor_Curve.cpp b/cpp/hs_GeomAdaptor_Curve.cpp
new file mode 100644
--- /dev/null
+++ b/cpp/hs_GeomAdaptor_Curve.cpp
@@ -0,0 +1,22 @@
+#include <GeomAdaptor_Curve.hxx>
+#include "hs_GeomAdaptor_Curve.h"
+
+GeomAdaptor_Curve * hs_new_GeomAdaptor_Curve_fromHandle(Handle(Geom_Curve) *curve){
+    return new GeomAdaptor_Curve(*curve);
+}
+
+void hs_delete_GeomAdaptor_Curve(GeomAdaptor_Curve * adaptor){
+    delete adaptor;
+}
+
+double hs_GeomAdaptor_Curve_firstParameter(GeomAdaptor_Curve * adaptor){
+    return adaptor->FirstParameter();
+}
+
+double hs_GeomAdaptor_Curve_lastParameter(GeomAdaptor_Curve * adaptor){
+    return adaptor->LastParameter();
+}
+
+Handle(Geom_Curve)* hs_GeomAdaptor_Curve_curve(GeomAdaptor_Curve * adaptor){
+    return new opencascade::handle(adaptor->Curve());
+}
diff --git a/cpp/hs_GeomAdaptor_Curve.h b/cpp/hs_GeomAdaptor_Curve.h
new file mode 100644
--- /dev/null
+++ b/cpp/hs_GeomAdaptor_Curve.h
@@ -0,0 +1,24 @@
+#ifndef HS_GEOM_ADAPTOR_CURVE_H
+#define HS_GEOM_ADAPTOR_CURVE_H
+
+#include "hs_types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+GeomAdaptor_Curve * hs_new_GeomAdaptor_Curve_fromHandle(Handle(Geom_Curve) *curve);
+
+void hs_delete_GeomAdaptor_Curve(GeomAdaptor_Curve * adaptor);
+
+double hs_GeomAdaptor_Curve_firstParameter(GeomAdaptor_Curve * adaptor);
+
+double hs_GeomAdaptor_Curve_lastParameter(GeomAdaptor_Curve * adaptor);
+
+Handle(Geom_Curve)* hs_GeomAdaptor_Curve_curve(GeomAdaptor_Curve * adaptor);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // HS_GEOM_ADAPTOR_CURVE_H
diff --git a/cpp/hs_GeomConvert_ApproxCurve.cpp b/cpp/hs_GeomConvert_ApproxCurve.cpp
new file mode 100644
--- /dev/null
+++ b/cpp/hs_GeomConvert_ApproxCurve.cpp
@@ -0,0 +1,29 @@
+#include <GeomConvert_ApproxCurve.hxx>
+#include <Geom_Curve.hxx>
+#include "hs_GeomConvert_ApproxCurve.h"
+
+GeomConvert_ApproxCurve * hs_new_GeomConvert_ApproxCurve_fromCurveToleranceOrderSegmentsAndDegree(
+        Handle(Geom_Curve) *curve, 
+        double tolerance, 
+        GeomAbs_Shape order, 
+        int maxSegments, 
+        int maxDegree
+    ) {
+        return new GeomConvert_ApproxCurve(*curve, tolerance, order, maxSegments, maxDegree);
+}
+
+void hs_delete_GeomConvert_ApproxCurve(GeomConvert_ApproxCurve * approxCurve){
+    delete approxCurve;
+}
+
+Handle(Geom_BSplineCurve) * hs_GeomConvert_ApproxCurve_curve(GeomConvert_ApproxCurve * approxCurve){
+    return new opencascade::handle(approxCurve->Curve());
+}
+
+bool hs_GeomConvert_ApproxCurve_isDone(GeomConvert_ApproxCurve * approxCurve){
+    return approxCurve->IsDone();
+}
+
+bool hs_GeomConvert_ApproxCurve_hasResult(GeomConvert_ApproxCurve * approxCurve){
+    return approxCurve->HasResult();
+}
diff --git a/cpp/hs_GeomConvert_ApproxCurve.h b/cpp/hs_GeomConvert_ApproxCurve.h
new file mode 100644
--- /dev/null
+++ b/cpp/hs_GeomConvert_ApproxCurve.h
@@ -0,0 +1,30 @@
+#ifndef HS_GEOM_CONVERT_APPROX_CURVE_H
+#define HS_GEOM_CONVERT_APPROX_CURVE_H
+
+#include "hs_types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+GeomConvert_ApproxCurve * hs_new_GeomConvert_ApproxCurve_fromCurveToleranceOrderSegmentsAndDegree(
+        Handle(Geom_Curve) *curve, 
+        double tolerance, 
+        GeomAbs_Shape order, 
+        int maxSegments, 
+        int maxDegree
+    );
+
+void hs_delete_GeomConvert_ApproxCurve(GeomConvert_ApproxCurve * approxCurve);
+
+Handle(Geom_BSplineCurve) * hs_GeomConvert_ApproxCurve_curve(GeomConvert_ApproxCurve * approxCurve);
+
+bool hs_GeomConvert_ApproxCurve_isDone(GeomConvert_ApproxCurve * approxCurve);
+
+bool hs_GeomConvert_ApproxCurve_hasResult(GeomConvert_ApproxCurve * approxCurve);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // HS_GEOM_CONVERT_APPROX_CURVE_H
diff --git a/cpp/hs_GeomConvert_BSplineCurveToBezierCurve.cpp b/cpp/hs_GeomConvert_BSplineCurveToBezierCurve.cpp
new file mode 100644
--- /dev/null
+++ b/cpp/hs_GeomConvert_BSplineCurveToBezierCurve.cpp
@@ -0,0 +1,27 @@
+#include <GeomConvert_BSplineCurveToBezierCurve.hxx>
+#include "hs_types.h"
+#include "hs_GeomConvert_BSplineCurveToBezierCurve.h"
+
+GeomConvert_BSplineCurveToBezierCurve * hs_new_GeomConvert_BSplineCurveToBezierCurve_fromHandle (Handle(Geom_BSplineCurve) *basisCurve){
+    return new GeomConvert_BSplineCurveToBezierCurve(*basisCurve);
+}
+
+GeomConvert_BSplineCurveToBezierCurve * hs_new_GeomConvert_BSplineCurveToBezierCurve_fromHandleParametersAndTolerance (
+    Handle(Geom_BSplineCurve) *basisCurve,
+    double firstParameter, 
+    double secondParameter,
+    double tolerance ){
+    return new GeomConvert_BSplineCurveToBezierCurve(*basisCurve, firstParameter, secondParameter, tolerance);
+}
+
+void hs_delete_GeomConvert_BSplineCurveToBezierCurve(GeomConvert_BSplineCurveToBezierCurve* ptr){
+    delete ptr;
+}
+
+int hs_GeomConvert_BSplineCurveToBezierCurve_nbArcs(GeomConvert_BSplineCurveToBezierCurve* ptr){
+    return ptr->NbArcs();
+}
+
+Handle(Geom_BezierCurve) * hs_GeomConvert_BSplineCurveToBezierCurve_arc(GeomConvert_BSplineCurveToBezierCurve * ptr, int n){
+    return new opencascade::handle(ptr->Arc(n));
+} 
diff --git a/cpp/hs_GeomConvert_BSplineCurveToBezierCurve.h b/cpp/hs_GeomConvert_BSplineCurveToBezierCurve.h
new file mode 100644
--- /dev/null
+++ b/cpp/hs_GeomConvert_BSplineCurveToBezierCurve.h
@@ -0,0 +1,28 @@
+#ifndef HS_GEOM_CONVERT_BSPLINE_CURVE_TO_BEZIER_CURVE_H
+#define HS_GEOM_CONVERT_BSPLINE_CURVE_TO_BEZIER_CURVE_H
+
+#include "hs_types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+GeomConvert_BSplineCurveToBezierCurve * hs_new_GeomConvert_BSplineCurveToBezierCurve_fromHandle (Handle(Geom_BSplineCurve) *basisCurve);
+
+GeomConvert_BSplineCurveToBezierCurve * hs_new_GeomConvert_BSplineCurveToBezierCurve_fromHandleParametersAndTolerance (
+    Handle(Geom_BSplineCurve) *basisCurve,
+    double firstParameter, 
+    double secondParameter,
+    double tolerance );
+
+void hs_delete_GeomConvert_BSplineCurveToBezierCurve(GeomConvert_BSplineCurveToBezierCurve* ptr);
+
+int hs_GeomConvert_BSplineCurveToBezierCurve_nbArcs(GeomConvert_BSplineCurveToBezierCurve* ptr);
+
+Handle(Geom_BezierCurve) * hs_GeomConvert_BSplineCurveToBezierCurve_arc(GeomConvert_BSplineCurveToBezierCurve * ptr, int n);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // HS_GEOM_CONVERT_BSPLINE_CURVE_TO_BEZIER_CURVE_H
diff --git a/cpp/hs_Geom_BSplineCurve.cpp b/cpp/hs_Geom_BSplineCurve.cpp
new file mode 100644
--- /dev/null
+++ b/cpp/hs_Geom_BSplineCurve.cpp
@@ -0,0 +1,33 @@
+#include <Geom_BSplineCurve.hxx>
+#include <NCollection_Array1.hxx>
+#include <gp_Pnt.hxx>
+#include <Standard_Handle.hxx>
+#include "hs_Geom_BSplineCurve.h"
+
+Handle(Geom_BSplineCurve) * hs_Geom_BSplineCurve_toHandle(Geom_BSplineCurve * curve){
+    return new Handle(Geom_BSplineCurve)(new Geom_BSplineCurve(*curve));
+}
+
+void hs_delete_Handle_Geom_BSplineCurve(Handle(Geom_BSplineCurve)* h){
+    delete h;
+}
+
+void hs_delete_Geom_BSplineCurve(Geom_BSplineCurve * curve){
+    delete curve;
+}
+
+int hs_Geom_BSplineCurve_nbPoles(Handle(Geom_BSplineCurve)* h){
+    return (*h)->NbPoles();
+}
+
+gp_Pnt * hs_Geom_BSplineCurve_pole(Handle(Geom_BSplineCurve)* h, int index){
+    return new gp_Pnt((*h)->Pole(index));
+}
+
+bool hs_Geom_BSplineCurve_isRational(Handle(Geom_BSplineCurve) *h) {
+    return (*h)->IsRational();
+}
+
+void hs_Geom_BSplineCurve_segment(Handle(Geom_BSplineCurve) *h, double u1, double u2, double confusion){
+    (*h)->Segment(u1, u2, confusion);
+}
diff --git a/cpp/hs_Geom_BSplineCurve.h b/cpp/hs_Geom_BSplineCurve.h
new file mode 100644
--- /dev/null
+++ b/cpp/hs_Geom_BSplineCurve.h
@@ -0,0 +1,30 @@
+
+#ifndef HS_GEOM_BSPLINECURVE_H
+#define HS_GEOM_BSPLINECURVE_H
+
+#include "hs_types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+Handle(Geom_BSplineCurve) * hs_Geom_BSplineCurve_toHandle(Geom_BSplineCurve * curve);
+
+void hs_delete_Handle_Geom_BSplineCurve(Handle(Geom_BSplineCurve)* h);
+
+void hs_delete_Geom_BSplineCurve(Geom_BSplineCurve * curve);
+
+int hs_Geom_BSplineCurve_nbPoles(Handle(Geom_BSplineCurve)* h);
+
+gp_Pnt * hs_Geom_BSplineCurve_pole(Handle(Geom_BSplineCurve)* h, int index);
+
+bool hs_Geom_BSplineCurve_isRational(Handle(Geom_BSplineCurve) *h);
+
+void hs_Geom_BSplineCurve_segment(Handle(Geom_BSplineCurve) *h, double u1, double u2, double confusion);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // HS_GEOM_BSPLINECURVE_H
diff --git a/cpp/hs_Geom_BezierCurve.cpp b/cpp/hs_Geom_BezierCurve.cpp
--- a/cpp/hs_Geom_BezierCurve.cpp
+++ b/cpp/hs_Geom_BezierCurve.cpp
@@ -12,10 +12,26 @@
     return new Handle(Geom_BezierCurve)(new Geom_BezierCurve(*curve));
 }
 
+int hs_Geom_BezierCurve_nbPoles(Handle(Geom_BezierCurve)* h){
+    return (*h)->NbPoles();
+}
+
+gp_Pnt * hs_Geom_BezierCurve_pole(Handle(Geom_BezierCurve)* h, int index){
+    return new gp_Pnt((*h)->Pole(index));
+}
+
+bool hs_Geom_BezierCurve_isRational(Handle(Geom_BezierCurve) *h) {
+    return (*h)->IsRational();
+}
+
 void hs_delete_Handle_Geom_BezierCurve(Handle(Geom_BezierCurve)* h){
     delete h;
 }
 
 void hs_delete_Geom_BezierCurve(Geom_BezierCurve * curve){
     delete curve;
+}
+
+void hs_Geom_BezierCurve_segment(Handle(Geom_BezierCurve) *h, double u1, double u2){
+    (*h)->Segment(u1, u2);
 }
diff --git a/cpp/hs_Geom_BezierCurve.h b/cpp/hs_Geom_BezierCurve.h
--- a/cpp/hs_Geom_BezierCurve.h
+++ b/cpp/hs_Geom_BezierCurve.h
@@ -11,9 +11,17 @@
 
 Handle(Geom_BezierCurve) * hs_Geom_BezierCurve_toHandle(Geom_BezierCurve * curve);
 
+int hs_Geom_BezierCurve_nbPoles(Handle(Geom_BezierCurve)* h);
+
+gp_Pnt * hs_Geom_BezierCurve_pole(Handle(Geom_BezierCurve)* h, int index);
+
+bool hs_Geom_BezierCurve_isRational(Handle(Geom_BezierCurve) *h);
+
 void hs_delete_Handle_Geom_BezierCurve(Handle(Geom_BezierCurve)* h);
 
 void hs_delete_Geom_BezierCurve(Geom_BezierCurve * curve);
+
+void hs_Geom_BezierCurve_segment(Handle(Geom_BezierCurve) *h, double u1, double u2);
 
 #ifdef __cplusplus
 }
diff --git a/cpp/hs_Geom_Curve.cpp b/cpp/hs_Geom_Curve.cpp
--- a/cpp/hs_Geom_Curve.cpp
+++ b/cpp/hs_Geom_Curve.cpp
@@ -1,4 +1,5 @@
 #include <Geom_Curve.hxx>
+#include <GeomAbs_CurveType.hxx>
 #include <gp_Pnt.hxx>
 #include <gp_Vec.hxx>
 #include "hs_Geom_Curve.h"
@@ -9,6 +10,14 @@
 
 gp_Pnt * hs_Geom_Curve_value(Handle(Geom_Curve) * curve, double u){
     return new gp_Pnt((*curve)->Value(u));
+}
+
+double hs_Geom_Curve_firstParameter(Handle(Geom_Curve) * curve){
+    return (*curve)->FirstParameter();
+}
+
+double hs_Geom_Curve_lastParameter(Handle(Geom_Curve) * curve){
+    return (*curve)->LastParameter();
 }
 
 gp_Vec * hs_Geom_Curve_dn(Handle (Geom_Curve) * curve, double u, int n){
diff --git a/cpp/hs_Geom_Curve.h b/cpp/hs_Geom_Curve.h
--- a/cpp/hs_Geom_Curve.h
+++ b/cpp/hs_Geom_Curve.h
@@ -10,6 +10,10 @@
 
 gp_Pnt * hs_Geom_Curve_value(Handle(Geom_Curve) * curve, double u);
 
+double hs_Geom_Curve_firstParameter(Handle(Geom_Curve) * curve);
+
+double hs_Geom_Curve_lastParameter(Handle(Geom_Curve) * curve);
+
 gp_Vec * hs_Geom_Curve_dn(Handle (Geom_Curve) * curve, double u, int n);
 
 double hs_Geom_Curve_reversedParameter(Handle (Geom_Curve) * curve, double parameter);
diff --git a/cpp/hs_HLRAlgo_Projector.cpp b/cpp/hs_HLRAlgo_Projector.cpp
new file mode 100644
--- /dev/null
+++ b/cpp/hs_HLRAlgo_Projector.cpp
@@ -0,0 +1,10 @@
+#include <HLRAlgo_Projector.hxx>
+#include "hs_HLRAlgo_Projector.h"
+
+HLRAlgo_Projector * hs_new_HLRAlgo_Projector_fromAx2(gp_Ax2* axis){
+    return new HLRAlgo_Projector(*axis);
+}
+
+void hs_delete_HLRAlgo_Projector(HLRAlgo_Projector* projector){
+    delete projector;
+}
diff --git a/cpp/hs_HLRAlgo_Projector.h b/cpp/hs_HLRAlgo_Projector.h
new file mode 100644
--- /dev/null
+++ b/cpp/hs_HLRAlgo_Projector.h
@@ -0,0 +1,18 @@
+#ifndef HS_HLR_ALGO_PROJECTOR_H
+#define HS_HLR_ALGO_PROJECTOR_H
+
+#include "hs_types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+HLRAlgo_Projector * hs_new_HLRAlgo_Projector_fromAx2(gp_Ax2* axis);
+
+void hs_delete_HLRAlgo_Projector(HLRAlgo_Projector* projector);
+#ifdef __cplusplus
+}
+#endif
+
+#endif // HS_HLR_ALGO_PROJECTOR_H
+
diff --git a/cpp/hs_HLRBRep_Algo.cpp b/cpp/hs_HLRBRep_Algo.cpp
new file mode 100644
--- /dev/null
+++ b/cpp/hs_HLRBRep_Algo.cpp
@@ -0,0 +1,27 @@
+#include <HLRBRep_Algo.hxx>
+#include "hs_HLRBRep_Algo.h"
+#include <Standard_Handle.hxx>
+
+Handle(HLRBRep_Algo) * hs_new_HLRBRep_Algo(){
+    return new Handle(HLRBRep_Algo)(new HLRBRep_Algo());
+}
+
+void hs_delete_HLRBRep_Algo(Handle(HLRBRep_Algo) * algo){
+    delete algo;
+}
+
+void hs_HLRBRep_Algo_projector(Handle(HLRBRep_Algo) * algo, HLRAlgo_Projector * projector){
+    (*algo)->Projector(*projector);
+}
+
+void hs_HLRBRep_Algo_update(Handle(HLRBRep_Algo) * algo){
+    (*algo)->Update();
+}
+
+void hs_HLRBRep_Algo_hide(Handle(HLRBRep_Algo) * algo){
+    (*algo)->Hide();
+}
+
+void hs_HLRBRep_Algo_add(Handle(HLRBRep_Algo) * algo, TopoDS_Shape * shape){
+    (*algo)->Add(*shape);
+}
diff --git a/cpp/hs_HLRBRep_Algo.h b/cpp/hs_HLRBRep_Algo.h
new file mode 100644
--- /dev/null
+++ b/cpp/hs_HLRBRep_Algo.h
@@ -0,0 +1,27 @@
+#ifndef HS_HLRBREP_ALGO_H
+#define HS_HLRBREP_ALGO_H
+
+#include "hs_types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+Handle(HLRBRep_Algo) * hs_new_HLRBRep_Algo();
+
+void hs_delete_HLRBRep_Algo(Handle(HLRBRep_Algo) * algo);
+
+void hs_HLRBRep_Algo_projector(Handle(HLRBRep_Algo) * algo, HLRAlgo_Projector * projector);
+
+void hs_HLRBRep_Algo_update(Handle(HLRBRep_Algo) * algo);
+
+void hs_HLRBRep_Algo_hide(Handle(HLRBRep_Algo) * algo);
+
+void hs_HLRBRep_Algo_add(Handle(HLRBRep_Algo) * algo, TopoDS_Shape * shape);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // HS_HLRBREP_ALGO_H
+
diff --git a/cpp/hs_HLRBRep_HLRToShape.cpp b/cpp/hs_HLRBRep_HLRToShape.cpp
new file mode 100644
--- /dev/null
+++ b/cpp/hs_HLRBRep_HLRToShape.cpp
@@ -0,0 +1,14 @@
+#include <HLRBRep_HLRToShape.hxx>
+#include "hs_HLRBRep_HLRToShape.h"
+
+HLRBRep_HLRToShape * hs_new_HLRBRep_HLRToShape_fromHandleAlgo(Handle(HLRBRep_Algo) * algo){
+    return new HLRBRep_HLRToShape(*algo);
+}
+
+void hs_delete_HLRBRep_HLRToShape(HLRBRep_HLRToShape *hlrToShape){
+    delete hlrToShape;
+}
+
+TopoDS_Shape * hs_HLRBRep_HLRToShape_compoundOfEdges(HLRBRep_HLRToShape * toShape, HLRBRep_TypeOfResultingEdge edgeType, bool visible, bool in3d){
+    return new TopoDS_Shape(toShape->CompoundOfEdges(edgeType, visible, in3d));
+}
diff --git a/cpp/hs_HLRBRep_HLRToShape.h b/cpp/hs_HLRBRep_HLRToShape.h
new file mode 100644
--- /dev/null
+++ b/cpp/hs_HLRBRep_HLRToShape.h
@@ -0,0 +1,21 @@
+#ifndef HS_HLRBREP_HLRTOSHAPE_H
+#define HS_HLRBREP_HLRTOSHAPE_H
+
+#include "hs_types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+HLRBRep_HLRToShape * hs_new_HLRBRep_HLRToShape_fromHandleAlgo(Handle(HLRBRep_Algo) * algo);
+
+void hs_delete_HLRBRep_HLRToShape(HLRBRep_HLRToShape *hlrToShape);
+
+TopoDS_Shape * hs_HLRBRep_HLRToShape_compoundOfEdges(HLRBRep_HLRToShape * toShape, HLRBRep_TypeOfResultingEdge edgeType, bool visible, bool in3d);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // HS_HLRBREP_HLRTOSHAPE_H
+
diff --git a/cpp/hs_ShapeConstruct_Curve.cpp b/cpp/hs_ShapeConstruct_Curve.cpp
new file mode 100644
--- /dev/null
+++ b/cpp/hs_ShapeConstruct_Curve.cpp
@@ -0,0 +1,21 @@
+#include <ShapeConstruct_Curve.hxx>
+#include <Geom_Curve.hxx>
+#include "hs_ShapeConstruct_Curve.h"
+
+ShapeConstruct_Curve * hs_new_ShapeConstruct_Curve(){
+    return new ShapeConstruct_Curve();
+}
+
+void hs_delete_ShapeConstruct_Curve(ShapeConstruct_Curve* shapeConstruct){
+    delete shapeConstruct;
+}
+
+Handle(Geom_BSplineCurve) * hs_ShapeConstruct_Curve_convertToBSpline(
+        ShapeConstruct_Curve* shapeConstruct,
+        Handle(Geom_Curve)* curve, 
+        double first,
+        double last,
+        double precision
+    ){
+        return new opencascade::handle(shapeConstruct->ConvertToBSpline(*curve, first, last, precision));
+}
diff --git a/cpp/hs_ShapeConstruct_Curve.h b/cpp/hs_ShapeConstruct_Curve.h
new file mode 100644
--- /dev/null
+++ b/cpp/hs_ShapeConstruct_Curve.h
@@ -0,0 +1,26 @@
+#ifndef HS_SHAPECONSTRUCT_CURVE_H
+#define HS_SHAPECONSTRUCT_CURVE_H
+
+#include "hs_types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+ShapeConstruct_Curve * hs_new_ShapeConstruct_Curve();
+
+void hs_delete_ShapeConstruct_Curve(ShapeConstruct_Curve* shapeConstruct);
+
+Handle(Geom_BSplineCurve) * hs_ShapeConstruct_Curve_convertToBSpline(
+        ShapeConstruct_Curve* shapeConstruct,
+        Handle(Geom_Curve)* curve, 
+        double first,
+        double last,
+        double precision
+    );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // HS_SHAPECONSTRUCT_CURVE_H
diff --git a/cpp/hs_types.h b/cpp/hs_types.h
--- a/cpp/hs_types.h
+++ b/cpp/hs_types.h
@@ -52,6 +52,8 @@
 typedef void Geom2d_Ellipse;
 typedef void Geom_Curve;
 typedef void Geom_BezierCurve;
+typedef void Geom_BSplineCurve;
+typedef int GeomFill_Trihedron; 
 typedef void BRepOffsetAPI_ThruSections;
 typedef void BRepMesh_IncrementalMesh;
 typedef void StlAPI_Writer;
@@ -87,6 +89,18 @@
 typedef int ShapeExtend_Status;
 typedef void Poly_Triangulation;
 typedef void Poly_Triangle;
+typedef void BRepAdaptor_Curve;
+typedef int GeomAbs_CurveType;
+typedef void GeomConvert_BSplineCurveToBezierCurve;
+typedef void GeomConvert_ApproxCurve;
+typedef int GeomAbs_Shape;
+typedef void GeomAdaptor_Curve;
+typedef void ShapeConstruct_Curve;
+typedef void HLRAlgo_Projector;
+typedef void HLRBRep_Algo;
+typedef void HLRBRep_HLRToShape;
+typedef int HLRBRep_TypeOfResultingEdge;
+
 #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
@@ -1,11 +1,11 @@
 cabal-version: 2.2
 
--- This file has been generated from package.yaml by hpack version 0.36.0.
+-- This file has been generated from package.yaml by hpack version 0.37.0.
 --
 -- see: https://github.com/sol/hpack
 
 name:           opencascade-hs
-version:        0.4.0.0
+version:        0.5.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
@@ -24,6 +24,7 @@
     cpp/hs_Bnd_Box.h
     cpp/hs_Bnd_OBB.h
     cpp/hs_BRep_Tool.h
+    cpp/hs_BRepAdaptor_Curve.h
     cpp/hs_BRepAlgoAPI_Common.h
     cpp/hs_BRepAlgoAPI_Cut.h
     cpp/hs_BRepAlgoAPI_Fuse.h
@@ -58,8 +59,12 @@
     cpp/hs_GC_MakeArcOfCircle.h
     cpp/hs_GC_MakeSegment.h
     cpp/hs_Geom_BezierCurve.h
+    cpp/hs_Geom_BSplineCurve.h
     cpp/hs_Geom_Curve.h
     cpp/hs_Geom_TrimmedCurve.h
+    cpp/hs_GeomAdaptor_Curve.h
+    cpp/hs_GeomConvert_ApproxCurve.h
+    cpp/hs_GeomConvert_BSplineCurveToBezierCurve.h
     cpp/hs_gp.h
     cpp/hs_gp_Ax1.h
     cpp/hs_gp_Ax2.h
@@ -76,6 +81,9 @@
     cpp/hs_gp_Vec2d.h
     cpp/hs_gp_XYZ.h
     cpp/hs_GProp_GProps.h
+    cpp/hs_HLRAlgo_Projector.h
+    cpp/hs_HLRBRep_Algo.h
+    cpp/hs_HLRBRep_HLRToShape.h
     cpp/hs_Message_ProgressRange.h
     cpp/hs_NCollection_Array1.h
     cpp/hs_Poly_Triangle.h
@@ -85,6 +93,7 @@
     cpp/hs_RWMesh_CafReader.h
     cpp/hs_RWObj_CafReader.h
     cpp/hs_RWObj_CafWriter.h
+    cpp/hs_ShapeConstruct_Curve.h
     cpp/hs_ShapeExtend_WireData.h
     cpp/hs_ShapeFix_Solid.h
     cpp/hs_STEPControl_Reader.h
@@ -123,6 +132,10 @@
       OpenCascade.Bnd.OBB
       OpenCascade.Bnd.Types
       OpenCascade.BRep.Tool
+      OpenCascade.BRepAdaptor
+      OpenCascade.BRepAdaptor.Curve
+      OpenCascade.BRepAdaptor.Internal.Destructors
+      OpenCascade.BRepAdaptor.Types
       OpenCascade.BRepAlgoAPI.Common
       OpenCascade.BRepAlgoAPI.Cut
       OpenCascade.BRepAlgoAPI.Fuse
@@ -182,10 +195,22 @@
       OpenCascade.GC.MakeSegment
       OpenCascade.Geom
       OpenCascade.Geom.BezierCurve
+      OpenCascade.Geom.BSplineCurve
       OpenCascade.Geom.Curve
       OpenCascade.Geom.Internal.Destructors
       OpenCascade.Geom.Types
+      OpenCascade.GeomAbs.CurveType
       OpenCascade.GeomAbs.JoinType
+      OpenCascade.GeomAbs.Shape
+      OpenCascade.GeomAdaptor.Curve
+      OpenCascade.GeomAdaptor.Internal.Destructors
+      OpenCascade.GeomAdaptor.Types
+      OpenCascade.GeomConvert.ApproxCurve
+      OpenCascade.GeomConvert.BSplineCurveToBezierCurve
+      OpenCascade.GeomConvert.Internal.Destructors
+      OpenCascade.GeomConvert.Types
+      OpenCascade.GeomFill
+      OpenCascade.GeomFill.Trihedron
       OpenCascade.GP
       OpenCascade.GP.Ax1
       OpenCascade.GP.Ax2
@@ -209,6 +234,14 @@
       OpenCascade.Graphic3D.HorizontalTextAlignment
       OpenCascade.Graphic3D.VerticalTextAlignment
       OpenCascade.Handle
+      OpenCascade.HLRAlgo.Internal.Destructors
+      OpenCascade.HLRAlgo.Projector
+      OpenCascade.HLRAlgo.Types
+      OpenCascade.HLRBRep.Algo
+      OpenCascade.HLRBRep.HLRToShape
+      OpenCascade.HLRBRep.Internal.Destructors
+      OpenCascade.HLRBRep.TypeOfResultingEdge
+      OpenCascade.HLRBRep.Types
       OpenCascade.IFSelect.ReturnStatus
       OpenCascade.Inheritance
       OpenCascade.Internal.Bool
@@ -233,6 +266,9 @@
       OpenCascade.RWObj.CafWriter
       OpenCascade.RWObj.Internal.Destructors
       OpenCascade.RWObj.Types
+      OpenCascade.ShapeConstruct.Curve
+      OpenCascade.ShapeConstruct.Internal.Destructors
+      OpenCascade.ShapeConstruct.Types
       OpenCascade.ShapeExtend.Internal.Destructors
       OpenCascade.ShapeExtend.Status
       OpenCascade.ShapeExtend.Types
@@ -307,6 +343,7 @@
       cpp/hs_Bnd_Box.cpp
       cpp/hs_Bnd_OBB.cpp
       cpp/hs_BRep_Tool.cpp
+      cpp/hs_BRepAdaptor_Curve.cpp
       cpp/hs_BRepAlgoAPI_Common.cpp
       cpp/hs_BRepAlgoAPI_Cut.cpp
       cpp/hs_BRepAlgoAPI_Fuse.cpp
@@ -341,8 +378,12 @@
       cpp/hs_GC_MakeArcOfCircle.cpp
       cpp/hs_GC_MakeSegment.cpp
       cpp/hs_Geom_BezierCurve.cpp
+      cpp/hs_Geom_BSplineCurve.cpp
       cpp/hs_Geom_Curve.cpp
       cpp/hs_Geom_TrimmedCurve.cpp
+      cpp/hs_GeomAdaptor_Curve.cpp
+      cpp/hs_GeomConvert_ApproxCurve.cpp
+      cpp/hs_GeomConvert_BSplineCurveToBezierCurve.cpp
       cpp/hs_gp.cpp
       cpp/hs_gp_Ax1.cpp
       cpp/hs_gp_Ax2.cpp
@@ -359,6 +400,9 @@
       cpp/hs_gp_Vec2d.cpp
       cpp/hs_gp_XYZ.cpp
       cpp/hs_GProp_GProps.cpp
+      cpp/hs_HLRAlgo_Projector.cpp
+      cpp/hs_HLRBRep_Algo.cpp
+      cpp/hs_HLRBRep_HLRToShape.cpp
       cpp/hs_Message_ProgressRange.cpp
       cpp/hs_NCollection_Array1.cpp
       cpp/hs_Poly_Triangle.cpp
@@ -368,6 +412,7 @@
       cpp/hs_RWMesh_CafReader.cpp
       cpp/hs_RWObj_CafReader.cpp
       cpp/hs_RWObj_CafWriter.cpp
+      cpp/hs_ShapeConstruct_Curve.cpp
       cpp/hs_ShapeExtend_WireData.cpp
       cpp/hs_ShapeFix_Solid.cpp
       cpp/hs_STEPControl_Reader.cpp
@@ -399,6 +444,7 @@
       TKStd
       TKG3d
       TKG2d
+      TKHLR
       TKMath
       TKernel
       TKBRep
diff --git a/src/OpenCascade/BRepAdaptor.hs b/src/OpenCascade/BRepAdaptor.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/BRepAdaptor.hs
@@ -0,0 +1,5 @@
+module OpenCascade.BRepAdaptor
+(Curve
+) where
+
+import OpenCascade.BRepAdaptor.Types (Curve)
diff --git a/src/OpenCascade/BRepAdaptor/Curve.hs b/src/OpenCascade/BRepAdaptor/Curve.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/BRepAdaptor/Curve.hs
@@ -0,0 +1,62 @@
+{-# LANGUAGE CApiFFI #-} 
+module OpenCascade.BRepAdaptor.Curve
+( Curve
+, fromEdge
+, curveType
+, bezier
+, bspline
+, curve
+, firstParameter
+, lastParameter
+) where
+ 
+import OpenCascade.BRepAdaptor.Types (Curve)
+import OpenCascade.BRepAdaptor.Internal.Destructors (deleteCurve)
+import OpenCascade.Geom.Internal.Destructors (deleteHandleBezierCurve, deleteHandleBSplineCurve)
+import qualified OpenCascade.Geom.Types as Geom
+import OpenCascade.GeomAbs.CurveType (CurveType)
+import qualified OpenCascade.TopoDS as TopoDS
+import Foreign.Ptr (Ptr)
+import Foreign.C (CInt (..), CDouble (..))
+import Data.Acquire (Acquire, mkAcquire)
+import OpenCascade.Handle (Handle)
+import Data.Coerce (coerce)
+import qualified OpenCascade.GeomAdaptor.Types as GeomAdaptor
+import qualified OpenCascade.GeomAdaptor.Internal.Destructors as GeomAdaptor.Destructors
+
+foreign import capi unsafe "hs_BRepAdaptor_Curve.h hs_new_BRepAdaptor_Curve_fromEdge" rawFromEdge :: Ptr TopoDS.Edge -> IO (Ptr Curve)
+
+fromEdge :: Ptr TopoDS.Edge -> Acquire (Ptr Curve)
+fromEdge e = mkAcquire (rawFromEdge e) deleteCurve
+
+
+foreign import capi unsafe "hs_BRepAdaptor_Curve.h hs_BRepAdaptor_Curve_curveType" rawCurveType :: Ptr Curve -> IO (CInt)
+
+curveType :: Ptr Curve -> IO CurveType
+curveType c = toEnum . fromIntegral <$> rawCurveType c
+
+foreign import capi unsafe "hs_BRepAdaptor_Curve.h hs_BRepAdaptor_Curve_bezier" rawBezier :: Ptr Curve -> IO (Ptr (Handle (Geom.BezierCurve)))
+
+bezier :: Ptr Curve -> Acquire (Ptr (Handle Geom.BezierCurve))
+bezier theCurve = mkAcquire (rawBezier theCurve) deleteHandleBezierCurve
+
+foreign import capi unsafe "hs_BRepAdaptor_Curve.h hs_BRepAdaptor_Curve_bspline" rawBSpline :: Ptr Curve -> IO (Ptr (Handle (Geom.BSplineCurve)))
+
+bspline :: Ptr Curve -> Acquire (Ptr (Handle Geom.BSplineCurve))
+bspline theCurve = mkAcquire (rawBSpline theCurve) deleteHandleBSplineCurve
+
+
+foreign import capi unsafe "hs_BRepAdaptor_Curve.h hs_BRepAdaptor_Curve_curve" rawCurve :: Ptr Curve -> IO (Ptr GeomAdaptor.Curve)
+
+curve :: Ptr Curve -> Acquire (Ptr GeomAdaptor.Curve)
+curve theCurve = mkAcquire (rawCurve theCurve) GeomAdaptor.Destructors.deleteCurve
+
+foreign import capi unsafe "hs_BRepAdaptor_Curve.h hs_BRepAdaptor_Curve_firstParameter" rawFirstParameter :: Ptr Curve -> IO CDouble
+
+firstParameter :: Ptr Curve -> IO Double
+firstParameter = coerce rawFirstParameter
+
+foreign import capi unsafe "hs_BRepAdaptor_Curve.h hs_BRepAdaptor_Curve_lastParameter" rawLastParameter :: Ptr Curve -> IO CDouble
+
+lastParameter :: Ptr Curve -> IO Double
+lastParameter = coerce rawLastParameter
diff --git a/src/OpenCascade/BRepAdaptor/Internal/Destructors.hs b/src/OpenCascade/BRepAdaptor/Internal/Destructors.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/BRepAdaptor/Internal/Destructors.hs
@@ -0,0 +1,10 @@
+{-# LANGUAGE CApiFFI #-} 
+module OpenCascade.BRepAdaptor.Internal.Destructors
+( deleteCurve
+) where
+
+import OpenCascade.BRepAdaptor.Types (Curve)
+import Foreign.Ptr
+
+foreign import capi unsafe "hs_BRepAdaptor_Curve.h hs_delete_BRepAdaptor_Curve" deleteCurve :: Ptr Curve -> IO ()
+
diff --git a/src/OpenCascade/BRepAdaptor/Types.hs b/src/OpenCascade/BRepAdaptor/Types.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/BRepAdaptor/Types.hs
@@ -0,0 +1,6 @@
+{-# LANGUAGE EmptyDataDecls #-}
+module OpenCascade.BRepAdaptor.Types 
+( Curve
+) where
+
+data Curve
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
@@ -2,6 +2,7 @@
 module OpenCascade.BRepBuilderAPI.MakeShape
 ( MakeShape
 , shape
+, build
 ) where
 import OpenCascade.BRepBuilderAPI.Types
 import qualified OpenCascade.TopoDS as TopoDS
@@ -13,3 +14,5 @@
 
 shape :: Ptr MakeShape -> Acquire (Ptr TopoDS.Shape)
 shape builder = mkAcquire (rawShape builder) (deleteShape)  
+
+foreign import capi unsafe "hs_BRepBuilderAPI_MakeShape.h hs_BRepBuilderAPI_MakeShape_build" build :: Ptr MakeShape -> IO ()
diff --git a/src/OpenCascade/BRepFilletAPI/MakeFillet.hs b/src/OpenCascade/BRepFilletAPI/MakeFillet.hs
--- a/src/OpenCascade/BRepFilletAPI/MakeFillet.hs
+++ b/src/OpenCascade/BRepFilletAPI/MakeFillet.hs
@@ -5,16 +5,25 @@
 , addEdge
 , addEdgeWithRadius
 , addEdgeWithTwoRadiuses
+, reset
+, nbFaultyContours
+, faultyContour
+, nbEdges
+, edge
+, remove
 ) where
 
 import OpenCascade.BRepFilletAPI.Types (MakeFillet)
 import OpenCascade.BRepFilletAPI.Internal.Destructors (deleteMakeFillet)
 import qualified OpenCascade.TopoDS as TopoDS
+import OpenCascade.TopoDS.Internal.Destructors (deleteShape)
+import OpenCascade.Inheritance (upcast)
 import Foreign.Ptr
 import Foreign.C
 import Data.Acquire
 import Data.Coerce (coerce)
 
+
 foreign import capi unsafe "hs_BRepFilletAPI_MakeFillet.h hs_new_BRepFilletAPI_MakeFillet_fromShape" rawFromShape :: Ptr TopoDS.Shape -> IO (Ptr MakeFillet)
 
 fromShape :: Ptr TopoDS.Shape  -> Acquire (Ptr MakeFillet)
@@ -27,8 +36,31 @@
 addEdgeWithRadius :: Ptr MakeFillet -> Double -> Ptr TopoDS.Edge -> IO ()
 addEdgeWithRadius = coerce rawAddEdgeWithRadius
 
-
 foreign import capi unsafe "hs_BRepFilletAPI_MakeFillet.h hs_BRepFilletAPI_MakeFillet_addEdgeWithTwoRadiuses" rawAddEdgeWithTwoRadiuses :: Ptr MakeFillet -> CDouble -> CDouble -> Ptr TopoDS.Edge -> IO ()
 
 addEdgeWithTwoRadiuses :: Ptr MakeFillet -> Double -> Double -> Ptr TopoDS.Edge -> IO ()
 addEdgeWithTwoRadiuses = coerce rawAddEdgeWithTwoRadiuses
+
+foreign import capi unsafe "hs_BRepFilletAPI_MakeFillet.h hs_BRepFilletAPI_MakeFillet_reset" reset :: Ptr MakeFillet -> IO ()
+
+foreign import capi unsafe "hs_BRepFilletAPI_MakeFillet.h hs_BRepFilletAPI_MakeFillet_nbFaultyContours" rawNbFaultyContours :: Ptr MakeFillet -> IO CInt
+
+nbFaultyContours :: Ptr MakeFillet -> IO Int
+nbFaultyContours = fmap fromIntegral . rawNbFaultyContours
+
+foreign import capi unsafe "hs_BRepFilletAPI_MakeFillet.h hs_BRepFilletAPI_MakeFillet_faultyContour" rawFaultyContour :: Ptr MakeFillet -> CInt -> IO CInt
+
+faultyContour :: Ptr MakeFillet -> Int -> IO Int
+faultyContour builder index = fromIntegral <$> rawFaultyContour builder (fromIntegral index)
+
+foreign import capi unsafe "hs_BRepFilletAPI_MakeFillet.h hs_BRepFilletAPI_MakeFillet_nbEdges" rawNbEdges :: Ptr MakeFillet -> CInt -> IO CInt
+
+nbEdges :: Ptr MakeFillet -> Int -> IO Int
+nbEdges builder index = fromIntegral <$> rawNbEdges builder (fromIntegral index)
+
+foreign import capi unsafe "hs_BRepFilletAPI_MakeFillet.h hs_BRepFilletAPI_MakeFillet_edge" rawEdge :: Ptr MakeFillet -> CInt -> CInt -> IO (Ptr TopoDS.Edge)
+
+edge :: Ptr MakeFillet -> Int -> Int -> Acquire (Ptr TopoDS.Edge)
+edge builder contourIndex edgeIndex = mkAcquire (rawEdge builder (fromIntegral contourIndex) (fromIntegral edgeIndex)) (deleteShape . upcast)
+
+foreign import capi unsafe "hs_BRepFilletAPI_MakeFillet.h hs_BRepFilletAPI_MakeFillet_remove" remove :: Ptr MakeFillet -> Ptr TopoDS.Edge -> IO ()
diff --git a/src/OpenCascade/BRepLib.hs b/src/OpenCascade/BRepLib.hs
--- a/src/OpenCascade/BRepLib.hs
+++ b/src/OpenCascade/BRepLib.hs
@@ -1,14 +1,25 @@
 {-# LANGUAGE CApiFFI#-}
 module OpenCascade.BRepLib 
 ( orientClosedSolid
+, buildCurve3d
 ) where 
 
-import OpenCascade.TopoDS.Types (Solid)
+import OpenCascade.TopoDS.Types (Solid, Edge)
+import qualified OpenCascade.GeomAbs.Shape as GeomAbs.Shape
 import Foreign.Ptr (Ptr)
-import Foreign.C (CBool (..))
+import Foreign.C (CBool (..), CDouble (..), CInt (..))
 import OpenCascade.Internal.Bool (cBoolToBool)
+import Data.Coerce (coerce)
 
 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
+
+
+foreign import capi unsafe "hs_BRepLib.h hs_BRepLib_buildCurve3d" rawBuildCurve3d ::  Ptr Edge -> CDouble -> CInt -> CInt -> CInt -> IO CBool
+
+buildCurve3d :: Ptr Edge -> Double -> GeomAbs.Shape.Shape -> Int -> Int -> IO Bool
+buildCurve3d edge tolerance continuity maxDegree maxSegment = 
+    cBoolToBool <$> rawBuildCurve3d edge (coerce tolerance) (fromIntegral . fromEnum $ continuity) (fromIntegral maxDegree) (fromIntegral maxSegment)
+
diff --git a/src/OpenCascade/BRepOffsetAPI/MakePipe.hs b/src/OpenCascade/BRepOffsetAPI/MakePipe.hs
--- a/src/OpenCascade/BRepOffsetAPI/MakePipe.hs
+++ b/src/OpenCascade/BRepOffsetAPI/MakePipe.hs
@@ -2,15 +2,24 @@
 module OpenCascade.BRepOffsetAPI.MakePipe 
 ( MakePipe
 , fromWireAndShape
+, fromWireShapeTrihedronModeAndForceC1
 ) where
 
 import OpenCascade.BRepOffsetAPI.Types (MakePipe)
 import OpenCascade.BRepOffsetAPI.Internal.Destructors (deleteMakePipe)
 import qualified OpenCascade.TopoDS as TopoDS
+import qualified OpenCascade.GeomFill as GeomFill
 import Foreign.Ptr
+import Foreign.C (CBool (..), CInt (..))
+import OpenCascade.Internal.Bool (boolToCBool)
 import Data.Acquire
 
 foreign import capi unsafe "hs_BRepOffsetAPI_MakePipe.h hs_new_BRepOffsetAPI_MakePipe_fromWireAndShape" rawFromWireAndShape :: Ptr TopoDS.Wire -> Ptr TopoDS.Shape -> IO (Ptr MakePipe)
 
 fromWireAndShape :: Ptr TopoDS.Wire -> Ptr TopoDS.Shape -> Acquire (Ptr MakePipe)
 fromWireAndShape wire profile = mkAcquire (rawFromWireAndShape wire profile) deleteMakePipe
+
+foreign import capi unsafe "hs_BRepOffsetAPI_MakePipe.h hs_new_BRepOffsetAPI_MakePipe_fromWireShapeTrihedronModeAndForceC1" rawFromWireShapeTrihedronModeAndForceC1 :: Ptr TopoDS.Wire -> Ptr TopoDS.Shape -> CInt -> CBool -> IO (Ptr MakePipe)
+fromWireShapeTrihedronModeAndForceC1 :: Ptr TopoDS.Wire -> Ptr TopoDS.Shape -> GeomFill.Trihedron -> Bool -> Acquire (Ptr MakePipe)
+fromWireShapeTrihedronModeAndForceC1 wire profile trihedronMode forceC1 =
+     mkAcquire (rawFromWireShapeTrihedronModeAndForceC1 wire profile ((fromIntegral . fromEnum $ trihedronMode)) (boolToCBool forceC1)) deleteMakePipe
diff --git a/src/OpenCascade/Geom/BSplineCurve.hs b/src/OpenCascade/Geom/BSplineCurve.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/Geom/BSplineCurve.hs
@@ -0,0 +1,44 @@
+{-# LANGUAGE CApiFFI #-}
+module OpenCascade.Geom.BSplineCurve 
+( toHandle
+, nbPoles
+, pole
+, isRational
+, segment
+) where
+import Foreign.Ptr
+import Foreign.C (CInt (..), CBool (..), CDouble (..))
+import Data.Acquire
+import OpenCascade.Geom.Types (BSplineCurve)
+import OpenCascade.Geom.Internal.Destructors (deleteHandleBSplineCurve)
+import OpenCascade.Handle (Handle)
+import OpenCascade.Internal.Bool (cBoolToBool)
+import OpenCascade.GP (Pnt)
+import OpenCascade.GP.Internal.Destructors (deletePnt)
+import Data.Coerce (coerce)
+
+foreign import capi unsafe "hs_Geom_BSplineCurve.h hs_Geom_BSplineCurve_toHandle" rawToHandle :: Ptr BSplineCurve -> IO (Ptr (Handle BSplineCurve))
+
+toHandle :: Ptr BSplineCurve -> Acquire (Ptr (Handle BSplineCurve))
+toHandle curve = mkAcquire (rawToHandle curve) deleteHandleBSplineCurve
+
+foreign import capi unsafe "hs_Geom_BSplineCurve.h hs_Geom_BSplineCurve_nbPoles" rawNbPoles :: Ptr (Handle BSplineCurve) -> IO (CInt)
+
+nbPoles :: Ptr (Handle (BSplineCurve)) -> IO Int 
+nbPoles h = fromIntegral <$> rawNbPoles h
+
+foreign import capi unsafe "hs_Geom_BSplineCurve.h hs_Geom_BSplineCurve_pole" rawPole :: Ptr (Handle BSplineCurve) -> CInt -> IO (Ptr Pnt)
+
+pole :: Ptr (Handle BSplineCurve) -> Int -> Acquire (Ptr Pnt)
+pole h n = mkAcquire (rawPole h (fromIntegral n)) deletePnt
+
+foreign import capi unsafe "hs_Geom_BSplineCurve.h hs_Geom_BSplineCurve_isRational" rawIsRational :: Ptr (Handle BSplineCurve) -> IO (CBool)
+
+isRational :: Ptr (Handle (BSplineCurve)) -> IO Bool
+isRational h = cBoolToBool <$> rawIsRational h
+
+foreign import capi unsafe "hs_Geom_BSplineCurve.h hs_Geom_BSplineCurve_segment" rawSegment :: Ptr (Handle BSplineCurve) -> CDouble -> CDouble -> CDouble -> IO ()
+
+segment :: Ptr (Handle BSplineCurve) -> Double -> Double -> Double -> IO ()
+segment = coerce rawSegment
+
diff --git a/src/OpenCascade/Geom/BezierCurve.hs b/src/OpenCascade/Geom/BezierCurve.hs
--- a/src/OpenCascade/Geom/BezierCurve.hs
+++ b/src/OpenCascade/Geom/BezierCurve.hs
@@ -2,14 +2,24 @@
 module OpenCascade.Geom.BezierCurve 
 ( fromPnts
 , toHandle
+, nbPoles
+, pole
+, isRational
+, segment
 ) where
 import Foreign.Ptr
+import Foreign.C (CInt (..), CBool (..), CDouble (..))
 import Data.Acquire
+import Data.Coerce (coerce)
 import OpenCascade.Geom.Types (BezierCurve)
 import OpenCascade.Geom.Internal.Destructors (deleteBezierCurve, deleteHandleBezierCurve)
+import OpenCascade.GP.Internal.Destructors (deletePnt)
 import OpenCascade.GP (Pnt)
 import OpenCascade.NCollection (Array1)
 import OpenCascade.Handle (Handle)
+import OpenCascade.Internal.Bool (cBoolToBool)
+
+
 foreign import capi unsafe "hs_Geom_BezierCurve.h hs_new_Geom_BezierCurve_fromPnts" rawFromPnts :: Ptr (Array1 Pnt) -> IO(Ptr BezierCurve)
 
 fromPnts :: Ptr (Array1 Pnt) -> Acquire (Ptr BezierCurve)
@@ -21,4 +31,22 @@
 toHandle curve = mkAcquire (rawToHandle curve) deleteHandleBezierCurve
 
 
+foreign import capi unsafe "hs_Geom_BezierCurve.h hs_Geom_BezierCurve_nbPoles" rawNbPoles :: Ptr (Handle BezierCurve) -> IO (CInt)
 
+nbPoles :: Ptr (Handle (BezierCurve)) -> IO Int 
+nbPoles h = fromIntegral <$> rawNbPoles h
+
+foreign import capi unsafe "hs_Geom_BezierCurve.h hs_Geom_BezierCurve_pole" rawPole :: Ptr (Handle BezierCurve) -> CInt -> IO (Ptr Pnt)
+
+pole :: Ptr (Handle BezierCurve) -> Int -> Acquire (Ptr Pnt)
+pole h n = mkAcquire (rawPole h (fromIntegral n)) deletePnt
+
+foreign import capi unsafe "hs_Geom_BezierCurve.h hs_Geom_BezierCurve_isRational" rawIsRational :: Ptr (Handle BezierCurve) -> IO (CBool)
+
+isRational :: Ptr (Handle (BezierCurve)) -> IO Bool
+isRational h = cBoolToBool <$> rawIsRational h
+
+foreign import capi unsafe "hs_Geom_BezierCurve.h hs_Geom_BezierCurve_segment" rawSegment :: Ptr (Handle BezierCurve) -> CDouble -> CDouble -> IO ()
+
+segment :: Ptr (Handle BezierCurve) -> Double -> Double -> IO ()
+segment = coerce rawSegment
diff --git a/src/OpenCascade/Geom/Curve.hs b/src/OpenCascade/Geom/Curve.hs
--- a/src/OpenCascade/Geom/Curve.hs
+++ b/src/OpenCascade/Geom/Curve.hs
@@ -1,6 +1,8 @@
 {-# LANGUAGE CApiFFI #-}
 module OpenCascade.Geom.Curve 
 ( value
+, firstParameter
+, lastParameter
 , dn
 , reversedParameter
 , reversed
@@ -20,6 +22,16 @@
 value :: Ptr (Handle Curve) -> Double -> Acquire (Ptr Pnt)
 value curve u = mkAcquire (rawValue curve (coerce u)) deletePnt
 
+foreign import capi unsafe "hs_Geom_Curve.h hs_Geom_Curve_firstParameter" rawFirstParameter :: Ptr (Handle Curve)-> IO (CDouble)
+
+firstParameter :: Ptr (Handle Curve) -> IO Double
+firstParameter = coerce rawFirstParameter
+
+foreign import capi unsafe "hs_Geom_Curve.h hs_Geom_Curve_lastParameter" rawLastParameter :: Ptr (Handle Curve)-> IO (CDouble)
+
+lastParameter :: Ptr (Handle Curve) -> IO Double
+lastParameter = coerce rawLastParameter
+
 foreign import capi unsafe "hs_Geom_Curve.h hs_Geom_Curve_dn" rawDN :: Ptr (Handle Curve) -> CDouble -> CInt -> IO (Ptr Vec)
 
 dn :: Ptr (Handle Curve) -> Double -> Int -> Acquire (Ptr Vec)
@@ -29,7 +41,6 @@
 
 reversedParameter :: Ptr (Handle Curve) -> Double -> IO Double
 reversedParameter = coerce rawReversedParameter
-
 
 foreign import capi unsafe "hs_Geom_Curve.h hs_Geom_Curve_reversed" rawReversed :: Ptr (Handle Curve) -> IO (Ptr (Handle Curve))
 
diff --git a/src/OpenCascade/Geom/Internal/Destructors.hs b/src/OpenCascade/Geom/Internal/Destructors.hs
--- a/src/OpenCascade/Geom/Internal/Destructors.hs
+++ b/src/OpenCascade/Geom/Internal/Destructors.hs
@@ -3,6 +3,7 @@
 ( deleteHandleCurve
 , deleteHandleTrimmedCurve
 , deleteHandleBezierCurve
+, deleteHandleBSplineCurve
 , deleteBezierCurve
 ) where
 
@@ -17,5 +18,7 @@
 foreign import capi unsafe "hs_Geom_TrimmedCurve.h hs_delete_Handle_Geom_TrimmedCurve" deleteHandleTrimmedCurve :: Ptr (Handle TrimmedCurve) -> IO ()
 
 foreign import capi unsafe "hs_Geom_BezierCurve.h hs_delete_Handle_Geom_BezierCurve" deleteHandleBezierCurve :: Ptr (Handle BezierCurve) -> IO ()
+
+foreign import capi unsafe "hs_Geom_BSplineCurve.h hs_delete_Handle_Geom_BSplineCurve" deleteHandleBSplineCurve :: Ptr (Handle BSplineCurve) -> IO ()
 
 foreign import capi unsafe "hs_Geom_BezierCurve.h hs_delete_Geom_BezierCurve" deleteBezierCurve :: Ptr BezierCurve -> IO ()
diff --git a/src/OpenCascade/Geom/Types.hs b/src/OpenCascade/Geom/Types.hs
--- a/src/OpenCascade/Geom/Types.hs
+++ b/src/OpenCascade/Geom/Types.hs
@@ -4,6 +4,7 @@
 ( Curve
 , TrimmedCurve
 , BezierCurve
+, BSplineCurve
 , Surface
 ) where
 
@@ -12,7 +13,9 @@
 data Curve
 data TrimmedCurve
 data BezierCurve
+data BSplineCurve
 data Surface
 
 instance SubTypeOf Curve TrimmedCurve
 instance SubTypeOf Curve BezierCurve
+instance SubTypeOf Curve BSplineCurve
diff --git a/src/OpenCascade/GeomAbs/CurveType.hs b/src/OpenCascade/GeomAbs/CurveType.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/GeomAbs/CurveType.hs
@@ -0,0 +1,16 @@
+module OpenCascade.GeomAbs.CurveType
+( CurveType (..)
+) where
+
+-- This needs to stay up to date with GeomAbs_CurveType.hxx
+data CurveType
+    = Line 
+    | Circle
+    | Ellipse
+    | Hyperbola 
+    | Parabola 
+    | BezierCurve
+    | BSplineCurve
+    | OffsetCurve
+    | OtherCurve
+    deriving (Enum, Show)
diff --git a/src/OpenCascade/GeomAbs/Shape.hs b/src/OpenCascade/GeomAbs/Shape.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/GeomAbs/Shape.hs
@@ -0,0 +1,7 @@
+module OpenCascade.GeomAbs.Shape 
+( Shape (..)
+) where 
+
+-- This needs to stay up to date with GeomAbs_Shape.hxx
+data Shape = C0 | G1 | C1 | G2 | C2 | C3 | CN 
+    deriving (Enum, Show)
diff --git a/src/OpenCascade/GeomAdaptor/Curve.hs b/src/OpenCascade/GeomAdaptor/Curve.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/GeomAdaptor/Curve.hs
@@ -0,0 +1,39 @@
+{-# LANGUAGE CApiFFI #-}
+module OpenCascade.GeomAdaptor.Curve
+( Curve
+, fromHandle
+, firstParameter
+, lastParameter
+, curve
+) where
+
+import OpenCascade.GeomAdaptor.Types (Curve)
+import qualified OpenCascade.Geom.Types as Geom
+import qualified OpenCascade.Geom.Internal.Destructors as Geom.Destructors
+import OpenCascade.GeomAdaptor.Internal.Destructors (deleteCurve)
+import OpenCascade.Handle (Handle)
+import Foreign.C (CDouble (..))
+import Data.Coerce (coerce)
+import Foreign.Ptr 
+import Data.Acquire (Acquire, mkAcquire)
+
+foreign import capi unsafe "hs_GeomAdaptor_Curve.h hs_new_GeomAdaptor_Curve_fromHandle" rawFromHandle :: Ptr (Handle Geom.Curve) -> IO (Ptr Curve)
+
+fromHandle :: Ptr (Handle Geom.Curve) -> Acquire (Ptr Curve)
+fromHandle h = mkAcquire (rawFromHandle h) deleteCurve
+
+
+foreign import capi unsafe "hs_GeomAdaptor_Curve.h hs_GeomAdaptor_Curve_curve" rawCurve :: Ptr Curve -> IO (Ptr (Handle Geom.Curve))
+
+curve :: Ptr Curve -> Acquire (Ptr (Handle Geom.Curve))
+curve adaptor = mkAcquire (rawCurve adaptor) Geom.Destructors.deleteHandleCurve
+
+foreign import capi unsafe "hs_GeomAdaptor_Curve.h hs_GeomAdaptor_Curve_firstParameter" rawFirstParameter :: Ptr Curve-> IO (CDouble)
+
+firstParameter :: Ptr Curve -> IO Double
+firstParameter = coerce rawFirstParameter
+
+foreign import capi unsafe "hs_GeomAdaptor_Curve.h hs_GeomAdaptor_Curve_lastParameter" rawLastParameter :: Ptr Curve -> IO (CDouble)
+
+lastParameter :: Ptr Curve -> IO Double
+lastParameter = coerce rawLastParameter
diff --git a/src/OpenCascade/GeomAdaptor/Internal/Destructors.hs b/src/OpenCascade/GeomAdaptor/Internal/Destructors.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/GeomAdaptor/Internal/Destructors.hs
@@ -0,0 +1,10 @@
+{-# LANGUAGE CApiFFI #-} 
+module OpenCascade.GeomAdaptor.Internal.Destructors
+( deleteCurve
+) where
+
+import OpenCascade.GeomAdaptor.Types (Curve)
+import Foreign.Ptr
+
+foreign import capi unsafe "hs_GeomAdaptor_Curve.h hs_delete_GeomAdaptor_Curve" deleteCurve :: Ptr Curve -> IO ()
+
diff --git a/src/OpenCascade/GeomAdaptor/Types.hs b/src/OpenCascade/GeomAdaptor/Types.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/GeomAdaptor/Types.hs
@@ -0,0 +1,6 @@
+{-# LANGUAGE EmptyDataDecls #-}
+module OpenCascade.GeomAdaptor.Types 
+( Curve
+) where
+
+data Curve
diff --git a/src/OpenCascade/GeomConvert/ApproxCurve.hs b/src/OpenCascade/GeomConvert/ApproxCurve.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/GeomConvert/ApproxCurve.hs
@@ -0,0 +1,50 @@
+{-# LANGUAGE CApiFFI #-}
+module OpenCascade.GeomConvert.ApproxCurve
+( ApproxCurve
+, fromCurveToleranceOrderSegmentsAndDegree
+, curve
+, isDone
+, hasResult
+) where 
+
+import OpenCascade.GeomConvert.Types (ApproxCurve)
+import OpenCascade.GeomConvert.Internal.Destructors (deleteApproxCurve)
+import OpenCascade.Geom.Internal.Destructors (deleteHandleBSplineCurve)
+import qualified OpenCascade.GeomAbs.Shape as GeomAbs.Shape
+import Foreign.Ptr (Ptr)
+import Foreign.C (CInt (..), CDouble (..), CBool (..))
+import Data.Coerce (coerce)
+import Data.Acquire (Acquire, mkAcquire)
+import OpenCascade.Handle (Handle)
+import OpenCascade.Geom.Types as Geom
+import OpenCascade.Internal.Bool (cBoolToBool)
+
+foreign import capi unsafe "hs_GeomConvert_ApproxCurve.h hs_new_GeomConvert_ApproxCurve_fromCurveToleranceOrderSegmentsAndDegree" rawFromCurveToleranceOrderSegmentsAndDegree :: Ptr (Handle Geom.Curve) -> CDouble -> CInt -> CInt -> CInt -> IO (Ptr ApproxCurve)
+
+fromCurveToleranceOrderSegmentsAndDegree :: Ptr (Handle Geom.Curve) -> Double -> GeomAbs.Shape.Shape -> Int -> Int -> Acquire (Ptr ApproxCurve)
+fromCurveToleranceOrderSegmentsAndDegree theCurve tolerance order maxSegments maxDegree = 
+    mkAcquire 
+        (rawFromCurveToleranceOrderSegmentsAndDegree 
+            theCurve
+            (coerce tolerance)
+            (fromIntegral . fromEnum $ order)
+            (fromIntegral maxSegments)
+            (fromIntegral maxDegree)) 
+        deleteApproxCurve
+
+
+foreign import capi unsafe "hs_GeomConvert_ApproxCurve.h hs_GeomConvert_ApproxCurve_curve" rawCurve :: Ptr ApproxCurve -> IO (Ptr (Handle Geom.BSplineCurve))
+
+curve :: Ptr ApproxCurve -> Acquire (Ptr (Handle Geom.BSplineCurve))
+curve approxCurve = mkAcquire (rawCurve approxCurve) deleteHandleBSplineCurve
+
+foreign import capi unsafe "hs_GeomConvert_ApproxCurve.h hs_GeomConvert_ApproxCurve_isDone" rawIsDone :: Ptr ApproxCurve -> IO (CBool)
+
+isDone :: Ptr ApproxCurve -> IO Bool
+isDone approxCurve = cBoolToBool <$> rawIsDone approxCurve
+
+
+foreign import capi unsafe "hs_GeomConvert_ApproxCurve.h hs_GeomConvert_ApproxCurve_hasResult" rawHasResult :: Ptr ApproxCurve -> IO (CBool)
+
+hasResult :: Ptr ApproxCurve -> IO Bool
+hasResult approxCurve = cBoolToBool <$> rawHasResult approxCurve
diff --git a/src/OpenCascade/GeomConvert/BSplineCurveToBezierCurve.hs b/src/OpenCascade/GeomConvert/BSplineCurveToBezierCurve.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/GeomConvert/BSplineCurveToBezierCurve.hs
@@ -0,0 +1,38 @@
+{-# LANGUAGE CApiFFI #-}
+module OpenCascade.GeomConvert.BSplineCurveToBezierCurve
+( BSplineCurveToBezierCurve
+, fromHandle 
+, fromHandleParametersAndTolerance
+, nbArcs
+, arc
+) where
+
+import OpenCascade.GeomConvert.Types (BSplineCurveToBezierCurve)
+import OpenCascade.GeomConvert.Internal.Destructors (deleteBSplineCurveToBezierCurve)
+import OpenCascade.Geom.Internal.Destructors (deleteHandleBezierCurve)
+import qualified OpenCascade.Geom.Types as Geom
+import OpenCascade.Handle (Handle)
+import Foreign.Ptr (Ptr)
+import Foreign.C (CInt (..), CDouble (..))
+import Data.Coerce (coerce)
+import Data.Acquire (Acquire, mkAcquire)
+
+foreign import capi unsafe "hs_GeomConvert_BSplineCurveToBezierCurve.h hs_new_GeomConvert_BSplineCurveToBezierCurve_fromHandle" rawFromHandle :: Ptr (Handle Geom.BSplineCurve) -> IO(Ptr BSplineCurveToBezierCurve)
+
+fromHandle :: Ptr (Handle Geom.BSplineCurve) -> Acquire (Ptr BSplineCurveToBezierCurve)
+fromHandle h = mkAcquire (rawFromHandle h) (deleteBSplineCurveToBezierCurve)
+
+foreign import capi unsafe "hs_GeomConvert_BSplineCurveToBezierCurve.h hs_new_GeomConvert_BSplineCurveToBezierCurve_fromHandleParametersAndTolerance" rawFromHandleParametersAndTolerance :: Ptr (Handle Geom.BSplineCurve) -> CDouble -> CDouble -> CDouble -> IO(Ptr BSplineCurveToBezierCurve)
+
+fromHandleParametersAndTolerance :: Ptr (Handle Geom.BSplineCurve) -> Double -> Double -> Double -> Acquire (Ptr BSplineCurveToBezierCurve)
+fromHandleParametersAndTolerance h firstParam secondParam tolerance= mkAcquire (rawFromHandleParametersAndTolerance h (coerce firstParam) (coerce secondParam) (coerce tolerance)) (deleteBSplineCurveToBezierCurve)
+
+foreign import capi unsafe "hs_GeomConvert_BSplineCurveToBezierCurve.h hs_GeomConvert_BSplineCurveToBezierCurve_nbArcs" rawNbArcs :: Ptr (BSplineCurveToBezierCurve) -> IO CInt
+
+nbArcs :: Ptr BSplineCurveToBezierCurve -> IO Int
+nbArcs p = fromIntegral <$> rawNbArcs p
+
+foreign import capi unsafe "hs_GeomConvert_BSplineCurveToBezierCurve.h hs_GeomConvert_BSplineCurveToBezierCurve_arc" rawArc :: Ptr (BSplineCurveToBezierCurve) -> CInt -> IO (Ptr (Handle Geom.BezierCurve))
+
+arc :: Ptr BSplineCurveToBezierCurve -> Int -> Acquire (Ptr (Handle Geom.BezierCurve))
+arc p n = mkAcquire (rawArc p (fromIntegral n)) deleteHandleBezierCurve
diff --git a/src/OpenCascade/GeomConvert/Internal/Destructors.hs b/src/OpenCascade/GeomConvert/Internal/Destructors.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/GeomConvert/Internal/Destructors.hs
@@ -0,0 +1,12 @@
+{-# LANGUAGE CApiFFI #-}
+module OpenCascade.GeomConvert.Internal.Destructors 
+( deleteBSplineCurveToBezierCurve
+, deleteApproxCurve
+) where
+
+import OpenCascade.GeomConvert.Types
+
+import Foreign.Ptr
+
+foreign import capi unsafe "hs_GeomConvert_BSplineCurveToBezierCurve.h hs_delete_GeomConvert_BSplineCurveToBezierCurve" deleteBSplineCurveToBezierCurve :: Ptr BSplineCurveToBezierCurve -> IO ()
+foreign import capi unsafe "hs_GeomConvert_ApproxCurve.h hs_delete_GeomConvert_ApproxCurve" deleteApproxCurve :: Ptr ApproxCurve -> IO ()
diff --git a/src/OpenCascade/GeomConvert/Types.hs b/src/OpenCascade/GeomConvert/Types.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/GeomConvert/Types.hs
@@ -0,0 +1,8 @@
+{-# LANGUAGE EmptyDataDecls #-}
+module OpenCascade.GeomConvert.Types
+( BSplineCurveToBezierCurve
+, ApproxCurve
+) where
+
+data BSplineCurveToBezierCurve
+data ApproxCurve
diff --git a/src/OpenCascade/GeomFill.hs b/src/OpenCascade/GeomFill.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/GeomFill.hs
@@ -0,0 +1,4 @@
+module OpenCascade.GeomFill (
+    Trihedron
+) where 
+import OpenCascade.GeomFill.Trihedron
diff --git a/src/OpenCascade/GeomFill/Trihedron.hs b/src/OpenCascade/GeomFill/Trihedron.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/GeomFill/Trihedron.hs
@@ -0,0 +1,8 @@
+module OpenCascade.GeomFill.Trihedron
+( Trihedron (..)
+) where
+
+-- this should match the enumeration in GeomFill_Trihedron
+data Trihedron =  IsCorrectedFrenet | IsFixed | IsFrenet | IsConstantNormal |
+  IsDarboux | IsGuideAC | IsGuidePlan | IsGuideACWithContact |
+  IsGuidePlanWithContact | IsDiscreteTrihedron deriving (Show, Eq, Enum)
diff --git a/src/OpenCascade/HLRAlgo/Internal/Destructors.hs b/src/OpenCascade/HLRAlgo/Internal/Destructors.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/HLRAlgo/Internal/Destructors.hs
@@ -0,0 +1,12 @@
+{-# LANGUAGE CApiFFI #-}
+module OpenCascade.HLRAlgo.Internal.Destructors 
+( deleteProjector
+) where
+
+import OpenCascade.HLRAlgo.Types
+
+
+import Foreign.Ptr
+
+foreign import capi unsafe "hs_HLRAlgo_Projector.h hs_delete_HLRAlgo_Projector" deleteProjector :: Ptr Projector -> IO ()
+
diff --git a/src/OpenCascade/HLRAlgo/Projector.hs b/src/OpenCascade/HLRAlgo/Projector.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/HLRAlgo/Projector.hs
@@ -0,0 +1,16 @@
+{-# LANGUAGE CApiFFI #-}
+module OpenCascade.HLRAlgo.Projector
+( Projector
+, fromAx2
+) where
+import qualified OpenCascade.GP.Types as GP
+import OpenCascade.HLRAlgo.Types (Projector)
+import OpenCascade.HLRAlgo.Internal.Destructors (deleteProjector)
+import Foreign.Ptr 
+import Data.Acquire (mkAcquire, Acquire)
+
+foreign import capi unsafe "hs_HLRAlgo_Projector.h hs_new_HLRAlgo_Projector_fromAx2" rawFromAx2 :: Ptr GP.Ax2 -> IO (Ptr Projector)
+
+fromAx2 :: Ptr GP.Ax2 -> Acquire (Ptr Projector)
+fromAx2 ax2 = mkAcquire (rawFromAx2 ax2) deleteProjector
+
diff --git a/src/OpenCascade/HLRAlgo/Types.hs b/src/OpenCascade/HLRAlgo/Types.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/HLRAlgo/Types.hs
@@ -0,0 +1,6 @@
+{-# LANGUAGE EmptyDataDecls #-}
+module OpenCascade.HLRAlgo.Types
+( Projector
+) where
+
+data Projector
diff --git a/src/OpenCascade/HLRBRep/Algo.hs b/src/OpenCascade/HLRBRep/Algo.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/HLRBRep/Algo.hs
@@ -0,0 +1,29 @@
+{-# LANGUAGE CApiFFI #-}
+module OpenCascade.HLRBRep.Algo
+( Algo
+, new
+, projector
+, update
+, hide
+, add
+) where
+import OpenCascade.HLRBRep.Types (Algo)
+import qualified OpenCascade.HLRAlgo.Types as HLRAlgo
+import qualified OpenCascade.TopoDS.Types as TopoDS
+import OpenCascade.HLRBRep.Internal.Destructors (deleteAlgo)
+import Foreign.Ptr 
+import Data.Acquire (mkAcquire, Acquire)
+import OpenCascade.Handle
+
+foreign import capi unsafe "hs_HLRBRep_Algo.h hs_new_HLRBRep_Algo" rawNew :: IO (Ptr (Handle Algo))
+
+new :: Acquire (Ptr (Handle Algo))
+new = mkAcquire rawNew deleteAlgo
+
+foreign import capi unsafe "hs_HLRBRep_Algo.h hs_HLRBRep_Algo_projector" projector :: Ptr (Handle Algo) -> Ptr HLRAlgo.Projector -> IO ()
+
+foreign import capi unsafe "hs_HLRBRep_Algo.h hs_HLRBRep_Algo_add" add :: Ptr (Handle Algo) -> Ptr TopoDS.Shape -> IO ()
+
+foreign import capi unsafe "hs_HLRBRep_Algo.h hs_HLRBRep_Algo_update" update :: Ptr (Handle Algo) -> IO ()
+
+foreign import capi unsafe "hs_HLRBRep_Algo.h hs_HLRBRep_Algo_hide" hide :: Ptr (Handle Algo) -> IO ()
diff --git a/src/OpenCascade/HLRBRep/HLRToShape.hs b/src/OpenCascade/HLRBRep/HLRToShape.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/HLRBRep/HLRToShape.hs
@@ -0,0 +1,30 @@
+{-# LANGUAGE CApiFFI #-}
+module OpenCascade.HLRBRep.HLRToShape
+( HLRToShape
+, fromAlgo
+, compoundOfEdges
+) where
+
+import OpenCascade.HLRBRep.Types (Algo, HLRToShape)
+import OpenCascade.HLRBRep.TypeOfResultingEdge (TypeOfResultingEdge)
+import qualified OpenCascade.TopoDS.Types as TopoDS
+import OpenCascade.TopoDS.Internal.Destructors (deleteShape)
+import OpenCascade.HLRBRep.Internal.Destructors (deleteHLRToShape)
+import Foreign.Ptr 
+import Data.Acquire (mkAcquire, Acquire)
+import OpenCascade.Handle
+import Foreign.C (CInt (..), CBool (..))
+import OpenCascade.Internal.Bool (boolToCBool)
+
+foreign import capi unsafe "hs_HLRBRep_HLRToShape.h hs_new_HLRBRep_HLRToShape_fromHandleAlgo" rawFromHandleAlgo :: Ptr (Handle Algo) -> IO (Ptr HLRToShape)
+
+fromAlgo :: Ptr (Handle Algo) -> Acquire (Ptr HLRToShape)
+fromAlgo algo = mkAcquire (rawFromHandleAlgo algo) deleteHLRToShape
+
+foreign import capi unsafe "hs_HLRBRep_HLRToShape.h hs_HLRBRep_HLRToShape_compoundOfEdges" rawCompoundOfEdges :: Ptr HLRToShape -> CInt -> CBool -> CBool -> IO (Ptr TopoDS.Shape)
+
+compoundOfEdges :: Ptr HLRToShape -> TypeOfResultingEdge -> Bool -> Bool -> Acquire (Ptr TopoDS.Shape)
+compoundOfEdges hlrToShape typeOfEdge visible in3d =
+    mkAcquire 
+        (rawCompoundOfEdges hlrToShape (fromIntegral . fromEnum $ typeOfEdge) (boolToCBool visible) (boolToCBool in3d))
+        deleteShape
diff --git a/src/OpenCascade/HLRBRep/Internal/Destructors.hs b/src/OpenCascade/HLRBRep/Internal/Destructors.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/HLRBRep/Internal/Destructors.hs
@@ -0,0 +1,13 @@
+{-# LANGUAGE CApiFFI #-}
+module OpenCascade.HLRBRep.Internal.Destructors 
+( deleteAlgo
+, deleteHLRToShape
+) where
+
+import OpenCascade.HLRBRep.Types
+import OpenCascade.Handle
+
+import Foreign.Ptr
+
+foreign import capi unsafe "hs_HLRBRep_Algo.h hs_delete_HLRBRep_Algo" deleteAlgo :: Ptr (Handle Algo) -> IO ()
+foreign import capi unsafe "hs_HLRBRep_HLRToShape.h hs_delete_HLRBRep_HLRToShape" deleteHLRToShape :: Ptr HLRToShape -> IO ()
diff --git a/src/OpenCascade/HLRBRep/TypeOfResultingEdge.hs b/src/OpenCascade/HLRBRep/TypeOfResultingEdge.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/HLRBRep/TypeOfResultingEdge.hs
@@ -0,0 +1,12 @@
+module OpenCascade.HLRBRep.TypeOfResultingEdge
+( TypeOfResultingEdge (..)
+) where 
+
+data TypeOfResultingEdge 
+    = Undefined
+    | IsoLine
+    | OutLine
+    | Rg1Line
+    | RgNLine
+    | Sharp
+    deriving (Eq, Ord, Enum, Show)
diff --git a/src/OpenCascade/HLRBRep/Types.hs b/src/OpenCascade/HLRBRep/Types.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/HLRBRep/Types.hs
@@ -0,0 +1,8 @@
+{-# LANGUAGE EmptyDataDecls #-}
+module OpenCascade.HLRBRep.Types
+( Algo
+, HLRToShape
+) where
+
+data Algo
+data HLRToShape
diff --git a/src/OpenCascade/ShapeConstruct/Curve.hs b/src/OpenCascade/ShapeConstruct/Curve.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/ShapeConstruct/Curve.hs
@@ -0,0 +1,28 @@
+{-# LANGUAGE CApiFFI #-}
+module OpenCascade.ShapeConstruct.Curve
+( Curve
+, new
+, convertToBSpline
+) where
+
+import OpenCascade.ShapeConstruct.Types (Curve)
+import OpenCascade.ShapeConstruct.Internal.Destructors (deleteCurve)
+import qualified OpenCascade.Geom.Types as Geom
+import OpenCascade.Geom.Internal.Destructors (deleteHandleBSplineCurve)
+import OpenCascade.Handle (Handle)
+import Foreign.Ptr
+import Foreign.C (CDouble (..))
+import Data.Acquire (Acquire, mkAcquire)
+import Data.Coerce (coerce)
+
+foreign import capi unsafe "hs_ShapeConstruct_Curve.h hs_new_ShapeConstruct_Curve" rawNew :: IO (Ptr Curve)
+
+new :: Acquire (Ptr Curve)
+new = mkAcquire rawNew deleteCurve
+
+foreign import capi unsafe "hs_ShapeConstruct_Curve.h hs_ShapeConstruct_Curve_convertToBSpline" rawConvertToBSpline :: Ptr Curve -> Ptr (Handle Geom.Curve) -> CDouble -> CDouble -> CDouble -> IO (Ptr (Handle Geom.BSplineCurve))
+
+convertToBSpline :: Ptr Curve -> Ptr (Handle Geom.Curve) -> Double -> Double -> Double -> Acquire (Ptr (Handle Geom.BSplineCurve))
+convertToBSpline shapeConstruct handleCurve firstParam lastParam precision = 
+    mkAcquire (rawConvertToBSpline shapeConstruct handleCurve (coerce firstParam) (coerce lastParam) (coerce precision)) deleteHandleBSplineCurve
+
diff --git a/src/OpenCascade/ShapeConstruct/Internal/Destructors.hs b/src/OpenCascade/ShapeConstruct/Internal/Destructors.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/ShapeConstruct/Internal/Destructors.hs
@@ -0,0 +1,9 @@
+{-# LANGUAGE CApiFFI #-}
+module OpenCascade.ShapeConstruct.Internal.Destructors
+( deleteCurve
+) where
+
+import OpenCascade.ShapeConstruct.Types
+import Foreign.Ptr 
+
+foreign import capi unsafe "hs_ShapeConstruct_Curve.h hs_delete_ShapeConstruct_Curve" deleteCurve :: Ptr Curve -> IO ()
diff --git a/src/OpenCascade/ShapeConstruct/Types.hs b/src/OpenCascade/ShapeConstruct/Types.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/ShapeConstruct/Types.hs
@@ -0,0 +1,6 @@
+{-# LANGUAGE EmptyDataDecls #-}
+module OpenCascade.ShapeConstruct.Types
+( Curve
+) where
+
+data Curve
