diff --git a/GUI/Model/Sample/FormFactorItems.cpp b/GUI/Model/Sample/FormFactorItems.cpp
index 86a6a96bd0b2c178df2b9d439ea3daefc895e8cb..ed7f8ef94eee2600c500f376f51a6d95e08b7d9b 100644
--- a/GUI/Model/Sample/FormFactorItems.cpp
+++ b/GUI/Model/Sample/FormFactorItems.cpp
@@ -417,3 +417,10 @@ std::unique_ptr<IBornFF> TruncatedSpheroidItem::createFormFactor() const
     return std::make_unique<FormFactorTruncatedSpheroid>(radius(), height(), heightFlattening(),
                                                          removedTop());
 }
+
+void FormFactorItem::serialize(Serializer& s)
+{
+    s.assertVersion(0);
+    for (auto* p : serializationProperties())
+        s.rw(*p);
+}
diff --git a/GUI/Model/Sample/FormFactorItems.h b/GUI/Model/Sample/FormFactorItems.h
index 613ab0fb6b75f47fbdb3773cc4e24d5540cf4580..9aeb84e7e0ede36627348610dd35e749ec6567a0 100644
--- a/GUI/Model/Sample/FormFactorItems.h
+++ b/GUI/Model/Sample/FormFactorItems.h
@@ -15,7 +15,9 @@
 #ifndef BORNAGAIN_GUI_MODEL_SAMPLE_FORMFACTORITEMS_H
 #define BORNAGAIN_GUI_MODEL_SAMPLE_FORMFACTORITEMS_H
 
+#include "GUI/Model/Session/Serializer.h"
 #include "GUI/Model/Types/DoubleProperty.h"
+#include <QVector>
 #include <memory>
 
 class IBornFF;
@@ -36,6 +38,8 @@ public:
 public:
     virtual std::unique_ptr<IBornFF> createFormFactor() const = 0;
     virtual DoubleDescriptors geometryValues() const = 0;
