diff --git a/src/Lib/Log.cc b/src/Lib/Log.cc
index ae989823b18773fd8d4a77dc52e300fe569cdfb2..7942c1d5ee2612eb7c76d6192c80e5ef30ecfed4 100644
--- a/src/Lib/Log.cc
+++ b/src/Lib/Log.cc
@@ -2,12 +2,32 @@
 
 using namespace Vivy;
 
+LogSink::~LogSink() noexcept {}
+
 LogMessage::~LogMessage() noexcept { parentLogger->sendLogMessage(*this); }
-Logger::~Logger() noexcept { parentLogSink->closeLoggerClient(this); }
+
+std::shared_ptr<LogSink>
+LogSink::newSink() noexcept
+{
+    struct makeSharedEnabler : public LogSink {
+        // NOTE: For make_shared with private CTor
+    };
+    return std::make_shared<makeSharedEnabler>();
+}
 
 void
 LogSink::closeLoggerClient(Logger *const logger) noexcept
 {
+    clientLoggers.erase(std::remove_if(std::begin(clientLoggers), std::end(clientLoggers),
+                                       [logger](const std::shared_ptr<Logger> &ptr) {
+                                           return ptr.get() == logger;
+                                       }));
+}
+
+void
+LogSink::closeLoggerClient(const std::shared_ptr<Logger> &ptr) noexcept
+{
+    closeLoggerClient(ptr.get());
 }
 
 LogMessage
diff --git a/src/Lib/Log.hh b/src/Lib/Log.hh
index fa109ff7092c484b947e46abfeebf3f1967b8bea..97f0697a02eb7899bcb27233f9f6563997a04f1a 100644
--- a/src/Lib/Log.hh
+++ b/src/Lib/Log.hh
@@ -5,13 +5,15 @@
 
 #define VIVY_NEW_LOG_SINK()             LogSink::newSink()
 #define VIVY_GET_LOGGER(sink, cat)      sink->createClient(cat)
-#define VIVY_LOG_WITH_LEVEL(log, level) log->logEvent(__FILE__, __function__, __LINE__, level)
+#define VIVY_LOG_WITH_LEVEL(log, level) log->logEvent(__FILE__, __func__, __LINE__, level)
 #define VIVY_LOG_WARN(log)              VIVY_LOG_WITH_LEVEL(log, LogLevel::Warning)
 #define VIVY_LOG_DEBUG(log)             VIVY_LOG_WITH_LEVEL(log, LogLevel::Debug)
 #define VIVY_LOG_INFO(log)              VIVY_LOG_WITH_LEVEL(log, LogLevel::Info)
 #define VIVY_LOG_ERR(log)               VIVY_LOG_WITH_LEVEL(log, LogLevel::Error)
 #define VIVY_LOG_FATAL(log)             VIVY_LOG_WITH_LEVEL(log, LogLevel::Critical)
 
+#define VIVY_DCL_LOG_SINK(sink) std::shared_ptr<LogSink> sink{ VIVY_NEW_LOG_SINK() };
+
 #define VIVY_LOGGABLE_OBJECT(sink, name, logger)                             \
     std::shared_ptr<Logger> logger = VIVY_GET_LOGGER(sink, name);            \
     LogMessage logFatal() const noexcept { return VIVY_LOG_FATAL(logger); }  \
@@ -35,7 +37,8 @@ enum class LogLevel : int {
     Error    = 4,
     Warning  = 3,
     Info     = 2,
-    Debug    = 1
+    Debug    = 1,
+    None     = std::numeric_limits<int>::min() // In option setup to disable logs
 };
 
 // Message to be logged, constructed by a logger then send
@@ -71,10 +74,9 @@ public:
 
 // A logger class, a client to LogSink. Will generate and send instances of
 // LogMessage.
-class Logger final {
+class Logger {
     VIVY_UNMOVABLE_OBJECT(Logger)
     friend class LogSink;
-    friend class std::shared_ptr<Logger>;
 
     LogSink *const parentLogSink;
     const std::string logCategory;
@@ -97,9 +99,17 @@ class Logger final {
     {
     }
 
-public:
-    ~Logger() noexcept;
+    // Shortcut because of std::make_shared
+    static std::shared_ptr<Logger> createAndAttachClient(LogSink *const sink,
+                                                         StringType auto const &category) noexcept
+    {
+        struct makeSharedEnabler : public Logger {
+            // NOTE: For make_shared with private CTor
+        };
+        return std::make_shared<makeSharedEnabler>(sink, category);
+    }
 
+public:
     void sendLogMessage(const LogMessage &) const noexcept;
     LogMessage logEvent(const char *fileName, const char *functionName, const int lineNumber,
                         const LogLevel) noexcept;
@@ -107,19 +117,20 @@ public:
 
 // LogSink is the parent logger. It will recieve messages and display them to a
 // console or to std::cerr or to a file, etc.
-class LogSink final {
+class LogSink {
     VIVY_UNMOVABLE_OBJECT(LogSink)
 
-    LogSink() noexcept;
+    LogSink() noexcept = default;
 
 public:
     static std::shared_ptr<LogSink> newSink() noexcept;
     ~LogSink() noexcept;
 
     void closeLoggerClient(Logger *const) noexcept;
+    void closeLoggerClient(const std::shared_ptr<Logger> &) noexcept;
     std::shared_ptr<Logger> createClient(StringType auto const &category) noexcept
     {
-        auto ret = std::make_shared<Logger>(this, category);
+        auto ret = Logger::createAndAttachClient(this, category);
         clientLoggers.push_back(ret);
         return ret;
     }