diff --git a/common/cpp/include/asapo/common/common_c.h b/common/cpp/include/asapo/common/common_c.h
index 932e9c030fa2415a3e76ed9ccf8115d6c279c17e..8755312a2303ce993e694bd48dae4b1c0f80415c 100644
--- a/common/cpp/include/asapo/common/common_c.h
+++ b/common/cpp/include/asapo/common/common_c.h
@@ -1,7 +1,10 @@
 #ifndef __COMMON_C_H__
 #define __COMMON_C_H__
+#include <stddef.h>
+#include <stdint.h>
+#include <time.h>
 
-
+const unsigned AsapoHandleSize = 24;
 typedef int AsapoBool;
 #ifndef __COMMON_C_INTERFACE_IMPLEMENTATION__
 typedef void* AsapoSourceCredentialsHandle;
@@ -12,6 +15,12 @@ typedef void* AsapoStreamInfosHandle;
 typedef void* AsapoMessageDataHandle;
 #endif
 
+//! c version of asapo::SourceType
+enum AsapoSourceType {
+    kProcessed,
+    kRaw
+};
+
 
 void asapo_free_handle(void** handle);
 void* asapo_new_handle();
diff --git a/common/cpp/include/asapo/common/internal/asapo_common_c_glue.h b/common/cpp/include/asapo/common/internal/asapo_common_c_glue.h
index d1a85106f16802da239b7202e7aeaf7431981f23..9545dc7532347e79480ecb1d2570bc52931b1a8f 100644
--- a/common/cpp/include/asapo/common/internal/asapo_common_c_glue.h
+++ b/common/cpp/include/asapo/common/internal/asapo_common_c_glue.h
@@ -111,5 +111,6 @@ constexpr bool operator==(const u& lhs, const t& rhs) {
 }
 
 
-
+void time_point_to_time_spec(std::chrono::system_clock::time_point tp,
+                             struct timespec* stamp);
 #endif
diff --git a/common/cpp/src/common/CMakeLists.txt b/common/cpp/src/common/CMakeLists.txt
index 5a22d46dc262c06116f083de5cd4a337d0c23e10..34ca5ead93ad7b75700f0254bf8fc0949f62e840 100644
--- a/common/cpp/src/common/CMakeLists.txt
+++ b/common/cpp/src/common/CMakeLists.txt
@@ -1,7 +1,11 @@
 set(TARGET_NAME common)
 
+set(SOURCE_FILES common_c_glue.cpp)
+
 set(TEST_SOURCE_FILES ../../unittests/common/test_error.cpp)
 
+add_library(${TARGET_NAME} STATIC ${SOURCE_FILES})
+
 set(TEST_LIBRARIES "${TARGET_NAME};system_io")
-include_directories(${ASAPO_CXX_COMMON_INCLUDE_DIR})
+include_directories(${ASAPO_CXX_COMMON_INCLUDE_DIR} ../../include)
 add_plain_unit_test(${TARGET_NAME} "${TEST_SOURCE_FILES}" "${TEST_LIBRARIES}")
diff --git a/common/cpp/src/common/common_c_glue.cpp b/common/cpp/src/common/common_c_glue.cpp
index f1903f70cbc996e84988ec776017ee0aec5a5955..ce48fed6c8749de99aa19ce7d33558694bb4e91a 100644
--- a/common/cpp/src/common/common_c_glue.cpp
+++ b/common/cpp/src/common/common_c_glue.cpp
@@ -1,9 +1,9 @@
 #define __COMMON_C_INTERFACE_IMPLEMENTATION__
