diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -8,6 +8,18 @@
 
 ## Unreleased
 
+## 0.2.1.0
+
+### Added
+
+- Added OpenCascade.Message.ProgressRange
+- Added OpenCascade.RWGltf.CafWriter
+- Added OpenCascade.RWGltf.Types
+- Added OpenCascade.TColStd.IndexedDataMapOfStringString
+- Added OpenCascade.TDocStd.Document
+- Added OpenCascade.XCAFDoc.DocumentTool
+- Added OpenCascade.XCAFDoc.ShapeTool
+
 ## 0.2.0.0
 
 ### Added
diff --git a/cpp/hs_Message_ProgressRange.cpp b/cpp/hs_Message_ProgressRange.cpp
new file mode 100644
--- /dev/null
+++ b/cpp/hs_Message_ProgressRange.cpp
@@ -0,0 +1,10 @@
+#include <Message_ProgressRange.hxx>
+#include "hs_Message_ProgressRange.h"
+
+Message_ProgressRange * hs_new_Message_ProgressRange(){
+    return new Message_ProgressRange();
+}
+
+void hs_delete_Message_ProgressRange(Message_ProgressRange * theRange){
+    delete theRange;
+}
diff --git a/cpp/hs_Message_ProgressRange.h b/cpp/hs_Message_ProgressRange.h
new file mode 100644
--- /dev/null
+++ b/cpp/hs_Message_ProgressRange.h
@@ -0,0 +1,18 @@
+#ifndef HS_MESSAGE_PROGRESSRANGE_H
+#define HS_MESSAGE_PROGRESSRANGE_H
+
+#include "hs_types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+Message_ProgressRange * hs_new_Message_ProgressRange();
+
+void hs_delete_Message_ProgressRange(Message_ProgressRange * theRange);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // HS_MESSAGE_PROGRESSRANGE_H
diff --git a/cpp/hs_RWGltf_CafWriter.cpp b/cpp/hs_RWGltf_CafWriter.cpp
new file mode 100644
--- /dev/null
+++ b/cpp/hs_RWGltf_CafWriter.cpp
@@ -0,0 +1,14 @@
+#include <RWGltf_CafWriter.hxx>
+#include "hs_RWGltf_CafWriter.h"
+
+RWGltf_CafWriter * hs_new_RWGltf_CafWriter(char * theFile, bool isBinary){
+    return new RWGltf_CafWriter(theFile, isBinary);
+}
+
+void hs_delete_RWGltf_CafWriter(RWGltf_CafWriter * theWriter){
+    delete theWriter;   
+}
+
+void hs_RWGltf_CafWriter_Perform(RWGltf_CafWriter * theWriter, Handle(TDocStd_Document) * theDocument, TColStd_IndexedDataMapOfStringString * theFileInfo, Message_ProgressRange * theProgress){
+    theWriter->Perform(*theDocument, *theFileInfo, *theProgress);
+}
diff --git a/cpp/hs_RWGltf_CafWriter.h b/cpp/hs_RWGltf_CafWriter.h
new file mode 100644
--- /dev/null
+++ b/cpp/hs_RWGltf_CafWriter.h
@@ -0,0 +1,20 @@
+#ifndef HS_RWGLTF_CAFWRITER_H
+#define HS_RWGLTF_CAFWRITER_H
+
+#include "hs_types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+RWGltf_CafWriter * hs_new_RWGltf_CafWriter(char * theFile, bool isBinary);
+
+void hs_delete_RWGltf_CafWriter(RWGltf_CafWriter * theWriter);
+
+void hs_RWGltf_CafWriter_Perform(RWGltf_CafWriter * theWriter, Handle(TDocStd_Document) * theDocument, TColStd_IndexedDataMapOfStringString * theFileInfo, Message_ProgressRange * theProgress);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // HS_RWGLTF_CAFWRITER_H
diff --git a/cpp/hs_TColStd_IndexedDataMapOfStringString.cpp b/cpp/hs_TColStd_IndexedDataMapOfStringString.cpp
new file mode 100644
--- /dev/null
+++ b/cpp/hs_TColStd_IndexedDataMapOfStringString.cpp
@@ -0,0 +1,10 @@
+#include <TColStd_IndexedDataMapOfStringString.hxx>
+#include "hs_TColStd_IndexedDataMapOfStringString.h"
+
+TColStd_IndexedDataMapOfStringString * hs_new_TColStd_IndexedDataMapOfStringString(){
+    return new TColStd_IndexedDataMapOfStringString();
+}
+
+void hs_delete_TColStd_IndexedDataMapOfStringString(TColStd_IndexedDataMapOfStringString * theMap){
+    delete theMap;
+}
diff --git a/cpp/hs_TColStd_IndexedDataMapOfStringString.h b/cpp/hs_TColStd_IndexedDataMapOfStringString.h
new file mode 100644
--- /dev/null
+++ b/cpp/hs_TColStd_IndexedDataMapOfStringString.h
@@ -0,0 +1,18 @@
+#ifndef HS_TCOLSTD_INDEXEDDATAMAPOFSTRINGSTRING_H
+#define HS_TCOLSTD_INDEXEDDATAMAPOFSTRINGSTRING_H
+
+#include "hs_types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+TColStd_IndexedDataMapOfStringString * hs_new_TColStd_IndexedDataMapOfStringString();
+
+void hs_delete_TColStd_IndexedDataMapOfStringString(TColStd_IndexedDataMapOfStringString * theMap);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // HS_TCOLSTD_INDEXEDDATAMAPOFSTRINGSTRING_H
diff --git a/cpp/hs_TDF_Label.cpp b/cpp/hs_TDF_Label.cpp
new file mode 100644
--- /dev/null
+++ b/cpp/hs_TDF_Label.cpp
@@ -0,0 +1,6 @@
+#include <TDF_Label.hxx>
+#include "hs_TDF_Label.h"
+
+void hs_delete_TDF_Label(TDF_Label * theLabel){
+    delete theLabel;
+}
diff --git a/cpp/hs_TDF_Label.h b/cpp/hs_TDF_Label.h
new file mode 100644
--- /dev/null
+++ b/cpp/hs_TDF_Label.h
@@ -0,0 +1,16 @@
+#ifndef HS_TDF_LABEL_H
+#define HS_TDF_LABEL_H
+
+#include "hs_types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void hs_delete_TDF_Label(TDF_Label * theLabel);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // HS_TDF_LABEL_H
diff --git a/cpp/hs_TDocStd_Document.cpp b/cpp/hs_TDocStd_Document.cpp
new file mode 100644
--- /dev/null
+++ b/cpp/hs_TDocStd_Document.cpp
@@ -0,0 +1,15 @@
+#include <TDocStd_Document.hxx>
+#include <XCAFDoc_ShapeTool.hxx>
+#include "hs_TDocStd_Document.h"
+
+Handle(TDocStd_Document) * hs_new_TDocStd_Document(char * storageFormat){
+    return new opencascade::handle<TDocStd_Document>(new TDocStd_Document(storageFormat));
+}
+
+void hs_delete_TDocStd_Document(Handle(TDocStd_Document) * theDocument){
+    delete theDocument;
+}
+
+TDF_Label * hs_TDocStd_Document_main(Handle(TDocStd_Document) *theDocument){
+    return new TDF_Label(theDocument->get()->Main());
+}
diff --git a/cpp/hs_TDocStd_Document.h b/cpp/hs_TDocStd_Document.h
new file mode 100644
--- /dev/null
+++ b/cpp/hs_TDocStd_Document.h
@@ -0,0 +1,20 @@
+#ifndef HS_TDOCSTD_DOCUMENT_H
+#define HS_TDOCSTD_DOCUMENT_H
+
+#include "hs_types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+Handle(TDocStd_Document) * hs_new_TDocStd_Document(char * storageFormat);
+
+void hs_delete_TDocStd_Document(Handle(TDocStd_Document) * theDocument);
+
+TDF_Label * hs_TDocStd_Document_main(Handle(TDocStd_Document) *theDocument);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // HS_TDOCSTD_DOCUMENT_H
diff --git a/cpp/hs_XCAFDoc_DocumentTool.cpp b/cpp/hs_XCAFDoc_DocumentTool.cpp
new file mode 100644
--- /dev/null
+++ b/cpp/hs_XCAFDoc_DocumentTool.cpp
@@ -0,0 +1,6 @@
+#include <XCAFDoc_DocumentTool.hxx>
+#include "hs_XCAFDoc_DocumentTool.h"
+
+Handle (XCAFDoc_ShapeTool) * hs_XCAFDoc_DocumentTool_shapeTool(TDF_Label * label){
+    return new opencascade::handle<XCAFDoc_ShapeTool>(XCAFDoc_DocumentTool::ShapeTool(*label));
+}
diff --git a/cpp/hs_XCAFDoc_DocumentTool.h b/cpp/hs_XCAFDoc_DocumentTool.h
new file mode 100644
--- /dev/null
+++ b/cpp/hs_XCAFDoc_DocumentTool.h
@@ -0,0 +1,16 @@
+#ifndef HS_XCAFDOC_DOCUMENTTOOL_H
+#define HS_XCAFDOC_DOCUMENTTOOL_H
+
+#include "hs_types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+Handle (XCAFDoc_ShapeTool) * hs_XCAFDoc_DocumentTool_shapeTool(TDF_Label * label);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // HS_XCAFDOC_DOCUMENTTOOL_H
diff --git a/cpp/hs_XCAFDoc_ShapeTool.cpp b/cpp/hs_XCAFDoc_ShapeTool.cpp
new file mode 100644
--- /dev/null
+++ b/cpp/hs_XCAFDoc_ShapeTool.cpp
@@ -0,0 +1,10 @@
+#include <XCAFDoc_ShapeTool.hxx>
+#include "hs_XCAFDoc_ShapeTool.h"
+
+void hs_delete_XCAFDoc_ShapeTool(Handle(XCAFDoc_ShapeTool) * shapeTool){
+    delete shapeTool;
+}
+
+TDF_Label * hs_XCAFDoc_ShapeTool_addShape(Handle(XCAFDoc_ShapeTool) *shapeTool, TopoDS_Shape *theShape, bool makeAssembly, bool makePrepare){
+    return new TDF_Label(shapeTool->get()->AddShape(*theShape, makeAssembly, makePrepare));
+}
diff --git a/cpp/hs_XCAFDoc_ShapeTool.h b/cpp/hs_XCAFDoc_ShapeTool.h
new file mode 100644
--- /dev/null
+++ b/cpp/hs_XCAFDoc_ShapeTool.h
@@ -0,0 +1,18 @@
+#ifndef HS_XCAFDOC_SHAPETOOL_H
+#define HS_XCAFDOC_SHAPETOOL_H
+
+#include "hs_types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void hs_delete_XCAFDoc_ShapeTool(Handle(XCAFDoc_ShapeTool) * shapeTool);
+
+TDF_Label * hs_XCAFDoc_ShapeTool_addShape(Handle(XCAFDoc_ShapeTool) *shapeTool, TopoDS_Shape *theShape, bool makeAssembly, bool makePrepare);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // HS_XCAFDOC_SHAPETOOL_H
diff --git a/cpp/hs_types.h b/cpp/hs_types.h
--- a/cpp/hs_types.h
+++ b/cpp/hs_types.h
@@ -66,6 +66,12 @@
 typedef void GProp_GProps;
 typedef void Bnd_Box;
 typedef void Bnd_OBB;
