diff --git a/GUI/Model/Project/ProjectDocument.cpp b/GUI/Model/Project/ProjectDocument.cpp
index f115cd6dc75119f261523b60c67f6f8bad694a24..4b30b6ccb5d79cfe53666ce9c2a51398d922f7c6 100644
--- a/GUI/Model/Project/ProjectDocument.cpp
+++ b/GUI/Model/Project/ProjectDocument.cpp
@@ -28,7 +28,7 @@
 #include <QFile>
 #include <QStandardPaths>
 
-std::optional<ProjectDocument*> gProjectDocument;
+std::unique_ptr<ProjectDocument> gDoc;
 
 namespace {
 
diff --git a/GUI/Model/Project/ProjectDocument.h b/GUI/Model/Project/ProjectDocument.h
index 95f4c5464ac1bd8cd02aca5cc8858d59755759e0..7b975613a19c05ddc31813fcea0f987d2b1d13b5 100644
--- a/GUI/Model/Project/ProjectDocument.h
+++ b/GUI/Model/Project/ProjectDocument.h
@@ -26,7 +26,7 @@ class MessageService;
 class ProjectDocument;
 class QIODevice;
 
-extern std::optional<ProjectDocument*> gProjectDocument;
+extern std::unique_ptr<ProjectDocument> gDoc;
 
 //! Project document class handles all data related to the opened project
 //! (sample, job, project specific settings).
diff --git a/GUI/View/Access/DataPropertyWidget.cpp b/GUI/View/Access/DataPropertyWidget.cpp
index 40b87fae65f80a7859b77ddd893b03b0250acf06..d59548407e8abacfbf3a159c2271f2423a41064a 100644
--- a/GUI/View/Access/DataPropertyWidget.cpp
+++ b/GUI/View/Access/DataPropertyWidget.cpp
@@ -63,9 +63,8 @@ InstrumentItem* DataPropertyWidget::instrumentItem()
     if (jobItem())
         return jobItem()->instrumentItem();
     else if (realItem()) {
-        ASSERT(gProjectDocument.has_value());
-        return gProjectDocument.value()->instrumentModel()->findInstrumentItemById(
-            realItem()->instrumentId());
+        ASSERT(gDoc);
+        return gDoc->instrumentModel()->findInstrumentItemById(realItem()->instrumentId());
     } else
         ASSERT_NEVER;
     return nullptr;
diff --git a/GUI/View/Canvas/IntensityDataCanvas.cpp b/GUI/View/Canvas/IntensityDataCanvas.cpp
index c5b64f7f49b7a20873142d9ff8830ddd3674fed5..5e1ff4e67c81613dd19ac5a9ea8d0de2a0cab56f 100644
--- a/GUI/View/Canvas/IntensityDataCanvas.cpp
+++ b/GUI/View/Canvas/IntensityDataCanvas.cpp
@@ -100,7 +100,7 @@ void IntensityDataCanvas::onResetViewAction()
 {
     for (auto* item : allData2DItems())
         item->resetView();
-    gProjectDocument.value()->setModified();
+    gDoc->setModified();
 
     // synchronize real item data range with current item
     if (realData2DItem())
@@ -109,8 +109,8 @@ void IntensityDataCanvas::onResetViewAction()
 
 void IntensityDataCanvas::onSavePlotAction()
 {
-    ASSERT(gProjectDocument.has_value());
-    QString dirname = gProjectDocument.value()->userExportDir();
+    ASSERT(gDoc);
+    QString dirname = gDoc->userExportDir();
     GUI::Plot::savePlot(dirname, m_colorMapCanvas->colorMap()->customPlot(),
                         currentData2DItem()->c_field());
 }
diff --git a/GUI/View/Canvas/MaskEditorActions.cpp b/GUI/View/Canvas/MaskEditorActions.cpp
index 08ca02dd9114e3b41ebefee4dbbbe6ba47f73732..7de53f185d771aa827c8a5af0dc50a39188c7d56 100644
--- a/GUI/View/Canvas/MaskEditorActions.cpp
+++ b/GUI/View/Canvas/MaskEditorActions.cpp
@@ -96,7 +96,7 @@ void MaskEditorActions::onDeleteMaskAction()
         m_mask_list_model->removeMaskAt(indexes.back().row());
         indexes = m_selectionModel->selectedIndexes();
     }
-    gProjectDocument.value()->setModified();
+    gDoc->setModified();
 }
 
 //! Performs switch of mask value for all selected items (true -> false, false -> true)
@@ -108,7 +108,7 @@ void MaskEditorActions::onToggleMaskValueAction()
         if (MaskItem* item = m_mask_list_model->itemForIndex(itemIndex))
             item->setMaskValue(!item->maskValue());
     }
-    gProjectDocument.value()->setModified();
+    gDoc->setModified();
 }
 
 //! Lower mask one level down or rise one level up in the masks stack
@@ -137,7 +137,7 @@ void MaskEditorActions::changeMaskStackingOrder(bool move_up)
             }
         }
     }
-    gProjectDocument.value()->setModified();
+    gDoc->setModified();
 }
 
 //! Returns true if at least one of MaskItems in the selection can be moved one level up
diff --git a/GUI/View/Canvas/MaskEditorCanvas.cpp b/GUI/View/Canvas/MaskEditorCanvas.cpp
index 8dbb9db0f2dc3e55240ee6354ca7fbae34e3dd84..4be4fcce89d3ac9015792ca95bc98dc6edc97993 100644
--- a/GUI/View/Canvas/MaskEditorCanvas.cpp
+++ b/GUI/View/Canvas/MaskEditorCanvas.cpp
@@ -81,8 +81,8 @@ void MaskEditorCanvas::onPresentationChange(bool pixelized)
 
 void MaskEditorCanvas::onSavePlotRequest()
 {
-    ASSERT(gProjectDocument.has_value());
-    QString dirname = gProjectDocument.value()->userExportDir();
+    ASSERT(gDoc);
+    QString dirname = gDoc->userExportDir();
     GUI::Plot::savePlot(dirname, m_scene->colorMap()->customPlot(), m_data2DItem->c_field());
 }
 
@@ -94,7 +94,7 @@ void MaskEditorCanvas::onResetViewRequest()
         m_data2DItem->resetView();
     else
         setZoomToROI();
-    gProjectDocument.value()->setModified();
+    gDoc->setModified();
 }
 
 void MaskEditorCanvas::setZoomToROI()
diff --git a/GUI/View/Canvas/ProjectionsEditorCanvas.cpp b/GUI/View/Canvas/ProjectionsEditorCanvas.cpp
index cef1ba9bbb590269989149fb30cd5df2145bf9e3..9fe2b2ce5cfcbbec2f8e48112d5fd242c9c2f67c 100644
--- a/GUI/View/Canvas/ProjectionsEditorCanvas.cpp
+++ b/GUI/View/Canvas/ProjectionsEditorCanvas.cpp
@@ -145,7 +145,7 @@ void ProjectionsEditorCanvas::onResetViewRequest()
 {
     m_view->onResetViewRequest();
     m_data2DItem->resetView();
-    gProjectDocument.value()->setModified();
+    gDoc->setModified();
 }
 
 void ProjectionsEditorCanvas::onActivityChanged(MaskFlags::MaskMode mask_mode)
diff --git a/GUI/View/Canvas/SpecularDataCanvas.cpp b/GUI/View/Canvas/SpecularDataCanvas.cpp
index c2fc0a94a8e79bab8e6d21213b4a491b9af945c7..c5ead40738688f1fe6d4500d8ce2defbd1891412 100644
--- a/GUI/View/Canvas/SpecularDataCanvas.cpp
+++ b/GUI/View/Canvas/SpecularDataCanvas.cpp
@@ -87,13 +87,13 @@ void SpecularDataCanvas::onResetViewAction()
 {
     for (auto* item : allData1DItems())
         item->resetView();
-    gProjectDocument.value()->setModified();
+    gDoc->setModified();
 }
 
 void SpecularDataCanvas::onSavePlotAction()
 {
-    ASSERT(gProjectDocument.has_value());
-    QString dirname = gProjectDocument.value()->userExportDir();
+    ASSERT(gDoc);
+    QString dirname = gDoc->userExportDir();
     GUI::Plot::savePlot(dirname, m_plot_canvas->customPlot(), currentData1DItem()->c_field());
 }
 
