diff --git a/.gitignore b/.gitignore
index e227c36f7b7374bacba2c600686e210979634162..7e8ea38a87c731336f4c99a9052fd38adba02cbe 100644
--- a/.gitignore
+++ b/.gitignore
@@ -19,3 +19,7 @@ build.clang/*
 # Local configurations
 .vim/*
 .vscode/*
+
+# CCLS styff
+.ccls*/
+.ccls
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index bfba6c6043134ac2283b9bb0d1ea0b2eb8924c9c..11007c7447dc149a2c9be38056c9d6f7f1ca2eea 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,5 +1,3 @@
-image: debian:latest
-
 .common_build:
   before_script:
     - apt update && apt -y install make autoconf qtbase5-dev qtchooser qt5-qmake qtbase5-dev-tools libavutil-dev libavcodec-dev libavformat-dev libmpv-dev cmake clang clang-format gcc g++ libomp-dev
diff --git a/CMakeLists.txt b/CMakeLists.txt
index bfa3728ed3e58b52149c4b134404659194c4511f..11dbf6dbbcd18b8d5af02b3c500ba2a921baa21f 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.5)
+cmake_minimum_required(VERSION 3.17)
 
 # Alpho Vivy, CXX only
 project(Vivy VERSION 0.1 LANGUAGES CXX)
@@ -7,16 +7,16 @@ cmake_policy(SET CMP0009 NEW) # Do not follow symlinks with GLOB_RECURSE
 
 # Don't forget for specific things
 if(WIN32)
-    message("You are building on windows, pay attenion to the dependencies")
+    message(STATUS "You are building on windows, pay attenion to the dependencies")
 endif()
 if(MSVC OR MSYS OR MINGW)
-    message("You are building with a windows compiler")
+    message(STATUS "You are building with a windows compiler")
 endif()
 if(APPLE)
-    message("You are building on MacOS X")
+    message(STATUS "You are building on MacOS X")
 endif()
 if(UNIX AND NOT APPLE)
-    message("You are building on Linux, FreeBSD or any other toaster OS")
+    message(STATUS "You are building on Linux, FreeBSD or any other toaster OS")
 endif()
 
 # Pass -fPIC
@@ -80,7 +80,7 @@ target_link_libraries(Vivy PRIVATE lua)
 
 # Headers related things
 include("${CMAKE_CURRENT_SOURCE_DIR}/PreCompiledHeaders.cmake")
-target_include_directories(Vivy PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/inc)
+target_include_directories(Vivy PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src)
 target_precompile_headers(Vivy PRIVATE ${Vivy_PRECOMPILED_INC})
 
 # Set Vivy's needed C++ features
