diff --git a/GUI/Models/GUIDomainSampleVisitor.cpp b/GUI/Models/GUIDomainSampleVisitor.cpp
index a496ed0c213583a783afb6c8b7a715b35b14ec6a..d02f724653a75dc2dcdfd9bdc6171d57b42aaae2 100644
--- a/GUI/Models/GUIDomainSampleVisitor.cpp
+++ b/GUI/Models/GUIDomainSampleVisitor.cpp
@@ -52,7 +52,7 @@ template <typename T> T* AddFormFactorItem(SessionItem* parent)
 {
     if (parent->hasModelType<ParticleItem>())
         return polymorphic_cast<ParticleItem*>(parent)->setFormFactorType<T>();
-    else if (parent->modelType() == "MesoCrystal")
+    else if (parent->hasModelType<MesoCrystalItem>())
         return parent->setGroupPropertyType<T>(MesoCrystalItem::P_OUTER_SHAPE);
     else
         throw Error("AddFormFactorItem: parent is neither ParticleItem or "
@@ -147,14 +147,14 @@ void GUIDomainSampleVisitor::visit(const ParticleComposition* sample)
 
 void GUIDomainSampleVisitor::visit(const MesoCrystal* sample)
 {
-    InsertIParticle(sample, "MesoCrystal");
+    InsertIParticle(sample, MesoCrystalItem::M_TYPE);
 }
 
 void GUIDomainSampleVisitor::visit(const Crystal* sample)
 {
     SessionItem* mesocrystal_item = m_levelToParentItem[depth() - 1];
     ASSERT(mesocrystal_item);
-    if (mesocrystal_item->modelType() != "MesoCrystal") {
+    if (!mesocrystal_item->hasModelType<MesoCrystalItem>()) {
         throw Error("GUI::Model::ObjectBuilder::visit(const Crystal*) "
                     "-> Error. Parent is not a MesoCrystal");
     }
diff --git a/GUI/Models/ItemCatalog.cpp b/GUI/Models/ItemCatalog.cpp
index e1818943db2bce6f1d1905389a7cc17da68ef75d..8f759d128ded1cb1bf4d58e69c8f05bb4dd7f19e 100644
--- a/GUI/Models/ItemCatalog.cpp
+++ b/GUI/Models/ItemCatalog.cpp
@@ -70,7 +70,7 @@ ItemCatalog::ItemCatalog()
     add("Rotation", create_new<TransformationItem>);
     add("ParticleCoreShell", create_new<ParticleCoreShellItem>);
     add("ParticleComposition", create_new<ParticleCompositionItem>);
-    add("MesoCrystal", create_new<MesoCrystalItem>);
+    addItem<MesoCrystalItem>();
     addItem<InterferenceFunction1DLatticeItem>();
     addItem<InterferenceFunction2DLatticeItem>();
     addItem<InterferenceFunction2DParaCrystalItem>();
diff --git a/GUI/Models/MaterialItemUtils.cpp b/GUI/Models/MaterialItemUtils.cpp
index 653d34075f1d464860334044df8298965ac3fd2a..f54bc7dc45d29cf20e8e06af9a97f308fe1af6a5 100644
--- a/GUI/Models/MaterialItemUtils.cpp
+++ b/GUI/Models/MaterialItemUtils.cpp
@@ -34,7 +34,7 @@ std::map<QString, QString> get_tag_map()
     std::map<QString, QString> result = {
         {"ParticleComposition", ParticleCompositionItem::T_PARTICLES},
         {"ParticleLayout", ParticleLayoutItem::T_PARTICLES},
-        {"MesoCrystal", MesoCrystalItem::T_BASIS_PARTICLE}};
+        {MesoCrystalItem::M_TYPE, MesoCrystalItem::T_BASIS_PARTICLE}};
     return result;
 }
 } // namespace
diff --git a/GUI/Models/MesoCrystalItem.cpp b/GUI/Models/MesoCrystalItem.cpp
index c1613cb98be0239d28855244730018e8d9d214b9..c8ed38d0fdefde4281714516596d4345bd86f8b6 100644
--- a/GUI/Models/MesoCrystalItem.cpp
+++ b/GUI/Models/MesoCrystalItem.cpp
@@ -52,9 +52,10 @@ const QString MesoCrystalItem::P_VECTOR_A = "First lattice vector";
 const QString MesoCrystalItem::P_VECTOR_B = "Second lattice vector";
 const QString MesoCrystalItem::P_VECTOR_C = "Third lattice vector";
 
+const QString MesoCrystalItem::M_TYPE = "MesoCrystal";
+
 MesoCrystalItem::MesoCrystalItem()
-    : SessionGraphicsItem("MesoCrystal"),
-      ItemWithParticles("MesoCrystal", abundance_tooltip, position_tooltip)
+    : SessionGraphicsItem(M_TYPE), ItemWithParticles(M_TYPE, abundance_tooltip, position_tooltip)
 {
     setToolTip("A 3D crystal structure of nanoparticles");
 
@@ -68,7 +69,7 @@ MesoCrystalItem::MesoCrystalItem()
                 QStringList() << ParticleItem::M_TYPE
                               << "ParticleCoreShell"
                               << "ParticleComposition"
-                              << "MesoCrystal");
+                              << MesoCrystalItem::M_TYPE);
     setDefaultTag(T_BASIS_PARTICLE);
 }
 
