diff --git a/.gitignore b/.gitignore
index f694b510019a31f53443d1a9af834b15580961b7..1ca967432496334d01e9ba66e0acb4ab8745d13d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,5 @@
 *~
+#*
 *.tmp
 *.user
 *.user.*
diff --git a/GUI/Model/Job/DataSource.cpp b/GUI/Model/Job/DataSource.cpp
index 722248a4eed6cf697bf301befcdf493f6ba893b8..9cc6fead48fc287c0aac5c9f5ae29f694f7dd7ad 100644
--- a/GUI/Model/Job/DataSource.cpp
+++ b/GUI/Model/Job/DataSource.cpp
@@ -96,34 +96,42 @@ JobItem* DataFromJob::jobxItem() const
 
 Data1DItem* DataFromJob::realData1DItem() const
 {
-    if (const DatafileItem* ii = jobxItem()->dfileItem())
-        return dynamic_cast<Data1DItem*>(ii->dataItem());
+    if (JobItem* ji = jobxItem())
+        return ji->dfileItem()->data1DItem();
     return nullptr;
 }
 
 Data2DItem* DataFromJob::realData2DItem() const
 {
-    if (const DatafileItem* ii = jobxItem()->dfileItem())
-        return dynamic_cast<Data2DItem*>(ii->dataItem());
+    if (JobItem* ji = jobxItem())
+        return ji->dfileItem()->data2DItem();
     return nullptr;
 }
 
 Data1DItem* DataFromJob::simuData1DItem() const
 {
-    return dynamic_cast<Data1DItem*>(jobxItem()->simulatedDataItem());
+    if (JobItem* ji = jobxItem())
+        return ji->data1DItem();
+    return nullptr;
 }
 
 Data2DItem* DataFromJob::simuData2DItem() const
 {
-    return dynamic_cast<Data2DItem*>(jobxItem()->simulatedDataItem());
+    if (JobItem* ji = jobxItem())
+        return ji->data2DItem();
+    return nullptr;
 }
 
 Data1DItem* DataFromJob::diffData1DItem() const
 {
-    return dynamic_cast<Data1DItem*>(jobxItem()->diffDataItem());
+    if (JobItem* ji = jobxItem())
+        return dynamic_cast<Data1DItem*>(ji->diffDataItem());
+    return nullptr;
 }
 
 Data2DItem* DataFromJob::diffData2DItem() const
 {
-    return dynamic_cast<Data2DItem*>(jobxItem()->diffDataItem());
+    if (JobItem* ji = jobxItem())
+        return dynamic_cast<Data2DItem*>(ji->diffDataItem());
+    return nullptr;
 }
diff --git a/GUI/Model/Job/JobItem.cpp b/GUI/Model/Job/JobItem.cpp
index 1a62440231acd86f6ca18faec5fced11cf7edca0..c57101eddd6783c1ab8c142c433d7991100aebb4 100644
--- a/GUI/Model/Job/JobItem.cpp
+++ b/GUI/Model/Job/JobItem.cpp
@@ -130,6 +130,11 @@ void JobItem::createSimulatedDataItem()
     m_simulated_data_item.reset(::newDataItem(rank()));
 }
 
+Data1DItem* JobItem::data1DItem()
+{
+    return dynamic_cast<Data1DItem*>(m_simulated_data_item.get());
+}
+
 Data2DItem* JobItem::data2DItem()
 {
     return dynamic_cast<Data2DItem*>(m_simulated_data_item.get());
diff --git a/GUI/Model/Job/JobItem.h b/GUI/Model/Job/JobItem.h
index 8da59ae236331b4600fb2964536a66be09b65584..0ab66398198158e2cd1f2eaaddd1993ab6815055 100644
--- a/GUI/Model/Job/JobItem.h
+++ b/GUI/Model/Job/JobItem.h
@@ -20,6 +20,7 @@
 #include <QThread>
 
 class BatchInfo;
+class Data1DItem;
 class Data2DItem;
 class DataItem;
 class Datafield;
@@ -89,6 +90,7 @@ public:
     //... data
 
     void createSimulatedDataItem();
+    Data1DItem* data1DItem();
     Data2DItem* data2DItem();
     DataItem* simulatedDataItem() { return m_simulated_data_item.get(); }
 
diff --git a/GUI/Model/Job/JobsSet.h b/GUI/Model/Job/JobsSet.h
index c3c3d9fd5a6f85ec54923533f0962b1d80b1deb5..f69e1b225864f54b2672f040f16814723c590fe7 100644
--- a/GUI/Model/Job/JobsSet.h
+++ b/GUI/Model/Job/JobsSet.h
@@ -53,6 +53,7 @@ signals:
     void jobMeritsAttention(JobItem* item);
     void globalProgress(int);
     void jobAdded();
+    void setChanged();
 
 private slots:
     void onFinishedJob(JobItem* job_item);
diff --git a/GUI/View/Canvas/ProgressCanvas.cpp b/GUI/View/Canvas/ProgressCanvas.cpp
index 6d758298d0c0d2d2ad25f72918ce6bd2d27754c6..134d843f64808321fce3ea61af8e42dce64589b8 100644
--- a/GUI/View/Canvas/ProgressCanvas.cpp
+++ b/GUI/View/Canvas/ProgressCanvas.cpp
@@ -14,7 +14,8 @@
 
 #include "GUI/View/Canvas/ProgressCanvas.h"
 #include "Base/Util/Assert.h"
-#include "GUI/Model/Job/JobItem.h"
+#include "GUI/Model/Job/JobsSet.h"
+#include "GUI/Model/Project/ProjectDocument.h"
 #include "GUI/Model/Tune/FitSuiteItem.h"
 #include "GUI/View/Plotter/HistogramPlot.h"
 #include <QVBoxLayout>
@@ -29,20 +30,25 @@ ProgressCanvas::ProgressCanvas()
     layout->addWidget(m_hist_plot);
 
     setStyleSheet("background-color:white;");
+
+    connect(gDoc->jobs(), &JobsSet::setChanged, this, &ProgressCanvas::setJobItem);
 }
 
