diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -8,6 +8,20 @@
 
 ## Unreleased
 
+## 0.3.0.0
+
+### Changed
+
+- The project now depends on (and supports) OpenCascade `7.8.0` or later
+
+### Added 
+
+- added `OpenCascade.TopTools.ShapeMapHasher` (this replaces `hashCode` in `OpenCascade.TopoDS.Shape`)
+
+### Removed
+
+- removed `OpenCascade.TopoDS.Shape.hashCode` 
+
 ## 0.2.2.1
 
 ## 0.2.2.0
diff --git a/cpp/hs_TopTools_ShapeMapHasher.cpp b/cpp/hs_TopTools_ShapeMapHasher.cpp
new file mode 100644
--- /dev/null
+++ b/cpp/hs_TopTools_ShapeMapHasher.cpp
@@ -0,0 +1,12 @@
+#include <TopTools_ShapeMapHasher.hxx>
+#include "hs_TopTools_ShapeMapHasher.h"
+
+int hs_TopTools_ShapeMapHasher_hash(TopoDS_Shape * shape){
+    auto hasher = TopTools_ShapeMapHasher();
+    return hasher(*shape);
+}
+
+bool hs_TopTools_ShapeMapHasher_isEqual(TopoDS_Shape * shapeA, TopoDS_Shape * shapeB){
+    auto hasher = TopTools_ShapeMapHasher();
+    return hasher(*shapeA, *shapeB);
+}
diff --git a/cpp/hs_TopTools_ShapeMapHasher.h b/cpp/hs_TopTools_ShapeMapHasher.h
new file mode 100644
--- /dev/null
+++ b/cpp/hs_TopTools_ShapeMapHasher.h
@@ -0,0 +1,18 @@
+#ifndef HS_TOPTOOLS_SHAPEMAPHASHER_H
+#define HS_TOPTOOLS_SHAPEMAPHASHER_H
+
+#include "hs_types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+int hs_TopTools_ShapeMapHasher_hash(TopoDS_Shape * shape);
+
+bool hs_TopTools_ShapeMapHasher_isEqual(TopoDS_Shape * shapeA, TopoDS_Shape * shapeB);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // HS_TOPTOOLS_SHAPEMAPHASHER_H
diff --git a/cpp/hs_TopoDS_Shape.cpp b/cpp/hs_TopoDS_Shape.cpp
--- a/cpp/hs_TopoDS_Shape.cpp
+++ b/cpp/hs_TopoDS_Shape.cpp
@@ -179,7 +179,3 @@
 TopoDS_Shape * hs_TopoDS_Shape_EmptyCopied(TopoDS_Shape * shape){
     return new TopoDS_Shape(shape->EmptyCopied());
 }
-
-int hs_TopoDS_Shape_hashCode(TopoDS_Shape * shape, int maxN){
-    return shape->HashCode(maxN);
-}
diff --git a/cpp/hs_TopoDS_Shape.h b/cpp/hs_TopoDS_Shape.h
--- a/cpp/hs_TopoDS_Shape.h
+++ b/cpp/hs_TopoDS_Shape.h
@@ -95,8 +95,6 @@
 
 void hs_TopoDS_Shape_EmptyCopy(TopoDS_Shape * shape);
 
-int hs_TopoDS_Shape_hashCode(TopoDS_Shape * shape, int maxN);
-
 TopoDS_Shape * hs_TopoDS_Shape_EmptyCopied(TopoDS_Shape * shape);
 
 #ifdef __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.2.1
+version:        0.3.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
@@ -103,6 +103,7 @@
     cpp/hs_TopoDS_Solid.h
     cpp/hs_TopoDS_Vertex.h
     cpp/hs_TopoDS_Wire.h
+    cpp/hs_TopTools_ShapeMapHasher.h
     cpp/hs_types.h
     cpp/hs_XCAFDoc_DocumentTool.h
     cpp/hs_XCAFDoc_ShapeTool.h
@@ -275,6 +276,7 @@
       OpenCascade.TopoDS.Vertex
       OpenCascade.TopoDS.Wire
       OpenCascade.TopTools
+      OpenCascade.TopTools.ShapeMapHasher
       OpenCascade.TopTools.Types
       OpenCascade.XCAFDoc.DocumentTool
       OpenCascade.XCAFDoc.Internal.Destructors
@@ -376,6 +378,7 @@
       cpp/hs_TopoDS_Solid.cpp
       cpp/hs_TopoDS_Vertex.cpp
       cpp/hs_TopoDS_Wire.cpp
+      cpp/hs_TopTools_ShapeMapHasher.cpp
       cpp/hs_XCAFDoc_DocumentTool.cpp
       cpp/hs_XCAFDoc_ShapeTool.cpp
       cpp/hs_XSControl_Reader.cpp
@@ -388,14 +391,15 @@
       TKMath
       TKernel
       TKBRep
-      TKGeomBase
       TKOffset
       TKFillet
       TKBO
       TKPrim
       TKTopAlgo
-      TKSTL
-      TKSTEP
+      TKDESTL
+      TKDESTEP
+      TKDEGLTF
+      TKDEOBJ
       TKV3d
       TKMesh
       TKRWMesh
diff --git a/src/OpenCascade/TopTools/ShapeMapHasher.hs b/src/OpenCascade/TopTools/ShapeMapHasher.hs
new file mode 100644
--- /dev/null
+++ b/src/OpenCascade/TopTools/ShapeMapHasher.hs
@@ -0,0 +1,20 @@
+{-# LANGUAGE CApiFFI #-}
+module OpenCascade.TopTools.ShapeMapHasher 
+( hash
+, isEqual
+) where
+
+import qualified OpenCascade.TopoDS.Types as TopoDS
+import Foreign.Ptr (Ptr)
+import Foreign.C (CInt (..), CBool (..))
+import OpenCascade.Internal.Bool (cBoolToBool)
+
+foreign import capi unsafe "hs_TopTools_ShapeMapHasher.h hs_TopTools_ShapeMapHasher_hash" rawHash :: Ptr TopoDS.Shape -> IO (CInt)
+
+hash :: Ptr TopoDS.Shape -> IO Int
+hash s = fromIntegral <$> rawHash s
+
+foreign import capi unsafe "hs_TopTools_ShapeMapHasher.h hs_TopTools_ShapeMapHasher_isEqual" rawIsEqual :: Ptr TopoDS.Shape -> Ptr TopoDS.Shape -> IO (CBool)
+
+isEqual :: Ptr TopoDS.Shape -> Ptr TopoDS.Shape -> IO Bool
+isEqual a b = cBoolToBool <$> rawIsEqual a b
diff --git a/src/OpenCascade/TopoDS/Shape.hs b/src/OpenCascade/TopoDS/Shape.hs
--- a/src/OpenCascade/TopoDS/Shape.hs
+++ b/src/OpenCascade/TopoDS/Shape.hs
@@ -41,7 +41,6 @@
 , isNotEqual
 , emptyCopy
 , emptyCopied
-, hashCode
 ) where
 
 import Prelude hiding (reverse)
@@ -333,9 +332,3 @@
 
 emptyCopied :: Ptr Shape -> Acquire (Ptr Shape)
 emptyCopied s = mkAcquire (rawEmptyCopied s) deleteShape
-
-
-foreign import capi unsafe "hs_TopoDS_Shape.h hs_TopoDS_Shape_hashCode" rawHashCode :: Ptr Shape -> CInt -> IO CInt
-
-hashCode :: Ptr Shape -> Int -> IO Int
-hashCode shape upperBound = fromIntegral <$> rawHashCode shape (fromIntegral upperBound) 
