diff --git a/GUI/Model/Device/RectangularDetectorItem.h b/GUI/Model/Device/RectangularDetectorItem.h
index 209ece888e32b1aa3904fd8e34791314adc62d2e..84c69a0b4f62c8977301a6f145145d5c86af4074 100644
--- a/GUI/Model/Device/RectangularDetectorItem.h
+++ b/GUI/Model/Device/RectangularDetectorItem.h
@@ -16,7 +16,6 @@
 #define BORNAGAIN_GUI_MODEL_DEVICE_RECTANGULARDETECTORITEM_H
 
 #include "Device/Detector/RectangularDetector.h"
-#include "GUI/Model/Descriptor/DoubleProperty.h"
 #include "GUI/Model/Descriptor/VectorProperty.h"
 #include "GUI/Model/Device/DetectorItems.h"
 
diff --git a/GUI/Model/FromCore/ItemizeSample.cpp b/GUI/Model/FromCore/ItemizeSample.cpp
index 8e77332fffa78a3520e17ad15a4d167aaee9700e..ea8d8db7ab467ef5dc176accc37dca201bb15825 100644
--- a/GUI/Model/FromCore/ItemizeSample.cpp
+++ b/GUI/Model/FromCore/ItemizeSample.cpp
@@ -631,7 +631,7 @@ MultiLayerItem* itemizeSample(const MultiLayer& sample, const QString& nodeName)
     auto* result = new MultiLayerItem();
     result->setSampleName(nodeName.isEmpty() ? QString::fromStdString(sample.sampleName())
                                              : nodeName);
-    result->crossCorrLength().set(sample.crossCorrLength());
+    result->setCrossCorLength(sample.crossCorrLength());
     result->setExternalField(sample.externalField());
 
     MaterialItems& matItems = result->materialItems();
diff --git a/GUI/Model/Model/ParameterTreeUtils.cpp b/GUI/Model/Model/ParameterTreeUtils.cpp
index a7424f03ec5878c78e98784d7ce4000284dd320d..d8c4730ac9bf9b0cb8a2821a7466ffe2c596f9fc 100644
--- a/GUI/Model/Model/ParameterTreeUtils.cpp
+++ b/GUI/Model/Model/ParameterTreeUtils.cpp
@@ -111,7 +111,7 @@ void ParameterTreeBuilder::addSample()
     auto* label = new ParameterLabelItem("Sample", parameterContainer()->parameterTreeRoot());
     addParameterItem(label, m_jobItem->sampleItem()->crossCorrLength());
     if (allowMagneticFields())
-        addParameterItem(label, m_jobItem->sampleItem()->externalFieldVector());
+        addParameterItem(label, m_jobItem->sampleItem()->externalField());
 
     int iLayer = 0;
     for (auto* layer : m_jobItem->sampleItem()->layers()) {
diff --git a/GUI/Model/Sample/ItemWithParticles.h b/GUI/Model/Sample/ItemWithParticles.h
index 390cd944668aba08ca588dba86bddc250ec05d7d..c592e60a29db5614953021f2bdcde8e0f52e7c42 100644
--- a/GUI/Model/Sample/ItemWithParticles.h
+++ b/GUI/Model/Sample/ItemWithParticles.h
@@ -15,7 +15,6 @@
 #ifndef BORNAGAIN_GUI_MODEL_SAMPLE_ITEMWITHPARTICLES_H
 #define BORNAGAIN_GUI_MODEL_SAMPLE_ITEMWITHPARTICLES_H
 
-#include "GUI/Model/Descriptor/DoubleProperty.h"
 #include "GUI/Model/Descriptor/SelectionProperty.h"
 #include "GUI/Model/Descriptor/VectorProperty.h"
 #include "GUI/Model/Sample/Item3D.h"
diff --git a/GUI/Model/Sample/MaterialItem.cpp b/GUI/Model/Sample/MaterialItem.cpp
index 80852cbe3f7e68da070e4519c79d5090ef761bd0..502c37f9034ce1f1bcc78d2330abd4d56cf43ffc 100644
--- a/GUI/Model/Sample/MaterialItem.cpp
+++ b/GUI/Model/Sample/MaterialItem.cpp
@@ -95,25 +95,45 @@ void MaterialItem::setScatteringLengthDensity(const complex_t sld)
     emit dataChanged();
 }
 
-DoubleDescriptor MaterialItem::delta()
+DoubleProperty& MaterialItem::delta()
+{
+    return const_cast<DoubleProperty&>(const_cast<const MaterialItem*>(this)->delta());
+}
+
+const DoubleProperty& MaterialItem::delta() const
 {
     ASSERT(hasRefractiveIndex());
     return m_delta;
 }
 
