diff --git a/src/Lib/Document/CRTPSubDocument/AssSubDocument.cc b/src/Lib/Document/CRTPSubDocument/AssSubDocument.cc
new file mode 100644
index 0000000000000000000000000000000000000000..de627f85605be9edd4662813444fece40b11b7fb
--- /dev/null
+++ b/src/Lib/Document/CRTPSubDocument/AssSubDocument.cc
@@ -0,0 +1,51 @@
+#include "../CRTPSubDocument.hh"
+
+#include <QJsonObject>
+#include <QJsonDocument>
+
+using namespace Vivy;
+
+// Init a ASS sub-document from a file
+void
+AssSubDocument::initFromPath(const QString &path)
+{
+    Ass::AssFactory factory(path);
+    factory.getStyles(styles);
+    factory.getLines(lines);
+}
+
+QString
+AssSubDocument::getElementName() const noexcept
+{
+    return "AssSubDocument";
+}
+
+const QVector<Ass::LinePtr> &
+AssSubDocument::getLines() const noexcept
+{
+    return lines;
+}
+
+const QVector<Ass::StylePtr> &
+AssSubDocument::getStyles() const noexcept
+{
+    return styles;
+}
+
+QJsonDocument
+AssSubDocument::getProperties() const noexcept
+{
+    QJsonDocument ret;
+
+    QJsonObject styleObject;
+    for (const Ass::StylePtr &style : styles) {
+        styleObject.insert(style->getElementName(), style->getProperties().object());
+    }
+
+    QJsonObject object{
+        { "Styles", styleObject },
+        { "File", filePath },
+    };
+    ret.setObject(object);
+    return ret;
+}
diff --git a/src/Lib/Document/CRTPSubDocument.cc b/src/Lib/Document/CRTPSubDocument/AudioSubDocument.cc
similarity index 53%
rename from src/Lib/Document/CRTPSubDocument.cc
rename to src/Lib/Document/CRTPSubDocument/AudioSubDocument.cc
index ed788183a5f1acc939f1c28479d9cfeec9951e42..5a205fa7546126c759cad3db7f5cf941b27bfce8 100644
--- a/src/Lib/Document/CRTPSubDocument.cc
+++ b/src/Lib/Document/CRTPSubDocument/AudioSubDocument.cc
@@ -1,12 +1,10 @@
-#include "CRTPSubDocument.hh"
+#include "../CRTPSubDocument.hh"
 
 #include <QJsonObject>
 #include <QJsonDocument>
 
 using namespace Vivy;
 
-// AudioSubDocument implementation
-
 // Get the default stream index or -1 if not possible
 int
 AudioSubDocument::getDefaultStreamIndex() const noexcept
@@ -69,73 +67,3 @@ AudioSubDocument::getProperties() const noexcept
     ret.setObject(object);
     return ret;
 }
-
-// VideoSubDocument implementation
-
-// Init a video sub-document from a file
-void
-VideoSubDocument::initFromPath(const QString &)
-{
-}
-
-QString
-VideoSubDocument::getElementName() const noexcept
-{
-    return "VideoSubDocument";
-}
-
-QJsonDocument
-VideoSubDocument::getProperties() const noexcept
-{
-    QJsonDocument ret;
-    QJsonObject object;
-    ret.setObject(object);
-    return ret;
-}
-
-// AssSubDocument implementation
-
-// Init a ASS sub-document from a file
-void
-AssSubDocument::initFromPath(const QString &path)
-{
-    Ass::AssFactory factory(path);
-    factory.getStyles(styles);
-    factory.getLines(lines);
-}
-
-QString
-AssSubDocument::getElementName() const noexcept
-{
-    return "AssSubDocument";
-}
-
-const QVector<Ass::LinePtr> &
-AssSubDocument::getLines() const noexcept
-{
-    return lines;
-}
-
-const QVector<Ass::StylePtr> &
-AssSubDocument::getStyles() const noexcept
-{
-    return styles;
-}
-
-QJsonDocument
-AssSubDocument::getProperties() const noexcept
-{
-    QJsonDocument ret;
-
-    QJsonObject styleObject;
-    for (const Ass::StylePtr &style : styles) {
-        styleObject.insert(style->getElementName(), style->getProperties().object());
-    }
-
-    QJsonObject object{
-        { "Styles", styleObject },
-        { "File", filePath },
-    };
-    ret.setObject(object);
-    return ret;
-}
diff --git a/src/Lib/Document/CRTPSubDocument/VideoSubDocument.cc b/src/Lib/Document/CRTPSubDocument/VideoSubDocument.cc
new file mode 100644
index 0000000000000000000000000000000000000000..87b70c0c4c60fdf8d4ed063fa0c8d2a5ad33e45e
--- /dev/null
+++ b/src/Lib/Document/CRTPSubDocument/VideoSubDocument.cc
@@ -0,0 +1,27 @@
+#include "../CRTPSubDocument.hh"
+
+#include <QJsonObject>
+#include <QJsonDocument>
+
+using namespace Vivy;
+
+// Init a video sub-document from a file
+void
+VideoSubDocument::initFromPath(const QString &)
+{
+}
+
+QString
+VideoSubDocument::getElementName() const noexcept
+{
+    return "VideoSubDocument";
+}
+
+QJsonDocument
+VideoSubDocument::getProperties() const noexcept
+{
+    QJsonDocument ret;
+    QJsonObject object;
+    ret.setObject(object);
+    return ret;
+}