diff --git a/CMakeLists.txt b/CMakeLists.txt
index 472ec5debc78272fe08faae94a9a7c3a7a9aef43..8ecf5472474cab549a6d5d2c56645bbaf48bb66c 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -70,20 +70,57 @@ target_link_libraries(Vivy PRIVATE lua)
 target_include_directories(Vivy PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/inc)
 target_precompile_headers(Vivy PRIVATE
     # Private Vivy headers
-    ${Vivy_INC}
+    # ${Vivy_INC}
 
     # STL headers
     <memory>
     <vector>
     <atomic>
+    <algorithm>
+    <stdexcept>
+    <sstream>
+    <map>
+
 
     # Qt headers
+    <QtGlobal>
+    <QObject>
+    <QRegularExpression>
+    <QRegExp>
     <QString>
+    <QVariant>
+    <QFile>
+
     <QList>
     <QVector>
     <QMap>
+
+    <QJsonObject>
+    <QJsonArray>
+    <QJsonDocument>
+
+    <QTextDocument>
+    <QColor>
     <QWidget>
     <QIcon>
+    <QFont>
+    <QPixmap>
+    <QApplication>
+    <QCloseEvent>
+    <QLabel>
+    <QPushButton>
+    <QVBoxLayout>
+    <QHBoxLayout>
+    <QEvent>
+    <QMouseEvent>
+    <QTextEdit>
+    <QDockWidget>
+    <QMenu>
+    <QFileDialog>
+    <QMutex>
+    <QMainWindow>
+    <QPainter>
+    <QPlainTextEdit>
 )
 
 # Set Vivy's needed C++ features
@@ -133,6 +170,7 @@ if (${CMAKE_CXX_COMPILER_ID} STREQUAL "Clang")
         # Disable some things because we want C++20 and don't constrol some Qt
         # generated files... Also permit VLA
         -Wno-c++98-compat -Wno-c++98-c++11-c++14-c++17-compat-pedantic
+        -Wno-c++98-compat-pedantic -Wno-old-style-cast
         -Wno-extra-semi-stmt
         -Wno-redundant-parens
         -Wno-padded
diff --git a/src/Lib/AbstractMediaContext.hh b/src/Lib/AbstractMediaContext.hh
index a2611c1d92e8f0f16c52c2ce7f332fea8ba70881..35ada2ed4bf2193d0083d4ffe166f4f4b76ee720 100644
--- a/src/Lib/AbstractMediaContext.hh
+++ b/src/Lib/AbstractMediaContext.hh
@@ -14,13 +14,6 @@ extern "C" {
 }
 
 #include "Utils.hh"
