diff --git a/g3log/crashhandler_unix.cpp b/g3log/crashhandler_unix.cpp
new file mode 100644
index 0000000..3e1b7fe
--- /dev/null
+++ b/g3log/crashhandler_unix.cpp
@@ -0,0 +1,274 @@
+/** ==========================================================================
+ * 2011 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/crashhandler.hpp"
+#include "g3log/logmessage.hpp"
+#include "g3log/logcapture.hpp"
+#include "g3log/loglevels.hpp"
+
+#if (defined(WIN32) || defined(_WIN32) || defined(__WIN32__) && !defined(__GNUC__))
+#error "crashhandler_unix.cpp used but it's a windows system"
+#endif
+
+
+#include <csignal>
+#include <cstring>
+#include <unistd.h>
+#include <execinfo.h>
+#include <cxxabi.h>
+#include <cstdlib>
+#include <sstream>
+#include <iostream>
+#include <thread>
+#include <atomic>
+#include <map>
+#include <mutex>
+
+// Linux/Clang, OSX/Clang, OSX/gcc
+#if (defined(__clang__) || defined(__APPLE__))
+#include <sys/ucontext.h>
+#else
+#include <ucontext.h>
+#endif
+
+
+namespace {
+
+   const std::map<int, std::string> kSignals = {
+      {SIGABRT, "SIGABRT"},
+      {SIGFPE, "SIGFPE"},
+      {SIGILL, "SIGILL"},
+      {SIGSEGV, "SIGSEGV"},
+      {SIGTERM, "SIGTERM"},
+   };
+
+   std::map<int, std::string> gSignals = kSignals;
+
+
+   bool shouldDoExit() {
+      static std::atomic<uint64_t> firstExit{0};
+      auto const count = firstExit.fetch_add(1, std::memory_order_relaxed);
+      return (0 == count);
+   }
+
+   void restoreSignalHandler(int signal_number) {
+#if !(defined(DISABLE_FATAL_SIGNALHANDLING))
+      struct sigaction action;
+      memset(&action, 0, sizeof (action)); //
+      sigemptyset(&action.sa_mask);
+      action.sa_handler = SIG_DFL; // take default action for the signal
+      sigaction(signal_number, &action, NULL);
+#endif
+   }
+
+
+   // Dump of stack,. then exit through g3log background worker
+   // ALL thanks to this thread at StackOverflow. Pretty much borrowed from:
+   // Ref: http://stackoverflow.com/questions/77005/how-to-generate-a-stacktrace-when-my-gcc-c-app-crashes
+   void signalHandler(int signal_number, siginfo_t* info, void* unused_context) {
+
+      // Only one signal will be allowed past this point
+      if (false == shouldDoExit()) {
+         while (true) {
+            std::this_thread::sleep_for(std::chrono::seconds(1));
+         }
+      }
+
+      using namespace g3::internal;
+      {
+         const auto dump = stackdump();
+         std::ostringstream fatal_stream;
+         const auto fatal_reason = exitReasonName(g3::internal::FATAL_SIGNAL, signal_number);
+         fatal_stream << "Received fatal signal: " << fatal_reason;
+         fatal_stream << "(" << signal_number << ")\tPID: " << getpid() << std::endl;
+         fatal_stream << "\n***** SIGNAL " << fatal_reason << "(" << signal_number << ")" << std::endl;
+         LogCapture trigger(FATAL_SIGNAL, static_cast<g3::SignalType>(signal_number), dump.c_str());
+         trigger.stream() << fatal_stream.str();
+      } // message sent to g3LogWorker
+      // wait to die
+   }
+
+
+
+   //
+   // Installs FATAL signal handler that is enough to handle most fatal events
+   //  on *NIX systems
+   void installSignalHandler() {
+#if !(defined(DISABLE_FATAL_SIGNALHANDLING))
+      struct sigaction action;
+      memset(&action, 0, sizeof (action));
+      sigemptyset(&action.sa_mask);
+      action.sa_sigaction = &signalHandler; // callback to crashHandler for fatal signals
+      // sigaction to use sa_sigaction file. ref: http://www.linuxprogrammingblog.com/code-examples/sigaction
+      action.sa_flags = SA_SIGINFO;
+
+      // do it verbose style - install all signal actions
+      for (const auto& sig_pair : gSignals) {
+         if (sigaction(sig_pair.first, &action, nullptr) < 0) {
+            const std::string error = "sigaction - " + sig_pair.second;
+            perror(error.c_str());
+         }
+      }
+#endif
+   }
+
+
+
+} // end anonymous namespace
+
+
+
+
+
+
+// Redirecting and using signals. In case of fatal signals g3log should log the fatal signal
+// and flush the log queue and then "rethrow" the signal to exit
+namespace g3 {
+   // References:
+   // sigaction : change the default action if a specific signal is received
+   //             http://linux.die.net/man/2/sigaction
+   //             http://publib.boulder.ibm.com/infocenter/aix/v6r1/index.jsp?topic=%2Fcom.ibm.aix.basetechref%2Fdoc%2Fbasetrf2%2Fsigaction.html
+   //
+   // signal: http://linux.die.net/man/7/signal and
+   //         http://msdn.microsoft.com/en-us/library/xdkz3x12%28vs.71%29.asp
+   //
+   // memset +  sigemptyset: Maybe unnecessary to do both but there seems to be some confusion here
+   //          ,plenty of examples when both or either are used
+   //          http://stackoverflow.com/questions/6878546/why-doesnt-parent-process-return-to-the-exact-location-after-handling-signal_number
+   namespace internal {
+
+      bool shouldBlockForFatalHandling() {
+         return true;  // For windows we will after fatal processing change it to false
+      }
+
+
+      /// Generate stackdump. Or in case a stackdump was pre-generated and non-empty just use that one
+      /// i.e. the latter case is only for Windows and test purposes
+      std::string stackdump(const char* rawdump) {
+         if (nullptr != rawdump && !std::string(rawdump).empty()) {
+            return {rawdump};
+         }
+
+         const size_t max_dump_size = 50;
+         void* dump[max_dump_size];
+         size_t size = backtrace(dump, max_dump_size);
+         char** messages = backtrace_symbols(dump, static_cast<int>(size)); // overwrite sigaction with caller's address
+
+         // dump stack: skip first frame, since that is here
+         std::ostringstream oss;
+         for (size_t idx = 1; idx < size && messages != nullptr; ++idx) {
+            char* mangled_name = 0, *offset_begin = 0, *offset_end = 0;
+            // find parantheses and +address offset surrounding mangled name
+            for (char* p = messages[idx]; *p; ++p) {
+               if (*p == '(') {
+                  mangled_name = p;
+               } else if (*p == '+') {
+                  offset_begin = p;
+               } else if (*p == ')') {
+                  offset_end = p;
+                  break;
+               }
+            }
+
+            // if the line could be processed, attempt to demangle the symbol
+            if (mangled_name && offset_begin && offset_end &&
+                  mangled_name < offset_begin) {
+               *mangled_name++ = '\0';
+               *offset_begin++ = '\0';
+               *offset_end++ = '\0';
+
+               int status;
+               char* real_name = abi::__cxa_demangle(mangled_name, 0, 0, &status);
+               // if demangling is successful, output the demangled function name
+               if (status == 0) {
+                  oss << "\n\tstack dump [" << idx << "]  " << messages[idx] << " : " << real_name << "+";
+                  oss << offset_begin << offset_end << std::endl;
+               }// otherwise, output the mangled function name
+               else {
+                  oss << "\tstack dump [" << idx << "]  " << messages[idx] << mangled_name << "+";
+                  oss << offset_begin << offset_end << std::endl;
+               }
+               free(real_name); // mallocated by abi::__cxa_demangle(...)
+            } else {
+               // no demangling done -- just dump the whole line
+               oss << "\tstack dump [" << idx << "]  " << messages[idx] << std::endl;
+            }
+         } // END: for(size_t idx = 1; idx < size && messages != nullptr; ++idx)
+         free(messages);
+         return oss.str();
+      }
+
+
+
+      /// string representation of signal ID
+      std::string exitReasonName(const LEVELS& level, g3::SignalType fatal_id) {
+
+         int signal_number = static_cast<int>(fatal_id);
+         switch (signal_number) {
+            case SIGABRT: return "SIGABRT";
+               break;
+            case SIGFPE: return "SIGFPE";
+               break;
+            case SIGSEGV: return "SIGSEGV";
+               break;
+            case SIGILL: return "SIGILL";
+               break;
+            case SIGTERM: return "SIGTERM";
+               break;
+            default:
+               std::ostringstream oss;
+               oss << "UNKNOWN SIGNAL(" << signal_number << ") for " << level.text;
+               return oss.str();
+         }
+      }
+
+
+
+      // Triggered by g3log->g3LogWorker after receiving a FATAL trigger
+      // which is LOG(FATAL), CHECK(false) or a fatal signal our signalhandler caught.
+      // --- If LOG(FATAL) or CHECK(false) the signal_number will be SIGABRT
+      void exitWithDefaultSignalHandler(const LEVELS& level, g3::SignalType fatal_signal_id) {
+         const int signal_number = static_cast<int>(fatal_signal_id);
+         restoreSignalHandler(signal_number);
+         std::cerr << "\n\n" << __FUNCTION__ << ":" << __LINE__ << ". Exiting due to " << level.text << ", " << signal_number << "   \n\n" << std::flush;
+
+
+         kill(getpid(), signal_number);
+         exit(signal_number);
+
+      }
+   } // end g3::internal
+
+
+   // This will override the default signal handler setup and instead
+   // install a custom set of signals to handle
+   void overrideSetupSignals(const std::map<int, std::string> overrideSignals) {
+      static std::mutex signalLock;
+      std::lock_guard<std::mutex> guard(signalLock);
+      for (const auto& sig : gSignals) {
+         restoreSignalHandler(sig.first);
+      }
+
+      gSignals = overrideSignals;
+      installCrashHandler(); // installs all the signal handling for gSignals
+   }
+
+   // restores the signal handler back to default
+   void restoreSignalHandlerToDefault() {
+      overrideSetupSignals(kSignals);
+   }
+
+
+   // installs the signal handling for whatever signal set that is currently active
+   // If you want to setup your own signal handling then
+   // You should instead call overrideSetupSignals()
+   void installCrashHandler() {
+      installSignalHandler();
+   }
+} // end namespace g3
+
diff --git a/g3log/crashhandler_windows.cpp b/g3log/crashhandler_windows.cpp
new file mode 100644
index 0000000..acaebc6
--- /dev/null
+++ b/g3log/crashhandler_windows.cpp
@@ -0,0 +1,253 @@
+/** ==========================================================================
+ * 2011 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
+ * ============================================================================*/
+
+#if !(defined(WIN32) || defined(_WIN32) || defined(__WIN32__))
+#error "crashhandler_windows.cpp used but not on a windows system"
+#endif
+
+#include <windows.h>
+#include <csignal>
+#include <sstream>
+#include <atomic>
+#include <process.h> // getpid
+#include "g3log/crashhandler.hpp"
+#include "g3log/stacktrace_windows.hpp"
+#include "g3log/logcapture.hpp"
+
+#define getpid _getpid
+
+namespace {
+   std::atomic<bool> gBlockForFatal {true};
+   LPTOP_LEVEL_EXCEPTION_FILTER g_previous_unexpected_exception_handler = nullptr;
+
+#if !(defined(DISABLE_FATAL_SIGNALHANDLING))
+   thread_local bool g_installed_thread_signal_handler = false;
+#endif
+
+#if !(defined(DISABLE_VECTORED_EXCEPTIONHANDLING))
+   void *g_vector_exception_handler = nullptr;
+#endif
+
+
+
+   // Restore back to default fatal event handling
+   void ReverseToOriginalFatalHandling() {
+      SetUnhandledExceptionFilter (g_previous_unexpected_exception_handler);
+
+#if !(defined(DISABLE_VECTORED_EXCEPTIONHANDLING))
+      RemoveVectoredExceptionHandler (g_vector_exception_handler);
+#endif
+
+#if !(defined(DISABLE_FATAL_SIGNALHANDLING))
+      if (SIG_ERR == signal(SIGABRT, SIG_DFL))
+         perror("signal - SIGABRT");
+
+      if (SIG_ERR == signal(SIGFPE, SIG_DFL))
+         perror("signal - SIGABRT");
+
+      if (SIG_ERR == signal(SIGSEGV, SIG_DFL))
+         perror("signal - SIGABRT");
+
+      if (SIG_ERR == signal(SIGILL, SIG_DFL))
+         perror("signal - SIGABRT");
+
+      if (SIG_ERR == signal(SIGTERM, SIG_DFL))
+         perror("signal - SIGABRT");
+#endif
+   }
+
+
+
+   // called for fatal signals SIGABRT, SIGFPE, SIGSEGV, SIGILL, SIGTERM
+   void signalHandler(int signal_number) {
+      using namespace g3::internal;
+      std::string dump = stacktrace::stackdump();
+
+      std::ostringstream fatal_stream;
+      fatal_stream << "\n***** Received fatal signal " << g3::internal::exitReasonName(g3::internal::FATAL_SIGNAL, signal_number);
+      fatal_stream << "(" << signal_number << ")\tPID: " << getpid() << std::endl;
+
+
+      LogCapture trigger(FATAL_SIGNAL, static_cast<g3::SignalType>(signal_number), dump.c_str());
+      trigger.stream() << fatal_stream.str();
+
+      // Trigger debug break point, if we're in debug. This breakpoint CAN cause a slowdown when it happens.
+      // Be patient. The "Debug" dialogue should pop-up eventually if you doing it in Visual Studio.
+      // For fatal signals only, not exceptions.
+      // This is a way to tell the IDE (if in dev mode) that it can stop at this breakpoint
+      // Note that at this time the fatal log event with stack trace is NOT yet flushed to the logger
+      // This call will do nothing unless we're in DEBUG and "DEBUG_BREAK_AT_FATAL_SIGNAL" is enabled
+      // ref: g3log/Options.cmake
+#if (!defined(NDEBUG) && defined(DEBUG_BREAK_AT_FATAL_SIGNAL))
+      __debugbreak();
+#endif
+   } // scope exit - message sent to LogWorker, wait to die...
+
+
+
+   // Unhandled exception catching
+   LONG WINAPI exceptionHandling(EXCEPTION_POINTERS *info, const std::string &handler) {
+      std::string dump = stacktrace::stackdump(info);
+
+      std::ostringstream fatal_stream;
+      const g3::SignalType exception_code = info->ExceptionRecord->ExceptionCode;
+      fatal_stream << "\n***** " << handler << ": Received fatal exception " << g3::internal::exitReasonName(g3::internal::FATAL_EXCEPTION, exception_code);
+      fatal_stream << "\tPID: " << getpid() << std::endl;
+
+      const auto fatal_id = static_cast<g3::SignalType>(exception_code);
+      LogCapture trigger(g3::internal::FATAL_EXCEPTION, fatal_id, dump.c_str());
+      trigger.stream() << fatal_stream.str();
+      // FATAL Exception: It doesn't necessarily stop here we pass on continue search
+      // if no one else will catch that then it's goodbye anyhow.
+      // The RISK here is if someone is cathing this and returning "EXCEPTION_EXECUTE_HANDLER"
+      // but does not shutdown then the software will be running with g3log shutdown.
+      // .... However... this must be seen as a bug from standard handling of fatal exceptions
+      // https://msdn.microsoft.com/en-us/library/6wxdsc38.aspx
+      return EXCEPTION_CONTINUE_SEARCH;
+   }
+
+
+   // Unhandled exception catching
+   LONG WINAPI unexpectedExceptionHandling(EXCEPTION_POINTERS *info) {
+      ReverseToOriginalFatalHandling();
+      return exceptionHandling(info, "Unexpected Exception Handler");
+   }
+
+
+   /// Setup through (Windows API) AddVectoredExceptionHandler
+   /// Ref: http://blogs.msdn.com/b/zhanli/archive/2010/06/25/c-tips-addvectoredexceptionhandler-addvectoredcontinuehandler-and-setunhandledexceptionfilter.aspx
+#if !(defined(DISABLE_VECTORED_EXCEPTIONHANDLING))
+   LONG WINAPI vectorExceptionHandling(PEXCEPTION_POINTERS p) {
+      const g3::SignalType exception_code = p->ExceptionRecord->ExceptionCode;
+      if (false == stacktrace::isKnownException(exception_code)) {
+         // The unknown exception is ignored. Since it is not a Windows
+         // fatal exception generated by the OS we leave the
+         // responsibility to deal with this by the client software.
+         return EXCEPTION_CONTINUE_SEARCH;
+      } else {
+         ReverseToOriginalFatalHandling();
+         return exceptionHandling(p, "Vectored Exception Handler");
+      }
+   }
+#endif
+
+
+
+
+} // end anonymous namespace
+
+
+namespace g3 {
+   namespace internal {
+      // For windows exceptions this might ONCE be set to false, in case of a
+      // windows exceptions and not a signal
+      bool shouldBlockForFatalHandling() {
+         return gBlockForFatal;
+      }
+
+
+      /// Generate stackdump. Or in case a stackdump was pre-generated and
+      /// non-empty just use that one.   i.e. the latter case is only for
+      /// Windows and test purposes
+      std::string stackdump(const char *dump) {
+         if (nullptr != dump && !std::string(dump).empty()) {
+            return {dump};
+         }
+
+         return stacktrace::stackdump();
+      }
+
+
+
+      /// string representation of signal ID or Windows exception id
+      std::string exitReasonName(const LEVELS &level, g3::SignalType fatal_id) {
+         if (level == g3::internal::FATAL_EXCEPTION) {
+            return stacktrace::exceptionIdToText(fatal_id);
+         }
+
+         switch (fatal_id) {
+         case SIGABRT: return "SIGABRT"; break;
+         case SIGFPE: return "SIGFPE"; break;
+         case SIGSEGV: return "SIGSEGV"; break;
+         case SIGILL: return "SIGILL"; break;
+         case SIGTERM: return "SIGTERM"; break;
+         default:
+            std::ostringstream oss;
+            oss << "UNKNOWN SIGNAL(" << fatal_id << ")";
+            return oss.str();
+         }
+      }
+
+
+      // Triggered by g3log::LogWorker after receiving a FATAL trigger
+      // which is LOG(FATAL), CHECK(false) or a fatal signal our signalhandler caught.
+      // --- If LOG(FATAL) or CHECK(false) the signal_number will be SIGABRT
+      void exitWithDefaultSignalHandler(const LEVELS &level, g3::SignalType fatal_signal_id) {
+
+         ReverseToOriginalFatalHandling();
+         // For windows exceptions we want to continue the possibility of
+         // exception handling now when the log and stacktrace are flushed
+         // to sinks. We therefore avoid to kill the preocess here. Instead
+         //  it will be the exceptionHandling functions above that
+         // will let exception handling continue with: EXCEPTION_CONTINUE_SEARCH
+         if (g3::internal::FATAL_EXCEPTION == level) {
+            gBlockForFatal = false;
+            return;
+         }
+
+         // for a sigal however, we exit through that fatal signal
+         const int signal_number = static_cast<int>(fatal_signal_id);
+         raise(signal_number);
+      }
+
+
+
+      void installSignalHandler() {
+         g3::installSignalHandlerForThread();
+      }
+
+
+   } // end g3::internal
+
+
+   ///  SIGFPE, SIGILL, and SIGSEGV handling must be installed per thread
+   /// on Windows. This is automatically done if you do at least one LOG(...) call
+   /// you can also use this function call, per thread so make sure these three
+   /// fatal signals are covered in your thread (even if you don't do a LOG(...) call
+   void installSignalHandlerForThread() {
+#if !(defined(DISABLE_FATAL_SIGNALHANDLING))
+      if (!g_installed_thread_signal_handler) {
+         g_installed_thread_signal_handler = true;
+         if (SIG_ERR == signal(SIGTERM, signalHandler))
+            perror("signal - SIGTERM");
+         if (SIG_ERR == signal(SIGABRT, signalHandler))
+            perror("signal - SIGABRT");
+         if (SIG_ERR == signal(SIGFPE, signalHandler))
+            perror("signal - SIGFPE");
+         if (SIG_ERR == signal(SIGSEGV, signalHandler))
+            perror("signal - SIGSEGV");
+         if (SIG_ERR == signal(SIGILL, signalHandler))
+            perror("signal - SIGILL");
+      }
+#endif
+   }
+
+   void installCrashHandler() {
+      internal::installSignalHandler();
+      g_previous_unexpected_exception_handler = SetUnhandledExceptionFilter(unexpectedExceptionHandling);
+
+#if !(defined(DISABLE_VECTORED_EXCEPTIONHANDLING))
+      // const size_t kFirstExceptionHandler = 1;
+      // kFirstExeptionsHandler is kept here for documentational purposes.
+      // The last exception seems more what we want
+      const size_t kLastExceptionHandler = 0;
+      g_vector_exception_handler = AddVectoredExceptionHandler(kLastExceptionHandler, vectorExceptionHandling);
+#endif
+   }
+
+} // end namespace g3
diff --git a/g3log/filesink.cpp b/g3log/filesink.cpp
new file mode 100644
index 0000000..bfe8d5c
--- /dev/null
+++ b/g3log/filesink.cpp
@@ -0,0 +1,92 @@
+/** ==========================================================================
+ * 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/filesink.hpp"
+#include "filesinkhelper.ipp"
+#include <cassert>
+
+namespace g3 {
+   using namespace internal;
+
+
+   FileSink::FileSink(const std::string &log_prefix, const std::string &log_directory, const std::string& logger_id)
+      : _log_file_with_path(log_directory)
+      , _log_prefix_backup(log_prefix)
+      , _outptr(new std::ofstream)
+   {
+      _log_prefix_backup = prefixSanityFix(log_prefix);
+      if (!isValidFilename(_log_prefix_backup)) {
+         std::cerr << "g3log: forced abort due to illegal log prefix [" << log_prefix << "]" << std::endl;
+         abort();
+      }
+
+      std::string file_name = createLogFileName(_log_prefix_backup, logger_id);
+      _log_file_with_path = pathSanityFix(_log_file_with_path, file_name);
+      _outptr = createLogFile(_log_file_with_path);
+
+      if (!_outptr) {
+         std::cerr << "Cannot write log file to location, attempting current directory" << std::endl;
+         _log_file_with_path = "./" + file_name;
+         _outptr = createLogFile(_log_file_with_path);
+      }
+      assert(_outptr && "cannot open log file at startup");
+      addLogFileHeader();
+   }
+
+
+   FileSink::~FileSink() {
+      std::string exit_msg {"g3log g3FileSink shutdown at: "};
+      exit_msg.append(localtime_formatted(systemtime_now(), internal::time_formatted)).append({"\n"});
+      filestream() << exit_msg << std::flush;
+
+      exit_msg.append({"Log file at: ["}).append(_log_file_with_path).append({"]\n"});
+      std::cerr << exit_msg << std::flush;
+   }
+
+   // The actual log receiving function
+   void FileSink::fileWrite(LogMessageMover message) {
+      std::ofstream &out(filestream());
+      out << message.get().toString() << std::flush;
+   }
+
+   std::string FileSink::changeLogFile(const std::string &directory, const std::string &logger_id) {
+
+      auto now = g3::systemtime_now();
+      auto now_formatted = g3::localtime_formatted(now, {internal::date_formatted + " " + internal::time_formatted});
+
+      std::string file_name = createLogFileName(_log_prefix_backup, logger_id);
+      std::string prospect_log = directory + file_name;
+      std::unique_ptr<std::ofstream> log_stream = createLogFile(prospect_log);
+      if (nullptr == log_stream) {
+         filestream() << "\n" << now_formatted << " Unable to change log file. Illegal filename or busy? Unsuccessful log name was: " << prospect_log;
+         return {}; // no success
+      }
+
+      addLogFileHeader();
+      std::ostringstream ss_change;
+      ss_change << "\n\tChanging log file from : " << _log_file_with_path;
+      ss_change << "\n\tto new location: " << prospect_log << "\n";
+      filestream() << now_formatted << ss_change.str();
+      ss_change.str("");
+
+      std::string old_log = _log_file_with_path;
+      _log_file_with_path = prospect_log;
+      _outptr = std::move(log_stream);
+      ss_change << "\n\tNew log file. The previous log file was at: ";
+      ss_change << old_log;
+      filestream() << now_formatted << ss_change.str();
+      return _log_file_with_path;
+   }
+   std::string FileSink::fileName() {
+      return _log_file_with_path;
+   }
+   void FileSink::addLogFileHeader() {
+      filestream() << header();
+   }
+
+} // g3
diff --git a/g3log/filesinkhelper.ipp b/g3log/filesinkhelper.ipp
new file mode 100644
index 0000000..406e993
--- /dev/null
+++ b/g3log/filesinkhelper.ipp
@@ -0,0 +1,124 @@
+/** ==========================================================================
+ * 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
+ * ============================================================================*/
+
+#pragma once
+
+
+#include <memory>
+#include <string>
+#include <algorithm>
+#include <iostream>
+#include <fstream>
+#include <sstream>
+#include <string>
+
+
+namespace g3 {
+   namespace internal {
+      static const std::string file_name_time_formatted = "%Y%m%d-%H%M%S";
+
+      // check for filename validity -  filename should not be part of PATH
+      bool isValidFilename(const std::string &prefix_filename) {
+         std::string illegal_characters("/,|<>:#$%{}[]\'\"^!?+* ");
+         size_t pos = prefix_filename.find_first_of(illegal_characters, 0);
+         if (pos != std::string::npos) {
+            std::cerr << "Illegal character [" << prefix_filename.at(pos) << "] in logname prefix: " << "[" << prefix_filename << "]" << std::endl;
+            return false;
+         } else if (prefix_filename.empty()) {
+            std::cerr << "Empty filename prefix is not allowed" << std::endl;
+            return false;
+         }
+
+         return true;
+      }
+
+      std::string prefixSanityFix(std::string prefix) {
+         prefix.erase(std::remove_if(prefix.begin(), prefix.end(), ::isspace), prefix.end());
+         prefix.erase(std::remove(prefix.begin(), prefix.end(), '/'), prefix.end());
+         prefix.erase(std::remove(prefix.begin(), prefix.end(), '\\'), prefix.end());
+         prefix.erase(std::remove(prefix.begin(), prefix.end(), '.'), prefix.end());
+         prefix.erase(std::remove(prefix.begin(), prefix.end(), ':'), prefix.end());
+         if (!isValidFilename(prefix)) {
+            return
+            {
+            };
+         }
+         return prefix;
+      }
+
+      std::string pathSanityFix(std::string path, std::string file_name) {
+         // Unify the delimeters,. maybe sketchy solution but it seems to work
+         // on at least win7 + ubuntu. All bets are off for older windows
+         std::replace(path.begin(), path.end(), '\\', '/');
+
+         // clean up in case of multiples
+         auto contains_end = [&](std::string & in) -> bool {
+            size_t size = in.size();
+            if (!size) return false;
+            char end = in[size - 1];
+            return (end == '/' || end == ' ');
+         };
+
+         while (contains_end(path)) {
+            path.erase(path.size() - 1);
+         }
+
+         if (!path.empty()) {
+            path.insert(path.end(), '/');
+         }
+
+         path.insert(path.size(), file_name);
+         return path;
+      }
+
+      std::string header() {
+         std::ostringstream ss_entry;
+         //  Day Month Date Time Year: is written as "%a %b %d %H:%M:%S %Y" and formatted output as : Wed Sep 19 08:28:16 2012
+         ss_entry << "\t\tg3log created log at: " << g3::localtime_formatted(g3::systemtime_now(), "%a %b %d %H:%M:%S %Y") << "\n";
+         ss_entry << "\t\tLOG format: [YYYY/MM/DD hh:mm:ss uuu* LEVEL FILE->FUNCTION:LINE] message";
+         ss_entry << "\t\t(uuu*: microseconds fractions of the seconds value)\n\n";
+         return ss_entry.str();
+      }
+
+      std::string createLogFileName(const std::string &verified_prefix, const std::string &logger_id) {
+         std::stringstream oss_name;
+         oss_name << verified_prefix << ".";
+         if( logger_id != "" ) oss_name << logger_id << ".";
+         oss_name << g3::localtime_formatted(g3::systemtime_now(), file_name_time_formatted);
+         oss_name << ".log";
+         return oss_name.str();
+      }
+
+      bool openLogFile(const std::string &complete_file_with_path, std::ofstream &outstream) {
+         std::ios_base::openmode mode = std::ios_base::out; // for clarity: it's really overkill since it's an ofstream
+         mode |= std::ios_base::trunc;
+         outstream.open(complete_file_with_path, mode);
+         if (!outstream.is_open()) {
+            std::ostringstream ss_error;
+            ss_error << "FILE ERROR:  could not open log file:[" << complete_file_with_path << "]";
+            ss_error << "\n\t\t std::ios_base state = " << outstream.rdstate();
+            std::cerr << ss_error.str().c_str() << std::endl;
+            outstream.close();
+            return false;
+         }
+         return true;
+      }
+
+      std::unique_ptr<std::ofstream> createLogFile(const std::string &file_with_full_path) {
+         std::unique_ptr<std::ofstream> out(new std::ofstream);
+         std::ofstream &stream(*(out.get()));
+         bool success_with_open_file = openLogFile(file_with_full_path, stream);
+         if (false == success_with_open_file) {
+            out.release();
+         }
+         return out;
+      }
+
+
+   }
+}
diff --git a/g3log/g2log.hpp b/g3log/g2log.hpp
new file mode 100644
index 0000000..0c6c932
--- /dev/null
+++ b/g3log/g2log.hpp
@@ -0,0 +1,23 @@
+/** ==========================================================================
+* 2015 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
+* ============================================================================*/
+
+#pragma once
+
+// For convenience:  If you don't want to do a recursive search and replace in your source code
+// for replacing g2log.hpp for g3log/g3log.hpp then you can choose to add this header file to your
+// code. It will get the necessary includes
+//
+//
+// Btw: replacing g2log for g3log include is easy on Linux
+//  find . -name "*.cpp*" -print | xargs sed -i -e 's/\g2log\.hpp/\g3log\/g3log\.hpp/g'
+
+#include <g3log/g3log.hpp>
+#include <g3log/logworker.hpp>
+#include <g3log/loglevels.hpp>
+#include <g3log/filesink.hpp>
+
diff --git a/g3log/g3log.cpp b/g3log/g3log.cpp
new file mode 100644
index 0000000..86a437b
--- /dev/null
+++ b/g3log/g3log.cpp
@@ -0,0 +1,258 @@
+/** ==========================================================================
+ * 2011 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
+ * ============================================================================
+ *
+ * Filename:g3log.cpp  Framework for Logging and Design By Contract
+ * Created: 2011 by Kjell Hedström
+ *
+ * PUBLIC DOMAIN and Not copywrited since it was built on public-domain software and at least in "spirit" influenced
+ * from the following sources
+ * 1. kjellkod.cc ;)
+ * 2. Dr.Dobbs, Petru Marginean:  http://drdobbs.com/article/printableArticle.jhtml?articleId=201804215&dept_url=/cpp/
+ * 3. Dr.Dobbs, Michael Schulze: http://drdobbs.com/article/printableArticle.jhtml?articleId=225700666&dept_url=/cpp/
+ * 4. Google 'glog': http://google-glog.googlecode.com/svn/trunk/doc/glog.html
+ * 5. Various Q&A at StackOverflow
+ * ********************************************* */
+
+#include "g3log/g3log.hpp"
+#include "g3log/std2_make_unique.hpp"
+#include "g3log/logworker.hpp"
+#include "g3log/crashhandler.hpp"
+#include "g3log/logmessage.hpp"
+#include "g3log/loglevels.hpp"
+
+
+#include <mutex>
+#include <memory>
+#include <iostream>
+#include <thread>
+#include <atomic>
+#include <cstdlib>
+#include <sstream>
+
+namespace {
+   std::once_flag g_initialize_flag;
+   g3::LogWorker *g_logger_instance = nullptr; // instantiated and OWNED somewhere else (main)
+   std::mutex g_logging_init_mutex;
+
+   std::unique_ptr<g3::LogMessage> g_first_unintialized_msg = {nullptr};
+   std::once_flag g_set_first_uninitialized_flag;
+   std::once_flag g_save_first_unintialized_flag;
+   const std::function<void(void)> g_pre_fatal_hook_that_does_nothing = [] { /*does nothing */};
+   std::function<void(void)> g_fatal_pre_logging_hook;
+
+
+   std::atomic<size_t> g_fatal_hook_recursive_counter = {0};
+}
+
+
+
+
+
+namespace g3 {
+   // signalhandler and internal clock is only needed to install once
+   // for unit testing purposes the initializeLogging might be called
+   // several times...
+   //                    for all other practical use, it shouldn't!
+
+   void initializeLogging(LogWorker *bgworker) {
+      std::call_once(g_initialize_flag, [] {
+         installCrashHandler();
+      });
+      std::lock_guard<std::mutex> lock(g_logging_init_mutex);
+      if (internal::isLoggingInitialized() || nullptr == bgworker) {
+         std::ostringstream exitMsg;
+         exitMsg << __FILE__ "->" << __FUNCTION__ << ":" << __LINE__ << std::endl;
+         exitMsg << "\tFatal exit due to illegal initialization of g3::LogWorker\n";
+         exitMsg << "\t(due to multiple initializations? : " << std::boolalpha << internal::isLoggingInitialized();
+         exitMsg << ", due to nullptr == bgworker? : " << std::boolalpha << (nullptr == bgworker) << ")";
+         std::cerr << exitMsg.str() << std::endl;
+         std::exit(EXIT_FAILURE);
+      }
+
+      // Save the first uninitialized message, if any
+      std::call_once(g_save_first_unintialized_flag, [&bgworker] {
+         if (g_first_unintialized_msg) {
+            bgworker->save(LogMessagePtr {std::move(g_first_unintialized_msg)});
+         }
+      });
+
+      g_logger_instance = bgworker;
+      // by default the pre fatal logging hook does nothing
+      // if it WOULD do something it would happen in
+      setFatalPreLoggingHook(g_pre_fatal_hook_that_does_nothing);
+      // recurvise crash counter re-set to zero
+      g_fatal_hook_recursive_counter.store(0);
+   }
+
+
+   /**
+   *  default does nothing, @ref ::g_pre_fatal_hook_that_does_nothing
+   *  It will be called just before sending the fatal message, @ref pushFatalmessageToLogger
+   *  It will be reset to do nothing in ::initializeLogging(...)
+   *     so please call this function, if you ever need to, after initializeLogging(...)
+   */
+   void setFatalPreLoggingHook(std::function<void(void)>  pre_fatal_hook) {
+      static std::mutex m;
+      std::lock_guard<std::mutex> lock(m);
+      g_fatal_pre_logging_hook = pre_fatal_hook;
+   }
+
+
+
+
+   // By default this function pointer goes to \ref pushFatalMessageToLogger;
+   std::function<void(FatalMessagePtr) > g_fatal_to_g3logworker_function_ptr = internal::pushFatalMessageToLogger;
+
+   /** REPLACE fatalCallToLogger for fatalCallForUnitTest
+    * This function switches the function pointer so that only
+    * 'unitTest' mock-fatal calls are made.
+    * */
+   void setFatalExitHandler(std::function<void(FatalMessagePtr) > fatal_call) {
+      g_fatal_to_g3logworker_function_ptr = fatal_call;
+   }
+
+
+   namespace internal {
+
+      bool isLoggingInitialized() {
+         return g_logger_instance != nullptr;
+      }
+
+      /**
+       * Shutdown the logging by making the pointer to the background logger to nullptr. The object is not deleted
+       * that is the responsibility of its owner. *
+       */
+      void shutDownLogging() {
+         std::lock_guard<std::mutex> lock(g_logging_init_mutex);
+         g_logger_instance = nullptr;
+
+      }
+
+      /** Same as the Shutdown above but called by the destructor of the LogWorker, thus ensuring that no further
+       *  LOG(...) calls can happen to  a non-existing LogWorker.
+       *  @param active MUST BE the LogWorker initialized for logging. If it is not then this call is just ignored
+       *         and the logging continues to be active.
+       * @return true if the correct worker was given,. and shutDownLogging was called
+       */
+      bool shutDownLoggingForActiveOnly(LogWorker *active) {
+         if (isLoggingInitialized() && nullptr != active && (active != g_logger_instance)) {
+            LOG(WARNING) << "\n\t\tAttempted to shut down logging, but the ID of the Logger is not the one that is active."
+                         << "\n\t\tHaving multiple instances of the g3::LogWorker is likely a BUG"
+                         << "\n\t\tEither way, this call to shutDownLogging was ignored"
+                         << "\n\t\tTry g3::internal::shutDownLogging() instead";
+            return false;
+         }
+         shutDownLogging();
+         return true;
+      }
+
+
+
+
+      /** explicits copy of all input. This is makes it possibly to use g3log across dynamically loaded libraries
+      * i.e. (dlopen + dlsym)  */
+      void saveMessage(const char *entry, const char *file, int line, const char *function, const LEVELS &level,
+                       const char *boolean_expression, int fatal_signal, const char *stack_trace) {
+         LEVELS msgLevel {level};
+         LogMessagePtr message {std2::make_unique<LogMessage>(file, line, function, msgLevel)};
+         message.get()->write().append(entry);
+         message.get()->setExpression(boolean_expression);
+
+
+         if (internal::wasFatal(level)) {
+            auto fatalhook = g_fatal_pre_logging_hook;
+            // In case the fatal_pre logging actually will cause a crash in its turn
+            // let's not do recursive crashing!
+            setFatalPreLoggingHook(g_pre_fatal_hook_that_does_nothing);
+            ++g_fatal_hook_recursive_counter; // thread safe counter
+            // "benign" race here. If two threads crashes, with recursive crashes
+            // then it's possible that the "other" fatal stack trace will be shown
+            // that's OK since it was anyhow the first crash detected
+            static const std::string first_stack_trace = stack_trace;
+            fatalhook();
+            message.get()->write().append(stack_trace);
+
+            if (g_fatal_hook_recursive_counter.load() > 1) {
+               message.get()->write()
+               .append("\n\n\nWARNING\n"
+                       "A recursive crash detected. It is likely the hook set with 'setFatalPreLoggingHook(...)' is responsible\n\n")
+               .append("---First crash stacktrace: ").append(first_stack_trace).append("\n---End of first stacktrace\n");
+            }
+            FatalMessagePtr fatal_message { std2::make_unique<FatalMessage>(*(message._move_only.get()), fatal_signal) };
+            // At destruction, flushes fatal message to g3LogWorker
+            // either we will stay here until the background worker has received the fatal
+            // message, flushed the crash message to the sinks and exits with the same fatal signal
+            //..... OR it's in unit-test mode then we throw a std::runtime_error (and never hit sleep)
+            fatalCall(fatal_message);
+         } else {
+            pushMessageToLogger(message);
+         }
+      }
+
+      /**
+       * save the message to the logger. In case of called before the logger is instantiated
+       * the first message will be saved. Any following subsequent unitnialized log calls
+       * will be ignored.
+       *
+       * The first initialized log entry will also save the first uninitialized log message, if any
+       * @param log_entry to save to logger
+       */
+      void pushMessageToLogger(LogMessagePtr incoming) { // todo rename to Push SavedMessage To Worker
+         // Uninitialized messages are ignored but does not CHECK/crash the logger
+         if (!internal::isLoggingInitialized()) {
+            std::call_once(g_set_first_uninitialized_flag, [&] {
+               g_first_unintialized_msg = incoming.release();
+               std::string err = {"LOGGER NOT INITIALIZED:\n\t\t"};
+               err.append(g_first_unintialized_msg->message());
+               std::string &str = g_first_unintialized_msg->write();
+               str.clear();
+               str.append(err); // replace content
+               std::cerr << str << std::endl;
+            });
+            return;
+         }
+
+         // logger is initialized
+         g_logger_instance->save(incoming);
+      }
+
+      /** Fatal call saved to logger. This will trigger SIGABRT or other fatal signal
+       * to exit the program. After saving the fatal message the calling thread
+       * will sleep forever (i.e. until the background thread catches up, saves the fatal
+       * message and kills the software with the fatal signal.
+       */
+      void pushFatalMessageToLogger(FatalMessagePtr message) {
+         if (!isLoggingInitialized()) {
+            std::ostringstream error;
+            error << "FATAL CALL but logger is NOT initialized\n"
+                  << "CAUSE: " << message.get()->reason()
+                  << "\nMessage: \n" << message.get()->toString() << std::flush;
+            std::cerr << error.str() << std::flush;
+            internal::exitWithDefaultSignalHandler(message.get()->_level, message.get()->_signal_id);
+         }
+         g_logger_instance->fatal(message);
+         while (shouldBlockForFatalHandling()) {
+            std::this_thread::sleep_for(std::chrono::seconds(1));
+         }
+      }
+
+      /** The default, initial, handling to send a 'fatal' event to g3logworker
+       *  the caller will stay here, eternally, until the software is aborted
+       * ... in the case of unit testing it is the given "Mock" fatalCall that will
+       * define the behaviour.
+       */
+      void fatalCall(FatalMessagePtr message) {
+         g_fatal_to_g3logworker_function_ptr(FatalMessagePtr {std::move(message)});
+      }
+
+
+   } // internal
+} // g3
+
+
+
diff --git a/g3log/g3log/active.hpp b/g3log/g3log/active.hpp
new file mode 100644
index 0000000..b04ca3c
--- /dev/null
+++ b/g3log/g3log/active.hpp
@@ -0,0 +1,69 @@
+/** ==========================================================================
+ * 2010 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
+ * ============================================================================
+ *
+ * Example of a Active Object, using C++11 std::thread mechanisms to make it
+ * safe for thread communication.
+ *
+ * This was originally published at http://sites.google.com/site/kjellhedstrom2/active-object-with-cpp0x
+ * and inspired from Herb Sutter's C++11 Active Object
+ * http://herbsutter.com/2010/07/12/effective-concurrency-prefer-using-active-objects-instead-of-naked-threads
+ *
+ * Last update 2013-12-19 by Kjell Hedstrom,
+ * e-mail: hedstrom at kjellkod dot cc
+ * linkedin: http://linkedin.com/se/kjellkod */
+
+#pragma once
+
+#include <thread>
+#include <functional>
+#include <memory>
+#include "g3log/shared_queue.hpp"
+
+namespace kjellkod {
+   typedef std::function<void() > Callback;
+
+   class Active {
+   private:
+      Active() : done_(false) {} // Construction ONLY through factory createActive();
+      Active(const Active &) = delete;
+      Active &operator=(const Active &) = delete;
+
+      void run() {
+         while (!done_) {
+            Callback func;
+            mq_.wait_and_pop(func);
+            func();
+         }
+      }
+
+      shared_queue<Callback> mq_;
+      std::thread thd_;
+      bool done_;
+
+
+   public:
+      virtual ~Active() {
+         send([this] { done_ = true;});
+         thd_.join();
+      }
+
+      void send(Callback msg_) {
+         mq_.push(msg_);
+      }
+
+      /// Factory: safe construction of object before thread start
+      static std::unique_ptr<Active> createActive() {
+         std::unique_ptr<Active> aPtr(new Active());
+         aPtr->thd_ = std::thread(&Active::run, aPtr.get());
+         return aPtr;
+      }
+   };
+
+
+
+} // kjellkod
diff --git a/g3log/g3log/crashhandler.hpp b/g3log/g3log/crashhandler.hpp
new file mode 100644
index 0000000..dfa4327
--- /dev/null
+++ b/g3log/g3log/crashhandler.hpp
@@ -0,0 +1,79 @@
+#pragma once
+
+/** ==========================================================================
+ * 2011 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 <cstdio>
+#include <string>
+#include <map>
+#include "g3log/loglevels.hpp"
+#include "g3log/generated_definitions.hpp"
+
+// kjell. Separera på crashhandler.hpp och crashhanlder_internal.hpp
+// implementationsfilen kan vara den samma
+namespace g3 {
+
+   // PUBLIC API:
+   /** Install signal handler that catches FATAL C-runtime or OS signals
+     See the wikipedia site for details http://en.wikipedia.org/wiki/SIGFPE
+     See the this site for example usage: http://www.tutorialspoint.com/cplusplus/cpp_signal_handling
+     SIGABRT  ABORT (ANSI), abnormal termination
+     SIGFPE   Floating point exception (ANSI)
+     SIGILL   ILlegal instruction (ANSI)
+     SIGSEGV  Segmentation violation i.e. illegal memory reference
+     SIGTERM  TERMINATION (ANSI)  */
+   void installCrashHandler();
+
+
+#if (defined(WIN32) || defined(_WIN32) || defined(__WIN32__))
+   typedef unsigned long SignalType;
+   ///  SIGFPE, SIGILL, and SIGSEGV handling must be installed per thread
+   /// on Windows. This is automatically done if you do at least one LOG(...) call
+   /// you can also use this function call, per thread so make sure these three
+   /// fatal signals are covered in your thread (even if you don't do a LOG(...) call
+   void installSignalHandlerForThread();
+#else
+   typedef int SignalType;
+
+   /// Probably only needed for unit testing. Resets the signal handling back to default
+   /// which might be needed in case it was previously overridden
+   /// The default signals are: SIGABRT, SIGFPE, SIGILL, SIGSEGV, SIGTERM
+   void restoreSignalHandlerToDefault();
+
+   /// Overrides the existing signal handling for custom signals
+   /// For example: usage of zcmq relies on its own signal handler for SIGTERM
+   ///     so users of g3log with zcmq should then use the @ref overrideSetupSignals
+   ///     , likely with the original set of signals but with SIGTERM removed
+   /// 
+   /// call example:
+   ///  g3::overrideSetupSignals({ {SIGABRT, "SIGABRT"}, {SIGFPE, "SIGFPE"},{SIGILL, "SIGILL"},
+   //                          {SIGSEGV, "SIGSEGV"},});
+   void overrideSetupSignals(const std::map<int, std::string> overrideSignals);
+#endif
+
+
+   namespace internal {
+      /** return whether or any fatal handling is still ongoing
+       *  this is used by g3log::fatalCallToLogger
+       *  only in the case of Windows exceptions (not fatal signals)
+       *  are we interested in changing this from false to true to
+       *  help any other exceptions handler work with 'EXCEPTION_CONTINUE_SEARCH'*/
+      bool shouldBlockForFatalHandling();
+
+      /** \return signal_name Ref: signum.hpp and \ref installSignalHandler
+      *  or for Windows exception name */
+      std::string exitReasonName(const LEVELS& level, g3::SignalType signal_number);
+
+      /** return calling thread's stackdump*/
+      std::string stackdump(const char* dump = nullptr);
+
+      /** Re-"throw" a fatal signal, previously caught. This will exit the application
+       * This is an internal only function. Do not use it elsewhere. It is triggered
+       * from g3log, g3LogWorker after flushing messages to file */
+      void exitWithDefaultSignalHandler(const LEVELS& level, g3::SignalType signal_number);
+   } // end g3::internal
+} // g3
diff --git a/g3log/g3log/filesink.hpp b/g3log/g3log/filesink.hpp
new file mode 100644
index 0000000..397aa04
--- /dev/null
+++ b/g3log/g3log/filesink.hpp
@@ -0,0 +1,42 @@
+/** ==========================================================================
+ * 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
+ * ============================================================================*/
+#pragma once
+
+#include <string>
+#include <memory>
+
+#include "g3log/logmessage.hpp"
+namespace g3 {
+
+   class FileSink {
+   public:
+      FileSink(const std::string &log_prefix, const std::string &log_directory, const std::string &logger_id="g3log");
+      virtual ~FileSink();
+
+      void fileWrite(LogMessageMover message);
+      std::string changeLogFile(const std::string &directory, const std::string &logger_id);
+      std::string fileName();
+
+
+   private:
+      std::string _log_file_with_path;
+      std::string _log_prefix_backup; // needed in case of future log file changes of directory
+      std::unique_ptr<std::ofstream> _outptr;
+
+      void addLogFileHeader();
+      std::ofstream &filestream() {
+         return *(_outptr.get());
+      }
+
+
+      FileSink &operator=(const FileSink &) = delete;
+      FileSink(const FileSink &other) = delete;
+
+   };
+} // g3
+
diff --git a/g3log/g3log/future.hpp b/g3log/g3log/future.hpp
new file mode 100644
index 0000000..ed50ef0
--- /dev/null
+++ b/g3log/g3log/future.hpp
@@ -0,0 +1,63 @@
+#pragma once
+/** ==========================================================================
+* 2012 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
+* ============================================================================
+* Filename:g3future.hpp
+*          Helper functionality to put packaged_tasks in standard container. This
+*          is especially helpful for background thread processing a la async but through
+*          an actor pattern (active object), thread pool or similar.
+* Created: 2012 by Kjell Hedström
+*
+* COMMUNITY THANKS:
+* The code below is in large thanks to exemplifying code snippets from StackOverflow
+* question/answer: http://stackoverflow.com/questions/6230893/developing-c-concurrency-library-with-futures-or-similar-paradigm
+* and a discussion between Lars Gullik Bjønnes and Jonathan Wakely's at: http://gcc.gnu.org/ml/gcc-help/2011-11/msg00052.html
+*
+* Both are highly recommended reads if you are interested in c++ concurrency library
+*  - Kjell, 2012
+*
+* PUBLIC DOMAIN and NOT under copywrite protection.
+* ********************************************* */
+
+
+
+#include <future>
+#include "g3log/active.hpp"
+#include "g3log/moveoncopy.hpp"
+#include "g3log/stlpatch_future.hpp"
+
+namespace g3 {
+   // Generic helper function to avoid repeating the steps for managing
+   // asynchronous task job (by active object) that returns a future results
+   // could of course be made even more generic if done more in the way of
+   // std::async, ref: http://en.cppreference.com/w/cpp/thread/async
+   //
+   // Example usage:
+   //  std::unique_ptr<Active> bgWorker{Active::createActive()};
+   //  ...
+   //  auto msg_call=[=](){return ("Hello from the Background");};
+   //  auto future_msg = g3::spawn_task(msg_lambda, bgWorker.get());
+   template <typename Func, class BgWorker>
+   std::future<typename std::result_of<Func()>::type> spawn_task(Func func, BgWorker *worker)
+   {
+      typedef typename std::result_of<Func()>::type result_type;
+      typedef std::packaged_task<result_type()> task_type;
+
+      if (nullptr == worker) {
+         auto p = std::make_shared<std::promise<result_type>>();
+         std::future<result_type> future_result = p->get_future();
+         p->set_exception(std::make_exception_ptr(std::runtime_error("nullptr instantiated worker")));
+         return future_result;
+      }
+
+      task_type task(std::move(func));
+
+      std::future<result_type> result = task.get_future();
+      worker->send(MoveOnCopy<task_type>(std::move(task)));
+      return std::move(result);
+   }
+} // end namespace g3
diff --git a/g3log/g3log/g3log.hpp b/g3log/g3log/g3log.hpp
new file mode 100644
index 0000000..6d2ec16
--- /dev/null
+++ b/g3log/g3log/g3log.hpp
@@ -0,0 +1,220 @@
+/** ==========================================================================
+ * 2011 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
+ * ============================================================================
+ *
+ * Filename:g3log.hpp  Framework for Logging and Design By Contract
+ * Created: 2011 by Kjell Hedström
+ *
+ * PUBLIC DOMAIN and Not copywrited since it was built on public-domain software and influenced
+ * at least in "spirit" from the following sources
+ * 1. kjellkod.cc ;)
+ * 2. Dr.Dobbs, Petru Marginean:  http://drdobbs.com/article/printableArticle.jhtml?articleId=201804215&dept_url=/caddpp/
+ * 3. Dr.Dobbs, Michael Schulze: http://drdobbs.com/article/printableArticle.jhtml?articleId=225700666&dept_url=/cpp/
+ * 4. Google 'glog': http://google-glog.googlecode.com/svn/trunk/doc/glog.html
+ * 5. Various Q&A at StackOverflow
+ * ********************************************* */
+
+
+#pragma once
+
+#include "g3log/loglevels.hpp"
+#include "g3log/logcapture.hpp"
+#include "g3log/logmessage.hpp"
+
+#include <string>
+#include <functional>
+
+
+#if !(defined(__PRETTY_FUNCTION__))
+#define __PRETTY_FUNCTION__   __FUNCTION__
+#endif
+
+// thread_local doesn't exist before VS2013
+// it exists on VS2015
+#if !(defined(thread_local)) && defined(_MSC_VER) && _MSC_VER < 1900
+#define thread_local __declspec(thread)
+#endif
+
+
+/** namespace for LOG() and CHECK() frameworks
+ * History lesson:   Why the names 'g3' and 'g3log'?:
+ * The framework was made in my own free time as PUBLIC DOMAIN but the
+ * first commercial project to use it used 'g3' as an internal denominator for
+ * the current project. g3 as in 'generation 2'. I decided to keep the g3 and g3log names
+ * to give credit to the people in that project (you know who you are :) and I guess also
+ * for 'sentimental' reasons. That a big influence was google's glog is just a happy
+ *  concidence or subconscious choice. Either way g3log became the name for this logger.
+ *
+ * --- Thanks for a great 2011 and good luck with 'g3' --- KjellKod
+ */
+namespace g3 {
+   class LogWorker;
+   struct LogMessage;
+   struct FatalMessage;
+
+   /** Should be called at very first startup of the software with \ref g3LogWorker
+    *  pointer. Ownership of the \ref g3LogWorker is the responsibilkity of the caller */
+   void initializeLogging(LogWorker *logger);
+
+
+   /** setFatalPreLoggingHook() provides an optional extra step before the fatalExitHandler is called
+    *
+    * Set a function-hook before a fatal message will be sent to the logger
+    * i.e. this is a great place to put a break point, either in your debugger
+    * or programatically to catch LOG(FATAL), CHECK(...) or an OS fatal event (exception or signal)
+    * This will be reset to default (does nothing) at initializeLogging(...);
+    *
+    * Example usage:
+    * Windows: g3::setFatalPreLoggingHook([]{__debugbreak();}); // remember #include <intrin.h>
+    *         WARNING: '__debugbreak()' when not running in Debug in your Visual Studio IDE will likely
+    *                   trigger a recursive crash if used here. It should only be used when debugging
+    *                   in your Visual Studio IDE. Recursive crashes are handled but are unnecessary.
+    *
+    * Linux:   g3::setFatalPreLoggingHook([]{ raise(SIGTRAP); });
+    */
+   void setFatalPreLoggingHook(std::function<void(void)>  pre_fatal_hook);
+
+   /** If the @ref setFatalPreLoggingHook is not enough and full fatal exit handling is needed then
+    * use "setFatalExithandler".  Please see g3log.cpp and crashhandler_windows.cpp or crashhandler_unix for
+    * example of restoring signal and exception handlers, flushing the log and shutting down.
+    */
+   void setFatalExitHandler(std::function<void(FatalMessagePtr)> fatal_call);
+
+
+
+
+   // internal namespace is for completely internal or semi-hidden from the g3 namespace due to that it is unlikely
+   // that you will use these
+   namespace internal {
+      /// @returns true if logger is initialized
+      bool isLoggingInitialized();
+
+      // Save the created LogMessage to any existing sinks
+      void saveMessage(const char *message, const char *file, int line, const char *function, const LEVELS &level,
+                       const char *boolean_expression, int fatal_signal, const char *stack_trace);
+
+      // forwards the message to all sinks
+      void pushMessageToLogger(LogMessagePtr log_entry);
+
+
+      // forwards a FATAL message to all sinks,. after which the g3logworker
+      // will trigger crashhandler / g3::internal::exitWithDefaultSignalHandler
+      //
+      // By default the "fatalCall" will forward a Fatalessageptr to this function
+      // this behaviour can be changed if you set a different fatal handler through
+      // "setFatalExitHandler"
+      void pushFatalMessageToLogger(FatalMessagePtr message);
+
+
+      // Save the created FatalMessage to any existing sinks and exit with
+      // the originating fatal signal,. or SIGABRT if it originated from a broken contract
+      // By default forwards to: pushFatalMessageToLogger, see "setFatalExitHandler" to override
+      //
+      // If you override it then you probably want to call "pushFatalMessageToLogger" after your
+      // custom fatal handler is done. This will make sure that the fatal message the pushed
+      // to sinks as well as shutting down the process
+      void fatalCall(FatalMessagePtr message);
+
+      // Shuts down logging. No object cleanup but further LOG(...) calls will be ignored.
+      void shutDownLogging();
+
+      // Shutdown logging, but ONLY if the active logger corresponds to the one currently initialized
+      bool shutDownLoggingForActiveOnly(LogWorker *active);
+
+   } // internal
+} // g3
+
+#define INTERNAL_LOG_MESSAGE(level) LogCapture(__FILE__, __LINE__, __PRETTY_FUNCTION__, level)
+
+#define INTERNAL_CONTRACT_MESSAGE(boolean_expression)  \
+   LogCapture(__FILE__, __LINE__, __PRETTY_FUNCTION__, g3::internal::CONTRACT, boolean_expression)
+
+
+// LOG(level) is the API for the stream log
+#define LOG(level) if(g3::logLevel(level)) INTERNAL_LOG_MESSAGE(level).stream()
+
+
+// 'Conditional' stream log
+#define LOG_IF(level, boolean_expression)  \
+   if(true == boolean_expression)  \
+      if(g3::logLevel(level))  INTERNAL_LOG_MESSAGE(level).stream()
+
+// 'Design By Contract' stream API. For Broken Contracts:
+//         unit testing: it will throw std::runtime_error when a contract breaks
+//         I.R.L : it will exit the application by using fatal signal SIGABRT
+#define CHECK(boolean_expression)        \
+   if (false == (boolean_expression))  INTERNAL_CONTRACT_MESSAGE(#boolean_expression).stream()
+
+
+/** For details please see this
+ * REFERENCE: http://www.cppreference.com/wiki/io/c/printf_format
+ * \verbatim
+ *
+  There are different %-codes for different variable types, as well as options to
+    limit the length of the variables and whatnot.
+    Code Format
+    %[flags][width][.precision][length]specifier
+ SPECIFIERS
+ ----------
+ %c character
+ %d signed integers
+ %i signed integers
+ %e scientific notation, with a lowercase “e”
+ %E scientific notation, with a uppercase “E”
+ %f floating point
+ %g use %e or %f, whichever is shorter
+ %G use %E or %f, whichever is shorter
+ %o octal
+ %s a string of characters
+ %u unsigned integer
+ %x unsigned hexadecimal, with lowercase letters
+ %X unsigned hexadecimal, with uppercase letters
+ %p a pointer
+ %n the argument shall be a pointer to an integer into which is placed the number of characters written so far
+
+For flags, width, precision etc please see the above references.
+EXAMPLES:
+{
+   LOGF(INFO, "Characters: %c %c \n", 'a', 65);
+   LOGF(INFO, "Decimals: %d %ld\n", 1977, 650000L);      // printing long
+   LOGF(INFO, "Preceding with blanks: %10d \n", 1977);
+   LOGF(INFO, "Preceding with zeros: %010d \n", 1977);
+   LOGF(INFO, "Some different radixes: %d %x %o %#x %#o \n", 100, 100, 100, 100, 100);
+   LOGF(INFO, "floats: %4.2f %+.0e %E \n", 3.1416, 3.1416, 3.1416);
+   LOGF(INFO, "Width trick: %*d \n", 5, 10);
+   LOGF(INFO, "%s \n", "A string");
+   return 0;
+}
+And here is possible output
+:      Characters: a A
+:      Decimals: 1977 650000
+:      Preceding with blanks:       1977
+:      Preceding with zeros: 0000001977
+:      Some different radixes: 100 64 144 0x64 0144
+:      floats: 3.14 +3e+000 3.141600E+000
+:      Width trick:    10
+:      A string  \endverbatim */
+#define LOGF(level, printf_like_message, ...)                 \
+   if(g3::logLevel(level)) INTERNAL_LOG_MESSAGE(level).capturef(printf_like_message, ##__VA_ARGS__)
+
+// Conditional log printf syntax
+#define LOGF_IF(level,boolean_expression, printf_like_message, ...) \
+   if(true == boolean_expression)                                     \
+      if(g3::logLevel(level))  INTERNAL_LOG_MESSAGE(level).capturef(printf_like_message, ##__VA_ARGS__)
+
+// Design By Contract, printf-like API syntax with variadic input parameters.
+// Throws std::runtime_eror if contract breaks
+#define CHECKF(boolean_expression, printf_like_message, ...)    \
+   if (false == (boolean_expression))  INTERNAL_CONTRACT_MESSAGE(#boolean_expression).capturef(printf_like_message, ##__VA_ARGS__)
+
+// Backwards compatible. The same as CHECKF. 
+// Design By Contract, printf-like API syntax with variadic input parameters.
+// Throws std::runtime_eror if contract breaks
+#define CHECK_F(boolean_expression, printf_like_message, ...)    \
+   if (false == (boolean_expression))  INTERNAL_CONTRACT_MESSAGE(#boolean_expression).capturef(printf_like_message, ##__VA_ARGS__)
+
+
diff --git a/g3log/g3log/logcapture.hpp b/g3log/g3log/logcapture.hpp
new file mode 100644
index 0000000..a9e7b49
--- /dev/null
+++ b/g3log/g3log/logcapture.hpp
@@ -0,0 +1,85 @@
+/** ==========================================================================
+ * 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
+ * ============================================================================*/
+
+#pragma once
+
+#include "g3log/loglevels.hpp"
+#include "g3log/g3log.hpp"
+#include "g3log/crashhandler.hpp"
+
+#include <string>
+#include <sstream>
+#include <cstdarg>
+#include <csignal>
+#ifdef _MSC_VER
+# include <sal.h>
+#endif
+
+/**
+ * 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
+*/
+struct LogCapture {
+   /// Called from crash handler when a fatal signal has occurred (SIGSEGV etc)
+   LogCapture(const LEVELS &level, g3::SignalType fatal_signal, const char *dump = nullptr);
+
+
+   /**
+    * @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(const char *file, const int line, const char *function, const LEVELS &level, const char *expression = "", g3::SignalType fatal_signal = SIGABRT, const char *dump = nullptr);
+
+
+   // At destruction the message will be forwarded to the g3log worker.
+   // in case of dynamically (at runtime) loaded libraries the important thing to know is that
+   // all strings are copied so the original are not destroyed at the receiving end, only the copy
+   virtual ~LogCapture();
+
+
+
+
+   // Use "-Wall" to generate warnings in case of illegal printf format.
+   //      Ref:  http://www.unixwiz.net/techtips/gnu-c-attributes.html
+#ifndef __GNUC__
+#define  __attribute__(x) // Disable 'attributes' if compiler does not support 'em
+#endif 
+#ifdef _MSC_VER 
+#	if _MSC_VER >= 1400
+#		define G3LOG_FORMAT_STRING _Printf_format_string_
+#	else
+#		define G3LOG_FORMAT_STRING __format_string
+#	endif
+#else
+#	define G3LOG_FORMAT_STRING
+#endif
+   void capturef(G3LOG_FORMAT_STRING const char *printf_like_message, ...) __attribute__((format(printf, 2, 3))); // 2,3 ref:  http://www.codemaestro.com/reviews/18
+
+
+   /// prettifying API for this completely open struct
+   std::ostringstream &stream() {
+      return _stream;
+   }
+
+
+
+   std::ostringstream _stream;
+   std::string _stack_trace;
+   const char *_file;
+   const int _line;
+   const char *_function;
+   const LEVELS &_level;
+   const char *_expression;
+   const g3::SignalType _fatal_signal;
+
+};
+//} // g3
diff --git a/g3log/g3log/loglevels.hpp b/g3log/g3log/loglevels.hpp
new file mode 100644
index 0000000..f6b626a
--- /dev/null
+++ b/g3log/g3log/loglevels.hpp
@@ -0,0 +1,125 @@
+/** ==========================================================================
+* 2012 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
+* ============================================================================*/
+
+#pragma once
+#include "g3log/generated_definitions.hpp"
+
+// Users of Juce or other libraries might have a define DEBUG which clashes with
+// the DEBUG logging level for G3log. In that case they can instead use the define
+//  "CHANGE_DEBUG_TO_DBUG" and G3log's logging level DEBUG is changed to be DBUG
+#if (defined(CHANGE_DEBUG_TO_DBUG))
+#if (defined(DBUG))
+#error "DEBUG is already defined elsewhere which clashes with G3Log's log level DEBUG"
+#endif
+#else
+#if (defined(DEBUG))
+#error "DEBUG is already defined elsewhere which clashes with G3Log's log level DEBUG"
+#endif
+#endif
+
+#include <string> 
+#include <algorithm>
+
+
+// Levels for logging, made so that it would be easy to change, remove, add levels -- KjellKod
+struct LEVELS {
+   // force internal copy of the const char*. This is a simple safeguard for when g3log is used in a
+   // "dynamic, runtime loading of shared libraries"
+
+   LEVELS(const LEVELS& other): value(other.value), text(other.text.c_str()) {}
+   LEVELS(int id, const std::string& idtext) : value(id), text(idtext) {}
+
+   bool operator==(const LEVELS& rhs)  const {
+      return (value == rhs.value && text == rhs.text);
+   }
+
+   bool operator!=(const LEVELS& rhs) const {
+      return (value != rhs.value || text != rhs.text);
+   }
+
+   friend void swap(LEVELS& first, LEVELS& second) {
+      using std::swap;
+      swap(first.value, second.value);
+      swap(first.text, second.text);
+   }
+
+
+   LEVELS& operator=(LEVELS other) {
+      swap(*this, other);
+      return *this;
+   }
+
+
+   int value;
+   std::string text;
+};
+
+
+
+namespace g3 {
+   static const int kDebugValue = 0;
+   static const int kInfoValue = 100;
+   static const int kWarningValue = 500;
+   static const int kFatalValue = 1000;
+   static const int kInternalFatalValue = 2000;
+}
+
+#if (defined(CHANGE_DEBUG_TO_DBUG))
+const LEVELS DBUG {g3::kDebugValue, {"DEBUG"}},
+#else
+const LEVELS DEBUG {g3::kDebugValue, {"DEBUG"}},
+#endif
+      INFO {g3::kInfoValue, {"INFO"}},
+      WARNING {g3::kWarningValue, {"WARNING"}},
+
+
+
+// Insert here *any* extra logging levels that is needed. You can do so in your own source file
+// If it is a FATAL you should keep it above (FATAL.value and below internal::CONTRACT.value
+// If it is a non-fatal you can keep it above (WARNING.value and below FATAL.value)
+//
+// example: MyLoggingLevel.h
+// #pragma once
+//  const LEVELS MYINFO {WARNING.value +1, "MyInfoLevel"};
+//  const LEVELS MYFATAL {FATAL.value +1, "MyFatalLevel"};
+//
+// IMPORTANT: As of yet dynamic on/off of logging is NOT changed automatically
+//     any changes of this, if you use dynamic on/off must be done in loglevels.cpp,
+//     g_log_level_status and
+//     void setLogLevel(LEVELS log_level, bool enabled) {...}
+//     bool logLevel(LEVELS log_level){...}
+
+
+// 1) Remember to update the FATAL initialization below
+// 2) Remember to update the initialization of "g3loglevels.cpp/g_log_level_status"
+      FATAL {g3::kFatalValue, {"FATAL"}};
+
+namespace g3 {
+   namespace internal {
+      const LEVELS CONTRACT {g3::kInternalFatalValue, {"CONTRACT"}},
+            FATAL_SIGNAL {g3::kInternalFatalValue +1, {"FATAL_SIGNAL"}},
+            FATAL_EXCEPTION {kInternalFatalValue +2, {"FATAL_EXCEPTION"}};
+
+      /// helper function to tell the logger if a log message was fatal. If it is it will force
+      /// a shutdown after all log entries are saved to the sinks
+      bool wasFatal(const LEVELS& level);
+   }
+
+#ifdef G3_DYNAMIC_LOGGING
+   // Only safe if done at initialization in a single-thread context
+   namespace only_change_at_initialization {
+      // Enable/Disable a log level {DEBUG,INFO,WARNING,FATAL}
+      void setLogLevel(LEVELS level, bool enabled_status);
+      std::string printLevels();
+      void reset();
+
+   } // only_change_at_initialization
+#endif
+   bool logLevel(LEVELS level);
+} // g3
+
diff --git a/g3log/g3log/logmessage.hpp b/g3log/g3log/logmessage.hpp
new file mode 100644
index 0000000..28dcf25
--- /dev/null
+++ b/g3log/g3log/logmessage.hpp
@@ -0,0 +1,136 @@
+/** ==========================================================================
+* 2012 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
+* ============================================================================*/
+
+#pragma once
+
+
+
+#include "g3log/loglevels.hpp"
+#include "g3log/time.hpp"
+#include "g3log/moveoncopy.hpp"
+#include "g3log/crashhandler.hpp"
+
+#include <string>
+#include <sstream>
+#include <thread>
+#include <memory>
+
+namespace g3 {
+
+   /** LogMessage contains all the data collected from the LOG(...) call.
+   * If the sink receives a std::string it will be the std::string toString()... function
+   * that will format the data into a string
+   *
+   * For sinks that receive a LogMessage they can either use the toString() function, or use
+   * the helper functions or even the public raw data to format the saved log message any
+   * desired way.
+   */
+   struct LogMessage {
+      std::string file_path() const {
+         return _file_path;
+      }
+      std::string file() const {
+         return _file;
+      }
+      std::string line() const {
+         return std::to_string(_line);
+      }
+      std::string function() const {
+         return _function;
+      }
+      std::string level() const {
+         return _level.text;
+      }
+
+      /// use a different format string to get a different look on the time.
+      //  default look is Y/M/D H:M:S
+      std::string timestamp(const std::string& time_format = {internal::date_formatted + " " + internal::time_formatted}) const;
+
+      std::string message() const  {
+         return _message;
+      }
+      std::string& write() const {
+         return _message;
+      }
+
+      std::string expression() const  {
+         return _expression;
+      }
+      bool wasFatal() const {
+         return internal::wasFatal(_level);
+      }
+
+      std::string threadID() const;
+
+      std::string toString() const;
+      void setExpression(const std::string expression) {
+         _expression = expression;
+      }
+
+
+      LogMessage& operator=(LogMessage other);
+
+
+      LogMessage(const std::string& file, const int line, const std::string& function, const LEVELS& level);
+
+      explicit LogMessage(const std::string& fatalOsSignalCrashMessage);
+      LogMessage(const LogMessage& other);
+      LogMessage(LogMessage&& other);
+      virtual ~LogMessage() {}
+
+      //
+      // Complete access to the raw data in case the helper functions above
+      // are not enough.
+      //
+      timespec _timestamp;
+      std::thread::id _call_thread_id;
+      std::string _file;
+      std::string _file_path;
+      int _line;
+      std::string _function;
+      LEVELS _level;
+      std::string _expression; // only with content for CHECK(...) calls
+      mutable std::string _message;
+
+
+
+      friend void swap(LogMessage& first, LogMessage& second) {
+         using std::swap;
+         swap(first._timestamp, second._timestamp);
+         swap(first._call_thread_id, second._call_thread_id);
+         swap(first._file, second._file);
+         swap(first._line, second._line);
+         swap(first._function, second._function);
+         swap(first._level, second._level);
+         swap(first._expression, second._expression);
+         swap(first._message, second._message);
+      }
+
+   };
+
+
+
+   /** Trigger for flushing the message queue and exiting the application
+    * A thread that causes a FatalMessage will sleep forever until the
+    * application has exited (after message flush) */
+   struct FatalMessage : public LogMessage {
+      FatalMessage(const LogMessage& details, g3::SignalType signal_id);
+      FatalMessage(const FatalMessage&);
+      virtual ~FatalMessage() {}
+
+      LogMessage copyToLogMessage() const;
+      std::string reason() const;
+
+      const SignalType _signal_id;
+   };
+
+
+   typedef MoveOnCopy<std::unique_ptr<FatalMessage>> FatalMessagePtr;
+   typedef MoveOnCopy<std::unique_ptr<LogMessage>> LogMessagePtr;
+   typedef MoveOnCopy<LogMessage> LogMessageMover;
+} // g3
diff --git a/g3log/g3log/logworker.hpp b/g3log/g3log/logworker.hpp
new file mode 100644
index 0000000..f5a7979
--- /dev/null
+++ b/g3log/g3log/logworker.hpp
@@ -0,0 +1,118 @@
+#pragma once
+/** ==========================================================================
+ * 2011 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
+ * ============================================================================
+ * Filename:g3logworker.h  Framework for Logging and Design By Contract
+ * Created: 2011 by Kjell Hedström
+ *
+ * PUBLIC DOMAIN and Not copywrited. First published at KjellKod.cc
+ * ********************************************* */
+#include "g3log/g3log.hpp"
+#include "g3log/sinkwrapper.hpp"
+#include "g3log/sinkhandle.hpp"
+#include "g3log/filesink.hpp"
+#include "g3log/logmessage.hpp"
+#include "g3log/std2_make_unique.hpp"
+
+#include <memory>
+#include <string>
+#include <vector>
+
+
+namespace g3 {
+   class LogWorker;
+   struct LogWorkerImpl;
+   using FileSinkHandle = g3::SinkHandle<g3::FileSink>;
+
+   /// Background side of the LogWorker. Internal use only
+   struct LogWorkerImpl final {
+      typedef std::shared_ptr<g3::internal::SinkWrapper> SinkWrapperPtr;
+      std::vector<SinkWrapperPtr> _sinks;
+      std::unique_ptr<kjellkod::Active> _bg; // do not change declaration order. _bg must be destroyed before sinks
+
+      LogWorkerImpl();
+      ~LogWorkerImpl() = default;
+
+      void bgSave(g3::LogMessagePtr msgPtr);
+      void bgFatal(FatalMessagePtr msgPtr);
+
+      LogWorkerImpl(const LogWorkerImpl&) = delete;
+      LogWorkerImpl& operator=(const LogWorkerImpl&) = delete;
+   };
+
+
+
+   /// Front end of the LogWorker.  API that is usefule is
+   /// addSink( sink, default_call ) which returns a handle to the sink. See below and REAME for usage example
+   /// save( msg ) : internal use
+   /// fatal ( fatal_msg ) : internal use
+   class LogWorker final {
+      LogWorker() = default;
+      void addWrappedSink(std::shared_ptr<g3::internal::SinkWrapper> wrapper);
+
+      LogWorkerImpl _impl;
+      LogWorker(const LogWorker&) = delete;
+      LogWorker& operator=(const LogWorker&) = delete;
+
+
+    public:
+      ~LogWorker();
+
+      /// Creates the LogWorker with no sinks. See exampel below on @ref addSink for how to use it
+      /// if you want to use the default file logger then see below for @ref addDefaultLogger
+      static std::unique_ptr<LogWorker> createLogWorker();
+
+      
+      /**
+      A convenience function to add the default g3::FileSink to the log worker
+       @param log_prefix that you want
+       @param log_directory where the log is to be stored.
+       @return a handle for API access to the sink. See the README for example usage
+
+       @verbatim
+       Example:
+       using namespace g3;
+       std::unique_ptr<LogWorker> logworker {LogWorker::createLogWorker()};
+       auto handle = addDefaultLogger("my_test_log", "/tmp");
+       initializeLogging(logworker.get()); // ref. g3log.hpp
+
+       std::future<std::string> log_file_name = sinkHandle->call(&FileSink::fileName);
+       std::cout << "The filename is: " << log_file_name.get() << std::endl;
+       //   something like: /tmp/my_test_log.g3log.20150819-100300.log
+       */
+       std::unique_ptr<FileSinkHandle> addDefaultLogger(const std::string& log_prefix, const std::string& log_directory, const std::string& default_id = "g3log");
+
+
+
+      /// Adds a sink and returns the handle for access to the sink
+      /// @param real_sink unique_ptr ownership is passed to the log worker
+      /// @param call the default call that should receive either a std::string or a LogMessageMover message
+      /// @return handle to the sink for API access. See usage example below at @ref addDefaultLogger
+      template<typename T, typename DefaultLogCall>
+      std::unique_ptr<g3::SinkHandle<T>> addSink(std::unique_ptr<T> real_sink, DefaultLogCall call) {
+         using namespace g3;
+         using namespace g3::internal;
+         auto sink = std::make_shared<Sink<T>> (std::move(real_sink), call);
+         addWrappedSink(sink);
+         return std2::make_unique<SinkHandle<T>> (sink);
+      }
+
+
+
+      /// internal:
+      /// pushes in background thread (asynchronously) input messages to log file
+      void save(LogMessagePtr entry);
+
+      /// internal:
+      //  pushes a fatal message on the queue, this is the last message to be processed
+      /// this way it's ensured that all existing entries were flushed before 'fatal'
+      /// Will abort the application!
+      void fatal(FatalMessagePtr fatal_message);
+
+
+   };
+} // g3
diff --git a/g3log/g3log/moveoncopy.hpp b/g3log/g3log/moveoncopy.hpp
new file mode 100644
index 0000000..4c11b5f
--- /dev/null
+++ b/g3log/g3log/moveoncopy.hpp
@@ -0,0 +1,48 @@
+/** ==========================================================================
+* 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
+* ============================================================================*/
+
+#pragma once
+namespace g3 {
+
+   // A straightforward technique to move around packaged_tasks.
+   //  Instances of std::packaged_task are MoveConstructible and MoveAssignable, but
+   //  not CopyConstructible or CopyAssignable. To put them in a std container they need
+   //  to be wrapped and their internals "moved" when tried to be copied.
+
+   template<typename Moveable>
+   struct MoveOnCopy {
+      mutable Moveable _move_only;
+
+      explicit MoveOnCopy(Moveable &&m) : _move_only(std::move(m)) {}
+      MoveOnCopy(MoveOnCopy const &t) : _move_only(std::move(t._move_only)) {}
+      MoveOnCopy(MoveOnCopy &&t) : _move_only(std::move(t._move_only)) {}
+
+      MoveOnCopy &operator=(MoveOnCopy const &other) {
+         _move_only = std::move(other._move_only);
+         return *this;
+      }
+
+      MoveOnCopy &operator=(MoveOnCopy && other) {
+         _move_only = std::move(other._move_only);
+         return *this;
+      }
+
+      void operator()() {
+         _move_only();
+      }
+
+      Moveable &get() {
+         return _move_only;
+      }
+      
+      Moveable release() {
+         return std::move(_move_only);
+      }
+   };
+
+} // g3
diff --git a/g3log/g3log/shared_queue.hpp b/g3log/g3log/shared_queue.hpp
new file mode 100644
index 0000000..e8abdde
--- /dev/null
+++ b/g3log/g3log/shared_queue.hpp
@@ -0,0 +1,80 @@
+/** ==========================================================================
+* 2010 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
+* ============================================================================
+*
+* Example of a normal std::queue protected by a mutex for operations,
+* making it safe for thread communication, using std::mutex from C++0x with
+* the help from the std::thread library from JustSoftwareSolutions
+* ref: http://www.stdthread.co.uk/doc/headers/mutex.html
+*
+* This exampel  was totally inspired by Anthony Williams lock-based data structures in
+* Ref: "C++ Concurrency In Action" http://www.manning.com/williams */
+
+#pragma once
+
+#include <queue>
+#include <mutex>
+#include <exception>
+#include <condition_variable>
+
+/** Multiple producer, multiple consumer thread safe queue
+* Since 'return by reference' is used this queue won't throw */
+template<typename T>
+class shared_queue
+{
+   std::queue<T> queue_;
+   mutable std::mutex m_;
+   std::condition_variable data_cond_;
+
+   shared_queue &operator=(const shared_queue &) = delete;
+   shared_queue(const shared_queue &other) = delete;
+
+public:
+   shared_queue() {}
+
+   void push(T item) {
+      {
+         std::lock_guard<std::mutex> lock(m_);
+         queue_.push(std::move(item));
+      }
+      data_cond_.notify_one();
+   }
+
+   /// \return immediately, with true if successful retrieval
+   bool try_and_pop(T &popped_item) {
+      std::lock_guard<std::mutex> lock(m_);
+      if (queue_.empty()) {
+         return false;
+      }
+      popped_item = std::move(queue_.front());
+      queue_.pop();
+      return true;
+   }
+
+   /// Try to retrieve, if no items, wait till an item is available and try again
+   void wait_and_pop(T &popped_item) {
+      std::unique_lock<std::mutex> lock(m_);
+      while (queue_.empty())
+      {
+         data_cond_.wait(lock);
+         //  This 'while' loop is equal to
+         //  data_cond_.wait(lock, [](bool result){return !queue_.empty();});
+      }
+      popped_item = std::move(queue_.front());
+      queue_.pop();
+   }
+
+   bool empty() const {
+      std::lock_guard<std::mutex> lock(m_);
+      return queue_.empty();
+   }
+
+   unsigned size() const {
+      std::lock_guard<std::mutex> lock(m_);
+      return queue_.size();
+   }
+};
diff --git a/g3log/g3log/sink.hpp b/g3log/g3log/sink.hpp
new file mode 100644
index 0000000..c3896ff
--- /dev/null
+++ b/g3log/g3log/sink.hpp
@@ -0,0 +1,79 @@
+/** ==========================================================================
+* 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
+* ============================================================================*/
+
+#pragma once
+
+
+#include "g3log/sinkwrapper.hpp"
+#include "g3log/active.hpp"
+#include "g3log/future.hpp"
+#include "g3log/logmessage.hpp"
+
+#include <memory>
+#include <functional>
+#include <type_traits>
+
+namespace g3 {
+   namespace internal {
+      typedef std::function<void(LogMessageMover) > AsyncMessageCall;
+
+      /// The asynchronous Sink has an active object, incoming requests for actions
+      //  will be processed in the background by the specific object the Sink represents.
+      //
+      // The Sink will wrap either
+      //     a Sink with Message object receiving call
+      // or  a Sink with a LogEntry (string) receving call
+      //
+      // The Sink can also be used through the SinkHandler to call Sink specific function calls
+      // Ref: send(Message) deals with incoming log entries (converted if necessary to string)
+      // Ref: send(Call call, Args... args) deals with calls
+      //           to the real sink's API
+
+      template<class T>
+      struct Sink : public SinkWrapper {
+         std::unique_ptr<T> _real_sink;
+         std::unique_ptr<kjellkod::Active> _bg;
+         AsyncMessageCall _default_log_call;
+
+         template<typename DefaultLogCall >
+         Sink(std::unique_ptr<T> sink, DefaultLogCall call)
+            : SinkWrapper(),
+         _real_sink {std::move(sink)},
+         _bg(kjellkod::Active::createActive()),
+         _default_log_call(std::bind(call, _real_sink.get(), std::placeholders::_1)) {
+         }
+
+
+         Sink(std::unique_ptr<T> sink, void(T::*Call)(std::string) )
+            : SinkWrapper(),
+         _real_sink {std::move(sink)},
+         _bg(kjellkod::Active::createActive()) {
+            std::function<void(std::string)> adapter = std::bind(Call, _real_sink.get(), std::placeholders::_1);
+            _default_log_call = [ = ](LogMessageMover m) {
+               adapter(m.get().toString());
+            };
+         }
+
+         virtual ~Sink() {
+            _bg.reset(); // TODO: to remove
+         }
+
+         void send(LogMessageMover msg) override {
+            _bg->send([this, msg] {
+               _default_log_call(msg);
+            });
+         }
+
+         template<typename Call, typename... Args>
+         auto async(Call call, Args &&... args)-> std::future< typename std::result_of<decltype(call)(T, Args...)>::type> {
+            return g3::spawn_task(std::bind(call, _real_sink.get(), std::forward<Args>(args)...), _bg.get());
+         }
+      };
+   } // internal
+} // g3
+
diff --git a/g3log/g3log/sinkhandle.hpp b/g3log/g3log/sinkhandle.hpp
new file mode 100644
index 0000000..308aa6e
--- /dev/null
+++ b/g3log/g3log/sinkhandle.hpp
@@ -0,0 +1,54 @@
+/** ==========================================================================
+* 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
+* ============================================================================*/
+
+#pragma once
+
+#include "g3log/sink.hpp"
+
+#include <memory>
+#include <type_traits>
+
+namespace g3 {
+
+   // The Sinkhandle is the client's access point to the specific sink instance.
+   // Only through the Sinkhandle can, and should, the real sink's specific API
+   // be called.
+   //
+   // The real sink will be owned by the g3logger. If the real sink is deleted
+   // calls to sink's API through the SinkHandle will return an exception embedded
+   // in the resulting future. Ref: SinkHandle::call
+   template<class T>
+   class SinkHandle {
+      std::weak_ptr<internal::Sink<T>> _sink;
+
+   public:
+      SinkHandle(std::shared_ptr<internal::Sink<T>> sink)
+         : _sink(sink) {}
+
+      ~SinkHandle() {}
+
+
+      // Asynchronous call to the real sink. If the real sink is already deleted
+      // the returned future will contain a bad_weak_ptr exception instead of the
+      // call result.
+      template<typename AsyncCall, typename... Args>
+      auto call(AsyncCall func , Args &&... args) -> std::future<typename std::result_of<decltype(func)(T, Args...)>::type> {
+         try {
+            std::shared_ptr<internal::Sink<T>> sink(_sink);
+            return sink->async(func, std::forward<Args>(args)...);
+         } catch (const std::bad_weak_ptr &e) {
+            typedef typename std::result_of<decltype(func)(T, Args...)>::type PromiseType;
+            std::promise<PromiseType> promise;
+            promise.set_exception(std::make_exception_ptr(e));
+            return std::move(promise.get_future());
+         }
+      }
+   };
+}
+
+
diff --git a/g3log/g3log/sinkwrapper.hpp b/g3log/g3log/sinkwrapper.hpp
new file mode 100644
index 0000000..0cc1c1b
--- /dev/null
+++ b/g3log/g3log/sinkwrapper.hpp
@@ -0,0 +1,22 @@
+/** ==========================================================================
+* 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
+* ============================================================================*/
+
+#pragma once
+
+#include "g3log/logmessage.hpp"
+
+namespace g3 {
+   namespace internal {
+
+      struct SinkWrapper {
+         virtual ~SinkWrapper() { }
+         virtual void send(LogMessageMover msg) = 0;
+      };
+   }
+}
+
diff --git a/g3log/g3log/stacktrace_windows.hpp b/g3log/g3log/stacktrace_windows.hpp
new file mode 100644
index 0000000..257abde
--- /dev/null
+++ b/g3log/g3log/stacktrace_windows.hpp
@@ -0,0 +1,42 @@
+/** ==========================================================================
+ * 2014 by KjellKod.cc AND Robert Engeln.
+ * The stacktrace code was given as a public domain dedication by Robert Engeln
+ * It was originally published at: http://code-freeze.blogspot.com/2012/01/generating-stack-traces-from-c.html
+ * It was (here) modified for g3log purposes.
+ *
+ * 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
+ * ============================================================================*/
+
+
+#pragma once
+#if !(defined(WIN32) || defined(_WIN32) || defined(__WIN32__))
+#error "stacktrace_win.cpp used but not on a windows system"
+#endif
+
+#include "g3log/crashhandler.hpp"
+
+#include <string>
+#include <windows.h>
+
+namespace stacktrace {
+   /// return the text description of a Windows exception code
+   std::string exceptionIdToText(g3::SignalType id);
+
+   /// return whether or not the exception is a known exception, i.e.
+   /// an exception that we should treat as a fatal event
+   bool isKnownException(g3::SignalType id);
+
+   /// helper function: retrieve stackdump from no excisting exception pointer
+   std::string stackdump();
+
+   /// helper function: retrieve stackdump, starting from an exception pointer
+   std::string stackdump(EXCEPTION_POINTERS *info);
+
+   /// main stackdump function. retrieve stackdump, from the given context
+   std::string stackdump(CONTEXT *context);
+
+} // stacktrace
diff --git a/g3log/g3log/std2_make_unique.hpp b/g3log/g3log/std2_make_unique.hpp
new file mode 100644
index 0000000..325ed63
--- /dev/null
+++ b/g3log/g3log/std2_make_unique.hpp
@@ -0,0 +1,47 @@
+/** ==========================================================================
+ * 2013 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
+ *
+ * make_unique will be in C++14, this implementation is copied as I understood
+ * Stephan T. Lavavej's description of it.
+ *
+ * PUBLIC DOMAIN and NOT under copywrite protection.
+ *
+ *
+ * Example: usage
+ * auto an_int = make_unique<int>(123);
+ * auto a_string = make_unique<string>(5, 'x');
+ * auto an_int_array = make_unique<int[]>(11, 22, 33);
+ * ********************************************* */
+
+#pragma once
+
+#include <memory>
+#include <type_traits>
+
+namespace std2 {
+   namespace impl_fut_stl {
+
+      template<typename T, typename ... Args>
+      std::unique_ptr<T> make_unique_helper(std::false_type, Args &&... args) {
+         return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
+      }
+
+      template<typename T, typename ... Args>
+      std::unique_ptr<T> make_unique_helper(std::true_type, Args &&... args) {
+         static_assert(std::extent<T>::value == 0, "make_unique<T[N]>() is forbidden, please use make_unique<T[]>(),");
+         typedef typename std::remove_extent<T>::type U;
+         return std::unique_ptr<T>(new U[sizeof...(Args)] {std::forward<Args>(args)...});
+      }
+   }
+
+   template<typename T, typename ... Args>
+   std::unique_ptr<T> make_unique(Args &&... args) {
+      return impl_fut_stl::make_unique_helper<T>(
+                std::is_array<T>(), std::forward<Args>(args)...);
+   }
+}
+
diff --git a/g3log/g3log/stlpatch_future.hpp b/g3log/g3log/stlpatch_future.hpp
new file mode 100644
index 0000000..80cf867
--- /dev/null
+++ b/g3log/g3log/stlpatch_future.hpp
@@ -0,0 +1,81 @@
+/** ==========================================================================
+* 2013  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
+*
+*
+* 2013/12/28 Bugfix for Visual Studio 2013 which does not handle well
+* std::packaged_task<void()>. Thanks to Michael Rasmussen (lap777)
+* Ref: workarounds at http://connect.microsoft.com/VisualStudio/feedback/details/791185/std-packaged-task-t-where-t-is-void-or-a-reference-class-are-not-movable
+* ============================================================================*/
+
+
+
+#pragma once
+#if (defined(WIN32) || defined(_WIN32) || defined(__WIN32__)) && !defined(__MINGW32__)
+namespace std {
+
+   template<class... _ArgTypes>
+   class packaged_task<void(_ArgTypes...)>
+   {
+      promise<void> _my_promise;
+      function<void(_ArgTypes...)> _my_func;
+
+   public:
+      packaged_task() {
+      }
+
+      template<class _Fty2>
+      explicit packaged_task(_Fty2 &&_Fnarg)
+         : _my_func(_Fnarg) {
+      }
+
+      packaged_task(packaged_task &&_Other)
+         : _my_promise(move(_Other._my_promise)),
+           _my_func(move(_Other._my_func)) {
+      }
+
+      packaged_task &operator=(packaged_task && _Other) {
+         _my_promise = move(_Other._my_promise);
+         _my_func = move(_Other._my_func);
+         return (*this);
+      }
+
+      packaged_task(const packaged_task &) = delete;
+      packaged_task &operator=(const packaged_task &) = delete;
+
+      ~packaged_task() {
+      }
+
+      void swap(packaged_task &_Other) {
+         swap(_my_promise, _Other._my_promise);
+         swap(_my_func, _Other._my_func);
+      }
+
+      explicit operator bool() const {
+         return _my_func != false;
+      }
+
+      bool valid() const {
+         return _my_func != false;
+      }
+
+      future<void> get_future() {
+         return _my_promise.get_future();
+      }
+
+      void operator()(_ArgTypes... _Args) {
+         _my_func(forward<_ArgTypes>(_Args)...);
+         _my_promise.set_value();
+      }
+
+      void reset() {
+         _my_promise.swap(promise<void>());
+         _my_func.swap(function<void(_ArgTypes...)>());
+      }
+   };
+
+}; // namespace std
+#endif // defined(WIN32) ...
diff --git a/g3log/g3log/time.hpp b/g3log/g3log/time.hpp
new file mode 100644
index 0000000..6227972
--- /dev/null
+++ b/g3log/g3log/time.hpp
@@ -0,0 +1,70 @@
+#pragma once
+/** ==========================================================================
+* 2012 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
+* ============================================================================
+* Filename:g3time.h cross-platform, thread-safe replacement for C++11 non-thread-safe
+*                   localtime (and similar)
+* Created: 2012 by Kjell Hedström
+*
+* PUBLIC DOMAIN and Not under copywrite protection. First published for g3log at KjellKod.cc
+* ********************************************* */
+
+#include <ctime>
+#include <string>
+#include <chrono>
+
+// FYI:
+// namespace g3::internal ONLY in g3time.cpp
+//          std::string put_time(const struct tm* tmb, const char* c_time_format)
+
+namespace g3 {
+   namespace internal {
+      enum class Fractional {Millisecond, Microsecond, Nanosecond, NanosecondDefault};
+      Fractional getFractional(const std::string& format_buffer, size_t pos);
+      std::string to_string(const timespec& time_snapshot, Fractional fractional);
+      static const std::string date_formatted = "%Y/%m/%d";
+      // %f: fractions of seconds (%f is nanoseconds)
+      // %f3: milliseconds, 3 digits: 001
+      // %6: microseconds: 6 digits: 000001  --- default for the time_format
+      // %f9, %f: nanoseconds, 9 digits: 000000001
+      static const std::string time_formatted = "%H:%M:%S %f6";
+   } // internal
+
+   typedef std::chrono::time_point<std::chrono::system_clock>  system_time_point;
+   typedef std::chrono::milliseconds milliseconds;
+   typedef std::chrono::microseconds microseconds;
+
+      
+
+   //  custom wrap for std::chrono::system_clock::now()but this one 
+   // returns timespec struct instead which is what we use in g3log
+   struct timespec systemtime_now();
+
+   // OSX, Windows needed wrapper for std::timespec_get(struct timespec *ts, int base)
+   //   OSX and Windows also lacks the POSIX clock_gettime(int base, struct timespec *ts)
+   //   so for that reason we go with the std::timespec_get(...) but wrap it
+   int timespec_get(struct timespec* ts/*, int base*/);
+
+   // This mimics the original "std::put_time(const std::tm* tmb, const charT* fmt)"
+   // This is needed since latest version (at time of writing) of gcc4.7 does not implement this library function yet.
+   // return value is SIMPLIFIED to only return a std::string
+   std::string put_time(const struct tm* tmb, const char* c_time_format);
+
+   /** return time representing POD struct (ref ctime + wchar) that is normally
+   * retrieved with std::localtime. g3::localtime is threadsafe which std::localtime is not.
+   * g3::localtime is probably used together with @ref g3::systemtime_now */
+   tm localtime(const std::time_t& time);
+
+   /** format string must conform to std::put_time's demands.
+   * WARNING: At time of writing there is only so-so compiler support for
+   * std::put_time. A possible fix if your c++11 library is not updated is to
+   * modify this to use std::strftime instead */
+   std::string localtime_formatted(const timespec& time_snapshot, const std::string& time_format) ;
+}
+
+
+
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;
+   }
+}
+
+
diff --git a/g3log/loglevels.cpp b/g3log/loglevels.cpp
new file mode 100644
index 0000000..01a5713
--- /dev/null
+++ b/g3log/loglevels.cpp
@@ -0,0 +1,77 @@
+/** ==========================================================================
+* 2012 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/loglevels.hpp"
+#include <atomic>
+#include <cassert>
+#include <map>
+
+namespace {
+   namespace {
+      /// As suggested in: http://stackoverflow.com/questions/13193484/how-to-declare-a-vector-of-atomic-in-c
+      struct atomicbool {
+       private:
+         std::atomic<bool> value_;
+       public:
+         atomicbool(): value_ {false} {}
+         atomicbool(const bool &value): value_ {value} {}
+         atomicbool(const std::atomic<bool> &value) : value_ {value.load(std::memory_order_acquire)} {}
+         atomicbool(const atomicbool &other): value_ {other.value_.load(std::memory_order_acquire)} {}
+         atomicbool &operator=(const atomicbool &other) {
+            value_.store(other.value_.load(std::memory_order_acquire), std::memory_order_release);
+            return *this;
+         }
+         bool value() {return value_.load(std::memory_order_acquire);}
+         std::atomic<bool>& get() {return value_;}
+      };
+
+   } // anonymous
+
+}
+namespace g3 {
+   namespace internal {
+      bool wasFatal(const LEVELS &level) {
+         return level.value >= FATAL.value;
+      }
+
+#ifdef G3_DYNAMIC_LOGGING
+      std::map<int, atomicbool> g_log_level_status = {{g3::kDebugValue, true}, {INFO.value, true}, {WARNING.value, true}, {FATAL.value, true}};
+#endif
+   } // internal
+
+#ifdef G3_DYNAMIC_LOGGING
+   namespace only_change_at_initialization {
+      void setLogLevel(LEVELS log_level, bool enabled) {
+         int level = log_level.value;
+         internal::g_log_level_status[level].get().store(enabled, std::memory_order_release);
+      }
+
+      std::string printLevels() {
+         std::string levels;
+         for (auto& v : internal::g_log_level_status) {
+            levels += "value: " + std::to_string(v.first) + " status: " + std::to_string(v.second.value()) + "\n";
+         }
+         return levels;
+      }
+
+      void reset() {
+         internal::g_log_level_status.clear();
+         internal::g_log_level_status = std::map<int, atomicbool>{{g3::kDebugValue, true}, {INFO.value, true}, {WARNING.value, true}, {FATAL.value, true}};
+      }
+   } // only_change_at_initialization
+#endif
+
+   bool logLevel(LEVELS log_level) {
+#ifdef G3_DYNAMIC_LOGGING
+      int level = log_level.value;
+      bool status = internal::g_log_level_status[level].value();
+      return status;
+#endif
+      return true;
+   }
+} // g3
diff --git a/g3log/logmessage.cpp b/g3log/logmessage.cpp
new file mode 100644
index 0000000..038b5f7
--- /dev/null
+++ b/g3log/logmessage.cpp
@@ -0,0 +1,199 @@
+/** ==========================================================================
+* 2012 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/logmessage.hpp"
+#include "g3log/crashhandler.hpp"
+#include "g3log/time.hpp"
+#include <mutex>
+
+namespace {
+   std::string splitFileName(const std::string& str) {
+      size_t found;
+      found = str.find_last_of("(/\\");
+      return str.substr(found + 1);
+   }
+} // anonymous
+
+
+
+namespace g3 {
+
+
+   // helper for setting the normal log details in an entry
+   std::string LogDetailsToString(const LogMessage& msg) {
+      std::string out;
+      out.append(msg.timestamp() + "\t"
+                 + msg.level() + " [" + msg.file() + "->" + msg.function() + ":" + msg.line() + "]\t");
+      return out;
+   }
+
+
+   // helper for normal
+   std::string normalToString(const LogMessage& msg) {
+      auto out = LogDetailsToString(msg);
+      out.append(msg.message() + '\n');
+      return out;
+   }
+
+   // helper for fatal signal
+   std::string  fatalSignalToString(const LogMessage& msg) {
+      std::string out; // clear any previous text and formatting
+      out.append(msg.timestamp()
+                 + "\n\n***** FATAL SIGNAL RECEIVED ******* \n"
+                 + msg.message() + '\n');
+      return out;
+   }
+
+
+   // helper for fatal exception (windows only)
+   std::string  fatalExceptionToString(const LogMessage& msg) {
+      std::string out; // clear any previous text and formatting
+      out.append(msg.timestamp()
+                 + "\n\n***** FATAL EXCEPTION RECEIVED ******* \n"
+                 + msg.message() + '\n');
+      return out;
+   }
+
+
+   // helper for fatal LOG
+   std::string fatalLogToString(const LogMessage& msg) {
+      auto out = LogDetailsToString(msg);
+      static const std::string fatalExitReason = {"EXIT trigger caused by LOG(FATAL) entry: "};
+      out.append("\n\t*******\t " + fatalExitReason + "\n\t" + '"' + msg.message() + '"');
+      return out;
+   }
+
+   // helper for fatal CHECK
+   std::string fatalCheckToString(const LogMessage& msg) {
+      auto out = LogDetailsToString(msg);
+      static const std::string contractExitReason = {"EXIT trigger caused by broken Contract:"};
+      out.append("\n\t*******\t " + contractExitReason + " CHECK(" + msg.expression() + ")\n\t"
+                 + '"' + msg. message() + '"');
+      return out;
+   }
+
+
+   // Format the log message according to it's type
+   std::string LogMessage::toString() const {
+      if (false == wasFatal()) {
+         return normalToString(*this);
+      }
+
+      const auto level_value = _level.value;
+      if (internal::FATAL_SIGNAL.value == _level.value) {
+         return fatalSignalToString(*this);
+      }
+
+      if (internal::FATAL_EXCEPTION.value == _level.value) {
+         return fatalExceptionToString(*this);
+      }
+
+      if (FATAL.value == _level.value) {
+         return fatalLogToString(*this);
+      }
+
+      if (internal::CONTRACT.value == level_value) {
+         return fatalCheckToString(*this);
+      }
+
+      // What? Did we hit a custom made level?
+      auto out = LogDetailsToString(*this);
+      static const std::string errorUnknown = {"UNKNOWN or Custom made Log Message Type"};
+      out.append("\t*******" + errorUnknown + "\n\t" + message() + '\n');
+      return out;
+   }
+
+
+
+   std::string LogMessage::timestamp(const std::string& time_look) const {
+      return g3::localtime_formatted(_timestamp, time_look);
+   }
+
+
+// By copy, not by reference. See this explanation for details:
+// http://stackoverflow.com/questions/3279543/what-is-the-copy-and-swap-idiom
+   LogMessage& LogMessage::operator=(LogMessage other) {
+      swap(*this, other);
+      return *this;
+   }
+
+
+   LogMessage::LogMessage(const std::string& file, const int line,
+                          const std::string& function, const LEVELS& level)
+      : _call_thread_id(std::this_thread::get_id())
+      , _file(splitFileName(file))
+      , _file_path(file)
+      , _line(line)
+      , _function(function)
+      , _level(level)
+   {
+      g3::timespec_get(&_timestamp/*, TIME_UTC*/);
+      // Another possibility could be to Falling back to clock_gettime as TIME_UTC 
+      // is not recognized by travis CI. 
+      // i.e. clock_gettime(CLOCK_REALTIME, &_timestamp);
+   }
+
+
+   LogMessage::LogMessage(const std::string& fatalOsSignalCrashMessage)
+      : LogMessage( {""}, 0, {""}, internal::FATAL_SIGNAL) {
+      _message.append(fatalOsSignalCrashMessage);
+   }
+
+   LogMessage::LogMessage(const LogMessage& other)
+      : _timestamp(other._timestamp)
+      , _call_thread_id(other._call_thread_id)
+      , _file(other._file)
+      , _file_path(other._file_path)
+      , _line(other._line)
+      , _function(other._function)
+      , _level(other._level)
+      , _expression(other._expression)
+      , _message(other._message) {
+   }
+
+   LogMessage::LogMessage(LogMessage &&other)
+      : _timestamp(other._timestamp)
+      , _call_thread_id(other._call_thread_id)
+      , _file(std::move(other._file))
+      , _file_path(std::move(other._file_path))
+      , _line(other._line)
+      , _function(std::move(other._function))
+      , _level(other._level)
+      , _expression(std::move(other._expression))
+      , _message(std::move(other._message)) {
+   }
+
+
+
+   std::string LogMessage::threadID() const {
+      std::ostringstream oss;
+      oss << _call_thread_id;
+      return oss.str();
+   }
+
+
+
+   FatalMessage::FatalMessage(const LogMessage& details, g3::SignalType signal_id)
+      : LogMessage(details), _signal_id(signal_id) { }
+
+
+
+   FatalMessage::FatalMessage(const FatalMessage& other)
+      : LogMessage(other), _signal_id(other._signal_id) {}
+
+
+   LogMessage  FatalMessage::copyToLogMessage() const {
+      return LogMessage(*this);
+   }
+
+   std::string FatalMessage::reason() const {
+      return internal::exitReasonName(_level, _signal_id);
+   }
+
+
+} // g3
diff --git a/g3log/logworker.cpp b/g3log/logworker.cpp
new file mode 100644
index 0000000..3f469d4
--- /dev/null
+++ b/g3log/logworker.cpp
@@ -0,0 +1,130 @@
+/** ==========================================================================
+* 2011 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/logworker.hpp"
+#include "g3log/logmessage.hpp"
+#include "g3log/active.hpp"
+#include "g3log/g3log.hpp"
+#include "g3log/future.hpp"
+#include "g3log/crashhandler.hpp"
+
+#include <iostream>
+
+namespace g3 {
+
+   LogWorkerImpl::LogWorkerImpl() : _bg(kjellkod::Active::createActive()) { }
+
+   void LogWorkerImpl::bgSave(g3::LogMessagePtr msgPtr) {
+      std::unique_ptr<LogMessage> uniqueMsg(std::move(msgPtr.get()));
+
+      for (auto& sink : _sinks) {
+         LogMessage msg(*(uniqueMsg));
+         sink->send(LogMessageMover(std::move(msg)));
+      }
+
+      if (_sinks.empty()) {
+         std::string err_msg {"g3logworker has no sinks. Message: ["};
+         err_msg.append(uniqueMsg.get()->toString()).append({"]\n"});
+         std::cerr << err_msg;
+      }
+   }
+
+   void LogWorkerImpl::bgFatal(FatalMessagePtr msgPtr) {
+      // this will be the last message. Only the active logworker can receive a FATAL call so it's
+      // safe to shutdown logging now
+      g3::internal::shutDownLogging();
+
+      std::string reason = msgPtr.get()->reason();
+      const auto level = msgPtr.get()->_level;
+      const auto fatal_id = msgPtr.get()->_signal_id;
+
+
+      std::unique_ptr<LogMessage> uniqueMsg(std::move(msgPtr.get()));
+      uniqueMsg->write().append("\nExiting after fatal event  (").append(uniqueMsg->level());
+
+
+      // Change output in case of a fatal signal (or windows exception)
+      std::string exiting = {"Fatal type: "};
+
+      uniqueMsg->write().append("). ").append(exiting).append(" ").append(reason)
+      .append("\nLog content flushed sucessfully to sink\n\n");
+
+      std::cerr << uniqueMsg->toString() << std::flush;
+      for (auto& sink : _sinks) {
+         LogMessage msg(*(uniqueMsg));
+         sink->send(LogMessageMover(std::move(msg)));
+      }
+
+
+      // This clear is absolutely necessary
+      // All sinks are forced to receive the fatal message above before we continue
+      _sinks.clear(); // flush all queues
+      internal::exitWithDefaultSignalHandler(level, fatal_id);
+
+      // should never reach this point
+      perror("g3log exited after receiving FATAL trigger. Flush message status: ");
+   }
+
+   LogWorker::~LogWorker() {
+      g3::internal::shutDownLoggingForActiveOnly(this);
+
+      // The sinks WILL automatically be cleared at exit of this destructor
+      // However, the waiting below ensures that all messages until this point are taken care of
+      // before any internals/LogWorkerImpl of LogWorker starts to be destroyed.
+      // i.e. this avoids a race with another thread slipping through the "shutdownLogging" and calling
+      // calling ::save or ::fatal through LOG/CHECK with lambda messages and "partly deconstructed LogWorkerImpl"
+      //
+      //   Any messages put into the queue will be OK due to:
+      //  *) If it is before the wait below then they will be executed
+      //  *) If it is AFTER the wait below then they will be ignored and NEVER executed
+      auto bg_clear_sink_call = [this] { _impl._sinks.clear(); };
+      auto token_cleared = g3::spawn_task(bg_clear_sink_call, _impl._bg.get());
+      token_cleared.wait();
+
+      // The background worker WILL be automatically cleared at the exit of the destructor
+      // However, the explicitly clearing of the background worker (below) makes sure that there can
+      // be no thread that manages to add another sink after the call to clear the sinks above.
+      //   i.e. this manages the extremely unlikely case of another thread calling
+      // addWrappedSink after the sink clear above. Normally adding of sinks should be done in main.cpp
+      // and be closely coupled with the existance of the LogWorker. Sharing this adding of sinks to
+      // other threads that do not know the state of LogWorker is considered a bug but it is dealt with
+      // nonetheless below.
+      //
+      // If sinks would already have been added after the sink clear above then this reset will deal with it
+      // without risking lambda execution with a partially deconstructed LogWorkerImpl
+      // Calling g3::spawn_task on a nullptr Active object will not crash but return
+      // a future containing an appropriate exception.
+      _impl._bg.reset(nullptr);
+   }
+
+   void LogWorker::save(LogMessagePtr msg) {
+      _impl._bg->send([this, msg] {_impl.bgSave(msg); });
+   }
+
+   void LogWorker::fatal(FatalMessagePtr fatal_message) {
+      _impl._bg->send([this, fatal_message] {_impl.bgFatal(fatal_message); });
+   }
+
+   void LogWorker::addWrappedSink(std::shared_ptr<g3::internal::SinkWrapper> sink) {
+      auto bg_addsink_call = [this, sink] {_impl._sinks.push_back(sink);};
+      auto token_done = g3::spawn_task(bg_addsink_call, _impl._bg.get());
+      token_done.wait();
+   }
+
+   std::unique_ptr<LogWorker> LogWorker::createLogWorker() {
+      return std::unique_ptr<LogWorker>(new LogWorker);
+   }
+
+   std::unique_ptr<FileSinkHandle>LogWorker::addDefaultLogger(const std::string& log_prefix, const std::string& log_directory, const std::string& default_id) {
+      return addSink(std2::make_unique<g3::FileSink>(log_prefix, log_directory, default_id), &FileSink::fileWrite);
+   }
+
+
+
+
+} // g3
diff --git a/g3log/stacktrace_windows.cpp b/g3log/stacktrace_windows.cpp
new file mode 100644
index 0000000..cfdd69f
--- /dev/null
+++ b/g3log/stacktrace_windows.cpp
@@ -0,0 +1,222 @@
+/** ==========================================================================
+ * Original code made by Robert Engeln. Given as a PUBLIC DOMAIN dedication for
+ * the benefit of g3log.  It was originally published at:
+ * http://code-freeze.blogspot.com/2012/01/generating-stack-traces-from-c.html
+
+ * 2014-2015: adapted for g3log by Kjell Hedstrom (KjellKod).
+ *
+ * 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/stacktrace_windows.hpp"
+
+#include <windows.h>
+#include <dbghelp.h>
+#include <map>
+#include <memory>
+#include <cassert>
+#include <vector>
+#include <mutex>
+#include <g3log/g3log.hpp>
+
+#pragma comment(lib, "dbghelp.lib")
+
+
+#if !(defined(WIN32) || defined(_WIN32) || defined(__WIN32__))
+#error "stacktrace_win.cpp used but not on a windows system"
+#endif
+
+
+
+#define g3_MAP_PAIR_STRINGIFY(x) {x, #x}
+
+namespace {
+   thread_local size_t g_thread_local_recursive_crash_check = 0;
+
+   const std::map<g3::SignalType, std::string> kExceptionsAsText = {
+      g3_MAP_PAIR_STRINGIFY(EXCEPTION_ACCESS_VIOLATION)
+      , g3_MAP_PAIR_STRINGIFY(EXCEPTION_ARRAY_BOUNDS_EXCEEDED)
+      , g3_MAP_PAIR_STRINGIFY(EXCEPTION_DATATYPE_MISALIGNMENT)
+      , g3_MAP_PAIR_STRINGIFY(EXCEPTION_FLT_DENORMAL_OPERAND)
+      , g3_MAP_PAIR_STRINGIFY(EXCEPTION_FLT_DIVIDE_BY_ZERO)
+      , g3_MAP_PAIR_STRINGIFY(EXCEPTION_FLT_INEXACT_RESULT)
+      , g3_MAP_PAIR_STRINGIFY(EXCEPTION_FLT_INEXACT_RESULT)
+      , g3_MAP_PAIR_STRINGIFY(EXCEPTION_FLT_INVALID_OPERATION)
+      , g3_MAP_PAIR_STRINGIFY(EXCEPTION_FLT_OVERFLOW)
+      , g3_MAP_PAIR_STRINGIFY(EXCEPTION_FLT_STACK_CHECK)
+      , g3_MAP_PAIR_STRINGIFY(EXCEPTION_FLT_UNDERFLOW)
+      , g3_MAP_PAIR_STRINGIFY(EXCEPTION_ILLEGAL_INSTRUCTION)
+      , g3_MAP_PAIR_STRINGIFY(EXCEPTION_IN_PAGE_ERROR)
+      , g3_MAP_PAIR_STRINGIFY(EXCEPTION_INT_DIVIDE_BY_ZERO)
+      , g3_MAP_PAIR_STRINGIFY(EXCEPTION_INT_OVERFLOW)
+      , g3_MAP_PAIR_STRINGIFY(EXCEPTION_INVALID_DISPOSITION)
+      , g3_MAP_PAIR_STRINGIFY(EXCEPTION_NONCONTINUABLE_EXCEPTION)
+      , g3_MAP_PAIR_STRINGIFY(EXCEPTION_PRIV_INSTRUCTION)
+      , g3_MAP_PAIR_STRINGIFY(EXCEPTION_STACK_OVERFLOW)
+      , g3_MAP_PAIR_STRINGIFY(EXCEPTION_BREAKPOINT)
+      , g3_MAP_PAIR_STRINGIFY(EXCEPTION_SINGLE_STEP)
+
+   };
+
+
+   // Using the given context, fill in all the stack frames.
+   // Which then later can be interpreted to human readable text
+   void captureStackTrace(CONTEXT *context, std::vector<uint64_t> &frame_pointers) {
+      DWORD machine_type = 0;
+      STACKFRAME64 frame = {}; // force zeroeing
+      frame.AddrPC.Mode = AddrModeFlat;
+      frame.AddrFrame.Mode = AddrModeFlat;
+      frame.AddrStack.Mode = AddrModeFlat;
+#ifdef _M_X64
+      frame.AddrPC.Offset = context->Rip;
+      frame.AddrFrame.Offset = context->Rbp;
+      frame.AddrStack.Offset = context->Rsp;
+      machine_type = IMAGE_FILE_MACHINE_AMD64;
+#else
+      frame.AddrPC.Offset = context->Eip;
+      frame.AddrPC.Offset = context->Ebp;
+      frame.AddrPC.Offset = context->Esp;
+      machine_type = IMAGE_FILE_MACHINE_I386;
+#endif
+      for (size_t index = 0; index < frame_pointers.size(); ++index)
+      {
+         if (StackWalk64(machine_type,
+                         GetCurrentProcess(),
+                         GetCurrentThread(),
+                         &frame,
+                         context,
+                         NULL,
+                         SymFunctionTableAccess64,
+                         SymGetModuleBase64,
+                         NULL)) {
+            frame_pointers[index] = frame.AddrPC.Offset;
+         } else {
+            break;
+         }
+      }
+   }
+
+
+
+   // extract readable text from a given stack frame. All thanks to
+   // using SymFromAddr and SymGetLineFromAddr64 with the stack pointer
+   std::string getSymbolInformation(const size_t index, const std::vector<uint64_t> &frame_pointers) {
+      auto addr = frame_pointers[index];
+      std::string frame_dump = "stack dump [" + std::to_string(index) + "]\t";
+
+      DWORD64 displacement64;
+      DWORD displacement;
+      char symbol_buffer[sizeof(SYMBOL_INFO) + 256];
+      SYMBOL_INFO *symbol = reinterpret_cast<SYMBOL_INFO *>(symbol_buffer);
+      symbol->SizeOfStruct = sizeof(SYMBOL_INFO);
+      symbol->MaxNameLen = MAX_SYM_NAME;
+
+      IMAGEHLP_LINE64 line;
+      line.SizeOfStruct = sizeof(IMAGEHLP_LINE64);
+      std::string lineInformation;
+      std::string callInformation;
+      if (SymFromAddr(GetCurrentProcess(), addr, &displacement64, symbol)) {
+         callInformation.append(" ").append({symbol->Name, symbol->NameLen});
+         if (SymGetLineFromAddr64(GetCurrentProcess(), addr, &displacement, &line)) {
+            lineInformation.append("\t").append(line.FileName).append(" L: ");
+            lineInformation.append(std::to_string(line.LineNumber));
+         }
+      }
+      frame_dump.append(lineInformation).append(callInformation);
+      return frame_dump;
+   }
+
+
+   // Retrieves all the symbols for the stack frames, fills them witin a text representation and returns it
+   std::string convertFramesToText(std::vector<uint64_t> &frame_pointers) {
+      std::string dump; // slightly more efficient than ostringstream
+      const size_t kSize = frame_pointers.size();
+      for (size_t index = 0; index < kSize && frame_pointers[index]; ++index) {
+         dump += getSymbolInformation(index, frame_pointers);
+         dump += "\n";
+      }
+      return dump;
+   }
+} // anonymous
+
+
+
+
+namespace stacktrace {
+   const std::string kUnknown = {"UNKNOWN EXCEPTION"};
+   /// return the text description of a Windows exception code
+   /// From MSDN GetExceptionCode http://msdn.microsoft.com/en-us/library/windows/desktop/ms679356(v=vs.85).aspx
+   std::string exceptionIdToText(g3::SignalType id) {
+      const auto iter = kExceptionsAsText.find(id);
+      if ( iter == kExceptionsAsText.end()) {
+         std::string unknown = {kUnknown + ":" + std::to_string(id)};
+         return unknown;
+      }
+      return iter->second;
+   }
+
+   /// Yes a double lookup: first for isKnownException and then exceptionIdToText
+   /// for vectored exceptions we only deal with known exceptions so this tiny
+   /// overhead we can live with
+   bool isKnownException(g3::SignalType id) {
+      return (kExceptionsAsText.end() != kExceptionsAsText.find(id));
+   }
+
+   /// helper function: retrieve stackdump from no excisting exception pointer
+   std::string stackdump() {
+      CONTEXT current_context;
+      memset(&current_context, 0, sizeof(CONTEXT));
+      RtlCaptureContext(&current_context);
+      return stackdump(&current_context);
+   }
+
+   /// helper function: retrieve stackdump, starting from an exception pointer
+   std::string stackdump(EXCEPTION_POINTERS *info) {
+      auto context = info->ContextRecord;
+      return stackdump(context);
+
+   }
+
+
+   /// main stackdump function. retrieve stackdump, from the given context
+   std::string stackdump(CONTEXT *context) {
+
+      if (g_thread_local_recursive_crash_check >= 2) { // In Debug scenarious we allow one extra pass
+         std::string recursive_crash = {"\n\n\n***** Recursive crash detected"};
+         recursive_crash.append(", cannot continue stackdump traversal. *****\n\n\n");
+         return recursive_crash;
+      }
+      ++g_thread_local_recursive_crash_check;
+
+      static std::mutex m;
+      std::lock_guard<std::mutex> lock(m);
+      {
+         const BOOL kLoadSymModules = TRUE;
+         const auto initialized = SymInitialize(GetCurrentProcess(), nullptr, kLoadSymModules);
+         if (TRUE != initialized) {
+            return { "Error: Cannot call SymInitialize(...) for retrieving symbols in stack" };
+         }
+
+         std::shared_ptr<void> RaiiSymCleaner(nullptr, [&](void *) {
+            SymCleanup(GetCurrentProcess());
+         }); // Raii sym cleanup
+
+
+         const size_t kmax_frame_dump_size = 64;
+         std::vector<uint64_t>  frame_pointers(kmax_frame_dump_size);
+         // C++11: size set and values are zeroed
+
+         assert(frame_pointers.size() == kmax_frame_dump_size);
+         captureStackTrace(context, frame_pointers);
+         return convertFramesToText(frame_pointers);
+      }
+   }
+
+} // stacktrace
+
+
+
diff --git a/g3log/time.cpp b/g3log/time.cpp
new file mode 100644
index 0000000..937e5d0
--- /dev/null
+++ b/g3log/time.cpp
@@ -0,0 +1,191 @@
+/** ==========================================================================
+* 2012 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/time.hpp"
+
+#include <sstream>
+#include <string>
+#include <cstring>
+#include <cmath>
+#include <chrono>
+#include <cassert>
+#include <iomanip>
+#ifdef __MACH__
+#include <sys/time.h>
+#endif
+
+namespace g3 {
+   namespace internal {
+      const std::string kFractionalIdentier   = "%f";
+      const size_t kFractionalIdentierSize = 2;
+
+
+
+      Fractional getFractional(const std::string& format_buffer, size_t pos) {
+         char  ch  = (format_buffer.size() > pos + kFractionalIdentierSize ? format_buffer.at(pos + kFractionalIdentierSize) : '\0');
+         Fractional type = Fractional::NanosecondDefault;
+         switch (ch) {
+            case '3': type = Fractional::Millisecond; break;
+            case '6': type = Fractional::Microsecond; break;
+            case '9': type = Fractional::Nanosecond; break;
+            default: type = Fractional::NanosecondDefault; break;
+         }
+         return type;
+      }
+
+
+      // Returns the fractional as a string with padded zeroes
+      // 1 ms --> 001
+      // 1 us --> 000001
+      // 1 ns --> 000000001
+      std::string to_string(const timespec& time_snapshot, Fractional fractional) {
+         auto ns = time_snapshot.tv_nsec;
+         auto zeroes = 9; // default ns
+         auto digitsToCut = 1; // default ns, divide by 1 makes no change
+         switch (fractional) {
+            case Fractional::Millisecond : {
+               zeroes = 3;
+               digitsToCut = 1000000;
+               break;
+            }
+            case Fractional::Microsecond : {
+               zeroes = 6;
+               digitsToCut = 1000;
+               break;
+            }
+            case Fractional::Nanosecond :
+            case Fractional::NanosecondDefault:
+            default:
+               zeroes = 9;
+               digitsToCut = 1;
+
+         }
+
+         ns /= digitsToCut;
+         // auto value = std::to_string(typeAdjustedValue);
+         // return value; // std::string(fractional_digit, '0') + value;
+         auto value = std::string(std::to_string(ns));
+         return std::string(zeroes - value.size(), '0') + value;
+      }
+   } // internal
+} // g3
+
+
+
+namespace g3 {
+   struct timespec systemtime_now() {
+      struct timespec ts;
+      timespec_get(&ts);
+      return ts;
+   }
+
+
+   // std::timespec_get or posix clock_gettime)(...) are not
+   // implemented on OSX and ubuntu gcc5 has no support for std::timespec_get(...) as of yet
+   // so instead we roll our own.
+   int timespec_get(struct timespec* ts/*, int base*/) {
+      using namespace std::chrono;
+      
+      // thanks @AndreasSchoenle for the implementation and the explanation:
+      // The time since epoch for the steady_clock is not necessarily really the time since 1970.
+      // It usually is the time since program start. Thus, here is calculated the offset between 
+      // the starting point and the real start of the epoch as reported by the system clock 
+      // with the precision of the system clock. 
+      // 
+      // Time stamps will later have system clock accuracy but relative times will have the precision
+      // of the high resolution clock.   
+      thread_local const auto os_system =
+         time_point_cast<nanoseconds>(system_clock::now()).time_since_epoch();
+      thread_local const auto os_high_resolution = 
+         time_point_cast<nanoseconds>(high_resolution_clock::now()).time_since_epoch();
+      thread_local auto os = os_system - os_high_resolution;
+
+      // 32-bit system work-around, where apparenetly the os correction above could sometimes 
+      // become negative. This correction will only be done once per thread
+      if (os.count() < 0 ) {
+         os =  os_system;
+      }
+
+      auto now_ns = (time_point_cast<nanoseconds>(high_resolution_clock::now()).time_since_epoch() + os).count();
+      const auto kNanos = 1000000000;
+      ts ->tv_sec = now_ns / kNanos;
+      ts ->tv_nsec = now_ns % kNanos;
+      #ifdef TIME_UTC
+         return TIME_UTC;
+      #endif
+      return 1;
+   }
+
+
+
+   // This mimics the original "std::put_time(const std::tm* tmb, const charT* fmt)"
+   // This is needed since latest version (at time of writing) of gcc4.7 does not implement this library function yet.
+   // return value is SIMPLIFIED to only return a std::string
+   std::string put_time(const struct tm* tmb, const char* c_time_format) {
+#if (defined(WIN32) || defined(_WIN32) || defined(__WIN32__)) && !defined(__MINGW32__)
+      std::ostringstream oss;
+      oss.fill('0');
+      // BOGUS hack done for VS2012: C++11 non-conformant since it SHOULD take a "const struct tm*  "
+      oss << std::put_time(const_cast<struct tm*> (tmb), c_time_format);
+      return oss.str();
+#else    // LINUX
+      const size_t size = 1024;
+      char buffer[size]; // IMPORTANT: check now and then for when gcc will implement std::put_time.
+      //                    ... also ... This is way more buffer space then we need
+
+      auto success = std::strftime(buffer, size, c_time_format, tmb);
+      // In DEBUG the assert will trigger a process exit. Once inside the if-statement
+      // the 'always true' expression will be displayed as reason for the exit
+      //
+      // In Production mode
+      // the assert will do nothing but the format string will instead be returned
+      if (0 == success) {
+         assert((0 != success) && "strftime fails with illegal formatting");
+         return c_time_format;
+      }
+
+      return buffer;
+#endif
+   }
+
+
+
+   tm localtime(const std::time_t& time) {
+      struct tm tm_snapshot;
+#if (defined(WIN32) || defined(_WIN32) || defined(__WIN32__) && !defined(__GNUC__))
+      localtime_s(&tm_snapshot, &time); // windsows
+#else
+      localtime_r(&time, &tm_snapshot); // POSIX
+#endif
+      return tm_snapshot;
+   }
+
+
+
+
+   std::string localtime_formatted(const timespec& time_snapshot, const std::string& time_format) {
+      auto format_buffer = time_format;  // copying format string to a separate buffer
+
+      // iterating through every "%f" instance in the format string
+      auto identifierExtraSize = 0;
+      for (size_t pos = 0; (pos = format_buffer.find(g3::internal::kFractionalIdentier, pos)) != std::string::npos; pos += g3::internal::kFractionalIdentierSize + identifierExtraSize) {
+         // figuring out whether this is nano, micro or milli identifier
+         auto type = g3::internal::getFractional(format_buffer, pos);
+         auto value = g3::internal::to_string(time_snapshot, type);
+         auto padding = 0;
+         if (type != g3::internal::Fractional::NanosecondDefault) {
+            padding = 1;
+         }
+
+         // replacing "%f[3|6|9]" with sec fractional part value
+         format_buffer.replace(pos, g3::internal::kFractionalIdentier.size() + padding, value);
+      }
+      std::tm t = localtime(time_snapshot.tv_sec);   
+      return g3::put_time(&t, format_buffer.c_str()); // format example: //"%Y/%m/%d %H:%M:%S");
+   }
+} // g3
