diff --git a/GUI/Model/Sample/ItemWithMaterial.cpp b/GUI/Model/Sample/ItemWithMaterial.cpp
index 2e80fb5ee34435d830cd725c970d75a33daf02c8..db14395fa6dc64d6a32cc9ee30cdef159ba30b75 100644
--- a/GUI/Model/Sample/ItemWithMaterial.cpp
+++ b/GUI/Model/Sample/ItemWithMaterial.cpp
@@ -16,6 +16,15 @@
 #include "Base/Util/Assert.h"
 #include "GUI/Model/Sample/MaterialItem.h"
 #include "GUI/Model/Sample/MaterialModel.h"
+#include "GUI/Support/XML/UtilXML.h"
+
+namespace {
+namespace Tag {
+
+const QString MaterialId("MaterialId");
+
+} // namespace Tag
+}
 
 ItemWithMaterial::ItemWithMaterial(const MaterialModel* materialModel)
     : m_materialModel(materialModel)
@@ -58,3 +67,31 @@ MaterialItem* ItemWithMaterial::materialItem() const
 
     return m_materialModel->materialFromIdentifier(materialIdentifier());
 }
+
+void ItemWithMaterial::writeTo(QXmlStreamWriter *w) const
+{
+    XML::writeAttribute(w, XML::Attrib::version, uint(1));
+
+    // material id
+    w->writeStartElement(Tag::MaterialId);
+    XML::writeAttribute(w, XML::Attrib::value, m_materialIdentifier);
+    w->writeEndElement();
+}
+
+void ItemWithMaterial::readFrom(QXmlStreamReader *r)
+{
+    const uint version = XML::readUIntAttribute(r, XML::Attrib::version);
+    Q_UNUSED(version)
+
+    while (r->readNextStartElement()) {
+        QString tag = r->name().toString();
+
+        // material id
+        if (tag == Tag::MaterialId) {
+            XML::readAttribute(r, XML::Attrib::value, &m_materialIdentifier);
+            XML::gotoEndElementOfTag(r, tag);
+
+        } else
+            r->skipCurrentElement();
+    }
+}
diff --git a/GUI/Model/Sample/ItemWithMaterial.h b/GUI/Model/Sample/ItemWithMaterial.h
index 1b238c0179f481c2a42889fd458d64b4dccec810..24d309d6b5c149e5092cd6b4c4c425a6390baaae 100644
--- a/GUI/Model/Sample/ItemWithMaterial.h
+++ b/GUI/Model/Sample/ItemWithMaterial.h
@@ -15,13 +15,14 @@
 #ifndef BORNAGAIN_GUI_MODEL_SAMPLE_ITEMWITHMATERIAL_H
 #define BORNAGAIN_GUI_MODEL_SAMPLE_ITEMWITHMATERIAL_H
 
+#include <QColor>
 #include <QString>
+#include <QXmlStreamWriter>
 #include <functional>
 
 class Material;
 class MaterialItem;
 class MaterialModel;