+typedef void Message_ProgressRange;
+typedef void RWGltf_CafWriter;
+typedef void TColStd_IndexedDataMapOfStringString;
+typedef void TDF_Label;
+typedef void TDocStd_Document;
+typedef void XCAFDoc_ShapeTool;
 #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.0.0
+version:        0.2.1.0
 synopsis:       Thin Wrapper for the OpenCASCADE CAD Kernel
 description:    Please see the README on GitHub at <https://github.com/joe-warren/opencascade-hs#readme>
 category:       Graphics,FFI
@@ -70,9 +70,14 @@
     cpp/hs_gp_Vec2d.h
     cpp/hs_gp_XYZ.h
     cpp/hs_GProp_GProps.h
+    cpp/hs_Message_ProgressRange.h
     cpp/hs_NCollection_Array1.h
+    cpp/hs_RWGltf_CafWriter.h
     cpp/hs_STEPControl_Writer.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_Compound.h
@@ -85,6 +90,8 @@
     cpp/hs_TopoDS_Vertex.h
     cpp/hs_TopoDS_Wire.h
     cpp/hs_types.h
+    cpp/hs_XCAFDoc_DocumentTool.h
+    cpp/hs_XCAFDoc_ShapeTool.h
 
 source-repository head
   type: git
@@ -180,10 +187,16 @@
       OpenCascade.IFSelect.ReturnStatus
       OpenCascade.Inheritance
       OpenCascade.Internal.Bool