diff --git a/GUI/View/Combo/ItemComboToolbar.cpp b/GUI/View/Combo/ItemComboToolbar.cpp
index c6dca7184b9532b0c002ccf50300f503836685d1..ee0599e5f0a9bec618aadbdf9e1db998e92ce7d7 100644
--- a/GUI/View/Combo/ItemComboToolbar.cpp
+++ b/GUI/View/Combo/ItemComboToolbar.cpp
@@ -87,7 +87,7 @@ void ItemComboToolbar::_comboChanged(const int index)
 {
     QString txt{m_comboBox->itemText(index)};
     emit comboChanged(txt);
-    gProjectDocument.value()->setModified();
+    gDoc->setModified();
 }
 
 //! All items in QComboBox which are not in given list, will be disabled (gray and unselectable).
diff --git a/GUI/View/Data/DatafilesSelector.cpp b/GUI/View/Data/DatafilesSelector.cpp
index f291359de6a7e8a609d0beabe78c98c60cb20d24..a229474bdeeeb0e4b4e55c654aca6f5c00d1c579 100644
--- a/GUI/View/Data/DatafilesSelector.cpp
+++ b/GUI/View/Data/DatafilesSelector.cpp
@@ -210,7 +210,7 @@ QList<QAction*> DatafilesSelector::getOverlayActions(const QModelIndex& index, b
     removeAction->setToolTip("Remove this data");
     connect(removeAction, &QAction::triggered, [this, item] {
         m_treeModel->removeDataItem(item);
-        gProjectDocument.value()->setModified();
+        gDoc->setModified();
     });
 
     return {removeAction};
@@ -308,7 +308,7 @@ void DatafilesSelector::importData1D()
         }
     }
 
-    gProjectDocument.value()->setModified();
+    gDoc->setModified();
 }
 
 void DatafilesSelector::importData2D()
@@ -364,7 +364,7 @@ void DatafilesSelector::importData2D()
         }
     }
 
-    gProjectDocument.value()->setModified();
+    gDoc->setModified();
 }
 
 void DatafilesSelector::renameCurrentItem()
@@ -375,14 +375,14 @@ void DatafilesSelector::renameCurrentItem()
         // internals as an item editor
         m_treeView->setIndexWidget(currentIndex(), nullptr);
         m_treeView->edit(currentIndex());
-        gProjectDocument.value()->setModified();
+        gDoc->setModified();
     }
 }
 
 void DatafilesSelector::removeCurrentItem()
 {
     m_treeModel->removeDataItem(currentItem());
-    gProjectDocument.value()->setModified();
+    gDoc->setModified();
 }
 
 void DatafilesSelector::updateActionEnabling()
diff --git a/GUI/View/Device/AxisPropertyForm.cpp b/GUI/View/Device/AxisPropertyForm.cpp
index 14f8faad8d024408ccf6ee02fde4e74936dcd32a..b74607892b6db8a4675fa153231e8419ceadda9d 100644
--- a/GUI/View/Device/AxisPropertyForm.cpp
+++ b/GUI/View/Device/AxisPropertyForm.cpp
@@ -33,7 +33,7 @@ AxisPropertyForm::AxisPropertyForm(QWidget* parent, const QString& groupTitle,
                                                  [this, axisProperty](int v) {
                                                      axisProperty->setNbins(v);
                                                      emit dataChanged();
-                                                     gProjectDocument.value()->setModified();
+                                                     gDoc->setModified();
                                                  },
                                                  RealLimits::nonnegative(), nbinsTooltip);
     layout->addRow("# bins:", m_nbinsSpinBox);
diff --git a/GUI/View/Device/SpanPropertyForm.cpp b/GUI/View/Device/SpanPropertyForm.cpp
index 8ad67bae8e68cd4aa83ca70e4afe3483bbda3cd8..491d6f05be546ec68b1d40e6a309877e5f7bcf36 100644
--- a/GUI/View/Device/SpanPropertyForm.cpp
+++ b/GUI/View/Device/SpanPropertyForm.cpp
@@ -34,7 +34,7 @@ SpanPropertyForm::SpanPropertyForm(QWidget* parent, const QString& groupTitle,
                                                  [this, spanProperty](int v) {
                                                      spanProperty->setNbins(v);
                                                      emit dataChanged();
-                                                     gProjectDocument.value()->setModified();
+                                                     gDoc->setModified();
                                                  },
                                                  RealLimits::nonnegative(), nbinsTooltip);
     layout->addRow("# bins:", m_nbinsSpinBox);
diff --git a/GUI/View/FitControl/MinimizerSettingsWidget.cpp b/GUI/View/FitControl/MinimizerSettingsWidget.cpp
index 4fae24e47651cac0aae22d8d5da11befe5015206..74c78590c082bda3e5810296849d8b72e3d07eff 100644
--- a/GUI/View/FitControl/MinimizerSettingsWidget.cpp
+++ b/GUI/View/FitControl/MinimizerSettingsWidget.cpp
@@ -62,7 +62,7 @@ void MinimizerSettingsWidget::setMinContainerItem(MinimizerContainerItem* contai
                              [this] { return m_containerItem->objectiveMetricCombo(); },
                              [this](const QString& t) {
                                  m_containerItem->setCurrentObjectiveMetric(t);
-                                 gProjectDocument.value()->setModified();
+                                 gDoc->setModified();
                              },
                              false, &m_updaters,
                              "Objective metric to use for estimating distance between simulated "
@@ -72,7 +72,7 @@ void MinimizerSettingsWidget::setMinContainerItem(MinimizerContainerItem* contai
                              [this] { return m_containerItem->normFunctionCombo(); },
                              [this](const QString& t) {
                                  m_containerItem->setCurrentNormFunction(t);
-                                 gProjectDocument.value()->setModified();
+                                 gDoc->setModified();
                              },
                              false, &m_updaters,
                              "Normalization to use for estimating distance between simulated and "
@@ -142,7 +142,7 @@ void MinimizerSettingsWidget::createGroupedAlgorithmsCombo()
 
         m_containerItem->setCurrentCommonAlgorithm(comboBox->currentText());
         createMimimizerEdits();
-        gProjectDocument.value()->setModified();
+        gDoc->setModified();
     });
 
     // update state
@@ -188,7 +188,7 @@ void MinimizerSettingsWidget::createMinuitEdits()
         GUI::Util::createIntSpinBox([=] { return minItem->strategy(); },
                                     [=](int v) {
                                         minItem->setStrategy(v);
-                                        gProjectDocument.value()->setModified();
+                                        gDoc->setModified();
                                     },
                                     RealLimits::limited(0, 2),
                                     "Minimization strategy (0-low, 1-medium, 2-high quality)",
@@ -199,7 +199,7 @@ void MinimizerSettingsWidget::createMinuitEdits()
         GUI::Util::createDoubleSpinBox([=] { return minItem->errorDefinition(); },
                                        [=](double v) {
                                            minItem->setErrorDefinition(v);
-                                           gProjectDocument.value()->setModified();
+                                           gDoc->setModified();
                                        },
                                        &m_updaters,
                                        "Error definition factor for parameter error calculation",
@@ -210,7 +210,7 @@ void MinimizerSettingsWidget::createMinuitEdits()
                                   [=] { return minItem->tolerance(); },
                                   [=](double v) {
                                       minItem->setTolerance(v);
-                                      gProjectDocument.value()->setModified();
+                                      gDoc->setModified();
                                   },
                                   &m_updaters, "Tolerance on the function value at the minimum",
                                   RealLimits::nonnegative()));
@@ -220,35 +220,35 @@ void MinimizerSettingsWidget::createMinuitEdits()
         GUI::Util::createDoubleSpinBox([=] { return minItem->precision(); },
                                        [=](double v) {
                                            minItem->setPrecision(v);
-                                           gProjectDocument.value()->setModified();
+                                           gDoc->setModified();
                                        },
                                        &m_updaters, "Relative floating point arithmetic precision",
                                        RealLimits::nonnegative()));
 
