diff --git a/GUI/coregui/Models/BeamItems.cpp b/GUI/coregui/Models/BeamItems.cpp
index e16ff56cff4b86dbefb4cf91a6130743bbcb496d..0e1373d8273691323b277f9653e3c148d6ddbbb3 100644
--- a/GUI/coregui/Models/BeamItems.cpp
+++ b/GUI/coregui/Models/BeamItems.cpp
@@ -63,6 +63,11 @@ void BeamItem::setIntensity(double value)
     setItemValue(P_INTENSITY, value);
 }
 
+SessionItem* BeamItem::intensityItem() const
+{
+    return getItem(P_INTENSITY);
+}
+
 double BeamItem::wavelength() const
 {
     return item<BeamWavelengthItem>(P_WAVELENGTH)->wavelength();
@@ -73,11 +78,21 @@ void BeamItem::setWavelength(double value)
     item<BeamWavelengthItem>(P_WAVELENGTH)->resetToValue(value);
 }
 
+BeamWavelengthItem* BeamItem::wavelengthItem() const
+{
+    return item<BeamWavelengthItem>(P_WAVELENGTH);
+}
+
 void BeamItem::setInclinationAngle(double value)
 {
     item<BeamDistributionItem>(P_INCLINATION_ANGLE)->resetToValue(value);
 }
 
+BeamDistributionItem* BeamItem::inclinationAngleItem() const
+{
+    return item<BeamDistributionItem>(P_INCLINATION_ANGLE);
+}
+
 double BeamItem::getAzimuthalAngle() const
 {
     return item<BeamAzimuthalAngleItem>(P_AZIMUTHAL_ANGLE)->azimuthalAngle();
@@ -88,6 +103,16 @@ void BeamItem::setAzimuthalAngle(double value)
     item<BeamDistributionItem>(P_AZIMUTHAL_ANGLE)->resetToValue(value);
 }
 
+BeamAzimuthalAngleItem* BeamItem::azimuthalAngleItem() const
+{
+    return item<BeamAzimuthalAngleItem>(P_AZIMUTHAL_ANGLE);
+}
+
+VectorItem* BeamItem::polarizationItem() const
+{
+    return item<VectorItem>(P_POLARIZATION);
+}
+
 std::unique_ptr<Beam> BeamItem::createBeam() const
 {
     double lambda = wavelength();
@@ -97,31 +122,49 @@ std::unique_ptr<Beam> BeamItem::createBeam() const
     auto result =
         std::make_unique<Beam>(intensity(), lambda, Direction(inclination_angle, azimuthal_angle));
 
-    result->setPolarization(item<VectorItem>(P_POLARIZATION)->getVector());
+    result->setPolarization(polarizationItem()->getVector());
 
     return result;
 }
 
+template<typename T> void BeamItem::initWavelength()
+{
+    static_assert(std::is_base_of<BeamWavelengthItem,T>::value,
+                  "Class must be derived from BeamWavelengthItem");
+
+    addProperty<T>(P_WAVELENGTH);
+}
+
+template<typename T> void BeamItem::initInclinationAngle()
+{
+    static_assert(std::is_base_of<BeamDistributionItem,T>::value,
+                  "Class must be derived from BeamDistributionItem");
+
+    addProperty<T>(P_INCLINATION_ANGLE);
+}
+
 // Specular beam item
 /* ------------------------------------------------------------------------- */
 
 const QString SpecularBeamItem::P_FOOPTPRINT = "Footprint";
 
+const QString SpecularBeamItem::M_TYPE = "SpecularBeam";
+
 const QString footprint_group_label("Type");
 