-DoubleDescriptor MaterialItem::beta()
+DoubleProperty& MaterialItem::beta()
+{
+    return const_cast<DoubleProperty&>(const_cast<const MaterialItem*>(this)->beta());
+}
+
+const DoubleProperty& MaterialItem::beta() const
 {
     ASSERT(hasRefractiveIndex());
     return m_beta;
 }
 
-DoubleDescriptor MaterialItem::sldRe()
+DoubleProperty& MaterialItem::sldRe()
+{
+    return const_cast<DoubleProperty&>(const_cast<const MaterialItem*>(this)->sldRe());
+}
+
+const DoubleProperty& MaterialItem::sldRe() const
 {
     ASSERT(!hasRefractiveIndex());
     return m_sldRe;
 }
 
-DoubleDescriptor MaterialItem::sldIm()
+DoubleProperty& MaterialItem::sldIm()
+{
+    return const_cast<DoubleProperty&>(const_cast<const MaterialItem*>(this)->sldIm());
+}
+
+const DoubleProperty& MaterialItem::sldIm() const
 {
     ASSERT(!hasRefractiveIndex());
     return m_sldIm;
@@ -161,10 +181,6 @@ void MaterialItem::setColor(const QColor& color)
     }
 }
 
-R3 MaterialItem::magnetization() const
-{
-    return m_magnetization;
-}
 
 void MaterialItem::setMagnetization(const R3& magnetization)
 {
diff --git a/GUI/Model/Sample/MaterialItem.h b/GUI/Model/Sample/MaterialItem.h
index 093e43866499337164f2d2dfe4f452cd63321a0d..b44d4c127225d7141e7285bf2e974f56acd67f4d 100644
--- a/GUI/Model/Sample/MaterialItem.h
+++ b/GUI/Model/Sample/MaterialItem.h
@@ -15,7 +15,6 @@
 #ifndef BORNAGAIN_GUI_MODEL_SAMPLE_MATERIALITEM_H
 #define BORNAGAIN_GUI_MODEL_SAMPLE_MATERIALITEM_H
 
-#include "GUI/Model/Descriptor/DoubleProperty.h"
 #include "GUI/Model/Descriptor/VectorProperty.h"
 #include <QColor>
 #include <QObject>
@@ -52,11 +51,22 @@ public:
     //! Turns material into SLD based material.
     void setScatteringLengthDensity(complex_t sld);
 
-    DoubleDescriptor delta();
-    DoubleDescriptor beta();
-    DoubleDescriptor sldRe();
-    DoubleDescriptor sldIm();
+    DoubleProperty& delta();
+    const DoubleProperty& delta() const;
+
+    DoubleProperty& beta();
+    const DoubleProperty& beta() const;
+
+    DoubleProperty& sldRe();
+    const DoubleProperty& sldRe() const;
+
+    DoubleProperty& sldIm();
+    const DoubleProperty& sldIm() const;
+
+    VectorProperty& magnetizationVector() { return m_magnetization; }
     const VectorProperty& magnetizationVector() const { return m_magnetization; }
+    R3 magnetization() const { return m_magnetization; }
+    void setMagnetization(const R3& magnetization);
 
     /// \return true if refractive index was given, otherwise SLD was given
     bool hasRefractiveIndex() const;
@@ -70,9 +80,6 @@ public:
     QColor color() const;
     void setColor(const QColor& color);
 
-    R3 magnetization() const;
-    void setMagnetization(const R3& magnetization);
-
     std::unique_ptr<Material> createMaterial() const;
 
     void serialize(Streamer& s);
diff --git a/GUI/Model/Sample/MultiLayerItem.cpp b/GUI/Model/Sample/MultiLayerItem.cpp
index 428a82c1733a6fbf41d3b7ed795c13c8c2181789..32a371ce4b1c77290e9c32ec6529e6d4fa7cdc62 100644
--- a/GUI/Model/Sample/MultiLayerItem.cpp
+++ b/GUI/Model/Sample/MultiLayerItem.cpp
@@ -34,9 +34,9 @@ const QString ExternalField("ExternalField");
 MultiLayerItem::MultiLayerItem()
 {
     m_name = "Sample";
-    m_crossCorrelationLength.init("Cross-correlation length",
-                                  "Cross correlation length of roughnesses between interfaces", 0.0,
-                                  Unit::nanometer, 5, RealLimits::nonnegative(), "cross");
+    m_crossCorrelationLength.init(
+        "Cross-correlation length", "Cross correlation length of roughnesses between interfaces",
+        0.0, Unit::nanometer, 5 /* decimals */, RealLimits::nonnegative(), "cross");
     m_externalField.init("External field", "External field (A/m)", "A/m", "extField");
 }
 
@@ -61,41 +61,6 @@ void MultiLayerItem::addStandardMaterials()
     m_materials.addRefractiveMaterial("Substrate", 6e-6, 2e-8);
 }
 