-    m_minimizerLayout->addRow(
-        "Max func calls:",
-        GUI::Util::createIntSpinBox([=] { return minItem->maxFuncCalls(); },
-                                    [=](int v) {
-                                        minItem->setMaxFuncCalls(v);
-                                        gProjectDocument.value()->setModified();
-                                    },
-                                    RealLimits::nonnegative(), "Maximum number of function calls",
-                                    &m_updaters, true /*easy scroll*/));
+    m_minimizerLayout->addRow("Max func calls:",
+                              GUI::Util::createIntSpinBox([=] { return minItem->maxFuncCalls(); },
+                                                          [=](int v) {
+                                                              minItem->setMaxFuncCalls(v);
+                                                              gDoc->setModified();
+                                                          },
+                                                          RealLimits::nonnegative(),
+                                                          "Maximum number of function calls",
+                                                          &m_updaters, true /*easy scroll*/));
 }
 
 void MinimizerSettingsWidget::createGSLMultiMinEdits()
 {
     GSLMultiMinimizerItem* minItem = m_containerItem->minimizerItemGSLMulti();
 
-    m_minimizerLayout->addRow(
-        "Max iterations:",
-        GUI::Util::createIntSpinBox([=] { return minItem->maxIterations(); },
-                                    [=](int v) {
-                                        minItem->setMaxIterations(v);
-                                        gProjectDocument.value()->setModified();
-                                    },
-                                    RealLimits::nonnegative(), "Maximum number of iterations",
-                                    &m_updaters, true /*easy scroll*/));
+    m_minimizerLayout->addRow("Max iterations:",
+                              GUI::Util::createIntSpinBox([=] { return minItem->maxIterations(); },
+                                                          [=](int v) {
+                                                              minItem->setMaxIterations(v);
+                                                              gDoc->setModified();
+                                                          },
+                                                          RealLimits::nonnegative(),
+                                                          "Maximum number of iterations",
+                                                          &m_updaters, true /*easy scroll*/));
 }
 
 void MinimizerSettingsWidget::createTMVAGeneticEdits()
@@ -260,26 +260,26 @@ void MinimizerSettingsWidget::createTMVAGeneticEdits()
                                   [=] { return minItem->tolerance(); },
                                   [=](double v) {
                                       minItem->setTolerance(v);
-                                      gProjectDocument.value()->setModified();
+                                      gDoc->setModified();
                                   },
                                   &m_updaters, "Tolerance on the function value at the minimum",
                                   RealLimits::nonnegative()));
 
-    m_minimizerLayout->addRow(
-        "Max iterations:",
-        GUI::Util::createIntSpinBox([=] { return minItem->maxIterations(); },
-                                    [=](int v) {
-                                        minItem->setMaxIterations(v);
-                                        gProjectDocument.value()->setModified();
-                                    },
-                                    RealLimits::nonnegative(), "Maximum number of iterations",
-                                    &m_updaters, true /*easy scroll*/));
+    m_minimizerLayout->addRow("Max iterations:",
+                              GUI::Util::createIntSpinBox([=] { return minItem->maxIterations(); },
+                                                          [=](int v) {
+                                                              minItem->setMaxIterations(v);
+                                                              gDoc->setModified();
+                                                          },
+                                                          RealLimits::nonnegative(),
+                                                          "Maximum number of iterations",
+                                                          &m_updaters, true /*easy scroll*/));
 
     m_minimizerLayout->addRow(
         "Population:", GUI::Util::createIntSpinBox([=] { return minItem->populationSize(); },
                                                    [=](int v) {
                                                        minItem->setPopulationSize(v);
-                                                       gProjectDocument.value()->setModified();
+                                                       gDoc->setModified();
                                                    },
                                                    RealLimits::nonnegative(), "Population size",
                                                    &m_updaters, true /*easy scroll*/));
@@ -288,7 +288,7 @@ void MinimizerSettingsWidget::createTMVAGeneticEdits()
                                                   [=] { return minItem->randomSeed(); },
                                                   [=](int v) {
                                                       minItem->setRandomSeed(v);
-                                                      gProjectDocument.value()->setModified();
+                                                      gDoc->setModified();
                                                   },
                                                   RealLimits::limitless(),
                                                   "Initialization of pseudorandom number generator",
@@ -299,22 +299,22 @@ void MinimizerSettingsWidget::createGSLSimulatedAnnealingEdits()
 {
     SimAnMinimizerItem* minItem = m_containerItem->minimizerItemSimAn();
 
-    m_minimizerLayout->addRow(
-        "Max iterations:", GUI::Util::createIntSpinBox([=] { return minItem->maxIterations(); },
-                                                       [=](int v) {
-                                                           minItem->setMaxIterations(v);
-                                                           gProjectDocument.value()->setModified();
-                                                       },
-                                                       RealLimits::nonnegative(),
-                                                       "Number of points to try for each step",
-                                                       &m_updaters, true /*easy scroll*/));
+    m_minimizerLayout->addRow("Max iterations:",
+                              GUI::Util::createIntSpinBox([=] { return minItem->maxIterations(); },
+                                                          [=](int v) {
+                                                              minItem->setMaxIterations(v);
+                                                              gDoc->setModified();
+                                                          },
+                                                          RealLimits::nonnegative(),
+                                                          "Number of points to try for each step",
+                                                          &m_updaters, true /*easy scroll*/));
 
     m_minimizerLayout->addRow(
         "Iterations at T:",
         GUI::Util::createIntSpinBox([=] { return minItem->iterationsAtEachTemp(); },
                                     [=](int v) {
                                         minItem->setIterationsAtEachTemp(v);
-                                        gProjectDocument.value()->setModified();
+                                        gDoc->setModified();
                                     },
                                     RealLimits::nonnegative(),
                                     "Number of iterations at each temperature", &m_updaters,
@@ -324,7 +324,7 @@ void MinimizerSettingsWidget::createGSLSimulatedAnnealingEdits()
                                                 [=] { return minItem->stepSize(); },
                                                 [=](double v) {
                                                     minItem->setStepSize(v);
-                                                    gProjectDocument.value()->setModified();
+                                                    gDoc->setModified();
                                                 },
                                                 &m_updaters, "Max step size used in random walk",
                                                 RealLimits::nonnegative()));
@@ -333,7 +333,7 @@ void MinimizerSettingsWidget::createGSLSimulatedAnnealingEdits()
                                         [=] { return minItem->boltzmanK(); },
                                         [=](double v) {
                                             minItem->setBoltzmanK(v);
-                                            gProjectDocument.value()->setModified();
+                                            gDoc->setModified();
                                         },
                                         &m_updaters, "Boltzmann k", RealLimits::nonnegative()));
 
@@ -341,7 +341,7 @@ void MinimizerSettingsWidget::createGSLSimulatedAnnealingEdits()
         "T init:", GUI::Util::createDoubleSpinBox([=] { return minItem->boltzmanInitT(); },
                                                   [=](double v) {
                                                       minItem->setBoltzmanInitT(v);
-                                                      gProjectDocument.value()->setModified();
+                                                      gDoc->setModified();
                                                   },
                                                   &m_updaters, "Boltzmann initial temperature",
                                                   RealLimits::nonnegative()));
@@ -350,7 +350,7 @@ void MinimizerSettingsWidget::createGSLSimulatedAnnealingEdits()
                                          [=] { return minItem->boltzmanMu(); },
                                          [=](double v) {
                                              minItem->setBoltzmanMu(v);
-                                             gProjectDocument.value()->setModified();
+                                             gDoc->setModified();
                                          },
                                          &m_updaters, "Boltzmann mu", RealLimits::nonnegative()));
 
@@ -358,7 +358,7 @@ void MinimizerSettingsWidget::createGSLSimulatedAnnealingEdits()
         "T min:", GUI::Util::createDoubleSpinBox([=] { return minItem->boltzmanMinT(); },
                                                  [=](double v) {
                                                      minItem->setBoltzmanMinT(v);
-                                                     gProjectDocument.value()->setModified();
+                                                     gDoc->setModified();
                                                  },
                                                  &m_updaters, "Boltzmann minimal temperature",
                                                  RealLimits::nonnegative()));
@@ -373,20 +373,20 @@ void MinimizerSettingsWidget::createGSLLevMarEdits()
                                   [=] { return minItem->tolerance(); },
                                   [=](double v) {
                                       minItem->setTolerance(v);
-                                      gProjectDocument.value()->setModified();
+                                      gDoc->setModified();
                                   },
                                   &m_updaters, "Tolerance on the function value at the minimum",
                                   RealLimits::nonnegative()));
 
-    m_minimizerLayout->addRow(
-        "Max iterations:",
-        GUI::Util::createIntSpinBox([=] { return minItem->maxIterations(); },
-                                    [=](int v) {
-                                        minItem->setMaxIterations(v);
-                                        gProjectDocument.value()->setModified();
-                                    },
-                                    RealLimits::nonnegative(), "Maximum number of iterations",
-                                    &m_updaters, true /*easy scroll*/));
+    m_minimizerLayout->addRow("Max iterations:",
+                              GUI::Util::createIntSpinBox([=] { return minItem->maxIterations(); },
+                                                          [=](int v) {
+                                                              minItem->setMaxIterations(v);
+                                                              gDoc->setModified();
+                                                          },
+                                                          RealLimits::nonnegative(),
+                                                          "Maximum number of iterations",
+                                                          &m_updaters, true /*easy scroll*/));
 }
 
 void MinimizerSettingsWidget::updateUIValues()
