diff --git a/GUI/Model/Group/SelectionDescriptor.h b/GUI/Model/Group/SelectionDescriptor.h
index 483dba1042e4babd72a9eeebaa7717b6bebc4fba..1f81a82c7717ae047d281230a9b6c83d72aeb3a6 100644
--- a/GUI/Model/Group/SelectionDescriptor.h
+++ b/GUI/Model/Group/SelectionDescriptor.h
@@ -86,15 +86,17 @@ public:
             currentItem = [=] { return item->value().value<ComboProperty>().getValue(); };
     }
 
-    template <typename Catalog>
-    void init(const QString& _label, const QString& _tooltip, const T* itemPtr)
+    template <typename Catalog, typename... ArgsForConstructor>
+    void init(const QString& _label, const QString& _tooltip, const T* itemPtr,
+              ArgsForConstructor... argsForConstructor)
     {
-        init<Catalog>(_label, _tooltip, Catalog::types(), itemPtr);
+        init<Catalog>(_label, _tooltip, Catalog::types(), itemPtr, argsForConstructor...);
     }
 
-    template <typename Catalog>
+    template <typename Catalog, typename... ArgsForConstructor>
     void init(const QString& _label, const QString& _tooltip,
-              const QVector<typename Catalog::Type>& types, const T* itemPtr)
+              const QVector<typename Catalog::Type>& types, const T* itemPtr,
+              ArgsForConstructor... argsForConstructor)
     {
         label = _label;
         tooltip = _tooltip;
@@ -103,7 +105,7 @@ public:
 
         currentIndexSetter = [=](int current) {
             auto newCurrentType = types[current];
-            *const_cast<T*>(itemPtr) = Catalog::create(newCurrentType);
+            *const_cast<T*>(itemPtr) = Catalog::create(newCurrentType, argsForConstructor...);
         };
 
         currentIndexGetter = [=]() { return types.indexOf(Catalog::type(*itemPtr)); };
diff --git a/GUI/Model/Group/SelectionProperty.h b/GUI/Model/Group/SelectionProperty.h
index f8cfab0e91b5fdc82a08aa123fd9683fb276d5d1..58797867152c7a518174148c88268b105818881b 100644
--- a/GUI/Model/Group/SelectionProperty.h
+++ b/GUI/Model/Group/SelectionProperty.h
@@ -24,19 +24,21 @@ public:
 
     //! Initializes the selection with the first type in the catalog types.
     //! For initializing a newly created item when creating via Catalog
-    template <typename Catalog>
-    void init(const QString& label, const QString& tooltip, const QString& persistentTag)
+    template <typename Catalog, typename... ArgsForCreation>
+    void init(const QString& label, const QString& tooltip, const QString& persistentTag,
+              ArgsForCreation... argsForCreation)
     {
         m_persistentTag = persistentTag;
-        m_descriptor.template init<Catalog>(label, tooltip, &m_p);
-        m_p = Catalog::create(Catalog::types()[0]);
+        m_descriptor.template init<Catalog>(label, tooltip, &m_p, argsForCreation...);
+        m_p = Catalog::create(Catalog::types()[0], argsForCreation...);
     }
 
     //! Initializes the selection with the first type in the catalog types.
     //! For initializing a newly created item in a separate initializer method
     template <typename Catalog>
-    void init(const QString& label, const QString& tooltip, const QString& persistentTag,
-              std::function<void(T, const T)> initializer)
+    void initWithInitializer(const QString& label, const QString& tooltip,
+                             const QString& persistentTag,
+                             std::function<void(T, const T)> initializer)
     {
         m_initializer = initializer;
         m_persistentTag = persistentTag;
@@ -51,9 +53,10 @@ public:
     //! For initializing a newly created item in a separate initializer method.
     //! Only a subset of types shall be used
     template <typename Catalog>
-    void init(const QString& label, const QString& tooltip, const QString& persistentTag,
-              const QVector<typename Catalog::Type>& types,
-              std::function<void(T, const T)> initializer)
+    void initWithInitializer(const QString& label, const QString& tooltip,
+                             const QString& persistentTag,
+                             const QVector<typename Catalog::Type>& types,
+                             std::function<void(T, const T)> initializer)
     {
         m_initializer = initializer;
         m_persistentTag = persistentTag;
@@ -78,9 +81,10 @@ public:
         m_p = t;
     }
 
-    template <typename S> S* set()
+    template <typename S, typename... ArgsForConstructor>
+    S* set(ArgsForConstructor... argsForConstructor)
     {
-        S* s = new S();
+        S* s = new S(argsForConstructor...);
         if (s != nullptr && m_initializer)
             m_initializer(s, m_p);
         m_p = s;
@@ -97,6 +101,7 @@ private:
 
     T m_p = nullptr;
     std::function<void(T, const T)> m_initializer;
+    std::function<T*()> m_creator;
 };
 
 
diff --git a/GUI/Model/Item/BeamAngleItems.cpp b/GUI/Model/Item/BeamAngleItems.cpp
index 253b6e3892d92080705b999073394d892151a788..95d7de8034a7e51d19e4d2f5798e855970d3a07e 100644
--- a/GUI/Model/Item/BeamAngleItems.cpp
+++ b/GUI/Model/Item/BeamAngleItems.cpp
@@ -19,7 +19,7 @@
 
 BeamAzimuthalAngleItem::BeamAzimuthalAngleItem()
 {
-    m_distribution.init<DistributionItemCatalog>(
+    m_distribution.initWithInitializer<DistributionItemCatalog>(
         "Distribution", "", "distribution", DistributionItemCatalog::types(), initDistribution);
 }
 
@@ -66,7 +66,7 @@ double BeamAzimuthalAngleItem::scaleFactor() const
 
 BeamInclinationAngleItem::BeamInclinationAngleItem()
 {
-    m_distribution.init<DistributionItemCatalog>(
+    m_distribution.initWithInitializer<DistributionItemCatalog>(
         "Distribution", "", "distribution", DistributionItemCatalog::types(), initDistribution);
 }
 
diff --git a/GUI/Model/Item/BeamWavelengthItem.cpp b/GUI/Model/Item/BeamWavelengthItem.cpp
index a3b8f92ea0d399edffb9730650961ba40a1c5372..dce0068caa31d5233dced2aa24dc0d65c0febd0d 100644
--- a/GUI/Model/Item/BeamWavelengthItem.cpp
+++ b/GUI/Model/Item/BeamWavelengthItem.cpp
@@ -47,11 +47,11 @@ BeamWavelengthItem::BeamWavelengthItem()
 
 BeamWavelengthItem::BeamWavelengthItem(bool onlySymmetricDistributions)
 {
-    m_distribution.init<DistributionItemCatalog>("Distribution", "", "distribution",
-                                                 onlySymmetricDistributions
-                                                     ? DistributionItemCatalog::symmetricTypes()
-                                                     : DistributionItemCatalog::types(),
-                                                 initDistribution);
+    m_distribution.initWithInitializer<DistributionItemCatalog>(
+        "Distribution", "", "distribution",
+        onlySymmetricDistributions ? DistributionItemCatalog::symmetricTypes()
+                                   : DistributionItemCatalog::types(),
+        initDistribution);
 }
 
 void BeamWavelengthItem::serialize(Serializer& s)
diff --git a/GUI/Model/Item/ItemWithMaterial.cpp b/GUI/Model/Item/ItemWithMaterial.cpp
index 3d51a02f084eb8075127dd2e725ed72a24986194..d04f8a3f8e9315dadb599964b27308bdbdd1a35e 100644
--- a/GUI/Model/Item/ItemWithMaterial.cpp
+++ b/GUI/Model/Item/ItemWithMaterial.cpp
@@ -27,11 +27,11 @@ void ItemWithMaterial::setMaterial(const QString& materialIdentifier)
     m_materialIdentifier = materialIdentifier;
 }
 
-void ItemWithMaterial::setMaterialModel(const MaterialModel* materialModel)
+
+ItemWithMaterial::ItemWithMaterial(const MaterialModel* materials)
+    : m_materialItems(materials)
 {
-    m_fnFindMaterialById = [=](const QString& id) {
-        return materialModel->materialFromIdentifier(id);
-    };
+    ASSERT(m_materialItems);
 }
 
 void ItemWithMaterial::setMaterialUndefined()
@@ -61,6 +61,5 @@ MaterialItem* ItemWithMaterial::materialItem() const
     if (materialIdentifier().isEmpty())
         return nullptr;
 
-    ASSERT(m_fnFindMaterialById);
-    return m_fnFindMaterialById(materialIdentifier());
+    return m_materialItems->materialFromIdentifier(materialIdentifier());
 }
diff --git a/GUI/Model/Item/ItemWithMaterial.h b/GUI/Model/Item/ItemWithMaterial.h
index d14d144f903174dcf2bd1b6c427e4e9737678887..2fe7f23b2eb737ba6fe2507030c81ef2e8c6109a 100644
--- a/GUI/Model/Item/ItemWithMaterial.h
+++ b/GUI/Model/Item/ItemWithMaterial.h
@@ -25,8 +25,8 @@ class QColor;
 
 class ItemWithMaterial {
 public:
-    //! Define the material container where to find the linked material.
-    void setMaterialModel(const MaterialModel* materialModel);
+    //! Overhand the material list where the current material has to be searched for.
+    ItemWithMaterial(const MaterialModel* materials);
 
     //! Set the material this item shall use.
     //! Stores the identifier, not the pointer!
@@ -47,7 +47,7 @@ public:
     MaterialItem* materialItem() const;
 
 protected:
-    std::function<MaterialItem*(const QString&)> m_fnFindMaterialById;
+    const MaterialModel* m_materialItems;
     QString m_materialIdentifier;
 };
 
diff --git a/GUI/Model/Item/LayerItem.cpp b/GUI/Model/Item/LayerItem.cpp
index d0502c471d1ed3cef857375c6dce1f32d6b68061..a8c918c07b32b0b1abee257966b2ef3332951db1 100644
--- a/GUI/Model/Item/LayerItem.cpp
+++ b/GUI/Model/Item/LayerItem.cpp
@@ -52,7 +52,8 @@ QVector<ItemWithMaterial*> layoutItemsWithMaterial(ParticleLayoutItem* layout)
 
 } // namespace
 
-LayerItem::LayerItem()
+LayerItem::LayerItem(const MaterialModel* materials)
+    : ItemWithMaterial(materials)
 {
     m_thickness.init("Thickness", "Thickness of the layer", 0.0, Unit::nanometer, 3,
                      RealLimits::lowerLimited(0.0), "thickness");
@@ -139,7 +140,7 @@ QVector<ParticleLayoutItem*> LayerItem::layouts() const
 
 ParticleLayoutItem* LayerItem::addLayout()
 {
-    m_layouts << new ParticleLayoutItem();
+    m_layouts << new ParticleLayoutItem(m_materialItems);
     return m_layouts.back();
 }
 
@@ -188,5 +189,5 @@ void LayerItem::serialize(Serializer& s)
     s.rw(m_numSlices);
     s.rw(m_thickness);
     s.rw("Roughness", m_topRoughness);
-    s.rw("Layouts", m_layouts);
+    s.rw("Layouts", m_layouts, m_materialItems);
 }
diff --git a/GUI/Model/Item/LayerItem.h b/GUI/Model/Item/LayerItem.h
index 5d21ba10e3c3bde38cb679766e7c9512f75ad6da..cfd802f722d7f04345aea62a3fb71ca5f9deff5d 100644
--- a/GUI/Model/Item/LayerItem.h
+++ b/GUI/Model/Item/LayerItem.h
@@ -35,7 +35,7 @@ class Serializer;
 
 class LayerItem : public ItemWithMaterial {
 public:
-    LayerItem();
+    LayerItem(const MaterialModel* materials);
 
     void setLayerName(const QString& name);
     QString layerName() const;
diff --git a/GUI/Model/Item/MesoCrystalItem.cpp b/GUI/Model/Item/MesoCrystalItem.cpp
index f58cf465186440410dad32d0ffcddfd587bba06b..17fd8905743a5453b253a451b5d4a441ce062d23 100644
--- a/GUI/Model/Item/MesoCrystalItem.cpp
+++ b/GUI/Model/Item/MesoCrystalItem.cpp
@@ -39,8 +39,9 @@ const QString position_tooltip = "Relative position of the mesocrystal's referen
 
 } // namespace
 
-MesoCrystalItem::MesoCrystalItem()
+MesoCrystalItem::MesoCrystalItem(const MaterialModel* materials)
     : ItemWithParticles(abundance_tooltip, position_tooltip)
+    , m_materials(materials)
 {
     m_vectorA.init("First lattice vector", "Coordinates of the first lattice vector",
                    Unit::nanometer, "vectorA");
@@ -50,7 +51,7 @@ MesoCrystalItem::MesoCrystalItem()
                    Unit::nanometer, "vectorC");
 
     m_outerShape.init<FormFactorItemCatalog>("Outer Shape", "", "outerShape");
-    m_basisParticle.init<ItemWithParticlesCatalog>("Basis", "", "basis");
+    m_basisParticle.init<ItemWithParticlesCatalog>("Basis", "", "basis", materials);
 }
 
 void MesoCrystalItem::serialize(Serializer& s)
