diff --git a/GUI/Models/BeamDistributionItem.cpp b/GUI/Models/BeamDistributionItem.cpp
index d0d43e0ae4d5afbef7217e40d9b9b0e1053b094a..3d26dde3d725ec55e9b4de72a043db0cdb7d6a5e 100644
--- a/GUI/Models/BeamDistributionItem.cpp
+++ b/GUI/Models/BeamDistributionItem.cpp
@@ -22,7 +22,7 @@ const QString BeamDistributionItem::P_DISTRIBUTION = "Distribution";
 BeamDistributionItem::BeamDistributionItem(const QString& name, bool show_mean) : SessionItem(name)
 {
     mapper()->setOnChildPropertyChange([this, show_mean](SessionItem* item, const QString&) {
-        if (item->modelType() == "GroupProperty" && item->parent() == this)
+        if (item->hasModelType<GroupItem>() && item->parent() == this)
             initDistributionItem(show_mean);
     });
 }
diff --git a/GUI/Models/ComponentProxyModel.cpp b/GUI/Models/ComponentProxyModel.cpp
index e3a36e64a44bfefb7fb5b1b081ff058d960e9dac..a923af487941a2f358ce0bdcc67f586e86db0c35 100644
--- a/GUI/Models/ComponentProxyModel.cpp
+++ b/GUI/Models/ComponentProxyModel.cpp
@@ -14,6 +14,7 @@
 
 #include "GUI/Models/ComponentProxyModel.h"
 #include "GUI/Models/ComponentProxyStrategy.h"
+#include "GUI/Models/GroupItem.h"
 #include "GUI/Models/SessionModel.h"
 #include <QSet>
 #include <functional>
@@ -150,7 +151,7 @@ void ComponentProxyModel::sourceDataChanged(const QModelIndex& topLeft,
     ASSERT(bottomRight.isValid() ? bottomRight.model() == sourceModel() : true);
 
     if (SessionItem* item = m_model->itemForIndex(topLeft)) {
-        if (item->modelType() == "GroupProperty")
+        if (item->hasModelType<GroupItem>())
             updateModelMap();
     }
     dataChanged(mapFromSource(topLeft), mapFromSource(bottomRight), roles);
diff --git a/GUI/Models/ComponentProxyStrategy.cpp b/GUI/Models/ComponentProxyStrategy.cpp
index 2a1557c212b1908984bb600513ebc16378875b38..f8aab18953a9d1985eb21894b2c8ac8312288fe6 100644
--- a/GUI/Models/ComponentProxyStrategy.cpp
+++ b/GUI/Models/ComponentProxyStrategy.cpp
@@ -62,7 +62,7 @@ bool ComponentProxyStrategy::isPropertyRelated(SessionItem* item)
     static const QStringList& propertyRelated = GUI::Model::ComponentUtils::propertyRelatedTypes();
 
     if (m_sourceRootIndex.isValid() && item->parent()->index() == m_sourceRootIndex
-        && item->parent()->modelType() != "GroupProperty")
+        && ! item->parent()->hasModelType<GroupItem>())
         return propertyRelated.contains(item->modelType());
 
     return true;
