diff --git a/src/debug.cpp b/src/debug.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..d3faae6f2ca6021613d95a2aa5a0bb8c6a4f42ea
--- /dev/null
+++ b/src/debug.cpp
@@ -0,0 +1,21 @@
+extern "C"
+{
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+}
+#include "debug.h"
+
+void log_message(int level, const char *fmt, ...)
+{
+	va_list args;
+
+	/** TODO: properly implement debug levels
+	 * if (iop_debug < level)
+	 *	return;
+	 */
+
+	va_start(args, fmt);
+	vfprintf(stderr, fmt, args);
+	va_end(args);
+}
diff --git a/src/debug.h b/src/debug.h
new file mode 100644
index 0000000000000000000000000000000000000000..dc1e2abfb662429b10f3370d09ff8ee449a7071f
--- /dev/null
+++ b/src/debug.h
@@ -0,0 +1,19 @@
+#ifndef DEBUG_H
+#define DEBUG_H
+
+#ifdef JSON_VALIDATOR_DEBUG
+void log_message(int level, const char *fmt, ...);
+
+#define err(...)	log_message(0, __VA_ARGS__)
+#define warn(...)	log_message(1, __VA_ARGS__)
+#define info(...)	log_message(2, __VA_ARGS__)
+#define dbg(...)	log_message(3, __VA_ARGS__)
+
+#else
+#define err(...)
+#define warn(...)
+#define info(...)
+#define dbg(...)
+#endif
+
+#endif /* DEBUG_H */