@@ -63,7 +64,7 @@ void MesoCrystalItem::serialize(Serializer& s)
     s.rw(m_vectorB);
     s.rw(m_vectorC);
     s.rw<FormFactorItemCatalog>(m_outerShape);
-    s.rw<ItemWithParticlesCatalog>(m_basisParticle);
+    s.rw<ItemWithParticlesCatalog>(m_basisParticle, m_materials);
 }
 
 std::unique_ptr<MesoCrystal> MesoCrystalItem::createMesoCrystal() const
diff --git a/GUI/Model/Item/MesoCrystalItem.h b/GUI/Model/Item/MesoCrystalItem.h
index a13b229f83d7ad4993fe984ee342d5d18f6b2728..c90a62e26dcfb71546fed561a3686a260b2adc54 100644
--- a/GUI/Model/Item/MesoCrystalItem.h
+++ b/GUI/Model/Item/MesoCrystalItem.h
@@ -25,10 +25,11 @@
 class IBornFF;
 class IParticle;
 class MesoCrystal;
+class MaterialModel;
 
 class MesoCrystalItem : public ItemWithParticles {
 public:
-    MesoCrystalItem();
+    MesoCrystalItem(const MaterialModel* materials);
     void serialize(Serializer& s) override;
 
     std::unique_ptr<MesoCrystal> createMesoCrystal() const;
@@ -61,6 +62,7 @@ private:
     VectorProperty m_vectorC;
     SelectionProperty<FormFactorItem*> m_outerShape;
     SelectionProperty<ItemWithParticles*> m_basisParticle;
+    const MaterialModel* m_materials;
 };
 
 template <typename T> T* MesoCrystalItem::setOuterShapeType()