-void ProgressCanvas::setJobItem(JobItem* item)
+void ProgressCanvas::setJobItem()
 {
-    ASSERT(item);
-    m_job_item = item;
-
-    connect(item->fitSuiteItem(), &FitSuiteItem::iterationCountChanged, this,
-            &ProgressCanvas::onIterationCountChanged, Qt::UniqueConnection);
+    if (const JobItem* ji = gDoc->jobs()->currentItem()) {
+        connect(ji->fitSuiteItem(), &FitSuiteItem::iterationCountChanged, this,
+                &ProgressCanvas::onIterationCountChanged, Qt::UniqueConnection);
+        show();
+    } else
+        hide();
 }
 
 void ProgressCanvas::onIterationCountChanged(int iter)
 {
-    double chi = m_job_item->fitSuiteItem()->chi2();
+    const JobItem* ji = gDoc->jobs()->currentItem();
+    ASSERT(ji);
+    double chi = ji->fitSuiteItem()->chi2();
     if (iter == 1)
         m_hist_plot->clearData();
     m_hist_plot->addData(static_cast<double>(iter), chi);
diff --git a/GUI/View/Canvas/ProgressCanvas.h b/GUI/View/Canvas/ProgressCanvas.h
index 6e3e7ea369aa0f792bad20a12af0bd56bd6fc112..2b254d81089c39d204566cde050cd0a7db06ba18 100644
--- a/GUI/View/Canvas/ProgressCanvas.h
+++ b/GUI/View/Canvas/ProgressCanvas.h
@@ -18,7 +18,6 @@
 #include <QWidget>
 
 class HistogramPlot;
-class JobItem;
 
 //! Intended for showing chi2 .vs interation count dependency.
 //! The main goal is to fill vacant place in Fit2DFrame.
@@ -28,13 +27,11 @@ class ProgressCanvas : public QWidget {
 public:
     ProgressCanvas();
 
-    void setJobItem(JobItem* job_item);
-
 private:
+    void setJobItem();
     void onIterationCountChanged(int iter);
 
     HistogramPlot* m_hist_plot;
-    const JobItem* m_job_item;
 };
 
 #endif // BORNAGAIN_GUI_VIEW_CANVAS_PROGRESSCANVAS_H
diff --git a/GUI/View/Frame/Fit1DFrame.cpp b/GUI/View/Frame/Fit1DFrame.cpp
index 15b8902ca50367f6297e86cf175eff7c810a1ee9..142b64a153776f5084d766cadab1a1e19db5d17c 100644
--- a/GUI/View/Frame/Fit1DFrame.cpp
+++ b/GUI/View/Frame/Fit1DFrame.cpp
@@ -21,7 +21,7 @@
 #include "GUI/Model/Data/Data1DItem.h"
 #include "GUI/Model/Data/RangeUtil.h"
 #include "GUI/Model/Job/DataSource.h"
-#include "GUI/Model/Job/JobItem.h"
+#include "GUI/Model/Job/JobsSet.h"
 #include "GUI/Model/Project/ProjectDocument.h"
 #include "GUI/View/Canvas/ProgressCanvas.h"
 #include "GUI/View/Canvas/SpecularPlotCanvas.h"
@@ -30,10 +30,9 @@
 #include "GUI/View/Setup/AxisPanel.h"
 #include "GUI/View/Setup/FrameActions.h"
 
-Fit1DFrame::Fit1DFrame(JobItem* job_item)
+Fit1DFrame::Fit1DFrame()
     : m_data_canvas(new SpecularPlotCanvas)
     , m_diff_canvas(new SpecularPlotCanvas)
-    , m_progress_canvas(new ProgressCanvas)
     , m_status_label(new PlotStatusLabel(nullptr))
     , m_reset_view_action(new QAction(this))
 {
@@ -47,7 +46,8 @@ Fit1DFrame::Fit1DFrame(JobItem* job_item)
 
     gridLayout->addWidget(m_data_canvas, 0, 0, 1, -1);
     gridLayout->addWidget(m_diff_canvas, 1, 0, 1, 2);
-    gridLayout->addWidget(m_progress_canvas, 1, 2, 1, 1);
+    auto* progress_canvas = new ProgressCanvas;
+    gridLayout->addWidget(progress_canvas, 1, 2, 1, 1);
 
     vlayout->addLayout(gridLayout);
     vlayout->addWidget(m_status_label);
@@ -73,15 +73,10 @@ Fit1DFrame::Fit1DFrame(JobItem* job_item)
     connect(m_reset_view_action, &QAction::triggered, this, &Fit1DFrame::onResetViewAction);
 
     GUI::Util::Ranges::setCommonRangeY(m_data_source->mainData1DItems());
-    updateDiffData();
-    connectItems();
 
-    m_data_canvas->setData1DItems(
-        {m_data_source->simuData1DItem(), m_data_source->realData1DItem()});
-    m_diff_canvas->setData1DItems({m_data_source->diffData1DItem()});
+    connect(gDoc->jobs(), &JobsSet::setChanged, this, &Fit1DFrame::updateFrame);
 
-    ASSERT(job_item);
-    m_progress_canvas->setJobItem(job_item);
+    updateFrame();
 }
 
 Fit1DFrame::~Fit1DFrame() = default;
@@ -99,19 +94,27 @@ void Fit1DFrame::onResetViewAction()
     gDoc->setModified();
 }
 