@@ -116,7 +117,7 @@ std::unique_ptr<IParticle> MesoCrystalItem::getBasis() const
         } else if (childlist[i]->modelType() == "ParticleComposition") {
             auto* particlecomposition_item = dynamic_cast<ParticleCompositionItem*>(childlist[i]);
             return particlecomposition_item->createParticleComposition();
-        } else if (childlist[i]->modelType() == "MesoCrystal") {
+        } else if (childlist[i]->hasModelType<MesoCrystalItem>()) {
             auto* mesocrystal_item = dynamic_cast<MesoCrystalItem*>(childlist[i]);
             return mesocrystal_item->createMesoCrystal();
         }
diff --git a/GUI/Models/MesoCrystalItem.h b/GUI/Models/MesoCrystalItem.h
index eed5e98f44c2f5cc57d6912b3aea36feb67b7871..b2afdca3ec88d73b517cdc335c2a0957e48814ee 100644
--- a/GUI/Models/MesoCrystalItem.h
+++ b/GUI/Models/MesoCrystalItem.h
@@ -31,6 +31,8 @@ public:
     static const QString P_VECTOR_B;
     static const QString P_VECTOR_C;
 
+    static const QString M_TYPE;
+
     MesoCrystalItem();
 
     std::unique_ptr<MesoCrystal> createMesoCrystal() const;
diff --git a/GUI/Models/ParticleCompositionItem.cpp b/GUI/Models/ParticleCompositionItem.cpp
index d4820fe49592b3b702ebf9ce52f515464e2c9420..345a5e0ef59d9ecce9fda22cbdc5d566d9f4791a 100644
--- a/GUI/Models/ParticleCompositionItem.cpp
+++ b/GUI/Models/ParticleCompositionItem.cpp
@@ -43,7 +43,7 @@ ParticleCompositionItem::ParticleCompositionItem()
                 QStringList() << ParticleItem::M_TYPE
                               << "ParticleCoreShell"
                               << "ParticleComposition"
-                              << "MesoCrystal");
+                              << MesoCrystalItem::M_TYPE);
     setDefaultTag(T_PARTICLES);
 }
 
diff --git a/GUI/Models/ParticleLayoutItem.cpp b/GUI/Models/ParticleLayoutItem.cpp
index b6fe7f9dc3154f0b049f04fae3a4a1799c63cca7..50e72710be326900bc1d0f3ce99ca7060895a468 100644
--- a/GUI/Models/ParticleLayoutItem.cpp
+++ b/GUI/Models/ParticleLayoutItem.cpp
@@ -15,6 +15,7 @@
 #include "GUI/Models/ParticleLayoutItem.h"
 #include "GUI/Models/InterferenceFunctionItems.h"
 #include "GUI/Models/Lattice2DItems.h"
+#include "GUI/Models/MesoCrystalItem.h"
 #include "GUI/Models/ParticleItem.h"
 #include <QDebug>
 
@@ -62,7 +63,7 @@ ParticleLayoutItem::ParticleLayoutItem() : SessionGraphicsItem("ParticleLayout")
                 QStringList() << ParticleItem::M_TYPE
                               << "ParticleCoreShell"
                               << "ParticleComposition"