@@ -91,9 +91,8 @@ void ComponentProxyStrategy::processRootItem(SessionItem* item,
 
 bool ComponentProxyStrategy::isSubGroup(SessionItem* item)
 {
-    const SessionItem* ancestor = GUI::Model::Path::ancestor(item->parent(), "GroupProperty");
-    if (item->modelType() == "GroupProperty" && ancestor
-        && ancestor->modelType() == "GroupProperty") {
+    const SessionItem* ancestor = GUI::Model::Path::ancestor(item->parent(), GroupItem::M_TYPE);
+    if (item->hasModelType<GroupItem>() && ancestor && ancestor->hasModelType<GroupItem>()) {
         return true;
     }
 
@@ -104,10 +103,10 @@ bool ComponentProxyStrategy::isSubGroup(SessionItem* item)
 
 bool ComponentProxyStrategy::isGroupChildren(SessionItem* item)
 {
-    if (item->parent() && item->parent()->modelType() == "GroupProperty")
+    if (item->parent() && item->parent()->hasModelType<GroupItem>())
         return true;
 
-    if (const SessionItem* ancestor = GUI::Model::Path::ancestor(item, "GroupProperty")) {
+    if (const SessionItem* ancestor = GUI::Model::Path::ancestor(item, GroupItem::M_TYPE)) {
         if (ancestor != item)
             return true;
     }
@@ -120,7 +119,7 @@ bool ComponentProxyStrategy::isGroupChildren(SessionItem* item)
 void ComponentProxyStrategy::processGroupItem(SessionItem* item,
                                               const QPersistentModelIndex& sourceIndex)
 {
-    if (const SessionItem* ancestor = GUI::Model::Path::ancestor(item, "GroupProperty")) {
+    if (const SessionItem* ancestor = GUI::Model::Path::ancestor(item, GroupItem::M_TYPE)) {
         if (ancestor == item)
             return;
 
@@ -140,7 +139,8 @@ void ComponentProxyStrategy::processGroupItem(SessionItem* item,
 void ComponentProxyStrategy::processSubGroupItem(SessionItem* item,
                                                  const QPersistentModelIndex& sourceIndex)
 {
-    if (const SessionItem* ancestor = GUI::Model::Path::ancestor(item->parent(), "GroupProperty")) {
+    if (const SessionItem* ancestor =
+        GUI::Model::Path::ancestor(item->parent(), GroupItem::M_TYPE)) {
         auto groupItem = dynamic_cast<const GroupItem*>(ancestor);
 
         if (item->parent() == groupItem->currentItem()) {
diff --git a/GUI/Models/ComponentUtils.cpp b/GUI/Models/ComponentUtils.cpp
index 81293ac793af580bee94694ce7bac12a16663fe9..ac571124d7fa0cafa353caa55d8eec9e556e251b 100644
--- a/GUI/Models/ComponentUtils.cpp
+++ b/GUI/Models/ComponentUtils.cpp
@@ -14,17 +14,18 @@
 
 #include "GUI/Models/ComponentUtils.h"
 #include "GUI/Models/AxesItems.h"
+#include "GUI/Models/GroupItem.h"
 #include "GUI/Models/MaterialDataItems.h"
 #include "GUI/Models/VectorItem.h"
 
 namespace {
-QList<const SessionItem*> groupItems(const SessionItem& item);
+QList<const SessionItem*> groupItems(const GroupItem& item);
 }
 
 const QStringList& GUI::Model::ComponentUtils::propertyRelatedTypes()
 {
     static const QStringList result = {"Property",
-                                       "GroupProperty",
+                                       GroupItem::M_TYPE,
                                        VectorItem::M_TYPE,
                                        BasicAxisItem::M_TYPE,
                                        AmplitudeAxisItem::M_TYPE,
@@ -41,9 +42,9 @@ QList<const SessionItem*> GUI::Model::ComponentUtils::componentItems(const Sessi
     if (item.modelType() == "Property") {
         result.push_back(&item);
 
-    } else if (item.modelType() == "GroupProperty") {
+    } else if (item.hasModelType<GroupItem>()) {
         result.push_back(&item);
-        result += groupItems(item);
+        result += groupItems(dynamic_cast<const GroupItem&>(item));
 
     } else {
 
@@ -54,8 +55,8 @@ QList<const SessionItem*> GUI::Model::ComponentUtils::componentItems(const Sessi
             if (propertyRelated.contains(child->modelType()))
                 result.append(child);
 
-            if (child->modelType() == "GroupProperty")
-                result += groupItems(*child);
+            if (child->hasModelType<GroupItem>())
+                 result += groupItems(*dynamic_cast<GroupItem*>(child));
         }
     }
 
@@ -63,10 +64,8 @@ QList<const SessionItem*> GUI::Model::ComponentUtils::componentItems(const Sessi
 }
 
 namespace {
-QList<const SessionItem*> groupItems(const SessionItem& item)
+QList<const SessionItem*> groupItems(const GroupItem& item)
 {
-    ASSERT(item.modelType() == "GroupProperty");
-
     QList<const SessionItem*> result;
     for (auto grandchild : item.children()) {
         if (grandchild->isVisible())
diff --git a/GUI/Models/FilterPropertyProxy.cpp b/GUI/Models/FilterPropertyProxy.cpp
index 4abc490842bcd47b1579613b9371987854f31c1a..9d21d06904ad271de13aa902f8cb382378a8e61b 100644
--- a/GUI/Models/FilterPropertyProxy.cpp
+++ b/GUI/Models/FilterPropertyProxy.cpp
@@ -13,6 +13,7 @@
 //  ************************************************************************************************
 
 #include "GUI/Models/FilterPropertyProxy.h"
+#include "GUI/Models/GroupItem.h"
 #include "GUI/Models/SessionModel.h"
 #include "GUI/Models/VectorItem.h"
 
@@ -37,7 +38,8 @@ bool FilterPropertyProxy::filterAcceptsRow(int sourceRow, const QModelIndex& sou
     if (!sourceParent.isValid())
         return true;
     const QString modelType = index.data(SessionFlags::ModelTypeRole).toString();
-    if (modelType == "Property" || modelType == "GroupProperty" || modelType == VectorItem::M_TYPE)
+    if (modelType == "Property" || modelType == GroupItem::M_TYPE
+        || modelType == VectorItem::M_TYPE)
         return false;
 
     return true; //! sourceModel()->data(index, Qt::DisplayRole).isValid();
diff --git a/GUI/Models/GroupItem.cpp b/GUI/Models/GroupItem.cpp
index e70959f193a666676e2447a35dc7b5456693b3f7..0a839ca8cd7bb0cc80e49c9dfd647e91de7192e1 100644
--- a/GUI/Models/GroupItem.cpp
+++ b/GUI/Models/GroupItem.cpp
@@ -18,7 +18,9 @@
 
 const QString GroupItem::T_ITEMS = "Item tag";
 
-GroupItem::GroupItem() : SessionItem("GroupProperty")
+const QString GroupItem::M_TYPE = "GroupProperty";
+
+GroupItem::GroupItem() : SessionItem(M_TYPE)
 {
     registerTag(T_ITEMS);
     setDefaultTag(T_ITEMS);
diff --git a/GUI/Models/GroupItem.h b/GUI/Models/GroupItem.h
index b6cb094a034335cf0e681540545d7b32962c617c..e94fa4788b750fd429410dc2f82463af27e4ff52 100644
--- a/GUI/Models/GroupItem.h
+++ b/GUI/Models/GroupItem.h
@@ -25,6 +25,8 @@ class GroupItemController;
 
 class BA_CORE_API_ GroupItem : public SessionItem {
 public:
+    static const QString M_TYPE;
+
     static const QString T_ITEMS;
     GroupItem();
     ~GroupItem();
diff --git a/GUI/Models/InterferenceFunctionItems.cpp b/GUI/Models/InterferenceFunctionItems.cpp
index 225550e91ada95ddcd95da0932237bbf7523b1a0..a8e006a683f956002b0dc055fa729a4fe0f1effb 100644
--- a/GUI/Models/InterferenceFunctionItems.cpp
+++ b/GUI/Models/InterferenceFunctionItems.cpp
@@ -128,7 +128,7 @@ InterferenceFunction2DAbstractLatticeItem::InterferenceFunction2DAbstractLattice
     });
 
     mapper()->setOnChildPropertyChange([this](SessionItem* item, const QString&) {
-        if (item->modelType() == "GroupProperty" && item->displayName() == P_LATTICE_TYPE) {
+        if (item->hasModelType<GroupItem>() && item->displayName() == P_LATTICE_TYPE) {
             update_rotation_availability();
         }
     });
@@ -206,8 +206,8 @@ InterferenceFunction2DParaCrystalItem::InterferenceFunction2DParaCrystalItem()
         ->setToolTip("Probability distribution in second lattice direction");
 
     mapper()->setOnChildPropertyChange([this](SessionItem* item, const QString& property) {
-        if (item->modelType() == "GroupProperty" && property == GroupItem::T_ITEMS && isTag(P_PDF1)
-            && isTag(P_PDF2))
+        if (item->hasModelType<GroupItem>() && property == GroupItem::T_ITEMS
+            && isTag(P_PDF1) && isTag(P_PDF2))
             update_distribution_displaynames();
     });
 
diff --git a/GUI/Models/ItemCatalog.cpp b/GUI/Models/ItemCatalog.cpp
index e7bf52210a0ffe6bb06c36f6beb9f365ade0cb60..1c6692f2d70418989603c7da311cdfec1cd5d6e5 100644
--- a/GUI/Models/ItemCatalog.cpp
+++ b/GUI/Models/ItemCatalog.cpp
@@ -205,7 +205,7 @@ ItemCatalog::ItemCatalog()
 
     addItem<RegionOfInterestItem>();
 
-    add("GroupProperty", create_new<GroupItem>);
+    addItem<GroupItem>();
 
     addItem<ParameterContainerItem>();
     addItem<ParameterLabelItem>();
diff --git a/GUI/Models/ParameterTreeUtils.cpp b/GUI/Models/ParameterTreeUtils.cpp
index 6ed717fbe3bf0602c9454d21796a9be9bf4d10a5..4a4ee45004642f2e12477ea52bb53a3e70a1ec10 100644
--- a/GUI/Models/ParameterTreeUtils.cpp
+++ b/GUI/Models/ParameterTreeUtils.cpp
@@ -61,7 +61,7 @@ void handleItem(SessionItem* tree, const SessionItem* source)
                     handleItem(branch, child);
                 }
 
-            } else if (child->modelType() == "GroupProperty") {
+            } else if (child->hasModelType<GroupItem>()) {
                 SessionItem* currentItem = dynamic_cast<GroupItem*>(child)->currentItem();
                 if (currentItem && currentItem->numberOfChildren() > 0) {
                     auto branch = tree->model()->insertItem<ParameterLabelItem>(tree);
diff --git a/GUI/Models/SessionItem.cpp b/GUI/Models/SessionItem.cpp
index 576343296d3a9bfcf87b910c80546fe294419ed7..bc835a6fc5bbc1bf395af0481fdc7c8b6373cded 100644
--- a/GUI/Models/SessionItem.cpp
+++ b/GUI/Models/SessionItem.cpp
@@ -310,10 +310,10 @@ SessionItem* SessionItem::addGroupProperty(const QString& groupTag, const QStrin
         // create group item
         GroupInfo groupInfo = GUI::Session::ItemUtils::GetGroupInfo(groupType);
         GroupItem* groupItem =
-            dynamic_cast<GroupItem*>(GUI::Model::ItemFactory::CreateItem("GroupProperty"));
+            dynamic_cast<GroupItem*>(GUI::Model::ItemFactory::CreateItem(GroupItem::M_TYPE));
         ASSERT(groupItem);
         groupItem->setGroupInfo(groupInfo);
-        registerTag(groupTag, 1, 1, QStringList() << "GroupProperty");
+        registerTag(groupTag, 1, 1, {GroupItem::M_TYPE});
         result = groupItem;
     } else {
         // # migration Remove this branch at any convenient occasion. It is not used anymore.
@@ -422,7 +422,7 @@ QString SessionItem::displayName() const
 {
     QString result = roleProperty(SessionFlags::DisplayNameRole).toString();
 
-    if (modelType() == "Property" || modelType() == "GroupProperty" || hasModelType<ParameterItem>()
+    if (modelType() == "Property" || hasModelType<GroupItem>() || hasModelType<ParameterItem>()
         || hasModelType<ParameterLabelItem>())
         return result;
 
diff --git a/GUI/Models/SessionXML.cpp b/GUI/Models/SessionXML.cpp
index 94cae8dbb3d189c4b28741e69b4d747a7b07efad..6e5b59cdfeeb570f263a63c66ad55825fa62ff84 100644
--- a/GUI/Models/SessionXML.cpp
+++ b/GUI/Models/SessionXML.cpp
@@ -279,7 +279,7 @@ SessionItem* createItem(SessionItem* item, const QString& modelType, const QStri
 {
     SessionItem* result(nullptr);
 
-    if (item->modelType() == "GroupProperty") {
+    if (item->hasModelType<GroupItem>()) {
         if (auto groupItem = dynamic_cast<GroupItem*>(item))
             result = groupItem->getItemOfType(modelType);
     } else {
diff --git a/GUI/Views/MaskWidgets/MaskGraphicsScene.cpp b/GUI/Views/MaskWidgets/MaskGraphicsScene.cpp
index a9d781c08033ac35cb312f45655ab9cca13510aa..ec1765d3c604f90c66d37c5348a4b68687b191c4 100644
--- a/GUI/Views/MaskWidgets/MaskGraphicsScene.cpp
+++ b/GUI/Views/MaskWidgets/MaskGraphicsScene.cpp
@@ -14,6 +14,7 @@
 
 #include "GUI/Views/MaskWidgets/MaskGraphicsScene.h"
 #include "GUI/Models/Error.h"
+#include "GUI/Models/GroupItem.h"
 #include "GUI/Models/MaskItems.h"
 #include "GUI/Models/ProjectionItems.h"
 #include "GUI/Models/SessionModel.h"
@@ -386,7 +387,7 @@ void MaskGraphicsScene::updateViews(const QModelIndex& parentIndex, IShape2DView
     for (int i_row = 0; i_row < m_maskModel->rowCount(parentIndex); ++i_row) {
         QModelIndex itemIndex = m_maskModel->index(i_row, 0, parentIndex);
         if (SessionItem* item = m_maskModel->itemForIndex(itemIndex)) {
-            if (item->modelType() == "GroupProperty" || item->modelType() == "Property")
+            if (item->hasModelType<GroupItem>() || item->modelType() == "Property")
                 continue;
 
             childView = addViewForItem(item);
diff --git a/GUI/Views/PropertyEditor/ComponentFlatView.cpp b/GUI/Views/PropertyEditor/ComponentFlatView.cpp
index 1f915094c2bf2970dfa73fa8b6aa3ccaa3d5f917..c5b7afe30e39a2d7de9c275e7d73e22b2c171900 100644
--- a/GUI/Views/PropertyEditor/ComponentFlatView.cpp
+++ b/GUI/Views/PropertyEditor/ComponentFlatView.cpp
@@ -14,6 +14,7 @@
 
 #include "GUI/Views/PropertyEditor/ComponentFlatView.h"
 #include "GUI/Models/ComponentUtils.h"
+#include "GUI/Models/GroupItem.h"
 #include "GUI/Models/SessionModel.h"
 #include "GUI/Views/PropertyEditor/PropertyEditorFactory.h"
 #include "GUI/Views/PropertyEditor/PropertyWidgetItem.h"
@@ -95,7 +96,7 @@ void ComponentFlatView::onDataChanged(const QModelIndex& topLeft, const QModelIn
     Q_UNUSED(bottomRight);
     SessionItem* item = m_model->itemForIndex(topLeft);
     ASSERT(item);
-    if (item->modelType() == "GroupProperty")
+    if (item->hasModelType<GroupItem>())
         updateItemProperties();
 
     if (roles.contains(SessionFlags::FlagRole))