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
