diff --git a/GUI/Model/FromCore/FromCore.h b/GUI/Model/FromCore/FromCore.h
deleted file mode 100644
index ae62dd1e07d1b3a386b6511f1878ae2e76a7dde6..0000000000000000000000000000000000000000
--- a/GUI/Model/FromCore/FromCore.h
+++ /dev/null
@@ -1,74 +0,0 @@
-//  ************************************************************************************************
-//
-//  BornAgain: simulate and fit reflection and scattering
-//
-//! @file      GUI/Model/FromCore/FromCore.h
-//! @brief     Defines namespace GUI::Transform::FromCore
-//!
-//! @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)
-//
-//  ************************************************************************************************
-
-#ifndef BORNAGAIN_GUI_MODEL_FROMCORE_FROMCORE_H
-#define BORNAGAIN_GUI_MODEL_FROMCORE_FROMCORE_H
-
-#include <QString>
-#include <variant>
-
-class BasicAxisItem;
-class BeamDistributionItem;
-class BeamItem;
-class DetectorItem;
-class GISASInstrumentItem;
-class Instrument2DItem;
-class InstrumentItem;
-class RectangularDetectorItem;
-class SpecularBeamItem;
-class SphericalDetectorItem;
-
-class IAxis;
-class IDetector;
-class ISimulation2D;
-class ISimulation;
-class OffspecSimulation;
-class ParameterDistribution;
-class RectangularDetector;
-class ScatteringSimulation;
-class SessionItem;
-class SpecularSimulation;
-class SphericalDetector;
-
-namespace GUI::Transform::FromCore {
-
-void setGISASBeamItem(BeamItem* beam_item, const ScatteringSimulation& simulation);
-
-void setOffspecBeamItem(BeamItem* beam_item, const OffspecSimulation& simulation);
-
-void setSpecularBeamItem(SpecularBeamItem* beam_item, const SpecularSimulation& simulation);
-
-void updateDetector(Instrument2DItem* instrument_item, const ISimulation2D& simulation);
-
-void setDetectorGeometry(Instrument2DItem* instrument_item, const IDetector& detector);
-
-void setDetectorResolution(DetectorItem* detector_item, const IDetector& detector);
-
-void setPolarizerAnalyzer(Instrument2DItem* instrument_item, const ISimulation2D& simulation);
-
-void setSphericalDetector(SphericalDetectorItem* detector_item, const SphericalDetector& detector);
-
-void setRectangularDetector(RectangularDetectorItem* detector_item,
-                            const RectangularDetector& detector);
-
-void setItemFromSample(BeamDistributionItem* beam_distribution_item,
-                       const ParameterDistribution& parameter_distribution);
-
-void setBackground(InstrumentItem* instrument_item, const ISimulation& simulation);
-
-void setAxisItem(BasicAxisItem* item, const IAxis& axis, double factor = 1.0);
-
-} // namespace GUI::Transform::FromCore
-
-#endif // BORNAGAIN_GUI_MODEL_FROMCORE_FROMCORE_H
diff --git a/GUI/Model/FromCore/GUIExamplesFactory.cpp b/GUI/Model/FromCore/GUIExamplesFactory.cpp
index 7d21be067f218c13281e2c52abb485a4fde34a35..fc3bbe2f56cb60e4bec737d1f1daa89c3fe77605 100644
--- a/GUI/Model/FromCore/GUIExamplesFactory.cpp
+++ b/GUI/Model/FromCore/GUIExamplesFactory.cpp
@@ -14,8 +14,8 @@
 
 #include "GUI/Model/FromCore/GUIExamplesFactory.h"
 #include "Base/Util/Assert.h"
-#include "GUI/Model/FromCore/GUIObjectBuilder.h"
-#include "GUI/Model/FromCore/GUISampleBuilder.h"
+#include "GUI/Model/FromCore/ItemizeSimulation.h"
+#include "GUI/Model/FromCore/ItemizeSample.h"
 #include "Sample/Multilayer/MultiLayer.h"
 #include "Sample/StandardSamples/ExemplarySamples.h"
 #include <QMap>
