diff --git a/src/UI/DocumentViews/AudioVisualizer.cc b/src/UI/DocumentViews/AudioVisualizer.cc
index e34843b825f2b27cda75351bcf59778beb79fcb7..c5c5e69f58072e7c8e9f37c99c0254bc9e1ff4cb 100644
--- a/src/UI/DocumentViews/AudioVisualizer.cc
+++ b/src/UI/DocumentViews/AudioVisualizer.cc
@@ -5,8 +5,9 @@ using namespace Vivy;
 
 #define MAXPIXVALUE 7 // Some magix AV magic stuff
 
-AudioVisualizer::AudioVisualizer(AudioContext::StreamPtr stream, QWidget *parent)
+AudioVisualizer::AudioVisualizer(AudioContext::StreamPtr stream, std::weak_ptr<VivyDocumentView> rootView_, QWidget *parent)
     : QWidget(parent)
+      , rootView(rootView_)
     , audioStream(stream)
 {
     if (!audioStream->isDecoded()) {
diff --git a/src/UI/DocumentViews/AudioVisualizer.hh b/src/UI/DocumentViews/AudioVisualizer.hh
index a8d7c55aa09fe353f3bfbe236750d3e4ac96fb0b..646a48f23d73d6d65a86723856618d2bda65a874 100644
--- a/src/UI/DocumentViews/AudioVisualizer.hh
+++ b/src/UI/DocumentViews/AudioVisualizer.hh
@@ -9,6 +9,7 @@
 #include "AudioVisualizer/TimingView.hh"
 #include "AudioVisualizer/TimingParams.hh"
 #include "../../Lib/Audio.hh"
+#include "../VivyDocumentView.hh"
 
 namespace Vivy
 {
@@ -16,6 +17,7 @@ class AudioVisualizer final : public QWidget {
     Q_OBJECT
 
 private:
+    std::weak_ptr<VivyDocumentView> rootView;
     AudioContext::StreamPtr audioStream;
 
 private:
@@ -35,7 +37,7 @@ private:
     using RDFTContextPtr = std::unique_ptr<RDFTContext, decltype(rdftContextDeleter)>;
 
 public:
-    explicit AudioVisualizer(AudioContext::StreamPtr, QWidget *parent = nullptr);
+    explicit AudioVisualizer(AudioContext::StreamPtr, std::weak_ptr<VivyDocumentView> rootView, QWidget *parent = nullptr);
     ~AudioVisualizer() noexcept override = default;
 
 public slots:
diff --git a/src/UI/MainWindow.cc b/src/UI/MainWindow.cc
index 47e764e107ac56bf06c4912a9360098dda7200dd..08dc1cd9b4151e5441984624d55281195e6a4a17 100644
--- a/src/UI/MainWindow.cc
+++ b/src/UI/MainWindow.cc
@@ -301,8 +301,9 @@ MainWindow::closeDocument(int index) noexcept
     if (documentToClose) {
         logDebug()
             << "Delete document view " << VIVY_LOG_QUOTED(documentToClose->getDocumentTabName());
+
         documentToClose->closeDocument();
-        delete documentToClose;
+        documentViewPtrs.remove(documentToClose);
     }
 }
 
@@ -310,8 +311,11 @@ void
 MainWindow::newDocument() noexcept
 {
     try {
-        addTab(new VivyDocumentView(
-            vivyApp->documentStore->newDocument(VivyDocument::UntouchedByDefault), documents));
+        auto viewPtr = std::shared_ptr<VivyDocumentView>(new VivyDocumentView(vivyApp->documentStore->newDocument(VivyDocument::UntouchedByDefault), documents));
+        if (auto p = viewPtr.get()){
+            documentViewPtrs.insert(p, viewPtr);
+            addTab(p);
+        }
     } catch (const std::runtime_error &e) {
         logError() << "Failed to create a new empty document: " << e.what();
     }
@@ -337,20 +341,29 @@ MainWindow::openDocument() noexcept
 
     // Handle the different types here
     try {
-        if (fileType == Utils::DocumentType::Vivy)
-            addTab(new VivyDocumentView(vivyApp->documentStore->loadDocument(filename), documents));
+        if (fileType == Utils::DocumentType::Vivy){
+            auto viewPtr = std::shared_ptr<VivyDocumentView>(new VivyDocumentView(vivyApp->documentStore->loadDocument(filename), documents));
+            if (auto p = viewPtr.get()){
+                documentViewPtrs.insert(p, viewPtr);
+                addTab(p);
+            }
+        }
 
         else if (fileType == Utils::DocumentType::VivyScript) {
             auto scriptDocument = vivyApp->scriptStore->loadDocument(filename);
             const bool rc       = vivyApp->scriptStore->executeScript(scriptDocument->getUuid());
-            ScriptDocumentView *newView = new ScriptDocumentView(scriptDocument, documents);
+            auto viewPtr = std::shared_ptr<ScriptDocumentView>(new ScriptDocumentView(scriptDocument, documents));
+
+            if (auto p = viewPtr.get()){
+                if (!rc) {
+                    const auto &[line, desc] = std::tuple{ 0, vivyApp->scriptStore->getLastLuaError() };
+                    emit p->luaErrorFound(line, desc);
+                }
 
-            if (!rc) {
-                const auto &[line, desc] = std::tuple{ 0, vivyApp->scriptStore->getLastLuaError() };
-                emit newView->luaErrorFound(line, desc);
+                documentViewPtrs.insert(p, viewPtr);
+                addTab(p);
             }
 
-            addTab(newView);
         }
     } catch (const std::runtime_error &e) {
         logError() << "Failed to load document " << VIVY_LOG_QUOTED(filename)
diff --git a/src/UI/MainWindow.hh b/src/UI/MainWindow.hh
index 30a31af108f94ceb43ce3dc34aa06f905ab33c91..b8738dc4d7dd9d0392b832b1080f6a5caadaf083 100644
--- a/src/UI/MainWindow.hh
+++ b/src/UI/MainWindow.hh
@@ -96,6 +96,8 @@ private:
         }
     }
 
+    QMap<AbstractDocumentView*,std::shared_ptr<AbstractDocumentView>> documentViewPtrs;
+
 protected:
     void closeEvent(QCloseEvent *) noexcept override;
 
diff --git a/src/UI/VivyDocumentView.cc b/src/UI/VivyDocumentView.cc
index e80887cee598d54bc021b1c8ce49f0d157ed6bcc..25505b3a0f06e0128132fd9b35444ecd34b86629 100644
--- a/src/UI/VivyDocumentView.cc
+++ b/src/UI/VivyDocumentView.cc
@@ -148,7 +148,7 @@ VivyDocumentView::loadAudioView() noexcept
 
     // Kubat: don't check, may throw an error but don't think we can
     // recover from it.
-    AudioVisualizer *visualizerInner = new AudioVisualizer(stream, visualizer);
+    AudioVisualizer *visualizerInner = new AudioVisualizer(stream, shared_from_this(), visualizer);
     Utils::deleteInternalWidget(visualizer);
     visualizer->setWidget(visualizerInner);
     visualizer->layout()->setAlignment(visualizerInner, Qt::AlignTop);
diff --git a/src/UI/VivyDocumentView.hh b/src/UI/VivyDocumentView.hh
index a17d1c34c8a0cdbb61d9ae12807d10a96c383266..ad5ab51d6c5cc42ffc2b468df2cc42ce3001d09c 100644
--- a/src/UI/VivyDocumentView.hh
+++ b/src/UI/VivyDocumentView.hh
@@ -16,7 +16,7 @@
 
 namespace Vivy
 {
-class VivyDocumentView final : public AbstractDocumentView {
+class VivyDocumentView final : public AbstractDocumentView, public std::enable_shared_from_this<VivyDocumentView> {
     Q_OBJECT
     VIVY_UNMOVABLE_OBJECT(VivyDocumentView)
     VIVY_APP_LOGGABLE_OBJECT(VivyDocumentView, logger)