diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index fb9ddfb1e..f374dbddc 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -171,6 +171,7 @@ include_directories(AFTER
${CMAKE_CURRENT_SOURCE_DIR}/external/dtrace/head
${CMAKE_CURRENT_SOURCE_DIR}/ScriptingBridge/include
${CMAKE_CURRENT_SOURCE_DIR}/lkm/include
+ ${CMAKE_CURRENT_SOURCE_DIR}/libDiagnosticMessagesClient/include
)
# It must be done in this scope
@@ -331,6 +332,7 @@ add_subdirectory(external/gdb)
add_subdirectory(external/Heimdal)
add_subdirectory(PlistBuddy)
add_subdirectory(ScriptingBridge)
+add_subdirectory(libDiagnosticMessagesClient)
# /Applications
#add_subdirectory(external/TextEdit)
diff --git a/src/libDiagnosticMessagesClient/CMakeLists.txt b/src/libDiagnosticMessagesClient/CMakeLists.txt
new file mode 100644
index 000000000..49fe658a6
--- /dev/null
+++ b/src/libDiagnosticMessagesClient/CMakeLists.txt
@@ -0,0 +1,10 @@
+project(libDiagnosticMessagesClient)
+
+set(DYLIB_INSTALL_NAME "/usr/lib/libDiagnosticMessagesClient.dylib")
+add_darling_library(DiagnosticMessagesClient SHARED
+ src/functions.c
+)
+target_link_libraries(DiagnosticMessagesClient system)
+make_fat(DiagnosticMessagesClient)
+
+install(TARGETS DiagnosticMessagesClient DESTINATION libexec/darling/usr/lib)
diff --git a/src/libDiagnosticMessagesClient/include/DiagnosticMessagesClient.h b/src/libDiagnosticMessagesClient/include/DiagnosticMessagesClient.h
new file mode 100755
index 000000000..b474b787f
--- /dev/null
+++ b/src/libDiagnosticMessagesClient/include/DiagnosticMessagesClient.h
@@ -0,0 +1,31 @@
+/*
+This file is part of Darling.
+
+Copyright (C) 2017 Lubos Dolezel
+
+Darling is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Darling is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Darling. If not, see .
+*/
+
+void* msgtracer_domain_free(void);
+void* msgtracer_domain_new(void);
+void* msgtracer_log(void);
+void* msgtracer_log_with_keys(void);
+void* msgtracer_log_with_keys_skip_nulls(void);
+void* msgtracer_msg_free(void);
+void* msgtracer_msg_new(void);
+void* msgtracer_set(void);
+void* msgtracer_uuid_create(void);
+void* msgtracer_vlog(void);
+void* msgtracer_vlog_with_keys(void);
+void* msgtracer_vlog_with_keys_skip_nulls(void);
diff --git a/src/libDiagnosticMessagesClient/src/functions.c b/src/libDiagnosticMessagesClient/src/functions.c
new file mode 100755
index 000000000..162caa37e
--- /dev/null
+++ b/src/libDiagnosticMessagesClient/src/functions.c
@@ -0,0 +1,37 @@
+/*
+This file is part of Darling.
+
+Copyright (C) 2017 Lubos Dolezel
+
+Darling is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Darling is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Darling. If not, see .
+*/
+
+
+#include
+static int verbose = 0;
+__attribute__((constructor)) static void initme(void) {
+ verbose = getenv("STUB_VERBOSE") != NULL;
+}
+void* msgtracer_domain_free(void) { if (verbose) puts("STUB: msgtracer_domain_free called"); return NULL; }
+void* msgtracer_domain_new(void) { if (verbose) puts("STUB: msgtracer_domain_new called"); return NULL; }
+void* msgtracer_log(void) { if (verbose) puts("STUB: msgtracer_log called"); return NULL; }
+void* msgtracer_log_with_keys(void) { if (verbose) puts("STUB: msgtracer_log_with_keys called"); return NULL; }
+void* msgtracer_log_with_keys_skip_nulls(void) { if (verbose) puts("STUB: msgtracer_log_with_keys_skip_nulls called"); return NULL; }
+void* msgtracer_msg_free(void) { if (verbose) puts("STUB: msgtracer_msg_free called"); return NULL; }
+void* msgtracer_msg_new(void) { if (verbose) puts("STUB: msgtracer_msg_new called"); return NULL; }
+void* msgtracer_set(void) { if (verbose) puts("STUB: msgtracer_set called"); return NULL; }
+void* msgtracer_uuid_create(void) { if (verbose) puts("STUB: msgtracer_uuid_create called"); return NULL; }
+void* msgtracer_vlog(void) { if (verbose) puts("STUB: msgtracer_vlog called"); return NULL; }
+void* msgtracer_vlog_with_keys(void) { if (verbose) puts("STUB: msgtracer_vlog_with_keys called"); return NULL; }
+void* msgtracer_vlog_with_keys_skip_nulls(void) { if (verbose) puts("STUB: msgtracer_vlog_with_keys_skip_nulls called"); return NULL; }