+      OpenCascade.Message.Internal.Destructors
+      OpenCascade.Message.ProgressRange
+      OpenCascade.Message.Types
       OpenCascade.NCollection
       OpenCascade.NCollection.Array1
       OpenCascade.NCollection.Internal.Destructors
       OpenCascade.NCollection.Types
+      OpenCascade.RWGltf.CafWriter
+      OpenCascade.RWGltf.Internal.Destructors
+      OpenCascade.RWGltf.Types
       OpenCascade.STEPControl
       OpenCascade.STEPControl.Internal.Destructors
       OpenCascade.STEPControl.StepModelType
@@ -193,6 +206,14 @@
       OpenCascade.StlAPI.Internal.Destructors
       OpenCascade.StlAPI.Types
       OpenCascade.StlAPI.Writer
+      OpenCascade.TColStd.IndexedDataMapOfStringString
+      OpenCascade.TColStd.Internal.Destructors
+      OpenCascade.TColStd.Types
+      OpenCascade.TDF.Internal.Destructors
+      OpenCascade.TDF.Types
+      OpenCascade.TDocStd.Document
+      OpenCascade.TDocStd.Internal.Destructors
+      OpenCascade.TDocStd.Types
       OpenCascade.TopAbs
       OpenCascade.TopAbs.Orientation
       OpenCascade.TopAbs.ShapeEnum