diff --git a/GUI/View/FitControl/RunFitControlWidget.cpp b/GUI/View/FitControl/RunFitControlWidget.cpp
index 3184e43f839cd0479e0085f6a3d62bc7f8833ca2..c33dd95cae366cd86930b13b1afdaad0539902f2 100644
--- a/GUI/View/FitControl/RunFitControlWidget.cpp
+++ b/GUI/View/FitControl/RunFitControlWidget.cpp
@@ -124,7 +124,7 @@ void RunFitControlWidget::onSliderValueChanged(int value)
     m_updateIntervalLabel->setText(QString::number(interval));
     if (fitSuiteItem())
         fitSuiteItem()->setUpdateInterval(interval);
-    gProjectDocument.value()->setModified();
+    gDoc->setModified();
 }
 
 int RunFitControlWidget::sliderUpdateInterval()
diff --git a/GUI/View/Frame/Fit1DFrame.cpp b/GUI/View/Frame/Fit1DFrame.cpp
index a84ca2142a84ec9b8323fdf43a5e2abc6dda52a4..1c709f50a6310cd821be387b459a85afdfcda0cf 100644
--- a/GUI/View/Frame/Fit1DFrame.cpp
+++ b/GUI/View/Frame/Fit1DFrame.cpp
@@ -113,7 +113,7 @@ void Fit1DFrame::onResetViewAction()
 
     // synchronize data range between simulated and real
     GUI::View::RangeUtil::setCommonRangeY(mainData1DItems());
-    gProjectDocument.value()->setModified();
+    gDoc->setModified();
 }
 
 void Fit1DFrame::connectItems()
diff --git a/GUI/View/Frame/Fit2DFrame.cpp b/GUI/View/Frame/Fit2DFrame.cpp
index 7831c98b1407cece0c0a689d76b94802225912ba..d979617c8e628b5161457a643c814912b4b71f4a 100644
--- a/GUI/View/Frame/Fit2DFrame.cpp
+++ b/GUI/View/Frame/Fit2DFrame.cpp
@@ -117,7 +117,7 @@ void Fit2DFrame::onResetViewAction()
 
     // synchronize data range between simulated and real
     GUI::View::RangeUtil::setCommonRangeZ(mainData2DItems());
-    gProjectDocument.value()->setModified();
+    gDoc->setModified();
 }
 
 void Fit2DFrame::connectItems()
diff --git a/GUI/View/Instrument/InstrumentLibraryEditor.cpp b/GUI/View/Instrument/InstrumentLibraryEditor.cpp
index f39313412a4a2e12df9595e7af1ae1d8721d8db1..73d6691a05ca16d676443f5365186e8abdb176e4 100644
--- a/GUI/View/Instrument/InstrumentLibraryEditor.cpp
+++ b/GUI/View/Instrument/InstrumentLibraryEditor.cpp
@@ -88,8 +88,8 @@ InstrumentLibraryEditor::InstrumentLibraryEditor(QWidget* parent,
 
     connect(m_treeModel, &QAbstractItemModel::modelReset, [this] { m_treeView->expandAll(); });
 
-    connect(m_buttonBox, &QDialogButtonBox::accepted, this, &InstrumentLibraryEditor::accept);
-    connect(m_buttonBox, &QDialogButtonBox::rejected, this, &InstrumentLibraryEditor::reject);
+    connect(m_buttonBox, &QDialogButtonBox::accepted, this, &QDialog::accept);
+    connect(m_buttonBox, &QDialogButtonBox::rejected, this, &QDialog::reject);
 
     // ensure a current item when widget is shown
     GUI::Style::setResizable(this);
diff --git a/GUI/View/Job/JobView.cpp b/GUI/View/Job/JobView.cpp
index 3f98e571eff126bbbeebe570e226f8179bffa65f..45ec16ea80730a65e9810ae4eb925c57bf697bff 100644
--- a/GUI/View/Job/JobView.cpp
+++ b/GUI/View/Job/JobView.cpp
@@ -49,7 +49,7 @@ JobView::JobView(QProgressBar* progressBar, ProjectDocument* document)
             // store activity in JobItem
             if (selectedJobItem()) {
                 selectedJobItem()->setActivity(JobViewActivities::nameFromActivity(activity));
-                gProjectDocument.value()->setModified();
+                gDoc->setModified();
             }
         });
         m_activityActions.addAction(action);
diff --git a/GUI/View/JobControl/JobListModel.cpp b/GUI/View/JobControl/JobListModel.cpp
index cd23b0ab128e86a663f2503209728382d294c369..49960f0e2eb098053c3ce0a11ace6fa58888b936 100644
--- a/GUI/View/JobControl/JobListModel.cpp
+++ b/GUI/View/JobControl/JobListModel.cpp
@@ -101,7 +101,7 @@ void JobListModel::emitJobListModelChanged(JobItem* job)
         QModelIndex idx = index(i, 0);
         emit dataChanged(idx, idx);
     }
-    gProjectDocument.value()->setModified();
+    gDoc->setModified();
 }
 
 //--------------------------------------------------------------------------------------------------
diff --git a/GUI/View/JobControl/JobListing.cpp b/GUI/View/JobControl/JobListing.cpp
index ec4ff3790cf99242e60a112a35f7b947506ce0ec..dae63d3513dd43ecda4bb0542563a476d6c9eb04 100644
--- a/GUI/View/JobControl/JobListing.cpp
+++ b/GUI/View/JobControl/JobListing.cpp
@@ -140,7 +140,7 @@ void JobListing::onItemSelectionChanged()
 
     QModelIndexList selected = m_listView->selectionModel()->selectedIndexes();
     if (selected.size() == 1)
-        gProjectDocument.value()->jobModel()->setSelectedIndex(selected.first().row());
+        gDoc->jobModel()->setSelectedIndex(selected.first().row());
 
     emit selectedJobsChanged(selectedJobItems());
 }
@@ -159,14 +159,14 @@ void JobListing::onRun()
 {
     for (const QModelIndex& index : m_listView->selectionModel()->selectedIndexes())
         m_model->runJob(index);
-    gProjectDocument.value()->setModified();
+    gDoc->setModified();
 }
 
 void JobListing::onCancel()
 {
     for (const QModelIndex& index : m_listView->selectionModel()->selectedIndexes())
         m_model->cancelJob(index);
-    gProjectDocument.value()->setModified();
+    gDoc->setModified();
 }
 
 void JobListing::onRemove()
@@ -180,7 +180,7 @@ void JobListing::onRemove()
     int lastSelectedRow = indexes.front().row();
     ensureItemSelected(lastSelectedRow);
 
-    gProjectDocument.value()->setModified();
+    gDoc->setModified();
 }
 
 void JobListing::equalizeSelectedToJob(JobItem* srcJob)
@@ -201,7 +201,7 @@ void JobListing::equalizeSelectedToJob(JobItem* srcJob)
             }
         }
     }
-    gProjectDocument.value()->setModified();
+    gDoc->setModified();
 }
 
 void JobListing::showContextMenu(const QPoint&)