-#include <QtGlobal>
-#include <QMap>
-#include <QVector>
-#include <QString>
-#include <QJsonObject>
-#include <QJsonDocument>
-#include <QJsonArray>
 
 namespace Vivy
 {
@@ -61,8 +54,8 @@ protected:
         : codecId(streamArg->codecpar->codec_id)
         , codec(streamCodec)
         , codecParams(streamArg->codecpar)
-        , stream(streamArg)
         , dataFormat(formatArg)
+        , stream(streamArg)
         , streamIndexInContext(index)
     {
         if (codec == nullptr)
@@ -166,6 +159,8 @@ public:
                  << "and default stream index" << defaultStreamIndex;
     }
 
+    virtual ~AbstractMediaContext() {}
+
     StreamWeakPtr getStream(int index) const noexcept
     {
         if (index < 0)
diff --git a/src/Lib/Ass/Ass.hh b/src/Lib/Ass/Ass.hh
index acb14ff2f5c568a0db4277cb455a278526f210d0..d7081d6a3d9afc747c36a78539c847d1a274ecd0 100644
--- a/src/Lib/Ass/Ass.hh
+++ b/src/Lib/Ass/Ass.hh
@@ -7,6 +7,5 @@
 #include "AssPrivate.hh"
 #include "AssFactory.hh"
 #include "StyleProperties.hh"
-#include <memory.h>
 
 #endif // VIVY_ASS_ASS_H
diff --git a/src/Lib/Ass/AssFactory.cc b/src/Lib/Ass/AssFactory.cc
index a8768767f6b4e9e3cb5b0a68e354be62ffdc0131..08ca4b7e08e93d57f0ca273adb463fb27b2032cf 100644
--- a/src/Lib/Ass/AssFactory.cc
+++ b/src/Lib/Ass/AssFactory.cc
@@ -1,8 +1,5 @@
 #include "AssFactory.hh"
 
-#include <algorithm>
-#include <stdexcept>
-
 using namespace Vivy::Ass;
 
 bool
diff --git a/src/Lib/Ass/AssFactory.hh b/src/Lib/Ass/AssFactory.hh
index f21fddb15a6b33a60917b0eb0371b4cd33592599..b220c0f1995a4c633664cb42554505080b494452 100644
--- a/src/Lib/Ass/AssFactory.hh
+++ b/src/Lib/Ass/AssFactory.hh
@@ -6,12 +6,6 @@
 #include "Line.hh"
 #include "AssPrivate.hh"
 
-#include <memory>
-#include <QFile>
-#include <QMap>
-#include <QVariant>
-#include <QString>
-
 // An ASS file is basically an INI file, but some keys are present multiple
 // times (V4+ Styles/Style, Events/Dialogue, Events/Comment).
 
@@ -21,11 +15,7 @@ class AssFactory final {
     VIVY_UNMOVABLE_OBJECT(AssFactory)
 
 public:
-    enum class Section {
-        ScriptInfo = 1,
-        Styles     = 2,
-        Events     = 3,
-    };
+    enum class Section { ScriptInfo = 1, Styles = 2, Events = 3 };
 
     using SectionContent = QMap<QString, QVariant>;
 
diff --git a/src/Lib/Ass/AssPrivate.hh b/src/Lib/Ass/AssPrivate.hh
index 71f9c7ee1b3fcfddb33e7961a01d7a96ab39bc1d..39d931a99d8c92c1d0d83d0d44de97cdaed20e38 100644
--- a/src/Lib/Ass/AssPrivate.hh
+++ b/src/Lib/Ass/AssPrivate.hh
@@ -1,7 +1,5 @@
 #pragma once
 
-#include <memory>
-
 namespace Vivy::Ass
 {
 class Style;
diff --git a/src/Lib/Ass/Line.cc b/src/Lib/Ass/Line.cc
index c509af7449227b27421f446ed348c3c23121474d..fe0b257ab4585b7d0d962f2577177238cd328db9 100644
--- a/src/Lib/Ass/Line.cc
+++ b/src/Lib/Ass/Line.cc
@@ -1,8 +1,6 @@
 #include "Line.hh"
 #include "AssFactory.hh"
 
-#include <QRegularExpression>
-
 using namespace Vivy::Ass;
 
 Line::Line(AssFactory *const factory, const QString &lineString)
diff --git a/src/Lib/Ass/Line.hh b/src/Lib/Ass/Line.hh
index 7463dad6692230fe9627ff83f21d4f32290f1862..15984da129990d512c3cdc388b67143a4d808d08 100644
--- a/src/Lib/Ass/Line.hh
+++ b/src/Lib/Ass/Line.hh
@@ -1,8 +1,5 @@
-#ifndef VIVY_ASS_LINE_H
-#define VIVY_ASS_LINE_H
+#pragma once
 
-#include <QString>
-#include <QtGlobal>
 #include "Syl.hh"
 #include "StyleProperties.hh"
 #include "Style.hh"
@@ -47,7 +44,4 @@ public:
 private:
     void initSylFromString(const QString &) noexcept;
 };
-
 }
-
-#endif // VIVY_ASS_LINE_H
diff --git a/src/Lib/Ass/Style.cc b/src/Lib/Ass/Style.cc
index 4c2fd133bbfbb691d292047865a68dd0d9044eb4..73afcbb1e27b470e2ecbaf8028b2319d8e064a16 100644
--- a/src/Lib/Ass/Style.cc
+++ b/src/Lib/Ass/Style.cc
@@ -1,8 +1,5 @@
 #include "Style.hh"
-
-#include <stdexcept>
-#include <QJsonDocument>
-#include <QJsonObject>
+#include "../Utils.hh"
 
 using namespace Vivy::Ass;
 
diff --git a/src/Lib/Ass/Style.hh b/src/Lib/Ass/Style.hh
index 9b9bba686f6e61e10b8227a791c73ef288f6e2fc..696cfc79e4b082a14e8b3ad295e31455611f283c 100644
--- a/src/Lib/Ass/Style.hh
+++ b/src/Lib/Ass/Style.hh
@@ -1,20 +1,17 @@
-#ifndef VIVY_STYLE_H
-#define VIVY_STYLE_H
-
-#include <QString>
-#include <QVector>
-#include <QtGlobal>
-#include <QColor>
-#include <QObject>
+#pragma once
+
 #include "AssPrivate.hh"
 
 namespace Vivy::Ass
 {
-namespace Color
-{
-QColor fromString(const QString &) noexcept;
-QString toString(const QColor &) noexcept;
-static inline const QColor defaultValue = QColor(0, 0, 0, 0);
+struct Color {
+    static QColor fromString(const QString &) noexcept;
+    static QString toString(const QColor &) noexcept;
+
+    static inline const QColor defaultValue = QColor(0, 0, 0, 0);
+
+private:
+    Color() = default;
 };
 
 class Style final {
@@ -47,7 +44,4 @@ public:
     QString getElementName() const noexcept;
     QJsonDocument getProperties() const noexcept;
 };
-
 }
-
-#endif
diff --git a/src/Lib/Ass/StyleProperties.hh b/src/Lib/Ass/StyleProperties.hh
index 374d9e2afb3a42f4c5d195c33fafe5a1494f09c8..a72acf98782c66af25a4c8f960e81e1fd6022b05 100644
--- a/src/Lib/Ass/StyleProperties.hh
+++ b/src/Lib/Ass/StyleProperties.hh
@@ -1,8 +1,4 @@
-#ifndef VIVY_ASS_STYLE_PROPERTIES_H
-#define VIVY_ASS_STYLE_PROPERTIES_H
-
-#include <QColor>
-#include <QString>
+#pragma once
 #include "Style.hh"
 
 namespace Vivy::Ass
@@ -31,7 +27,4 @@ struct StyleProperties final {
     // Alignement is bottom center
     int alignment{ 2 };
 };
-
 }
-
-#endif // VIVY_ASS_STYLE_PROPERTIES_H
diff --git a/src/Lib/Ass/Syl.hh b/src/Lib/Ass/Syl.hh
index 79c7a9bc376c028ff9b283d7d12aca3ece0414c0..084e14e5f93ea11e001260bae8543aeef48c96d9 100644
--- a/src/Lib/Ass/Syl.hh
+++ b/src/Lib/Ass/Syl.hh
@@ -21,8 +21,8 @@ public:
 
 public:
     enum class ConstructMode {
-        Raw,         // Don't read ASS tags
-        ReadAssTags, // Read ass tags
+        Raw,        // Don't read ASS tags
+        ReadAssTags // Read ass tags
     };
 
     explicit Syl(const Syl &) noexcept = default;
diff --git a/src/Lib/Audio.hh b/src/Lib/Audio.hh
index 1e34c4943c87d6062d1fdd09b5f76aeb48bec50a..a87e3dc2547e0bb3d38e0650ee09a7ac4f7e3e0e 100644
--- a/src/Lib/Audio.hh
+++ b/src/Lib/Audio.hh
@@ -4,20 +4,7 @@
 #error "This is a C++ header"
 #endif
 
-extern "C" {
-#include <libavutil/opt.h>
-#include <libavcodec/avcodec.h>
-#include <libavformat/avformat.h>
-#include <libswresample/swresample.h>
-#include <libavcodec/avfft.h>
-#include <memory.h>
-}
-
-#include "Utils.hh"
-#include <QtGlobal>
-#include <QMap>
-#include <QVector>
-#include <QString>
+#include "AbstractMediaContext.hh"
 
 namespace Vivy
 {
@@ -86,14 +73,5 @@ private:
 
     using AVFormatContextPtr = std::unique_ptr<AVFormatContext, decltype(avFormatContextDeleter)>;
     AVFormatContextPtr format{ avformat_alloc_context(), avFormatContextDeleter };
-
-    const QString filePath;               // Usefull information
-    QMap<uint, StreamPtr> audioStreams{}; // THe audio streams of the file
-
-    int defaultStreamIndex{ -1 };
-
-    // Spare always null shared pointer, to be used when the audioStream[i] was
-    // not found.
-    StreamPtr spareNullSreamPtr{ nullptr };
 };
 }
diff --git a/src/Lib/Script/CRTPLuaScriptObject.hh b/src/Lib/Script/CRTPLuaScriptObject.hh
index 8e9920da1f8c51f0a158168bd9ebcda2c73d5e7c..671cd3acb0923bf290ec0619c3e7e1d182aeee97 100644
--- a/src/Lib/Script/CRTPLuaScriptObject.hh
+++ b/src/Lib/Script/CRTPLuaScriptObject.hh
@@ -48,12 +48,12 @@ getJobIteratorTypeFromString(const std::string_view it) noexcept
 // CRTP to expose objects to Lua
 template <class Object> class CRTPLuaScriptObject {
 protected:
-    static void __attribute__((__noreturn__))
-    luaGlobalError(lua_State *const L, const std::string &str) noexcept
+    [[noreturn]] static void luaGlobalError(lua_State *const L, const std::string &str) noexcept
     {
         const auto *const context = LuaContext::getContext(L);
         lua_pushfstring(L, "%s:0:%s", context->getCurrentLuaFile().c_str(), str.c_str());
         lua_error(L);
+        exit(EXIT_FAILURE); // lua_error should not return anything
     }
 
     static bool PushFunctionFromRegistry(lua_State *const L, const int key) noexcept
diff --git a/src/Lib/Script/LuaContext.cc b/src/Lib/Script/LuaContext.cc
index f5b4d341dbcd1e32686904ea1b27b5c05bb405d6..99c42e9c910df420e7d74b40d591b8dd77316035 100644
--- a/src/Lib/Script/LuaContext.cc
+++ b/src/Lib/Script/LuaContext.cc
@@ -10,7 +10,7 @@
 // LuaContext implementation
 using namespace Vivy::Script;
 
-LuaContext::LuaContext(ScriptStore::LoggerType &out, ScriptStore::LoggerType &err) noexcept
+LuaContext::LuaContext(LoggerType &out, LoggerType &err) noexcept
     : L(luaL_newstate())
     , streamOut(out)
     , streamErr(err)
diff --git a/src/Lib/Script/LuaContext.hh b/src/Lib/Script/LuaContext.hh
index a852aac6ab4528084e026251bbc6906ccef2b541..161b01e7414a0208652054316a88838cff5fb9ba 100644
--- a/src/Lib/Script/LuaContext.hh
+++ b/src/Lib/Script/LuaContext.hh
@@ -1,9 +1,6 @@
 #pragma once
 
-#include "ScriptStore.hh"
-#include <sstream>
-#include <vector>
-#include <map>
+#include "../Utils.hh"
 
 struct lua_State;
 class QString;
@@ -15,6 +12,7 @@ class ScriptDocument;
 
 namespace Vivy::Script
 {
+class ScriptStore;
 class ModuleDeclaration;
 class FunctionDeclaration;
 class JobDeclaration;
@@ -26,6 +24,10 @@ namespace Vivy::Script
 class LuaContext final {
     VIVY_UNMOVABLE_OBJECT(LuaContext)
 
+public:
+    using LoggerType = std::stringstream;
+
+private:
     using string_view = const std::string_view;
 
     lua_State *L{ nullptr };
@@ -40,15 +42,15 @@ class LuaContext final {
 
     static inline std::map<const lua_State *const, LuaContext *const> contextList = {};
 
-    ScriptStore::LoggerType &streamOut;
-    ScriptStore::LoggerType &streamErr;
+    LoggerType &streamOut;
+    LoggerType &streamErr;
 
 public:
     enum class Code { Success, Error };
     static constexpr inline Code Success = Code::Success;
     static constexpr inline Code Error   = Code::Error;
 
-    LuaContext(ScriptStore::LoggerType &out, ScriptStore::LoggerType &err) noexcept;
+    LuaContext(LoggerType &out, LoggerType &err) noexcept;
     ~LuaContext() noexcept;
 
     Code loadDocument(std::shared_ptr<ScriptDocument>) noexcept;
diff --git a/src/Lib/Script/ScriptStore.hh b/src/Lib/Script/ScriptStore.hh
index dd4266a998dc370119156b000c1444d8dbc9ad09..cbfe85d93ac7a44c5ba64f4138ea973953fc9b34 100644
--- a/src/Lib/Script/ScriptStore.hh
+++ b/src/Lib/Script/ScriptStore.hh
@@ -2,6 +2,7 @@
 
 #include "../CRTPStore.hh"
 #include "ScriptDocument.hh"
+#include "LuaContext.hh"
 #include <sstream>
 #include <optional>
 
@@ -20,7 +21,7 @@ class ScriptStore final : public CRTPStore<ScriptStore, ScriptDocument> {
 
 public:
     using Item       = std::tuple<Uuid, QString>;
-    using LoggerType = std::stringstream;
+    using LoggerType = Script::LuaContext::LoggerType;
 
     explicit ScriptStore() noexcept;
 
diff --git a/src/Lib/Video.cc b/src/Lib/Video.cc
index 390b82a7b44626c218d7875c34bd9b103f874d26..467d562cdd252a3ed3f2c8807084c9d36eb3ddd1 100644
--- a/src/Lib/Video.cc
+++ b/src/Lib/Video.cc
@@ -1,9 +1,6 @@
 #include "Video.hh"
 #include "Utils.hh"
 
-#include <QJsonObject>
-#include <QJsonArray>
-
 using namespace Vivy;
 
 VideoStream::VideoStream(AVCodec *streamCodec, AVFormatContext *formatArg, AVStream *streamArg,
diff --git a/src/Lib/Video.hh b/src/Lib/Video.hh
index 42032b885b991982eb21a0a020e148807250f8be..3f52495f6546043f08fce389a8db244f2c94dde1 100644
--- a/src/Lib/Video.hh
+++ b/src/Lib/Video.hh
@@ -4,20 +4,7 @@
 #error "This is a C++ header"
 #endif
 
-extern "C" {
-#include <libavutil/opt.h>
-#include <libavcodec/avcodec.h>
-#include <libavformat/avformat.h>
-#include <libswresample/swresample.h>
-#include <libavcodec/avfft.h>
-#include <memory.h>
-}
-
-#include "Utils.hh"
-#include <QtGlobal>
-#include <QMap>
-#include <QVector>
-#include <QString>
+#include "AbstractMediaContext.hh"
 
 namespace Vivy
 {
diff --git a/src/UI/AboutWindow.cc b/src/UI/AboutWindow.cc
index 85cb2e01da8f31408f9b938b93569c6bca65e511..420dae7bfbd3ef45a4273245400656a912d64962 100644
--- a/src/UI/AboutWindow.cc
+++ b/src/UI/AboutWindow.cc
@@ -1,14 +1,5 @@
 #include "AboutWindow.hh"
-
-#include <QCloseEvent>
-#include <QLabel>
-#include <QPushButton>
-#include <QVBoxLayout>
-#include <QHBoxLayout>
-#include <QEvent>
-#include <QMouseEvent>
-#include <QApplication>
-#include <QTextEdit>
+#include "../VivyApplication.hh"
 
 using namespace Vivy;
 
@@ -46,6 +37,9 @@ static const char *libContent =
     "  </ul>"
     "</body>";
 
+AboutWindow::SimpleLabel::~SimpleLabel() noexcept {}
+AboutWindow::LicenceLabel::~LicenceLabel() noexcept {}
+
 AboutWindow::SimpleLabel::SimpleLabel(QWidget *parent, const char *text)
     : QLabel(parent)
 {
diff --git a/src/UI/AboutWindow.hh b/src/UI/AboutWindow.hh
index acbd437c0a2b3513f3f1bdcdf356771d8dc8c705..4d4aae15e27db41c606c901557790f3a2a645f71 100644
--- a/src/UI/AboutWindow.hh
+++ b/src/UI/AboutWindow.hh
@@ -20,17 +20,19 @@ class AboutWindow final : public QMainWindow {
     class SimpleLabel final : public QLabel {
     public:
         explicit SimpleLabel(QWidget *parent, const char *text);
+        ~SimpleLabel() noexcept override;
     };
 
     // Simple QLabel for licences
     class LicenceLabel final : public QTextEdit {
     public:
         explicit LicenceLabel(QWidget *parent, const QString &url, const Qt::TextFormat format);
+        ~LicenceLabel() noexcept override;
     };
 
 public:
     explicit AboutWindow(QWidget *parent) noexcept;
-    ~AboutWindow() noexcept = default;
+    ~AboutWindow() noexcept override = default;
 
 signals:
     void closed();
diff --git a/src/UI/DocumentViews/AssLinesModel.hh b/src/UI/DocumentViews/AssLinesModel.hh
index 2dfdbcd1c709a55ce9c02e902f628358109dc2ed..e797c3bf395980bbc16f2a91151cc34c6925fef6 100644
--- a/src/UI/DocumentViews/AssLinesModel.hh
+++ b/src/UI/DocumentViews/AssLinesModel.hh
@@ -21,9 +21,7 @@ private:
 
         enum class Field : int {
             Text,
-
-            // Last, the count
-            TotalFieldCount,
+            TotalFieldCount // Last, the count
         };
 
         bool getIsComment() const noexcept;
@@ -39,7 +37,7 @@ private:
 
 public:
     explicit AssLinesModel(const QVector<Ass::LinePtr> &) noexcept;
-    ~AssLinesModel() noexcept;
+    ~AssLinesModel() noexcept override;
 
     QVariant data(const QModelIndex &, int role) const noexcept override;
     bool setData(const QModelIndex &, const QVariant &v, int r = Qt::EditRole) noexcept override;
diff --git a/src/UI/DocumentViews/AssLinesView.hh b/src/UI/DocumentViews/AssLinesView.hh
index 54c58c660067f55270af7fa92d3ede42074823ae..549cc5321bdac68e78a9944a6012bd2e7374dd0f 100644
--- a/src/UI/DocumentViews/AssLinesView.hh
+++ b/src/UI/DocumentViews/AssLinesView.hh
@@ -23,7 +23,7 @@ private:
 
     public:
         Delegate(AssLinesView *, QWidget *parent = nullptr) noexcept;
-        ~Delegate() noexcept = default;
+        ~Delegate() noexcept override = default;
 
         void initStyleOption(QStyleOptionViewItem *option,
                              const QModelIndex &index) const noexcept override;
@@ -38,7 +38,7 @@ private:
 
 public:
     AssLinesView(QAbstractItemModel *, QWidget *parent = nullptr) noexcept;
-    ~AssLinesView() noexcept = default;
+    ~AssLinesView() noexcept override = default;
 
     void paintEvent(QPaintEvent *) noexcept override;
 
diff --git a/src/UI/DocumentViews/AudioVisualizer.hh b/src/UI/DocumentViews/AudioVisualizer.hh
index 451d50800979bca9f137b3fd2dfcd3842715629b..695f62098fcd5c3ce65bbd47b7030dd61482d341 100644
--- a/src/UI/DocumentViews/AudioVisualizer.hh
+++ b/src/UI/DocumentViews/AudioVisualizer.hh
@@ -33,7 +33,7 @@ private:
 
 public:
     explicit AudioVisualizer(AudioContext::StreamPtr, QWidget *parent = nullptr);
-    ~AudioVisualizer() noexcept = default;
+    ~AudioVisualizer() noexcept override = default;
 
 public slots:
     void printSpectrum(QImage) noexcept;
diff --git a/src/UI/DocumentViews/TimingBar.hh b/src/UI/DocumentViews/TimingBar.hh
index 6edf64eede549c9284a1a332d05aaca6b8bfdc6a..f6fb18c60f965111de7ccda9924b23868b0b81f7 100644
--- a/src/UI/DocumentViews/TimingBar.hh
+++ b/src/UI/DocumentViews/TimingBar.hh
@@ -13,7 +13,7 @@ namespace Vivy
 class TimingBar final : public QGraphicsLineItem {
 public:
     explicit TimingBar(QLine, QColor) noexcept;
-    ~TimingBar() noexcept = default;
+    ~TimingBar() noexcept override = default;
 
 private:
     static inline constexpr int bar_demi_width = 2;
diff --git a/src/UI/DocumentViews/TimingView.hh b/src/UI/DocumentViews/TimingView.hh
index 5b0fc0e03971d36de6aa48a578997d330a8d563e..b1ef4895db082604d1052f4f6a1d7cf5b1f58edd 100644
--- a/src/UI/DocumentViews/TimingView.hh
+++ b/src/UI/DocumentViews/TimingView.hh
@@ -26,7 +26,7 @@ public:
     static inline constexpr QColor endColour   = QColor(0, 127, 0);
 
     explicit TimingView(QImage, quint64, QWidget * = nullptr) noexcept;
-    ~TimingView() noexcept = default;
+    ~TimingView() noexcept override = default;
 
     void wheelEvent(QWheelEvent *) noexcept override;
 
diff --git a/src/UI/FakeVim/FakeVimActions.cc b/src/UI/FakeVim/FakeVimActions.cc
index 1c36b444d5647feb830b9a31ad0ce16468ba748c..2f3f7670daea1b3debb31f6ffac50cb977ed3f76 100644
--- a/src/UI/FakeVim/FakeVimActions.cc
+++ b/src/UI/FakeVim/FakeVimActions.cc
@@ -8,6 +8,11 @@ namespace FakeVim::Internal
 {
 #ifdef FAKEVIM_STANDALONE
 FvBaseAspect::FvBaseAspect() {}
+FvBaseAspect::~FvBaseAspect() {}
+FvBoolAspect::~FvBoolAspect() {}
+FvIntegerAspect::~FvIntegerAspect() {}
+FvStringAspect::~FvStringAspect() {}
+FvAspectContainer::~FvAspectContainer() {}
 
 void
 FvBaseAspect::setValue(const QVariant &value)
diff --git a/src/UI/FakeVim/FakeVimActions.hh b/src/UI/FakeVim/FakeVimActions.hh
index b1cea03d6697830e2637ca2efbbca89ff8ecdf0e..ae872e4afb5a314c77ea19c2d008faa02809f1b6 100644
--- a/src/UI/FakeVim/FakeVimActions.hh
+++ b/src/UI/FakeVim/FakeVimActions.hh
@@ -13,7 +13,7 @@ namespace FakeVim::Internal
 class FvBaseAspect {
 public:
     FvBaseAspect();
-    virtual ~FvBaseAspect() {}
+    virtual ~FvBaseAspect();
 
     void setValue(const QVariant &value);
     QVariant value() const;
@@ -34,21 +34,25 @@ private:
 
 class FvBoolAspect : public FvBaseAspect {
 public:
+    ~FvBoolAspect() override;
     bool value() const { return FvBaseAspect::value().toBool(); }
 };
 
 class FvIntegerAspect : public FvBaseAspect {
 public:
+    ~FvIntegerAspect() override;
     qint64 value() const { return FvBaseAspect::value().toLongLong(); }
 };
 
 class FvStringAspect : public FvBaseAspect {
 public:
+    ~FvStringAspect() override;
     QString value() const { return FvBaseAspect::value().toString(); }
 };
 
 class FvAspectContainer : public FvBaseAspect {
 public:
+    ~FvAspectContainer() override;
 };
 
 class FakeVimSettings final : public FvAspectContainer {
diff --git a/src/UI/MainWindow.hh b/src/UI/MainWindow.hh
index 1ce71fc256f8a702bdcf161cc10ba73676fc6eac..16b379e87bcb15288b8ab739fae0f70607560e5e 100644
--- a/src/UI/MainWindow.hh
+++ b/src/UI/MainWindow.hh
@@ -9,11 +9,8 @@
 #include "../Lib/Document/VivyDocumentStore.hh"
 #include "DocumentViews/AudioVisualizer.hh"
 #include "VivyDocumentView.hh"
+#include "ScriptDocumentView.hh"
 #include "AboutWindow.hh"
-#include <QMenu>
-#include <QFileDialog>
-#include <QMutex>
-#include <QMainWindow>
 
 namespace Vivy
 {
diff --git a/src/UI/ScriptDocumentView.hh b/src/UI/ScriptDocumentView.hh
index 7f2c333bae28c31c6be079cf0faa5839ed40850e..c1acc9c31524571e2b7eedf0703991a12296b8fe 100644
--- a/src/UI/ScriptDocumentView.hh
+++ b/src/UI/ScriptDocumentView.hh
@@ -6,25 +6,12 @@
 #endif
 
 #include "../Lib/Utils.hh"
+#include "../Lib/Script/ScriptDocument.hh"
 #include "AbstractDocumentView.hh"
-#include <QWidget>
-#include <QString>
-#include <memory>
-
-class QPlainTextEdit;
-
-namespace FakeVim::Internal
-{
-class FakeVimHandler;
-}
-
-namespace Vivy
-{
-class ScriptEditor;
-class ScriptHighlighter;
-class ScriptDocument;
-class EditorProxy;
-}
+#include "FakeVim/FakeVimHandler.hh"
+#include "ScriptViews/EditorProxy.hh"
+#include "ScriptViews/ScriptHighlighter.hh"
+#include "ScriptViews/ScriptEditor.hh"
 
 namespace Vivy
 {
diff --git a/src/UI/VivyDocumentView.hh b/src/UI/VivyDocumentView.hh
index 4cdcc8efc8d9cd6d1a68be9c0627b68f410f82ab..b38bd6c04a87e5551c336e443c84b886e1b519cd 100644
--- a/src/UI/VivyDocumentView.hh
+++ b/src/UI/VivyDocumentView.hh
@@ -6,17 +6,14 @@
 #endif
 
 #include "AbstractDocumentView.hh"
-
-class QDockWidget;
-class QWidget;
+#include "../Lib/Document/VivyDocument.hh"
+#include "DocumentViews/VideoView.hh"
+#include "DocumentViews/AssLinesView.hh"
+#include "DocumentViews/AssLinesModel.hh"
+#include "PropertyModel.hh"
 
 namespace Vivy
 {
-class PropertyModel;
-class AssLinesModel;
-class VivyDocument;
-class VideoView;
-
 class VivyDocumentView final : public AbstractDocumentView {
     Q_OBJECT
     VIVY_UNMOVABLE_OBJECT(VivyDocumentView)
diff --git a/src/VivyApplication.hh b/src/VivyApplication.hh
index 4c98c7b36f39795c86a06b664fe4a646a7d4e7c3..2f37a5d52570be4bfe09b7f07175cd6a59d71cc4 100644
--- a/src/VivyApplication.hh
+++ b/src/VivyApplication.hh
@@ -24,9 +24,7 @@
 #define VIVY_ICON_PAUSE   ":icons/dark/media-pause.svg"
 #define VIVY_ICON_STOP    ":icons/dark/media-stop.svg"
 
-#include <QApplication>
-#include <QPixmap>
-#include <QFont>
+#include "Lib/Script/ScriptStore.hh"
 
 // Detect MacOS
 #if defined(Q_OS_DARWIN) || defined(Q_OS_MACOS)
@@ -34,6 +32,7 @@
 #endif
 
 #include "Lib/Document/VivyDocumentStore.hh"
+#include "UI/MainWindow.hh"
 
 namespace Vivy
 {