-class QColor;
 
 class ItemWithMaterial {
 public:
@@ -43,6 +44,9 @@ public:
     //! Returns the material item this item links to.
     MaterialItem* materialItem() const;
 
+    virtual void writeTo(QXmlStreamWriter* w) const;
+    virtual void readFrom(QXmlStreamReader* r);
+
 protected:
     const MaterialModel* m_materialModel;
     QString m_materialIdentifier;
diff --git a/GUI/Model/Sample/LayerItem.cpp b/GUI/Model/Sample/LayerItem.cpp
index cf29ae4345e88a0258fbfdf67398a3adaa60533e..460215d49d75a3883fc482fc0a328358635f2772 100644
--- a/GUI/Model/Sample/LayerItem.cpp
+++ b/GUI/Model/Sample/LayerItem.cpp
@@ -28,7 +28,7 @@ namespace Tag {
 
 const QString Name("Name");
 const QString Color("Color");
-const QString MaterialId("MaterialId");
+const QString MaterialData("MaterialData");
 const QString NumSlices("NumSlices");
 const QString Thickness("Thickness");
 const QString Roughness("Roughness");
@@ -125,6 +125,11 @@ void LayerItem::writeTo(QXmlStreamWriter* w) const
 {
     XML::writeAttribute(w, XML::Attrib::version, uint(1));
 
+    // material data
+    w->writeStartElement(Tag::MaterialData);
+    ItemWithMaterial::writeTo(w);
+    w->writeEndElement();
+
     // name
     w->writeStartElement(Tag::Name);
     XML::writeAttribute(w, XML::Attrib::value, m_name);
@@ -135,11 +140,6 @@ void LayerItem::writeTo(QXmlStreamWriter* w) const
     XML::writeAttribute(w, XML::Attrib::value, m_color);
     w->writeEndElement();
 
-    // material id
-    w->writeStartElement(Tag::MaterialId);
-    XML::writeAttribute(w, XML::Attrib::value, m_materialIdentifier);
-    w->writeEndElement();
-
     // number of slices
     w->writeStartElement(Tag::NumSlices);
     XML::writeAttribute(w, XML::Attrib::value, m_numSlices);
@@ -173,8 +173,13 @@ void LayerItem::readFrom(QXmlStreamReader* r)
     while (r->readNextStartElement()) {
         QString tag = r->name().toString();
 
+        // material data
+        if (tag == Tag::MaterialData) {
+            ItemWithMaterial::readFrom(r);
+            XML::gotoEndElementOfTag(r, tag);
+
         // name
-        if (tag == Tag::Name) {
+        } else if (tag == Tag::Name) {
             XML::readAttribute(r, XML::Attrib::value, &m_name);
             XML::gotoEndElementOfTag(r, tag);
 
@@ -183,11 +188,6 @@ void LayerItem::readFrom(QXmlStreamReader* r)
             XML::readAttribute(r, XML::Attrib::value, &m_color);
             XML::gotoEndElementOfTag(r, tag);
 
-            // material id
-        } else if (tag == Tag::MaterialId) {
-            XML::readAttribute(r, XML::Attrib::value, &m_materialIdentifier);
-            XML::gotoEndElementOfTag(r, tag);
-
             // number of slices
         } else if (tag == Tag::NumSlices) {
             XML::readAttribute(r, XML::Attrib::value, &m_numSlices);
diff --git a/GUI/Model/Sample/ParticleItem.cpp b/GUI/Model/Sample/ParticleItem.cpp
index aa7ae2c9a14d17b579366a5ba5fb1f97e818de5f..08ee3602365e945e1bcb0398a7dc99fafbafac38 100644
--- a/GUI/Model/Sample/ParticleItem.cpp
+++ b/GUI/Model/Sample/ParticleItem.cpp
@@ -26,7 +26,7 @@ namespace {
 namespace Tag {
 
 const QString FormFactor("FormFactor");
-const QString MaterialId("MaterialId");
+const QString MaterialData("MaterialData");
 const QString BaseData("BaseData");
 
 } // namespace Tag
@@ -72,9 +72,9 @@ void ParticleItem::writeTo(QXmlStreamWriter *w) const
     ItemWithParticles::writeTo(w);
     w->writeEndElement();
 
-    // material id
-    w->writeStartElement(Tag::MaterialId);
-    XML::writeAttribute(w, XML::Attrib::value, m_materialIdentifier);
+    // material data
+    w->writeStartElement(Tag::MaterialData);
+    ItemWithMaterial::writeTo(w);
     w->writeEndElement();
 
     // form factor
@@ -96,9 +96,9 @@ void ParticleItem::readFrom(QXmlStreamReader *r)
             ItemWithParticles::readFrom(r);
             XML::gotoEndElementOfTag(r, tag);
 
-            // material id
-        } else if (tag == Tag::MaterialId) {
-            XML::readAttribute(r, XML::Attrib::value, &m_materialIdentifier);
+            // material data
+        } else if (tag == Tag::MaterialData) {
+            ItemWithMaterial::readFrom(r);
             XML::gotoEndElementOfTag(r, tag);
 
             // form factor