@@ -218,6 +239,10 @@
       OpenCascade.TopoDS.Wire
       OpenCascade.TopTools
       OpenCascade.TopTools.Types
+      OpenCascade.XCAFDoc.DocumentTool
+      OpenCascade.XCAFDoc.Internal.Destructors
+      OpenCascade.XCAFDoc.ShapeTool
+      OpenCascade.XCAFDoc.Types
   other-modules:
       Paths_opencascade_hs
   autogen-modules:
@@ -279,9 +304,14 @@
       cpp/hs_gp_Vec2d.cpp
       cpp/hs_gp_XYZ.cpp
       cpp/hs_GProp_GProps.cpp
+      cpp/hs_Message_ProgressRange.cpp
       cpp/hs_NCollection_Array1.cpp
+      cpp/hs_RWGltf_CafWriter.cpp
       cpp/hs_STEPControl_Writer.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_Compound.cpp
@@ -293,6 +323,8 @@
       cpp/hs_TopoDS_Solid.cpp
       cpp/hs_TopoDS_Vertex.cpp
       cpp/hs_TopoDS_Wire.cpp
+      cpp/hs_XCAFDoc_DocumentTool.cpp
+      cpp/hs_XCAFDoc_ShapeTool.cpp
   extra-libraries:
       stdc++
       TKGeomBase
@@ -312,6 +344,9 @@
       TKSTEP
       TKV3d
       TKMesh
+      TKRWMesh
+      TKLCAF
+      TKXCAF
       TKService
   build-depends:
       base >=4.7 && <5