@@ -270,7 +270,7 @@ void JobListing::ensureItemSelected(int lastSelectedRow)
 
 void JobListing::restoreSelection()
 {
-    int lastUsed = gProjectDocument.value()->jobModel()->selectedIndex();
+    int lastUsed = gDoc->jobModel()->selectedIndex();
     if (lastUsed >= 0 && lastUsed < m_model->rowCount()) {
         QModelIndex lastUsedIndex = m_model->index(lastUsed, 0, QModelIndex());
         m_listView->selectionModel()->select(lastUsedIndex, QItemSelectionModel::ClearAndSelect);
diff --git a/GUI/View/Main/ActionManager.cpp b/GUI/View/Main/ActionManager.cpp
index c5945c3b7dde59988659fd123c0b48874ede9771..d97a76d0c52b06a2b91a33bd611d7bba61d3afe8 100644
--- a/GUI/View/Main/ActionManager.cpp
+++ b/GUI/View/Main/ActionManager.cpp
@@ -65,7 +65,7 @@ ActionManager::ActionManager(MainWindow* parent)
 
 void ActionManager::updateActionEnabling()
 {
-    const bool documentExists = gProjectDocument.has_value();
+    const bool documentExists = (bool)gDoc;
     m_saveAction->setEnabled(documentExists);
     m_saveAsAction->setEnabled(documentExists);
     m_closeProjectAction->setEnabled(documentExists);
diff --git a/GUI/View/Main/MainWindow.cpp b/GUI/View/Main/MainWindow.cpp
index e3f2750a7d81c2ce9e3a958d7313edfed38aa7a6..428b2349cf3604d917fe0d353d35d53650c641dd 100644
--- a/GUI/View/Main/MainWindow.cpp
+++ b/GUI/View/Main/MainWindow.cpp
@@ -115,8 +115,8 @@ void MainWindow::setCurrentView(int viewId)
 
 void MainWindow::raiseView(int viewId)
 {
-    if (gProjectDocument.has_value() && viewId != GUI::ID::ViewId::Projects)
-        gProjectDocument.value()->setViewId(viewId);
+    if (gDoc && viewId != GUI::ID::ViewId::Projects)
+        gDoc->setViewId(viewId);
     if (m_viewsStack->currentIndex() != viewId) {
         m_viewsStack->setCurrentIndex(viewId);
         emit currentViewChanged(GUI::ID::ViewId(viewId));
@@ -125,17 +125,15 @@ void MainWindow::raiseView(int viewId)
 
 void MainWindow::updateTitle()
 {
-    const auto& doc = gProjectDocument;
     QString location = "not saved yet";
-    if (doc.has_value() && doc.value()->hasValidNameAndPath())
-        location =
-            GUI::Path::withTildeHomePath(QDir::toNativeSeparators(doc.value()->projectFullPath()));
-    if (!doc.has_value())
+    if (gDoc && gDoc->hasValidNameAndPath())
+        location = GUI::Path::withTildeHomePath(QDir::toNativeSeparators(gDoc->projectFullPath()));
+    if (!gDoc)
         setWindowTitle("BornAgain");
-    else if (doc.value()->isModified())
-        setWindowTitle("BornAgain - *" + doc.value()->projectName() + " [" + location + "]");
+    else if (gDoc->isModified())
+        setWindowTitle("BornAgain - *" + gDoc->projectName() + " [" + location + "]");
     else
-        setWindowTitle("BornAgain - " + doc.value()->projectName() + " [" + location + "]");
+        setWindowTitle("BornAgain - " + gDoc->projectName() + " [" + location + "]");
 }
 
 void MainWindow::onFocusRequest(int index)
@@ -162,7 +160,7 @@ void MainWindow::onRunSimulationShortcut()
 
 void MainWindow::closeEvent(QCloseEvent* event)
 {
-    if (gProjectDocument.has_value() && gProjectDocument.value()->jobModel()->hasUnfinishedJobs()) {
+    if (gDoc && gDoc->jobModel()->hasUnfinishedJobs()) {
         QMessageBox::warning(this, "Cannot quit the application.",
                              "Cannot quit the application while jobs are running.\n"
                              "Cancel running jobs or wait until they are completed.");
@@ -226,13 +224,12 @@ void MainWindow::initViews()
     m_projectsView = new ProjectsView(this);
     resetView(GUI::ID::ViewId::Projects, m_projectsView);
 
-    if (gProjectDocument.has_value()) {
-        auto* doc = gProjectDocument.value();
-        m_instrumentView = new InstrumentView(this, doc);
-        m_sampleView = new SampleView(this, doc);
-        m_importDataView = new DataView(this, doc);
-        m_simulationView = new SimulationView(this, doc);
-        m_jobView = new JobView(progressBar(), doc);
+    if (gDoc) {
+        m_instrumentView = new InstrumentView(this, gDoc.get());
+        m_sampleView = new SampleView(this, gDoc.get());
+        m_importDataView = new DataView(this, gDoc.get());
+        m_simulationView = new SimulationView(this, gDoc.get());
+        m_jobView = new JobView(progressBar(), gDoc.get());
 
         resetView(GUI::ID::ViewId::Instrument, m_instrumentView);
 
@@ -248,8 +245,8 @@ void MainWindow::initViews()
 
         m_jobView->onSelectionChanged();
 
-        if (gProjectDocument.has_value())
-            setCurrentView(gProjectDocument.value()->viewId());
+        if (gDoc)
+            setCurrentView(gDoc->viewId());
         else
             raiseView(GUI::ID::ViewId::Projects);
     }
@@ -339,7 +336,7 @@ void MainWindow::onDocumentOpenedOrClosed(bool open)
     initViews();
     updateTitle();
     if (open) {
-        if (gProjectDocument.has_value()) {
+        if (gDoc) {
             for (auto* button : m_viewSelectionButtons->buttons())
                 button->setEnabled(true);
             auto* filler =
@@ -347,7 +344,7 @@ void MainWindow::onDocumentOpenedOrClosed(bool open)
             if (filler)
                 if (auto* fillerBtn = dynamic_cast<QToolButton*>(filler->widget()); fillerBtn)
                     fillerBtn->setEnabled(true);
-            setCurrentView(gProjectDocument.value()->viewId());
+            setCurrentView(gDoc->viewId());
         } else
             setCurrentView(GUI::ID::ViewId::Instrument);
     }
diff --git a/GUI/View/Manager/ProjectManager.cpp b/GUI/View/Manager/ProjectManager.cpp
index f86d843a72574ea67c525f18bc8d2c623798b153..1ca3b03fe5fb6eb979087eb73dd8d5ec60e3dc59 100644
--- a/GUI/View/Manager/ProjectManager.cpp
+++ b/GUI/View/Manager/ProjectManager.cpp
@@ -48,25 +48,19 @@ ProjectManager* ProjectManager::s_instance = nullptr;
 ProjectManager::ProjectManager(QObject* parent)
     : QObject(parent)
 {
-    if (s_instance != nullptr)
-        throw std::runtime_error("ProjectManager::ProjectManager -> Error. Attempt to create "
-                                 "ProjectManager twice.");
-
+    ASSERT(!s_instance); // it's a singleton
     s_instance = this;
 }
 
 ProjectManager::~ProjectManager()
 {
     s_instance = nullptr;
-    gProjectDocument.reset();
+    gDoc.release();
 }
 
 ProjectManager* ProjectManager::instance()
 {
-    if (!s_instance)
-        throw std::runtime_error("ProjectManager::instance -> Error. Attempt to access "
-                                 "non existing ProjectManager.");
-
+    ASSERT(s_instance);
     return s_instance;
 }
 
@@ -130,8 +124,8 @@ QStringList ProjectManager::recentProjects()
 
 QString ProjectManager::projectDir() const
 {
-    if (gProjectDocument.has_value())
-        return gProjectDocument.value()->validProjectDir();
+    if (gDoc)
+        return gDoc->validProjectDir();
     return "";
 }
 
@@ -140,8 +134,8 @@ QString ProjectManager::projectDir() const
 QString ProjectManager::userImportDir() const
 {
     if (m_importDirectory.isEmpty()) {
-        if (gProjectDocument.has_value())
-            return gProjectDocument.value()->userExportDir();
+        if (gDoc)
+            return gDoc->userExportDir();
         return "";
     }
     return m_importDirectory;
@@ -206,7 +200,7 @@ ProjectDocument* ProjectManager::newProject()
         return nullptr;
     createNewProject();
     emit documentOpenedOrClosed(true);
-    return gProjectDocument.value();
+    return gDoc.get();
 }
 
 //! Processes close current project request. Call save/discard/cancel dialog, if necessary.
@@ -214,10 +208,10 @@ ProjectDocument* ProjectManager::newProject()
 
 bool ProjectManager::closeCurrentProject()
 {
-    if (!gProjectDocument.has_value())
+    if (!gDoc)
         return true;
 
-    if (gProjectDocument.value()->isModified()) {
+    if (gDoc->isModified()) {
         QMessageBox msgBox;
         msgBox.setText("The project has been modified.");
         msgBox.setInformativeText("Do you want to save your changes?");
@@ -248,8 +242,8 @@ bool ProjectManager::closeCurrentProject()
 bool ProjectManager::saveProject(QString projectPullPath)
 {
     if (projectPullPath.isEmpty()) {
-        if (gProjectDocument.value()->hasValidNameAndPath())
-            projectPullPath = gProjectDocument.value()->projectFullPath();
+        if (gDoc->hasValidNameAndPath())
+            projectPullPath = gDoc->projectFullPath();
         else
             projectPullPath = acquireProjectPullPath();
     }
@@ -257,11 +251,11 @@ bool ProjectManager::saveProject(QString projectPullPath)
     if (projectPullPath.isEmpty())
         return false;
 
-    gProjectDocument.value()->setProjectName(GUI::Project::Util::projectName(projectPullPath));
-    gProjectDocument.value()->setProjectDir(GUI::Project::Util::projectDir(projectPullPath));
+    gDoc->setProjectName(GUI::Project::Util::projectName(projectPullPath));
+    gDoc->setProjectDir(GUI::Project::Util::projectDir(projectPullPath));
 
     try {
-        gProjectDocument.value()->saveProjectFileWithData(projectPullPath);
+        gDoc->saveProjectFileWithData(projectPullPath);
     } catch (const std::exception& ex) {
         QString message = QString("Failed to save project under '%1'. \n\n").arg(projectPullPath);
         message.append("Exception was thrown.\n\n");
@@ -317,7 +311,7 @@ void ProjectManager::openProject(QString projectPullPath)
         riseProjectLoadProblemDialog(messageService);
         addToRecentProjects();
     }
-    if (gProjectDocument.has_value())
+    if (gDoc)
         emit documentOpenedOrClosed(true);
 }
 
@@ -325,17 +319,17 @@ void ProjectManager::openProject(QString projectPullPath)
 
 void ProjectManager::createNewProject()
 {
-    if (gProjectDocument.has_value())
+    if (gDoc)
         throw std::runtime_error("ProjectManager::createNewProject -> Project already exists");
 
-    gProjectDocument = new ProjectDocument();
+    gDoc = std::make_unique<ProjectDocument>();
 
     if (m_autosave)
-        m_autosave->setDocument(gProjectDocument.value());
+        m_autosave->setDocument(gDoc.get());
 
-    gProjectDocument.value()->setProjectName("Untitled");
+    gDoc->setProjectName("Untitled");
 
-    connect(gProjectDocument.value(), &ProjectDocument::modifiedStateChanged, this,
+    connect(gDoc.get(), &ProjectDocument::modifiedStateChanged, this,
             &ProjectManager::documentModified);
 }
 
@@ -344,7 +338,7 @@ void ProjectManager::deleteCurrentProject()
     emit aboutToCloseDocument();
     if (m_autosave)
         m_autosave->removeAutosaveDir();
-    gProjectDocument.reset();
+    gDoc.release();
 }
 
 //! Load project data from file name. If autosave info exists, opens dialog for project restore.
@@ -359,14 +353,12 @@ ProjectDocument::ReadResult ProjectManager::loadProject(const QString& fullPathA
     if (qApp)
         QApplication::setOverrideCursor(Qt::WaitCursor);
     if (useAutosave && restoreProjectDialog(fullPathAndName, autosaveFullPath)) {
-        readResult =
-            gProjectDocument.value()->loadProjectFileWithData(autosaveFullPath, messageService);
-        gProjectDocument.value()->setProjectFullPath(fullPathAndName);
+        readResult = gDoc->loadProjectFileWithData(autosaveFullPath, messageService);
+        gDoc->setProjectFullPath(fullPathAndName);
         // restored project should be marked by '*'
-        gProjectDocument.value()->setModified();
+        gDoc->setModified();
     } else {
-        readResult =
-            gProjectDocument.value()->loadProjectFileWithData(fullPathAndName, messageService);
+        readResult = gDoc->loadProjectFileWithData(fullPathAndName, messageService);
     }
     if (qApp)
         QApplication::restoreOverrideCursor();
@@ -391,7 +383,7 @@ QString ProjectManager::acquireProjectPullPath()
 
 void ProjectManager::addToRecentProjects()
 {
-    QString fname = gProjectDocument.value()->projectFullPath();
+    QString fname = gDoc->projectFullPath();
     m_recentProjects.removeAll(fname);
     m_recentProjects.prepend(fname);
     while (m_recentProjects.size() > GUI::Style::MAX_RECENT_PROJECTS)
@@ -421,8 +413,7 @@ QString ProjectManager::untitledProjectName()
 
 void ProjectManager::riseProjectLoadFailedDialog(const MessageService& messageService)
 {
-    QString message = QString("Failed to load the project '%1' \n\n")
-                          .arg(gProjectDocument.value()->projectFullPath());
+    QString message = QString("Failed to load the project '%1' \n\n").arg(gDoc->projectFullPath());
 
     for (const auto& details : messageService.errors())
         message.append(details + "\n");
@@ -432,10 +423,9 @@ void ProjectManager::riseProjectLoadFailedDialog(const MessageService& messageSe
 
 void ProjectManager::riseProjectLoadProblemDialog(const MessageService& messageService)
 {
-    ASSERT(gProjectDocument.has_value());
-    auto* problemDialog =
-        new ProjectLoadProblemDialog(GUI::Global::mainWindow, messageService.warnings(true),
-                                     gProjectDocument.value()->documentVersion());
+    ASSERT(gDoc);
+    auto* problemDialog = new ProjectLoadProblemDialog(
+        GUI::Global::mainWindow, messageService.warnings(true), gDoc->documentVersion());
 
     problemDialog->show();
     problemDialog->raise();
diff --git a/GUI/View/ParEdit/FitParameterDelegate.cpp b/GUI/View/ParEdit/FitParameterDelegate.cpp
index ce6a467e96afa634c8751b51420564aa725db9a6..f800098a87be98c971af00fd4f499192d35c7cb0 100644
--- a/GUI/View/ParEdit/FitParameterDelegate.cpp
+++ b/GUI/View/ParEdit/FitParameterDelegate.cpp
@@ -84,8 +84,7 @@ QWidget* createEditor(QObject* item, QWidget* parent)
     if (parent && result) {
         result->setParent(parent);
 
-        QObject::connect(result, &CustomEditor::dataChanged,
-                         [=] { gProjectDocument.value()->setModified(); });
+        QObject::connect(result, &CustomEditor::dataChanged, [=] { gDoc->setModified(); });
     }
 
     return result;
diff --git a/GUI/View/ParEdit/ParameterTuningDelegate.cpp b/GUI/View/ParEdit/ParameterTuningDelegate.cpp
index 523799c41e1be73017f9464024a1cb11092a1d9e..19822a5bdd74cea99a92afdd0d62a48d27b0e4cc 100644
--- a/GUI/View/ParEdit/ParameterTuningDelegate.cpp
+++ b/GUI/View/ParEdit/ParameterTuningDelegate.cpp
@@ -242,7 +242,7 @@ void ParameterTuningDelegate::emitSignals(double value)
         m_currentItem->propagateValueToLink(value);
         emit currentLinkChanged(m_currentItem);
     }
-    gProjectDocument.value()->setModified();
+    gDoc->setModified();
 }
 
 void ParameterTuningDelegate::setSliderRangeFactor(int value)
diff --git a/GUI/View/Plotter/ColorMap.cpp b/GUI/View/Plotter/ColorMap.cpp
index c1e6b2ef55a75dc298993da21feda879b90da394..ad9e1256b400d8f657e3670d254c4efb1c520314 100644
--- a/GUI/View/Plotter/ColorMap.cpp
+++ b/GUI/View/Plotter/ColorMap.cpp
@@ -203,7 +203,7 @@ void ColorMap::onDataRangeChanged(QCPRange range)
     ii->setZrange(range.lower, range.upper);
     ii->zAxisItem()->adjustLogRangeOrders();
     emit ii->updateOtherPlots(ii);
-    gProjectDocument.value()->setModified();
+    gDoc->setModified();
 }
 
 //! Propagate xmin, xmax back to Data2DItem
@@ -212,7 +212,7 @@ void ColorMap::onXaxisRangeChanged(QCPRange range)
     Data2DItem* ii = data2DItem();
     ii->setXrange(range.lower, range.upper);
     emit ii->updateOtherPlots(ii);
-    gProjectDocument.value()->setModified();
+    gDoc->setModified();
 }
 
 //! Propagate ymin, ymax back to Data2DItem
@@ -221,7 +221,7 @@ void ColorMap::onYaxisRangeChanged(QCPRange range)
     Data2DItem* ii = data2DItem();
     ii->setYrange(range.lower, range.upper);
     emit ii->updateOtherPlots(ii);
-    gProjectDocument.value()->setModified();
+    gDoc->setModified();
 }
 
 //! Schedule replot for later execution by onTimeReplot() slot.
diff --git a/GUI/View/Plotter/SpecularPlot.cpp b/GUI/View/Plotter/SpecularPlot.cpp
index c902444a52464dfba454b8ecee72e53c44135b9a..603fb2e53e9e3da443ab324fad18a6d545ca9404 100644
--- a/GUI/View/Plotter/SpecularPlot.cpp
+++ b/GUI/View/Plotter/SpecularPlot.cpp
@@ -108,7 +108,7 @@ void SpecularPlot::onXaxisRangeChanged(QCPRange range) const
 {
     for (auto* item : data1DItems())
         item->setXrange(range.lower, range.upper);
-    gProjectDocument.value()->setModified();
+    gDoc->setModified();
     if (currentData1DItem())
         emit currentData1DItem()->updateOtherPlots(currentData1DItem());
 }
@@ -117,7 +117,7 @@ void SpecularPlot::onYaxisRangeChanged(QCPRange range) const
 {
     for (auto* item : data1DItems())
         item->setYrange(range.lower, range.upper);
-    gProjectDocument.value()->setModified();
+    gDoc->setModified();
     if (currentData1DItem())
         emit currentData1DItem()->updateOtherPlots(currentData1DItem());
 }
diff --git a/GUI/View/Project/SimulationView.cpp b/GUI/View/Project/SimulationView.cpp
index 343406dcb19a25282f1e7bb7b89ccd90b785df1e..ddcd94e66e398ecd63a3a610ad61d1b241c24850 100644
--- a/GUI/View/Project/SimulationView.cpp
+++ b/GUI/View/Project/SimulationView.cpp
@@ -229,7 +229,7 @@ void SimulationView::simulate()
     JobItem* jobItem = jobModel->addJobItem(selectedSampleItem(), selectedInstrumentItem(),
                                             selectedDatafileItem(), *optionsItem());
     jobModel->runJob(jobItem);
-    gProjectDocument.value()->setModified();
+    gDoc->setModified();
 }
 
 void SimulationView::exportPythonScript()
diff --git a/GUI/View/Realspace/RealspaceWidget.cpp b/GUI/View/Realspace/RealspaceWidget.cpp
index 1f9631cacd4fdec4aaecdb4da6861f7c09809376..b42f9f306baf33c20cc4fda0e0a9f0462565f429 100644
--- a/GUI/View/Realspace/RealspaceWidget.cpp
+++ b/GUI/View/Realspace/RealspaceWidget.cpp
@@ -78,8 +78,8 @@ void RealspaceWidget::showEvent(QShowEvent*)
 
 void RealspaceWidget::savePicture()
 {
-    ASSERT(gProjectDocument.has_value());
-    QString dirname = gProjectDocument.value()->userExportDir();
+    ASSERT(gDoc);
+    QString dirname = gDoc->userExportDir();
     QString defaultExtension = ".png";
     QString selectedFilter("*" + defaultExtension);
     QString defaultName = dirname + "/untitled";
diff --git a/GUI/View/Scene/MaskGraphicsScene.cpp b/GUI/View/Scene/MaskGraphicsScene.cpp
index b0a39069a58dd606d7400d6574e0da694e872d45..1f2a1c148984db22fd8240e9c80b2534795204d8 100644
--- a/GUI/View/Scene/MaskGraphicsScene.cpp
+++ b/GUI/View/Scene/MaskGraphicsScene.cpp
@@ -430,7 +430,7 @@ IOverlay* MaskGraphicsScene::registerOverlay(OverlayItem* item)
         if (auto* line_item = dynamic_cast<LineItem*>(maskObject))
             emit lineItemMoved(line_item); // -> update projections plot
         if (m_mouse_is_pressed)
-            gProjectDocument.value()->setModified(); // manual mask movement
+            gDoc->setModified(); // manual mask movement
     });
     connect(item, &OverlayItem::maskToBeDestroyed, [this](OverlayItem* maskObject) {
         if (const auto* line_item = dynamic_cast<const LineItem*>(maskObject))
@@ -473,7 +473,7 @@ void MaskGraphicsScene::setDrawingInProgress(bool value)
 {
     m_drawing_in_progress = value;
     if (value)
-        gProjectDocument.value()->setModified(); // manual mask creation
+        gDoc->setModified(); // manual mask creation
     else
         m_active_mask = nullptr;
 }
diff --git a/GUI/View/Setup/MaskPanel.cpp b/GUI/View/Setup/MaskPanel.cpp
index 41c8c9ad012845c145aa8ca9c847198d17ce2ec6..d5cb62bfdebe975c4680420b718c978fc9bedb4b 100644
--- a/GUI/View/Setup/MaskPanel.cpp
+++ b/GUI/View/Setup/MaskPanel.cpp
@@ -31,7 +31,7 @@ void addSpinBox(MaskItem* mask, QFormLayout* layout, DoubleProperty& property)
     auto* spinbox = new DoubleSpinBox(&property);
     layout->addRow(property.label() + ":", spinbox);
     QObject::connect(spinbox, &DoubleSpinBox::valueChanged, [mask](double) {
-        gProjectDocument.value()->setModified();
+        gDoc->setModified();
         ASSERT(mask);
         emit mask->maskGeometryChanged();
     });
@@ -172,7 +172,7 @@ void MaskPanel::setCurrentMaskItem(MaskItem* maskItem)
         auto* edit = new QLineEdit(maskItem->maskName(), m_editor_layout->parentWidget());
         connect(edit, &QLineEdit::textEdited,
                 [maskItem](const QString& t) { maskItem->setMaskName(t); });
-        connect(edit, &QLineEdit::editingFinished, [] { gProjectDocument.value()->setModified(); });
+        connect(edit, &QLineEdit::editingFinished, [] { gDoc->setModified(); });
         m_editor_layout->addRow("Name:", edit);
     }
 
@@ -202,7 +202,7 @@ void MaskPanel::addMaskCheckBox(const QString& title, std::function<bool()> gett
         setter(check_box->isChecked());
         ASSERT(mask);
         emit mask->maskGeometryChanged();
-        gProjectDocument.value()->setModified();
+        gDoc->setModified();
     });
 
     connect(m_currentMaskItem, &MaskItem::maskVisibilityChanged, [check_box, getter] {
diff --git a/GUI/View/Setup/ProjectionActions.cpp b/GUI/View/Setup/ProjectionActions.cpp
index a27e1b0d1a672cf77ea1ae980ae3cb7620a0e115..8f87b54922cbcbd9878c1ec9cecc692369b111ae 100644
--- a/GUI/View/Setup/ProjectionActions.cpp
+++ b/GUI/View/Setup/ProjectionActions.cpp
@@ -75,7 +75,7 @@ void ProjectionActions::onDeleteAction()
         m_mask_list_model->removeMaskAt(indexes.back().row());
         indexes = selectionModel->selectedIndexes();
     }
-    gProjectDocument.value()->setModified();
+    gDoc->setModified();
 }
 
 //! Performs saving of projections in ascii file
diff --git a/GUI/View/Setup/ProjectionsSaver.cpp b/GUI/View/Setup/ProjectionsSaver.cpp
index 571c97a2d6924d7754703a2185e5a33a9d9e9c36..b79071351b961c90353b90f12a040a13f24dded6 100644
--- a/GUI/View/Setup/ProjectionsSaver.cpp
+++ b/GUI/View/Setup/ProjectionsSaver.cpp
@@ -65,9 +65,9 @@ ProjectionsSaver::~ProjectionsSaver() = default;
 void ProjectionsSaver::saveProjections(QWidget* parent, Data2DItem* data2DItem)
 {
     ASSERT(data2DItem);
-    ASSERT(gProjectDocument.has_value());
+    ASSERT(gDoc);
 
-    QString defaultName = gProjectDocument.value()->userExportDir() + "/untitled.txt";
+    QString defaultName = gDoc->userExportDir() + "/untitled.txt";
     QString fname = QFileDialog::getSaveFileName(
         parent, "Save projections data", defaultName, "", nullptr,
         appSettings->useNativeFileDialog() ? QFileDialog::Options()
diff --git a/GUI/View/Setup/Scale1DEditor.cpp b/GUI/View/Setup/Scale1DEditor.cpp
index 1208d6c66db1f5c6092abb6297bab37a6ca9a276..a8a6774337e691ebabadc8f652f06af73d74b21a 100644
--- a/GUI/View/Setup/Scale1DEditor.cpp
+++ b/GUI/View/Setup/Scale1DEditor.cpp
@@ -52,7 +52,7 @@ void Scale1DEditor::createPanelElements()
                                  for (auto item : allData1DItems())
                                      item->setCurrentAxesUnits(newVal);
                                  emit axesRangeResetRequested();
-                                 gProjectDocument.value()->setModified();
+                                 gDoc->setModified();
                              },
                              &m_updaters));
     */
@@ -68,7 +68,7 @@ void Scale1DEditor::createPanelElements()
                                     [this](double newValue) {
                                         for (auto* item : allData1DItems())
                                             item->axItemX()->setMin(newValue);
-                                        gProjectDocument.value()->setModified();
+                                        gDoc->setModified();
                                     },
                                     &m_updaters));
 
@@ -77,7 +77,7 @@ void Scale1DEditor::createPanelElements()
                                     [this](double newValue) {
                                         for (auto* item : allData1DItems())
                                             item->axItemX()->setMax(newValue);
-                                        gProjectDocument.value()->setModified();
+                                        gDoc->setModified();
                                     },
                                     &m_updaters));
 
@@ -96,7 +96,7 @@ void Scale1DEditor::createPanelElements()
                 item->axItemY()->setLogRangeOrders(newValue);
                 updateUIValues();
             }
-            gProjectDocument.value()->setModified();
+            gDoc->setModified();
         },
         &m_updaters, "Dynamic range to display values", RealLimits::positive());
 
@@ -108,7 +108,7 @@ void Scale1DEditor::createPanelElements()
                                             item->axItemY()->adjustLogRangeOrders();
                                             updateUIValues();
                                         }
-                                        gProjectDocument.value()->setModified();
+                                        gDoc->setModified();
                                     },
                                     &m_updaters));
 