-void Fit1DFrame::connectItems()
+void Fit1DFrame::updateFrame()
 {
-    // sync X axis view area between simulated and difference plots
-    // simu --> diff
-    connect(m_data_source->simuData1DItem(), &DataItem::updateOtherPlots,
-            m_data_source->diffData1DItem(), &DataItem::checkXranges, Qt::UniqueConnection);
-    // diff --> simu
-    connect(m_data_source->diffData1DItem(), &DataItem::updateOtherPlots,
-            m_data_source->simuData1DItem(), &DataItem::checkXranges, Qt::UniqueConnection);
-
-    // update diff data if simulation data changes
-    connect(m_data_source->simuData1DItem(), &Data1DItem::datafieldChanged, this,
-            &Fit1DFrame::updateDiffData, Qt::UniqueConnection);
+    if (m_data_source->simuData1DItem() && m_data_source->realData1DItem()) {
+        m_data_canvas->setData1DItems(
+            {m_data_source->simuData1DItem(), m_data_source->realData1DItem()});
+        m_diff_canvas->setData1DItems({m_data_source->diffData1DItem()});
+        // sync X axis view area between simulated and difference plots
+        // simu --> diff
+        connect(m_data_source->simuData1DItem(), &DataItem::updateOtherPlots,
+                m_data_source->diffData1DItem(), &DataItem::checkXranges, Qt::UniqueConnection);
+        // diff --> simu
+        connect(m_data_source->diffData1DItem(), &DataItem::updateOtherPlots,
+                m_data_source->simuData1DItem(), &DataItem::checkXranges, Qt::UniqueConnection);
+
+        // update diff data if simulation data changes
+        connect(m_data_source->simuData1DItem(), &Data1DItem::datafieldChanged, this,
+                &Fit1DFrame::updateDiffData, Qt::UniqueConnection);
+        updateDiffData();
+        show();
+    } else
+        hide();
 }
 
 void Fit1DFrame::updateDiffData()
diff --git a/GUI/View/Frame/Fit1DFrame.h b/GUI/View/Frame/Fit1DFrame.h
index 7c3aae87d4e8df10847d4c7f5497181e7edf9c63..723e3acce9f7b3c8133e91f36f076a2cba1f35d8 100644
--- a/GUI/View/Frame/Fit1DFrame.h
+++ b/GUI/View/Frame/Fit1DFrame.h
@@ -19,10 +19,7 @@
 #include <QWidget>
 
 class DataSource;
-class JobItem;
-class JobRealBase;
 class PlotStatusLabel;
-class ProgressCanvas;
 class SpecularPlotCanvas;
 
 //! The Fit2DFrame class plots real data, simulated data and their relative difference