@@ -169,3 +169,14 @@ set_target_properties(Vivy PROPERTIES
 if(QT_VERSION_MAJOR EQUAL 6)
     qt_finalize_executable(Vivy)
 endif()
+
+# Set ASAN
+if("x${CMAKE_BUILD_TYPE}" STREQUAL "xDebug")
+    if (${CMAKE_CXX_COMPILER_ID} STREQUAL "Clang")
+        target_compile_options(Vivy PRIVATE -g -O1 -fsanitize=address -fno-omit-frame-pointer -fsanitize-address-use-after-return=always)
+    elseif (${CMAKE_CXX_COMPILER_ID} STREQUAL "GNU")
+        target_compile_options(Vivy PRIVATE -g -O1 -fsanitize=address -fno-omit-frame-pointer)
+    endif()
+
+    target_link_libraries(Vivy PRIVATE -g -O1 -fsanitize=address)
+endif()
diff --git a/src/Lib/AbstractDocument.cc b/src/Lib/AbstractDocument.cc
index def32ead006169ef84f7ac23979d74f1f77598c3..950f87e59e9a78eb87f02ae666e64f4e1e78f3e2 100644
--- a/src/Lib/AbstractDocument.cc
+++ b/src/Lib/AbstractDocument.cc
@@ -1,4 +1,5 @@
-#include "AbstractDocument.hh"
+#include "PreCompiledHeaders.hh"
+#include "Lib/AbstractDocument.hh"
 
 bool
 operator==(const Vivy::AbstractDocument &a, const Vivy::AbstractDocument &b) noexcept
diff --git a/src/Lib/AbstractDocument.hh b/src/Lib/AbstractDocument.hh
index c39fb5661a9cdcc3bd841950fe18c011f9214972..6731edddcabcf5ba7cdfd31c138ae1f55da16810 100644
--- a/src/Lib/AbstractDocument.hh
+++ b/src/Lib/AbstractDocument.hh
@@ -4,10 +4,11 @@
 #error "This is a C++ header"
 #endif
 
-#include "../VivyApplication.hh"
-#include "Utils.hh"
-#include "Uuid.hh"
-#include "Log.hh"
+#include "PreCompiledHeaders.hh"
+#include "VivyApplication.hh"
+#include "Lib/Utils.hh"
+#include "Lib/Uuid.hh"
+#include "Lib/Log.hh"
 
 namespace Vivy
 {
diff --git a/src/Lib/AbstractMediaContext.hh b/src/Lib/AbstractMediaContext.hh
index 34b3c8aba50396cec1f371351343f552eb3518f7..fef1600195f6209f43a515a757457e4761983280 100644
--- a/src/Lib/AbstractMediaContext.hh
+++ b/src/Lib/AbstractMediaContext.hh
@@ -12,9 +12,10 @@ extern "C" {
 #include <libavcodec/avfft.h>
 }
 
-#include "../VivyApplication.hh"
-#include "Utils.hh"
-#include "Log.hh"
+#include "PreCompiledHeaders.hh"
+#include "VivyApplication.hh"
+#include "Lib/Utils.hh"
+#include "Lib/Log.hh"
 
 namespace Vivy
 {
diff --git a/src/Lib/Ass/Ass.hh b/src/Lib/Ass/Ass.hh
index d7081d6a3d9afc747c36a78539c847d1a274ecd0..051ea06210ba9691ee322f0035ae4d862353f5f6 100644
--- a/src/Lib/Ass/Ass.hh
+++ b/src/Lib/Ass/Ass.hh
@@ -1,11 +1,11 @@
 #ifndef VIVY_ASS_ASS_H
 #define VIVY_ASS_ASS_H
 
-#include "Line.hh"
-#include "Syl.hh"
-#include "Style.hh"
-#include "AssPrivate.hh"
-#include "AssFactory.hh"
-#include "StyleProperties.hh"
+#include "Lib/Ass/Line.hh"
+#include "Lib/Ass/Syl.hh"
+#include "Lib/Ass/Style.hh"
+#include "Lib/Ass/AssPrivate.hh"
+#include "Lib/Ass/AssFactory.hh"
+#include "Lib/Ass/StyleProperties.hh"
 
 #endif // VIVY_ASS_ASS_H
diff --git a/src/Lib/Ass/AssFactory.cc b/src/Lib/Ass/AssFactory.cc
index 96c59b83d7d1fc8ca8bbeb99e797db3ad6f504c4..334de5b8b3e1fc18514958faf63b3684aac84cc0 100644
--- a/src/Lib/Ass/AssFactory.cc
+++ b/src/Lib/Ass/AssFactory.cc
@@ -1,4 +1,5 @@
-#include "AssFactory.hh"
+#include "PreCompiledHeaders.hh"
+#include "Lib/Ass/AssFactory.hh"
 
 using namespace Vivy::Ass;
 
diff --git a/src/Lib/Ass/AssFactory.hh b/src/Lib/Ass/AssFactory.hh
index 0f322347b2bb782f8d82159b49006e0d2c092053..8e1812889b07cf4fb7183943662d6a6fb56d0b54 100644
--- a/src/Lib/Ass/AssFactory.hh
+++ b/src/Lib/Ass/AssFactory.hh
@@ -1,11 +1,11 @@
 #pragma once
 
-#include "../../VivyApplication.hh"
-#include "../Log.hh"
-#include "../Utils.hh"
-#include "Style.hh"
-#include "Line.hh"
-#include "AssPrivate.hh"
+#include "VivyApplication.hh"
+#include "Lib/Log.hh"
+#include "Lib/Utils.hh"
+#include "Lib/Ass/Style.hh"
+#include "Lib/Ass/Line.hh"
+#include "Lib/Ass/AssPrivate.hh"
 
 // An ASS file is basically an INI file, but some keys are present multiple
 // times (V4+ Styles/Style, Events/Dialogue, Events/Comment).
diff --git a/src/Lib/Ass/AssPrivate.hh b/src/Lib/Ass/AssPrivate.hh
index cb9a720c547ee16ff2ea63a4369a96999eec2ec0..e54f8a1c0577a9663a20c6f8c9f25bb891d9e332 100644
--- a/src/Lib/Ass/AssPrivate.hh
+++ b/src/Lib/Ass/AssPrivate.hh
@@ -1,5 +1,7 @@
 #pragma once
 
+#include "PreCompiledHeaders.hh"
+
 namespace Vivy::Ass
 {
 class Style;
diff --git a/src/Lib/Ass/Line.cc b/src/Lib/Ass/Line.cc
index 756f6c47f44820d1fbbe464168473662abb4d1d9..e8d8476d592b136b3a51f23226acb921aa9c1657 100644
--- a/src/Lib/Ass/Line.cc
+++ b/src/Lib/Ass/Line.cc
@@ -1,5 +1,6 @@
-#include "Line.hh"
-#include "AssFactory.hh"
+#include "PreCompiledHeaders.hh"
+#include "Lib/Ass/Line.hh"
+#include "Lib/Ass/AssFactory.hh"
 
 #include "../../VivyApplication.hh"
 #include "../../Lib/Document/VivyDocument.hh"
diff --git a/src/Lib/Ass/Line.hh b/src/Lib/Ass/Line.hh
index 4895622cd25001191ae2912d55df42e3e197205c..55af684747441c235176209e2f8b860ddfdd243d 100644
--- a/src/Lib/Ass/Line.hh
+++ b/src/Lib/Ass/Line.hh
@@ -1,10 +1,11 @@
 #pragma once
 
-#include "../../VivyApplication.hh"
-#include "../Log.hh"
-#include "Syl.hh"
-#include "StyleProperties.hh"
-#include "Style.hh"
+#include "PreCompiledHeaders.hh"
+#include "VivyApplication.hh"
+#include "Lib/Log.hh"
+#include "Lib/Ass/Syl.hh"
+#include "Lib/Ass/StyleProperties.hh"
+#include "Lib/Ass/Style.hh"
 
 namespace Vivy::Ass
 {
diff --git a/src/Lib/Ass/Style.cc b/src/Lib/Ass/Style.cc
index 2f80c9d1db58c37be84001ba4bd3ca5b3b1072ed..0a78af9537991cd7d4f8d123ea79b3034967bcc8 100644
--- a/src/Lib/Ass/Style.cc
+++ b/src/Lib/Ass/Style.cc
@@ -1,5 +1,6 @@
-#include "Style.hh"
-#include "../Utils.hh"
+#include "PreCompiledHeaders.hh"
+#include "Lib/Ass/Style.hh"
+#include "Lib/Utils.hh"
 
 using namespace Vivy::Ass;
 
diff --git a/src/Lib/Ass/Style.hh b/src/Lib/Ass/Style.hh
index c6c5f10b91924355bb23f33039a1a34b278a2e2d..6712368c054861e3f03368a3f27c4002f7166da6 100644
--- a/src/Lib/Ass/Style.hh
+++ b/src/Lib/Ass/Style.hh
@@ -1,8 +1,9 @@
 #pragma once
 
-#include "../../VivyApplication.hh"
-#include "../Log.hh"
-#include "AssPrivate.hh"
+#include "PreCompiledHeaders.hh"
+#include "VivyApplication.hh"
+#include "Lib/Log.hh"
+#include "Lib/Ass/AssPrivate.hh"
 
 namespace Vivy::Ass
 {
diff --git a/src/Lib/Ass/StyleProperties.hh b/src/Lib/Ass/StyleProperties.hh
index a72acf98782c66af25a4c8f960e81e1fd6022b05..eb7c04cdeaa10b215ef46a95a80ebe119ebcf5f0 100644
--- a/src/Lib/Ass/StyleProperties.hh
+++ b/src/Lib/Ass/StyleProperties.hh
@@ -1,5 +1,7 @@
 #pragma once
-#include "Style.hh"
+
+#include "PreCompiledHeaders.hh"
+#include "Lib/Ass/Style.hh"
 
 namespace Vivy::Ass
 {
diff --git a/src/Lib/Ass/Syl.cc b/src/Lib/Ass/Syl.cc
index 91c49b843479888ad66aeb04cd0b76daa3c3d434..f98b82895cc8ff7ab65458b23acc2059a3827f8a 100644
--- a/src/Lib/Ass/Syl.cc
+++ b/src/Lib/Ass/Syl.cc
@@ -1,5 +1,6 @@
-#include "Syl.hh"
-#include "Line.hh"
+#include "PreCompiledHeaders.hh"
+#include "Lib/Ass/Syl.hh"
+#include "Lib/Ass/Line.hh"
 
 using namespace Vivy::Ass;
 
diff --git a/src/Lib/Ass/Syl.hh b/src/Lib/Ass/Syl.hh
index 7c603cea14e60d53b041e912a53ade1dd06aa6dd..1b00a40eb826e75b3b163d85799e2eca274d7ec4 100644
--- a/src/Lib/Ass/Syl.hh
+++ b/src/Lib/Ass/Syl.hh
@@ -1,6 +1,7 @@
 #pragma once
 
-#include "StyleProperties.hh"
+#include "PreCompiledHeaders.hh"
+#include "Lib/Ass/StyleProperties.hh"
 
 namespace Vivy::Ass
 {
diff --git a/src/Lib/Audio.cc b/src/Lib/Audio.cc
index 716251647fff8a4b23e627affd66eda90ffda3a0..c308973ad35df7b5682d14cdb6042a2865680bbb 100644
--- a/src/Lib/Audio.cc
+++ b/src/Lib/Audio.cc
@@ -1,3 +1,4 @@
+#include "../PreCompiledHeaders.hh"
 #include "Audio.hh"
 
 using namespace Vivy;
diff --git a/src/Lib/Audio.hh b/src/Lib/Audio.hh
index bc6ae3815c168cf253d3ef4fde0b8c9ea2acfa5e..8e30783c8990a740d4301095d8f219c5c7de2191 100644
--- a/src/Lib/Audio.hh
+++ b/src/Lib/Audio.hh
@@ -4,7 +4,8 @@
 #error "This is a C++ header"
 #endif
 
-#include "AbstractMediaContext.hh"
+#include "PreCompiledHeaders.hh"
+#include "Lib/AbstractMediaContext.hh"
 
 namespace Vivy
 {
diff --git a/src/Lib/CRTPStore.hh b/src/Lib/CRTPStore.hh
index 2aa6da2c7bcb34ae8ed039058049d944b82bf4cf..da2d28d63620f7d8494e2859d58eb17e49a4227d 100644
--- a/src/Lib/CRTPStore.hh
+++ b/src/Lib/CRTPStore.hh
@@ -4,10 +4,11 @@
 #error "This is a C++ header"
 #endif
 
-#include "../VivyApplication.hh"
-#include "Log.hh"
-#include "Utils.hh"
-#include "Uuid.hh"
+#include "PreCompiledHeaders.hh"
+#include "VivyApplication.hh"
+#include "Lib/Log.hh"
+#include "Lib/Utils.hh"
+#include "Lib/Uuid.hh"
 
 #define VIVY_STORAGE_CLASS(theClassName, theDocumentName) \
     VIVY_UNMOVABLE_OBJECT(theClassName)                   \
diff --git a/src/Lib/Document/CRTPSubDocument.hh b/src/Lib/Document/CRTPSubDocument.hh
index 2d81aa0ce7756612fc3ada1c4a9f2d623ea49ec3..626ea517d86b1e8ad43dc7c00d16d93559d87097 100644
--- a/src/Lib/Document/CRTPSubDocument.hh
+++ b/src/Lib/Document/CRTPSubDocument.hh
@@ -4,12 +4,13 @@
 #error "This is a C++ header"
 #endif
 
-#include "../../VivyApplication.hh"
-#include "../Log.hh"
-#include "../Utils.hh"
-#include "../Audio.hh"
-#include "../Video.hh"
-#include "../Ass/Ass.hh"
+#include "PreCompiledHeaders.hh"
+#include "VivyApplication.hh"
+#include "Lib/Log.hh"
+#include "Lib/Utils.hh"
+#include "Lib/Audio.hh"
+#include "Lib/Video.hh"
+#include "Lib/Ass/Ass.hh"
 
 #define VIVY_ENABLE_IF_TYPE(Type) \
     template <typename = typename std::enable_if<!std::is_same<Type, void>::value>>
diff --git a/src/Lib/Document/CRTPSubDocument/AssSubDocument.cc b/src/Lib/Document/CRTPSubDocument/AssSubDocument.cc
index fdb709fbcf6210c5e6178b8ff50b5175b4e5713c..9ad4624a59de91585fb7c817ff314e8acdd084d1 100644
--- a/src/Lib/Document/CRTPSubDocument/AssSubDocument.cc
+++ b/src/Lib/Document/CRTPSubDocument/AssSubDocument.cc
@@ -1,5 +1,6 @@
-#include "../CRTPSubDocument.hh"
-#include "../../JsonBuilder.hh"
+#include "PreCompiledHeaders.hh"
+#include "Lib/Document//CRTPSubDocument.hh"
+#include "Lib/JsonBuilder.hh"
 
 using namespace Vivy;
 
diff --git a/src/Lib/Document/CRTPSubDocument/AudioSubDocument.cc b/src/Lib/Document/CRTPSubDocument/AudioSubDocument.cc
index d10fb949520f043cfd3d489f3127ddf23f4229fe..201ce0942032d496a0d17b08796b1afaf6834911 100644
--- a/src/Lib/Document/CRTPSubDocument/AudioSubDocument.cc
+++ b/src/Lib/Document/CRTPSubDocument/AudioSubDocument.cc
@@ -1,5 +1,6 @@
-#include "../CRTPSubDocument.hh"
-#include "../../JsonBuilder.hh"
+#include "PreCompiledHeaders.hh"
+#include "Lib/Document/CRTPSubDocument.hh"
+#include "Lib/JsonBuilder.hh"
 
 using namespace Vivy;
 
diff --git a/src/Lib/Document/CRTPSubDocument/VideoSubDocument.cc b/src/Lib/Document/CRTPSubDocument/VideoSubDocument.cc
index 516bb8c1bac9e2b2d4cdacb828ae707e68c43b9e..09a5a44ab66c9dae55aac9a171667fd8b9f5f6e8 100644
--- a/src/Lib/Document/CRTPSubDocument/VideoSubDocument.cc
+++ b/src/Lib/Document/CRTPSubDocument/VideoSubDocument.cc
@@ -1,5 +1,6 @@
-#include "../CRTPSubDocument.hh"
-#include "../../JsonBuilder.hh"
+#include "PreCompiledHeaders.hh"
+#include "Lib/Document/CRTPSubDocument.hh"
+#include "Lib/JsonBuilder.hh"
 
 using namespace Vivy;
 
diff --git a/src/Lib/Document/VivyDocument.cc b/src/Lib/Document/VivyDocument.cc
index 59dec54cf7574d452fad2e34902462f63a41dd22..e352417277d760a2dfd26b3bf42d0caf6ab4f4bd 100644
--- a/src/Lib/Document/VivyDocument.cc
+++ b/src/Lib/Document/VivyDocument.cc
@@ -1,6 +1,7 @@
-#include "VivyDocument.hh"
-#include "../Utils.hh"
-#include "../JsonBuilder.hh"
+#include "PreCompiledHeaders.hh"
+#include "Lib/Document/VivyDocument.hh"
+#include "Lib/Utils.hh"
+#include "Lib/JsonBuilder.hh"
 
 using namespace Vivy;
 
diff --git a/src/Lib/Document/VivyDocument.hh b/src/Lib/Document/VivyDocument.hh
index f52a3d9cb3790d44c79b1dcd4456beb3cdc7f790..37448b56bc833252086505dfb6f850700ab961cb 100644
--- a/src/Lib/Document/VivyDocument.hh
+++ b/src/Lib/Document/VivyDocument.hh
@@ -5,11 +5,11 @@
 #error "This is a C++ header"
 #endif
 
-#include "../Utils.hh"
-#include "../AbstractDocument.hh"
-#include "../AbstractDocument.hh"
-#include "../Audio.hh"
-#include "CRTPSubDocument.hh"
+#include "PreCompiledHeaders.hh"
+#include "Lib/Utils.hh"
+#include "Lib/AbstractDocument.hh"
+#include "Lib/Uuid.hh"
+#include "Lib/Document/CRTPSubDocument.hh"
 
 #define DCL_VIVY_SAVE_KEY(name) static const inline QString Key##name = QStringLiteral(#name);
 
diff --git a/src/Lib/Document/VivyDocumentStore.cc b/src/Lib/Document/VivyDocumentStore.cc
index ebd9a000d18dc7ad68c188be50c861a04ea451ec..ebb320ccb1cbad2eb26f432778e82742101b7c5d 100644
--- a/src/Lib/Document/VivyDocumentStore.cc
+++ b/src/Lib/Document/VivyDocumentStore.cc
@@ -1,5 +1,6 @@
-#include "VivyDocumentStore.hh"
-#include "VivyDocument.hh"
+#include "PreCompiledHeaders.hh"
+#include "Lib/Document/VivyDocumentStore.hh"
+#include "Lib/Document/VivyDocument.hh"
 
 using namespace Vivy;
 
diff --git a/src/Lib/Document/VivyDocumentStore.hh b/src/Lib/Document/VivyDocumentStore.hh
index c2ac6b8e729a8befca9c085aeac25af81141a42b..a715d35a0634417ecbd20c9e745cb461b19e2787 100644
--- a/src/Lib/Document/VivyDocumentStore.hh
+++ b/src/Lib/Document/VivyDocumentStore.hh
@@ -4,9 +4,10 @@
 #error "This is a C++ header"
 #endif
 
-#include "VivyDocument.hh"
-#include "../Utils.hh"
-#include "../CRTPStore.hh"
+#include "PreCompiledHeaders.hh"
+#include "Lib/Document/VivyDocument.hh"
+#include "Lib/Utils.hh"
+#include "Lib/CRTPStore.hh"
 
 namespace Vivy
 {
diff --git a/src/Lib/HostOsInfo.cc b/src/Lib/HostOsInfo.cc
index b6628feaf875fd22881c405140a72662fe10bb9f..83e31c32916e98300e8038a2ee1af416adc8967a 100644
--- a/src/Lib/HostOsInfo.cc
+++ b/src/Lib/HostOsInfo.cc
@@ -1,4 +1,5 @@
-#include "HostOsInfo.hh"
+#include "PreCompiledHeaders.hh"
+#include "Lib/HostOsInfo.hh"
 
 #if !defined(QT_NO_OPENGL) && defined(QT_GUI_LIB)
 #define VIVY_OPENGL 1
diff --git a/src/Lib/HostOsInfo.hh b/src/Lib/HostOsInfo.hh
index af00e94b2d361aba557445eab4835236b5a45cdb..65505d2e602aa6d209d5e6c74d5e1e739657151e 100644
--- a/src/Lib/HostOsInfo.hh
+++ b/src/Lib/HostOsInfo.hh
@@ -1,6 +1,7 @@
 #pragma once
 
-#include "Utils.hh"
+#include "PreCompiledHeaders.hh"
+#include "Lib/Utils.hh"
 
 #ifdef Q_OS_WIN
 #define VIVY_HOST_EXE_SUFFIX VIVY_WIN_EXE_SUFFIX
diff --git a/src/Lib/JsonBuilder.cc b/src/Lib/JsonBuilder.cc
index 105445ea825b94a0a6abac131139ea2621f38ffa..f8135518e74121597a85140ada8ac1c0198b4953 100644
--- a/src/Lib/JsonBuilder.cc
+++ b/src/Lib/JsonBuilder.cc
@@ -1,4 +1,5 @@
-#include "JsonBuilder.hh"
+#include "PreCompiledHeaders.hh"
+#include "Lib/JsonBuilder.hh"
 
 using namespace Vivy;
 
diff --git a/src/Lib/JsonBuilder.hh b/src/Lib/JsonBuilder.hh
index 4534b46381f19e29a24b084c3771c32b46f13adf..6afa29365c3bb9ac6b5e33d33bd371ecb1078d90 100644
--- a/src/Lib/JsonBuilder.hh
+++ b/src/Lib/JsonBuilder.hh
@@ -1,6 +1,7 @@
 #pragma once
 
-#include "Utils.hh"
+#include "PreCompiledHeaders.hh"
+#include "Lib/Utils.hh"
 
 namespace Vivy
 {
diff --git a/src/Lib/Log.cc b/src/Lib/Log.cc
index 245a8df13a5bab15490a249bc809fc041333b0e5..4cede87db6a84c071f4dc94cf543c05c55015909 100644
--- a/src/Lib/Log.cc
+++ b/src/Lib/Log.cc
@@ -1,4 +1,5 @@
-#include "Log.hh"
+#include "PreCompiledHeaders.hh"
+#include "Lib/Log.hh"
 
 // Vivy::LogLevel utility implementation
 namespace Vivy
diff --git a/src/Lib/Log.hh b/src/Lib/Log.hh
index 428fb35879cc48849da4d9cd91cea82fcd0e3b60..f81054e98b1d60c3038e7f29e49397d295394eb4 100644
--- a/src/Lib/Log.hh
+++ b/src/Lib/Log.hh
@@ -1,6 +1,7 @@
 #pragma once
 
-#include "Utils.hh"
+#include "PreCompiledHeaders.hh"
+#include "Lib/Utils.hh"
 
 // Create a logger with a category
 #define VIVY_GET_LOGGER(sink, cat)                (sink)->newLogger(std::string_view{ #cat })
diff --git a/src/Lib/Script/CRTPLuaScriptObject.hh b/src/Lib/Script/CRTPLuaScriptObject.hh
index 25f9d11f39ed2060feba0fdd271dcc90cc1b5d2f..3efe37d8d465861c6c53d10892b24c758441ed0a 100644
--- a/src/Lib/Script/CRTPLuaScriptObject.hh
+++ b/src/Lib/Script/CRTPLuaScriptObject.hh
@@ -1,9 +1,10 @@
 #pragma once
 
-#include "../../VivyApplication.hh"
-#include "../../Lib/Log.hh"
-#include "LuaContext.hh"
-#include "ScriptOption.hh"
+#include "PreCompiledHeaders.hh"
+#include "VivyApplication.hh"
+#include "Lib/Log.hh"
+#include "Lib/Script/LuaContext.hh"
+#include "Lib/Script/ScriptOption.hh"
 
 #include "lua.hpp"
 
diff --git a/src/Lib/Script/CRTPLuaScriptObject/FreeFunctions.cc b/src/Lib/Script/CRTPLuaScriptObject/FreeFunctions.cc
index 36c9cee70d84ed5ad0de6ccae9d6c000d0358bfe..26ab5865e035f8b3aa235a9d3fbe5dae32be9f0b 100644
--- a/src/Lib/Script/CRTPLuaScriptObject/FreeFunctions.cc
+++ b/src/Lib/Script/CRTPLuaScriptObject/FreeFunctions.cc
@@ -1,10 +1,11 @@
-#include "../CRTPLuaScriptObject.hh"
-#include "../LuaContext.hh"
-#include "../../Document/CRTPSubDocument.hh"
-#include "../../Document/VivyDocument.hh"
-#include "../../Audio.hh"
-#include "../../Video.hh"
-#include "../../../VivyApplication.hh"
+#include "PreCompiledHeaders.hh"
+#include "Lib/Script/CRTPLuaScriptObject.hh"
+#include "Lib/Script/LuaContext.hh"
+#include "Lib/Document/CRTPSubDocument.hh"
+#include "Lib/Document/VivyDocument.hh"
+#include "Lib/Audio.hh"
+#include "Lib/Video.hh"
+#include "VivyApplication.hh"
 
 using namespace Vivy::Script;
 
diff --git a/src/Lib/Script/CRTPLuaScriptObject/FunctionDeclaration.cc b/src/Lib/Script/CRTPLuaScriptObject/FunctionDeclaration.cc
index e773a13fc394db4ac8afbb0f238dcc2964dadee4..c55679ca299d4d488fb711ef45e6f8dbbcd97b98 100644
--- a/src/Lib/Script/CRTPLuaScriptObject/FunctionDeclaration.cc
+++ b/src/Lib/Script/CRTPLuaScriptObject/FunctionDeclaration.cc
@@ -1,4 +1,5 @@
-#include "../CRTPLuaScriptObject.hh"
+#include "PreCompiledHeaders.hh"
+#include "Lib/Script/CRTPLuaScriptObject.hh"
 
 using namespace Vivy::Script;
 
diff --git a/src/Lib/Script/CRTPLuaScriptObject/JobDeclaration.cc b/src/Lib/Script/CRTPLuaScriptObject/JobDeclaration.cc
index c3761f3acc2e0b0484bcb25a55cd7f7dda24d885..008dfc4370339e63d44decbf3bc4f0b8e9464b71 100644
--- a/src/Lib/Script/CRTPLuaScriptObject/JobDeclaration.cc
+++ b/src/Lib/Script/CRTPLuaScriptObject/JobDeclaration.cc
@@ -1,4 +1,5 @@
-#include "../CRTPLuaScriptObject.hh"
+#include "PreCompiledHeaders.hh"
+#include "Lib/Script/CRTPLuaScriptObject.hh"
 
 using namespace Vivy::Script;
 
diff --git a/src/Lib/Script/CRTPLuaScriptObject/ModuleDeclaration.cc b/src/Lib/Script/CRTPLuaScriptObject/ModuleDeclaration.cc
index 5de28117202757c0e20870b0a2204d6987b20308..dc18aef9f83ee1dcef99104b736158350e100634 100644
--- a/src/Lib/Script/CRTPLuaScriptObject/ModuleDeclaration.cc
+++ b/src/Lib/Script/CRTPLuaScriptObject/ModuleDeclaration.cc
@@ -1,4 +1,5 @@
-#include "../CRTPLuaScriptObject.hh"
+#include "PreCompiledHeaders.hh"
+#include "Lib/Script/CRTPLuaScriptObject.hh"
 
 using namespace Vivy::Script;
 
diff --git a/src/Lib/Script/CRTPLuaScriptObject/OptionDeclaration.cc b/src/Lib/Script/CRTPLuaScriptObject/OptionDeclaration.cc
index 3efa0998034804d90a5bd21946f7788ce7b2aaac..c0881e139a18a53f6c50ac4beb952b9047be4cf2 100644
--- a/src/Lib/Script/CRTPLuaScriptObject/OptionDeclaration.cc
+++ b/src/Lib/Script/CRTPLuaScriptObject/OptionDeclaration.cc
@@ -1,4 +1,5 @@
-#include "../CRTPLuaScriptObject.hh"
+#include "PreCompiledHeaders.hh"
+#include "Lib/Script/CRTPLuaScriptObject.hh"
 
 using namespace Vivy::Script;
 
diff --git a/src/Lib/Script/LuaContext.cc b/src/Lib/Script/LuaContext.cc
index 52c00dd7d2ded0365192014bbc7feea9c9fd518c..de8ab602343520fa2dc641cd1aaa89765528a165 100644
--- a/src/Lib/Script/LuaContext.cc
+++ b/src/Lib/Script/LuaContext.cc
@@ -1,7 +1,8 @@
-#include "CRTPLuaScriptObject.hh"
-#include "ScriptDocument.hh"
-#include "LuaContext.hh"
-#include "../Document/VivyDocument.hh"
+#include "PreCompiledHeaders.hh"
+#include "Lib/Script/CRTPLuaScriptObject.hh"
+#include "Lib/Script/ScriptDocument.hh"
+#include "Lib/Script/LuaContext.hh"
+#include "Lib/Document/VivyDocument.hh"
 
 // LuaContext implementation
 using namespace Vivy::Script;
diff --git a/src/Lib/Script/LuaContext.hh b/src/Lib/Script/LuaContext.hh
index 318751abaeb7ad0e7cbf53616a20b7aad56a8a0b..ba1b30d0c4115f98117c7bd0bf41e19e12752616 100644
--- a/src/Lib/Script/LuaContext.hh
+++ b/src/Lib/Script/LuaContext.hh
@@ -1,8 +1,9 @@
 #pragma once
 
-#include "../../VivyApplication.hh"
-#include "../Log.hh"
-#include "../Utils.hh"
+#include "PreCompiledHeaders.hh"
+#include "VivyApplication.hh"
+#include "Lib/Log.hh"
+#include "Lib/Utils.hh"
 
 struct lua_State;
 
diff --git a/src/Lib/Script/ScriptDocument.cc b/src/Lib/Script/ScriptDocument.cc
index 6294656caf585053e565d7926239742f00dd9926..4aa46d0ee530d8932897928834bddd5391f567f5 100644
--- a/src/Lib/Script/ScriptDocument.cc
+++ b/src/Lib/Script/ScriptDocument.cc
@@ -1,4 +1,5 @@
-#include "ScriptDocument.hh"
+#include "PreCompiledHeaders.hh"
+#include "Lib/Script/ScriptDocument.hh"
 
 #include <QFileInfo>
 #include <QFile>
diff --git a/src/Lib/Script/ScriptDocument.hh b/src/Lib/Script/ScriptDocument.hh
index 3799669c62b2b804c16ab65fe8f952b9cbb5eb35..7d13e12984c11f788d72d932925dca616bd66e78 100644
--- a/src/Lib/Script/ScriptDocument.hh
+++ b/src/Lib/Script/ScriptDocument.hh
@@ -4,8 +4,9 @@
 #error "This is a C++ header"
 #endif
 
-#include "../AbstractDocument.hh"
-#include "../Uuid.hh"
+#include "PreCompiledHeaders.hh"
+#include "Lib/AbstractDocument.hh"
+#include "Lib/Uuid.hh"
 
 class QTextDocument;
 
diff --git a/src/Lib/Script/ScriptOption.cc b/src/Lib/Script/ScriptOption.cc
index 2876d2fc18a14cf3e8560cfada3b0080a76dd2a5..3c855cf7d581f4887bf1a0300b2d96aacddfb29a 100644
--- a/src/Lib/Script/ScriptOption.cc
+++ b/src/Lib/Script/ScriptOption.cc
@@ -1,4 +1,5 @@
-#include "ScriptOption.hh"
+#include "PreCompiledHeaders.hh"
+#include "Lib/Script/ScriptOption.hh"
 
 // OptionDeclaration
 using namespace Vivy::Script;
diff --git a/src/Lib/Script/ScriptOption.hh b/src/Lib/Script/ScriptOption.hh
index 0cfef834096ac036983e9b6c9539de012d422ee8..fc3c060732df5883e18e6262e93920d141015682 100644
--- a/src/Lib/Script/ScriptOption.hh
+++ b/src/Lib/Script/ScriptOption.hh
@@ -1,5 +1,7 @@
 #pragma once
 
+#include "PreCompiledHeaders.hh"
+
 namespace Vivy::Script
 {
 // The options
diff --git a/src/Lib/Script/ScriptStore.cc b/src/Lib/Script/ScriptStore.cc
index 44b8e5d16652b9ac658debbdd7ec40c7ea1bfeba..a046ffbdef267e35e65c0087bcbe879655671be0 100644
--- a/src/Lib/Script/ScriptStore.cc
+++ b/src/Lib/Script/ScriptStore.cc
@@ -1,5 +1,6 @@
-#include "ScriptStore.hh"
-#include "../Uuid.hh"
+#include "PreCompiledHeaders.hh"
+#include "Lib/Script/ScriptStore.hh"
+#include "Lib/Uuid.hh"
 
 using namespace Vivy;
 using namespace std::string_literals;
diff --git a/src/Lib/Script/ScriptStore.hh b/src/Lib/Script/ScriptStore.hh
index 0a1968a6d3b2579843e248605191eca7e534690c..f0af2d6132aed34cf116cca38d12654ca52a2ee6 100644
--- a/src/Lib/Script/ScriptStore.hh
+++ b/src/Lib/Script/ScriptStore.hh
@@ -1,9 +1,9 @@
 #pragma once
 
-#include "../CRTPStore.hh"
-#include "../Document/VivyDocument.hh"
-#include "ScriptDocument.hh"
-#include "LuaContext.hh"
+#include "Lib/CRTPStore.hh"
+#include "Lib/Document/VivyDocument.hh"
+#include "Lib/Script/ScriptDocument.hh"
+#include "Lib/Script/LuaContext.hh"
 
 namespace Vivy::Script
 {
diff --git a/src/Lib/Utils.cc b/src/Lib/Utils.cc
index 9679378c3dbed92d0da9c39d53a8c5c12a3ca1e0..5bfeaab70b7818aa03d88bf61f8e7204c7989e2a 100644
--- a/src/Lib/Utils.cc
+++ b/src/Lib/Utils.cc
@@ -1,4 +1,5 @@
-#include "Utils.hh"
+#include "PreCompiledHeaders.hh"
+#include "Lib/Utils.hh"
 
 using namespace Vivy;
 
diff --git a/src/Lib/Utils.hh b/src/Lib/Utils.hh
index 898c73ca2428f50c859bba2ccf12a43162bb1216..097b16ad332a0335926063f990090d6372ae40ff 100644
--- a/src/Lib/Utils.hh
+++ b/src/Lib/Utils.hh
@@ -4,6 +4,8 @@
 #error "This is a C++ header"
 #endif
 
+#include "PreCompiledHeaders.hh"
+
 #define VIVY_PRAGMA(x) _Pragma(#x)
 #define TODO(x)        VIVY_PRAGMA(message("\"TODO: " #x "\""))
 
diff --git a/src/Lib/Uuid.cc b/src/Lib/Uuid.cc
index 7062680471fe5fa08e2aeb965807eac2b0dabd52..45509bd2097300a994a24eb9b670167ed678e3e0 100644
--- a/src/Lib/Uuid.cc
+++ b/src/Lib/Uuid.cc
@@ -1,5 +1,6 @@
-#include "Uuid.hh"
-#include "Log.hh"
+#include "PreCompiledHeaders.hh"
+#include "Lib/Uuid.hh"
+#include "Lib/Log.hh"
 
 Vivy::Uuid::Uuid()
     : QUuid(QUuid::createUuid())
diff --git a/src/Lib/Uuid.hh b/src/Lib/Uuid.hh
index 083e001f7192acd29c20d6ee447ebd68b8fcb8f6..9d9cb5b094f3b089fda2f99b3abd53a2e59ec99e 100644
--- a/src/Lib/Uuid.hh
+++ b/src/Lib/Uuid.hh
@@ -1,5 +1,7 @@
 #pragma once
 
+#include "PreCompiledHeaders.hh"
+
 namespace Vivy
 {
 struct Uuid : QUuid {
diff --git a/src/Lib/Video.cc b/src/Lib/Video.cc
index 3e2566c8949646bbf68c8d5adb3b79afa72f1d87..22a110628eaac53148637ff0127d51ac7e696e2b 100644
--- a/src/Lib/Video.cc
+++ b/src/Lib/Video.cc
@@ -1,5 +1,6 @@
-#include "Video.hh"
-#include "Utils.hh"
+#include "PreCompiledHeaders.hh"
+#include "Lib/Video.hh"
+#include "Lib/Utils.hh"
 
 using namespace Vivy;
 
diff --git a/src/Lib/Video.hh b/src/Lib/Video.hh
index 79ac20cebf4fcaced2e236087855d82f07126135..889e319ae95c7d4bbfe465392e69c5626c1cc4f1 100644
--- a/src/Lib/Video.hh
+++ b/src/Lib/Video.hh
@@ -4,7 +4,8 @@
 #error "This is a C++ header"
 #endif
 
-#include "AbstractMediaContext.hh"
+#include "PreCompiledHeaders.hh"
+#include "Lib/AbstractMediaContext.hh"
 
 namespace Vivy
 {
diff --git a/src/Main.cc b/src/Main.cc
index 1fcc24a12a4beb33e5f79e3135b0eeb6894b3ebb..f5f07f36794bf2f696a3d808ce235977c6f8c5fa 100644
--- a/src/Main.cc
+++ b/src/Main.cc
@@ -1,4 +1,5 @@
 #include "VivyApplication.hh"
+#include "PreCompiledHeaders.hh"
 
 int
 main(int argc, char **argv) noexcept
diff --git a/src/PreCompiledHeaders.hh b/src/PreCompiledHeaders.hh
new file mode 100644
index 0000000000000000000000000000000000000000..42453c938ad1753d6d0a642c58ebdcc3ec04e145
--- /dev/null
+++ b/src/PreCompiledHeaders.hh
@@ -0,0 +1,142 @@
+/* For CCLS to be happy */
+#pragma once
+
+/* System headers */
+#include <memory>
+#include <vector>
+#include <atomic>
+#include <algorithm>
+#include <stdexcept>
+#include <sstream>
+#include <map>
+#include <utility>
+#include <locale>
+#include <functional>
+#include <initializer_list>
+#include <cstring>
+#include <string>
+#include <string_view>
+#include <cstdio>
+#include <iostream>
+#include <optional>
+#include <type_traits>
+#include <chrono>
+#include <climits>
+#include <ctype.h>
+#include <mutex>
+#include <iomanip>
+#include <filesystem>
+#include <bit>
+
+/* EXT_INC_PRIVATE */
+#include <mpv/client.h>
+#include "../vendor/lua-5.4.3/src/lua.hpp"
+
+/* QT_STRUCT_INC */
+#include <qglobal.h>
+#include <QThread>
+#include <QOperatingSystemVersion>
+#include <QtGlobal>
+#include <QObject>
+#include <QRegularExpression>
+#include <QRegExp>
+#include <QString>
+#include <QVariant>
+#include <QFile>
+#include <QDebug>
+#include <QHash>
+#include <QDir>
+#include <QTextStream>
+#include <QFileInfo>
+#include <QMessageLogger>
+#include <QUuid>
+#include <QPointer>
+#include <QProcess>
+#include <QTimer>
+#include <QStack>
+#include <QTemporaryFile>
+#include <QStandardPaths>
+#include <QList>
+#include <QVector>
+#include <QMap>
+#include <QSettings>
+#include <QStringList>
+#include <QMetaEnum>
+#include <QJsonObject>
+#include <QJsonArray>
+#include <QJsonDocument>
+#include <QJsonValue>
+
+/* QT_WIDGET_INC */
+#include <QCoreApplication>
+#include <QTextDocument>
+#include <QColor>
+#include <QPalette>
+#include <QWidget>
+#include <QIcon>
+#include <QFont>
+#include <QPixmap>
+#include <QApplication>
+#include <QCloseEvent>
+#include <QLabel>
+#include <QPushButton>
+#include <QVBoxLayout>
+#include <QHBoxLayout>
+#include <QEvent>
+#include <QMouseEvent>
+#include <QTextEdit>
+#include <QDockWidget>
+#include <QMenu>
+#include <QFileDialog>
+#include <QMutex>
+#include <QMainWindow>
+#include <QPainter>
+#include <QPlainTextEdit>
+#include <QSlider>
+#include <QAbstractItemModel>
+#include <QHeaderView>
+#include <QPaintEvent>
+#include <QTableView>
+#include <QStyledItemDelegate>
+#include <QMessageBox>
+#include <QScrollBar>
+#include <QScrollArea>
+#include <QGraphicsPixmapItem>
+#include <QGraphicsSceneMouseEvent>
+#include <QPen>
+#include <QAction>
+#include <QGraphicsItem>
+#include <QGraphicsLineItem>
+#include <QTreeView>
+#include <QGraphicsView>
+#include <QGraphicsScene>
+#include <QWindow>
+#include <QAbstractScrollArea>
+#include <QGraphicsLineItem>
+#include <QGraphicsPixmapItem>
+#include <QClipboard>
+#include <QInputMethodEvent>
+#include <QKeyEvent>
+#include <QLineEdit>
+#include <QTextBlock>
+#include <QTextCursor>
+#include <QTextDocumentFragment>
+#include <QMimeData>
+#include <QSharedPointer>
+#include <QStatusBar>
+#include <QBrush>
+#include <QFrame>
+#include <QSyntaxHighlighter>
+#include <QTextCharFormat>
+#include <QTabWidget>
+#include <QLayoutItem>
+#include <QLayout>
+#include <QEventLoop>
+#include <QImage>
+#include <QToolBar>
+#include <QMenuBar>
+#include <QDialogButtonBox>
+#include <QFileIconProvider>
+#include <QFontDatabase>
+#include <QTextCodec>
+#include <QListWidget>
diff --git a/src/UI/AboutWindow.cc b/src/UI/AboutWindow.cc
index 2faabee9bd54aac84530089fcaabed12e1b612e2..307c09a2b4c48a84c098257b47756b25a7e9b070 100644
--- a/src/UI/AboutWindow.cc
+++ b/src/UI/AboutWindow.cc
@@ -1,5 +1,6 @@
-#include "AboutWindow.hh"
-#include "../VivyApplication.hh"
+#include "PreCompiledHeaders.hh"
+#include "UI/AboutWindow.hh"
+#include "VivyApplication.hh"
 
 using namespace Vivy;
 
diff --git a/src/UI/AboutWindow.hh b/src/UI/AboutWindow.hh
index 73c8e640012f897620192da41318e23f3433113b..dc8b981348696830cd5f7137185c861da5d2615a 100644
--- a/src/UI/AboutWindow.hh
+++ b/src/UI/AboutWindow.hh
@@ -1,8 +1,9 @@
 #pragma once
 
-#include "../VivyApplication.hh"
-#include "../Lib/Utils.hh"
-#include "../Lib/Log.hh"
+#include "PreCompiledHeaders.hh"
+#include "VivyApplication.hh"
+#include "Lib/Utils.hh"
+#include "Lib/Log.hh"
 
 namespace Vivy
 {
diff --git a/src/UI/AbstractDocumentView.cc b/src/UI/AbstractDocumentView.cc
index d56a35bd2e8523d1a0511f5843403cbfa9ae9389..e0e39bbbc80d30d1c7abfede192a931f71368b05 100644
--- a/src/UI/AbstractDocumentView.cc
+++ b/src/UI/AbstractDocumentView.cc
@@ -1,4 +1,5 @@
-#include "AbstractDocumentView.hh"
+#include "PreCompiledHeaders.hh"
+#include "UI/AbstractDocumentView.hh"
 
 using namespace Vivy;
 
diff --git a/src/UI/AbstractDocumentView.hh b/src/UI/AbstractDocumentView.hh
index 8da2204c72a858621090013281c02f854dde14e7..a5a6210bc58157df4d70c849c0337d1bb29fa68c 100644
--- a/src/UI/AbstractDocumentView.hh
+++ b/src/UI/AbstractDocumentView.hh
@@ -4,9 +4,10 @@
 #error "This is a C++ header"
 #endif
 
-#include "../Lib/Utils.hh"
-#include "../Lib/AbstractDocument.hh"
-#include "UnclosableDockWidget.hh"
+#include "PreCompiledHeaders.hh"
+#include "Lib/Utils.hh"
+#include "Lib/AbstractDocument.hh"
+#include "UI/UnclosableDockWidget.hh"
 
 namespace Vivy
 {
diff --git a/src/UI/DockWidgetTitleBar.cc b/src/UI/DockWidgetTitleBar.cc
index 46bc79c28f393361aef522ff04c94fee9394b6bf..0f4c28a114cd6800a724bf552e156da1ff1513bf 100644
--- a/src/UI/DockWidgetTitleBar.cc
+++ b/src/UI/DockWidgetTitleBar.cc
@@ -1,4 +1,5 @@
-#include "DockWidgetTitleBar.hh"
+#include "PreCompiledHeaders.hh"
+#include "UI/DockWidgetTitleBar.hh"
 
 using namespace Vivy;
 
diff --git a/src/UI/DockWidgetTitleBar.hh b/src/UI/DockWidgetTitleBar.hh
index f3eace6b0c63d4194878a6a9dc23b5cf6f041034..98f788ff31087324ecc343867cf6a99a7fb53657 100644
--- a/src/UI/DockWidgetTitleBar.hh
+++ b/src/UI/DockWidgetTitleBar.hh
@@ -1,8 +1,9 @@
 #pragma once
 
-#include "../VivyApplication.hh"
-#include "../Lib/Log.hh"
-#include "Utils.hh"
+#include "PreCompiledHeaders.hh"
+#include "VivyApplication.hh"
+#include "Lib/Log.hh"
+#include "UI/Utils.hh"
 
 namespace Vivy
 {
diff --git a/src/UI/DocumentViews/AssLinesModel.cc b/src/UI/DocumentViews/AssLinesModel.cc
index 0ee7797bae519ebdc16024d364cdaf86ac13a23e..01d6c09165d078afdd7f19451116843413a8236e 100644
--- a/src/UI/DocumentViews/AssLinesModel.cc
+++ b/src/UI/DocumentViews/AssLinesModel.cc
@@ -1,4 +1,5 @@
-#include "AssLinesModel.hh"
+#include "PreCompiledHeaders.hh"
+#include "UI/DocumentViews/AssLinesModel.hh"
 
 using namespace Vivy;
 
diff --git a/src/UI/DocumentViews/AssLinesModel.hh b/src/UI/DocumentViews/AssLinesModel.hh
index 5075ca18b6e7e6b6ed4219232151334c1d986ee6..61feec30be90f083d77e36d1de3ffbfc673ef6ae 100644
--- a/src/UI/DocumentViews/AssLinesModel.hh
+++ b/src/UI/DocumentViews/AssLinesModel.hh
@@ -1,7 +1,8 @@
 #pragma once
 
-#include "../../Lib/Utils.hh"
-#include "../../Lib/Ass/Ass.hh"
+#include "PreCompiledHeaders.hh"
+#include "Lib/Utils.hh"
+#include "Lib/Ass/Ass.hh"
 
 namespace Vivy
 {
diff --git a/src/UI/DocumentViews/AssLinesView.cc b/src/UI/DocumentViews/AssLinesView.cc
index 8df19318c14bb2da9c677746f2bb467493859401..6fe7d499362e1b77b7cf463ab110a9c6077e6c7d 100644
--- a/src/UI/DocumentViews/AssLinesView.cc
+++ b/src/UI/DocumentViews/AssLinesView.cc
@@ -1,5 +1,6 @@
-#include "AssLinesView.hh"
-#include "../../VivyApplication.hh"
+#include "PreCompiledHeaders.hh"
+#include "UI/DocumentViews/AssLinesView.hh"
+#include "VivyApplication.hh"
 
 using namespace Vivy;
 
diff --git a/src/UI/DocumentViews/AssLinesView.hh b/src/UI/DocumentViews/AssLinesView.hh
index 2a3db7e05cd75357fd638faefbf8b9f2ae4825cf..77cccdb830181937c14321239fd2782fe7f457b1 100644
--- a/src/UI/DocumentViews/AssLinesView.hh
+++ b/src/UI/DocumentViews/AssLinesView.hh
@@ -1,6 +1,7 @@
 #pragma once
 
-#include "../../Lib/Utils.hh"
+#include "PreCompiledHeaders.hh"
+#include "Lib/Utils.hh"
 
 namespace Vivy
 {
diff --git a/src/UI/DocumentViews/AudioVisualizer.cc b/src/UI/DocumentViews/AudioVisualizer.cc
index 62582f5436341d37c547b26ac30cf3794f3eb92c..deb6126c6771b4397028aa56c941e714ae443756 100644
--- a/src/UI/DocumentViews/AudioVisualizer.cc
+++ b/src/UI/DocumentViews/AudioVisualizer.cc
@@ -1,5 +1,4 @@
-#include "AudioVisualizer.hh"
-#include "../../Lib/Audio.hh"
+#include "UI/DocumentViews/AudioVisualizer.hh"
 
 using namespace Vivy;
 
diff --git a/src/UI/DocumentViews/AudioVisualizer.hh b/src/UI/DocumentViews/AudioVisualizer.hh
index ca1cd3a2f6485db6cdd2019c185a8d8d6e26ff31..e9b74ef5d4c0ffe1b557dbbd500f1412a8e59bb9 100644
--- a/src/UI/DocumentViews/AudioVisualizer.hh
+++ b/src/UI/DocumentViews/AudioVisualizer.hh
@@ -5,11 +5,12 @@
 #error "This is a C++ header"
 #endif
 
+#include "PreCompiledHeaders.hh"
 #include "AudioVisualizer/TimingScene.hh"
 #include "AudioVisualizer/TimingView.hh"
 #include "AudioVisualizer/TimingParams.hh"
-#include "../../Lib/Audio.hh"
-#include "../VivyDocumentView.hh"
+#include "Lib/Audio.hh"
+#include "UI/VivyDocumentView.hh"
 
 namespace Vivy
 {
diff --git a/src/UI/DocumentViews/AudioVisualizer/TimingAxis.cc b/src/UI/DocumentViews/AudioVisualizer/TimingAxis.cc
index 6f69f07c9f7e3d80ab53bec1267b4ed49b439533..986b1c6da958d23b3a72f499105af9a18f5fdabd 100644
--- a/src/UI/DocumentViews/AudioVisualizer/TimingAxis.cc
+++ b/src/UI/DocumentViews/AudioVisualizer/TimingAxis.cc
@@ -1,17 +1,5 @@
 #include "TimingAxis.hh"
 
-#include <QApplication>
-#include <QGraphicsSceneMouseEvent>
-#include <QLabel>
-#include <QMessageBox>
-#include <QMouseEvent>
-#include <QPen>
-#include <QScrollArea>
-#include <QScrollBar>
-#include <QVBoxLayout>
-#include <QTime>
-#include <QStyleOptionGraphicsItem>
-
 #include "TimingUtils.hh"
 
 using namespace Vivy;
diff --git a/src/UI/DocumentViews/AudioVisualizer/TimingAxis.hh b/src/UI/DocumentViews/AudioVisualizer/TimingAxis.hh
index 13235d96ba67a301833473b2e632c150a44aece6..040f75a9f1e24925ff093d2e2a1caf4ef56fbd02 100644
--- a/src/UI/DocumentViews/AudioVisualizer/TimingAxis.hh
+++ b/src/UI/DocumentViews/AudioVisualizer/TimingAxis.hh
@@ -5,14 +5,7 @@
 #error "This is a C++ header"
 #endif
 
-#include <QGraphicsWidget>
-#include <QPainter>
-#include <QGraphicsScene>
-#include <cmath>
-#include <QGraphicsObject>
-#include <QGraphicsItem>
-
-#include "../../../Lib/Audio.hh"
+#include "PreCompiledHeaders.hh"
 
 namespace Vivy
 {
diff --git a/src/UI/DocumentViews/AudioVisualizer/TimingBar.hh b/src/UI/DocumentViews/AudioVisualizer/TimingBar.hh
index 583ee164782b1f1909a2c8f23a6dde6454d625cd..01c529ad728c1e4dfcec1f672cc64a73064ead30 100644
--- a/src/UI/DocumentViews/AudioVisualizer/TimingBar.hh
+++ b/src/UI/DocumentViews/AudioVisualizer/TimingBar.hh
@@ -4,6 +4,8 @@
 #error "This is a C++ header"
 #endif
 
+#include "PreCompiledHeaders.hh"
+
 namespace Vivy
 {
 class TimingBar final : public QGraphicsLineItem {
diff --git a/src/UI/DocumentViews/AudioVisualizer/TimingCursor.cc b/src/UI/DocumentViews/AudioVisualizer/TimingCursor.cc
index d1c57ef6a06d8dcbd25d02c153e00dcb83182a46..6896039c9b5c437c705939b89141507030fec719 100644
--- a/src/UI/DocumentViews/AudioVisualizer/TimingCursor.cc
+++ b/src/UI/DocumentViews/AudioVisualizer/TimingCursor.cc
@@ -1,8 +1,5 @@
 #include "TimingCursor.hh"
 
-#include <QPainter>
-#include <QGraphicsScene>
-
 #include "TimingUtils.hh"
 
 using namespace Vivy;
diff --git a/src/UI/DocumentViews/AudioVisualizer/TimingCursor.hh b/src/UI/DocumentViews/AudioVisualizer/TimingCursor.hh
index bd0c765fa1474ba5490e7fa806ba90a45edb485e..c7c72ff32d6a5b13eb609800090b5aa5abd8dafd 100644
--- a/src/UI/DocumentViews/AudioVisualizer/TimingCursor.hh
+++ b/src/UI/DocumentViews/AudioVisualizer/TimingCursor.hh
@@ -1,6 +1,6 @@
 #pragma once
 
-#include <QGraphicsItem>
+#include "PreCompiledHeaders.hh"
 
 namespace Vivy
 {
diff --git a/src/UI/DocumentViews/AudioVisualizer/TimingLine.cc b/src/UI/DocumentViews/AudioVisualizer/TimingLine.cc
index e64008b941d941456ad5cfd6915ba8995b8bf003..ad2c0e57601ebf614719b6efebaf81112744e0df 100644
--- a/src/UI/DocumentViews/AudioVisualizer/TimingLine.cc
+++ b/src/UI/DocumentViews/AudioVisualizer/TimingLine.cc
@@ -1,8 +1,5 @@
 #include "TimingLine.hh"
 
-#include <QPainter>
-#include <QGraphicsScene>
-
 #include "TimingUtils.hh"
 
 using namespace Vivy;
diff --git a/src/UI/DocumentViews/AudioVisualizer/TimingLine.hh b/src/UI/DocumentViews/AudioVisualizer/TimingLine.hh
index cda92bd848bc2bf234f4e7cd38039f1aeb66ae3a..fbaf7f0e1f7db0eb15c1bb30513b45ad6438523b 100644
--- a/src/UI/DocumentViews/AudioVisualizer/TimingLine.hh
+++ b/src/UI/DocumentViews/AudioVisualizer/TimingLine.hh
@@ -1,8 +1,8 @@
 #pragma once
 
-#include <QGraphicsObject>
+#include <PreCompiledHeaders.hh>
 
-#include "../../../Lib/Ass/Ass.hh"
+#include "Lib/Ass/Ass.hh"
 #include "TimingSeparator.hh"
 #include "TimingSyl.hh"
 
diff --git a/src/UI/DocumentViews/AudioVisualizer/TimingParams.hh b/src/UI/DocumentViews/AudioVisualizer/TimingParams.hh
index 09d56ce2339686a97ed499247207f35ad0ea64b4..048caa6b3e8361692ed1f091688d2d83aa800676 100644
--- a/src/UI/DocumentViews/AudioVisualizer/TimingParams.hh
+++ b/src/UI/DocumentViews/AudioVisualizer/TimingParams.hh
@@ -5,12 +5,8 @@
 #error "This is a C++ header"
 #endif
 
-#include "../../../Lib/Utils.hh"
-
-#include <QWidget>
-#include <QSlider>
-#include <QLayout>
-#include <QPushButton>
+#include "PreCompiledHeaders.hh"
+#include "Lib/Utils.hh"
 
 namespace Vivy
 {
diff --git a/src/UI/DocumentViews/AudioVisualizer/TimingScene.cc b/src/UI/DocumentViews/AudioVisualizer/TimingScene.cc
index 1f492d672a13aa063ce9f0868ed716b617ca6d27..247774a8f7b394e3a54635a1d04464f773a12e06 100644
--- a/src/UI/DocumentViews/AudioVisualizer/TimingScene.cc
+++ b/src/UI/DocumentViews/AudioVisualizer/TimingScene.cc
@@ -1,28 +1,5 @@
 #include "TimingScene.hh"
 
-#include <QGraphicsLineItem>
-#include <QGraphicsPixmapItem>
-#include <QGraphicsView>
-#include <QLabel>
-#include <QMessageBox>
-#include <QMouseEvent>
-#include <QPainter>
-#include <QGraphicsSceneMouseEvent>
-#include <QScrollArea>
-#include <QScrollBar>
-#include <QVBoxLayout>
-#include <QGraphicsItem>
-#include <QGraphicsScene>
-
-#include "../../../Lib/Utils.hh"
-#include "../../../Lib/Ass/Ass.hh"
-#include "../../../Lib/Document/VivyDocument.hh"
-
-#include "TimingUtils.hh"
-
-#include "TimingAxis.hh"
-#include "TimingCursor.hh"
-
 using namespace Vivy;
 
 //TimingScene::TimingScene(QWidget *parent) noexcept
diff --git a/src/UI/DocumentViews/AudioVisualizer/TimingScene.hh b/src/UI/DocumentViews/AudioVisualizer/TimingScene.hh
index a6d8ea5d22a7419ba87511283f310881dfd5e4e6..0120029bcb1d3165b41a5fe4743303c15a7f2a4a 100644
--- a/src/UI/DocumentViews/AudioVisualizer/TimingScene.hh
+++ b/src/UI/DocumentViews/AudioVisualizer/TimingScene.hh
@@ -1,16 +1,17 @@
 #pragma once
 
-#include "../../../Lib/Utils.hh"
-#include "../../../Lib/Audio.hh"
-#include "../../../Lib/Ass/Ass.hh"
-#include "TimingAxis.hh"
-#include "TimingCursor.hh"
+#include "PreCompiledHeaders.hh"
 
-#include "../../VivyDocumentView.hh"
-#include "../AssLinesView.hh"
+#include "UI/VivyDocumentView.hh"
+#include "Lib/Utils.hh"
+#include "Lib/Audio.hh"
+#include "Lib/Ass/Ass.hh"
+#include "UI/DocumentViews/AssLinesView.hh"
 
-#include "../../AbstractVivyDocumentNeeder.hh"
+#include "UI/AbstractVivyDocumentNeeder.hh"
 
+#include "TimingAxis.hh"
+#include "TimingCursor.hh"
 #include "TimingLine.hh"
 
 namespace Vivy
diff --git a/src/UI/DocumentViews/AudioVisualizer/TimingSeparator.cc b/src/UI/DocumentViews/AudioVisualizer/TimingSeparator.cc
index 05ccb1bb11404e58cfd51fcd3891a5397f34a3fa..0d7f2682f550909df97e5a6270ac8d4c6e59c01e 100644
--- a/src/UI/DocumentViews/AudioVisualizer/TimingSeparator.cc
+++ b/src/UI/DocumentViews/AudioVisualizer/TimingSeparator.cc
@@ -1,9 +1,5 @@
 #include "TimingSeparator.hh"
 
-#include <QPainter>
-#include <QGraphicsScene>
-#include <QDrag>
-
 #include "TimingUtils.hh"
 #include "TimingLine.hh"
 
diff --git a/src/UI/DocumentViews/AudioVisualizer/TimingSeparator.hh b/src/UI/DocumentViews/AudioVisualizer/TimingSeparator.hh
index 67312d0bbcddfcdf6e5683c21498be61a9bfda77..0d85bdc1ca6c67c57ebae6d00da9590f55d44632 100644
--- a/src/UI/DocumentViews/AudioVisualizer/TimingSeparator.hh
+++ b/src/UI/DocumentViews/AudioVisualizer/TimingSeparator.hh
@@ -1,7 +1,6 @@
 #pragma once
 
-#include <QGraphicsObject>
-#include <QGraphicsSceneDragDropEvent>
+#include "PreCompiledHeaders.hh"
 
 namespace Vivy
 {
diff --git a/src/UI/DocumentViews/AudioVisualizer/TimingSyl.cc b/src/UI/DocumentViews/AudioVisualizer/TimingSyl.cc
index 4be5e87eb61470457ddcef09fbe0a239e81595c6..f38ece882829c62bcf2109db55028b354e012703 100644
--- a/src/UI/DocumentViews/AudioVisualizer/TimingSyl.cc
+++ b/src/UI/DocumentViews/AudioVisualizer/TimingSyl.cc
@@ -1,8 +1,5 @@
 #include "TimingSyl.hh"
 
-#include <QPainter>
-#include <QGraphicsScene>
-
 #include "TimingUtils.hh"
 #include "TimingSeparator.hh"
 
diff --git a/src/UI/DocumentViews/AudioVisualizer/TimingSyl.hh b/src/UI/DocumentViews/AudioVisualizer/TimingSyl.hh
index 26a46ae56d4f6aa0c4e9dcbba9f2c5893f4bd9e3..18b148dfa1fc5377ee6f2a30633a160b2c2dde5b 100644
--- a/src/UI/DocumentViews/AudioVisualizer/TimingSyl.hh
+++ b/src/UI/DocumentViews/AudioVisualizer/TimingSyl.hh
@@ -1,8 +1,8 @@
 #pragma once
 
-#include <QGraphicsObject>
+#include "PreCompiledHeaders.hh"
 
-#include "../../../Lib/Ass/Ass.hh"
+#include "Lib/Ass/Ass.hh"
 
 namespace Vivy
 {
diff --git a/src/UI/DocumentViews/AudioVisualizer/TimingUtils.hh b/src/UI/DocumentViews/AudioVisualizer/TimingUtils.hh
index 65a8d3bdb90601666cc259d58727b7556eed851f..2937527b60d7130dc805b6402aab6b25bb14b9b3 100644
--- a/src/UI/DocumentViews/AudioVisualizer/TimingUtils.hh
+++ b/src/UI/DocumentViews/AudioVisualizer/TimingUtils.hh
@@ -4,8 +4,7 @@
 #error "This is a C++ header"
 #endif
 
-#include <QRectF>
-#include <QString>
+#include <PreCompiledHeaders.hh>
 
 #define getTimingScene() static_cast<TimingScene *>(scene())
 
diff --git a/src/UI/DocumentViews/AudioVisualizer/TimingView.hh b/src/UI/DocumentViews/AudioVisualizer/TimingView.hh
index ecdb543c998546618cc09e58e0c21340244bb7b8..1942a7ccc53a4c835ed67523473c710413e84310 100644
--- a/src/UI/DocumentViews/AudioVisualizer/TimingView.hh
+++ b/src/UI/DocumentViews/AudioVisualizer/TimingView.hh
@@ -4,11 +4,11 @@
 #error "This is a C++ header"
 #endif
 
-#include "../../../Lib/Utils.hh"
-#include "../../../Lib/Audio.hh"
-#include "TimingBar.hh"
-#include "TimingAxis.hh"
-#include "TimingScene.hh"
+#include "PreCompiledHeaders.hh"
+#include "Lib/Utils.hh"
+#include "Lib/Audio.hh"
+#include "UI/DocumentViews/TimingBar.hh"
+#include "UI/DocumentViews/TimingScene.hh"
 
 namespace Vivy
 {
diff --git a/src/UI/DocumentViews/MpvContainer.cc b/src/UI/DocumentViews/MpvContainer.cc
index fb094d4e4de76b9ac07418019d03b36714ede238..c0e3c49b1d7921ea671f041f4520c0e6da3d3618 100644
--- a/src/UI/DocumentViews/MpvContainer.cc
+++ b/src/UI/DocumentViews/MpvContainer.cc
@@ -1,4 +1,5 @@
-#include "MpvContainer.hh"
+#include "PreCompiledHeaders.hh"
+#include "UI/DocumentViews/MpvContainer.hh"
 
 using namespace Vivy;
 using namespace std::string_literals;
@@ -297,6 +298,10 @@ MpvContainer::mpvPause() noexcept
 void
 MpvContainer::mpvTogglePlayback() noexcept
 {
+    if (!isMpvAlreadyInitialized) {
+        reCreateMpvContext();
+    }
+
     logDebug() << "MPV: Toggling the playback";
     asyncCommand(AsyncCmdType::TogglePlayback, { "cycle", "pause", "up", nullptr });
 }
diff --git a/src/UI/DocumentViews/MpvContainer.hh b/src/UI/DocumentViews/MpvContainer.hh
index 37729f04dfa9ee9ee5ed2a04d6169645005ff90c..b83e6f9d65ccb9c6b4ecdd552da7982516e45a39 100644
--- a/src/UI/DocumentViews/MpvContainer.hh
+++ b/src/UI/DocumentViews/MpvContainer.hh
@@ -4,9 +4,10 @@
 #error "This is a C++ header"
 #endif
 
-#include "../../VivyApplication.hh"
-#include "../../Lib/Utils.hh"
-#include "../../Lib/Log.hh"
+#include "PreCompiledHeaders.hh"
+#include "VivyApplication.hh"
+#include "Lib/Utils.hh"
+#include "Lib/Log.hh"
 
 extern "C" {
 struct mpv_handle;
diff --git a/src/UI/DocumentViews/MpvControls.cc b/src/UI/DocumentViews/MpvControls.cc
index 9bcb033b09803cd3c6191754cd175514c2e9371a..51a3c30f9bcab35f5fa361857e367dae97b0e39a 100644
--- a/src/UI/DocumentViews/MpvControls.cc
+++ b/src/UI/DocumentViews/MpvControls.cc
@@ -1,5 +1,6 @@
-#include "MpvControls.hh"
-#include "MpvContainer.hh"
+#include "PreCompiledHeaders.hh"
+#include "UI/DocumentViews/MpvControls.hh"
+#include "UI/DocumentViews/MpvContainer.hh"
 
 using namespace Vivy;
 
@@ -56,7 +57,6 @@ MpvControls::MpvControls(MpvContainer *passedContainer, QWidget *parent) noexcep
     });
 
     connect(togglePlaybackButton, &QAbstractButton::clicked, mpv, &MpvContainer::mpvTogglePlayback);
-    connect(reCreateMpvButton, &QAbstractButton::clicked, mpv, &MpvContainer::reCreateMpvContext);
     connect(mpv, &MpvContainer::mpvPlaybackToggled, this,
             [this, togglePlaybackButton](bool isPlay) noexcept -> void {
                 togglePlaybackButton->setIcon(isPlay ? pauseIcon : playIcon);
@@ -64,7 +64,6 @@ MpvControls::MpvControls(MpvContainer *passedContainer, QWidget *parent) noexcep
 
     auto *centralLayout = new QHBoxLayout(this);
     centralLayout->addWidget(togglePlaybackButton);
-    centralLayout->addWidget(reCreateMpvButton);
     centralLayout->addWidget(progressBar, 1);
     setLayout(centralLayout);
 }
diff --git a/src/UI/DocumentViews/MpvControls.hh b/src/UI/DocumentViews/MpvControls.hh
index 84cd143aaa76c30f6fb293124b73b245729ec93e..8f4e6dbd9d52252eb9a02717b79ca890daf097ca 100644
--- a/src/UI/DocumentViews/MpvControls.hh
+++ b/src/UI/DocumentViews/MpvControls.hh
@@ -4,8 +4,9 @@
 #error "This is a C++ header"
 #endif
 
-#include "../../VivyApplication.hh"
-#include "../../Lib/Utils.hh"
+#include "PreCompiledHeaders.hh"
+#include "VivyApplication.hh"
+#include "Lib/Utils.hh"
 
 namespace Vivy
 {
@@ -23,7 +24,6 @@ private:
 
     const QIcon playIcon{ VIVY_ICON_PLAY };
     const QIcon pauseIcon{ VIVY_ICON_PAUSE };
-    const QIcon reCreateMpvIcon{ VIVY_ICON_RUN };
 
 public:
     explicit MpvControls(MpvContainer *mpv, QWidget *parent) noexcept;
diff --git a/src/UI/DocumentViews/VideoView.cc b/src/UI/DocumentViews/VideoView.cc
index 30eee0e0863deaac58c2187232336f20395939a0..daefdbdbae7d3882c6f584f22de2f4dd66d9fb67 100644
--- a/src/UI/DocumentViews/VideoView.cc
+++ b/src/UI/DocumentViews/VideoView.cc
@@ -1,6 +1,7 @@
-#include "VideoView.hh"
-#include "MpvContainer.hh"
-#include "MpvControls.hh"
+#include "PreCompiledHeaders.hh"
+#include "UI/DocumentViews/VideoView.hh"
+#include "UI/DocumentViews/MpvContainer.hh"
+#include "UI/DocumentViews/MpvControls.hh"
 
 using namespace Vivy;
 
diff --git a/src/UI/DocumentViews/VideoView.hh b/src/UI/DocumentViews/VideoView.hh
index 20a97b8d6c519cd28d0b1d96e670161303582a9c..debff27d89483fa9934fc36fe11daf9dcb14e01c 100644
--- a/src/UI/DocumentViews/VideoView.hh
+++ b/src/UI/DocumentViews/VideoView.hh
@@ -4,7 +4,8 @@
 #error "This is a C++ header"
 #endif
 
-#include "../../Lib/Utils.hh"
+#include "PreCompiledHeaders.hh"
+#include "Lib/Utils.hh"
 
 namespace Vivy
 {
diff --git a/src/UI/FakeVim/FakeVimActions.cc b/src/UI/FakeVim/FakeVimActions.cc
index 045fd3a244612bf2ee605aead272079aabd0c3b6..afb8aa91f3da6984d7ee48fc23790de6e68a7ca4 100644
--- a/src/UI/FakeVim/FakeVimActions.cc
+++ b/src/UI/FakeVim/FakeVimActions.cc
@@ -1,7 +1,7 @@
-#include "FakeVimActions.hh"
-#include "FakeVimHandler.hh"
-
-#include "../../Lib/Utils.hh"
+#include "PreCompiledHeaders.hh"
+#include "UI/FakeVim/FakeVimActions.hh"
+#include "UI/FakeVim/FakeVimHandler.hh"
+#include "Lib/Utils.hh"
 
 namespace Vivy
 {
diff --git a/src/UI/FakeVim/FakeVimActions.hh b/src/UI/FakeVim/FakeVimActions.hh
index 69a9a01ecaf6892ed8fd30b433c5ca9d8367c413..4a1616250fd6d4ec3c3817bc95cceedee6694774 100644
--- a/src/UI/FakeVim/FakeVimActions.hh
+++ b/src/UI/FakeVim/FakeVimActions.hh
@@ -1,5 +1,6 @@
 #pragma once
 
+#include "PreCompiledHeaders.hh"
 #define FAKEVIM_STANDALONE
 
 namespace Vivy
diff --git a/src/UI/FakeVim/FakeVimHandler.cc b/src/UI/FakeVim/FakeVimHandler.cc
index 2cede1aa033ea1c6ababdef39987a71fbbf1be16..999f865b4374c8a415eebe24539c76e6590947aa 100644
--- a/src/UI/FakeVim/FakeVimHandler.cc
+++ b/src/UI/FakeVim/FakeVimHandler.cc
@@ -28,10 +28,11 @@
 //   if the last movement command was exclusive (MoveExclusive).
 //
 
-#include "FakeVimHandler.hh"
-#include "FakeVimActions.hh"
-#include "FakeVimTr.hh"
-#include "../../Lib/Utils.hh"
+#include "PreCompiledHeaders.hh"
+#include "UI/FakeVim/FakeVimHandler.hh"
+#include "UI/FakeVim/FakeVimActions.hh"
+#include "UI/FakeVim/FakeVimTr.hh"
+#include "Lib/Utils.hh"
 
 //#define DEBUG_KEY  1
 #if defined(DEBUG_KEY) && DEBUG_KEY
diff --git a/src/UI/FakeVim/FakeVimHandler.hh b/src/UI/FakeVim/FakeVimHandler.hh
index eb8fea4eb9cc07118b09c9d9a309cfa8161803f1..ea3832f3e78e5bdf8df043c0ccf76910a60732a7 100644
--- a/src/UI/FakeVim/FakeVimHandler.hh
+++ b/src/UI/FakeVim/FakeVimHandler.hh
@@ -1,8 +1,9 @@
 #pragma once
 
-#include "../../VivyApplication.hh"
-#include "../../Lib/Log.hh"
-#include "../../Lib/Utils.hh"
+#include "PreCompiledHeaders.hh"
+#include "VivyApplication.hh"
+#include "Lib/Log.hh"
+#include "Lib/Utils.hh"
 
 #define FAKEVIM_STANDALONE
 
diff --git a/src/UI/FakeVim/FakeVimTr.hh b/src/UI/FakeVim/FakeVimTr.hh
index 4f2b78e9800816bdc5c24c99ab849a5da3e8e70f..5e7c7b844bd9321a95a80477ae89e5d6cd92d73b 100644
--- a/src/UI/FakeVim/FakeVimTr.hh
+++ b/src/UI/FakeVim/FakeVimTr.hh
@@ -1,5 +1,6 @@
 #pragma once
 
+#include "PreCompiledHeaders.hh"
 namespace Vivy
 {
 struct Tr {
diff --git a/src/UI/LogConsole.cc b/src/UI/LogConsole.cc
index 544392d5d937c1c2f9d9b78e3a5883ad935d4624..1151885498cb3e5f2faec3f6cbafa3370061fe05 100644
--- a/src/UI/LogConsole.cc
+++ b/src/UI/LogConsole.cc
@@ -1,4 +1,5 @@
-#include "LogConsole.hh"
+#include "PreCompiledHeaders.hh"
+#include "UI/LogConsole.hh"
 
 using namespace Vivy;
 
diff --git a/src/UI/LogConsole.hh b/src/UI/LogConsole.hh
index a388e330d81b87ff10e4ba93ee520bbf1ca30d16..c6be3e78ae08a749ce94f9a583e770e8650ad625 100644
--- a/src/UI/LogConsole.hh
+++ b/src/UI/LogConsole.hh
@@ -1,7 +1,8 @@
 #pragma once
 
-#include "Utils.hh"
-#include "../Lib/Log.hh"
+#include "PreCompiledHeaders.hh"
+#include "UI/Utils.hh"
+#include "Lib/Log.hh"
 
 namespace Vivy
 {
diff --git a/src/UI/MainWindow.cc b/src/UI/MainWindow.cc
index fc9f62394a6e6b9b72e3d48c2619030f62899338..a877dcc60bd6118a41e895cb8e170e9e12c227ac 100644
--- a/src/UI/MainWindow.cc
+++ b/src/UI/MainWindow.cc
@@ -1,13 +1,14 @@
-#include "../Lib/Document/VivyDocumentStore.hh"
-#include "../Lib/Script/ScriptStore.hh"
-#include "../Lib/Utils.hh"
-#include "../VivyApplication.hh"
-#include "MainWindow.hh"
-#include "PropertyModel.hh"
-#include "VivyDocumentView.hh"
-#include "AboutWindow.hh"
-#include "VivyFileIconProvider.hh"
-#include "AboutWindow.hh"
+#include "PreCompiledHeaders.hh"
+#include "Lib/Document/VivyDocumentStore.hh"
+#include "Lib/Script/ScriptStore.hh"
+#include "Lib/Utils.hh"
+#include "VivyApplication.hh"
+#include "UI/MainWindow.hh"
+#include "UI/PropertyModel.hh"
+#include "UI/VivyDocumentView.hh"
+#include "UI/AboutWindow.hh"
+#include "UI/VivyFileIconProvider.hh"
+#include "UI/AboutWindow.hh"
 
 #define DCL_MENU(menu, name) [[maybe_unused]] QMenu *menu##Menu = menuBar()->addMenu(name);
 
diff --git a/src/UI/MainWindow.hh b/src/UI/MainWindow.hh
index 3f66108a177c29bdfe3f14facf95b3ad5149b366..690ed2f9b0f3f49b53d5779c7c198bd34a2f49a7 100644
--- a/src/UI/MainWindow.hh
+++ b/src/UI/MainWindow.hh
@@ -4,14 +4,15 @@
 #error "This is a C++ header"
 #endif
 
-#include "../VivyApplication.hh"
-#include "../Lib/Utils.hh"
-#include "../Lib/Log.hh"
-#include "../Lib/AbstractDocument.hh"
-#include "../Lib/Document/VivyDocumentStore.hh"
-#include "DocumentViews/AudioVisualizer.hh"
-#include "VivyDocumentView.hh"
-#include "ScriptDocumentView.hh"
+#include "PreCompiledHeaders.hh"
+#include "VivyApplication.hh"
+#include "Lib/Utils.hh"
+#include "Lib/Log.hh"
+#include "Lib/AbstractDocument.hh"
+#include "Lib/Document/VivyDocumentStore.hh"
+#include "UI/DocumentViews/AudioVisualizer.hh"
+#include "UI/VivyDocumentView.hh"
+#include "UI/ScriptDocumentView.hh"
 
 namespace Vivy
 {
diff --git a/src/UI/PropertyModel.cc b/src/UI/PropertyModel.cc
index 9530ea77c4ee8315188235eb09b7e8cecf7d7c02..e45f224464a192e37fb58ee7e44adbb4b1fa6f27 100644
--- a/src/UI/PropertyModel.cc
+++ b/src/UI/PropertyModel.cc
@@ -1,4 +1,5 @@
-#include "PropertyModel.hh"
+#include "PreCompiledHeaders.hh"
+#include "UI/PropertyModel.hh"
 
 using namespace Vivy;
 
diff --git a/src/UI/PropertyModel.hh b/src/UI/PropertyModel.hh
index 45a21ab01096912dd8a8ee68f2de4982b2111f69..07254ea736966027c036e006a38f05f9ac659dc7 100644
--- a/src/UI/PropertyModel.hh
+++ b/src/UI/PropertyModel.hh
@@ -1,6 +1,7 @@
 #pragma once
 
-#include "../Lib/Utils.hh"
+#include "PreCompiledHeaders.hh"
+#include "Lib/Utils.hh"
 
 //  auto model          = new PropertyModel(doc);
 //  QVBoxLayout *layout = new QVBoxLayout(this);
diff --git a/src/UI/ScriptDocumentView.cc b/src/UI/ScriptDocumentView.cc
index a6d1732d6d6354fa443de4206b99dc87083acfe0..7221c0d31b1b1e0b12e5a4a005c48d9908973c6d 100644
--- a/src/UI/ScriptDocumentView.cc
+++ b/src/UI/ScriptDocumentView.cc
@@ -1,8 +1,9 @@
-#include "ScriptDocumentView.hh"
-#include "MainWindow.hh"
-#include "ScriptViews/ScriptEditor.hh"
-#include "ScriptViews/ScriptHighlighter.hh"
-#include "../VivyApplication.hh"
+#include "PreCompiledHeaders.hh"
+#include "UI/ScriptDocumentView.hh"
+#include "UI/MainWindow.hh"
+#include "UI/ScriptViews/ScriptEditor.hh"
+#include "UI/ScriptViews/ScriptHighlighter.hh"
+#include "VivyApplication.hh"
 
 using namespace Vivy;
 
diff --git a/src/UI/ScriptDocumentView.hh b/src/UI/ScriptDocumentView.hh
index 67090fb340aaeb68aebfdeacf497c45bf5415a42..0971fc19a3503c55d88d32393fe62cfc083d0569 100644
--- a/src/UI/ScriptDocumentView.hh
+++ b/src/UI/ScriptDocumentView.hh
@@ -5,15 +5,16 @@
 #error "This is a C++ header"
 #endif
 
-#include "../VivyApplication.hh"
-#include "../Lib/Utils.hh"
-#include "../Lib/Log.hh"
-#include "../Lib/Script/ScriptDocument.hh"
-#include "AbstractDocumentView.hh"
-#include "FakeVim/FakeVimHandler.hh"
-#include "ScriptViews/EditorProxy.hh"
-#include "ScriptViews/ScriptHighlighter.hh"
-#include "ScriptViews/ScriptEditor.hh"
+#include "PreCompiledHeaders.hh"
+#include "VivyApplication.hh"
+#include "Lib/Utils.hh"
+#include "Lib/Log.hh"
+#include "Lib/Script/ScriptDocument.hh"
+#include "UI/AbstractDocumentView.hh"
+#include "UI/FakeVim/FakeVimHandler.hh"
+#include "UI/ScriptViews/EditorProxy.hh"
+#include "UI/ScriptViews/ScriptHighlighter.hh"
+#include "UI/ScriptViews/ScriptEditor.hh"
 
 namespace Vivy
 {
diff --git a/src/UI/ScriptViews/EditorProxy.cc b/src/UI/ScriptViews/EditorProxy.cc
index f262c96e8723db058439a30dd6c04ea828cb24cd..de96e991f7aac0d6e12a9da6b47c3d3887b08728 100644
--- a/src/UI/ScriptViews/EditorProxy.cc
+++ b/src/UI/ScriptViews/EditorProxy.cc
@@ -1,8 +1,9 @@
-#include "EditorProxy.hh"
-#include "../MainWindow.hh"
-#include "../FakeVim/FakeVimHandler.hh"
-#include "../FakeVim/FakeVimActions.hh"
-#include "../../VivyApplication.hh"
+#include "PreCompiledHeaders.hh"
+#include "UI/ScriptViews/EditorProxy.hh"
+#include "UI/MainWindow.hh"
+#include "UI/FakeVim/FakeVimHandler.hh"
+#include "UI/FakeVim/FakeVimActions.hh"
+#include "VivyApplication.hh"
 
 using namespace Vivy;
 
diff --git a/src/UI/ScriptViews/EditorProxy.hh b/src/UI/ScriptViews/EditorProxy.hh
index 2db6da9e889a6d51b1b62d6686ba6d7435039ed3..1ff5bdf9ffbd62843a5207cede39f2a53c53edc7 100644
--- a/src/UI/ScriptViews/EditorProxy.hh
+++ b/src/UI/ScriptViews/EditorProxy.hh
@@ -1,8 +1,9 @@
 #pragma once
 
-#include "../../VivyApplication.hh"
-#include "../../Lib/Log.hh"
-#include "ScriptEditor.hh"
+#include "PreCompiledHeaders.hh"
+#include "VivyApplication.hh"
+#include "Lib/Log.hh"
+#include "UI/ScriptViews/ScriptEditor.hh"
 
 namespace Vivy
 {
diff --git a/src/UI/ScriptViews/ScriptEditor.cc b/src/UI/ScriptViews/ScriptEditor.cc
index 4ba88645d892ba1848dd9e7d113b135b46a6d820..6f7de9cf28aaffe744b247462624c35b03a43436 100644
--- a/src/UI/ScriptViews/ScriptEditor.cc
+++ b/src/UI/ScriptViews/ScriptEditor.cc
@@ -1,5 +1,6 @@
-#include "ScriptEditor.hh"
-#include "ScriptHighlighter.hh"
+#include "PreCompiledHeaders.hh"
+#include "UI/ScriptViews/ScriptEditor.hh"
+#include "UI/ScriptViews/ScriptHighlighter.hh"
 
 using namespace Vivy;
 
diff --git a/src/UI/ScriptViews/ScriptEditor.hh b/src/UI/ScriptViews/ScriptEditor.hh
index 1a2391cf6a40495859c0be0eedf6ddb5dd1b58a6..f9afe789a37948e66ba29fa91ff2f1a9e2cc5fa5 100644
--- a/src/UI/ScriptViews/ScriptEditor.hh
+++ b/src/UI/ScriptViews/ScriptEditor.hh
@@ -4,9 +4,10 @@
 #error "This is a C++ header"
 #endif
 
-#include "../../VivyApplication.hh"
-#include "../../Lib/Log.hh"
-#include "../../Lib/Utils.hh"
+#include "PreCompiledHeaders.hh"
+#include "VivyApplication.hh"
+#include "Lib/Log.hh"
+#include "Lib/Utils.hh"
 
 namespace Vivy
 {
diff --git a/src/UI/ScriptViews/ScriptHighlighter.cc b/src/UI/ScriptViews/ScriptHighlighter.cc
index 6c50b405e8d066fed53d1f8a9118b9ceb3bc37ce..29e665e88f8552c5a554958b674f0cd59bb41f2b 100644
--- a/src/UI/ScriptViews/ScriptHighlighter.cc
+++ b/src/UI/ScriptViews/ScriptHighlighter.cc
@@ -1,7 +1,8 @@
-#include "ScriptHighlighter.hh"
-#include "../Theme/Theme.hh"
-#include "../../VivyApplication.hh"
-#include "../../Lib/Utils.hh"
+#include "PreCompiledHeaders.hh"
+#include "UI/ScriptViews/ScriptHighlighter.hh"
+#include "UI/Theme/Theme.hh"
+#include "VivyApplication.hh"
+#include "Lib/Utils.hh"
 
 using namespace Vivy;
 
diff --git a/src/UI/ScriptViews/ScriptHighlighter.hh b/src/UI/ScriptViews/ScriptHighlighter.hh
index cf636bdb3fff70692d69f778314a76087ec09b15..3d30a3409e46eedad78f3b071da887b590dea2d6 100644
--- a/src/UI/ScriptViews/ScriptHighlighter.hh
+++ b/src/UI/ScriptViews/ScriptHighlighter.hh
@@ -4,7 +4,8 @@
 #error "This is a C++ header"
 #endif
 
-#include "../Theme/Theme.hh"
+#include "PreCompiledHeaders.hh"
+#include "UI/Theme/Theme.hh"
 
 namespace Vivy
 {
diff --git a/src/UI/Theme/Theme.cc b/src/UI/Theme/Theme.cc
index 7f60106d1a72ae47ba0209b39379674017be2503..c68fbd5b07891365e08c9202e73ef07243399c4c 100644
--- a/src/UI/Theme/Theme.cc
+++ b/src/UI/Theme/Theme.cc
@@ -1,6 +1,7 @@
-#include "Theme.hh"
-#include "../../VivyApplication.hh"
-#include "../../Lib/HostOsInfo.hh"
+#include "PreCompiledHeaders.hh"
+#include "UI/Theme/Theme.hh"
+#include "VivyApplication.hh"
+#include "Lib/HostOsInfo.hh"
 #if VIVY_MACOS
 #import "ThemeMac.hh"
 #endif
diff --git a/src/UI/Theme/Theme.hh b/src/UI/Theme/Theme.hh
index 532bcb6795f658e1049738e53c64adf6ae1e0afd..5716ec2c86c1ef4c5fe1bfd49d05843a3a615b3b 100644
--- a/src/UI/Theme/Theme.hh
+++ b/src/UI/Theme/Theme.hh
@@ -1,8 +1,9 @@
 #pragma once
 
-#include "../../VivyApplication.hh"
-#include "../../Lib/Utils.hh"
-#include "../../Lib/Log.hh"
+#include "PreCompiledHeaders.hh"
+#include "VivyApplication.hh"
+#include "Lib/Utils.hh"
+#include "Lib/Log.hh"
 
 namespace Vivy
 {
diff --git a/src/UI/UnclosableDockWidget.cc b/src/UI/UnclosableDockWidget.cc
index e08d2f73c83f754169d92306aba2ddcac6d4b490..975f5dc00a019fa29ce0ef38924866867e933843 100644
--- a/src/UI/UnclosableDockWidget.cc
+++ b/src/UI/UnclosableDockWidget.cc
@@ -1,5 +1,6 @@
-#include "UnclosableDockWidget.hh"
-#include "DockWidgetTitleBar.hh"
+#include "PreCompiledHeaders.hh"
+#include "UI/UnclosableDockWidget.hh"
+#include "UI/DockWidgetTitleBar.hh"
 
 using namespace Vivy;
 
diff --git a/src/UI/UnclosableDockWidget.hh b/src/UI/UnclosableDockWidget.hh
index 204a11720b207591c8d50e2422fa8d4555688a19..8f885753979a8d1586817721e46da5b495e8c585 100644
--- a/src/UI/UnclosableDockWidget.hh
+++ b/src/UI/UnclosableDockWidget.hh
@@ -1,6 +1,7 @@
 #pragma once
 
-#include "Utils.hh"
+#include "PreCompiledHeaders.hh"
+#include "UI/Utils.hh"
 
 namespace Vivy
 {
diff --git a/src/UI/Utils.cc b/src/UI/Utils.cc
index 531e05119df8a7d1a2022581f2bc75197ccc8334..50ab3425e78d9c14d7ebb8a0d6340842c782edec 100644
--- a/src/UI/Utils.cc
+++ b/src/UI/Utils.cc
@@ -1,4 +1,5 @@
-#include "Utils.hh"
+#include "PreCompiledHeaders.hh"
+#include "UI/Utils.hh"
 
 using namespace Vivy;
 
diff --git a/src/UI/Utils.hh b/src/UI/Utils.hh
index e5b71db13c6228348c797ba619b9be074ceae86d..788d81eb70f20d24ada712064422625ba11e756c 100644
--- a/src/UI/Utils.hh
+++ b/src/UI/Utils.hh
@@ -4,7 +4,8 @@
 #error "This is a C++ header"
 #endif
 
-#include "../Lib/Utils.hh"
+#include "PreCompiledHeaders.hh"
+#include "Lib/Utils.hh"
 
 class QWidget;
 
diff --git a/src/UI/VivyDocumentView.cc b/src/UI/VivyDocumentView.cc
index 94dafc2937bb38da07b570a4e482a5761338c85a..1c86d74210f8e1da3b1bc4bae6ce2d5e6959e457 100644
--- a/src/UI/VivyDocumentView.cc
+++ b/src/UI/VivyDocumentView.cc
@@ -1,13 +1,4 @@
 #include "VivyDocumentView.hh"
-#include "PropertyModel.hh"
-#include "Utils.hh"
-#include "DocumentViews/AudioVisualizer.hh"
-#include "DocumentViews/AssLinesView.hh"
-#include "DocumentViews/AssLinesModel.hh"
-#include "../VivyApplication.hh"
-#include "../Lib/Document/VivyDocument.hh"
-#include "../Lib/Document/VivyDocumentStore.hh"
-#include "../Lib/Audio.hh"
 
 #include <QHeaderView>
 #include <QTreeView>
@@ -16,6 +7,18 @@
 #include <QWidget>
 #include <QDockWidget>
 
+#include "PreCompiledHeaders.hh"
+#include "UI/VivyDocumentView.hh"
+#include "UI/PropertyModel.hh"
+#include "UI/Utils.hh"
+#include "UI/DocumentViews/AudioVisualizer.hh"
+#include "UI/DocumentViews/AssLinesView.hh"
+#include "UI/DocumentViews/AssLinesModel.hh"
+#include "VivyApplication.hh"
+#include "Lib/Document/VivyDocument.hh"
+#include "Lib/Document/VivyDocumentStore.hh"
+#include "Lib/Audio.hh"
+
 using namespace Vivy;
 
 VivyDocumentView::VivyDocumentView(std::shared_ptr<VivyDocument> doc, QWidget *parent) noexcept
diff --git a/src/UI/VivyDocumentView.hh b/src/UI/VivyDocumentView.hh
index b07c3ccf529ab811ff6125609ed95ec09932baf9..417b1623d77537f3c935574ea430585c4a0ce4f1 100644
--- a/src/UI/VivyDocumentView.hh
+++ b/src/UI/VivyDocumentView.hh
@@ -4,15 +4,16 @@
 #error "This is a C++ header"
 #endif
 
-#include "../VivyApplication.hh"
-#include "../Lib/Log.hh"
-#include "../Lib/Document/VivyDocument.hh"
-#include "PropertyModel.hh"
-#include "UnclosableDockWidget.hh"
-#include "AbstractDocumentView.hh"
-#include "DocumentViews/VideoView.hh"
-#include "DocumentViews/AssLinesView.hh"
-#include "DocumentViews/AssLinesModel.hh"
+#include "PreCompiledHeaders.hh"
+#include "VivyApplication.hh"
+#include "Lib/Log.hh"
+#include "Lib/Document/VivyDocument.hh"
+#include "UI/PropertyModel.hh"
+#include "UI/UnclosableDockWidget.hh"
+#include "UI/AbstractDocumentView.hh"
+#include "UI/DocumentViews/VideoView.hh"
+#include "UI/DocumentViews/AssLinesView.hh"
+#include "UI/DocumentViews/AssLinesModel.hh"
 
 namespace Vivy
 {
diff --git a/src/UI/VivyFileIconProvider.cc b/src/UI/VivyFileIconProvider.cc
index f2cbef1086d273203d54b64efd42baa63feb10a1..eeeafd7371b30d36e4d959d9af307a2d414e25ca 100644
--- a/src/UI/VivyFileIconProvider.cc
+++ b/src/UI/VivyFileIconProvider.cc
@@ -1,5 +1,6 @@
-#include "VivyFileIconProvider.hh"
-#include "../VivyApplication.hh"
+#include "PreCompiledHeaders.hh"
+#include "UI/VivyFileIconProvider.hh"
+#include "VivyApplication.hh"
 
 using namespace Vivy;
 
diff --git a/src/UI/VivyFileIconProvider.hh b/src/UI/VivyFileIconProvider.hh
index d219b799ff9ce4677c226021d6c9179cbd8a07a5..edd7b0bf0ea1d8b6cbda1a8e43eceb19635d6ee5 100644
--- a/src/UI/VivyFileIconProvider.hh
+++ b/src/UI/VivyFileIconProvider.hh
@@ -4,8 +4,9 @@
 #error "This is a C++ header"
 #endif
 
-#include "../Lib/Utils.hh"
-#include "../VivyApplication.hh"
+#include "PreCompiledHeaders.hh"
+#include "Lib/Utils.hh"
+#include "VivyApplication.hh"
 
 namespace Vivy
 {
diff --git a/src/VivyApplication.cc b/src/VivyApplication.cc
index 3be55a7da0ea7b285d699476804fb4e43b44bfdf..f37e95cd229fe8138adfaf10b5ea259dcdd8ff93 100644
--- a/src/VivyApplication.cc
+++ b/src/VivyApplication.cc
@@ -1,3 +1,4 @@
+#include "PreCompiledHeaders.hh"
 #include "VivyApplication.hh"
 #include "UI/MainWindow.hh"
 #include "UI/DockWidgetTitleBar.hh"
diff --git a/src/VivyApplication.hh b/src/VivyApplication.hh
index e516b3e0aecd9a952c7537c8ff2cf0ffc80e07ac..83f65139a2f93762f1eef415876cf68352880604 100644
--- a/src/VivyApplication.hh
+++ b/src/VivyApplication.hh
@@ -4,6 +4,8 @@
 #error "This is a C++ header"
 #endif
 
+#include "PreCompiledHeaders.hh"
+
 // Get the VivyApplication pointer
 #define vivyApp (static_cast<::Vivy::VivyApplication *>(VivyApplication::instance()))