-SpecularBeamItem::SpecularBeamItem() : BeamItem("SpecularBeam")
+SpecularBeamItem::SpecularBeamItem() : BeamItem(M_TYPE)
 {
-    addProperty<SpecularBeamInclinationItem>(P_INCLINATION_ANGLE);
-    addProperty<SpecularBeamWavelengthItem>(P_WAVELENGTH);
+    initInclinationAngle<SpecularBeamInclinationItem>();
+    initWavelength<SpecularBeamWavelengthItem>();
 
-    getItem(P_AZIMUTHAL_ANGLE)->setVisible(false);
-    getItem(P_POLARIZATION)->setVisible(false);
+    azimuthalAngleItem()->setVisible(false);
+    polarizationItem()->setVisible(false);
 
     auto item = addGroupProperty(P_FOOPTPRINT, "Footprint group");
     item->setDisplayName(footprint_group_label);
     item->setToolTip("Footprint type");
 
-    getItem(P_WAVELENGTH)
+    wavelengthItem()
         ->mapper()
         ->setOnChildPropertyChange(
             [this](SessionItem*, QString property) {
@@ -152,7 +195,7 @@ void SpecularBeamItem::setInclinationAngle(double value)
 GroupItem* SpecularBeamItem::inclinationAxisGroup()
 {
     return dynamic_cast<GroupItem*>(
-        getItem(P_INCLINATION_ANGLE)->getItem(SpecularBeamInclinationItem::P_ALPHA_AXIS));
+        inclinationAngleItem()->getItem(SpecularBeamInclinationItem::P_ALPHA_AXIS));
 }
 
 BasicAxisItem* SpecularBeamItem::currentInclinationAxisItem()
@@ -165,9 +208,28 @@ FootprintItem* SpecularBeamItem::currentFootprintItem() const
     return &groupItem<FootprintItem>(P_FOOPTPRINT);
 }
 
+
+void SpecularBeamItem::setGaussianFootprint(double value)
+{
+    setGroupProperty(P_FOOPTPRINT, "GaussianFootrpint")
+        ->setItemValue(FootprintGaussianItem::P_VALUE, value);
+}
+
+void SpecularBeamItem::setSquareFootprint(double value)
+{
+    setGroupProperty(P_FOOPTPRINT, "SquareFootprint")
+        ->setItemValue(FootprintSquareItem::P_VALUE, value);
+}
+
+SessionItem* SpecularBeamItem::footprintGroupItem() const
+{
+    return getItem(P_FOOPTPRINT);
+}
+
 void SpecularBeamItem::updateFileName(const QString& filename)
 {
-    item<SpecularBeamInclinationItem>(BeamItem::P_INCLINATION_ANGLE)->updateFileName(filename);
+    dynamic_cast<SpecularBeamInclinationItem*>(inclinationAngleItem())
+        ->updateFileName(filename);
 }
 
 void SpecularBeamItem::updateToData(const IAxis& axis, QString units)
@@ -189,7 +251,7 @@ void SpecularBeamItem::updateToData(const IAxis& axis, QString units)
 void SpecularBeamItem::updateWavelength()
 {
     auto item = inclinationAxisGroup()->currentItem();
-    auto wl_item = static_cast<SpecularBeamWavelengthItem*>(getItem(P_WAVELENGTH));
+    auto wl_item = static_cast<SpecularBeamWavelengthItem*>(wavelengthItem());
     if (auto axis_item = dynamic_cast<PointwiseAxisItem*>(item)) {
         auto axis = axis_item->axis();
         if (axis && axis_item->getUnitsLabel() == "q-space")
@@ -201,17 +263,20 @@ void SpecularBeamItem::updateWavelength()
 // GISAS beam item
 /* ------------------------------------------------------------------------- */
 
-GISASBeamItem::GISASBeamItem() : BeamItem("GISASBeam")
+const QString GISASBeamItem::M_TYPE = "GISASBeam";
+
+GISASBeamItem::GISASBeamItem() : BeamItem(M_TYPE)
 {
-    addProperty<BeamInclinationAngleItem>(P_INCLINATION_ANGLE);
-    addProperty<BeamWavelengthItem>(P_WAVELENGTH);
+    initInclinationAngle<BeamInclinationAngleItem>();
+    initWavelength<BeamWavelengthItem>();
 }
 
 GISASBeamItem::~GISASBeamItem() = default;
 
 double GISASBeamItem::getInclinationAngle() const
 {
-    return item<BeamInclinationAngleItem>(P_INCLINATION_ANGLE)->inclinationAngle();
+    return dynamic_cast<BeamInclinationAngleItem*>(inclinationAngleItem())
+        ->inclinationAngle();
 }
 
 namespace {
diff --git a/GUI/coregui/Models/BeamItems.h b/GUI/coregui/Models/BeamItems.h
index 53258894aa9c85dd5cac2a53c2c549a373632054..4f61302a4ab9d10e9ccb68b70d68e02cee1a08c4 100644
--- a/GUI/coregui/Models/BeamItems.h
+++ b/GUI/coregui/Models/BeamItems.h
@@ -19,52 +19,76 @@
 
 class BasicAxisItem;
 class Beam;
+class BeamAzimuthalAngleItem;
+class BeamDistributionItem;
+class BeamWavelengthItem;
 class FootprintItem;
 class GroupItem;
 class IAxis;
+class VectorItem;
 
 class BA_CORE_API_ BeamItem : public SessionItem {
-public:
+private:
     static const QString P_INTENSITY;
     static const QString P_WAVELENGTH;
     static const QString P_INCLINATION_ANGLE;
     static const QString P_AZIMUTHAL_ANGLE;
     static const QString P_POLARIZATION;
 
+public:
     ~BeamItem() override;
 
     double intensity() const;
     void setIntensity(double value);
+    SessionItem* intensityItem() const;
 
     double wavelength() const;
     void setWavelength(double value);
-
+    BeamWavelengthItem* wavelengthItem() const;
+    
     virtual double getInclinationAngle() const = 0;
     virtual void setInclinationAngle(double value);
-
+    BeamDistributionItem* inclinationAngleItem() const;
+    
     double getAzimuthalAngle() const;
     void setAzimuthalAngle(double value);
+    BeamAzimuthalAngleItem* azimuthalAngleItem() const;
+
+    VectorItem* polarizationItem() const;
 
     std::unique_ptr<Beam> createBeam() const;
 
 protected:
     explicit BeamItem(const QString& beam_model);
+
+    template<typename T> void initWavelength();
+    template<typename T> void initInclinationAngle();
 };
 
 class BA_CORE_API_ SpecularBeamItem : public BeamItem {
+
 public:
+
+    static const QString M_TYPE;
+
+private:
     static const QString P_FOOPTPRINT;
 
+public:
+
     SpecularBeamItem();
     ~SpecularBeamItem() override;
 
     double getInclinationAngle() const override;
     void setInclinationAngle(double value) override;
-
     GroupItem* inclinationAxisGroup();
     BasicAxisItem* currentInclinationAxisItem();
+    
     FootprintItem* currentFootprintItem() const;
-
+    void setGaussianFootprint(double value);
+    void setSquareFootprint(double value);    
+    SessionItem* footprintGroupItem() const;
+   
     void updateFileName(const QString& filename);
     void updateToData(const IAxis& axis, QString units);
 
@@ -74,6 +98,9 @@ private:
 
 class BA_CORE_API_ GISASBeamItem : public BeamItem {
 public:
+
+    static const QString M_TYPE;
+
     GISASBeamItem();
     ~GISASBeamItem() override;
 
diff --git a/GUI/coregui/Models/InstrumentItems.cpp b/GUI/coregui/Models/InstrumentItems.cpp
index 3f4a84e7d48fb439ce04cbdbb8106e95e0f3076c..42ebba51ee84c1d6d97f811f816c2cc48916ce01 100644
--- a/GUI/coregui/Models/InstrumentItems.cpp
+++ b/GUI/coregui/Models/InstrumentItems.cpp
@@ -309,7 +309,7 @@ OffSpecularInstrumentItem::OffSpecularInstrumentItem() : Instrument2DItem("OffSp
     auto inclination_item = getItem(P_ALPHA_AXIS)->getItem(BasicAxisItem::P_MIN_DEG);
     auto beam_item = beamItem();
     beam_item->setInclinationAngle(inclination_item->value().toDouble());
-    beam_item->getItem(BeamItem::P_INCLINATION_ANGLE)->setEnabled(false);
+    beam_item->inclinationAngleItem()->setEnabled(false);
     inclination_item->mapper()->setOnValueChange([beam_item, inclination_item]() {
         beam_item->setInclinationAngle(inclination_item->value().toDouble());
     });
@@ -422,12 +422,12 @@ std::unique_ptr<DepthProbeSimulation> DepthProbeInstrumentItem::createSimulation
     simulation->setZSpan(depthAxis->size(), depthAxis->lowerBound(), depthAxis->upperBound());
 
     TransformToDomain::setBeamDistribution(
-        ParameterDistribution::BeamWavelength,
-        *beamItem()->item<BeamWavelengthItem>(SpecularBeamItem::P_WAVELENGTH), *simulation.get());
+        ParameterDistribution::BeamWavelength, *beamItem()->wavelengthItem(),
+        *simulation.get());
 
     TransformToDomain::setBeamDistribution(
         ParameterDistribution::BeamInclinationAngle,
-        *beamItem()->item<SpecularBeamInclinationItem>(SpecularBeamItem::P_INCLINATION_ANGLE),
+        *beamItem()->inclinationAngleItem(),
         *simulation.get());
 
     return simulation;
diff --git a/GUI/coregui/Models/InstrumentModel.cpp b/GUI/coregui/Models/InstrumentModel.cpp
index 34368ff1f2dd7bee95d42a8fb7bfd78c6603421c..1dee3986b18ff3b15bc082b63009bceef2e41364 100644
--- a/GUI/coregui/Models/InstrumentModel.cpp
+++ b/GUI/coregui/Models/InstrumentModel.cpp
@@ -40,7 +40,7 @@ QVector<SessionItem*> InstrumentModel::nonXMLItems() const
 
     for (auto instrument_item : topItems<SpecularInstrumentItem>()) {
         auto axis_group = instrument_item->beamItem()
-                              ->getItem(BeamItem::P_INCLINATION_ANGLE)
+                              ->inclinationAngleItem()
                               ->getItem(SpecularBeamInclinationItem::P_ALPHA_AXIS);
 
         if (auto pointwise_axis = axis_group->getChildOfType("PointwiseAxis"))
diff --git a/GUI/coregui/Models/ItemCatalog.cpp b/GUI/coregui/Models/ItemCatalog.cpp
index 1f585bd88bf2803e5042cf9b725bfe93f566f47d..ac53408bc967257a12fc302c1cdd7e2886ba06c3 100644
--- a/GUI/coregui/Models/ItemCatalog.cpp
+++ b/GUI/coregui/Models/ItemCatalog.cpp
@@ -80,8 +80,8 @@ ItemCatalog::ItemCatalog()
     add("GISASInstrument", create_new<GISASInstrumentItem>);
     add("OffSpecularInstrument", create_new<OffSpecularInstrumentItem>);
     add("SpecularInstrument", create_new<SpecularInstrumentItem>);
-    add("GISASBeam", create_new<GISASBeamItem>);
-    add("SpecularBeam", create_new<SpecularBeamItem>);
+    add(GISASBeamItem::M_TYPE, create_new<GISASBeamItem>);
+    add(SpecularBeamItem::M_TYPE, create_new<SpecularBeamItem>);
     add("NoBackground", create_new<BackgroundNoneItem>);
     add("ConstantBackground", create_new<ConstantBackgroundItem>);
     add("PoissonNoiseBackground", create_new<PoissonNoiseBackgroundItem>);
diff --git a/GUI/coregui/Models/TransformFromDomain.cpp b/GUI/coregui/Models/TransformFromDomain.cpp
index 522efdfd71a215836eabf0491cc622a5aa49082d..2c2b8db6d1e3ee0e2d91104310e5d8b85e95bcfc 100644
--- a/GUI/coregui/Models/TransformFromDomain.cpp
+++ b/GUI/coregui/Models/TransformFromDomain.cpp
@@ -35,6 +35,7 @@
 #include "GUI/coregui/Models/AxesItems.h"
 #include "GUI/coregui/Models/BackgroundItems.h"
 #include "GUI/coregui/Models/BeamAngleItems.h"
+#include "GUI/coregui/Models/BeamWavelengthItem.h"
 #include "GUI/coregui/Models/FTDecayFunctionItems.h"
 #include "GUI/coregui/Models/FTDistributionItems.h"
 #include "GUI/coregui/Models/FootprintItems.h"
@@ -74,9 +75,9 @@ void setDistribution(SessionItem* item, ParameterDistribution par_distr, QString
                      double factor = 1.0);
 
 void addDistributionToBeamItem(ParameterDistribution::WhichParameter which,
-                               const QString& item_name, const ParameterDistribution& distribution,
-                               const BeamItem* beam_item);
-
+                               BeamDistributionItem* item,
+                               const ParameterDistribution& distribution);
+    
 void addRangedDistributionToItem(SessionItem* item, const IRangedDistribution& ranged, double mean,
                                  double std_dev);
 } // namespace
@@ -222,16 +223,18 @@ void TransformFromDomain::setGISASBeamItem(BeamItem* beam_item, const GISASSimul
     const std::vector<ParameterDistribution> distributions =
         simulation.getDistributionHandler().getDistributions();
     for (size_t i = 0; i < distributions.size(); ++i) {
-        addDistributionToBeamItem(ParameterDistribution::BeamWavelength, BeamItem::P_WAVELENGTH,
-                                  distributions[i], beam_item);
+        addDistributionToBeamItem(ParameterDistribution::BeamWavelength,
+                                  beam_item->wavelengthItem(), distributions[i]);
         addDistributionToBeamItem(ParameterDistribution::BeamInclinationAngle,
-                                  BeamItem::P_INCLINATION_ANGLE, distributions[i], beam_item);
+                                  beam_item->inclinationAngleItem(),
+                                  distributions[i]);
         addDistributionToBeamItem(ParameterDistribution::BeamAzimuthalAngle,
-                                  BeamItem::P_AZIMUTHAL_ANGLE, distributions[i], beam_item);
+                                  beam_item->azimuthalAngleItem(),
+                                  distributions[i]);
     }
 
     // polarization parameters
-    beam_item->item<VectorItem>(BeamItem::P_POLARIZATION)->setVector(beam.getBlochVector());
+    beam_item->polarizationItem()->setVector(beam.getBlochVector());
 }
 
 void TransformFromDomain::setOffSpecularBeamItem(BeamItem* beam_item,
@@ -269,14 +272,14 @@ void TransformFromDomain::setSpecularBeamItem(SpecularBeamItem* beam_item,
     if (!resolution->empty()) {
         double mean = scan->wavelength();
         double std_dev = resolution->stdDevs(mean, 1).front();
-        addRangedDistributionToItem(beam_item->getItem(SpecularBeamItem::P_WAVELENGTH),
+        addRangedDistributionToItem(beam_item->wavelengthItem(),
                                     *resolution->distribution(), mean, std_dev);
     }
 
     resolution = scan->angleResolution();
     if (resolution && !resolution->empty()) {
         double std_dev = resolution->stdDevs(0.0, 1).front();
-        addRangedDistributionToItem(beam_item->getItem(SpecularBeamItem::P_INCLINATION_ANGLE),
+        addRangedDistributionToItem(beam_item->inclinationAngleItem(),
                                     *resolution->distribution(), 0.0, std_dev);
     }
 }
@@ -573,15 +576,9 @@ void TransformFromDomain::setFootprintFactor(const IFootprintFactor* footprint,
     if (!footprint)
         return;
     if (const auto gaussian_fp = dynamic_cast<const FootprintGauss*>(footprint)) {
-        auto gaussian_fp_item =
-            beam_item->setGroupProperty(SpecularBeamItem::P_FOOPTPRINT, "GaussianFootrpint");
-        const double value = gaussian_fp->widthRatio();
-        gaussian_fp_item->setItemValue(FootprintGaussianItem::P_VALUE, value);
+        beam_item->setGaussianFootprint(gaussian_fp->widthRatio());
     } else if (const auto square_fp = dynamic_cast<const FootprintSquare*>(footprint)) {
-        auto square_fp_item =
-            beam_item->setGroupProperty(SpecularBeamItem::P_FOOPTPRINT, "SquareFootprint");
-        const double value = square_fp->widthRatio();
-        square_fp_item->setItemValue(FootprintSquareItem::P_VALUE, value);
+        beam_item->setSquareFootprint(square_fp->widthRatio());
     }
 }
 
@@ -808,14 +805,13 @@ void setDistribution(SessionItem* part_distr_item, ParameterDistribution par_dis
 }
 
 void addDistributionToBeamItem(ParameterDistribution::WhichParameter which,
-                               const QString& item_name, const ParameterDistribution& distribution,
-                               const BeamItem* beam_item)
+                               BeamDistributionItem* item,
+                               const ParameterDistribution& distribution)
 {
     if (distribution.whichParameter() != which)
         return;
 
-    const auto beam_parameter = dynamic_cast<BeamDistributionItem*>(beam_item->getItem(item_name));
-    TransformFromDomain::setItemFromSample(beam_parameter, distribution);
+    TransformFromDomain::setItemFromSample(item, distribution);
 }
 
 void addRangedDistributionToItem(SessionItem* item, const IRangedDistribution& ranged, double mean,
diff --git a/GUI/coregui/Models/TransformToDomain.cpp b/GUI/coregui/Models/TransformToDomain.cpp
index 25b6f2bd5d614b35634dc4fd7472ec05b0fe2e0a..de031b17b16c8a92847b78b9f315653ce25af4a6 100644
--- a/GUI/coregui/Models/TransformToDomain.cpp
+++ b/GUI/coregui/Models/TransformToDomain.cpp
@@ -134,37 +134,37 @@ std::unique_ptr<IParticle> TransformToDomain::createIParticle(const SessionItem&
 }
 
 //! adds DistributionParameters to the ISimulation
-void TransformToDomain::addDistributionParametersToSimulation(const SessionItem& beam_item,
+void TransformToDomain::addDistributionParametersToSimulation(const BeamItem& beam_item,
                                                               GISASSimulation& simulation)
 {
-    if (beam_item.modelType() != "GISASBeam") {
-        ASSERT(beam_item.modelType() == "GISASBeam");
+    if (beam_item.modelType() != GISASBeamItem::M_TYPE) {
+        ASSERT(beam_item.modelType() == GISASBeamItem::M_TYPE);
         return;
     }
 
     setParameterDistributionToSimulation<BeamWavelengthItem>(
-        ParameterDistribution::BeamWavelength, beam_item.getItem(BeamItem::P_WAVELENGTH),
+        ParameterDistribution::BeamWavelength, beam_item.wavelengthItem(),
         simulation);
     setParameterDistributionToSimulation<BeamInclinationAngleItem>(
         ParameterDistribution::BeamInclinationAngle,
-        beam_item.getItem(BeamItem::P_INCLINATION_ANGLE), simulation);
+        beam_item.inclinationAngleItem(), simulation);
     setParameterDistributionToSimulation<BeamAzimuthalAngleItem>(
-        ParameterDistribution::BeamAzimuthalAngle, beam_item.getItem(BeamItem::P_AZIMUTHAL_ANGLE),
-        simulation);
+        ParameterDistribution::BeamAzimuthalAngle,
+        beam_item.azimuthalAngleItem(), simulation);
 }
 
-void TransformToDomain::addBeamDivergencesToScan(const SessionItem& beam_item,
+void TransformToDomain::addBeamDivergencesToScan(const BeamItem& beam_item,
                                                  AngularSpecScan& scan)
 {
-    if (beam_item.modelType() != "SpecularBeam") {
-        ASSERT(beam_item.modelType() == "SpecularBeam");
+    if (beam_item.modelType() != SpecularBeamItem::M_TYPE) {
+        ASSERT(beam_item.modelType() == SpecularBeamItem::M_TYPE);
         return;
     }
 
-    auto resolution = createScanResolution(beam_item.getItem(SpecularBeamItem::P_WAVELENGTH));
+    auto resolution = createScanResolution(beam_item.wavelengthItem());
     if (resolution)
         scan.setWavelengthResolution(*resolution);
-    resolution = createScanResolution(beam_item.getItem(SpecularBeamItem::P_INCLINATION_ANGLE));
+    resolution = createScanResolution(beam_item.inclinationAngleItem());
     if (resolution)
         scan.setAngleResolution(*resolution);
 }
diff --git a/GUI/coregui/Models/TransformToDomain.h b/GUI/coregui/Models/TransformToDomain.h
index a741641f388e61cd3e7b58c0b1761d562c5cee93..3c6c84dca7b14f0342d1fb2bbad0a05b247c81f1 100644
--- a/GUI/coregui/Models/TransformToDomain.h
+++ b/GUI/coregui/Models/TransformToDomain.h
@@ -28,6 +28,7 @@
 
 class AngularSpecScan;
 class BeamDistributionItem;
+class BeamItem;
 class GISASSimulation;
 class Material;
 class MaterialItemContainer;
@@ -42,9 +43,9 @@ std::unique_ptr<LayerRoughness> createLayerRoughness(const SessionItem& item);
 std::unique_ptr<MultiLayer> createMultiLayer(const SessionItem& item);
 std::unique_ptr<ParticleLayout> createParticleLayout(const SessionItem& item);
 
-void addDistributionParametersToSimulation(const SessionItem& beam_item,
+void addDistributionParametersToSimulation(const BeamItem& beam_item,
                                            GISASSimulation& simulation);
-void addBeamDivergencesToScan(const SessionItem& beam_item, AngularSpecScan& simulation);
+void addBeamDivergencesToScan(const BeamItem& beam_item, AngularSpecScan& simulation);
 
 void setBeamDistribution(ParameterDistribution::WhichParameter which,
                          const BeamDistributionItem& item, ISimulation& simulation);
diff --git a/GUI/coregui/Views/InstrumentWidgets/DepthProbeInstrumentEditor.cpp b/GUI/coregui/Views/InstrumentWidgets/DepthProbeInstrumentEditor.cpp
index acde70ca74633194322de8410bd221760ec33e13..30fccb4ee8ebfa7c1aaf2602e791146c6695334a 100644
--- a/GUI/coregui/Views/InstrumentWidgets/DepthProbeInstrumentEditor.cpp
+++ b/GUI/coregui/Views/InstrumentWidgets/DepthProbeInstrumentEditor.cpp
@@ -13,6 +13,7 @@
 //  ************************************************************************************************
 
 #include "GUI/coregui/Views/InstrumentWidgets/DepthProbeInstrumentEditor.h"
+#include "GUI/coregui/Models/BeamWavelengthItem.h"
 #include "GUI/coregui/Models/InstrumentItems.h"
 #include "GUI/coregui/Models/SpecularBeamInclinationItem.h"
 #include "GUI/coregui/Views/InfoWidgets/DistributionDialog.h"
@@ -52,12 +53,12 @@ DepthProbeInstrumentEditor::DepthProbeInstrumentEditor(QWidget* parent)
 
 void DepthProbeInstrumentEditor::subscribeToItem()
 {
-    const auto beam_item = instrumentItem()->getItem(DepthProbeInstrumentItem::P_BEAM);
+    const SpecularBeamItem* beam_item = instrumentItem()->beamItem();
 
-    auto wavelengthItem = beam_item->getItem(SpecularBeamItem::P_WAVELENGTH);
+    BeamWavelengthItem* wavelengthItem = beam_item->wavelengthItem();
     m_wavelengthEditor->setItem(wavelengthItem->getItem(BeamDistributionItem::P_DISTRIBUTION));
 
-    auto inclinationItem = beam_item->getItem(SpecularBeamItem::P_INCLINATION_ANGLE);
+    auto inclinationItem = beam_item->inclinationAngleItem();
     m_inclinationEditor->setItem(
         inclinationItem->getItem(SpecularBeamInclinationItem::P_DISTRIBUTION));
     m_inclinationEditor->addItem(
diff --git a/GUI/coregui/Views/InstrumentWidgets/GISASBeamEditor.cpp b/GUI/coregui/Views/InstrumentWidgets/GISASBeamEditor.cpp
index af43e919b15236a35f13648ecc32c94eb843365e..70fa36ad97a3204e54feb57a957ad0b6cc40d300 100644
--- a/GUI/coregui/Views/InstrumentWidgets/GISASBeamEditor.cpp
+++ b/GUI/coregui/Views/InstrumentWidgets/GISASBeamEditor.cpp
@@ -13,7 +13,9 @@
 //  ************************************************************************************************
 
 #include "GUI/coregui/Views/InstrumentWidgets/GISASBeamEditor.h"
+#include "GUI/coregui/Models/BeamAngleItems.h"
 #include "GUI/coregui/Models/BeamDistributionItem.h"
+#include "GUI/coregui/Models/BeamWavelengthItem.h"
 #include "GUI/coregui/Models/InstrumentItems.h"
 #include "GUI/coregui/Views/CommonWidgets/ColumnResizer.h"
 #include "GUI/coregui/Views/InfoWidgets/DistributionDialog.h"
@@ -61,15 +63,15 @@ GISASBeamEditor::GISASBeamEditor(ColumnResizer* columnResizer, QWidget* parent)
 
 void GISASBeamEditor::subscribeToItem()
 {
-    m_intensityEditor->setItem(beamItem()->getItem(BeamItem::P_INTENSITY));
+    m_intensityEditor->setItem(beamItem()->intensityItem());
 
-    auto wavelengthItem = beamItem()->getItem(BeamItem::P_WAVELENGTH);
+    auto wavelengthItem = beamItem()->wavelengthItem();
     m_wavelengthEditor->setItem(wavelengthItem->getItem(BeamDistributionItem::P_DISTRIBUTION));
 
-    auto inclinationItem = beamItem()->getItem(BeamItem::P_INCLINATION_ANGLE);
+    auto inclinationItem = beamItem()->inclinationAngleItem();
     m_inclinationEditor->setItem(inclinationItem->getItem(BeamDistributionItem::P_DISTRIBUTION));
 
-    auto azimuthalItem = beamItem()->getItem(BeamItem::P_AZIMUTHAL_ANGLE);
+    auto azimuthalItem = beamItem()->azimuthalAngleItem();
     m_azimuthalEditor->setItem(azimuthalItem->getItem(BeamDistributionItem::P_DISTRIBUTION));
 }
 
diff --git a/GUI/coregui/Views/InstrumentWidgets/OffSpecularBeamEditor.cpp b/GUI/coregui/Views/InstrumentWidgets/OffSpecularBeamEditor.cpp
index 18852914c6a46471f3ed75700a7f59b3d401c4e3..a93cd28a0ddb554a027e482787d304da0aa0f127 100644
--- a/GUI/coregui/Views/InstrumentWidgets/OffSpecularBeamEditor.cpp
+++ b/GUI/coregui/Views/InstrumentWidgets/OffSpecularBeamEditor.cpp
@@ -13,7 +13,9 @@
 //  ************************************************************************************************
 
 #include "GUI/coregui/Views/InstrumentWidgets/OffSpecularBeamEditor.h"
+#include "GUI/coregui/Models/BeamAngleItems.h"
 #include "GUI/coregui/Models/BeamDistributionItem.h"
+#include "GUI/coregui/Models/BeamWavelengthItem.h"
 #include "GUI/coregui/Models/InstrumentItems.h"
 #include "GUI/coregui/Views/CommonWidgets/ColumnResizer.h"
 #include "GUI/coregui/Views/InfoWidgets/DistributionDialog.h"
@@ -61,15 +63,15 @@ OffSpecularBeamEditor::OffSpecularBeamEditor(ColumnResizer* columnResizer, QWidg
 
 void OffSpecularBeamEditor::subscribeToItem()
 {
-    m_intensityEditor->setItem(beamItem()->getItem(BeamItem::P_INTENSITY));
+    m_intensityEditor->setItem(beamItem()->intensityItem());
 
-    auto wavelengthItem = beamItem()->getItem(BeamItem::P_WAVELENGTH);
+    auto wavelengthItem = beamItem()->wavelengthItem();
     m_wavelengthEditor->setItem(wavelengthItem->getItem(BeamDistributionItem::P_DISTRIBUTION));
 
     auto inclinationItem = instrumentItem()->getItem(OffSpecularInstrumentItem::P_ALPHA_AXIS);
     m_inclinationEditor->setItem(inclinationItem);
 
-    auto azimuthalItem = beamItem()->getItem(BeamItem::P_AZIMUTHAL_ANGLE);
+    auto azimuthalItem = beamItem()->azimuthalAngleItem();
     m_azimuthalEditor->setItem(azimuthalItem->getItem(BeamDistributionItem::P_DISTRIBUTION));
 }
 
diff --git a/GUI/coregui/Views/InstrumentWidgets/PolarizationAnalysisEditor.cpp b/GUI/coregui/Views/InstrumentWidgets/PolarizationAnalysisEditor.cpp
index 4bf977cea5bc82fb8b4f97eb2a65a313f13df545..59f82fcd8abc50cb278e568e403e11b924a15ac5 100644
--- a/GUI/coregui/Views/InstrumentWidgets/PolarizationAnalysisEditor.cpp
+++ b/GUI/coregui/Views/InstrumentWidgets/PolarizationAnalysisEditor.cpp
@@ -15,6 +15,7 @@
 #include "GUI/coregui/Views/InstrumentWidgets/PolarizationAnalysisEditor.h"
 #include "GUI/coregui/Models/DetectorItems.h"
 #include "GUI/coregui/Models/InstrumentItems.h"
+#include "GUI/coregui/Models/VectorItem.h"
 #include "GUI/coregui/Views/CommonWidgets/ColumnResizer.h"
 #include "GUI/coregui/Views/PropertyEditor/ComponentEditor.h"
 #include "GUI/coregui/utils/LayoutUtils.h"
@@ -54,7 +55,7 @@ PolarizationAnalysisEditor::PolarizationAnalysisEditor(ColumnResizer* columnResi
 
 void PolarizationAnalysisEditor::subscribeToItem()
 {
-    m_polarizationEditor->setItem(beamItem()->getItem(BeamItem::P_POLARIZATION));
+    m_polarizationEditor->setItem(beamItem()->polarizationItem());
 
     currentItem()->mapper()->setOnPropertyChange(
         [this](const QString& name) {
diff --git a/GUI/coregui/Views/InstrumentWidgets/SpecularBeamEditor.cpp b/GUI/coregui/Views/InstrumentWidgets/SpecularBeamEditor.cpp
index 830f7c0929038f11465fe6cc4b62e1876b529f6c..6f92700505a0a276c11831bda10ea02d4ea94d59 100644
--- a/GUI/coregui/Views/InstrumentWidgets/SpecularBeamEditor.cpp
+++ b/GUI/coregui/Views/InstrumentWidgets/SpecularBeamEditor.cpp
@@ -13,6 +13,7 @@
 //  ************************************************************************************************
 
 #include "GUI/coregui/Views/InstrumentWidgets/SpecularBeamEditor.h"
+#include "GUI/coregui/Models/BeamWavelengthItem.h"
 #include "GUI/coregui/Models/InstrumentItems.h"
 #include "GUI/coregui/Models/SpecularBeamInclinationItem.h"
 #include "GUI/coregui/Views/CommonWidgets/ColumnResizer.h"
@@ -64,18 +65,18 @@ void SpecularBeamEditor::subscribeToItem()
     const auto beam_item = instrumentItem()->beamItem();
     ASSERT(beam_item);
 
-    m_intensityEditor->setItem(beam_item->getItem(SpecularBeamItem::P_INTENSITY));
+    m_intensityEditor->setItem(beam_item->intensityItem());
 
-    auto wavelengthItem = beam_item->getItem(SpecularBeamItem::P_WAVELENGTH);
+    auto wavelengthItem = beam_item->wavelengthItem();
     m_wavelengthEditor->setItem(wavelengthItem->getItem(BeamDistributionItem::P_DISTRIBUTION));
 
-    auto inclinationItem = beam_item->getItem(SpecularBeamItem::P_INCLINATION_ANGLE);
+    auto inclinationItem = beam_item->inclinationAngleItem();
     m_inclinationEditor->setItem(
         inclinationItem->getItem(SpecularBeamInclinationItem::P_DISTRIBUTION));
     m_inclinationEditor->addItem(
         inclinationItem->getItem(SpecularBeamInclinationItem::P_ALPHA_AXIS));
 
-    m_footprint_editor->setItem(beam_item->getItem(SpecularBeamItem::P_FOOPTPRINT));
+    m_footprint_editor->setItem(beam_item->footprintGroupItem());
 }
 
 void SpecularBeamEditor::unsubscribeFromItem()
diff --git a/Tests/UnitTests/GUI/TestSavingSpecularData.cpp b/Tests/UnitTests/GUI/TestSavingSpecularData.cpp
index 8fd851afd25c1c0fd4225a6a9418d170d6eb32d9..2149002e811eb38acd05ded7cf9a28da340e8bae 100644
--- a/Tests/UnitTests/GUI/TestSavingSpecularData.cpp
+++ b/Tests/UnitTests/GUI/TestSavingSpecularData.cpp
@@ -51,8 +51,8 @@ PointwiseAxisItem* TestSavingSpecularData::createPointwiseAxisItem(SessionModel&
 
 GroupItem* TestSavingSpecularData::getAxisGroup(SpecularInstrumentItem* instrument)
 {
-    auto axis_item = instrument->getItem(SpecularInstrumentItem::P_BEAM)
-                         ->getItem(BeamItem::P_INCLINATION_ANGLE)
+    auto axis_item = instrument->beamItem()
+                         ->inclinationAngleItem()
                          ->getItem(SpecularBeamInclinationItem::P_ALPHA_AXIS);
     return dynamic_cast<GroupItem*>(axis_item);
 }