diff --git a/GUI/Models/DataItemUtils.cpp b/GUI/Models/DataItemUtils.cpp
index 38ad5b63137f5cc2fc0fd6ae47fc47af950ef3ab..81c8206b929b9400ded27e2dc1e92f60ce445cf2 100644
--- a/GUI/Models/DataItemUtils.cpp
+++ b/GUI/Models/DataItemUtils.cpp
@@ -25,7 +25,8 @@ template <class DataItemType> DataItemType* dataItem(SessionItem* parent)
     ASSERT(parent && "Assertion failed in DataItemUtils::dataItem: nullptr passed.");
 
     if (parent->modelType() == "JobItem")
-        return dynamic_cast<DataItemType*>(parent->getItem(JobItem::T_OUTPUT));
+        return dynamic_cast<DataItemType*>
+            (dynamic_cast<JobItem*>(parent)->dataItem());
     else if (auto real_data = dynamic_cast<RealDataItem*>(parent))
         return dynamic_cast<DataItemType*>(real_data->dataItem());
     else if (auto self = dynamic_cast<DataItemType*>(parent))
diff --git a/GUI/Models/JobItem.cpp b/GUI/Models/JobItem.cpp
index ba852bf2afc3e15dd80dc9ad6f6799d470269e69..d43d2e48d440a92793822d08a372324a199038b3 100644
--- a/GUI/Models/JobItem.cpp
+++ b/GUI/Models/JobItem.cpp
@@ -118,6 +118,11 @@ DataItem* JobItem::dataItem()
     return dynamic_cast<DataItem*>(getItem(T_OUTPUT));
 }
 
+void JobItem::addDataItem(DataItem* data)
+{
+    insertItem(-1, data, T_OUTPUT);
+}
+
 QString JobItem::getStatus() const
 {
     return getItemValue(P_STATUS).toString();
diff --git a/GUI/Models/JobItem.h b/GUI/Models/JobItem.h
index be60f0130aa4a00c68e5380dd3034c4428769c47..77e72ae693c7f5f93f67ab300d1f1be75a17d053 100644
--- a/GUI/Models/JobItem.h
+++ b/GUI/Models/JobItem.h
@@ -16,6 +16,7 @@
 #define BORNAGAIN_GUI_MODELS_JOBITEM_H
 
 #include "GUI/Models/SessionItem.h"
+#include "GUI/Models/SessionModel.h"
 
 class DataItem;
 class Data1DViewItem;
@@ -47,9 +48,9 @@ private:
     static const QString T_SAMPLE;
     static const QString T_MATERIAL_CONTAINER;
     static const QString T_INSTRUMENT;
+    static const QString T_OUTPUT;
 
 public:
-    static const QString T_OUTPUT;
     static const QString T_REALDATA;
     static const QString T_DATAVIEW;
     static const QString T_PARAMETER_TREE;
@@ -63,6 +64,8 @@ public:
 
     IntensityDataItem* intensityDataItem();
     DataItem* dataItem();
+    template <typename T> T* setDataType();
+    void addDataItem(DataItem* data);
 
     QString getStatus() const;
     void setStatus(const QString& status);
@@ -125,4 +128,13 @@ private:
     const SimulationOptionsItem* simulationOptionsItem() const;
 };
 
+template <typename T> T* JobItem::setDataType()
+{
+    static_assert(std::is_base_of<DataItem,T>::value,
+                  "Class must be derived from DataItem");
+    
+    return model()->insertItem<T>(this, -1, T_OUTPUT);
+}
+
+
 #endif // BORNAGAIN_GUI_MODELS_JOBITEM_H