@@ -120,7 +120,7 @@ void Scale1DEditor::createPanelElements()
                                             item->axItemY()->adjustLogRangeOrders();
                                             updateUIValues();
                                         }
-                                        gProjectDocument.value()->setModified();
+                                        gDoc->setModified();
                                     },
                                     &m_updaters));
 
@@ -130,7 +130,7 @@ void Scale1DEditor::createPanelElements()
             logRangeSpinBox->setEnabled(b);
             for (auto* item : allData1DItems())
                 item->axItemY()->setLogScale(b);
-            gProjectDocument.value()->setModified();
+            gDoc->setModified();
         },
         &m_updaters));
 
diff --git a/GUI/View/Setup/Scale2DEditor.cpp b/GUI/View/Setup/Scale2DEditor.cpp
index 105a0032e6cfbf698cb329312eadf3e1ab3d92cb..88116172dd331adf70ddc2f48e79d41da8a42122 100644
--- a/GUI/View/Setup/Scale2DEditor.cpp
+++ b/GUI/View/Setup/Scale2DEditor.cpp
@@ -55,7 +55,7 @@ void Scale2DEditor::createPanelElements()
                                  for (auto item : allData2DItems())
                                      item->setCurrentAxesUnits(newVal);
                                  emit axesRangeResetRequested();