diff --git a/GUI/Model/FromCore/GUIObjectBuilder.cpp b/GUI/Model/FromCore/GUIObjectBuilder.cpp
deleted file mode 100644
index aed3e0e6f5ced5dbb6551708e93ac98f4dc44efa..0000000000000000000000000000000000000000
--- a/GUI/Model/FromCore/GUIObjectBuilder.cpp
+++ /dev/null
@@ -1,101 +0,0 @@
-//  ************************************************************************************************
-//
-//  BornAgain: simulate and fit reflection and scattering
-//
-//! @file      GUI/Model/FromCore/GUIObjectBuilder.cpp
-//! @brief     Implements GUI::Model::ObjectBuilder namespace
-//!
-//! @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/Model/FromCore/GUIObjectBuilder.h"
-#include "Base/Const/Units.h"
-#include "Base/Util/Assert.h"
-#include "GUI/Model/Device/InstrumentCollection.h"
-#include "GUI/Model/Device/InstrumentItems.h"
-#include "GUI/Model/FromCore/FromCore.h"
-#include "GUI/Model/FromCore/GUISampleBuilder.h"
-#include "GUI/Support/Data/SimulationOptionsItem.h"
-#include "Resample/Options/SimulationOptions.h"
-#include "Sim/Simulation/includeSimulations.h"
-
-namespace {
-
-GISASInstrumentItem* createGISASInstrumentItem(InstrumentCollection* model,
-                                               const ScatteringSimulation& simulation)
-{
-    auto* result = model->addInstrument<GISASInstrumentItem>();
-    GUI::Transform::FromCore::setGISASBeamItem(result->beamItem(), simulation);
-    GUI::Transform::FromCore::updateDetector(result, simulation);
-    GUI::Transform::FromCore::setBackground(result, simulation);
-
-    return result;
-}
-
-OffspecInstrumentItem* createOffspecInstrumentItem(InstrumentCollection* model,
-                                                   const OffspecSimulation& simulation)
-{
-    auto* result = model->addInstrument<OffspecInstrumentItem>();
-    GUI::Transform::FromCore::setOffspecBeamItem(result->beamItem(), simulation);
-    GUI::Transform::FromCore::updateDetector(result, simulation);
-    GUI::Transform::FromCore::setBackground(result, simulation);
-
-    const double factor = 1. / Units::deg;
-    result->alphaAxis().setNbins(simulation.beamAxis()->size());
-    result->alphaAxis().setMin(factor * simulation.beamAxis()->min());
-    result->alphaAxis().setMax(factor * simulation.beamAxis()->max());
-
-    return result;
-}
-
-SpecularInstrumentItem* createSpecularInstrumentItem(InstrumentCollection* model,
-                                                     const SpecularSimulation& simulation)
-{
-    auto* result = model->addInstrument<SpecularInstrumentItem>();
-    GUI::Transform::FromCore::setSpecularBeamItem(result->beamItem(), simulation);
-    GUI::Transform::FromCore::setBackground(result, simulation);
-
-    return result;
-}
-
-} // namespace
-
-//  ************************************************************************************************
-//  class implementation
-//  ************************************************************************************************
-
-InstrumentCollection* GUI::Transform::FromCore::itemizeInstruments(const ISimulation& simulation)
-{
-    auto* result = new InstrumentCollection;
-
-    if (const auto* gisasSimulation = dynamic_cast<const ScatteringSimulation*>(&simulation))
-        createGISASInstrumentItem(result, *gisasSimulation);
-    else if (const auto* offspecSimulation = dynamic_cast<const OffspecSimulation*>(&simulation))
-        createOffspecInstrumentItem(result, *offspecSimulation);
-    else if (const auto* spec_simulation = dynamic_cast<const SpecularSimulation*>(&simulation))
-        createSpecularInstrumentItem(result, *spec_simulation);
-    else
-        ASSERT(0);
-
-    return result;
-}
-
-SimulationOptionsItem* GUI::Transform::FromCore::itemizeOptions(const ISimulation& simulation)
-{
-    auto* result = new SimulationOptionsItem;
-
-    if (simulation.options().isIntegrate())
-        result->setUseMonteCarloIntegration(
-            static_cast<unsigned>(simulation.options().getMcPoints()));
-    else
-        result->setUseAnalytical();
-
-    result->setUseAverageMaterials(simulation.options().useAvgMaterials());
-    result->setIncludeSpecularPeak(simulation.options().includeSpecular());
-
-    return result;
-}
diff --git a/GUI/Model/FromCore/GUISampleBuilder.cpp b/GUI/Model/FromCore/ItemizeSample.cpp
similarity index 99%
rename from GUI/Model/FromCore/GUISampleBuilder.cpp
rename to GUI/Model/FromCore/ItemizeSample.cpp
index 2b23759f1239f8ba3e3096399e92b7454bd297df..78d0392b985d0a248575d426351206b71edff6fd 100644
--- a/GUI/Model/FromCore/GUISampleBuilder.cpp
+++ b/GUI/Model/FromCore/ItemizeSample.cpp
@@ -2,7 +2,7 @@
 //
 //  BornAgain: simulate and fit reflection and scattering
 //
-//! @file      GUI/Model/FromCore/GUISampleBuilder.cpp
+//! @file      GUI/Model/FromCore/ItemizeSample.cpp
 //! @brief     Implements class GUISampleBuilder
 //!
 //! @homepage  http://www.bornagainproject.org
@@ -12,10 +12,9 @@
 //
 //  ************************************************************************************************
 
-#include "GUI/Model/FromCore/GUISampleBuilder.h"
+#include "GUI/Model/FromCore/ItemizeSample.h"
 #include "Base/Const/Units.h"
 #include "GUI/Model/Descriptor/DoubleDescriptor.h"
-#include "GUI/Model/FromCore/FromCore.h"
 #include "GUI/Model/Sample/LayerItem.h"
 #include "GUI/Model/Sample/MaterialItem.h"
 #include "GUI/Model/Sample/MaterialItems.h"
@@ -629,6 +628,7 @@ void copyParticle(const IParticle* iparticle, MaterialItems& matItems,
 
 } // namespace
 