diff --git a/GUI/Model/Item/MultiLayerItem.cpp b/GUI/Model/Item/MultiLayerItem.cpp
index b51dcd8b38beb0fdf3590c229062defeb9daef40..d975d6a8a8293da75aa9cda0ae480a5c298efab0 100644
--- a/GUI/Model/Item/MultiLayerItem.cpp
+++ b/GUI/Model/Item/MultiLayerItem.cpp
@@ -98,7 +98,7 @@ LayerItem* MultiLayerItem::addLayer(int index)
     if (index < 0)
         index = m_layers.size();
 
-    auto* layer = new LayerItem();
+    auto* layer = new LayerItem(&m_materials);
     m_layers.insert(index, layer);
     layer->setIsTopLayer(m_layers.first() == layer);
     layer->setIsBottomLayer(m_layers.last() == layer);
@@ -148,8 +148,8 @@ void MultiLayerItem::serialize(Serializer& s)
     s.rw("Description", m_description);
     s.rw(m_crossCorrelationLength);
     s.rw(m_externalField);
-    s.rw("Layers", m_layers);
     s.rw("Materials", m_materials);
+    s.rw("Layers", m_layers, &m_materials);
 
     if (s.isReading()) {
         // set non-stored infos
@@ -157,10 +157,6 @@ void MultiLayerItem::serialize(Serializer& s)
             l->setIsTopLayer(m_layers.first() == l);
             l->setIsBottomLayer(m_layers.last() == l);
         }
-
-        // initialize all items with materials to find the materials
-        for (auto* itemWithMaterial : itemsWithMaterial())
-            itemWithMaterial->setMaterialModel(&m_materials);
     }
 }
 
diff --git a/GUI/Model/Item/ParticleCompositionItem.cpp b/GUI/Model/Item/ParticleCompositionItem.cpp
index 732ac9924be318a4795dae04e1151f2cebe9c9b9..98230acb009da99e5bf48c9a590583efe368e680 100644
--- a/GUI/Model/Item/ParticleCompositionItem.cpp
+++ b/GUI/Model/Item/ParticleCompositionItem.cpp
@@ -35,9 +35,11 @@ const QString position_tooltip = "Relative position of the particle's reference
 } // namespace
 
 
-ParticleCompositionItem::ParticleCompositionItem()
+ParticleCompositionItem::ParticleCompositionItem(const MaterialModel* materials)
     : ItemWithParticles(abundance_tooltip, position_tooltip)
+    , m_materials(materials)
 {
+    ASSERT(m_materials);
 }
 
 void ParticleCompositionItem::serialize(Serializer& s)
@@ -46,7 +48,7 @@ void ParticleCompositionItem::serialize(Serializer& s)
     s.rw(m_abundance);
     s.rw(m_position);
     s.rw<RotationItemCatalog>(m_rotation);
-    s.rw<ItemWithParticlesCatalog>("Particles", m_particles);
+    s.rw<ItemWithParticlesCatalog>("Particles", m_particles, m_materials);
 }
 
 std::unique_ptr<ParticleComposition> ParticleCompositionItem::createParticleComposition() const
diff --git a/GUI/Model/Item/ParticleCompositionItem.h b/GUI/Model/Item/ParticleCompositionItem.h
index 552e5c93dadf5c6462918b6efb51070926ee9571..31fbb765811fe3b0932d009bb798cbacd1268034 100644
--- a/GUI/Model/Item/ParticleCompositionItem.h
+++ b/GUI/Model/Item/ParticleCompositionItem.h
@@ -19,9 +19,11 @@
 #include "Sample/Particle/ParticleComposition.h"
 #include <memory>
 
+class MaterialModel;
+
 class ParticleCompositionItem : public ItemWithParticles {
 public:
-    ParticleCompositionItem();
+    ParticleCompositionItem(const MaterialModel* materials);
     void serialize(Serializer& s) override;
 
     std::unique_ptr<ParticleComposition> createParticleComposition() const;
@@ -34,6 +36,7 @@ public:
 
 private:
     QVector<ItemWithParticles*> m_particles;
+    const MaterialModel* m_materials;
 };
 
 #endif // BORNAGAIN_GUI_MODEL_ITEM_PARTICLECOMPOSITIONITEM_H
diff --git a/GUI/Model/Item/ParticleCoreShellItem.cpp b/GUI/Model/Item/ParticleCoreShellItem.cpp
index 9f2a7a81aae955807c499eb4e894aa319f31d4d7..09f827586efb961db30e57dafca60785030b9a9e 100644
--- a/GUI/Model/Item/ParticleCoreShellItem.cpp
+++ b/GUI/Model/Item/ParticleCoreShellItem.cpp
@@ -32,8 +32,9 @@ const QString position_tooltip = "Relative position of the particle's reference
 
 } // namespace
 
-ParticleCoreShellItem::ParticleCoreShellItem()
+ParticleCoreShellItem::ParticleCoreShellItem(const MaterialModel* materials)
     : ItemWithParticles(abundance_tooltip, position_tooltip)
+    , m_materials(materials)
 {
 }
 
@@ -42,8 +43,8 @@ void ParticleCoreShellItem::serialize(Serializer& s)
     s.assertVersion(0);
     s.rw(m_abundance);
     s.rw(m_position);
-    s.rw("core", m_core);
-    s.rw("shell", m_shell);
+    s.rw("core", m_core, m_materials);
+    s.rw("shell", m_shell, m_materials);
 }
 
 std::unique_ptr<ParticleCoreShell> ParticleCoreShellItem::createParticleCoreShell() const
@@ -78,8 +79,7 @@ void ParticleCoreShellItem::clearCore()
 
 ParticleItem* ParticleCoreShellItem::createCore(MaterialModel* materials)
 {
-    m_core.reset(new ParticleItem());
-    m_core->setMaterialModel(materials);
+    m_core.reset(new ParticleItem(materials));
     m_core->setMaterial(materials->defaultMaterial());
     return m_core.get();
 }
