diff --git a/GUI/Model/Material/MaterialModel.cpp b/GUI/Model/Material/MaterialModel.cpp
index b70ba9e0bb899afbf24b3081da0870f90ec766e6..b0ccfbb5aa025183f7322bd0527bb833118f38fa 100644
--- a/GUI/Model/Material/MaterialModel.cpp
+++ b/GUI/Model/Material/MaterialModel.cpp
@@ -62,12 +62,28 @@ void MaterialModel::clear()
     m_materialItems.clear();
 }
 
+void MaterialModel::addMaterial(MaterialItem* material)
+{
+    addMaterial(material, true);
+}
+
+void MaterialModel::addMaterial(MaterialItem* material, bool signalAdding)
+{
+    ASSERT(material);
+    material->disconnect(this);
+    m_materialItems << material;
+    connect(material, &MaterialItem::dataChanged, this, [=] { emit materialChanged(material); });
+
+    if (signalAdding)
+        emit materialAddedOrRemoved();
+}
+
 MaterialModel* MaterialModel::createCopy() const
 {
     auto* result = new MaterialModel();
 
     for (const auto* m : m_materialItems)
-        result->m_materialItems << new MaterialItem(*m);
+        result->addMaterial(new MaterialItem(*m));
 
     return result;
 }
@@ -78,8 +94,7 @@ MaterialItem* MaterialModel::addRefractiveMaterial(const QString& name, double d
     materialItem->setMaterialName(name);
     materialItem->setColor(suggestMaterialColor(name));
     materialItem->setRefractiveIndex(delta, beta);
-    m_materialItems << materialItem;
-    emit materialAddedOrRemoved();
+    addMaterial(materialItem);
 
     return materialItem;
 }
@@ -90,8 +105,7 @@ MaterialItem* MaterialModel::addSLDMaterial(const QString& name, double sld, dou
     materialItem->setMaterialName(name);
     materialItem->setColor(suggestMaterialColor(name));
     materialItem->setScatteringLengthDensity(complex_t(sld, abs_term));
-    m_materialItems << materialItem;
-    emit materialAddedOrRemoved();
+    addMaterial(materialItem);
 
     return materialItem;
 }
@@ -119,8 +133,7 @@ MaterialItem* MaterialModel::insertCopy(const MaterialItem& material)
     auto* newMaterial = new MaterialItem(material);
     newMaterial->createNewIdentifier();
     newMaterial->setMaterialName(material.materialName() + " (copy)");
-    m_materialItems << newMaterial;
-    emit materialAddedOrRemoved();
+    addMaterial(newMaterial);
 
     return newMaterial;
 }
@@ -181,7 +194,7 @@ void MaterialModel::readContentFrom(QXmlStreamReader* reader)
         if (reader->name() == "Material") {
             MaterialItem* m = new MaterialItem;
             m->readContentFrom(reader);
-            m_materialItems << m;
+            addMaterial(m, false);
             reader->skipCurrentElement();
         }
     }
@@ -209,7 +222,7 @@ void MaterialModel::initFrom(const MaterialModel& from)
     // copy new ones
     for (const auto* m : from.materialItems())
         if (!findMaterialItem(m->identifier())) {
-            m_materialItems << new MaterialItem(*m);
+            addMaterial(new MaterialItem(*m), false);
             anyAddedOrRemoved = true;
         }
 
diff --git a/GUI/Model/Material/MaterialModel.h b/GUI/Model/Material/MaterialModel.h
index 1156e4a4dfa2e97f456ec90017b8fc849c8620f2..96ff5b68f7214ef40b3364750463dab798b2a696 100644
--- a/GUI/Model/Material/MaterialModel.h
+++ b/GUI/Model/Material/MaterialModel.h
@@ -31,6 +31,9 @@ public:
 
     void clear();
 
+    //! Add the material and take ownership of it.
+    void addMaterial(MaterialItem* material);
+
     MaterialModel* createCopy() const;
 
     MaterialItem* addRefractiveMaterial(const QString& name, double delta, double beta);
@@ -67,7 +70,13 @@ signals:
     void materialChanged(MaterialItem* materialItem);
 
 private:
-    QVector<MaterialItem*> m_materialItems;
+    //! Add the material and take ownership of it.
+    //!
+    //! In the given flag the signal "materialAddedOrRemoved" can be suppressed.
+    void addMaterial(MaterialItem* material, bool signalAdding);
+
+private:
+    QVector<MaterialItem*> m_materialItems; //!< all materials (owned by this class)
 };
 
 #endif // BORNAGAIN_GUI_MODEL_MATERIAL_MATERIALMODEL_H