-                              << "MesoCrystal");
+                              << MesoCrystalItem::M_TYPE);
     setDefaultTag(T_PARTICLES);
     registerTag(
         T_INTERFERENCE, 0, 1,
diff --git a/GUI/Models/SessionItemUtils.cpp b/GUI/Models/SessionItemUtils.cpp
index afa9a680ef475672b4bb20f57e97838548f9ac02..de3e65a2618832e74d5f48c50980bf94e6ef0218 100644
--- a/GUI/Models/SessionItemUtils.cpp
+++ b/GUI/Models/SessionItemUtils.cpp
@@ -15,6 +15,7 @@
 #include "GUI/Models/SessionItemUtils.h"
 #include "GUI/Models/ExternalProperty.h"
 #include "GUI/Models/GroupInfoCatalog.h"
+#include "GUI/Models/MesoCrystalItem.h"
 #include "GUI/Models/SessionGraphicsItem.h"
 #include <QColor>
 #include <QIcon>
@@ -31,7 +32,7 @@ QStringList parents_with_abundance()
 {
     return QStringList() << "ParticleCoreShell"
                          << "ParticleComposition"
-                         << "MesoCrystal";
+                         << MesoCrystalItem::M_TYPE;
 }
 
 } // namespace
diff --git a/GUI/Models/TransformToDomain.cpp b/GUI/Models/TransformToDomain.cpp
index c21abb513838476bd3a799b8c68a7bbb3389a1b1..b59f9ace90f75563f8a1428b89cd01e8138c4d7c 100644
--- a/GUI/Models/TransformToDomain.cpp
+++ b/GUI/Models/TransformToDomain.cpp
@@ -116,7 +116,7 @@ std::unique_ptr<IParticle> GUI::Transform::ToDomain::createIParticle(const Sessi
     } else if (item.modelType() == "ParticleComposition") {
         auto& particle_composition_item = dynamic_cast<const ParticleCompositionItem&>(item);
         P_particle = particle_composition_item.createParticleComposition();
-    } else if (item.modelType() == "MesoCrystal") {
+    } else if (item.hasModelType<MesoCrystalItem>()) {
         auto& mesocrystal_item = dynamic_cast<const MesoCrystalItem&>(item);
         P_particle = mesocrystal_item.createMesoCrystal();
     }
diff --git a/GUI/Views/RealSpaceWidgets/RealSpaceBuilder.cpp b/GUI/Views/RealSpaceWidgets/RealSpaceBuilder.cpp
index 9bfd1aa03e431f046af11fde797c0d49ff065dfe..71cb8e45d937d44c84c49d070101fe234262df17 100644
--- a/GUI/Views/RealSpaceWidgets/RealSpaceBuilder.cpp
+++ b/GUI/Views/RealSpaceWidgets/RealSpaceBuilder.cpp
@@ -66,7 +66,7 @@ void RealSpaceBuilder::populate(RealSpaceModel* model, const SessionItem& item,
     else if (item.modelType() == "ParticleCoreShell")
         populateParticleFromParticleItem(model, item);
 
-    else if (item.modelType() == "MesoCrystal")
+    else if (item.hasModelType<MesoCrystalItem>())
         populateParticleFromParticleItem(model, item);
 }
 
