diff --git a/GUI/coregui/Models/DomainObjectBuilder.cpp b/GUI/coregui/Models/DomainObjectBuilder.cpp
index a599ebd0af283d82e5fa890051216bfb22473c6a..010387c6ce6a0f91698bfa75c9a99bef797a5802 100644
--- a/GUI/coregui/Models/DomainObjectBuilder.cpp
+++ b/GUI/coregui/Models/DomainObjectBuilder.cpp
@@ -13,15 +13,22 @@
 // ************************************************************************** //
 
 #include "DomainObjectBuilder.h"
+#include "AxesItems.h"
 #include "BeamItems.h"
 #include "ComboProperty.h"
 #include "GUIHelpers.h"
+#include "IDetector2D.h"
 #include "InstrumentItems.h"
 #include "InterferenceFunctionItems.h"
 #include "LayerItem.h"
 #include "ParticleDistributionItem.h"
 #include "ParticleLayoutItem.h"
+#include "SimpleUnitConverters.h"
+#include "SpecularBeamInclinationItem.h"
 #include "TransformToDomain.h"
+#include "UnitConverter1D.h"
+#include "UnitConverterUtils.h"
+#include "Units.h"
 
 std::unique_ptr<MultiLayer> DomainObjectBuilder::buildMultiLayer(const SessionItem& multilayer_item)
 {
@@ -123,3 +130,34 @@ DomainObjectBuilder::buildInstrument(const InstrumentItem& instrumentItem)
 {
     return instrumentItem.createInstrument();
 }
+
+std::unique_ptr<IUnitConverter>
+DomainObjectBuilder::createUnitConverter(const InstrumentItem* instrumentItem)
+{
+    const auto instrument = instrumentItem->createInstrument();
+    instrument->initDetector();
+
+    if (instrumentItem->modelType() == Constants::GISASInstrumentType)
+        return UnitConverterUtils::createConverterForGISAS(*instrument);
+
+    if (instrumentItem->modelType() == Constants::SpecularInstrumentType)
+    {
+        auto axis_item = dynamic_cast<BasicAxisItem*>(
+            instrumentItem->beamItem()
+                ->getItem(SpecularBeamItem::P_INCLINATION_ANGLE)
+                ->getItem(SpecularBeamInclinationItem::P_ALPHA_AXIS));
+        return std::make_unique<UnitConverter1D>(instrument->getBeam(),
+                                                 *axis_item->createAxis(Units::degree));
+    }
+
+    if (instrumentItem->modelType() == Constants::OffSpecInstrumentType) {
+        auto axis_item = dynamic_cast<BasicAxisItem*>(
+            instrumentItem->getItem(OffSpecInstrumentItem::P_ALPHA_AXIS));
+        const auto detector2d = dynamic_cast<const IDetector2D*>(instrument->getDetector());
+        return std::make_unique<OffSpecularConverter>(*detector2d, instrument->getBeam(),
+                                                      *axis_item->createAxis(Units::degree));
+    }
+
+    throw GUIHelpers::Error(
+        "Error in DomainObjectBuilder::createUnitConverter: unknown instrument type.");
+}
diff --git a/GUI/coregui/Models/DomainObjectBuilder.h b/GUI/coregui/Models/DomainObjectBuilder.h
index 80d66ea0cd77a0f0b8e43940907776e558b92ad0..ed03b455f5111bac69589742b40d0ba98ce442b7 100644
--- a/GUI/coregui/Models/DomainObjectBuilder.h
+++ b/GUI/coregui/Models/DomainObjectBuilder.h
@@ -25,6 +25,7 @@ class ParticleLayout;
 class IInterferenceFunction;
 class SessionItem;
 class InstrumentItem;
+class IUnitConverter;
 
 namespace DomainObjectBuilder
 {
@@ -34,6 +35,10 @@ BA_CORE_API_ std::unique_ptr<ParticleLayout> buildParticleLayout(const SessionIt
 BA_CORE_API_ std::unique_ptr<IInterferenceFunction>
 buildInterferenceFunction(const SessionItem& item);
 BA_CORE_API_ std::unique_ptr<Instrument> buildInstrument(const InstrumentItem& instrumentItem);
+
+//! Creates a unit converter corresponding to the given instrument item
+BA_CORE_API_ std::unique_ptr<IUnitConverter>
+createUnitConverter(const InstrumentItem* instrumentItem);
 };
 
 #endif // DOMAINOBJECTBUILDER_H