-                                 gProjectDocument.value()->setModified();
+                                 gDoc->setModified();
                              },
                              &m_updaters));
     */
@@ -66,7 +66,7 @@ void Scale2DEditor::createPanelElements()
                                   [this](const QString& newVal) {
                                       for (auto* item : allData2DItems())
                                           item->setCurrentGradient(newVal);
-                                      gProjectDocument.value()->setModified();
+                                      gDoc->setModified();
                                   },
                                   false, &m_updaters));
 
@@ -75,7 +75,7 @@ void Scale2DEditor::createPanelElements()
         [this](bool b) {
             for (auto* item : allData2DItems())
                 item->setInterpolated(b);
-            gProjectDocument.value()->setModified();
+            gDoc->setModified();
         },
         &m_updaters));
 
@@ -90,7 +90,7 @@ void Scale2DEditor::createPanelElements()
                                     [this](double newValue) {
                                         for (auto* item : allData2DItems())
                                             item->axItemX()->setMin(newValue);
-                                        gProjectDocument.value()->setModified();
+                                        gDoc->setModified();
                                     },
                                     &m_updaters));
 
@@ -99,7 +99,7 @@ void Scale2DEditor::createPanelElements()
                                     [this](double newValue) {
                                         for (auto* item : allData2DItems())
                                             item->axItemX()->setMax(newValue);
-                                        gProjectDocument.value()->setModified();
+                                        gDoc->setModified();
                                     },
                                     &m_updaters));
 
