diff --git a/include/boost_mpi_extensions/mpi_detach.hpp b/include/boost_mpi_extensions/mpi_detach.hpp
index b7118bb291f1d5edf0e275b4ce9bbca6627883aa..ec99cf4734d382cad4a6315fc3bf70b73a282a1a 100644
--- a/include/boost_mpi_extensions/mpi_detach.hpp
+++ b/include/boost_mpi_extensions/mpi_detach.hpp
@@ -184,12 +184,8 @@ struct state
 inline std::optional<state> global_state; // Note: External-linkage optional used as a lazy-initialized stack variable. Must be reset prior to MPI_Finalize.
 }
 
-typedef void MPI_Detach_callback         (void*);
-typedef void MPI_Detach_callback_status  (void*,               MPI_Status*);
-typedef void MPI_Detach_callback_statuses(void*, std::int32_t, MPI_Status*);
-
 // Note: If the test does not succeed immediately, takes the ownership of the request and invalidates it.
-inline std::int32_t MPI_Detach            (                    MPI_Request* request , MPI_Detach_callback*          callback, void*  data)
+inline std::int32_t MPI_Detach            (                    MPI_Request* request , std::function<void(void*)>                            callback, void*  data)
 {
   if (!detail::global_state) detail::global_state.emplace();
 
@@ -208,8 +204,8 @@ inline std::int32_t MPI_Detach            (                    MPI_Request* requ
 
   return MPI_SUCCESS;
 }
-// Note: If the test does not succeed immediately, takes the ownership of the request and invalidates it.
-inline std::int32_t MPI_Detach_status     (                    MPI_Request* request , MPI_Detach_callback_status*   callback, void*  data)
+// Note: If the test does not succeed immediately, takes the ownership of the request and invalidates it.                                   
+inline std::int32_t MPI_Detach_status     (                    MPI_Request* request , std::function<void(void*,               MPI_Status*)> callback, void*  data)
 {
   if (!detail::global_state) detail::global_state.emplace();
 
@@ -229,8 +225,8 @@ inline std::int32_t MPI_Detach_status     (                    MPI_Request* requ
 
   return MPI_SUCCESS;
 }
-// Note: If the test does not succeed immediately, takes the ownership of the requests and invalidates them.
-inline std::int32_t MPI_Detach_each       (std::int32_t count, MPI_Request* requests, MPI_Detach_callback*          callback, void** data)
+// Note: If the test does not succeed immediately, takes the ownership of the requests and invalidates them.                                
+inline std::int32_t MPI_Detach_each       (std::int32_t count, MPI_Request* requests, std::function<void(void*)>                            callback, void** data)
 {
   if (!detail::global_state) detail::global_state.emplace();
 
@@ -252,8 +248,8 @@ inline std::int32_t MPI_Detach_each       (std::int32_t count, MPI_Request* requ
 
   return MPI_SUCCESS;
 }
-// Note: If the test does not succeed immediately, takes the ownership of the requests and invalidates them.
-inline std::int32_t MPI_Detach_each_status(std::int32_t count, MPI_Request* requests, MPI_Detach_callback_status*   callback, void** data)
+// Note: If the test does not succeed immediately, takes the ownership of the requests and invalidates them.                                
+inline std::int32_t MPI_Detach_each_status(std::int32_t count, MPI_Request* requests, std::function<void(void*,               MPI_Status*)> callback, void** data)
 {
   if (!detail::global_state) detail::global_state.emplace();
 
@@ -276,8 +272,8 @@ inline std::int32_t MPI_Detach_each_status(std::int32_t count, MPI_Request* requ
 
   return MPI_SUCCESS;
 }
-// Note: If the test does not succeed immediately, takes the ownership of the requests and invalidates them.
-inline std::int32_t MPI_Detach_all        (std::int32_t count, MPI_Request* requests, MPI_Detach_callback*          callback, void*  data)
+// Note: If the test does not succeed immediately, takes the ownership of the requests and invalidates them.                                
+inline std::int32_t MPI_Detach_all        (std::int32_t count, MPI_Request* requests, std::function<void(void*)>                            callback, void*  data)
 {
   if (!detail::global_state) detail::global_state.emplace();
 
@@ -297,8 +293,8 @@ inline std::int32_t MPI_Detach_all        (std::int32_t count, MPI_Request* requ
 
   return MPI_SUCCESS;
 }
-// Note: If the test does not succeed immediately, takes the ownership of the requests and invalidates them.
-inline std::int32_t MPI_Detach_all_status (std::int32_t count, MPI_Request* requests, MPI_Detach_callback_statuses* callback, void*  data)
+// Note: If the test does not succeed immediately, takes the ownership of the requests and invalidates them.                                
+inline std::int32_t MPI_Detach_all_status (std::int32_t count, MPI_Request* requests, std::function<void(void*, std::int32_t, MPI_Status*)> callback, void*  data)
 {
   if (!detail::global_state) detail::global_state.emplace();