+    virtual QVector<DoubleProperty*> serializationProperties() = 0;
+    virtual void serialize(Serializer& s);
 };
 
 class AnisoPyramidItem : public FormFactorItem {
@@ -52,6 +56,10 @@ public:
     {
         return {length(), width(), height(), alpha()};
     }
+    QVector<DoubleProperty*> serializationProperties() override
+    {
+        return {&m_length, &m_width, &m_height, &m_alpha};
+    }
 };
 
 class BarGaussItem : public FormFactorItem {
@@ -64,6 +72,10 @@ public:
     FF_PROPERTY(height, Height)
 
     DoubleDescriptors geometryValues() const override { return {length(), width(), height()}; }
+    QVector<DoubleProperty*> serializationProperties() override
+    {
+        return {&m_length, &m_width, &m_height};
+    }
 };
 
 class BarLorentzItem : public FormFactorItem {
@@ -76,6 +88,10 @@ public:
     FF_PROPERTY(height, Height)
 
     DoubleDescriptors geometryValues() const override { return {length(), width(), height()}; }
+    QVector<DoubleProperty*> serializationProperties() override
+    {
+        return {&m_length, &m_width, &m_height};
+    }
 };
 
 class BoxItem : public FormFactorItem {
@@ -88,6 +104,10 @@ public:
     FF_PROPERTY(height, Height)
 
     DoubleDescriptors geometryValues() const override { return {length(), width(), height()}; }
+    QVector<DoubleProperty*> serializationProperties() override
+    {
+        return {&m_length, &m_width, &m_height};
+    }
 };
 
 class ConeItem : public FormFactorItem {
@@ -100,6 +120,10 @@ public:
     FF_PROPERTY(alpha, Alpha)
 
     DoubleDescriptors geometryValues() const override { return {radius(), height(), alpha()}; }
+    QVector<DoubleProperty*> serializationProperties() override
+    {
+        return {&m_radius, &m_height, &m_alpha};
+    }
 };
 
 class Cone6Item : public FormFactorItem {
@@ -112,6 +136,10 @@ public:
     FF_PROPERTY(alpha, Alpha)
 
     DoubleDescriptors geometryValues() const override { return {baseEdge(), height(), alpha()}; }
+    QVector<DoubleProperty*> serializationProperties() override
+    {
+        return {&m_baseEdge, &m_height, &m_alpha};
+    }
 };
 
 class CuboctahedronItem : public FormFactorItem {
@@ -128,6 +156,10 @@ public:
     {
         return {length(), height(), heightRatio(), alpha()};
     }
+    QVector<DoubleProperty*> serializationProperties() override
+    {
+        return {&m_length, &m_height, &m_heightRatio, &m_alpha};
+    }
 };
 
 class CylinderItem : public FormFactorItem {
@@ -139,6 +171,7 @@ public:
     FF_PROPERTY(height, Height)
 
     DoubleDescriptors geometryValues() const override { return {radius(), height()}; }
+    QVector<DoubleProperty*> serializationProperties() override { return {&m_radius, &m_height}; }
 };
 
 class DodecahedronItem : public FormFactorItem {
@@ -149,6 +182,7 @@ public:
     FF_PROPERTY(edge, Edge)
 
     DoubleDescriptors geometryValues() const override { return {edge()}; }
+    QVector<DoubleProperty*> serializationProperties() override { return {&m_edge}; }
 };
 
 class EllipsoidalCylinderItem : public FormFactorItem {
@@ -161,6 +195,10 @@ public:
     FF_PROPERTY(height, Height)
 
     DoubleDescriptors geometryValues() const override { return {radiusX(), radiusY(), height()}; }
+    QVector<DoubleProperty*> serializationProperties() override
+    {
+        return {&m_radiusX, &m_radiusY, &m_height};
+    }
 };
 
 class FullSphereItem : public FormFactorItem {
@@ -171,6 +209,7 @@ public:
     FF_PROPERTY(radius, Radius)
 
     DoubleDescriptors geometryValues() const override { return {radius()}; }
+    QVector<DoubleProperty*> serializationProperties() override { return {&m_radius}; }
 };
 
 class FullSpheroidItem : public FormFactorItem {
@@ -182,6 +221,7 @@ public:
     FF_PROPERTY(height, Height)
 
     DoubleDescriptors geometryValues() const override { return {radius(), height()}; }
+    QVector<DoubleProperty*> serializationProperties() override { return {&m_radius, &m_height}; }
 };
 
 class HemiEllipsoidItem : public FormFactorItem {
@@ -194,6 +234,10 @@ public:
     FF_PROPERTY(height, Height)
 
     DoubleDescriptors geometryValues() const override { return {radiusX(), radiusY(), height()}; }
+    QVector<DoubleProperty*> serializationProperties() override
+    {
+        return {&m_radiusX, &m_radiusY, &m_height};
+    }
 };
 
 class IcosahedronItem : public FormFactorItem {
@@ -204,6 +248,7 @@ public:
     FF_PROPERTY(edge, Edge)
 
     DoubleDescriptors geometryValues() const override { return {edge()}; }
+    QVector<DoubleProperty*> serializationProperties() override { return {&m_edge}; }
 };
 
 class Prism3Item : public FormFactorItem {
@@ -215,6 +260,7 @@ public:
     FF_PROPERTY(height, Height)
 
     DoubleDescriptors geometryValues() const override { return {baseEdge(), height()}; }
+    QVector<DoubleProperty*> serializationProperties() override { return {&m_baseEdge, &m_height}; }
 };
 
 class Prism6Item : public FormFactorItem {
@@ -226,6 +272,7 @@ public:
     FF_PROPERTY(height, Height)
 
     DoubleDescriptors geometryValues() const override { return {baseEdge(), height()}; }
+    QVector<DoubleProperty*> serializationProperties() override { return {&m_baseEdge, &m_height}; }
 };
 
 class PyramidItem : public FormFactorItem {
@@ -238,6 +285,10 @@ public:
     FF_PROPERTY(alpha, Alpha)
 
     DoubleDescriptors geometryValues() const override { return {baseEdge(), height(), alpha()}; }
+    QVector<DoubleProperty*> serializationProperties() override
+    {
+        return {&m_baseEdge, &m_height, &m_alpha};
+    }
 };
 
 class CosineRippleBoxItem : public FormFactorItem {
@@ -250,6 +301,10 @@ public:
     FF_PROPERTY(height, Height)
 
     DoubleDescriptors geometryValues() const override { return {length(), width(), height()}; }
+    QVector<DoubleProperty*> serializationProperties() override
+    {
+        return {&m_length, &m_width, &m_height};
+    }
 };
 
 class CosineRippleGaussItem : public FormFactorItem {
@@ -262,6 +317,10 @@ public:
     FF_PROPERTY(height, Height)
 
     DoubleDescriptors geometryValues() const override { return {length(), width(), height()}; }
+    QVector<DoubleProperty*> serializationProperties() override
+    {
+        return {&m_length, &m_width, &m_height};
+    }
 };
 
 class CosineRippleLorentzItem : public FormFactorItem {
@@ -274,6 +333,10 @@ public:
     FF_PROPERTY(height, Height)
 
     DoubleDescriptors geometryValues() const override { return {length(), width(), height()}; }
+    QVector<DoubleProperty*> serializationProperties() override
+    {
+        return {&m_length, &m_width, &m_height};
+    }
 };
 
 class SawtoothRippleBoxItem : public FormFactorItem {
@@ -290,6 +353,10 @@ public:
     {
         return {length(), width(), height(), asymmetry()};
     }
+    QVector<DoubleProperty*> serializationProperties() override
+    {
+        return {&m_length, &m_width, &m_height, &m_asymmetry};
+    }
 };
 
 class SawtoothRippleGaussItem : public FormFactorItem {
@@ -306,6 +373,10 @@ public:
     {
         return {length(), width(), height(), asymmetry()};
     }
+    QVector<DoubleProperty*> serializationProperties() override
+    {
+        return {&m_length, &m_width, &m_height, &m_asymmetry};
+    }
 };
 
 class SawtoothRippleLorentzItem : public FormFactorItem {
@@ -322,6 +393,10 @@ public:
     {
         return {length(), width(), height(), asymmetry()};
     }
+    QVector<DoubleProperty*> serializationProperties() override
+    {
+        return {&m_length, &m_width, &m_height, &m_asymmetry};
+    }
 };
 
 class TetrahedronItem : public FormFactorItem {
@@ -334,6 +409,10 @@ public:
     FF_PROPERTY(alpha, Alpha)
 
     DoubleDescriptors geometryValues() const override { return {baseEdge(), height(), alpha()}; }
+    QVector<DoubleProperty*> serializationProperties() override
+    {
+        return {&m_baseEdge, &m_height, &m_alpha};
+    }
 };
 
 class TruncatedCubeItem : public FormFactorItem {
@@ -345,6 +424,10 @@ public:
     FF_PROPERTY(removedLength, RemovedLength)
 
     DoubleDescriptors geometryValues() const override { return {length(), removedLength()}; }
+    QVector<DoubleProperty*> serializationProperties() override
+    {
+        return {&m_length, &m_removedLength};
+    }
 };
 
 class TruncatedSphereItem : public FormFactorItem {
@@ -357,6 +440,10 @@ public:
     FF_PROPERTY(removedTop, RemovedTop)
 
     DoubleDescriptors geometryValues() const override { return {radius(), height(), removedTop()}; }
+    QVector<DoubleProperty*> serializationProperties() override
+    {
+        return {&m_radius, &m_height, &m_removedTop};
+    }
 };
 
 class TruncatedSpheroidItem : public FormFactorItem {
@@ -373,6 +460,10 @@ public:
     {
         return {radius(), height(), heightFlattening(), removedTop()};
     }
+    QVector<DoubleProperty*> serializationProperties() override
+    {
+        return {&m_radius, &m_height, &m_heightFlattening, &m_removedTop};
+    }
 };
 
 #endif // BORNAGAIN_GUI_MODEL_SAMPLE_FORMFACTORITEMS_H