diff --git a/GUI/coregui/Models/BeamAngleItems.cpp b/GUI/coregui/Models/BeamAngleItems.cpp
index aef7898eca6cb4ec151bcef218ad8055108fb69d..18b6608e9710bee84d366559eca4ea172e592eb9 100644
--- a/GUI/coregui/Models/BeamAngleItems.cpp
+++ b/GUI/coregui/Models/BeamAngleItems.cpp
@@ -26,8 +26,8 @@ BeamInclinationAngleItem::BeamInclinationAngleItem()
     getPropertyAttribute(BeamDistributionItem::P_CACHED_VALUE).setHidden().limited(0.0, 90.0).setDecimals(3);
     setRegisteredProperty(BeamDistributionItem::P_CACHED_VALUE, 0.2);
 
-    auto x = getSubItems();
-    ParameterizedItem *distribution = dynamic_cast<DistributionNoneItem *>(x[P_DISTRIBUTION]);
+    auto x = getSubItems();
+    ParameterizedItem *distribution = dynamic_cast<DistributionNoneItem *>(x[P_DISTRIBUTION]);
     Q_ASSERT(distribution);
     distribution->getPropertyAttribute(DistributionNoneItem::P_VALUE).limited(0.0, 90.0).setDecimals(3);
 }
@@ -35,7 +35,7 @@ BeamInclinationAngleItem::BeamInclinationAngleItem()
 std::unique_ptr<IDistribution1D> BeamInclinationAngleItem::createDistribution1D()
 {
     std::unique_ptr<IDistribution1D> P_distribution {};
-    if(DistributionItem *distributionItem = dynamic_cast<DistributionItem *>(getSubItems()[P_DISTRIBUTION])) {
+    if(DistributionItem *distributionItem = dynamic_cast<DistributionItem *>(getGroupProperty(P_DISTRIBUTION))) {
         P_distribution = BeamAngleHelper::creatAngleDistribution(distributionItem);
     }
     return P_distribution;
@@ -48,7 +48,7 @@ BeamAzimuthalAngleItem::BeamAzimuthalAngleItem()
 {
     setRegisteredProperty(BeamDistributionItem::P_CACHED_VALUE, 0.0);
     getPropertyAttribute(BeamDistributionItem::P_CACHED_VALUE).setHidden().limited(-90.0, 90.0).setDecimals(3);
-    ParameterizedItem *distribution = dynamic_cast<DistributionNoneItem *>(getSubItems()[P_DISTRIBUTION]);
+    ParameterizedItem *distribution = dynamic_cast<DistributionNoneItem *>(getGroupProperty(P_DISTRIBUTION));
     Q_ASSERT(distribution);
     distribution->getPropertyAttribute(DistributionNoneItem::P_VALUE).limited(-90.0, 90.0).setDecimals(3);
 }
diff --git a/GUI/coregui/Models/ModelPath.cpp b/GUI/coregui/Models/ModelPath.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..f92502dead84e1aa14a8d20ff9de86e544f77b18
--- /dev/null
+++ b/GUI/coregui/Models/ModelPath.cpp
@@ -0,0 +1,122 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      coregui/Models/TestItem.cpp
+//! @brief     Implements class TestItem
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "ModelPath.h"
+#include "ParameterizedItem.h"
+#include <QStringList>
+#include <sstream>
+
+
+std::vector<std::unique_ptr<IParameterTranslator>> ModelPath::m_special_translators;
+
+QStringList ModelPath::getParameterTreeList(const ParameterizedItem *item, QString prefix)
+{
+    QStringList result;
+    if (item->modelType() ==  Constants::PropertyType
+            && item->value().type() == QVariant::Double) {
+        result << prefix + item->itemName();
+    } else {
+        if (item->hasChildItems()) {
+            for (auto p_child : item->childItems()) {
+                QString child_name = p_child->itemName();
+                QString child_prefix = prefix + child_name + QString("/");
+                result << getParameterTreeList(p_child, child_prefix);
+            }
+        }
+    }
+    return result;
+}
+
+double ModelPath::getParameterValue(const ParameterizedItem *item, const QString &name)
+{
+    QString head = getFirstField(name);
+    auto p_child = item->getChildByName(head);
+    if (p_child) {
+        return getParameterValue(p_child, stripFirstField(name));
+    }
+    if (item->isRegisteredProperty(head)) {
+        return item->getRegisteredProperty(head).toDouble();
+    } else {
+        return 0.0;
+    }
+}
+
+std::string ModelPath::translateParameterName(const ParameterizedItem *item, const QString &par_name)
+{
+    std::ostringstream result;
+    auto list = splitParameterName(par_name);
+    if (list.isEmpty()) {
+        return std::string();
+    }
+    auto first_field = list[0];
+    result << "/" << translateSingleName(first_field);
+    if (list.size() > 1) {
+        auto remainder = list[1];
+        auto p_child = item->getChildByName(first_field);
+        if (p_child) {
+            result << translateParameterName(p_child, remainder);
+        }
+    }
+    return result.str();
+}
+
+void ModelPath::addParameterTranslator(const IParameterTranslator &translator)
+{
+    m_special_translators.emplace_back(translator.clone());
+}
+
+QStringList ModelPath::splitParameterName(const QString &par_name)
+{
+    QStringList result;
+    for (auto& translator : m_special_translators) {
+        result = translator->split(par_name);
+        if (result.size() > 0) {
+            return result;
+        }
+    }
+    result << getFirstField(par_name);
+    QString remainder = stripFirstField(par_name);
+    if (!remainder.isEmpty()) {
+        result << remainder;
+    }
+    return result;
+}
+
+QString ModelPath::getFirstField(const QString &par_name)
+{
+    QStringList par_list = par_name.split("/");
+    if (par_list.size()==0) return QString();
+    return par_list.front();
+}
+
+QString ModelPath::stripFirstField(const QString &par_name)
+{
+    QStringList par_list = par_name.split("/");
+    if (par_list.size()<2) return QString();
+    par_list.removeFirst();
+    return par_list.join("/");
+}
+
+std::string ModelPath::translateSingleName(const QString &name)
+{
+    for (auto& translator : m_special_translators) {
+        auto result = translator->translate(name);
+        if (!result.empty()) {
+            return result;
+        }
+    }
+    return name.toStdString();
+}
+
diff --git a/GUI/coregui/Models/ModelPath.h b/GUI/coregui/Models/ModelPath.h
new file mode 100644
index 0000000000000000000000000000000000000000..aedb5577975af94bfc9aba949e74607d892d89d5
--- /dev/null
+++ b/GUI/coregui/Models/ModelPath.h
@@ -0,0 +1,58 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      coregui/Models/TestItem.h
+//! @brief     Defines class TestItem
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef MODELPATH_H
+#define MODELPATH_H
+
+#include "WinDllMacros.h"
+#include "ParameterTranslators.h"
+#include <string>
+#include <vector>
+#include <memory>
+
+class ParameterizedItem;
+class QString;
+class QStringList;
+
+class BA_CORE_API_ ModelPath
+{
+public:
+    //! retrieves a list of all parameter names in the ParameterizedItem tree starting
+    //! with this node and prefixes them
+    static QStringList getParameterTreeList(const ParameterizedItem *item, QString prefix = "");
+
+    //! retrieve value of given parameter name
+    static double getParameterValue(const ParameterizedItem *item, const QString &name);
+
+    //! translates the given parameter name to a domain parameter name
+    //! name should start with a child/subitem name or be a direct parameter name
+    static std::string translateParameterName(const ParameterizedItem *item, const QString &par_name);
+
+    static void addParameterTranslator(const IParameterTranslator &translator);
+
+private:
+
+    static QStringList splitParameterName(const QString& par_name);
+
+    static QString getFirstField(const QString &par_name);
+
+    static QString stripFirstField(const QString &par_name);
+
+    static std::string translateSingleName(const QString &name);
+
+    static std::vector<std::unique_ptr<IParameterTranslator>> m_special_translators;
+};
+
+#endif
diff --git a/GUI/coregui/Models/ParameterizedItem.cpp b/GUI/coregui/Models/ParameterizedItem.cpp
index aadd3f9b2eb190653083f95bc765021c3a2b319f..7edefaa4f3990c80c98b9cab7b8da1d92b6ea7b4 100644
--- a/GUI/coregui/Models/ParameterizedItem.cpp
+++ b/GUI/coregui/Models/ParameterizedItem.cpp
@@ -341,7 +341,7 @@ ParameterizedItem *ParameterizedItem::registerGroupProperty(const QString &group
 
 ParameterizedItem *ParameterizedItem::setGroupProperty(const QString &name, const QString &value)
 {
-//    qDebug() << "ParameterizedItem::setGroupProperty()" << name << value;
+    qDebug() << "ParameterizedItem::setGroupProperty()" << name << value;
     if (GroupItem *item = dynamic_cast<GroupItem *>(m_propertyItems[name])) {
         GroupProperty_t group_property = item->group();
         if (!value.isEmpty()) {
@@ -352,6 +352,11 @@ ParameterizedItem *ParameterizedItem::setGroupProperty(const QString &name, cons
     return nullptr;
 }
 
+ParameterizedItem *ParameterizedItem::getGroupProperty(const QString &name)
+{
+    return setGroupProperty(name);
+}
+
 const PropertyAttribute &ParameterizedItem::getPropertyAttribute(const QString &name) const
 {
     QMap<QString, PropertyAttribute>::const_iterator it = m_property_attribute.find(name);
@@ -529,12 +534,6 @@ QMap<QString, ParameterizedItem *> ParameterizedItem::getSubItems() const
 
 
 
-
-
-
-
-
-
 void ParameterizedItem::onPropertyChange(const QString &name)
 {
     if (mp_parent)
@@ -567,66 +566,6 @@ void ParameterizedItem::print() const
 //    qDebug() << " ";
 }
 
-QStringList ParameterizedItem::getParameterTreeList(QString prefix) const
-{
-    QStringList result;
-    // add child parameters:
-    if (hasChildItems()) {
-        for (auto p_child : m_children) {
-            QString child_name = p_child->displayName();
-            QString child_prefix = prefix + child_name + QString("/");
-            result << p_child->getParameterTreeList(child_prefix);
-        }
-    }
-    // add subitem parameters:
-    /*if (m_sub_items.size() > 0) {
-        for (QMap<QString, ParameterizedItem *>::const_iterator it = m_sub_items.begin();
-             it != m_sub_items.end(); ++it) {
-            const PropertyAttribute &prop_attribute = getPropertyAttribute(it.key());
-            if (prop_attribute.isHidden() || prop_attribute.isDisabled()) continue;
-            ParameterizedItem *p_subitem = it.value();
-            QString subitem_name = p_subitem->displayName();
-            QString subitem_prefix = prefix + subitem_name + QString("/");
-            result << p_subitem->getParameterTreeList(subitem_prefix);
-        }
-    }*/
-    // add own parameters:
-    result << getParameterList(prefix);
-    return result;
-}
-
-double ParameterizedItem::getParameterValue(const QString &name) const
-{
-    QString head = getFirstField(name);
-    auto p_child = getChildByName(head);
-    if (p_child) {
-        return p_child->getParameterValue(stripFirstField(name));
-    }
-    if (isRegisteredProperty(head)) {
-        return getRegisteredProperty(head).toDouble();
-    } else {
-        return 0.0;
-    }
-}
-
-std::string ParameterizedItem::translateParameterName(const QString &par_name) const
-{
-    std::ostringstream result;
-    auto list = splitParameterName(par_name);
-    if (list.isEmpty()) {
-        return std::string();
-    }
-    auto first_field = list[0];
-    result << "/" << translateSingleName(first_field);
-    if (list.size() > 1) {
-        auto remainder = list[1];
-        auto p_child = getChildByName(first_field);
-        if (p_child) {
-            result << p_child->translateParameterName(remainder);
-        }
-    }
-    return result.str();
-}
 
 ////! called when new SubItem appeared
 void ParameterizedItem::onSubItemChanged(const QString &propertyName)
@@ -669,78 +608,3 @@ void ParameterizedItem::processSubItemPropertyChanged(const QString &propertyNam
 //    throw GUIHelpers::Error("ParameterizedItem::onSubItemPropertyChanged() ->"
 //                            " Error. No such propertyItem found");
 }
-
-QStringList ParameterizedItem::splitParameterName(const QString &par_name) const
-{
-    QStringList result;
-    for (auto& translator : m_special_translators) {
-        result = translator->split(par_name);
-        if (result.size() > 0) {
-            return result;
-        }
-    }
-    result << getFirstField(par_name);
-    QString remainder = stripFirstField(par_name);
-    if (!remainder.isEmpty()) {
-        result << remainder;
-    }
-    return result;
-}
-
-QString ParameterizedItem::getFirstField(const QString &par_name) const
-{
-    QStringList par_list = par_name.split("/");
-    if (par_list.size()==0) return QString();
-    return par_list.front();
-}
-
-QString ParameterizedItem::stripFirstField(const QString &par_name) const
-{
-    QStringList par_list = par_name.split("/");
-    if (par_list.size()<2) return QString();
-    par_list.removeFirst();
-    return par_list.join("/");
-}
-
-std::string ParameterizedItem::translateSingleName(const QString &name) const
-{
-    for (auto& translator : m_special_translators) {
-        auto result = translator->translate(name);
-        if (!result.empty()) {
-            return result;
-        }
-    }
-    return name.toStdString();
-}
-
-void ParameterizedItem::addParameterTranslator(const IParameterTranslator &translator)
-{
-    m_special_translators.emplace_back(translator.clone());
-}
-
-void ParameterizedItem::notifySiblings()
-{
-    for (auto child : m_children) {
-        child->onSiblingsChanged();
-    }
-}
-
-QStringList ParameterizedItem::getParameterList(QString prefix) const
-{
-    QStringList result;
-    QList<QByteArray> property_names = dynamicPropertyNames();
-    for (int i = 0; i < property_names.length(); ++i) {
-        QString prop_name = QString(property_names[i]);
-        const PropertyAttribute &prop_attribute = getPropertyAttribute(prop_name);
-        if (prop_attribute.isHidden() || prop_attribute.isDisabled() ) continue;
-        QVariant variant = property(prop_name.toUtf8().constData());
-        int type = variant.type(); // NEW
-        if (type == QVariant::UserType) { // NEW
-            type = variant.userType(); // NEW
-        }
-        if (type == QVariant::Double) {
-            result << prefix + prop_name;
-        }
-    }
-    return result;
-}
diff --git a/GUI/coregui/Models/ParameterizedItem.h b/GUI/coregui/Models/ParameterizedItem.h
index 5d99beab1347cfb44f948fafc530b38aaba87672..ec3b26d31b4b1ced39f0c3f06aa1d23d7559e8d3 100644
--- a/GUI/coregui/Models/ParameterizedItem.h
+++ b/GUI/coregui/Models/ParameterizedItem.h
@@ -187,6 +187,9 @@ public:
     //! call without second parameter to get current item directly
     ParameterizedItem *setGroupProperty(const QString &name, const QString &value = QString());
 
+    //! returns current item of group property
+    ParameterizedItem *getGroupProperty(const QString &name);
+
 
     // attributes
 
@@ -248,8 +251,8 @@ private:
 
 
     // the following function will be moved out of parameterized item
+
     // signals and slots -> use signals of session model
-    // paths and translators -> probably separate class (e.g. ModelPath)
 
 
 public:
@@ -268,17 +271,6 @@ public:
 
 
 
-    //! retrieves a list of all parameter names in the ParameterizedItem tree starting
-    //! with this node and prefixes them
-    QStringList getParameterTreeList(QString prefix = "") const;
-
-    //! retrieve value of given parameter name
-    double getParameterValue(const QString &name) const;
-
-    //! translates the given parameter name to a domain parameter name
-    //! name should start with a child/subitem name or be a direct parameter name
-    std::string translateParameterName(const QString &par_name) const;
-
 signals:
     void propertyChanged(const QString &propertyName);
     void subItemChanged(const QString &propertyName);
@@ -296,26 +288,13 @@ private slots:
 
 protected:
 
-    QStringList splitParameterName(const QString& par_name) const;
-
-    QString getFirstField(const QString &par_name) const;
 
-    QString stripFirstField(const QString &par_name) const;
-
-    virtual std::string translateSingleName(const QString &name) const;
-
-    void addParameterTranslator(const IParameterTranslator &translator);
 
 
 
 
     void notifySiblings();
 
-private:
-    QStringList getParameterList(QString prefix = "") const;
-
-    std::vector<std::unique_ptr<IParameterTranslator>> m_special_translators;
-
 };
 
 #endif /* PARAMETERIZEDITEM_H_ */
diff --git a/GUI/coregui/Models/ParticleCompositionItem.cpp b/GUI/coregui/Models/ParticleCompositionItem.cpp
index 7af0e5ac49047567735c954a1c79f98467c81001..cacacf266d85081da0091a64419a727d64df2702 100644
--- a/GUI/coregui/Models/ParticleCompositionItem.cpp
+++ b/GUI/coregui/Models/ParticleCompositionItem.cpp
@@ -18,6 +18,7 @@
 #include "ParticleItem.h"
 #include "TransformToDomain.h"
 #include "GUIHelpers.h"
+#include "ModelPath.h"
 
 ParticleCompositionItem::ParticleCompositionItem()
     : ParameterizedGraphicsItem(Constants::ParticleCompositionType)
@@ -25,21 +26,21 @@ ParticleCompositionItem::ParticleCompositionItem()
     registerProperty(ParticleItem::P_ABUNDANCE, 1.0).limited(0.0, 1.0).setDecimals(3);
     registerGroupProperty(ParticleItem::P_POSITION, Constants::VectorType);
     PositionTranslator position_translator;
-    addParameterTranslator(position_translator);
+    ModelPath::addParameterTranslator(position_translator);
 
     addToValidChildren(Constants::ParticleType, PortInfo::PORT_0);
     addToValidChildren(Constants::ParticleCoreShellType, PortInfo::PORT_0);
     addToValidChildren(Constants::ParticleCompositionType, PortInfo::PORT_0);
     addToValidChildren(Constants::TransformationType, PortInfo::PORT_1, 1);
     RotationTranslator rotation_translator;
-    addParameterTranslator(rotation_translator);
+    ModelPath::addParameterTranslator(rotation_translator);
 }
 
-void ParticleCompositionItem::insertChildItem(int row, ParameterizedItem *item)
+void ParticleCompositionItem::insertChildItem(int row, ParameterizedItem *item)
 {
 //    int port = item->getRegisteredProperty(ParameterizedItem::OBSOLETE_P_PORT).toInt();
     int port = int(item->port());
-    ParameterizedItem::insertChildItem(row, item);
+    ParameterizedItem::insertChildItem(row, item);
     if (item->modelType() == Constants::ParticleType
         || item->modelType() == Constants::ParticleCoreShellType
         || item->modelType() == Constants::ParticleCompositionType) {
@@ -69,7 +70,7 @@ std::unique_ptr<ParticleComposition> ParticleCompositionItem::createParticleComp
     double abundance = getRegisteredProperty(ParticleItem::P_ABUNDANCE).toDouble();
     auto P_composition = GUIHelpers::make_unique<ParticleComposition>();
     P_composition->setAbundance(abundance);
-    QList<ParameterizedItem *> children = childItems();
+    QList<ParameterizedItem *> children = childItems();
     for (int i = 0; i < children.size(); ++i) {
         if (children[i]->modelType() == Constants::ParticleType) {
             auto *particle_item = static_cast<ParticleItem*>(children[i]);
diff --git a/GUI/coregui/Models/ParticleCoreShellItem.cpp b/GUI/coregui/Models/ParticleCoreShellItem.cpp
index 78801221464f50b8a4560ad98fb4632acc061bec..bf0600f5bb998948c6c628d56c36b6c47c8733f0 100644
--- a/GUI/coregui/Models/ParticleCoreShellItem.cpp
+++ b/GUI/coregui/Models/ParticleCoreShellItem.cpp
@@ -18,6 +18,7 @@
 #include "VectorItem.h"
 #include "TransformToDomain.h"
 #include "GUIHelpers.h"
+#include "ModelPath.h"
 #include <QDebug>
 
 ParticleCoreShellItem::ParticleCoreShellItem()
@@ -26,21 +27,21 @@ ParticleCoreShellItem::ParticleCoreShellItem()
     registerProperty(ParticleItem::P_ABUNDANCE, 1.0).limited(0.0, 1.0).setDecimals(3);
     registerGroupProperty(ParticleItem::P_POSITION, Constants::VectorType);
     PositionTranslator position_translator;
-    addParameterTranslator(position_translator);
+    ModelPath::addParameterTranslator(position_translator);
 
     addToValidChildren(Constants::ParticleType, PortInfo::PORT_0, 1); // Core particle
     addToValidChildren(Constants::ParticleType, PortInfo::PORT_1, 1); // Shell particle
     addToValidChildren(Constants::TransformationType, PortInfo::PORT_2, 1);
     RotationTranslator rotation_translator;
-    addParameterTranslator(rotation_translator);
+    ModelPath::addParameterTranslator(rotation_translator);
 }
 
-void ParticleCoreShellItem::insertChildItem(int row, ParameterizedItem *item)
+void ParticleCoreShellItem::insertChildItem(int row, ParameterizedItem *item)
 {
 //    int port = item->getRegisteredProperty(ParameterizedItem::OBSOLETE_P_PORT).toInt();
     int port = int(item->port());
     PortInfo::EPorts first_available_particle_port = getFirstAvailableParticlePort();
-    ParameterizedItem::insertChildItem(row, item);
+    ParameterizedItem::insertChildItem(row, item);
     if (item->modelType() == Constants::ParticleType && port == PortInfo::DEFAULT
         && first_available_particle_port != PortInfo::DEFAULT) {
         item->setPort(first_available_particle_port);
@@ -64,7 +65,7 @@ void ParticleCoreShellItem::onPropertyChange(const QString &name)
 std::unique_ptr<ParticleCoreShell> ParticleCoreShellItem::createParticleCoreShell() const
 {
     double abundance = getRegisteredProperty(ParticleItem::P_ABUNDANCE).toDouble();
-    auto children = childItems();
+    auto children = childItems();
     std::unique_ptr<Particle> P_core {};
     std::unique_ptr<Particle> P_shell {};
     for (int i = 0; i < children.size(); ++i) {
@@ -94,7 +95,7 @@ std::unique_ptr<ParticleCoreShell> ParticleCoreShellItem::createParticleCoreShel
 
 void ParticleCoreShellItem::notifyChildParticlePortChanged()
 {
-    QList<ParameterizedItem *> children = childItems();
+    QList<ParameterizedItem *> children = childItems();
     int core_index = -1;
     int shell_index = -1;
     for (int i=0; i<children.size(); ++i) {
@@ -115,7 +116,7 @@ ParameterizedItem::PortInfo::EPorts ParticleCoreShellItem::getFirstAvailablePart
     // Also when no ports are available, return the first port (core particle will then be replaced)
     PortInfo::EPorts result = PortInfo::PORT_0;
     QList<PortInfo::EPorts> used_particle_ports;
-    QList<ParameterizedItem *> children = childItems();
+    QList<ParameterizedItem *> children = childItems();
     for (auto item : children) {
         if (item->modelType() == Constants::ParticleType) {
             PortInfo::EPorts port = item->port();
diff --git a/GUI/coregui/Models/ParticleDistributionItem.cpp b/GUI/coregui/Models/ParticleDistributionItem.cpp
index bcc9bcb1af2d527957e2ee1d59d9cb90d27d1bcb..946aa8c783f73aed13049a7a8dee38fcdcfae21e 100644
--- a/GUI/coregui/Models/ParticleDistributionItem.cpp
+++ b/GUI/coregui/Models/ParticleDistributionItem.cpp
@@ -25,6 +25,7 @@
 #include "Distributions.h"
 #include "ComboProperty.h"
 #include "GUIHelpers.h"
+#include "ModelPath.h"
 #include <QDebug>
 #include <memory>
 
@@ -52,9 +53,9 @@ ParticleDistributionItem::~ParticleDistributionItem()
 {
 }
 
-void ParticleDistributionItem::insertChildItem(int row, ParameterizedItem *item)
+void ParticleDistributionItem::insertChildItem(int row, ParameterizedItem *item)
 {
-    ParameterizedItem::insertChildItem(row, item);
+    ParameterizedItem::insertChildItem(row, item);
     if (item->modelType() == Constants::ParticleType
         || item->modelType() == Constants::ParticleCoreShellType
         || item->modelType() == Constants::ParticleCompositionType) {
@@ -75,7 +76,7 @@ void ParticleDistributionItem::onChildPropertyChange(ParameterizedItem *item, co
 
 std::unique_ptr<ParticleDistribution> ParticleDistributionItem::createParticleDistribution() const
 {
-    auto children = childItems();
+    auto children = childItems();
     if (children.size() == 0) {
         return nullptr;
     }
@@ -92,7 +93,7 @@ std::unique_ptr<ParticleDistribution> ParticleDistributionItem::createParticleDi
     auto prop = getRegisteredProperty(ParticleDistributionItem::P_DISTRIBUTED_PARAMETER)
                     .value<ComboProperty>();
     QString par_name = prop.getValue();
-    std::string domain_par = translateParameterName(par_name);
+    std::string domain_par = ModelPath::translateParameterName(this, par_name);
     int nbr_samples
         = distr_item->getRegisteredProperty(DistributionItem::P_NUMBER_OF_SAMPLES).toInt();
     double sigma_factor
@@ -138,7 +139,7 @@ void ParticleDistributionItem::updateParameterList()
 QStringList ParticleDistributionItem::getChildParameterNames() const
 {
     QStringList result;
-    QList<ParameterizedItem *> children = childItems();
+    QList<ParameterizedItem *> children = childItems();
     if (children.size() > 1) {
         qDebug() << "ParticleDistributionItem::getChildParameterNames(): "
                  << "More than one child item";
@@ -149,7 +150,7 @@ QStringList ParticleDistributionItem::getChildParameterNames() const
         return result;
     }
     QString prefix = children.front()->displayName() + QString("/");
-    result = children.front()->getParameterTreeList(prefix);
+    result = ModelPath::getParameterTreeList(children.front(), prefix);
     result.prepend(NO_SELECTION);
     return result;
 }
diff --git a/GUI/coregui/Models/ParticleItem.cpp b/GUI/coregui/Models/ParticleItem.cpp
index 95dad6ad4ffd5ee150bf187eb0c18f9672a29c5a..0de4a04cb268e66b75a29817627f0acb230aab49 100644
--- a/GUI/coregui/Models/ParticleItem.cpp
+++ b/GUI/coregui/Models/ParticleItem.cpp
@@ -20,6 +20,7 @@
 #include "VectorItem.h"
 #include "TransformToDomain.h"
 #include "GUIHelpers.h"
+#include "ModelPath.h"
 
 #include <QDebug>
 
@@ -37,16 +38,16 @@ ParticleItem::ParticleItem()
     registerProperty(P_ABUNDANCE, 1.0).limited(0.0, 1.0).setDecimals(3);
     registerGroupProperty(P_POSITION, Constants::VectorType);
     PositionTranslator position_translator;
-    addParameterTranslator(position_translator);
+    ModelPath::addParameterTranslator(position_translator);
 
     addToValidChildren(Constants::TransformationType, PortInfo::PORT_0, 1);
     RotationTranslator rotation_translator;
-    addParameterTranslator(rotation_translator);
+    ModelPath::addParameterTranslator(rotation_translator);
 }
 
-void ParticleItem::insertChildItem(int row, ParameterizedItem *item)
+void ParticleItem::insertChildItem(int row, ParameterizedItem *item)
 {
-    ParameterizedItem::insertChildItem(row, item);
+    ParameterizedItem::insertChildItem(row, item);
     if (item->modelType() == Constants::TransformationType) {
         int port = int(item->port());
 //        int port = item->getRegisteredProperty(ParameterizedItem::OBSOLETE_P_PORT).toInt();
diff --git a/GUI/coregui/Models/TransformFromDomain.cpp b/GUI/coregui/Models/TransformFromDomain.cpp
index 83d510696a288f5e5486ddfba61f72ed1d033585..da157edeb3c2f17222141a21b23f2cebdf152825 100644
--- a/GUI/coregui/Models/TransformFromDomain.cpp
+++ b/GUI/coregui/Models/TransformFromDomain.cpp
@@ -62,6 +62,7 @@
 #include "RectangularDetector.h"
 #include "RectangularDetectorItem.h"
 #include "VectorItem.h"
+#include "ModelPath.h"
 
 #include <QString>
 #include <QDebug>
@@ -458,7 +459,7 @@ void TransformFromDomain::setDetectorMasks(DetectorItem *detectorItem, const GIS
     const DetectorMask *detectorMask = detector->getDetectorMask();
     if(detectorMask && detectorMask->getNumberOfMasks()) {
         MaskContainerItem *containerItem = new MaskContainerItem();
-        detectorItem->insertChildItem(-1, containerItem);
+        detectorItem->insertChildItem(-1, containerItem);
         for(size_t i_mask=0; i_mask<detectorMask->getNumberOfMasks(); ++i_mask) {
             bool mask_value(false);
             const Geometry::IShape2D *shape = detectorMask->getMaskShape(i_mask, mask_value);
@@ -470,7 +471,7 @@ void TransformFromDomain::setDetectorMasks(DetectorItem *detectorItem, const GIS
                 ellipseItem->setRegisteredProperty(EllipseItem::P_YRADIUS, Units::rad2deg(ellipse->getRadiusY()));
                 ellipseItem->setRegisteredProperty(EllipseItem::P_ANGLE, Units::rad2deg(ellipse->getTheta()));
                 ellipseItem->setRegisteredProperty(MaskItem::P_MASK_VALUE, mask_value);
-                containerItem->insertChildItem(0, ellipseItem);
+                containerItem->insertChildItem(0, ellipseItem);
 
             }
             else if(const Geometry::Rectangle *rectangle = dynamic_cast<const Geometry::Rectangle *>(shape)) {
@@ -480,7 +481,7 @@ void TransformFromDomain::setDetectorMasks(DetectorItem *detectorItem, const GIS
                 rectangleItem->setRegisteredProperty(RectangleItem::P_XUP, Units::rad2deg(rectangle->getXup()));
                 rectangleItem->setRegisteredProperty(RectangleItem::P_YUP, Units::rad2deg(rectangle->getYup()));
                 rectangleItem->setRegisteredProperty(MaskItem::P_MASK_VALUE, mask_value);
-                containerItem->insertChildItem(0, rectangleItem);
+                containerItem->insertChildItem(0, rectangleItem);
 
             }
             else if(const Geometry::Polygon *polygon = dynamic_cast<const Geometry::Polygon *>(shape)) {
@@ -491,31 +492,31 @@ void TransformFromDomain::setDetectorMasks(DetectorItem *detectorItem, const GIS
                     PolygonPointItem *pointItem = new PolygonPointItem();
                     pointItem->setRegisteredProperty(PolygonPointItem::P_POSX, Units::rad2deg(xpos[i_point]));
                     pointItem->setRegisteredProperty(PolygonPointItem::P_POSY, Units::rad2deg(ypos[i_point]));
-                    polygonItem->insertChildItem(-1, pointItem);
+                    polygonItem->insertChildItem(-1, pointItem);
                 }
 
                 polygonItem->setRegisteredProperty(MaskItem::P_MASK_VALUE, mask_value);
                 polygonItem->setRegisteredProperty(PolygonItem::P_ISCLOSED, true);
 
-                containerItem->insertChildItem(0, polygonItem);
+                containerItem->insertChildItem(0, polygonItem);
             }
             else if(const Geometry::VerticalLine *vline = dynamic_cast<const Geometry::VerticalLine *>(shape)) {
                 VerticalLineItem *lineItem = new VerticalLineItem();
                 lineItem->setRegisteredProperty(VerticalLineItem::P_POSX, Units::rad2deg(vline->getXpos()));
                 lineItem->setRegisteredProperty(MaskItem::P_MASK_VALUE, mask_value);
-                containerItem->insertChildItem(0, lineItem);
+                containerItem->insertChildItem(0, lineItem);
             }
             else if(const Geometry::HorizontalLine *hline = dynamic_cast<const Geometry::HorizontalLine *>(shape)) {
                 HorizontalLineItem *lineItem = new HorizontalLineItem();
                 lineItem->setRegisteredProperty(HorizontalLineItem::P_POSY, Units::rad2deg(hline->getYpos()));
                 lineItem->setRegisteredProperty(MaskItem::P_MASK_VALUE, mask_value);
-                containerItem->insertChildItem(0, lineItem);
+                containerItem->insertChildItem(0, lineItem);
             }
             else if(const Geometry::InfinitePlane *plane = dynamic_cast<const Geometry::InfinitePlane *>(shape)) {
                 Q_UNUSED(plane);
                 MaskAllItem *planeItem = new MaskAllItem();
                 planeItem->setRegisteredProperty(MaskItem::P_MASK_VALUE, mask_value);
-                containerItem->insertChildItem(-1, planeItem);
+                containerItem->insertChildItem(-1, planeItem);
             }
             else {
                 throw GUIHelpers::Error("TransformFromDomain::setDetectorMasks() -> Error. "
@@ -549,9 +550,9 @@ void TransformFromDomain::setItemFromSample(BeamDistributionItem *beamDistributi
 QString TransformFromDomain::translateParameterNameToGUI(ParameterizedItem *item,
                                                          const QString &par_name)
 {
-    auto gui_par_list = item->getParameterTreeList();
+    auto gui_par_list = ModelPath::getParameterTreeList(item);
     for (auto gui_par_name : gui_par_list) {
-        auto domain_par_name = QString::fromStdString(item->translateParameterName(gui_par_name));
+        auto domain_par_name = QString::fromStdString(ModelPath::translateParameterName(item, gui_par_name));
         if (domain_par_name == par_name) {
             return gui_par_name;
         }
diff --git a/GUI/coregui/Views/FitWidgets/FitParameterWidget.cpp b/GUI/coregui/Views/FitWidgets/FitParameterWidget.cpp
index f0d464711b5ae1c5bb2fc25c68bd92f67c328bfc..04b311f630c7d5931c59ae229e51298fa98884b8 100644
--- a/GUI/coregui/Views/FitWidgets/FitParameterWidget.cpp
+++ b/GUI/coregui/Views/FitWidgets/FitParameterWidget.cpp
@@ -21,6 +21,7 @@
 #include "DeleteEventFilter.h"
 #include "MinimizerSettingsWidget.h"
 #include "minisplitter.h"
+#include "ModelPath.h"
 #include <QVBoxLayout>
 #include <QTreeView>
 #include <QSplitter>
@@ -153,7 +154,7 @@ void FitParameterWidget::clearParameter() {
 
 void FitParameterWidget::buildTree(QStandardItem *root, ParameterizedItem *top)
 {
-    QStringList parameterTree = top->getParameterTreeList();
+    QStringList parameterTree = ModelPath::getParameterTreeList(top);
 
     foreach (const QString &str, parameterTree) {
         QStringList parts = str.split("/");
@@ -175,7 +176,7 @@ void FitParameterWidget::buildTree(QStandardItem *root, ParameterizedItem *top)
                 item->setEditable(false);
                 data->setEditable(false);
                 if (partIndex == parts.size() - 1) { // arrived at the end
-                    double value = top->getParameterValue(str);
+                    double value = ModelPath::getParameterValue(top, str);
                     data->setData(QVariant(value), Qt::EditRole);
                 } else {
                     item->setDragEnabled(false);
@@ -229,7 +230,7 @@ void FitParameterWidget::onCustomContextMenu(const QPoint &point) {
     QModelIndex index = m_parameterTreeview->indexAt(point);
     if (index.isValid()) {
         ParameterizedItem *cur = m_parameterModel->itemForIndex(index);
-        if (cur->itemName().startsWith("FitParameter")) {
+        if (cur->itemName().startsWith("FitParameter")) {
             m_parameterTreeview->setCurrentIndex(index);
             m_removeAction->setEnabled(true);
         }