diff --git a/GUI/Model/Descriptor/SelectionProperty.h b/GUI/Model/Descriptor/SelectionProperty.h
index 5aefb8d1878fe1bac95f929da48c2a302addd424..bea0031f40e231a5365d91c01e7989b32e46c86b 100644
--- a/GUI/Model/Descriptor/SelectionProperty.h
+++ b/GUI/Model/Descriptor/SelectionProperty.h
@@ -137,9 +137,6 @@ public:
     //! Direct access to the stored pointer
     CatalogedType* operator->() const { return m_p.get(); }
 
-    //! Direct access to the stored pointer
-    CatalogedType* get() const { return m_p.get(); }
-
     //! Directly set the new item.
     void set(CatalogedType* t, bool callInitializer = false)
     {
@@ -171,6 +168,14 @@ public:
         }
     }
 
+    QString label() const {return m_label;}
+    QString tooltip() const {return m_tooltip;}
+    QStringList options() const {return m_options;}
+    CatalogedType* currentItem() const {return m_p.get();}
+
+    void setCurrentIndex(int newIndex) override { currentIndexSetter(newIndex); }
+    int currentIndex() const override { return m_types.indexOf(Catalog::type(m_p.get())); }
+
 private:
     template <typename... ArgsForCreation>
     void initFieldsAndSetter(const QString& label, const QString& tooltip, ArgsForCreation... argsForCreation) {
@@ -211,14 +216,6 @@ private:
         m_descriptor.currentItem = [=] { return m_p.get(); };
     }
 
-    QString label() {return m_label;}
-    QString tooltip() {return m_tooltip;}
-    QStringList options() {return m_options;}
-    CatalogedType* currentItem() {return m_p.get();}
-
-    void setCurrentIndex(int newIndex) override { currentIndexSetter(newIndex); }
-    int currentIndex() const override { return m_types.indexOf(Catalog::type(m_p.get())); }
-
 private:
     SelectionDescriptor<CatalogedType*>
         m_descriptor; //!< descriptor, holding attributes like label, tooltip
diff --git a/GUI/Model/Device/BeamDistributionItem.cpp b/GUI/Model/Device/BeamDistributionItem.cpp
index 61bc6342e68c084ea72bdfa6fdeb2aabcac7f7c0..5b12f22e2a4f77dba58a288a91fcfb86736873f7 100644
--- a/GUI/Model/Device/BeamDistributionItem.cpp
+++ b/GUI/Model/Device/BeamDistributionItem.cpp
@@ -56,7 +56,7 @@ double BeamDistributionItem::scaleFactor() const
 
 DistributionItem* BeamDistributionItem::distribution() const
 {
-    return m_distribution.get();
+    return m_distribution.currentItem();
 }
 
 SelectionDescriptor<DistributionItem*> BeamDistributionItem::distributionSelection() const
diff --git a/GUI/Model/Device/BeamDistributionItem.h b/GUI/Model/Device/BeamDistributionItem.h
index ccba2f001390ca2b4bad5e6fbdb49a53bb819131..d190a7b6e6e4b890629220a293574a7e4dd7a153 100644
--- a/GUI/Model/Device/BeamDistributionItem.h
+++ b/GUI/Model/Device/BeamDistributionItem.h
@@ -53,7 +53,7 @@ template <typename T>
 T* BeamDistributionItem::setDistributionType()
 {
     m_distribution.set<T>();
-    return dynamic_cast<T*>(m_distribution.get());
+    return dynamic_cast<T*>(m_distribution.currentItem());
 }
 
 #endif // BORNAGAIN_GUI_MODEL_DEVICE_BEAMDISTRIBUTIONITEM_H
diff --git a/GUI/Model/Device/BeamItems.cpp b/GUI/Model/Device/BeamItems.cpp
index 5071c4df50f6a90101af31f662711558ce54ce6d..a61ea8da9a745e3d5185f106e5430181f822a9d5 100644
--- a/GUI/Model/Device/BeamItems.cpp
+++ b/GUI/Model/Device/BeamItems.cpp
@@ -170,7 +170,7 @@ BasicAxisItem* SpecularBeamItem::inclinationAxis() const
 
 FootprintItem* SpecularBeamItem::footprint() const
 {
-    return m_footprint.get();
+    return m_footprint.currentItem();
 }
 
 SelectionDescriptor<FootprintItem*> SpecularBeamItem::footprintSelection() const