-#include "asapo/asapo_common_c_glue.h
-
+#include "asapo/common/internal/asapo_common_c_glue.h"
+#include <algorithm>
 
 int process_error(AsapoErrorHandle* error, asapo::Error err,
-                  const asapo::ErrorTemplateInterface* p_exclude_err_template = nullptr) {
+                  const asapo::ErrorTemplateInterface* p_exclude_err_template) {
     int retval = (err == nullptr || (p_exclude_err_template != nullptr && err == *p_exclude_err_template)) ? 0 : -1;
     if (error == nullptr) {
         return retval;
@@ -17,7 +17,7 @@ int process_error(AsapoErrorHandle* error, asapo::Error err,
 }
 
 AsapoHandle* handle_or_null(AsapoHandle* handle, AsapoErrorHandle* error, asapo::Error err,
-                            const asapo::ErrorTemplateInterface* p_exclude_err_template = nullptr) {
+                            const asapo::ErrorTemplateInterface* p_exclude_err_template) {
     if (process_error(error, std::move(err), p_exclude_err_template) < 0) {
         if (handle != nullptr) {
             delete handle;
@@ -28,9 +28,23 @@ AsapoHandle* handle_or_null(AsapoHandle* handle, AsapoErrorHandle* error, asapo:
     }
 }
 
+void time_point_to_time_spec(std::chrono::system_clock::time_point tp,
+                             struct timespec* stamp) {
+    stamp->tv_sec = std::chrono::duration_cast<std::chrono::seconds>(tp.time_since_epoch()).count();
+    stamp->tv_nsec = std::chrono::duration_cast<std::chrono::nanoseconds>(tp.time_since_epoch()).count() % 1000000000;
+}
+
 
 
 extern "C" {
+#include "asapo/common/common_c.h"
+    static_assert(kProcessed == asapo::SourceType::kProcessed&&
+                  kRaw == asapo::SourceType::kRaw,
+                  "incompatible bit reps between c++ and c for asapo::SourceType");
+
+    static_assert(AsapoHandleSize == sizeof(AsapoHandlerHolder<int>),
+                  "AsapoHandleSize is not correct");
+
 
     AsapoStringHandle asapo_string_create(const char* str) {
         return AsapoStringHandle(new std::string(str));
@@ -60,8 +74,9 @@ extern "C" {
 /// \param[in] maxSize max size of buf in bytes
     void asapo_error_explain(const AsapoErrorHandle error, char* buf, size_t maxSize) {
         if (error->handle) {
-            strncpy(buf, error->handle->Explain().c_str(), maxSize - 1);
-            buf[maxSize] = '\0';
+            const auto& msg = error->handle->Explain();
+            std::copy_n(msg.begin(), std::max(msg.size(), maxSize), buf);
+            buf[std::max(maxSize - 1, msg.size())] = '\0';
         } else {
             static std::string msg("no error");
             std::copy_n(msg.begin(), std::max(msg.size(), maxSize), buf);
diff --git a/consumer/api/c/include/asapo/consumer_c.h b/consumer/api/c/include/asapo/consumer_c.h
index d6ef254ced8362e836f6bec48dfa2d59efb7ec09..069a4d7b902eee30168173094ffac0c16f189dfb 100644
--- a/consumer/api/c/include/asapo/consumer_c.h
+++ b/consumer/api/c/include/asapo/consumer_c.h
@@ -1,8 +1,8 @@
 #ifndef __CONSUMER_C_H__
 #define __CONSUMER_C_H__
 
+#include <asapo/common/common_c.h>
 #ifndef __CONSUMER_C_INTERFACE_IMPLEMENTATION__
-#include <asapo/common_c.h>
 typedef void* AsapoConsumerHandle;
 typedef void* AsapoMessageMetaHandle;
 typedef void* AsapoMessageMetasHandle;
@@ -35,11 +35,6 @@ enum AsapoStreamFilter {
     kFinishedStreams,
     kUnfinishedStreams
 };
-//! c version of asapo::SourceType
-enum AsapoSourceType {
-    kProcessed,
-    kRaw
-};
 //! c version of asapo::NetworkConnectionType
 enum AsapoNetworkConnectionType {
     kUndefined,
diff --git a/consumer/api/cpp/src/consumer_c_glue.cpp b/consumer/api/cpp/src/consumer_c_glue.cpp
index a60cbbb7e8b0e2efe76a60a5d824837803f459ff..444a72b96a6cc7ec2dea2c00263e9751cee7c663 100644
--- a/consumer/api/cpp/src/consumer_c_glue.cpp
+++ b/consumer/api/cpp/src/consumer_c_glue.cpp
@@ -86,20 +86,11 @@ extern "C" {
                   kFinishedStreams == asapo::StreamFilter::kFinishedStreams&&
                   kUnfinishedStreams == asapo::StreamFilter::kUnfinishedStreams,
                   "incompatible bit reps between c++ and c for asapo::StreamFilter");
-    static_assert(kProcessed == asapo::SourceType::kProcessed&&
-                  kRaw == asapo::SourceType::kRaw,
-                  "incompatible bit reps between c++ and c for asapo::SourceType");
     static_assert(kUndefined == asapo::NetworkConnectionType::kUndefined&&
                   kAsapoTcp == asapo::NetworkConnectionType::kAsapoTcp&&
                   kFabric == asapo::NetworkConnectionType::kFabric,
                   "incompatible bit reps between c++ and c for asapo::NetworkConnectionType");
 
-    static void time_point_to_time_spec(std::chrono::system_clock::time_point tp,
-                                        struct timespec* stamp) {
-        stamp->tv_sec = std::chrono::duration_cast<std::chrono::seconds>(tp.time_since_epoch()).count();
-        stamp->tv_nsec = std::chrono::duration_cast<std::chrono::nanoseconds>(tp.time_since_epoch()).count() % 1000000000;
-    }
-
     AsapoBool asapo_is_error(AsapoErrorHandle err) {
         return err != nullptr && err->handle != nullptr;
     }
diff --git a/examples/consumer/simple-consumer-c/consume.c b/examples/consumer/simple-consumer-c/consume.c
index f084363d1590fb0577bcb6abf1a37e9c41c20da4..ea79dad81e91c704aad0aebd55bf4def0ea4ffaf 100644
--- a/examples/consumer/simple-consumer-c/consume.c
+++ b/examples/consumer/simple-consumer-c/consume.c
@@ -41,7 +41,7 @@ int main(int argc, char* argv[]) {
     asapo_consumer_get_next(consumer, group_id, &mm, &data, "default",&err);
     exit_if_error("Cannot get next record", err);
 
-    printf("id: %llu\n", asapo_message_meta_get_id(mm));
+    printf("id: %lu\n", asapo_message_meta_get_id(mm));
     printf("file name: %s\n", asapo_message_meta_get_name(mm));
     printf("file content: %s\n", asapo_message_data_get_as_chars(data));
 
@@ -51,4 +51,4 @@ int main(int argc, char* argv[]) {
     asapo_free_handle(&group_id);
 
     return EXIT_SUCCESS;
-}
\ No newline at end of file
+}