@@ -96,8 +96,7 @@ void ParticleCoreShellItem::clearShell()
 
 ParticleItem* ParticleCoreShellItem::createShell(MaterialModel* materials)
 {
-    m_shell.reset(new ParticleItem());
-    m_shell->setMaterialModel(materials);
+    m_shell.reset(new ParticleItem(materials));
     m_shell->setMaterial(materials->defaultMaterial());
 
     // position is not used for shell item
diff --git a/GUI/Model/Item/ParticleCoreShellItem.h b/GUI/Model/Item/ParticleCoreShellItem.h
index 6b2bedd563a347be2f6c3b2945e21d7833c2cd47..2302f1f7a77ad9fc2613bfb8c202a57eb6aee49e 100644
--- a/GUI/Model/Item/ParticleCoreShellItem.h
+++ b/GUI/Model/Item/ParticleCoreShellItem.h
@@ -24,7 +24,7 @@ class MaterialModel;
 
 class ParticleCoreShellItem : public ItemWithParticles {
 public:
-    ParticleCoreShellItem();
+    ParticleCoreShellItem(const MaterialModel* materials);
     void serialize(Serializer& s) override;
 
     std::unique_ptr<ParticleCoreShell> createParticleCoreShell() const;
@@ -42,6 +42,7 @@ public:
 private:
     std::unique_ptr<ParticleItem> m_core;
     std::unique_ptr<ParticleItem> m_shell;
+    const MaterialModel* m_materials;
 };
 
 #endif // BORNAGAIN_GUI_MODEL_ITEM_PARTICLECORESHELLITEM_H
diff --git a/GUI/Model/Item/ParticleItem.cpp b/GUI/Model/Item/ParticleItem.cpp
index 19883f6a362ffcf3f453f04c929624620eeabb4c..3cab652190cadce0ceb8f3dc8c66b1e5b9842e5e 100644
--- a/GUI/Model/Item/ParticleItem.cpp
+++ b/GUI/Model/Item/ParticleItem.cpp
@@ -32,8 +32,9 @@ const QString position_tooltip = "Relative position of the particle's reference
 
 } // namespace
 
