incremental
diff --git a/g3log/logcapture.cpp b/g3log/logcapture.cpp
new file mode 100644
index 0000000..c5dc433
--- /dev/null
+++ b/g3log/logcapture.cpp
@@ -0,0 +1,86 @@
+/** ==========================================================================
+ * 2013 by KjellKod.cc. This is PUBLIC DOMAIN to use at your own risk and comes
+ * with no warranties. This code is yours to share, use and modify with no
+ * strings attached and no restrictions or obligations.
+ *
+ * For more information see g3log/LICENSE or refer refer to http://unlicense.org
+ * ============================================================================*/
+
+#include "g3log/logcapture.hpp"
+#include "g3log/crashhandler.hpp"
+
+// For Windows we need force a thread_local install per thread of three
+// signals that must have a signal handler instealled per thread-basis
+// It is really a royal pain. Seriously Microsoft? Seriously?
+#if (defined(WIN32) || defined(_WIN32) || defined(__WIN32__))
+#define SIGNAL_HANDLER_VERIFY() g3::installSignalHandlerForThread()
+#else
+// Does nothing  --- enforces that semicolon must be written
+#define SIGNAL_HANDLER_VERIFY() do {} while(0)
+#endif
+
+
+
+/** logCapture is a simple struct for capturing log/fatal entries. At destruction the
+* captured message is forwarded to background worker.
+* As a safety precaution: No memory allocated here will be moved into the background
+* worker in case of dynamic loaded library reasons instead the arguments are copied
+* inside of g3log.cpp::saveMessage*/
+LogCapture::~LogCapture() {
+   using namespace g3::internal;
+   SIGNAL_HANDLER_VERIFY();
+   saveMessage(_stream.str().c_str(), _file, _line, _function, _level, _expression, _fatal_signal, _stack_trace.c_str());
+}
+
+
+/// Called from crash handler when a fatal signal has occurred (SIGSEGV etc)
+LogCapture::LogCapture(const LEVELS &level, g3::SignalType fatal_signal, const char *dump) : LogCapture("", 0, "", level, "", fatal_signal, dump) {
+}
+
+/**
+ * @file, line, function are given in g3log.hpp from macros
+ * @level INFO/DEBUG/WARNING/FATAL
+ * @expression for CHECK calls
+ * @fatal_signal for failed CHECK:SIGABRT or fatal signal caught in the signal handler
+ */
+LogCapture::LogCapture(const char *file, const int line, const char *function, const LEVELS &level,
+                       const char *expression, g3::SignalType fatal_signal, const char *dump)
+   : _file(file), _line(line), _function(function), _level(level), _expression(expression), _fatal_signal(fatal_signal) {
+
+   if (g3::internal::wasFatal(level)) {
+      _stack_trace = {"\n*******\tSTACKDUMP *******\n"};
+      _stack_trace.append(g3::internal::stackdump(dump));
+   }
+}
+
+
+
+/**
+* capturef, used for "printf" like API in CHECKF, LOGF, LOGF_IF
+* See also for the attribute formatting ref:  http://www.codemaestro.com/reviews/18
+*/
+void LogCapture::capturef(const char *printf_like_message, ...) {
+   static const int kMaxMessageSize = 2048;
+   static const std::string kTruncatedWarningText = "[...truncated...]";
+   char finished_message[kMaxMessageSize];
+   va_list arglist;
+   va_start(arglist, printf_like_message);
+
+#if (defined(WIN32) || defined(_WIN32) || defined(__WIN32__) && !defined(__GNUC__))
+   const int nbrcharacters = vsnprintf_s(finished_message, _countof(finished_message), _TRUNCATE, printf_like_message, arglist);
+#else
+   const int nbrcharacters = vsnprintf(finished_message, sizeof (finished_message), printf_like_message, arglist);
+#endif
+   va_end(arglist);
+
+   if (nbrcharacters <= 0) {
+      stream() << "\n\tERROR LOG MSG NOTIFICATION: Failure to parse successfully the message";
+      stream() << '"' << printf_like_message << '"' << std::endl;
+   } else if (nbrcharacters > kMaxMessageSize) {
+      stream() << finished_message << kTruncatedWarningText;
+   } else {
+      stream() << finished_message;
+   }
+}
+
+