diff --git a/GUI/Models/JobModel.cpp b/GUI/Models/JobModel.cpp
index 77aaec9c05853bd1d811bb113fc1fb47a919c903..3199cdf847eef5f07d034975f52e446c08ac87ea 100644
--- a/GUI/Models/JobModel.cpp
+++ b/GUI/Models/JobModel.cpp
@@ -138,7 +138,7 @@ QVector<SessionItem*> JobModel::nonXMLItems() const
     QVector<SessionItem*> result;
 
     for (auto jobItem : topItems<JobItem>()) {
-        if (auto intensityItem = jobItem->getItem(JobItem::T_OUTPUT))
+        if (auto intensityItem = jobItem->dataItem())
             result.push_back(intensityItem);
 
         if (auto real_data = dynamic_cast<RealDataItem*>(jobItem->getItem(JobItem::T_REALDATA))) {
diff --git a/GUI/Models/JobModelFunctions.cpp b/GUI/Models/JobModelFunctions.cpp
index 60efe22a8523e3d86cb8ccd9063bbe9f30730c30..dd32df09127827ec413d520bd895201905b5ad34 100644
--- a/GUI/Models/JobModelFunctions.cpp
+++ b/GUI/Models/JobModelFunctions.cpp
@@ -144,9 +144,9 @@ void JobModelFunctions::setupJobItemOutput(JobItem* jobItem)
     ASSERT(isSpecularInstrument || isIntensityInstrument);
 
     if (isSpecularInstrument)
-        jobItem->model()->insertItem<SpecularDataItem>(jobItem, -1, JobItem::T_OUTPUT);
+        jobItem->setDataType<SpecularDataItem>();
     else if (isIntensityInstrument)
-        jobItem->model()->insertItem<IntensityDataItem>(jobItem, -1, JobItem::T_OUTPUT);
+        jobItem->setDataType<IntensityDataItem>();
     else
         throw Error("JobModelFunctions::setupJobItemOutput() -> Error. "
                     "Unsupported instrument type");
diff --git a/GUI/Views/TestView.cpp b/GUI/Views/TestView.cpp
index 6dc7b2c20d8a6ac6bc740173b63662398f76d31b..3ef8feda4600ccb524f72bef348c509732a9a0d9 100644
--- a/GUI/Views/TestView.cpp
+++ b/GUI/Views/TestView.cpp
@@ -184,7 +184,7 @@ void TestView::test_specular_data_widget()
 
     // creating "simulation" data
     auto data_item = new SpecularDataItem();
-    job_item->insertItem(-1, data_item, JobItem::T_OUTPUT);
+    job_item->addDataItem(data_item);
     fillTestItem(data_item, 1.0);
 
     // creating "real" data
diff --git a/Tests/UnitTests/GUI/TestOutputDataIOService.cpp b/Tests/UnitTests/GUI/TestOutputDataIOService.cpp
index ed23685ce3cf1ecd8bfc159d95aa5ed12f473fe8..11231fc3774e883b2b08d858f69fa23d823c7584 100644
--- a/Tests/UnitTests/GUI/TestOutputDataIOService.cpp
+++ b/Tests/UnitTests/GUI/TestOutputDataIOService.cpp
@@ -50,8 +50,7 @@ TEST_F(TestOutputDataIOService, test_nonXMLData)
 
     // adding JobItem
     auto jobItem = models.jobModel()->insertItem<JobItem>();
-    auto dataItem =
-        models.jobModel()->insertItem<IntensityDataItem>(jobItem, -1, JobItem::T_OUTPUT);
+    auto dataItem = jobItem->setDataType<IntensityDataItem>();
     EXPECT_EQ(models.jobModel()->nonXMLItems().size(), 1);
 
     // adding RealDataItem to jobItem
@@ -264,7 +263,7 @@ TEST_F(TestOutputDataIOService, test_RealDataItemWithNativeData)
     // adding JobItem
     auto jobItem = models.jobModel()->insertItem<JobItem>();
     jobItem->setIdentifier(GUIHelpers::createUuid());
-    models.jobModel()->insertItem<IntensityDataItem>(jobItem, -1, JobItem::T_OUTPUT);
+    jobItem->setDataType<IntensityDataItem>();
     EXPECT_EQ(models.jobModel()->nonXMLItems().size(), 1);
 
     // copying RealDataItem to JobItem
diff --git a/Tests/UnitTests/GUI/TestSavingSpecularData.cpp b/Tests/UnitTests/GUI/TestSavingSpecularData.cpp
index fdc16c8cbd3d9944a73d8a89c908d98cf42230f5..efc2328c6a91cd512d91e8a46ae7ab55f850f704 100644
--- a/Tests/UnitTests/GUI/TestSavingSpecularData.cpp
+++ b/Tests/UnitTests/GUI/TestSavingSpecularData.cpp
@@ -100,8 +100,7 @@ TEST_F(TestSavingSpecularData, test_InstrumentInJobItem)
 
     // adding JobItem
     auto jobItem = models.jobModel()->insertItem<JobItem>();
-    auto dataItem =
-        models.jobModel()->insertItem<IntensityDataItem>(jobItem, -1, JobItem::T_OUTPUT);
+    auto dataItem = jobItem->setDataType<IntensityDataItem>();
     EXPECT_EQ(models.jobModel()->nonXMLItems().size(), 1);
 
     // adding instrument