diff --git a/CMakeLists.txt b/CMakeLists.txt
index c5ab0308270e672b9d3929106a7a68fb73a8cc05..7e0539aa6b5f621fc3adfc4dadb18ad7f100127e 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -6,6 +6,7 @@ set(CMAKE_COLOR_MAKEFILE   ON)
 set(CMAKE_C_STANDARD 11)
 #set(SUBMODULES_NO_BUILD ON)
 add_definitions("-fpic")
+add_definitions("-DDAP_LOG_MT")
 
 if(NOT (${SUBMODULES_NO_BUILD} MATCHES ON))
     if (NOT (TARGET dap_core))
diff --git a/include/wrapping_dap_hash.h b/include/wrapping_dap_hash.h
new file mode 100644
index 0000000000000000000000000000000000000000..701b5cc4fa4aa5cedaf44a846210b1f858569fdf
--- /dev/null
+++ b/include/wrapping_dap_hash.h
@@ -0,0 +1,138 @@
+#ifndef _WRAPPING_DAP_HASH_
+#define _WRAPPING_DAP_HASH_
+
+#include <Python.h>
+#include "dap_hash.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct PyDapHashType{
+    PyObject_HEAD
+    dap_hash_type_t hash_type;
+}PyDapHashTypeObject;
+
+PyObject *DAP_HASH_TYPE_KECCAK_PY();
+PyObject *DAP_HASH_TYPE_SLOW_0_PY();
+
+static PyMethodDef DapHashTypeMethods[] = {
+    {"DAP_HASH_TYPE_KECCAK", (PyCFunction)DAP_HASH_TYPE_KECCAK_PY, METH_NOARGS | METH_STATIC, ""},
+    {"DAP_HASH_TYPE_SLOW_0", (PyCFunction)DAP_HASH_TYPE_SLOW_0_PY, METH_NOARGS | METH_STATIC, ""},
+    {NULL, NULL, 0, NULL}
+};
+
+static PyTypeObject DapChainHashTypeObject_DapChainHashTypeObjectType = {
+    PyVarObject_HEAD_INIT(NULL, 0)
+    "CellFrame.ChainHashType",          /* tp_name */
+    sizeof(PyDapHashTypeObject),   /* tp_basicsize */
+    0,                               /* tp_itemsize */
+    0,                               /* tp_dealloc */
+    0,                               /* tp_print */
+    0,                               /* tp_getattr */
+    0,                               /* tp_setattr */
+    0,                               /* tp_reserved */
+    0,                               /* tp_repr */
+    0,                               /* tp_as_number */
+    0,                               /* tp_as_sequence */
+    0,                               /* tp_as_mapping */
+    0,                               /* tp_hash  */
+    0,                               /* tp_call */
+    0,                               /* tp_str */
+    0,                               /* tp_getattro */
+    0,                               /* tp_setattro */
+    0,                               /* tp_as_buffer */
+    Py_TPFLAGS_DEFAULT |
+        Py_TPFLAGS_BASETYPE,         /* tp_flags */
+    "Chain hash type object",           /* tp_doc */
+    0,		                         /* tp_traverse */
+    0,		                         /* tp_clear */
+    0,		                         /* tp_richcompare */
+    0,                               /* tp_weaklistoffset */
+    0,		                         /* tp_iter */
+    0,		                         /* tp_iternext */
+    DapHashTypeMethods,         /* tp_methods */
+    0,                               /* tp_members */
+    0,                               /* tp_getset */
+    0,                               /* tp_base */
+    0,                               /* tp_dict */
+    0,                               /* tp_descr_get */
+    0,                               /* tp_descr_set */
+    0,                               /* tp_dictoffset */
+    0,                               /* tp_init */
+    0,                               /* tp_alloc */
+    PyType_GenericNew,               /* tp_new */
+};
+
+/*=================*/
+
+/* Chain hash fast */
+typedef struct PyDapChainHashFast{
+    PyObject_HEAD
+    dap_chain_hash_fast_t *hash_fast;
+}PyDapChainHashFastObject;
+
+PyObject *dap_chain_str_to_hash_fast_py(PyObject *self, PyObject *args);
+PyObject *dap_hash_fast_py(PyObject *self, PyObject *args);
+PyObject *dap_hash_fast_compare_py(PyObject *self, PyObject *args);
+PyObject *dap_hash_fast_is_blank_py(PyObject *self, PyObject *args);
+PyObject *dap_chain_hash_fast_to_str_py(PyObject *self, PyObject *args);
+PyObject *dap_chain_hash_fast_to_str_new_py(PyObject *self, PyObject *args);
+
+static PyMethodDef DapHashFastMethods[] = {
+    {"strToHashFast", (PyCFunction)dap_chain_str_to_hash_fast_py, METH_VARARGS | METH_STATIC, ""},
+    {"hashFast", (PyCFunction)dap_hash_fast_py, METH_VARARGS, ""},
+    {"compare", (PyCFunction)dap_hash_fast_compare_py, METH_VARARGS | METH_STATIC, ""},
+    {"isBlank", (PyCFunction)dap_hash_fast_is_blank_py, METH_VARARGS, ""},
+    {"toStr", (PyCFunction)dap_chain_hash_fast_to_str_py, METH_VARARGS, ""},
+    {"toStrNew", (PyCFunction)dap_chain_hash_fast_to_str_new_py, METH_VARARGS, ""},
+    {NULL, NULL, 0, NULL}
+};
+
+static PyTypeObject DapChainHashFastObject_DapChainHashFastObjectType = {
+    PyVarObject_HEAD_INIT(NULL, 0)
+    "CellFrame.ChainFast",          /* tp_name */
+    sizeof(PyDapChainHashFastObject),   /* tp_basicsize */
+    0,                               /* tp_itemsize */
+    0,                               /* tp_dealloc */
+    0,                               /* tp_print */
+    0,                               /* tp_getattr */
+    0,                               /* tp_setattr */
+    0,                               /* tp_reserved */
+    0,                               /* tp_repr */
+    0,                               /* tp_as_number */
+    0,                               /* tp_as_sequence */
+    0,                               /* tp_as_mapping */
+    0,                               /* tp_hash  */
+    0,                               /* tp_call */
+    0,                               /* tp_str */
+    0,                               /* tp_getattro */
+    0,                               /* tp_setattro */
+    0,                               /* tp_as_buffer */
+    Py_TPFLAGS_DEFAULT |
+        Py_TPFLAGS_BASETYPE,         /* tp_flags */
+    "Chain hash fast object",           /* tp_doc */
+    0,		                         /* tp_traverse */
+    0,		                         /* tp_clear */
+    0,		                         /* tp_richcompare */
+    0,                               /* tp_weaklistoffset */
+    0,		                         /* tp_iter */
+    0,		                         /* tp_iternext */
+    DapHashFastMethods,         /* tp_methods */
+    0,                               /* tp_members */
+    0,                               /* tp_getset */
+    0,                               /* tp_base */
+    0,                               /* tp_dict */
+    0,                               /* tp_descr_get */
+    0,                               /* tp_descr_set */
+    0,                               /* tp_dictoffset */
+    0,                               /* tp_init */
+    0,                               /* tp_alloc */
+    PyType_GenericNew,               /* tp_new */
+};
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // _WRAPPING_DAP_HASH_
diff --git a/libdap b/libdap
index f91fb3b3b6a69ef53531c8fd729592cdff4ec442..ee6e8617e1f589b45f15e327ed18cddfa87915f8 160000
--- a/libdap
+++ b/libdap
@@ -1 +1 @@
-Subproject commit f91fb3b3b6a69ef53531c8fd729592cdff4ec442
+Subproject commit ee6e8617e1f589b45f15e327ed18cddfa87915f8
diff --git a/libdap-crypto b/libdap-crypto
index bb48d2efb77ee770c6f36c296811688f2ad9c348..16a16e71b9cfae4fd8df530ed8cd6146010ae7e0 160000
--- a/libdap-crypto
+++ b/libdap-crypto
@@ -1 +1 @@
-Subproject commit bb48d2efb77ee770c6f36c296811688f2ad9c348
+Subproject commit 16a16e71b9cfae4fd8df530ed8cd6146010ae7e0
diff --git a/src/wrapping_dap_hash.c b/src/wrapping_dap_hash.c
new file mode 100644
index 0000000000000000000000000000000000000000..c54f6f43be72b41a9fa0dbebdf61e15b6e60c3e3
--- /dev/null
+++ b/src/wrapping_dap_hash.c
@@ -0,0 +1,68 @@
+#include "wrapping_dap_hash.h"
+
+PyObject *DAP_HASH_TYPE_KECCAK_PY(){
+    PyObject *obj = _PyObject_New(&DapChainHashTypeObject_DapChainHashTypeObjectType);
+    ((PyDapHashTypeObject*)obj)->hash_type = DAP_HASH_TYPE_KECCAK;
+    return Py_BuildValue("O", obj);
+}
+PyObject *DAP_HASH_TYPE_SLOW_0_PY(){
+    PyObject *obj = _PyObject_New(&DapChainHashTypeObject_DapChainHashTypeObjectType);
+    ((PyDapHashTypeObject*)obj)->hash_type = DAP_HASH_TYPE_SLOW_0;
+    return Py_BuildValue("O", obj);
+}
+
+PyObject *dap_chain_str_to_hash_fast_py(PyObject *self, PyObject *args){
+    const char *hash_str;
+    PyObject *obj_hash_fast;
+    if (!PyArg_ParseTuple(args, "s|O", &hash_str, &obj_hash_fast))
+        return NULL;
+    int res = dap_chain_str_to_hash_fast(hash_str, ((PyDapChainHashFastObject*)obj_hash_fast)->hash_fast);
+    return Py_BuildValue("nO", res, obj_hash_fast);
+}
+
+PyObject *dap_hash_fast_py(PyObject *self, PyObject *args){
+    PyObject *obj_bytes;
+    size_t data_in_size;
+    if (!PyArg_ParseTuple(args, "O|n", &obj_bytes, &data_in_size))
+        return NULL;
+    const void *bytes = (void*)PyBytes_AsString(obj_bytes);
+    bool res = dap_hash_fast(bytes, data_in_size, ((PyDapChainHashFastObject*)self)->hash_fast);
+    if (res)
+        return Py_BuildValue("O", Py_True);
+    else
+        return Py_BuildValue("O", Py_False);
+}
+
+PyObject *dap_hash_fast_compare_py(PyObject *self, PyObject *args){
+    PyObject *hash1;
+    PyObject *hash2;
+    if (!PyArg_ParseTuple(args, "O|O", &hash1, &hash2))
+        return NULL;
+    bool res = dap_hash_fast_compare(((PyDapChainHashFastObject*)hash1)->hash_fast, ((PyDapChainHashFastObject*)hash2)->hash_fast);
+    if (res)
+        return Py_BuildValue("O", Py_True);
+    else
+        return Py_BuildValue("O", Py_False);
+}
+
+PyObject *dap_hash_fast_is_blank_py(PyObject *self, PyObject *args){
+    bool res = dap_hash_fast_is_blank(((PyDapChainHashFastObject*)self)->hash_fast);
+    if (res)
+        return Py_BuildValue("O", Py_True);
+    else
+        return Py_BuildValue("O", Py_False);
+}
+
+PyObject *dap_chain_hash_fast_to_str_py(PyObject *self, PyObject *args){
+    char *str;
+    size_t str_max;
+    if (!PyArg_ParseTuple(args, "s|n", &str, &str_max))
+        return NULL;
+    int res = dap_chain_hash_fast_to_str(((PyDapChainHashFastObject*)self)->hash_fast, str, str_max);
+    return Py_BuildValue("sn", &str, &str_max);
+}
+
+PyObject *dap_chain_hash_fast_to_str_new_py(PyObject *self, PyObject *args){
+    char *res = dap_chain_hash_fast_to_str_new(((PyDapChainHashFastObject*)self)->hash_fast);
+    return Py_BuildValue("s", res);
+}