@@ -116,7 +116,7 @@ void Scale2DEditor::createPanelElements()
                                     [this](double newValue) {
                                         for (auto* item : allData2DItems())
                                             item->axItemY()->setMin(newValue);
-                                        gProjectDocument.value()->setModified();
+                                        gDoc->setModified();
                                     },
                                     &m_updaters));
 
@@ -125,7 +125,7 @@ void Scale2DEditor::createPanelElements()
                                     [this](double newValue) {
                                         for (auto* item : allData2DItems())
                                             item->axItemY()->setMax(newValue);
-                                        gProjectDocument.value()->setModified();
+                                        gDoc->setModified();
                                     },
                                     &m_updaters));
 
@@ -144,7 +144,7 @@ void Scale2DEditor::createPanelElements()
                 item->zAxisItem()->setLogRangeOrders(newValue);
                 updateUIValues();
             }
-            gProjectDocument.value()->setModified();
+            gDoc->setModified();
         },
         &m_updaters, "Dynamic range to display values", RealLimits::positive());
 
@@ -156,7 +156,7 @@ void Scale2DEditor::createPanelElements()
                                             item->zAxisItem()->adjustLogRangeOrders();
                                             updateUIValues();
                                         }
-                                        gProjectDocument.value()->setModified();
+                                        gDoc->setModified();
                                     },
                                     &m_updaters));
 
@@ -168,7 +168,7 @@ void Scale2DEditor::createPanelElements()
                                             item->zAxisItem()->adjustLogRangeOrders();
                                             updateUIValues();
                                         }
-                                        gProjectDocument.value()->setModified();
+                                        gDoc->setModified();
                                     },
                                     &m_updaters));
 
@@ -178,7 +178,7 @@ void Scale2DEditor::createPanelElements()
             logRangeSpinBox->setEnabled(b);
             for (auto* item : allData2DItems())
                 item->zAxisItem()->setLogScale(b);
-            gProjectDocument.value()->setModified();
+            gDoc->setModified();
         },
         &m_updaters));
 
@@ -189,7 +189,7 @@ void Scale2DEditor::createPanelElements()
         [this](bool b) {
             for (auto* item : allData2DItems())
                 item->zAxisItem()->setVisible(b);
-            gProjectDocument.value()->setModified();
+            gDoc->setModified();
         },
         &m_updaters));
 
diff --git a/GUI/View/Tuning/FitParameterWidget.cpp b/GUI/View/Tuning/FitParameterWidget.cpp
index 817b91006dc9be2adcb4cbea66b92f6cb7a8281a..80a36e48ecbe64fa4e7490c0b069e3177316ac62 100644
--- a/GUI/View/Tuning/FitParameterWidget.cpp
+++ b/GUI/View/Tuning/FitParameterWidget.cpp
@@ -259,8 +259,8 @@ void FitParameterWidget::init_fit_model()
     connect(m_fitParameterModel.get(), &FitParameterModel::modelReset, this,
             &FitParameterWidget::onFitParameterModelChange, Qt::UniqueConnection);
 
-    connect(fitContainerItem(), &FitParameterContainerItem::fitItemChanged,
-            gProjectDocument.value(), &ProjectDocument::setModified, Qt::UniqueConnection);
+    connect(fitContainerItem(), &FitParameterContainerItem::fitItemChanged, gDoc.get(),
+            &ProjectDocument::setModified, Qt::UniqueConnection);
 
     onFitParameterModelChange();
     connectFitParametersSelection(true);
diff --git a/GUI/View/Tuning/ParameterTuningWidget.cpp b/GUI/View/Tuning/ParameterTuningWidget.cpp
index 705e67ceca31b60bace1b61d00bec9956f2657bd..3704538bf6ba97c53446499b64eb4faeaf5fd87d 100644
--- a/GUI/View/Tuning/ParameterTuningWidget.cpp
+++ b/GUI/View/Tuning/ParameterTuningWidget.cpp
@@ -222,7 +222,7 @@ void ParameterTuningWidget::restoreModelsOfCurrentJobItem(int index)
     m_jobModel->restore(m_job_item, index);
     m_jobModel->runJob(m_job_item);
     updateView();
-    gProjectDocument.value()->setModified();
+    gDoc->setModified();
 }
 
 void ParameterTuningWidget::makeSelected(ParameterItem* item)
diff --git a/GUI/View/Tuning/SliderSettingsWidget.cpp b/GUI/View/Tuning/SliderSettingsWidget.cpp
index 2938a42e696df0dc31773a7a7064fd09db01cbf9..66c08c84ff068d6ba7e30b056cae2acd0839d073 100644
--- a/GUI/View/Tuning/SliderSettingsWidget.cpp
+++ b/GUI/View/Tuning/SliderSettingsWidget.cpp
@@ -87,7 +87,7 @@ void SliderSettingsWidget::rangeChanged()
         m_job_item->setSliderRange(1000);
 
     emit sliderRangeFactorChanged(m_job_item->sliderRange());
-    gProjectDocument.value()->setModified();
+    gDoc->setModified();
 }
 
 void SliderSettingsWidget::onLockZChanged(int state)
@@ -96,7 +96,7 @@ void SliderSettingsWidget::onLockZChanged(int state)
         emit lockzChanged(false);
     else if (state == Qt::Checked)
         emit lockzChanged(true);
-    gProjectDocument.value()->setModified();
+    gDoc->setModified();
 }
 
 void SliderSettingsWidget::initSlider()