diff --git a/GUI/View/SampleDesigner/LayerForm.cpp b/GUI/View/SampleDesigner/LayerForm.cpp
index 8d424affb24ef23aec8ba8b49000e59ae2836f3b..32237a2958fc4ee52c893e6a77ae6b3094ff06e3 100644
--- a/GUI/View/SampleDesigner/LayerForm.cpp
+++ b/GUI/View/SampleDesigner/LayerForm.cpp
@@ -13,6 +13,8 @@
 //  ************************************************************************************************
 
 #include "GUI/View/SampleDesigner/LayerForm.h"
+#include "GUI/Model/Material/MaterialItem.h"
+#include "GUI/Model/Material/MaterialModel.h"
 #include "GUI/Model/Sample/LayerItem.h"
 #include "GUI/Model/Sample/MultiLayerItem.h"
 #include "GUI/Model/Types/UIntDescriptor.h"
@@ -90,6 +92,10 @@ LayerForm::LayerForm(QWidget* parent, LayerItem* layer, SampleEditorController*
     m_structureEditingWidgets << btn;
     m_layouter->addStructureEditingRow(btn);
 
+    // listen to changes in materials to update the title (contains the material name). Necessary
+    // to reflect e.g. a name change done in the material editor.
+    connect(ec->materialModel(), &MaterialModel::materialChanged, this, &LayerForm::updateTitle);
+
     updateLayerPositionDependentElements();
 }
 
diff --git a/GUI/View/SampleDesigner/MaterialInplaceForm.cpp b/GUI/View/SampleDesigner/MaterialInplaceForm.cpp
index 20d18d4951907f23235c8539004db1d63155dcc3..7a123f8a54c847645211b4f0e3f6a284c5077ab9 100644
--- a/GUI/View/SampleDesigner/MaterialInplaceForm.cpp
+++ b/GUI/View/SampleDesigner/MaterialInplaceForm.cpp
@@ -39,7 +39,7 @@ MaterialInplaceForm::MaterialInplaceForm(QWidget* parent, ItemWithMaterial* item
     m_layout->setContentsMargins(0, 0, 0, 0);
     createWidgets();
 
-    connect(ec->materialModel(), &MaterialModel::materialChanged, this,
+    connect(itemWithMaterial()->materialItem(), &MaterialItem::dataChanged, this,
             &MaterialInplaceForm::onMaterialChanged);
 }
 
@@ -66,9 +66,12 @@ void MaterialInplaceForm::selectMaterial()
         baWin, m_ec->projectDocument(), m_item->materialIdentifier());
 
     if (!newMaterialIdentifier.isEmpty() && newMaterialIdentifier != m_item->materialIdentifier()) {
+        itemWithMaterial()->materialItem()->disconnect(this);
         GUI::Util::Layout::clearLayout(m_layout, true);
         m_ec->selectMaterial(m_item, newMaterialIdentifier);
         createWidgets();
+        connect(itemWithMaterial()->materialItem(), &MaterialItem::dataChanged, this,
+                &MaterialInplaceForm::onMaterialChanged);
     } else
         updateValues(); // necessary, since in the material editor the values could have been
                         // changed without selecting a different material
@@ -115,8 +118,7 @@ void MaterialInplaceForm::createWidgets()
     m_layout->addItem(new QSpacerItem(0, 0, QSizePolicy::Expanding), 0, m_layout->columnCount());
 }
 
-void MaterialInplaceForm::onMaterialChanged(MaterialItem* materialItem)
+void MaterialInplaceForm::onMaterialChanged()
 {
-    if (materialItem->identifier() == m_item->materialIdentifier())
-        updateValues();
+    updateValues();
 }
diff --git a/GUI/View/SampleDesigner/MaterialInplaceForm.h b/GUI/View/SampleDesigner/MaterialInplaceForm.h
index bc8325fa3514d4bb931b99295c2f20bc4619ed9c..db0fd6b063cc45b1df8c457018ff5e2b668b4272 100644
--- a/GUI/View/SampleDesigner/MaterialInplaceForm.h
+++ b/GUI/View/SampleDesigner/MaterialInplaceForm.h
@@ -34,7 +34,7 @@ public:
 private:
     void selectMaterial();
     void createWidgets();
-    void onMaterialChanged(MaterialItem* materialItem);
+    void onMaterialChanged();
 
     ItemWithMaterial* m_item;
     SampleEditorController* m_ec;