@@ -31,9 +28,11 @@ class SpecularPlotCanvas;
 class Fit1DFrame : public QWidget {
     Q_OBJECT
 public:
-    explicit Fit1DFrame(JobItem* item);
+    Fit1DFrame();
     ~Fit1DFrame();
 
+    void updateFrame();
+
 private:
     void onResetViewAction();
     void connectItems();
@@ -41,7 +40,6 @@ private:
 
     SpecularPlotCanvas* m_data_canvas;
     SpecularPlotCanvas* m_diff_canvas;
-    ProgressCanvas* m_progress_canvas;
     PlotStatusLabel* m_status_label;
 
     QAction* m_reset_view_action;
diff --git a/GUI/View/Frame/Fit2DFrame.cpp b/GUI/View/Frame/Fit2DFrame.cpp
index bd4925d9704b4cde94ec6eb2f7f9b4ae097734a7..06ae6e776a8521a7143b7ec099f1d9901c098552 100644
--- a/GUI/View/Frame/Fit2DFrame.cpp
+++ b/GUI/View/Frame/Fit2DFrame.cpp
@@ -20,7 +20,6 @@
 #include "GUI/Model/Data/Data2DItem.h"
 #include "GUI/Model/Data/RangeUtil.h"
 #include "GUI/Model/Job/DataSource.h"
-#include "GUI/Model/Job/JobItem.h"
 #include "GUI/Model/Project/ProjectDocument.h"
 #include "GUI/View/Canvas/ColorMapCanvas.h"
 #include "GUI/View/Canvas/ProgressCanvas.h"
@@ -30,11 +29,10 @@
 #include "GUI/View/Setup/FrameActions.h"
 #include <QVBoxLayout>
 
-Fit2DFrame::Fit2DFrame(JobItem* job_item)
+Fit2DFrame::Fit2DFrame()
     : m_real_canvas(new ColorMapCanvas)
     , m_simu_canvas(new ColorMapCanvas)
     , m_diff_canvas(new ColorMapCanvas)
-    , m_progress_canvas(new ProgressCanvas)
     , m_status_label(new PlotStatusLabel(nullptr))
     , m_reset_view_action(new QAction(this))
 {
@@ -49,7 +47,8 @@ Fit2DFrame::Fit2DFrame(JobItem* job_item)
     gridLayout->addWidget(m_real_canvas, 0, 0);
     gridLayout->addWidget(m_simu_canvas, 0, 1);
     gridLayout->addWidget(m_diff_canvas, 1, 0);
-    gridLayout->addWidget(m_progress_canvas, 1, 1);
+    auto* progress_canvas = new ProgressCanvas;
+    gridLayout->addWidget(progress_canvas, 1, 1);
 
     vlayout->addLayout(gridLayout);
     vlayout->addWidget(m_status_label);
@@ -75,20 +74,28 @@ Fit2DFrame::Fit2DFrame(JobItem* job_item)
     m_reset_view_action->setToolTip("Reset View");
     connect(m_reset_view_action, &QAction::triggered, this, &Fit2DFrame::onResetViewAction);
 
-    GUI::Util::Ranges::setCommonRangeZ(m_data_source->mainData2DItems());
-    updateDiffData();
-    connectItems();
-
-    m_simu_canvas->itemToCanvas(m_data_source->simuData2DItem());
-    m_real_canvas->itemToCanvas(m_data_source->realData2DItem());
-    m_diff_canvas->itemToCanvas(m_data_source->diffData2DItem());
-
-    ASSERT(job_item);
-    m_progress_canvas->setJobItem(job_item);
+    updateFrame();
 }
 
 Fit2DFrame::~Fit2DFrame() = default;
 
+void Fit2DFrame::updateFrame()
+{
+    if (m_data_source->simuData2DItem()) {
+        GUI::Util::Ranges::setCommonRangeZ(m_data_source->mainData2DItems());
+        updateDiffData();
+        connectItems();
+
+        m_simu_canvas->itemToCanvas(m_data_source->simuData2DItem());
+        m_real_canvas->itemToCanvas(m_data_source->realData2DItem());
+        m_diff_canvas->itemToCanvas(m_data_source->diffData2DItem());
+
+        show();
+
+    } else
+        hide();
+}
+
 void Fit2DFrame::onResetViewAction()
 {
     ASSERT(m_data_source->simuData2DItem() && m_data_source->diffData2DItem()
diff --git a/GUI/View/Frame/Fit2DFrame.h b/GUI/View/Frame/Fit2DFrame.h
index aa7d366623c6b5029a16c147ed772f1246ac95f8..3977dc293c2fabe79bfea221ecd1ef2a878d8c7e 100644
--- a/GUI/View/Frame/Fit2DFrame.h
+++ b/GUI/View/Frame/Fit2DFrame.h
@@ -20,18 +20,18 @@
 
 class ColorMapCanvas;
 class DataSource;
-class JobItem;
 class PlotStatusLabel;
-class ProgressCanvas;
 
 //! Plots realdata, simulated data and relative difference map during the course of the fit.
 
 class Fit2DFrame : public QWidget {
     Q_OBJECT
 public:
-    explicit Fit2DFrame(JobItem* item);
+    Fit2DFrame();
     ~Fit2DFrame();
 
+    void updateFrame();
+
 private:
     void onResetViewAction();
     void connectItems();
@@ -40,7 +40,6 @@ private:
     ColorMapCanvas* m_real_canvas;
     ColorMapCanvas* m_simu_canvas;
     ColorMapCanvas* m_diff_canvas;
-    ProgressCanvas* m_progress_canvas;
     PlotStatusLabel* m_status_label;
 
     QAction* m_reset_view_action;
diff --git a/GUI/View/Frame/StackedFrames.cpp b/GUI/View/Frame/StackedFrames.cpp
index 96ae62c006bf814525877e11e9a5ed621c0a0bd5..623af6efbe24161b20174314d3bb482a7de76dad 100644
--- a/GUI/View/Frame/StackedFrames.cpp
+++ b/GUI/View/Frame/StackedFrames.cpp
@@ -13,34 +13,19 @@
 //  ************************************************************************************************
 
 #include "GUI/View/Frame/StackedFrames.h"
-#include "Base/Util/Assert.h"
-#include "GUI/Model/Data/Data1DItem.h"
-#include "GUI/Model/Data/Data2DItem.h"
-#include "GUI/Model/Data/DataItem.h"
 #include "GUI/Model/Files/DatafilesSet.h"
-#include "GUI/Model/Job/JobItem.h"
+#include "GUI/Model/Job/JobsSet.h"
 #include "GUI/Model/Project/ProjectDocument.h"
 #include "GUI/View/Frame/Fit1DFrame.h"
 #include "GUI/View/Frame/Fit2DFrame.h"
 #include "GUI/View/Frame/Plot1DFrame.h"
 #include "GUI/View/Frame/Plot2DFrame.h"
 
-namespace {
-
-class EmptyFrame : public QWidget {
-private:
-    void showEvent(QShowEvent*) override {}
-};
-
-} // namespace
-
-
 StackedDataFrames::StackedDataFrames()
 {
     setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);
     setMinimumSize(500, 600);
 
-    addWidget(new ::EmptyFrame);
     addWidget(new Plot1DFrame);
     addWidget(new Plot2DFrame);
     setCurrentIndex(0);
@@ -52,54 +37,34 @@ StackedDataFrames::StackedDataFrames()
 
 void StackedDataFrames::showCurrentFrame()
 {
-    if (const DatafileItem* dfi = gDoc->datafiles()->currentItem()) {
-        if (dfi->rank() == 1)
-            setCurrentIndex(1);
-        else if (dfi->rank() == 2)
-            setCurrentIndex(2);
-        else
-            ASSERT_NEVER;
-    } else
-        setCurrentIndex(0);
+    if (const DatafileItem* dfi = gDoc->datafiles()->currentItem())
+        setCurrentIndex(dfi->rank() - 1);
+    else
+        setCurrentIndex(-1);
 }
 
 
-StackedFrames::StackedFrames()
+StackedJobFrames::StackedJobFrames()
 {
     setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);
     setMinimumSize(500, 600);
 
-    QWidget* widget = new ::EmptyFrame;
-    addWidget(widget);
-    m_item_to_widget[nullptr] = widget;
-    setCurrentWidget(widget);
-}
+    addWidget(new Plot1DFrame);
+    addWidget(new Plot2DFrame);
+    addWidget(new Fit1DFrame);
+    addWidget(new Fit2DFrame);
+    setCurrentIndex(0);
 
-void StackedFrames::setStackedItem(QObject* item)
-{
-    QWidget* widget;
-    auto it = m_item_to_widget.find(item);
-    if (it != m_item_to_widget.end()) {
-        widget = it.value();
-    } else {
-        widget = newFrame(item);
-        addWidget(widget);
-        m_item_to_widget[item] = widget;
-    }
-    setCurrentWidget(widget);
+    connect(gDoc->datafiles(), &DatafilesSet::setChanged, this,
+            &StackedJobFrames::showCurrentFrame);
+    showCurrentFrame();
 }
 
-QWidget* StackedJobFrames::newFrame(QObject* obj) const
+void StackedJobFrames::showCurrentFrame()
 {
-    if (dynamic_cast<Data1DItem*>(obj))
-        return new Plot1DFrame;
-    if (dynamic_cast<Data2DItem*>(obj))
-        return new Plot2DFrame;
-    if (auto* item = dynamic_cast<JobItem*>(obj)) {
-        if (item->rank() == 1)
-            return new Fit1DFrame(item);
-        if (item->rank() == 2)
-            return new Fit2DFrame(item);
-    }
-    ASSERT_NEVER;
+    if (const JobItem* ji = gDoc->jobs()->currentItem()) {
+        const int offset = ji->isValidForFitting() ? 2 : 0;
+        setCurrentIndex(offset + ji->rank() - 1);
+    } else
+        setCurrentIndex(-1);
 }
diff --git a/GUI/View/Frame/StackedFrames.h b/GUI/View/Frame/StackedFrames.h
index fe31aac6578c20b043e8801f6e035b77c5bb26ee..8eb3cea4db2ad1a800ce4641cf941c53d6465f99 100644
--- a/GUI/View/Frame/StackedFrames.h
+++ b/GUI/View/Frame/StackedFrames.h
@@ -15,36 +15,18 @@
 #ifndef BORNAGAIN_GUI_VIEW_FRAME_STACKEDFRAMES_H
 #define BORNAGAIN_GUI_VIEW_FRAME_STACKEDFRAMES_H
 
-#include "Base/Types/OwningVector.h"
-#include <QMap>
 #include <QStackedWidget>
 
 class StackedDataFrames : public QStackedWidget {
 public:
     StackedDataFrames();
     void showCurrentFrame();
-
-private:
-    OwningVector<QWidget> m_widgets;
 };
 
-class StackedFrames : public QStackedWidget {
+class StackedJobFrames : public QStackedWidget {
 public:
-    StackedFrames();
-
-    //! Shows the widget for given item (and hides previous one).
-    //! If no widget yet exists, it will be created.
-    void setStackedItem(QObject* item);
-
-private:
-    virtual QWidget* newFrame(QObject*) const = 0;
-
-    QMap<QObject*, QWidget*> m_item_to_widget;
-};
-
-class StackedJobFrames : public StackedFrames {
-private:
-    QWidget* newFrame(QObject*) const override;
+    StackedJobFrames();
+    void showCurrentFrame();
 };
 
 #endif // BORNAGAIN_GUI_VIEW_FRAME_STACKEDFRAMES_H
diff --git a/GUI/View/Numeric/NumWidgetUtil.cpp b/GUI/View/Numeric/NumWidgetUtil.cpp
index f1dc2ffc09fc46f2847ef31e757004ddbb078591..9b699f1649a7d54a6bd52f7735b7db3ef07c2a88 100644
--- a/GUI/View/Numeric/NumWidgetUtil.cpp
+++ b/GUI/View/Numeric/NumWidgetUtil.cpp
@@ -33,7 +33,6 @@ QCheckBox* GUI::Util::createCheckBox(const QString& title, function<bool()> gett
                                      QVector<function<void()>>* updaters)
 {
     auto* checkBox = new QCheckBox(title);
-    checkBox->setChecked(getter());
 
     QObject::connect(checkBox, &QCheckBox::stateChanged, [=] { setter(checkBox->isChecked()); });
 
@@ -55,7 +54,6 @@ QSpinBox* GUI::Util::createIntSpinBox(function<int()> getter, function<void(int)
 
     spin->setMinimum(limits.hasLowerLimit() ? limits.min() : -std::numeric_limits<int>::max());
     spin->setMaximum(limits.hasUpperLimit() ? limits.max() : std::numeric_limits<int>::max());
-    spin->setValue(getter());
     spin->setToolTip(tooltip);
 
     if (!easyScrollable)
@@ -83,7 +81,6 @@ QDoubleSpinBox* GUI::Util::createDoubleSpinBox(function<double()> getter,
     spin->setMaximum(limits.hasUpperLimit() ? limits.max() : std::numeric_limits<int>::max());
     spin->setDecimals(3);
     spin->setSingleStep(0.01);
-    spin->setValue(getter());
     spin->setToolTip(tooltip);
 
     if (!easyScrollable)
diff --git a/GUI/View/Setup/#AxisPanel.cpp# b/GUI/View/Setup/#AxisPanel.cpp#
deleted file mode 100644
index a5941b784190693d5cf1d494519f237a33e743a8..0000000000000000000000000000000000000000
--- a/GUI/View/Setup/#AxisPanel.cpp#
+++ /dev/null
@@ -1,158 +0,0 @@
-//  ************************************************************************************************
-//
-//  BornAgain: simulate and fit reflection and scattering
-//
-//! @file      GUI/View/Setup/AxisPanel.cpp
-//! @brief     Implements class AxisPanel.
-//!
-//! @homepage  http://www.bornagainproject.org
-//! @license   GNU General Public License v3 or higher (see COPYING)
-//! @copyright Forschungszentrum Jülich GmbH 2018
-//! @authors   Scientific Computing Group at MLZ (see CITATION, AUTHORS)
-//
-//  ************************************************************************************************
-
-#include "GUI/View/Setup/AxisPanel.h"
-#include "Base/Axis/Frame.h"
-#include "Base/Util/Assert.h"
-#include "GUI/Model/Axis/AmplitudeAxisItem.h"
-#include "GUI/Model/Axis/BasicAxisItem.h"
-#include "GUI/Model/Data/Data1DItem.h"
-#include "GUI/Model/Data/DataItem.h"
-#include "GUI/Model/Device/InstrumentItems.h"
-#include "GUI/Model/Files/DatafileItem.h"
-#include "GUI/Model/Job/DataSource.h"
-#include "GUI/Model/Project/ProjectDocument.h"
-#include "GUI/Support/Data/ComboProperty.h"
-#include "GUI/View/Layout/LayoutUtil.h"
-#include "GUI/View/Numeric/DoubleSpinBox.h"
-#include "GUI/View/Numeric/NumWidgetUtil.h"
-#include "GUI/View/Widget/GroupBoxes.h"
-#include <QAction>
-#include <QCheckBox>
-#include <QFormLayout>
-#include <QLineEdit>
-
-AxisPanel::AxisPanel(QObject* item)
-    : m_data_source(std::make_unique<DataSource>(item))
-{
-    setWindowTitle("Properties");
-    setSizePolicy(QSizePolicy::Fixed, QSizePolicy::MinimumExpanding);
-
-    auto* main_layout = new QFormLayout(this);
-    main_layout->setContentsMargins(8, 20, 8, 8);
-    main_layout->setSpacing(5);
-
-    // -- x-axis
-    auto* xGroup = new StaticGroupBox("X axis", this);
-    auto* xFormLayout = new QFormLayout(xGroup->body());
-    xFormLayout->setContentsMargins(0, 0, 0, 0);
-    xFormLayout->setSpacing(5);
-
-    xFormLayout->addRow("Min:",
-                        GUI::Util::createDoubleSpinBox(
-                            [this] { return m_data_source->currentData1DItem()->axItemX()->min(); },
-                            [this](double newValue) {
-                                m_data_source->currentData1DItem()->for (auto* item : m_data_source->allData1DItems())
-                                    item->axItemX()->setMin(newValue);
-                                gDoc->setModified();
-                            },
-                            &m_updaters));
-
-    xFormLayout->addRow("Max:",
-                        GUI::Util::createDoubleSpinBox(
-                            [this] { return m_data_source->currentData1DItem()->axItemX()->max(); },
-                            [this](double newValue) {
-                                m_data_source->currentData1DItem()->for (auto* item : m_data_source->allData1DItems())
-                                    item->axItemX()->setMax(newValue);
-                                gDoc->setModified();
-                            },
-                            &m_updaters));
-
-    main_layout->addRow(xGroup);
-
-    // -- y-axis
-    auto* yGroup = new StaticGroupBox("Y axis", this);
-    auto* yFormLayout = new QFormLayout(yGroup->body());
-    yFormLayout->setContentsMargins(0, 0, 0, 0);
-    yFormLayout->setSpacing(5);
-
-    auto* logRangeSpinBox = GUI::Util::createDoubleSpinBox(
-        [this] { return m_data_source->currentData1DItem()->axItemY()->logRangeOrders(); },
-        [this](double newValue) {
-            m_data_source->currentData1DItem()->for (auto* item : m_data_source->mainData1DItems()) {
-                item->axItemY()->setLogRangeOrders(newValue);
-                updateUIValues();
-            }
-            gDoc->setModified();
-        },
-        &m_updaters, "Dynamic range to display values", RealLimits::positive());
-
-    yFormLayout->addRow("Min:",
-                        GUI::Util::createDoubleSpinBox(
-                            [this] { return m_data_source->currentData1DItem()->axItemY()->min(); },
-                            [this](double newValue) {
-                                m_data_source->currentData1DItem()->for (auto* item : m_data_source->mainData1DItems()) {
-                                    item->axItemY()->setMin(newValue);
-                                    item->axItemY()->adjustLogRangeOrders();
-                                    updateUIValues();
-                                }
-                                gDoc->setModified();
-                            },
-                            &m_updaters));
-
-    yFormLayout->addRow("Max:",
-                        GUI::Util::createDoubleSpinBox(
-                            [this] { return m_data_source->currentData1DItem()->axItemY()->max(); },
-                            [this](double newValue) {
-                                m_data_source->currentData1DItem()->for (auto* item : m_data_source->mainData1DItems()) {
-                                    item->axItemY()->setMax(newValue);
-                                    item->axItemY()->adjustLogRangeOrders();
-                                    updateUIValues();
-                                }
-                                gDoc->setModified();
-                            },
-                            &m_updaters));
-
-    yFormLayout->addRow(GUI::Util::createCheckBox(
-        "log10", [this] { return m_data_source->currentData1DItem()->axItemY()->isLogScale(); },
-        [this, logRangeSpinBox](bool b) {
-            logRangeSpinBox->setEnabled(b);
-            for (auto* item : m_data_source->allData1DItems())
-                item->axItemY()->setLogScale(b);
-            gDoc->setModified();
-        },
-        &m_updaters));
-
-    yFormLayout->addRow("Log range:", logRangeSpinBox);
-
-    main_layout->addRow(yGroup);
-
-    updateUIValues();
-
-    // react on external changes (e.g. zooming in customplot shall update the axis values)
-    connect(m_data_source->currentData1DItem(), &DataItem::itemAxesRangeChanged, this,
-            &AxisPanel::updateUIValues, Qt::UniqueConnection);
-
-    // update coordinates on axes units change
-    for (auto* item : m_data_source->allData1DItems())
-        connect(item, &DataItem::axesUnitsChanged, this, &AxisPanel::updateItemCoords,
-                Qt::UniqueConnection);
-}
-
-AxisPanel::~AxisPanel() = default;
-
-void AxisPanel::updateItemCoords(DataItem* item)
-{
-    if (!item)
-        return;
-
-    emit item->axesUnitsReplotRequested();
-    updateUIValues();
-}
-
-void AxisPanel::updateUIValues()
-{
-    for (const auto& updater : m_updaters)
-        updater();
-}
diff --git a/GUI/View/Setup/AxisPanel.cpp b/GUI/View/Setup/AxisPanel.cpp
index 4159eb80eea39b80da5bfb1a3bc7f2259896a11f..9641faa1fa48d8dc32dc3817c614abe9398f9fb8 100644
--- a/GUI/View/Setup/AxisPanel.cpp
+++ b/GUI/View/Setup/AxisPanel.cpp
@@ -20,7 +20,7 @@
 #include "GUI/Model/Data/Data1DItem.h"
 #include "GUI/Model/Data/DataItem.h"
 #include "GUI/Model/Device/InstrumentItems.h"
-#include "GUI/Model/Files/DatafileItem.h"
+#include "GUI/Model/Files/DatafilesSet.h"
 #include "GUI/Model/Job/DataSource.h"
 #include "GUI/Model/Project/ProjectDocument.h"
 #include "GUI/Support/Data/ComboProperty.h"
@@ -43,40 +43,29 @@ AxisPanel::AxisPanel(DataSource* ds)
     main_layout->setContentsMargins(8, 20, 8, 8);
     main_layout->setSpacing(5);
 
-    if (m_data_source->allData1DItems().empty())
-        return;
-
-    for (auto* item : m_data_source->allData1DItems())
-        disconnect(item, nullptr, this, nullptr);
-
-    GUI::Util::Layout::clearLayout(main_layout);
-    m_updaters.clear();
-
     // -- x-axis
     auto* xGroup = new StaticGroupBox("X axis", this);
     auto* xFormLayout = new QFormLayout(xGroup->body());
     xFormLayout->setContentsMargins(0, 0, 0, 0);
     xFormLayout->setSpacing(5);
 
-    xFormLayout->addRow("Min:",
-                        GUI::Util::createDoubleSpinBox(
-                            [this] { return m_data_source->currentData1DItem()->axItemX()->min(); },
-                            [this](double newValue) {
-                                for (auto* item : m_data_source->allData1DItems())
-                                    item->axItemX()->setMin(newValue);
-                                gDoc->setModified();
-                            },
-                            &m_updaters));
-
-    xFormLayout->addRow("Max:",
-                        GUI::Util::createDoubleSpinBox(
-                            [this] { return m_data_source->currentData1DItem()->axItemX()->max(); },
-                            [this](double newValue) {
-                                for (auto* item : m_data_source->allData1DItems())
-                                    item->axItemX()->setMax(newValue);
-                                gDoc->setModified();
-                            },
-                            &m_updaters));
+    xFormLayout->addRow("Min:", GUI::Util::createDoubleSpinBox(
+                                    [this] { return dataItem()->axItemX()->min(); },
+                                    [this](double newValue) {
+                                        for (auto* item : m_data_source->allData1DItems())
+                                            item->axItemX()->setMin(newValue);
+                                        gDoc->setModified();
+                                    },
+                                    &m_updaters));
+
+    xFormLayout->addRow("Max:", GUI::Util::createDoubleSpinBox(
+                                    [this] { return dataItem()->axItemX()->max(); },
+                                    [this](double newValue) {
+                                        for (auto* item : m_data_source->allData1DItems())
+                                            item->axItemX()->setMax(newValue);
+                                        gDoc->setModified();
+                                    },
+                                    &m_updaters));
 
     main_layout->addRow(xGroup);
 
@@ -87,7 +76,7 @@ AxisPanel::AxisPanel(DataSource* ds)
     yFormLayout->setSpacing(5);
 
     auto* logRangeSpinBox = GUI::Util::createDoubleSpinBox(
-        [this] { return m_data_source->currentData1DItem()->axItemY()->logRangeOrders(); },
+        [this] { return dataItem()->axItemY()->logRangeOrders(); },
         [this](double newValue) {
             for (auto* item : m_data_source->mainData1DItems()) {
                 item->axItemY()->setLogRangeOrders(newValue);
@@ -97,34 +86,32 @@ AxisPanel::AxisPanel(DataSource* ds)
         },
         &m_updaters, "Dynamic range to display values", RealLimits::positive());
 
-    yFormLayout->addRow("Min:",
-                        GUI::Util::createDoubleSpinBox(
-                            [this] { return m_data_source->currentData1DItem()->axItemY()->min(); },
-                            [this](double newValue) {
-                                for (auto* item : m_data_source->mainData1DItems()) {
-                                    item->axItemY()->setMin(newValue);
-                                    item->axItemY()->adjustLogRangeOrders();
-                                    updateUIValues();
-                                }
-                                gDoc->setModified();
-                            },
-                            &m_updaters));
-
-    yFormLayout->addRow("Max:",
-                        GUI::Util::createDoubleSpinBox(
-                            [this] { return m_data_source->currentData1DItem()->axItemY()->max(); },
-                            [this](double newValue) {
-                                for (auto* item : m_data_source->mainData1DItems()) {
-                                    item->axItemY()->setMax(newValue);
-                                    item->axItemY()->adjustLogRangeOrders();
-                                    updateUIValues();
-                                }
-                                gDoc->setModified();
-                            },
-                            &m_updaters));
+    yFormLayout->addRow("Min:", GUI::Util::createDoubleSpinBox(
+                                    [this] { return dataItem()->axItemY()->min(); },
+                                    [this](double newValue) {
+                                        for (auto* item : m_data_source->mainData1DItems()) {
+                                            item->axItemY()->setMin(newValue);
+                                            item->axItemY()->adjustLogRangeOrders();
+                                            updateUIValues();
+                                        }
+                                        gDoc->setModified();
+                                    },
+                                    &m_updaters));
+
+    yFormLayout->addRow("Max:", GUI::Util::createDoubleSpinBox(
+                                    [this] { return dataItem()->axItemY()->max(); },
+                                    [this](double newValue) {
+                                        for (auto* item : m_data_source->mainData1DItems()) {
+                                            item->axItemY()->setMax(newValue);
+                                            item->axItemY()->adjustLogRangeOrders();
+                                            updateUIValues();
+                                        }
+                                        gDoc->setModified();
+                                    },
+                                    &m_updaters));
 
     yFormLayout->addRow(GUI::Util::createCheckBox(
-        "log10", [this] { return m_data_source->currentData1DItem()->axItemY()->isLogScale(); },
+        "log10", [this] { return dataItem()->axItemY()->isLogScale(); },
         [this, logRangeSpinBox](bool b) {
             logRangeSpinBox->setEnabled(b);
             for (auto* item : m_data_source->allData1DItems())
@@ -137,19 +124,31 @@ AxisPanel::AxisPanel(DataSource* ds)
 
     main_layout->addRow(yGroup);
 
-    updateUIValues();
+    connect(gDoc->datafiles(), &DatafilesSet::setChanged, this, &AxisPanel::updatePanel);
+    updatePanel();
+}
 
-    // react on external changes (e.g. zooming in customplot shall update the axis values)
-    connect(m_data_source->currentData1DItem(), &DataItem::itemAxesRangeChanged, this,
-            &AxisPanel::updateUIValues, Qt::UniqueConnection);
+AxisPanel::~AxisPanel() = default;
 
-    // update coordinates on axes units change
-    for (auto* item : m_data_source->allData1DItems())
-        connect(item, &DataItem::axesUnitsChanged, this, &AxisPanel::updateItemCoords,
-                Qt::UniqueConnection);
+Data1DItem* AxisPanel::dataItem()
+{
+    return m_data_source->currentData1DItem();
 }
 
-AxisPanel::~AxisPanel() = default;
+void AxisPanel::updatePanel()
+{
+    if (dataItem()) {
+        // react on external changes (e.g. zooming in customplot shall update the axis values)
+        connect(dataItem(), &DataItem::itemAxesRangeChanged, this, &AxisPanel::updateUIValues,
+                Qt::UniqueConnection);
+        // update coordinates on axes units change
+        for (auto* item : m_data_source->allData1DItems())
+            connect(item, &DataItem::axesUnitsChanged, this, &AxisPanel::updateItemCoords,
+                    Qt::UniqueConnection);
+        show();
+    } else
+        hide();
+}
 
 void AxisPanel::updateItemCoords(DataItem* item)
 {
@@ -162,6 +161,7 @@ void AxisPanel::updateItemCoords(DataItem* item)
 
 void AxisPanel::updateUIValues()
 {
-    for (const auto& updater : m_updaters)
-        updater();
+    if (m_data_source->currentData1DItem())
+        for (const auto& updater : m_updaters)
+            updater();
 }
diff --git a/GUI/View/Setup/AxisPanel.h b/GUI/View/Setup/AxisPanel.h
index 6099e3158589b6f0676fce40bb2a077aac34b07f..1e1ada7665e7ee361787f6bb86b517f2edea0b72 100644
--- a/GUI/View/Setup/AxisPanel.h
+++ b/GUI/View/Setup/AxisPanel.h
@@ -17,6 +17,7 @@
 
 #include <QWidget>
 
+class Data1DItem;
 class DataItem;
 class DataSource;
 
@@ -27,6 +28,9 @@ public:
     AxisPanel(DataSource*);
     ~AxisPanel();
 
+    Data1DItem* dataItem();
+    void updatePanel();
+
 private:
     void updateItemCoords(DataItem* item);
     void updateUIValues();
diff --git a/GUI/View/Views/JobView.cpp b/GUI/View/Views/JobView.cpp
index d6e9ef9bd6f555c5b2fb26c05b5b33221e042565..6a4e6ba1ea2f3dc727dbe9f6a8a3a87765a2a4e5 100644
--- a/GUI/View/Views/JobView.cpp
+++ b/GUI/View/Views/JobView.cpp
@@ -112,7 +112,7 @@ void JobView::fillViewMenu(QMenu* menu)
 
 void JobView::onJobSelectionChanged()
 {
-    setJob(selectedJobItem());
+    setJob();
     m_job_real_time_widget->setJobItem(selectedJobItem());
     m_fit_activity_panel->setJobItem(selectedJobItem());
 
@@ -143,21 +143,14 @@ void JobView::onJobSelected(JobItem* job_item)
 
     setActivity(newActivity);
 
-    setJob(job_item);
+    setJob();
 
     emit jobSelected(GUI::ID::Job);
 }
 
-void JobView::setJob(JobItem* job_item)
+void JobView::setJob()
 {
-    if (job_item) {
-        if (job_item->isValidForFitting())
-            m_data_frames->setStackedItem(job_item);
-        else
-            m_data_frames->setStackedItem(job_item->simulatedDataItem());
-    } else {
-        m_data_frames->setStackedItem(nullptr);
-    }
+    m_data_frames->showCurrentFrame();
 }
 
 
diff --git a/GUI/View/Views/JobView.h b/GUI/View/Views/JobView.h
index 3f478165079928f96de938d3196f8dfbe974f562..b9269643bd92a7344f771bd1829423c682e5a7fa 100644
--- a/GUI/View/Views/JobView.h
+++ b/GUI/View/Views/JobView.h
@@ -52,7 +52,7 @@ private slots:
 private:
     JobItem* selectedJobItem();
     void setActivity(JobViewActivity activity);
-    void setJob(JobItem* job_item);
+    void setJob();
 
     void resetLayout();