diff --git a/GUI/coregui/Models/DomainObjectBuilder.cpp b/GUI/coregui/Models/DomainObjectBuilder.cpp
index 801d9b3e4513ca880226dd78e90420791d1815ae..9a121d763a83162008a155634a909fe44d662576 100644
--- a/GUI/coregui/Models/DomainObjectBuilder.cpp
+++ b/GUI/coregui/Models/DomainObjectBuilder.cpp
@@ -129,13 +129,5 @@ DomainObjectBuilder::buildInterferenceFunction(const SessionItem& item) const
 
 std::unique_ptr<Instrument> DomainObjectBuilder::buildInstrument(const GISASInstrumentItem& instrumentItem) const
 {
-    auto instrument = std::make_unique<Instrument>();
-
-    auto beam = instrumentItem.beamItem()->createBeam();
-    instrument->setBeam(*beam);
-
-    auto detector = instrumentItem.detectorItem()->createDetector();
-    instrument->setDetector(*detector);
-
-    return instrument;
+    return instrumentItem.createInstrument();
 }
diff --git a/GUI/coregui/Models/InstrumentItems.cpp b/GUI/coregui/Models/InstrumentItems.cpp
index 579431f230043c6fff11cae11a379049e5178ab7..0266c6674b181570632028559db6267b08b4482a 100644
--- a/GUI/coregui/Models/InstrumentItems.cpp
+++ b/GUI/coregui/Models/InstrumentItems.cpp
@@ -22,6 +22,8 @@
 #include "GroupItem.h"
 #include "MaskItems.h"
 #include "ParameterTranslators.h"
+#include "Instrument.h"
+#include "IDetector2D.h"
 
 namespace {
 const QString background_group_label = "Type";
@@ -54,6 +56,8 @@ Instrument2DItem::Instrument2DItem(const QString& modelType)
     item->setToolTip("Background type");
 }
 
+Instrument2DItem::~Instrument2DItem() = default;
+
 BeamItem *Instrument2DItem::beamItem() const
 {
     return &item<BeamItem>(P_BEAM);
@@ -112,6 +116,19 @@ QStringList Instrument2DItem::translateList(const QStringList& list) const
     return result;
 }
 
+std::unique_ptr<Instrument> Instrument2DItem::createInstrument() const
+{
+    std::unique_ptr<Instrument> result(new Instrument);
+
+    auto beam = beamItem()->createBeam();
+    result->setBeam(*beam);
+
+    auto detector = detectorItem()->createDetector();
+    result->setDetector(*detector);
+
+    return result;
+}
+
 GISASInstrumentItem::GISASInstrumentItem()
     : Instrument2DItem(Constants::GISASInstrumentType)
 {
diff --git a/GUI/coregui/Models/InstrumentItems.h b/GUI/coregui/Models/InstrumentItems.h
index 1fe7ffc0db33f6343a6130931aec08256e83c116..2544976ccb81626288b5abd37ce558ecf9ff040d 100644
--- a/GUI/coregui/Models/InstrumentItems.h
+++ b/GUI/coregui/Models/InstrumentItems.h
@@ -22,12 +22,14 @@ class BeamItem;
 class DetectorItem;
 class MaskContainerItem;
 class GroupItem;
+class Instrument;
 
 class BA_CORE_API_ InstrumentItem : public SessionItem
 {
 public:
     static const QString P_IDENTIFIER;
 
+    virtual std::unique_ptr<Instrument> createInstrument() const = 0;
 protected:
     explicit InstrumentItem(const QString& modelType);
 };
@@ -35,6 +37,8 @@ protected:
 class BA_CORE_API_ Instrument2DItem : public InstrumentItem
 {
 public:
+    virtual ~Instrument2DItem();
+
     static const QString P_BEAM;
     static const QString P_DETECTOR;
     static const QString P_BACKGROUND;
@@ -53,6 +57,8 @@ public:
 
     QStringList translateList(const QStringList& list) const override;
 
+    std::unique_ptr<Instrument> createInstrument() const override;
+
 protected:
     explicit Instrument2DItem(const QString& modelType);
 };