+
 namespace GUI::Transform::FromCore {
 
 MultiLayerItem* itemizeSample(const MultiLayer& sample, const QString& nodeName)
diff --git a/GUI/Model/FromCore/GUISampleBuilder.h b/GUI/Model/FromCore/ItemizeSample.h
similarity index 79%
rename from GUI/Model/FromCore/GUISampleBuilder.h
rename to GUI/Model/FromCore/ItemizeSample.h
index 494dd9926126d1244ac6be66d56bbc75cfdbbb2f..0b2adcc88943143e761005629c1369a5260575ca 100644
--- a/GUI/Model/FromCore/GUISampleBuilder.h
+++ b/GUI/Model/FromCore/ItemizeSample.h
@@ -2,7 +2,7 @@
 //
 //  BornAgain: simulate and fit reflection and scattering
 //
-//! @file      GUI/Model/FromCore/GUISampleBuilder.h
+//! @file      GUI/Model/FromCore/ItemizeSample.h
 //! @brief     Defines class GUISampleBuilder
 //!
 //! @homepage  http://www.bornagainproject.org
@@ -12,8 +12,8 @@
 //
 //  ************************************************************************************************
 
-#ifndef BORNAGAIN_GUI_MODEL_FROMCORE_GUISAMPLEBUILDER_H
-#define BORNAGAIN_GUI_MODEL_FROMCORE_GUISAMPLEBUILDER_H
+#ifndef BORNAGAIN_GUI_MODEL_FROMCORE_ITEMIZESAMPLE_H
+#define BORNAGAIN_GUI_MODEL_FROMCORE_ITEMIZESAMPLE_H
 
 #include <QString>
 
@@ -27,4 +27,4 @@ MultiLayerItem* itemizeSample(const MultiLayer& sample, const QString& nodeName
 
 } // namespace GUI::Transform::FromCore
 
-#endif // BORNAGAIN_GUI_MODEL_FROMCORE_GUISAMPLEBUILDER_H
+#endif // BORNAGAIN_GUI_MODEL_FROMCORE_ITEMIZESAMPLE_H
diff --git a/GUI/Model/FromCore/FromCore.cpp b/GUI/Model/FromCore/ItemizeSimulation.cpp
similarity index 81%
rename from GUI/Model/FromCore/FromCore.cpp
rename to GUI/Model/FromCore/ItemizeSimulation.cpp
index 86d5677b00e78d54e0a7662333ab5d54514582ca..52c1b9000a31c36a8cc0ee82567ea3ef5c982681 100644
--- a/GUI/Model/FromCore/FromCore.cpp
+++ b/GUI/Model/FromCore/ItemizeSimulation.cpp
@@ -2,8 +2,8 @@
 //
 //  BornAgain: simulate and fit reflection and scattering
 //
-//! @file      GUI/Model/FromCore/FromCore.cpp
-//! @brief     Implements namespace TransformFromCore
+//! @file      GUI/Model/FromCore/ItemizeSimulation.cpp
+//! @brief     Implements functions that convert ISimulation from core to GUI items
 //!
 //! @homepage  http://www.bornagainproject.org
 //! @license   GNU General Public License v3 or higher (see COPYING)
@@ -12,8 +12,9 @@
 //
 //  ************************************************************************************************
 
-#include "GUI/Model/FromCore/FromCore.h"
+#include "GUI/Model/FromCore/ItemizeSimulation.h"
 #include "Base/Const/Units.h"
+#include "Base/Util/Assert.h"
 #include "Device/Beam/Beam.h"
 #include "Device/Beam/FootprintGauss.h"
 #include "Device/Beam/FootprintSquare.h"
@@ -31,19 +32,23 @@
 #include "GUI/Model/Device/BackgroundItems.h"
 #include "GUI/Model/Device/BeamAngleItems.h"
 #include "GUI/Model/Device/BeamWavelengthItem.h"
+#include "GUI/Model/Device/InstrumentCollection.h"
 #include "GUI/Model/Device/InstrumentItems.h"
 #include "GUI/Model/Device/MaskItems.h"
 #include "GUI/Model/Device/RectangularDetectorItem.h"
 #include "GUI/Model/Device/ResolutionFunctionItems.h"
 #include "GUI/Model/Device/SphericalDetectorItem.h"
+#include "GUI/Model/FromCore/ItemizeSample.h"
 #include "GUI/Model/Sample/LayerItem.h"
 #include "GUI/Model/Sample/MesoCrystalItem.h"
 #include "GUI/Model/Sample/ParticleItem.h"
 #include "GUI/Model/Sample/ParticleLayoutItem.h"
+#include "GUI/Support/Data/SimulationOptionsItem.h"
 #include "GUI/Util/Error.h"
 #include "Param/Distrib/Distributions.h"
 #include "Param/Distrib/RangedDistributions.h"
 #include "Param/Node/NodeUtils.h"
+#include "Resample/Options/SimulationOptions.h"
 #include "Sim/Background/ConstantBackground.h"
 #include "Sim/Background/PoissonBackground.h"
 #include "Sim/Scan/AlphaScan.h"
@@ -152,27 +157,6 @@ void setFootprintFactor(const IFootprintFactor* footprint, SpecularBeamItem* bea
         beam_item->setSquareFootprint(square_fp->widthRatio());
 }
 
-void addDistributionToBeamItem(ParameterDistribution::WhichParameter which,
-                               BeamDistributionItem* item,
-                               const ParameterDistribution& distribution)
-{
-    if (distribution.whichParameter() != which)
-        return;
-
-    GUI::Transform::FromCore::setItemFromSample(item, distribution);
-}
-
-void addRangedDistributionToItem(BeamDistributionItem* distributionItem,
-                                 const IRangedDistribution& ranged, double mean, double std_dev)
-{
-    if (!distributionItem)
-        return;
-    ParameterDistribution par_distr(ParameterDistribution::None,
-                                    *ranged.distribution(mean, std_dev), ranged.nSamples(),
-                                    ranged.sigmaFactor(), ranged.limits());
-    GUI::Transform::FromCore::setItemFromSample(distributionItem, par_distr);
-}
-
 void setDistribution(BeamDistributionItem* part_distr_item, ParameterDistribution par_distr,
                      double factor)
 {
@@ -212,7 +196,7 @@ void setDistribution(BeamDistributionItem* part_distr_item, ParameterDistributio
         distr_trapez_item->setRightWidth(factor * distr->getRightWidth());
         distItem = distr_trapez_item;
     } else
-        throw Error("GUI::Transform::FromCore::setDistribution: -> unknown distribution");
+        throw Error("setDistribution: -> unknown distribution");
 
     distItem->setNumberOfSamples((int)par_distr.getNbrSamples());
 
@@ -223,13 +207,46 @@ void setDistribution(BeamDistributionItem* part_distr_item, ParameterDistributio
     distItem->setLimits(par_distr.getLimits().scaledLimits(factor));
 }
 
-} // namespace
+void setItemFromSample(
+    BeamDistributionItem* beam_distribution_item,
+    const ParameterDistribution& parameter_distribution)
+{
+    ASSERT(beam_distribution_item);
 
-//  ************************************************************************************************
-//  class implementation
-//  ************************************************************************************************
+    if (parameter_distribution.getMinValue() < parameter_distribution.getMaxValue()) {
+        throw Error(
+            "setItemFromSample(BeamDistributionItem* "
+            "beamDistributionItem,"
+            "const ParameterDistribution& parameterDistribution) -> Error. ParameterDistribution "
+            "with defined min,max are not yet implemented in GUI");
+    }
+
+    const double unit_factor = 1.0 / beam_distribution_item->scaleFactor();
+    setDistribution(beam_distribution_item, parameter_distribution, unit_factor);
+}
+
+void addDistributionToBeamItem(ParameterDistribution::WhichParameter which,
+                               BeamDistributionItem* item,
+                               const ParameterDistribution& distribution)
+{
+    if (distribution.whichParameter() != which)
+        return;
+
+    setItemFromSample(item, distribution);
+}
+
+void addRangedDistributionToItem(BeamDistributionItem* distributionItem,
+                                 const IRangedDistribution& ranged, double mean, double std_dev)
+{
+    if (!distributionItem)
+        return;
+    ParameterDistribution par_distr(ParameterDistribution::None,
+                                    *ranged.distribution(mean, std_dev), ranged.nSamples(),
+                                    ranged.sigmaFactor(), ranged.limits());
+    setItemFromSample(distributionItem, par_distr);
+}
 
-void GUI::Transform::FromCore::setGISASBeamItem(BeamItem* beam_item,
+void setGISASBeamItem(BeamItem* beam_item,
                                                 const ScatteringSimulation& simulation)
 {
     ASSERT(beam_item);
@@ -253,7 +270,7 @@ void GUI::Transform::FromCore::setGISASBeamItem(BeamItem* beam_item,
     }
 }
 
-void GUI::Transform::FromCore::setOffspecBeamItem(BeamItem* beam_item,
+void setOffspecBeamItem(BeamItem* beam_item,
                                                   const OffspecSimulation& simulation)
 {
     const Beam& beam = simulation.beam();
@@ -265,7 +282,18 @@ void GUI::Transform::FromCore::setOffspecBeamItem(BeamItem* beam_item,
     // TODO implement beam divergence
 }
 
-void GUI::Transform::FromCore::setSpecularBeamItem(SpecularBeamItem* beam_item,
+void setAxisItem(BasicAxisItem* item, const IAxis& axis, double factor)
+{
+    if (!dynamic_cast<const FixedBinAxis*>(&axis))
+        throw Error("setAxisItem() -> Error. Unexpected axis");
+
+    item->setBinCount(static_cast<int>(axis.size()));
+    item->setLowerBound(factor * axis.min());
+    item->setUpperBound(factor * axis.max());
+    item->setTitle(QString::fromStdString(axis.axisName()));
+}
+
+void setSpecularBeamItem(SpecularBeamItem* beam_item,
                                                    const SpecularSimulation& simulation)
 {
     const Beam& beam = simulation.beam();
@@ -276,7 +304,7 @@ void GUI::Transform::FromCore::setSpecularBeamItem(SpecularBeamItem* beam_item,
     beam_item->setAzimuthalAngle(0.0);   // azimuthal angle is hardcoded
 
     auto* axis_item = beam_item->inclinationAxis();
-    GUI::Transform::FromCore::setAxisItem(axis_item, *simulation.coordinateAxis(), 1. / Units::deg);
+    setAxisItem(axis_item, *simulation.coordinateAxis(), 1. / Units::deg);
 
     setFootprintFactor(simulation.footprintFactor(), beam_item);
 
@@ -300,77 +328,7 @@ void GUI::Transform::FromCore::setSpecularBeamItem(SpecularBeamItem* beam_item,
     }
 }
 
-void GUI::Transform::FromCore::updateDetector(Instrument2DItem* instrument_item,
-                                              const ISimulation2D& simulation)
-{
-    const IDetector& detector = simulation.detector();
-    setDetectorGeometry(instrument_item, detector);
-
-    auto* detector_item = instrument_item->detectorItem();
-
-    setDetectorResolution(detector_item, detector);
-    setDetectorMasks(detector_item, simulation);
-    setPolarizerAnalyzer(instrument_item, simulation);
-}
-
-void GUI::Transform::FromCore::setDetectorGeometry(Instrument2DItem* instrument_item,
-                                                   const IDetector& detector)
-{
-    if (const auto* det = dynamic_cast<const SphericalDetector*>(&detector)) {
-        auto* item = instrument_item->setDetectorType<SphericalDetectorItem>();
-        setSphericalDetector(item, *det);
-    } else if (const auto* det = dynamic_cast<const RectangularDetector*>(&detector)) {
-        auto* item = instrument_item->setDetectorType<RectangularDetectorItem>();
-        setRectangularDetector(item, *det);
-    } else {
-        throw Error("GUI::Transform::FromCore::setDetectorGeometry() -> Unknown detector type.");
-    }
-}
-
-void GUI::Transform::FromCore::setDetectorResolution(DetectorItem* detector_item,
-                                                     const IDetector& detector)
-{
-    const IDetectorResolution* p_resfunc = detector.detectorResolution();
-
-    if (!p_resfunc)
-        return;
-
-    if (const auto* p_convfunc = dynamic_cast<const ConvolutionDetectorResolution*>(p_resfunc)) {
-        if (const auto* resfunc = dynamic_cast<const ResolutionFunction2DGaussian*>(
-                p_convfunc->getResolutionFunction2D())) {
-            auto* item =
-                detector_item->setResolutionFunctionType<ResolutionFunction2DGaussianItem>();
-            const double scale = 1.0 / detector_item->axesToCoreUnitsFactor();
-            item->setSigmaX(scale * resfunc->sigmaX());
-            item->setSigmaY(scale * resfunc->sigmaY());
-        } else {
-            throw Error("GUI::Transform::FromCore::setDetectorResolution() -> Error. "
-                        "Unknown detector resolution function");
-        }
-    } else {
-        throw Error("GUI::Transform::FromCore::setDetectorResolution() -> Error. "
-                    "Not a ConvolutionDetectorResolution function");
-    }
-}
-
-void GUI::Transform::FromCore::setPolarizerAnalyzer(Instrument2DItem* instrument_item,
-                                                    const ISimulation2D& simulation)
-{
-    instrument_item->setPolarization(simulation.beam().polVector());
-
-    const IDetector& detector = simulation.detector();
-    double total_transmission = detector.analyzer().totalTransmission();
-    if (total_transmission <= 0.0)
-        return;
-
-    R3 analyzer_dir = detector.analyzer().analyzerDirection();
-    double efficiency = detector.analyzer().analyzerEfficiency();
-    instrument_item->setAnalyzerDirection(analyzer_dir);
-    instrument_item->setAnalyzerEfficiency(efficiency);
-    instrument_item->setAnalyzerTotalTransmission(total_transmission);
-}
-
-void GUI::Transform::FromCore::setSphericalDetector(SphericalDetectorItem* detectorItem,
+void setSphericalDetector(SphericalDetectorItem* detectorItem,
                                                     const SphericalDetector& detector)
 {
     // Axes
@@ -388,7 +346,7 @@ void GUI::Transform::FromCore::setSphericalDetector(SphericalDetectorItem* detec
     alphaAxis.setMax(Units::rad2deg(alpha_axis.max()));
 }
 
-void GUI::Transform::FromCore::setRectangularDetector(RectangularDetectorItem* detectorItem,
+void setRectangularDetector(RectangularDetectorItem* detectorItem,
                                                       const RectangularDetector& detector)
 {
     // Axes
@@ -430,31 +388,83 @@ void GUI::Transform::FromCore::setRectangularDetector(RectangularDetectorItem* d
         detectorItem->setU0(detector.getDirectBeamU0());
         detectorItem->setV0(detector.getDirectBeamV0());
     } else {
-        throw Error("GUI::Transform::FromCore::setItemFromSample(RectangularDetectorItem* "
+        throw Error("setItemFromSample(RectangularDetectorItem* "
                     "detectorItem "
                     "Error. Unknown detector arrangement");
     }
 }
 
-void GUI::Transform::FromCore::setItemFromSample(
-    BeamDistributionItem* beam_distribution_item,
-    const ParameterDistribution& parameter_distribution)
+void setDetectorGeometry(Instrument2DItem* instrument_item,
+                                                   const IDetector& detector)
 {
-    ASSERT(beam_distribution_item);
+    if (const auto* det = dynamic_cast<const SphericalDetector*>(&detector)) {
+        auto* item = instrument_item->setDetectorType<SphericalDetectorItem>();
+        setSphericalDetector(item, *det);
+    } else if (const auto* det = dynamic_cast<const RectangularDetector*>(&detector)) {
+        auto* item = instrument_item->setDetectorType<RectangularDetectorItem>();
+        setRectangularDetector(item, *det);
+    } else {
+        throw Error("setDetectorGeometry() -> Unknown detector type.");
+    }
+}
 
-    if (parameter_distribution.getMinValue() < parameter_distribution.getMaxValue()) {
-        throw Error(
-            "GUI::Transform::FromCore::setItemFromSample(BeamDistributionItem* "
-            "beamDistributionItem,"
-            "const ParameterDistribution& parameterDistribution) -> Error. ParameterDistribution "
-            "with defined min,max are not yet implemented in GUI");
+void setDetectorResolution(DetectorItem* detector_item,
+                                                     const IDetector& detector)
+{
+    const IDetectorResolution* p_resfunc = detector.detectorResolution();
+
+    if (!p_resfunc)
+        return;
+
+    if (const auto* p_convfunc = dynamic_cast<const ConvolutionDetectorResolution*>(p_resfunc)) {
+        if (const auto* resfunc = dynamic_cast<const ResolutionFunction2DGaussian*>(
+                p_convfunc->getResolutionFunction2D())) {
+            auto* item =
+                detector_item->setResolutionFunctionType<ResolutionFunction2DGaussianItem>();
+            const double scale = 1.0 / detector_item->axesToCoreUnitsFactor();
+            item->setSigmaX(scale * resfunc->sigmaX());
+            item->setSigmaY(scale * resfunc->sigmaY());
+        } else {
+            throw Error("setDetectorResolution() -> Error. "
+                        "Unknown detector resolution function");
+        }
+    } else {
+        throw Error("setDetectorResolution() -> Error. "
+                    "Not a ConvolutionDetectorResolution function");
     }
+}
 
-    const double unit_factor = 1.0 / beam_distribution_item->scaleFactor();
-    setDistribution(beam_distribution_item, parameter_distribution, unit_factor);
+void setPolarizerAnalyzer(Instrument2DItem* instrument_item,
+                                                    const ISimulation2D& simulation)
+{
+    instrument_item->setPolarization(simulation.beam().polVector());
+
+    const IDetector& detector = simulation.detector();
+    double total_transmission = detector.analyzer().totalTransmission();
+    if (total_transmission <= 0.0)
+        return;
+
+    R3 analyzer_dir = detector.analyzer().analyzerDirection();
+    double efficiency = detector.analyzer().analyzerEfficiency();
+    instrument_item->setAnalyzerDirection(analyzer_dir);
+    instrument_item->setAnalyzerEfficiency(efficiency);
+    instrument_item->setAnalyzerTotalTransmission(total_transmission);
 }
 
-void GUI::Transform::FromCore::setBackground(InstrumentItem* instrument_item,
+void updateDetector(Instrument2DItem* instrument_item,
+                                              const ISimulation2D& simulation)
+{
+    const IDetector& detector = simulation.detector();
+    setDetectorGeometry(instrument_item, detector);
+
+    auto* detector_item = instrument_item->detectorItem();
+
+    setDetectorResolution(detector_item, detector);
+    setDetectorMasks(detector_item, simulation);
+    setPolarizerAnalyzer(instrument_item, simulation);
+}
+
+void setBackground(InstrumentItem* instrument_item,
                                              const ISimulation& simulation)
 {
     const auto* p_bg = simulation.background();
@@ -466,13 +476,74 @@ void GUI::Transform::FromCore::setBackground(InstrumentItem* instrument_item,
         instrument_item->setBackgroundType<PoissonBackgroundItem>();
 }
 
-void GUI::Transform::FromCore::setAxisItem(BasicAxisItem* item, const IAxis& axis, double factor)
+GISASInstrumentItem* createGISASInstrumentItem(InstrumentCollection* model,
+                                               const ScatteringSimulation& simulation)
 {
-    if (!dynamic_cast<const FixedBinAxis*>(&axis))
-        throw Error("GUI::Transform::FromCore::setAxisItem() -> Error. Unexpected axis");
+    auto* result = model->addInstrument<GISASInstrumentItem>();
+    setGISASBeamItem(result->beamItem(), simulation);
+    updateDetector(result, simulation);
+    setBackground(result, simulation);
 
-    item->setBinCount(static_cast<int>(axis.size()));
-    item->setLowerBound(factor * axis.min());
-    item->setUpperBound(factor * axis.max());
-    item->setTitle(QString::fromStdString(axis.axisName()));
+    return result;
+}
+
+OffspecInstrumentItem* createOffspecInstrumentItem(InstrumentCollection* model,
+                                                   const OffspecSimulation& simulation)
+{
+    auto* result = model->addInstrument<OffspecInstrumentItem>();
+    setOffspecBeamItem(result->beamItem(), simulation);
+    updateDetector(result, simulation);
+    setBackground(result, simulation);
+
+    const double factor = 1. / Units::deg;
+    result->alphaAxis().setNbins(simulation.beamAxis()->size());
+    result->alphaAxis().setMin(factor * simulation.beamAxis()->min());
+    result->alphaAxis().setMax(factor * simulation.beamAxis()->max());
+
+    return result;
+}
+
+SpecularInstrumentItem* createSpecularInstrumentItem(InstrumentCollection* model,
+                                                     const SpecularSimulation& simulation)
+{
+    auto* result = model->addInstrument<SpecularInstrumentItem>();
+    setSpecularBeamItem(result->beamItem(), simulation);
+    setBackground(result, simulation);
+
+    return result;
+}
+
+} // namespace
+
+
+InstrumentCollection* GUI::Transform::FromCore::itemizeInstruments(const ISimulation& simulation)
+{
+    auto* result = new InstrumentCollection;
+
+    if (const auto* gisasSimulation = dynamic_cast<const ScatteringSimulation*>(&simulation))
+        createGISASInstrumentItem(result, *gisasSimulation);
+    else if (const auto* offspecSimulation = dynamic_cast<const OffspecSimulation*>(&simulation))
+        createOffspecInstrumentItem(result, *offspecSimulation);
+    else if (const auto* spec_simulation = dynamic_cast<const SpecularSimulation*>(&simulation))
+        createSpecularInstrumentItem(result, *spec_simulation);
+    else
+        ASSERT(0);
+
+    return result;
+}
+
+SimulationOptionsItem* GUI::Transform::FromCore::itemizeOptions(const ISimulation& simulation)
+{
+    auto* result = new SimulationOptionsItem;
+
+    if (simulation.options().isIntegrate())
+        result->setUseMonteCarloIntegration(
+            static_cast<unsigned>(simulation.options().getMcPoints()));
+    else
+        result->setUseAnalytical();
+
+    result->setUseAverageMaterials(simulation.options().useAvgMaterials());
+    result->setIncludeSpecularPeak(simulation.options().includeSpecular());
+
+    return result;
 }
diff --git a/GUI/Model/FromCore/GUIObjectBuilder.h b/GUI/Model/FromCore/ItemizeSimulation.h
similarity index 80%
rename from GUI/Model/FromCore/GUIObjectBuilder.h
rename to GUI/Model/FromCore/ItemizeSimulation.h
index 0ac3999ec5e270d2e22ed3d2ea5a1d58aaa59087..d651bc6a38af01e2b8a1562e8b64714bacb7ef85 100644
--- a/GUI/Model/FromCore/GUIObjectBuilder.h
+++ b/GUI/Model/FromCore/ItemizeSimulation.h
@@ -2,7 +2,7 @@
 //
 //  BornAgain: simulate and fit reflection and scattering
 //
-//! @file      GUI/Model/FromCore/GUIObjectBuilder.h
+//! @file      GUI/Model/FromCore/ItemizeSimulation.h
 //! @brief     Defines namespace GUI::Model::ObjectBuilder
 //!
 //! @homepage  http://www.bornagainproject.org
@@ -12,8 +12,8 @@
 //
 //  ************************************************************************************************
 
-#ifndef BORNAGAIN_GUI_MODEL_FROMCORE_GUIOBJECTBUILDER_H
-#define BORNAGAIN_GUI_MODEL_FROMCORE_GUIOBJECTBUILDER_H
+#ifndef BORNAGAIN_GUI_MODEL_FROMCORE_ITEMIZESIMULATION_H
+#define BORNAGAIN_GUI_MODEL_FROMCORE_ITEMIZESIMULATION_H
 
 class SimulationOptionsItem;
 class ISimulation;
@@ -29,4 +29,4 @@ SimulationOptionsItem* itemizeOptions(const ISimulation& simulation);
 
 } // namespace GUI::Transform::FromCore
 
-#endif // BORNAGAIN_GUI_MODEL_FROMCORE_GUIOBJECTBUILDER_H
+#endif // BORNAGAIN_GUI_MODEL_FROMCORE_ITEMIZESIMULATION_H
diff --git a/GUI/View/Project/PyImportAssistant.cpp b/GUI/View/Project/PyImportAssistant.cpp
index bc9818cabf7965f231967978a18340a8d0b9e2a5..7880df33de3ae32d5193c519025f1b1a0fa801e4 100644
--- a/GUI/View/Project/PyImportAssistant.cpp
+++ b/GUI/View/Project/PyImportAssistant.cpp
@@ -19,8 +19,8 @@
 #include "Base/Util/Assert.h"
 #include "Base/Util/SysUtils.h"
 #include "GUI/Application/ApplicationSettings.h"
-#include "GUI/Model/FromCore/GUIObjectBuilder.h"
-#include "GUI/Model/FromCore/GUISampleBuilder.h"
+#include "GUI/Model/FromCore/ItemizeSimulation.h"
+#include "GUI/Model/FromCore/ItemizeSample.h"
 #include "GUI/Support/IO/ProjectUtils.h"
 #include "GUI/Util/Path.h"
 #include "GUI/Util/String.h"
diff --git a/GUI/View/SampleDesigner/SampleListModel.cpp b/GUI/View/SampleDesigner/SampleListModel.cpp
index 89bda989428f93523674bc74d003ba750d5b7616..f1218d0fae3fc532daa6b8820ad790ef6c709a03 100644
--- a/GUI/View/SampleDesigner/SampleListModel.cpp
+++ b/GUI/View/SampleDesigner/SampleListModel.cpp
@@ -15,7 +15,7 @@
 #include "GUI/View/SampleDesigner/SampleListModel.h"
 #include "Base/Util/Assert.h"
 #include "GUI/Model/FromCore/GUIExamplesFactory.h"
-#include "GUI/Model/FromCore/GUISampleBuilder.h"
+#include "GUI/Model/FromCore/ItemizeSample.h"
 #include "GUI/Model/Sample/MultiLayerItem.h"
 #include "GUI/Model/Sample/MultiLayerItems.h"
 #include "GUI/Util/String.h"
diff --git a/Tests/Functional/GUI/Check.cpp b/Tests/Functional/GUI/Check.cpp
index 7f7e0f91d2c94d786eb0316eb3db2ab74407714e..5c0f03613c6212eaa86a0b707129bf7724225503 100644
--- a/Tests/Functional/GUI/Check.cpp
+++ b/Tests/Functional/GUI/Check.cpp
@@ -19,8 +19,8 @@
 #include "Device/Histo/IOFactory.h"
 #include "Device/Histo/SimulationResult.h"
 #include "GUI/Model/Device/InstrumentCollection.h"
-#include "GUI/Model/FromCore/GUIObjectBuilder.h"
-#include "GUI/Model/FromCore/GUISampleBuilder.h"
+#include "GUI/Model/FromCore/ItemizeSimulation.h"
+#include "GUI/Model/FromCore/ItemizeSample.h"
 #include "GUI/Model/Sample/MultiLayerItem.h"
 #include "GUI/Model/ToCore/SimulationToCore.h"
 #include "GUI/Support/Data/SimulationOptionsItem.h"
diff --git a/Tests/Unit/GUI/TestAxesItems.cpp b/Tests/Unit/GUI/TestAxesItems.cpp
deleted file mode 100644
index 8318fe0f0877ceb10936b0405c07e8d93daf9913..0000000000000000000000000000000000000000
--- a/Tests/Unit/GUI/TestAxesItems.cpp
+++ /dev/null
@@ -1,98 +0,0 @@
-#include "Base/Axis/FixedBinAxis.h"
-#include "Base/Axis/PointwiseAxis.h"
-#include "Base/Axis/VariableBinAxis.h"
-#include "Base/Const/Units.h"
-#include "GUI/Model/Device/AxesItems.h"
-#include "GUI/Model/Device/PointwiseAxisItem.h"
-#include "GUI/Model/FromCore/FromCore.h"
-#include "GUI/Util/Error.h"
-#include "Tests/GTestWrapper/google_test.h"
-
-class TestAxesItems : public ::testing::Test {
-};
-
-TEST_F(TestAxesItems, gettersAndSettes)
-{
-    BasicAxisItem item;
-
-    item.setBinCount(42);
-    EXPECT_EQ(item.binCount(), 42);
-
-    item.setLowerBound(42.1);
-    EXPECT_EQ(item.min(), 42.1);
-
-    item.setUpperBound(42.2);
-    EXPECT_EQ(item.max(), 42.2);
-
-    item.setTitle("abc");
-    EXPECT_EQ(item.title(), QString("abc"));
-}
-
-TEST_F(TestAxesItems, AmplitudeAxisGettersAndSetters)
-{
-    AmplitudeAxisItem item;
-
-    item.setLogScale(true);
-    EXPECT_TRUE(item.isLogScale());
-    item.setLogScale(false);
-    EXPECT_FALSE(item.isLogScale());
-}
-
-TEST_F(TestAxesItems, transformFromCore)
-{
-    BasicAxisItem item;
-
-    // transform domain axis without scale factor
-    FixedBinAxis axis0("axis0", 99, -42.0, 42.0);
-    GUI::Transform::FromCore::setAxisItem(&item, axis0);
-    EXPECT_EQ(item.binCount(), static_cast<int>(axis0.size()));
-    EXPECT_EQ(item.min(), axis0.min());
-    EXPECT_EQ(item.max(), axis0.max());
-    EXPECT_EQ(item.title(), QString::fromStdString(axis0.axisName()));
-
-    // transform domain axis with limits given in radians
-    FixedBinAxis axis1("axis1", 42, -42.0 * Units::deg, 42.0 * Units::deg);
-    const double scale = 1. / Units::deg;
-    GUI::Transform::FromCore::setAxisItem(&item, axis1, scale);
-    EXPECT_EQ(item.binCount(), static_cast<int>(axis1.size()));
-    EXPECT_EQ(item.min(), -42.0);
-    EXPECT_EQ(item.max(), 42.0);
-    EXPECT_EQ(item.title(), QString::fromStdString(axis1.axisName()));
-
-    // transform from unexpected axis
-    std::vector<double> bins = {1.0, 2.0, 3.0};
-    VariableBinAxis varaxis("axis", bins.size() - 1, bins);
-    EXPECT_THROW(GUI::Transform::FromCore::setAxisItem(&item, varaxis), Error);
-}
-
-TEST_F(TestAxesItems, serializeBinaryData)
-{
-    PointwiseAxisItem axisItem;
-    EXPECT_EQ(axisItem.axis(), nullptr);
-    EXPECT_EQ(axisItem.serializeBinaryData().size(), 0);
-
-    // init item with pointwise axis
-    std::vector<double> coordinates{0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
-    PointwiseAxis axis("nameXY", coordinates);
-    axisItem.init(axis, "mm");
-
-    // check whether binary data is not empty
-    QByteArray binData1 = axisItem.serializeBinaryData();
-    EXPECT_NE(axisItem.serializeBinaryData().size(), 0);
-
-    // create a new item, fill it with the serialized data
-    PointwiseAxisItem axisItem2;
-    EXPECT_EQ(axisItem2.axis(), nullptr);
-    axisItem2.deserializeBinaryData(binData1);
-
-    // check whether coordinates are the same as originally set
-    EXPECT_NE(axisItem2.axis(), nullptr);
-    auto* pwaxis = dynamic_cast<const PointwiseAxis*>(axisItem2.axis());
-    ASSERT_NE(pwaxis, nullptr);
-
-    EXPECT_EQ(axis.binCenters(), pwaxis->binCenters());
-
-    // check whether serializing axisItem2 results in same bin data
-    QByteArray binData2 = axisItem2.serializeBinaryData();
-    EXPECT_EQ(binData1, binData2);
-}