-ParticleItem::ParticleItem()
-    : ItemWithParticles(abundance_tooltip, position_tooltip)
+ParticleItem::ParticleItem(const MaterialModel* materials)
+    : ItemWithMaterial(materials)
+    , ItemWithParticles(abundance_tooltip, position_tooltip)
 {
     m_formFactor.init<FormFactorItemCatalog>("Form Factor", "", "formFactor");
     m_formFactor.set(new CylinderItem());
diff --git a/GUI/Model/Item/ParticleItem.h b/GUI/Model/Item/ParticleItem.h
index 954318bfcc27a1b3279f13c3654988416d00bce0..1127740b62545c8b4fd8f6721a413c641f8f3b35 100644
--- a/GUI/Model/Item/ParticleItem.h
+++ b/GUI/Model/Item/ParticleItem.h
@@ -25,7 +25,7 @@ class Particle;
 
 class ParticleItem : public ItemWithMaterial, public ItemWithParticles {
 public:
-    ParticleItem();
+    ParticleItem(const MaterialModel* materials);
     void serialize(Serializer& s) override;
 
     std::unique_ptr<Particle> createParticle() const;
diff --git a/GUI/Model/Item/ParticleLayoutItem.cpp b/GUI/Model/Item/ParticleLayoutItem.cpp
index e1586325f7e75545609b4fbfb36ecc4f1a18950d..bc360853860b24c79e44bf3585f96784ecd35c5d 100644
--- a/GUI/Model/Item/ParticleLayoutItem.cpp
+++ b/GUI/Model/Item/ParticleLayoutItem.cpp
@@ -22,7 +22,8 @@
 #include "GUI/Model/MakeItem/ItemWithParticlesCatalog.h"
 #include "GUI/Model/XML/Serializer.h"
 
-ParticleLayoutItem::ParticleLayoutItem()
+ParticleLayoutItem::ParticleLayoutItem(const MaterialModel* materials)
+    : m_materials(materials)
 {
     m_ownDensity.init("Total particle density",
                       "Number of particles per area (particle surface density).\n "
@@ -135,5 +136,5 @@ void ParticleLayoutItem::serialize(Serializer& s)
     s.rw(m_ownDensity);
     s.rw(m_weight);
     s.rw<InterferenceItemCatalog>(m_interference);
-    s.rw<ItemWithParticlesCatalog>("Particles", m_particles);
+    s.rw<ItemWithParticlesCatalog>("Particles", m_particles, m_materials);
 }
diff --git a/GUI/Model/Item/ParticleLayoutItem.h b/GUI/Model/Item/ParticleLayoutItem.h
index 56d22de885a06118dfc2725f6816a4f64858e73e..69d12348868259d1b7b10b0ca10540997674664c 100644
--- a/GUI/Model/Item/ParticleLayoutItem.h
+++ b/GUI/Model/Item/ParticleLayoutItem.h
@@ -21,15 +21,13 @@
 #include <QUuid>
 #include <memory>
 
-
 class ItemWithParticles;
-class QXmlStreamReader;
-class QXmlStreamWriter;
 class Serializer;
+class MaterialModel;
 
 class ParticleLayoutItem {
 public:
-    ParticleLayoutItem();
+    ParticleLayoutItem(const MaterialModel* materials);
 
     //! The density value which belonging only to the layout.
     //!
@@ -76,6 +74,7 @@ private:
     DoubleProperty m_weight;
     SelectionProperty<InterferenceItem*> m_interference;
     QVector<ItemWithParticles*> m_particles;
+    const MaterialModel* m_materials;
 };
 
 #endif // BORNAGAIN_GUI_MODEL_ITEM_PARTICLELAYOUTITEM_H
diff --git a/GUI/Model/Item/RectangularDetectorItem.cpp b/GUI/Model/Item/RectangularDetectorItem.cpp
index e236f2c62a4554f95aab40e3ea0de57d458d81f8..041d50fb8a356c222cd4bbaaea20d7f277af6bd0 100644
--- a/GUI/Model/Item/RectangularDetectorItem.cpp
+++ b/GUI/Model/Item/RectangularDetectorItem.cpp
@@ -64,7 +64,7 @@ void initResolutionFunction(ResolutionFunctionItem* newFunc, const ResolutionFun
 
 RectangularDetectorItem::RectangularDetectorItem()
 {
-    m_resolutionFunction.init<ResolutionFunctionItemCatalog>(
+    m_resolutionFunction.initWithInitializer<ResolutionFunctionItemCatalog>(
         "Resolution function", "Detector resolution function", "resolutionFunction",
         initResolutionFunction);
 
diff --git a/GUI/Model/Item/SpecularBeamInclinationItem.cpp b/GUI/Model/Item/SpecularBeamInclinationItem.cpp
index fa561d849c32c3853ec159deb1260286ef9d698c..99e467a81665e3e2d13194a0bf141d7ae68b215c 100644
--- a/GUI/Model/Item/SpecularBeamInclinationItem.cpp
+++ b/GUI/Model/Item/SpecularBeamInclinationItem.cpp
@@ -64,9 +64,9 @@ SpecularBeamInclinationItem::SpecularBeamInclinationItem(const InstrumentItem* o
     : BeamDistributionItem()
     , m_owningInstrument(owningInstrument)
 {
-    m_distribution.init<DistributionItemCatalog>("Distribution", "", "distribution",
-                                                 DistributionItemCatalog::symmetricTypes(),
-                                                 initDistribution);
+    m_distribution.initWithInitializer<DistributionItemCatalog>(
+        "Distribution", "", "distribution", DistributionItemCatalog::symmetricTypes(),
+        initDistribution);
 
     m_uniformAlphaAxis.reset(new BasicAxisItem());
     setAxisPresentationDefaults(m_uniformAlphaAxis.get());
@@ -78,8 +78,9 @@ void SpecularBeamInclinationItem::serialize(Serializer& s)
     s.assertVersion(0);
     s.rw<DistributionItemCatalog>(m_distribution);
     s.rw("currentAxisIsUniformAxis", m_currentAxisIsUniformAxis);
-    s.rw<BasicAxisItem>("uniformAxis", m_uniformAlphaAxis, setAxisPresentationDefaults);
-    s.rw<PointwiseAxisItem>("pointwiseAxis", m_pointwiseAlphaAxis, setAxisPresentationDefaults);
+    s.rwWithInit<BasicAxisItem>("uniformAxis", m_uniformAlphaAxis, setAxisPresentationDefaults);
+    s.rwWithInit<PointwiseAxisItem>("pointwiseAxis", m_pointwiseAlphaAxis,
+                                    setAxisPresentationDefaults);
 
     if (s.isReading()) {
         m_distribution->setLimits(RealLimits::limited(-90.0, 90.0));
diff --git a/GUI/Model/Item/SphericalDetectorItem.cpp b/GUI/Model/Item/SphericalDetectorItem.cpp
index e53599806328e169d8c7c033d0fab040c83a2c6d..912250017b259acf00f34088bce1b63178b71034 100644
--- a/GUI/Model/Item/SphericalDetectorItem.cpp
+++ b/GUI/Model/Item/SphericalDetectorItem.cpp
@@ -28,7 +28,7 @@ void initResolutionFunction(ResolutionFunctionItem* newFunc, const ResolutionFun
 
 SphericalDetectorItem::SphericalDetectorItem()
 {
-    m_resolutionFunction.init<ResolutionFunctionItemCatalog>(
+    m_resolutionFunction.initWithInitializer<ResolutionFunctionItemCatalog>(
         "Resolution function", "Detector resolution function", "resolutionFunction",
         initResolutionFunction);
 
diff --git a/GUI/Model/MakeItem/ItemWithParticlesCatalog.cpp b/GUI/Model/MakeItem/ItemWithParticlesCatalog.cpp
index 3c901f656f565a5a8baa8f40815a2dc68255de51..622fa0027890f5b94cdb5495fdbceef18296914f 100644
--- a/GUI/Model/MakeItem/ItemWithParticlesCatalog.cpp
+++ b/GUI/Model/MakeItem/ItemWithParticlesCatalog.cpp
@@ -18,17 +18,17 @@
 #include "GUI/Model/Item/ParticleCoreShellItem.h"
 #include "GUI/Model/Item/ParticleItem.h"
 
-ItemWithParticles* ItemWithParticlesCatalog::create(Type type)
+ItemWithParticles* ItemWithParticlesCatalog::create(Type type, const MaterialModel* materials)
 {
     switch (type) {
     case Type::Particle:
-        return new ParticleItem();
+        return new ParticleItem(materials);
     case Type::Composition:
-        return new ParticleCompositionItem();
+        return new ParticleCompositionItem(materials);
     case Type::CoreShell:
-        return new ParticleCoreShellItem();
+        return new ParticleCoreShellItem(materials);
     case Type::MesoCrystal:
-        return new MesoCrystalItem();
+        return new MesoCrystalItem(materials);
     default:
         ASSERT(false);
     }
diff --git a/GUI/Model/MakeItem/ItemWithParticlesCatalog.h b/GUI/Model/MakeItem/ItemWithParticlesCatalog.h
index 60d14f1ddd5b8b8c2e5358301abcc95027733c3c..fa220db0783c69687026670702b9594f3f23a88e 100644
--- a/GUI/Model/MakeItem/ItemWithParticlesCatalog.h
+++ b/GUI/Model/MakeItem/ItemWithParticlesCatalog.h
@@ -19,6 +19,7 @@
 #include <QVector>
 
 class ItemWithParticles;
+class MaterialModel;
 
 class ItemWithParticlesCatalog {
 public:
@@ -36,7 +37,7 @@ public:
     //! Creates the item of the given type.
     //!
     //! If type is "None", a nullptr is returned.
-    static ItemWithParticles* create(Type type);
+    static ItemWithParticles* create(Type type, const MaterialModel* materials);
 
     //! Available types of items, sorted as expected in the UI (e.g. in combo box)
     static QVector<Type> types();
diff --git a/GUI/Model/MakeItem/ResolutionFunctionItemCatalog.cpp b/GUI/Model/MakeItem/ResolutionFunctionItemCatalog.cpp
index 23fcb58e6427d52ac629be7781839b2ad07a8237..6d0315dc22c296fbb5376c892f08872215240088 100644
--- a/GUI/Model/MakeItem/ResolutionFunctionItemCatalog.cpp
+++ b/GUI/Model/MakeItem/ResolutionFunctionItemCatalog.cpp
@@ -16,13 +16,20 @@
 #include "Base/Util/Assert.h"
 #include "GUI/Model/Item/ResolutionFunctionItems.h"
 
-ResolutionFunctionItem* ResolutionFunctionItemCatalog::create(Type type)
+ResolutionFunctionItem*
+ResolutionFunctionItemCatalog::create(Type type, const std::variant<QString, Unit>& unit)
 {
     switch (type) {
-    case Type::None:
-        return new ResolutionFunctionNoneItem();
-    case Type::Gaussian:
-        return new ResolutionFunction2DGaussianItem();
+    case Type::None: {
+        auto* p = new ResolutionFunctionNoneItem();
+        p->setUnit(unit);
+        return p;
+    }
+    case Type::Gaussian: {
+        auto* p = new ResolutionFunction2DGaussianItem();
+        p->setUnit(unit);
+        return p;
+    }
     }
     ASSERT(false);
 }
diff --git a/GUI/Model/MakeItem/ResolutionFunctionItemCatalog.h b/GUI/Model/MakeItem/ResolutionFunctionItemCatalog.h
index cd4cd2d9806f57fba4b6bcb01ce79b4529d5bb45..c7648a5ba1329edd297fe934d535c6d77c2a3437 100644
--- a/GUI/Model/MakeItem/ResolutionFunctionItemCatalog.h
+++ b/GUI/Model/MakeItem/ResolutionFunctionItemCatalog.h
@@ -15,8 +15,10 @@
 #ifndef BORNAGAIN_GUI_MODEL_MAKEITEM_RESOLUTIONFUNCTIONITEMCATALOG_H
 #define BORNAGAIN_GUI_MODEL_MAKEITEM_RESOLUTIONFUNCTIONITEMCATALOG_H
 
+#include "GUI/Model/Types/Unit.h"
 #include <QString>
 #include <QVector>
+#include <variant>
 
 class ResolutionFunctionItem;
 
@@ -33,7 +35,8 @@ public:
     };
 
     //! Creates the item of the given type.
-    static ResolutionFunctionItem* create(Type type);
+    static ResolutionFunctionItem* create(Type type,
+                                          const std::variant<QString, Unit>& unit = Unit::unitless);
 
     //! Available types of items.
     //!
diff --git a/GUI/Model/Model/MaterialModel.cpp b/GUI/Model/Model/MaterialModel.cpp
index c377d6c4850e32f1d3a8ef8383415c10d32946e4..a5671ac3bd4a11e2f767c132df02c0542e3f9ddf 100644
--- a/GUI/Model/Model/MaterialModel.cpp
+++ b/GUI/Model/Model/MaterialModel.cpp
@@ -144,15 +144,6 @@ const QVector<MaterialItem*>& MaterialModel::materialItems() const
     return m_materialItems;
 }
 
-MaterialItem* MaterialModel::findMaterialItem(const QString& identifier) const
-{
-    for (auto* m : m_materialItems)
-        if (m->identifier() == identifier)
-            return m;
-
-    return nullptr;
-}
-
 MaterialItem* MaterialModel::defaultMaterial() const
 {
     ASSERT(!materialItems().isEmpty());
@@ -207,14 +198,14 @@ void MaterialModel::serialize(Serializer& s)
     if (s.isReading())
         clear();
     s.assertVersion(0);
-    s.rw("Materials", m_materialItems);
+    s.rw("MaterialItems", m_materialItems);
 }
 
 void MaterialModel::initFrom(const MaterialModel& from)
 {
     // update existing to new contents (do not delete and recreate to keep references valid)
     for (auto* destItem : m_materialItems)
-        if (auto* fromItem = from.findMaterialItem(destItem->identifier()))
+        if (auto* fromItem = from.materialFromIdentifier(destItem->identifier()))
             destItem->updateFrom(*fromItem);
 
     bool anyAddedOrRemoved = false;
@@ -222,7 +213,7 @@ void MaterialModel::initFrom(const MaterialModel& from)
     // remove non-existing
     auto* iter = m_materialItems.begin();
     while (iter != m_materialItems.end())
-        if (!from.findMaterialItem((*iter)->identifier())) {
+        if (!from.materialFromIdentifier((*iter)->identifier())) {
             delete *iter;
             iter = m_materialItems.erase(iter);
             anyAddedOrRemoved = true;
@@ -231,7 +222,7 @@ void MaterialModel::initFrom(const MaterialModel& from)
 
     // copy new ones
     for (const auto* m : from.materialItems())
-        if (!findMaterialItem(m->identifier())) {
+        if (!materialFromIdentifier(m->identifier())) {
             addMaterial(new MaterialItem(*m), false);
             anyAddedOrRemoved = true;
         }
@@ -239,7 +230,7 @@ void MaterialModel::initFrom(const MaterialModel& from)
     // copy order
     QVector<MaterialItem*> tmp;
     for (const auto* m : from.materialItems())
-        tmp << findMaterialItem(m->identifier());
+        tmp << materialFromIdentifier(m->identifier());
     m_materialItems = tmp;
 
     if (anyAddedOrRemoved)
diff --git a/GUI/Model/Model/MaterialModel.h b/GUI/Model/Model/MaterialModel.h
index d179a8a5d98c34ce3e440fba35800d8f18161dfd..5ddbdcf71fb6523168bc40246ee6c53bfe93d901 100644
--- a/GUI/Model/Model/MaterialModel.h
+++ b/GUI/Model/Model/MaterialModel.h
@@ -49,7 +49,6 @@ public:
     MaterialItem* insertCopy(const MaterialItem& material);
 
     const QVector<MaterialItem*>& materialItems() const;
-    MaterialItem* findMaterialItem(const QString& identifier) const;
 
     MaterialItem* defaultMaterial() const;
 
diff --git a/GUI/Model/XML/Serializer.h b/GUI/Model/XML/Serializer.h
index 785a1407988496adeab1aada6a61e1893bdab2c0..33b444971f6a59f72ee26ac28cd52f14aaf45f83 100644
--- a/GUI/Model/XML/Serializer.h
+++ b/GUI/Model/XML/Serializer.h
@@ -60,7 +60,8 @@ public:
     void rw(const QString& tag, AxisProperty& d);
 
     //! serialize a list with a known and fixed type which is not a base class, but the real class
-    template <typename T> void rw(const QString& tag, QVector<T>& vec)
+    template <typename T, typename... Args>
+    void rw(const QString& tag, QVector<T>& vec, Args... argsForConstructor)
     {
         if (m_w) {
             m_w->writeStartElement(tag);
@@ -78,7 +79,7 @@ public:
             const int n = m_r->attributes().value("n").toInt();
             for (int i = 0; i < n; i++) {
                 goToStartElementOfTag("E" + QString::number(i));
-                vec << new typename std::remove_pointer<T>::type();
+                vec << new typename std::remove_pointer<T>::type(argsForConstructor...);
                 vec.last()->serialize(*this);
                 gotoEndElementOfTag("E" + QString::number(i));
             }
@@ -89,8 +90,9 @@ public:
     //! serialize a list with a base class type, which can contain derived types. For this we need
     //! the catalog of possible classes/types to identify the current type and to re-create this
     //! type after serialization
-    template <typename Catalog>
-    void rw(const QString& tag, QVector<typename Catalog::CatalogedType*>& vec)
+    template <typename Catalog, typename... Args>
+    void rw(const QString& tag, QVector<typename Catalog::CatalogedType*>& vec,
+            Args... argsForConstructor)
     {
         if (m_w) {
             m_w->writeStartElement(tag);
@@ -106,21 +108,23 @@ public:
             const int n = m_r->attributes().value("n").toInt();
             for (int i = 0; i < n; i++) {
                 typename Catalog::CatalogedType* p = nullptr;
-                read<Catalog>("E" + QString::number(i), p);
+                read<Catalog>("E" + QString::number(i), p, argsForConstructor...);
                 vec << p;
             }
             gotoEndElementOfTag(tag);
         }
     }
 
-    template <typename Catalog> void rw(SelectionProperty<typename Catalog::CatalogedType*>& d)
+    template <typename Catalog, typename... ArgsForCreation>
+    void rw(SelectionProperty<typename Catalog::CatalogedType*>& d,
+            ArgsForCreation... argsForCreation)
     {
         if (m_w) {
             typename Catalog::CatalogedType* p = d.get();
             write<Catalog>(d.persistentTag(), p);
         } else {
             typename Catalog::CatalogedType* p = nullptr;
-            read<Catalog>(d.persistentTag(), p);
+            read<Catalog>(d.persistentTag(), p, argsForCreation...);
             d.set(p);
         }
     }
@@ -146,10 +150,35 @@ public:
 
     //! serialize item which has only one exact class, and can be present or not.
     //!
-    //! If initializer is given, it will be called after creation and before de-serialization
-    template <typename ItemClass>
+    //! argsForConstructor will be handed to the constructor when creating ItemClass.
+    template <typename ItemClass, typename... ArgsForConstructor>
     void rw(const QString& tag, std::unique_ptr<ItemClass>& up,
-            std::function<void(ItemClass*)> initializer = nullptr)
+            ArgsForConstructor... argsForConstructor)
+    {
+        if (m_w) {
+            m_w->writeStartElement(tag);
+            m_w->writeAttribute("valid", up ? "1" : "0");
+            if (up)
+                up->serialize(*this);
+            m_w->writeEndElement();
+        } else {
+            goToStartElementOfTag(tag);
+            const bool valid = m_r->attributes().value("valid").toUInt() > 0;
+            if (valid) {
+                up.reset(new ItemClass(argsForConstructor...));
+                up->serialize(*this);
+            } else
+                up.reset();
+            gotoEndElementOfTag(tag);
+        }
+    }
+
+    //! serialize item which has only one exact class, and can be present or not.
+    //!
+    //! The given initializer will be called after creation and before de-serialization
+    template <typename ItemClass>
+    void rwWithInit(const QString& tag, std::unique_ptr<ItemClass>& up,
+                    const std::function<void(ItemClass*)>& initializer)
     {
         if (m_w) {
             m_w->writeStartElement(tag);
@@ -181,13 +210,14 @@ public:
         m_w->writeEndElement();
     }
 
-    template <typename Catalog> void read(const QString& tag, typename Catalog::CatalogedType*& p)
+    template <typename Catalog, typename... Args>
+    void read(const QString& tag, typename Catalog::CatalogedType*& p, Args... argsForConstructor)
     {
         ASSERT(m_r);
         goToStartElementOfTag(tag);
         const auto type =
             static_cast<typename Catalog::Type>(m_r->attributes().value("type").toUInt());
-        p = Catalog::create(type);
+        p = Catalog::create(type, argsForConstructor...);
         if (p != nullptr)
             p->serialize(*this);
         gotoEndElementOfTag(tag);
diff --git a/GUI/View/FromDomain/GUISampleBuilder.cpp b/GUI/View/FromDomain/GUISampleBuilder.cpp
index 739c1d5fe9d5bc0f71d3676e1b883f3af72916f2..4f9165258057643fdc3fba8670423565c9de55dc 100644
--- a/GUI/View/FromDomain/GUISampleBuilder.cpp
+++ b/GUI/View/FromDomain/GUISampleBuilder.cpp
@@ -71,10 +71,6 @@ MultiLayerItem* GUISampleBuilder::createMultiLayerItem(const MultiLayer& multiLa
         }
     }
 
-    // initialize all items with materials to find the materials
-    for (auto* itemWithMaterial : m_multilayerItem->itemsWithMaterial())
-        itemWithMaterial->setMaterialModel(&m_multilayerItem->materialItems());
-
     return m_multilayerItem;
 }
 
@@ -113,7 +109,7 @@ void GUISampleBuilder::copyParticle(const IParticle* iparticle,
                                     std::function<void(ItemWithParticles*)> addToParent)
 {
     if (const auto* particle = dynamic_cast<const Particle*>(iparticle)) {
-        auto* particle_item = new ParticleItem();
+        auto* particle_item = new ParticleItem(&m_multilayerItem->materialItems());
         copyParticle(particle_item, particle);
         addToParent(particle_item);
     } else if (const auto* coreshell = dynamic_cast<const ParticleCoreShell*>(iparticle)) {
@@ -122,7 +118,7 @@ void GUISampleBuilder::copyParticle(const IParticle* iparticle,
         if (!coreshell->shellParticle())
             throw Exception("Core/shell particle has no shell particle.");
 
-        auto* coreShellItem = new ParticleCoreShellItem();
+        auto* coreShellItem = new ParticleCoreShellItem(&m_multilayerItem->materialItems());
         coreShellItem->setAbundance(coreshell->abundance());
         coreShellItem->setPosition(coreshell->particlePosition());
         FromDomain::setRotation(coreShellItem, coreshell->rotation());
@@ -141,7 +137,7 @@ void GUISampleBuilder::copyParticle(const IParticle* iparticle,
         if (!meso->particleStructure().basis())
             throw Exception("Meso crystal has no basis.");
 
-        auto* mesoItem = new MesoCrystalItem();
+        auto* mesoItem = new MesoCrystalItem(&m_multilayerItem->materialItems());
         mesoItem->setAbundance(meso->abundance());
         mesoItem->setPosition(meso->particlePosition());
         FromDomain::setFormFactor(mesoItem, meso->outerShape());
@@ -158,7 +154,8 @@ void GUISampleBuilder::copyParticle(const IParticle* iparticle,
 
     } else if (const auto* particleComposition =
                    dynamic_cast<const ParticleComposition*>(iparticle)) {
-        auto* particleCompositionItem = new ParticleCompositionItem();
+        auto* particleCompositionItem =
+            new ParticleCompositionItem(&m_multilayerItem->materialItems());
 
         particleCompositionItem->setAbundance(particleComposition->abundance());
         particleCompositionItem->setPosition(particleComposition->particlePosition());
diff --git a/GUI/View/SampleDesigner/SampleEditorCommands.cpp b/GUI/View/SampleDesigner/SampleEditorCommands.cpp
index e457a8d293f7cccba0c244d1ea246e32c548335f..956d0b78af95dff6f43e4bca68411b974f52cd3d 100644
--- a/GUI/View/SampleDesigner/SampleEditorCommands.cpp
+++ b/GUI/View/SampleDesigner/SampleEditorCommands.cpp
@@ -73,7 +73,6 @@ void CommandRemoveLayer::undo()
 {
     LayerItem* restoredLayer = m_ec->multiLayerItem()->addLayer(m_indexOfLayer);
     deserialize(restoredLayer, m_layerItemBackup);
-    restoredLayer->setMaterialModel(m_ec->materialModel());
     m_ec->multiLayerForm()->onLayerAdded(restoredLayer);
     emit m_ec->modified();
 }
diff --git a/GUI/View/SampleDesigner/SampleEditorController.cpp b/GUI/View/SampleDesigner/SampleEditorController.cpp
index efb48f72d8c166cd304cc2a4c3da6a6051f4da3c..7a6384320c84f713a88076b56825646899aa5f0a 100644
--- a/GUI/View/SampleDesigner/SampleEditorController.cpp
+++ b/GUI/View/SampleDesigner/SampleEditorController.cpp
@@ -101,7 +101,6 @@ void SampleEditorController::addLayer(LayerItem* before)
 
     // - create new layer
     LayerItem* layer = m_multiLayerItem->addLayer(rowInMultiLayer);
-    layer->setMaterialModel(materialModel());
     layer->setMaterial(materialModel()->defaultMaterial());
     layer->setColor(color);
 
@@ -213,8 +212,7 @@ void SampleEditorController::addParticle(ParticleCompositionItem* compositionIte
 ItemWithParticles*
 SampleEditorController::createAndInitParticle(FormFactorItemCatalog::Type formFactorType) const
 {
-    auto* newParticle = new ParticleItem();
-    newParticle->setMaterialModel(materialModel());
+    auto* newParticle = new ParticleItem(materialModel());
     newParticle->setFormFactor(FormFactorItemCatalog::create(formFactorType));
     newParticle->setMaterial(materialModel()->defaultMaterial());
     return newParticle;
@@ -223,12 +221,10 @@ SampleEditorController::createAndInitParticle(FormFactorItemCatalog::Type formFa
 ItemWithParticles*
 SampleEditorController::createAndInitParticle(ItemWithParticlesCatalog::Type itemType) const
 {
-    auto* newItem = ItemWithParticlesCatalog::create(itemType);
+    auto* newItem = ItemWithParticlesCatalog::create(itemType, materialModel());
 
-    if (auto* p = dynamic_cast<ItemWithMaterial*>(newItem)) {
-        p->setMaterialModel(materialModel());
+    if (auto* p = dynamic_cast<ItemWithMaterial*>(newItem))
         p->setMaterial(materialModel()->defaultMaterial());
-    }
 
     if (auto* cs = dynamic_cast<ParticleCoreShellItem*>(newItem)) {
         cs->createCore(materialModel());
@@ -238,10 +234,8 @@ SampleEditorController::createAndInitParticle(ItemWithParticlesCatalog::Type ite
     }
 
     if (auto* meso = dynamic_cast<MesoCrystalItem*>(newItem); meso && meso->basisParticle())
-        if (auto* p = dynamic_cast<ItemWithMaterial*>(meso->basisParticle())) {
-            p->setMaterialModel(materialModel());
+        if (auto* p = dynamic_cast<ItemWithMaterial*>(meso->basisParticle()))
             p->setMaterial(materialModel()->defaultMaterial());
-        }
 
     return newItem;
 }
diff --git a/Tests/Unit/GUI/TestRealSpaceBuilderUtils.cpp b/Tests/Unit/GUI/TestRealSpaceBuilderUtils.cpp
index 4f2329da43b45cde0246a2e94d3c40d7ef18209c..c7f4b3c6029c7dfcaea8633727ab27b2dac11e9a 100644
--- a/Tests/Unit/GUI/TestRealSpaceBuilderUtils.cpp
+++ b/Tests/Unit/GUI/TestRealSpaceBuilderUtils.cpp
@@ -35,11 +35,11 @@ TEST_F(TestRealSpaceBuilderUtils, RealSpaceModelandParticle)
 TEST_F(TestRealSpaceBuilderUtils, computeCumulativeAbundances)
 {
     MaterialModel materialModel;
-    auto* layout = new ParticleLayoutItem();
+    auto* layout = new ParticleLayoutItem(&materialModel);
 
-    auto* particle1 = new ParticleItem();
+    auto* particle1 = new ParticleItem(&materialModel);
     layout->addParticle(particle1);
-    auto* particle2 = new ParticleItem();
+    auto* particle2 = new ParticleItem(&materialModel);
     layout->addParticle(particle2);
 
     particle1->setAbundance(8.0);
@@ -154,9 +154,8 @@ TEST_F(TestRealSpaceBuilderUtils, singleParticle3DContainer)
     MaterialModel materialModel;
     materialModel.addRefractiveMaterial("Default", 1e-3, 1e-5);
 
-    auto particleItem = std::make_unique<ParticleItem>();
+    auto particleItem = std::make_unique<ParticleItem>(&materialModel);
     particleItem->setMaterial(materialModel.defaultMaterial());
-    particleItem->setMaterialModel(&materialModel);
     EXPECT_EQ(particleItem->abundance(), 1.0);
     EXPECT_TRUE(dynamic_cast<CylinderItem*>(particleItem->formfactor_at_bottom()));
 
@@ -183,16 +182,13 @@ TEST_F(TestRealSpaceBuilderUtils, particle3DContainerVector)
     MaterialModel materialModel;
     materialModel.addRefractiveMaterial("Default", 1e-3, 1e-5);
 
-    auto layout = std::make_unique<ParticleLayoutItem>();
-    auto* particle1 = new ParticleItem();
-    auto* particle2 = new ParticleItem();
-    auto* particle3 = new ParticleItem();
+    auto layout = std::make_unique<ParticleLayoutItem>(&materialModel);
+    auto* particle1 = new ParticleItem(&materialModel);
+    auto* particle2 = new ParticleItem(&materialModel);
+    auto* particle3 = new ParticleItem(&materialModel);
     particle1->setMaterial(materialModel.defaultMaterial());
     particle2->setMaterial(materialModel.defaultMaterial());
     particle3->setMaterial(materialModel.defaultMaterial());
-    particle1->setMaterialModel(&materialModel);
-    particle2->setMaterialModel(&materialModel);
-    particle3->setMaterialModel(&materialModel);
 
     layout->addParticle(particle1);
     layout->addParticle(particle2);
diff --git a/Tests/Unit/GUI/TestSessionModel.cpp b/Tests/Unit/GUI/TestSessionModel.cpp
index 0a79f2e4723e2476fa05ee01c5f708bbdfa3fb95..7cb9b69371a302629c9cac4e233d98c3a6cf5815 100644
--- a/Tests/Unit/GUI/TestSessionModel.cpp
+++ b/Tests/Unit/GUI/TestSessionModel.cpp
@@ -52,6 +52,7 @@ TEST_F(TestSessionModel, copyItem)
 
     auto multilayer1 = std::make_unique<MultiLayerItem>();
     multilayer1->setSampleName("multilayer1");
+    multilayer1->addStandardMaterials();
 
     InstrumentItems instrumentItems;
     auto* instrument1 = instrumentItems.addInstrument<GISASInstrumentItem>();
diff --git a/Tests/Unit/GUI/TestSessionXML.cpp b/Tests/Unit/GUI/TestSessionXML.cpp
index 0a4d985c8d3b526a4198dd89ced13b3bb472960e..f4b003b07ffd03f6090541cab25cb34882a6fba3 100644
--- a/Tests/Unit/GUI/TestSessionXML.cpp
+++ b/Tests/Unit/GUI/TestSessionXML.cpp
@@ -192,10 +192,11 @@ TEST_F(TestSessionXML, emptyMultiLayer)
 
 TEST_F(TestSessionXML, Layer)
 {
-    LayerItem source;
+    MaterialModel materials;
+    LayerItem source(&materials);
     const auto a1 = serialize(source);
 
-    LayerItem target;
+    LayerItem target(&materials);
     deserialize(target, a1);
 
     // final XML comparison
@@ -204,10 +205,11 @@ TEST_F(TestSessionXML, Layer)
 
 TEST_F(TestSessionXML, Particle)
 {
-    ParticleItem source;
+    MaterialModel materials;
+    ParticleItem source(&materials);
     const auto a1 = serialize(source);
 
-    ParticleItem target;
+    ParticleItem target(&materials);
     deserialize(target, a1);
 
     // final XML comparison
@@ -216,11 +218,12 @@ TEST_F(TestSessionXML, Particle)
 
 TEST_F(TestSessionXML, ParticleWithFF)
 {
-    ParticleItem source;
+    MaterialModel materials;
+    ParticleItem source(&materials);
     source.setFormFactorType<Pyramid2Item>();
     const auto a1 = serialize(source);
 
-    ParticleItem target;
+    ParticleItem target(&materials);
     deserialize(target, a1);
 
     // final XML comparison