-QString MultiLayerItem::sampleName() const
-{
-    return m_name;
-}
-
-void MultiLayerItem::setSampleName(const QString& name)
-{
-    m_name = name;
-}
-
-QString MultiLayerItem::description() const
-{
-    return m_description;
-}
-
-void MultiLayerItem::setDescription(const QString& description)
-{
-    m_description = description;
-}
-
-DoubleDescriptor MultiLayerItem::crossCorrLength() const
-{
-    return m_crossCorrelationLength;
-}
-
-R3 MultiLayerItem::externalField() const
-{
-    return m_externalField;
-}
-
-void MultiLayerItem::setExternalField(const R3& externalField)
-{
-    m_externalField.set(externalField);
-}
-
 QVector<LayerItem*> MultiLayerItem::layers() const
 {
     return m_layers;
@@ -167,13 +132,3 @@ void MultiLayerItem::serialize(Streamer& s)
         }
     }
 }
-
-const MaterialItems& MultiLayerItem::materialItems() const
-{
-    return m_materials;
-}
-
-MaterialItems& MultiLayerItem::materialItems()
-{
-    return m_materials;
-}
diff --git a/GUI/Model/Sample/MultiLayerItem.h b/GUI/Model/Sample/MultiLayerItem.h
index 1287ed48b8e0a1b02503273d636ad03ca617e05c..f55205b073a3ede0d882d0e030fe0cf7edfc3e90 100644
--- a/GUI/Model/Sample/MultiLayerItem.h
+++ b/GUI/Model/Sample/MultiLayerItem.h
@@ -15,7 +15,6 @@
 #ifndef BORNAGAIN_GUI_MODEL_SAMPLE_MULTILAYERITEM_H
 #define BORNAGAIN_GUI_MODEL_SAMPLE_MULTILAYERITEM_H
 
-#include "GUI/Model/Descriptor/DoubleProperty.h"
 #include "GUI/Model/Descriptor/VectorProperty.h"
 #include "GUI/Model/Sample/Item3D.h"
 #include "GUI/Model/Sample/MaterialItems.h"
@@ -39,17 +38,19 @@ public:
 
     void addStandardMaterials();
 
-    QString sampleName() const;
-    void setSampleName(const QString& name);
+    QString sampleName() const { return m_name; }
+    void setSampleName(const QString& s) { m_name = s; }
 
-    QString description() const;
-    void setDescription(const QString& description);
+    QString description() const { return m_description; }
+    void setDescription(const QString& s) { m_description = s; }
 
-    DoubleDescriptor crossCorrLength() const;
+    DoubleProperty& crossCorrLength() { return m_crossCorrelationLength; }
+    const DoubleProperty& crossCorrLength() const { return m_crossCorrelationLength; }
+    void setCrossCorLength(double d) { m_crossCorrelationLength.set(d); }
 
-    R3 externalField() const;
-    void setExternalField(const R3& externalField);
-    const VectorProperty& externalFieldVector() const { return m_externalField; }
+    VectorProperty& externalField() { return m_externalField; }
+    const VectorProperty& externalField() const { return m_externalField; }
+    void setExternalField(const R3& r) { m_externalField.set(r); }
 
     QVector<LayerItem*> layers() const;
 
@@ -66,8 +67,8 @@ public:
     void readContentFrom(QXmlStreamReader* reader);
     void serialize(Streamer& s);
 
-    MaterialItems& materialItems();
-    const MaterialItems& materialItems() const;
+    MaterialItems& materialItems() { return m_materials; }
+    const MaterialItems& materialItems() const { return m_materials; }
 
 private:
     QString m_name;
diff --git a/GUI/View/SampleDesigner/MultiLayerForm.cpp b/GUI/View/SampleDesigner/MultiLayerForm.cpp
index 78f2cc0f2a38fb0ffe106a686dfe55b865318184..99af67127df0951a895fda08c484305da9459d20 100644
--- a/GUI/View/SampleDesigner/MultiLayerForm.cpp
+++ b/GUI/View/SampleDesigner/MultiLayerForm.cpp
@@ -86,7 +86,7 @@ MultiLayerForm::MultiLayerForm(QWidget* parent, MultiLayerItem* sampleItem,
             [=]() { m_ec->setSampleDescription(descriptionEdit->toPlainText()); });
 
     layouter.addValue(sampleItem->crossCorrLength());
-    layouter.addVector(sampleItem->externalFieldVector(), false);
+    layouter.addVector(sampleItem->externalField(), false);
     auto* collapser = GroupBoxCollapser::installIntoGroupBox(props, false);
 
     auto* showInRealspaceAction = ActionFactory::createShowInRealspaceAction(