diff --git a/GUI/Model/Device/DetectorItems.cpp b/GUI/Model/Device/DetectorItems.cpp
index da7f88f39ed3dd7ab6bbaa550fc8868d7c99d60b..44117ae215b65caf5ea653724ccfbfc598f7eb03 100644
--- a/GUI/Model/Device/DetectorItems.cpp
+++ b/GUI/Model/Device/DetectorItems.cpp
@@ -45,7 +45,7 @@ MaskItems& DetectorItem::maskItems()
 
 ResolutionFunctionItem* DetectorItem::resolutionFunction() const
 {
-    return m_resolutionFunction.get();
+    return m_resolutionFunction.currentItem();
 }
 
 SelectionDescriptor<ResolutionFunctionItem*> DetectorItem::resolutionFunctionSelection() const
diff --git a/GUI/Model/Device/DetectorItems.h b/GUI/Model/Device/DetectorItems.h
index 7bcef7153858b8d033b49366eb4fd4345d1d9ea3..478322eddac836bb535b97fbb03a9afdf1801fb6 100644
--- a/GUI/Model/Device/DetectorItems.h
+++ b/GUI/Model/Device/DetectorItems.h
@@ -74,7 +74,7 @@ template <typename T>
 T* DetectorItem::setResolutionFunctionType()
 {
     m_resolutionFunction.set<T>();
-    return dynamic_cast<T*>(m_resolutionFunction.get());
+    return dynamic_cast<T*>(m_resolutionFunction.currentItem());
 }
 
 #endif // BORNAGAIN_GUI_MODEL_DEVICE_DETECTORITEMS_H
diff --git a/GUI/Model/Device/InstrumentItems.cpp b/GUI/Model/Device/InstrumentItems.cpp
index a8f4dd773f4807ec46fab38428b9ba752891e3be..7958aef0f20e6c1b181447418486f20e546e8d32 100644
--- a/GUI/Model/Device/InstrumentItems.cpp
+++ b/GUI/Model/Device/InstrumentItems.cpp
@@ -133,7 +133,7 @@ BeamItem* InstrumentItem::beamItem() const
 
 BackgroundItem* InstrumentItem::backgroundItem() const
 {
-    return m_backgroundItem.get();
+    return m_backgroundItem.currentItem();
 }
 
 SelectionDescriptor<BackgroundItem*> InstrumentItem::backgroundSelection() const
@@ -364,7 +364,7 @@ void Instrument2DItem::serialize(Streamer& s)
 
 DetectorItem* Instrument2DItem::detectorItem() const
 {
-    return m_detectorItem.get();
+    return m_detectorItem.currentItem();
 }
 
 SelectionDescriptor<DetectorItem*> Instrument2DItem::detectorSelection() const
diff --git a/GUI/Model/Device/InstrumentItems.h b/GUI/Model/Device/InstrumentItems.h
index 9a5b13ebb8afb033c1d5944e18cd510bff2f19ba..4110ca6e387601de1fcb6e1be467cb352da12c5f 100644
--- a/GUI/Model/Device/InstrumentItems.h
+++ b/GUI/Model/Device/InstrumentItems.h
@@ -233,14 +233,14 @@ template <typename T>
 T* InstrumentItem::setBackgroundType()
 {
     m_backgroundItem.set<T>();
-    return dynamic_cast<T*>(m_backgroundItem.get());
+    return dynamic_cast<T*>(m_backgroundItem.currentItem());
 }
 
 template <typename T>
 T* Instrument2DItem::setDetectorType()
 {
     m_detectorItem.set<T>();
-    return dynamic_cast<T*>(m_detectorItem.get());
+    return dynamic_cast<T*>(m_detectorItem.currentItem());
 }
 
 #endif // BORNAGAIN_GUI_MODEL_DEVICE_INSTRUMENTITEMS_H