@@ -148,7 +148,7 @@ void RealSpaceBuilder::populateParticleFromParticleItem(RealSpaceModel* model,
         auto particleComposition = particleCompositionItem->createParticleComposition();
         particle3DContainer =
             GUI::RealSpace::BuilderUtils::particleComposition3DContainer(*particleComposition);
-    } else if (particleItem.modelType() == "MesoCrystal") {
+    } else if (particleItem.hasModelType<MesoCrystalItem>()) {
         auto mesoCrystalItem = dynamic_cast<const MesoCrystalItem*>(&particleItem);
         // If there is no particle to populate inside MesoCrystalItem
         if (!mesoCrystalItem->getItem(MesoCrystalItem::T_BASIS_PARTICLE))
diff --git a/GUI/Views/RealSpaceWidgets/RealSpaceBuilderUtils.cpp b/GUI/Views/RealSpaceWidgets/RealSpaceBuilderUtils.cpp
index cd125f4d803efb6b11f15037e08756cb7c72895e..1d1525a106fb82c27dd0a6431ce5d40804a67610 100644
--- a/GUI/Views/RealSpaceWidgets/RealSpaceBuilderUtils.cpp
+++ b/GUI/Views/RealSpaceWidgets/RealSpaceBuilderUtils.cpp
@@ -237,7 +237,7 @@ GUI::RealSpace::BuilderUtils::particle3DContainerVector(const SessionItem& layou
             auto particleComposition = particleCompositionItem->createParticleComposition();
             particle3DContainer =
                 particleComposition3DContainer(*particleComposition, total_abundance, origin);
-        } else if (particleItem->modelType() == "MesoCrystal") {
+        } else if (particleItem->hasModelType<MesoCrystalItem>()) {
             auto mesoCrystalItem = dynamic_cast<const MesoCrystalItem*>(particleItem);
             // If there is no particle to populate inside MesoCrystalItem
             if (!mesoCrystalItem->getItem(MesoCrystalItem::T_BASIS_PARTICLE))
diff --git a/GUI/Views/SampleDesigner/DesignerScene.cpp b/GUI/Views/SampleDesigner/DesignerScene.cpp
index 105f376c98c0116400d8e1faa7e7f060fb7d7906..80a12fcc833c25b7dcfc246b2ea4518af8ebc7cd 100644
--- a/GUI/Views/SampleDesigner/DesignerScene.cpp
+++ b/GUI/Views/SampleDesigner/DesignerScene.cpp
@@ -17,6 +17,7 @@
 #include "GUI/Models/GUIExamplesFactory.h"
 #include "GUI/Models/InstrumentModel.h"
 #include "GUI/Models/ItemFactory.h"
+#include "GUI/Models/MesoCrystalItem.h"
 #include "GUI/Models/ParticleCompositionItem.h"
 #include "GUI/Models/ParticleCoreShellItem.h"
 #include "GUI/Models/ParticleItem.h"
@@ -363,7 +364,7 @@ void DesignerScene::onEstablishedConnection(NodeEditorConnection* connection_ptr
             tag = ParticleLayoutItem::T_INTERFERENCE;
     } else if ((parentItem->modelType() == "ParticleCoreShell"
                 || parentItem->modelType() == "ParticleComposition"
-                || parentItem->modelType() == "MesoCrystal")
+                || parentItem->hasModelType<MesoCrystalItem>())
                && connection->inputPort()->getPortType() == NodeEditorPort::TRANSFORMATION) {
         polymorphic_cast<ItemWithParticles*>(parentItem)->setTransformation
             (polymorphic_downcast<RotationItem*>(childItem));
diff --git a/GUI/Views/SampleDesigner/SampleViewFactory.cpp b/GUI/Views/SampleDesigner/SampleViewFactory.cpp
index 3d55a2e5a344feb0c8ee40d9ec27c556b68c6075..4c01277dbafcf714a50fe294744fdc0a02ee2ccb 100644
--- a/GUI/Views/SampleDesigner/SampleViewFactory.cpp
+++ b/GUI/Views/SampleDesigner/SampleViewFactory.cpp
@@ -15,6 +15,7 @@
 #include "GUI/Views/SampleDesigner/SampleViewFactory.h"
 #include "GUI/Models/InterferenceFunctionItems.h"
 #include "GUI/Models/LayerItem.h"
+#include "GUI/Models/MesoCrystalItem.h"
 #include "GUI/Models/MultiLayerItem.h"
 #include "GUI/Models/ParticleItem.h"
 #include "GUI/Views/SampleDesigner/InterferenceFunctionViews.h"
@@ -35,7 +36,7 @@ QStringList SampleViewFactory::m_valid_item_types = {
     "Rotation",
     "ParticleCoreShell",
     "ParticleComposition",
-    "MesoCrystal",
+    MesoCrystalItem::M_TYPE,
     InterferenceFunction1DLatticeItem::M_TYPE,
     InterferenceFunction2DLatticeItem::M_TYPE,
     InterferenceFunction2DParaCrystalItem::M_TYPE,
@@ -68,7 +69,7 @@ IView* SampleViewFactory::createSampleView(const QString& model_type)
         return new ParticleCoreShellView();
     } else if (model_type == "ParticleComposition") {
         return new ParticleCompositionView();
-    } else if (model_type == "MesoCrystal") {
+    } else if (model_type == MesoCrystalItem::M_TYPE) {
         return new MesoCrystalView();
     } else if (model_type == InterferenceFunction1DLatticeItem::M_TYPE) {
         return new InterferenceFunction1DLatticeView();