diff --git a/src/OpenCascade/Message/Internal/Destructors.hs b/src/OpenCascade/Message/Internal/Destructors.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/Message/Internal/Destructors.hs
@@ -0,0 +1,9 @@
+{-# LANGUAGE CApiFFI #-}
+module OpenCascade.Message.Internal.Destructors
+( deleteProgressRange
+) where
+
+import OpenCascade.Message.Types
+import Foreign.Ptr 
+
+foreign import capi unsafe "hs_Message_ProgressRange.h hs_delete_Message_ProgressRange" deleteProgressRange :: Ptr ProgressRange -> IO ()
diff --git a/src/OpenCascade/Message/ProgressRange.hs b/src/OpenCascade/Message/ProgressRange.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/Message/ProgressRange.hs
@@ -0,0 +1,15 @@
+{-# LANGUAGE CApiFFI #-}
+module OpenCascade.Message.ProgressRange
+( ProgressRange
+, new
+) where
+
+import OpenCascade.Message.Types (ProgressRange)
+import OpenCascade.Message.Internal.Destructors (deleteProgressRange)
+import Foreign.Ptr (Ptr)
+import Data.Acquire (Acquire, mkAcquire)
+
+foreign import capi unsafe "hs_Message_ProgressRange.h hs_new_Message_ProgressRange" rawNew :: IO (Ptr ProgressRange)
+
+new :: Acquire (Ptr ProgressRange)
+new = mkAcquire rawNew deleteProgressRange
diff --git a/src/OpenCascade/Message/Types.hs b/src/OpenCascade/Message/Types.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/Message/Types.hs
@@ -0,0 +1,6 @@
+{-# LANGUAGE EmptyDataDecls #-}
+module OpenCascade.Message.Types
+( ProgressRange
+) where
+
+data ProgressRange
diff --git a/src/OpenCascade/RWGltf/CafWriter.hs b/src/OpenCascade/RWGltf/CafWriter.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/RWGltf/CafWriter.hs
@@ -0,0 +1,25 @@
+{-# LANGUAGE CApiFFI #-}
+module OpenCascade.RWGltf.CafWriter
+( CafWriter
+, new
+, perform
+) where
+
+import OpenCascade.RWGltf.Types (CafWriter)
+import OpenCascade.RWGltf.Internal.Destructors (deleteCafWriter)
+import Foreign.Ptr (Ptr)
+import Foreign.C.String (CString, withCString)
+import Foreign.C (CBool (..))
+import Data.Acquire (Acquire, mkAcquire)
+import OpenCascade.Internal.Bool (boolToCBool)
+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_RWGltf_CafWriter.h hs_new_RWGltf_CafWriter" rawNew :: CString -> CBool -> IO (Ptr CafWriter)
+
+new :: String -> Bool -> Acquire (Ptr CafWriter)
+new filepath binary = mkAcquire (withCString filepath $ \str -> rawNew str (boolToCBool binary)) deleteCafWriter
+
+foreign import capi unsafe "hs_RWGltf_CafWriter.h hs_RWGltf_CafWriter_Perform" perform :: Ptr CafWriter -> Ptr (Handle TDocStd.Document) -> Ptr (TColStd.IndexedDataMapOfStringString) -> Ptr (Message.ProgressRange) -> IO ()
diff --git a/src/OpenCascade/RWGltf/Internal/Destructors.hs b/src/OpenCascade/RWGltf/Internal/Destructors.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/RWGltf/Internal/Destructors.hs
@@ -0,0 +1,9 @@
+{-# LANGUAGE CApiFFI #-}
+module OpenCascade.RWGltf.Internal.Destructors
+( deleteCafWriter
+) where
+
+import OpenCascade.RWGltf.Types
+import Foreign.Ptr 
+
+foreign import capi unsafe "hs_RWGltf_CafWriter.h hs_delete_RWGltf_CafWriter" deleteCafWriter :: Ptr CafWriter -> IO ()
diff --git a/src/OpenCascade/RWGltf/Types.hs b/src/OpenCascade/RWGltf/Types.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/RWGltf/Types.hs
@@ -0,0 +1,6 @@
+{-# LANGUAGE EmptyDataDecls #-}
+module OpenCascade.RWGltf.Types
+( CafWriter
+) where
+
+data CafWriter
diff --git a/src/OpenCascade/TColStd/IndexedDataMapOfStringString.hs b/src/OpenCascade/TColStd/IndexedDataMapOfStringString.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/TColStd/IndexedDataMapOfStringString.hs
@@ -0,0 +1,15 @@
+{-# LANGUAGE CApiFFI #-}
+module OpenCascade.TColStd.IndexedDataMapOfStringString
+( IndexedDataMapOfStringString
+, new
+) where
+
+import OpenCascade.TColStd.Types (IndexedDataMapOfStringString)
+import OpenCascade.TColStd.Internal.Destructors (deleteIndexedDataMapOfStringString)
+import Foreign.Ptr (Ptr)
+import Data.Acquire (Acquire, mkAcquire)
+
+foreign import capi unsafe "hs_TColStd_IndexedDataMapOfStringString.h hs_new_TColStd_IndexedDataMapOfStringString" rawNew :: IO (Ptr IndexedDataMapOfStringString)
+
+new :: Acquire (Ptr IndexedDataMapOfStringString)
+new = mkAcquire rawNew deleteIndexedDataMapOfStringString
diff --git a/src/OpenCascade/TColStd/Internal/Destructors.hs b/src/OpenCascade/TColStd/Internal/Destructors.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/TColStd/Internal/Destructors.hs
@@ -0,0 +1,9 @@
+{-# LANGUAGE CApiFFI #-}
+module OpenCascade.TColStd.Internal.Destructors
+( deleteIndexedDataMapOfStringString
+) where
+
+import OpenCascade.TColStd.Types
+import Foreign.Ptr 
+
+foreign import capi unsafe "hs_TColStd_IndexedDataMapOfStringString.h hs_delete_TColStd_IndexedDataMapOfStringString" deleteIndexedDataMapOfStringString :: Ptr (IndexedDataMapOfStringString) -> IO ()
diff --git a/src/OpenCascade/TColStd/Types.hs b/src/OpenCascade/TColStd/Types.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/TColStd/Types.hs
@@ -0,0 +1,6 @@
+{-# LANGUAGE EmptyDataDecls #-}
+module OpenCascade.TColStd.Types
+( IndexedDataMapOfStringString
+) where
+
+data IndexedDataMapOfStringString
diff --git a/src/OpenCascade/TDF/Internal/Destructors.hs b/src/OpenCascade/TDF/Internal/Destructors.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/TDF/Internal/Destructors.hs
@@ -0,0 +1,9 @@
+{-# LANGUAGE CApiFFI #-}
+module OpenCascade.TDF.Internal.Destructors 
+( deleteLabel
+) where
+import OpenCascade.TDF.Types 
+import Foreign.Ptr (Ptr)
+
+
+foreign import capi unsafe "hs_TDF_Label.h hs_delete_TDF_Label" deleteLabel :: Ptr Label -> IO ()
diff --git a/src/OpenCascade/TDF/Types.hs b/src/OpenCascade/TDF/Types.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/TDF/Types.hs
@@ -0,0 +1,6 @@
+{-# LANGUAGE EmptyDataDecls #-}
+module OpenCascade.TDF.Types 
+( Label
+) where
+
+data Label
diff --git a/src/OpenCascade/TDocStd/Document.hs b/src/OpenCascade/TDocStd/Document.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/TDocStd/Document.hs
@@ -0,0 +1,25 @@
+{-# LANGUAGE CApiFFI #-}
+module OpenCascade.TDocStd.Document 
+( Document
+, fromStorageFormat
+, main 
+) where
+
+import OpenCascade.TDocStd.Types (Document)
+import OpenCascade.TDocStd.Internal.Destructors (deleteDocumentHandle)
+import OpenCascade.TDF.Types (Label)
+import OpenCascade.TDF.Internal.Destructors (deleteLabel)
+import OpenCascade.Handle (Handle)
+import Data.Acquire (Acquire, mkAcquire)
+import Foreign.Ptr (Ptr)
+import Foreign.C.String (CString, withCString)
+
+foreign import capi unsafe "hs_TDocStd_Document.h hs_new_TDocStd_Document" rawNew :: CString -> IO (Ptr (Handle Document))
+
+fromStorageFormat :: String -> Acquire (Ptr (Handle Document))
+fromStorageFormat fmt = mkAcquire (withCString fmt rawNew) deleteDocumentHandle
+
+foreign import capi unsafe "hs_TDocStd_Document.h hs_TDocStd_Document_main" rawMain :: Ptr (Handle Document) -> IO (Ptr Label)
+
+main :: Ptr (Handle Document) -> Acquire (Ptr Label)
+main doc = mkAcquire (rawMain doc) deleteLabel  
diff --git a/src/OpenCascade/TDocStd/Internal/Destructors.hs b/src/OpenCascade/TDocStd/Internal/Destructors.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/TDocStd/Internal/Destructors.hs
@@ -0,0 +1,8 @@
+{-# LANGUAGE CApiFFI #-}
+module OpenCascade.TDocStd.Internal.Destructors (deleteDocumentHandle) where
+
+import OpenCascade.Handle (Handle)
+import OpenCascade.TDocStd.Types (Document)
+import Foreign.Ptr (Ptr)
+
+foreign import capi unsafe "hs_TDocStd_Document.h hs_delete_TDocStd_Document" deleteDocumentHandle :: Ptr (Handle Document) -> IO ()
diff --git a/src/OpenCascade/TDocStd/Types.hs b/src/OpenCascade/TDocStd/Types.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/TDocStd/Types.hs
@@ -0,0 +1,4 @@
+{-# LANGUAGE EmptyDataDecls #-}
+module OpenCascade.TDocStd.Types (Document) where
+
+data Document
diff --git a/src/OpenCascade/XCAFDoc/DocumentTool.hs b/src/OpenCascade/XCAFDoc/DocumentTool.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/XCAFDoc/DocumentTool.hs
@@ -0,0 +1,16 @@
+{-# LANGUAGE CApiFFI #-}
+module OpenCascade.XCAFDoc.DocumentTool
+( shapeTool
+) where
+
+import OpenCascade.XCAFDoc.Types (ShapeTool)
+import OpenCascade.XCAFDoc.Internal.Destructors (deleteShapeToolHandle)
+import OpenCascade.TDF.Types (Label)
+import OpenCascade.Handle (Handle)
+import Foreign.Ptr (Ptr)
+import Data.Acquire (Acquire, mkAcquire)
+
+foreign import capi unsafe "hs_XCAFDoc_DocumentTool.h hs_XCAFDoc_DocumentTool_shapeTool" rawShapeTool :: Ptr Label -> IO (Ptr (Handle ShapeTool))
+
+shapeTool :: Ptr Label -> Acquire (Ptr (Handle ShapeTool))
+shapeTool label = mkAcquire  (rawShapeTool label) deleteShapeToolHandle
diff --git a/src/OpenCascade/XCAFDoc/Internal/Destructors.hs b/src/OpenCascade/XCAFDoc/Internal/Destructors.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/XCAFDoc/Internal/Destructors.hs
@@ -0,0 +1,10 @@
+{-# LANGUAGE CApiFFI #-}
+module OpenCascade.XCAFDoc.Internal.Destructors 
+( deleteShapeToolHandle 
+) where
+
+import OpenCascade.XCAFDoc.Types
+import OpenCascade.Handle
+import Foreign.Ptr 
+
+foreign import capi unsafe "hs_XCAFDoc_ShapeTool.h hs_delete_XCAFDoc_ShapeTool" deleteShapeToolHandle :: Ptr (Handle ShapeTool) -> IO ()
diff --git a/src/OpenCascade/XCAFDoc/ShapeTool.hs b/src/OpenCascade/XCAFDoc/ShapeTool.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/XCAFDoc/ShapeTool.hs
@@ -0,0 +1,20 @@
+{-# LANGUAGE CApiFFI #-}
+module OpenCascade.XCAFDoc.ShapeTool
+( ShapeTool
+, addShape
+) where
+
+import OpenCascade.XCAFDoc.Types (ShapeTool)
+import qualified OpenCascade.TopoDS.Types as TopoDS
+import OpenCascade.Handle (Handle)
+import OpenCascade.TDF.Types (Label)
+import OpenCascade.TDF.Internal.Destructors (deleteLabel)
+import OpenCascade.Internal.Bool (boolToCBool)
+import Data.Acquire (Acquire, mkAcquire)
+import Foreign.C (CBool (..))
+import Foreign.Ptr (Ptr)
+
+foreign import capi unsafe "hs_XCAFDoc_ShapeTool.h hs_XCAFDoc_ShapeTool_addShape" rawAddShape :: Ptr (Handle ShapeTool) -> Ptr TopoDS.Shape -> CBool -> CBool -> IO (Ptr Label)
+
+addShape :: Ptr (Handle ShapeTool) -> Ptr TopoDS.Shape -> Bool -> Bool -> Acquire (Ptr Label)
+addShape tool shape makeAssembly makePrepare = mkAcquire (rawAddShape tool shape (boolToCBool makeAssembly) (boolToCBool makePrepare)) deleteLabel
diff --git a/src/OpenCascade/XCAFDoc/Types.hs b/src/OpenCascade/XCAFDoc/Types.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/XCAFDoc/Types.hs
@@ -0,0 +1,6 @@
+{-# LANGUAGE EmptyDataDecls #-}
+module OpenCascade.XCAFDoc.Types 
+( ShapeTool
+) where
+
+data ShapeTool