diff --git a/GUI/Model/Sample/ItemWithParticles.cpp b/GUI/Model/Sample/ItemWithParticles.cpp
index c6b5478f0d98500a094d54db710df49838057a9d..ef81e55f85f0a39f25b76a10537eb107889982b4 100644
--- a/GUI/Model/Sample/ItemWithParticles.cpp
+++ b/GUI/Model/Sample/ItemWithParticles.cpp
@@ -30,7 +30,7 @@ ItemWithParticles::ItemWithParticles(const QString& abundanceTooltip,
 
 std::unique_ptr<IRotation> ItemWithParticles::createRotation() const
 {
-    if (!m_rotation.get())
+    if (!m_rotation.currentItem())
         return {};
     const auto matrix = m_rotation->rotation();
     return std::unique_ptr<IRotation>(IRotation::createRotation(matrix));
diff --git a/GUI/Model/Sample/MesocrystalItem.cpp b/GUI/Model/Sample/MesocrystalItem.cpp
index ebac4d5e0b349d08e7b52a79544dd256b39dfd6c..38c942c42e09d80020bf5ed9667373f758503289 100644
--- a/GUI/Model/Sample/MesocrystalItem.cpp
+++ b/GUI/Model/Sample/MesocrystalItem.cpp
@@ -109,16 +109,16 @@ Lattice3D MesocrystalItem::getLattice() const
 
 std::unique_ptr<IParticle> MesocrystalItem::getBasis() const
 {
-    if (auto* p = dynamic_cast<ParticleItem*>(m_basisParticle.get()))
+    if (auto* p = dynamic_cast<ParticleItem*>(m_basisParticle.currentItem()))
         return p->createParticle();
 
-    if (auto* p = dynamic_cast<CoreAndShellItem*>(m_basisParticle.get()))
+    if (auto* p = dynamic_cast<CoreAndShellItem*>(m_basisParticle.currentItem()))
         return p->createCoreAndShell();
 
-    if (auto* p = dynamic_cast<CompoundItem*>(m_basisParticle.get()))
+    if (auto* p = dynamic_cast<CompoundItem*>(m_basisParticle.currentItem()))
         return p->createCompound();
 
-    if (auto* p = dynamic_cast<MesocrystalItem*>(m_basisParticle.get()))
+    if (auto* p = dynamic_cast<MesocrystalItem*>(m_basisParticle.currentItem()))
         return p->createMesocrystal();
 
     return {};
@@ -131,7 +131,7 @@ std::unique_ptr<IFormFactor> MesocrystalItem::getOuterShape() const
 
 ItemWithParticles* MesocrystalItem::basisParticle() const
 {
-    return m_basisParticle.get();
+    return m_basisParticle.currentItem();
 }
 
 void MesocrystalItem::setBasis(ItemWithParticles* basis)
diff --git a/GUI/Model/Sample/ParticleItem.cpp b/GUI/Model/Sample/ParticleItem.cpp
index f515e3fceb7a6f34804473ad12c132b4fcde34cb..a02c9ec9219998cdda02c16764dd1ae6d35d8f6e 100644
--- a/GUI/Model/Sample/ParticleItem.cpp
+++ b/GUI/Model/Sample/ParticleItem.cpp
@@ -79,7 +79,7 @@ void ParticleItem::setFormFactor(FormFactorItem* p)
 
 FormFactorItem* ParticleItem::formfactor() const
 {
-    return m_formFactor.get();
+    return m_formFactor.currentItem();
 }
 
 QVector<ItemWithParticles*> ParticleItem::containedItemsWithParticles() const
diff --git a/GUI/Model/Sample/ParticleLayoutItem.cpp b/GUI/Model/Sample/ParticleLayoutItem.cpp
index cdb3124223d1e9e79501715db30effd8b19c86e0..54f6cccdd7dfc13560653390852185f346da3d44 100644
--- a/GUI/Model/Sample/ParticleLayoutItem.cpp
+++ b/GUI/Model/Sample/ParticleLayoutItem.cpp
@@ -48,10 +48,10 @@ double ParticleLayoutItem::totalDensityValue() const
     if (!totalDensityIsDefinedByInterference())
         return m_ownDensity.value();
 
-    ASSERT(m_interference.get());
+    ASSERT(m_interference.currentItem());
 
     if (const auto* interLatticeItem =
-            dynamic_cast<const Interference2DAbstractLatticeItem*>(m_interference.get())) {
+            dynamic_cast<const Interference2DAbstractLatticeItem*>(m_interference.currentItem())) {
         Lattice2DItem* latticeItem = interLatticeItem->latticeType().currentItem();
         try {
             const double area = latticeItem->unitCellArea();
@@ -62,7 +62,7 @@ double ParticleLayoutItem::totalDensityValue() const
         }
     }
 
-    if (const auto* hd = dynamic_cast<const InterferenceHardDiskItem*>(m_interference.get()))
+    if (const auto* hd = dynamic_cast<const InterferenceHardDiskItem*>(m_interference.currentItem()))
         return hd->density();
 
     ASSERT(false);
@@ -109,8 +109,8 @@ void ParticleLayoutItem::removeInterference()
 
 bool ParticleLayoutItem::totalDensityIsDefinedByInterference() const
 {
-    return dynamic_cast<const Interference2DAbstractLatticeItem*>(m_interference.get())
-           || dynamic_cast<const InterferenceHardDiskItem*>(m_interference.get());
+    return dynamic_cast<const Interference2DAbstractLatticeItem*>(m_interference.currentItem())
+           || dynamic_cast<const InterferenceHardDiskItem*>(m_interference.currentItem());
 }
 
 void ParticleLayoutItem::serialize(Streamer& s)