diff --git a/GUI/Models/GUIDomainSampleVisitor.cpp b/GUI/Models/GUIDomainSampleVisitor.cpp
index a9988cbffe912944afd2575137d287d71ec10954..6b127f2e348317f8eae8994d79fe86e7602d6ac4 100644
--- a/GUI/Models/GUIDomainSampleVisitor.cpp
+++ b/GUI/Models/GUIDomainSampleVisitor.cpp
@@ -138,7 +138,7 @@ void GUIDomainSampleVisitor::visit(const Particle* sample)
 
 void GUIDomainSampleVisitor::visit(const ParticleCoreShell* sample)
 {
-    InsertIParticle(sample, "ParticleCoreShell");
+    InsertIParticle(sample, ParticleCoreShellItem::M_TYPE);
 }
 
 void GUIDomainSampleVisitor::visit(const ParticleComposition* sample)
@@ -585,7 +585,7 @@ SessionItem* GUIDomainSampleVisitor::InsertIParticle(const IParticle* particle,
     QString tag;
     auto parent_type = parent->modelType();
     if (model_type == ParticleItem::M_TYPE) {
-        if (parent_type == "ParticleCoreShell") {
+        if (parent_type == ParticleCoreShellItem::M_TYPE) {
             const ParticleCoreShell* coreshell =
                 dynamic_cast<const ParticleCoreShell*>(m_itemToSample[parent]);
             ASSERT(coreshell);
diff --git a/GUI/Models/ItemCatalog.cpp b/GUI/Models/ItemCatalog.cpp
index 61dcfb03f60eaa433611c8d8b48b4be4d2478c66..763b088752ec9228ca882b6f7b3d6669f245eedf 100644
--- a/GUI/Models/ItemCatalog.cpp
+++ b/GUI/Models/ItemCatalog.cpp
@@ -68,7 +68,7 @@ ItemCatalog::ItemCatalog()
     add("ParticleLayout", create_new<ParticleLayoutItem>);
     addItem<ParticleItem>();
     add("Rotation", create_new<TransformationItem>);
-    add("ParticleCoreShell", create_new<ParticleCoreShellItem>);
+    addItem<ParticleCoreShellItem>();
     addItem<ParticleCompositionItem>();
     addItem<MesoCrystalItem>();
     addItem<InterferenceFunction1DLatticeItem>();
@@ -255,7 +255,7 @@ QStringList ItemCatalog::validTopItemTypes()
             LayerItem::M_TYPE,
             "ParticleLayout",
             ParticleItem::M_TYPE,
-            "ParticleCoreShell",
+            ParticleCoreShellItem::M_TYPE,
             ParticleCompositionItem::M_TYPE,
             MesoCrystalItem::M_TYPE,
             "Rotation",
diff --git a/GUI/Models/MaterialItemUtils.cpp b/GUI/Models/MaterialItemUtils.cpp
index 9c093739f87ae44ef5fb292686039659c882ae3c..1ed2d22cdf216c12416aee6436e0e696c93e7470 100644
--- a/GUI/Models/MaterialItemUtils.cpp
+++ b/GUI/Models/MaterialItemUtils.cpp
@@ -155,7 +155,7 @@ QVector<SessionItem*> GUI::Model::MaterialItemUtils::materialPropertyItems(Sessi
             particle_holders.push_back(polymorphic_cast<MesoCrystalItem*>(item)->basisParticle());
         else if (item->hasModelType<ParticleItem>())
             materials.append(dynamic_cast<ParticleItem*>(item)->materialPropertyItems());
-        else if (item->modelType() == "ParticleCoreShell")
+        else if (item->hasModelType<ParticleCoreShellItem>())
             materials.append(dynamic_cast<ParticleCoreShellItem*>(item)->materialPropertyItems());
         else
             throw Error("Error in GUI::Model::MaterialItemUtils::materialProperties: cannot handle "
diff --git a/GUI/Models/MesoCrystalItem.cpp b/GUI/Models/MesoCrystalItem.cpp
index 7a07d2350d4f9ddc69a53b7e9cc45d5c459eb390..a7466092ee2506d769522a1c1534d5a68bca58f6 100644
--- a/GUI/Models/MesoCrystalItem.cpp
+++ b/GUI/Models/MesoCrystalItem.cpp
@@ -65,11 +65,8 @@ MesoCrystalItem::MesoCrystalItem()
     addProperty<VectorItem>(P_VECTOR_B)->setToolTip(lattice_vector2_tooltip);
     addProperty<VectorItem>(P_VECTOR_C)->setToolTip(lattice_vector3_tooltip);
 
-    registerTag(T_BASIS_PARTICLE, 0, 1,
-                QStringList() << ParticleItem::M_TYPE
-                              << "ParticleCoreShell"
-                              << ParticleCompositionItem::M_TYPE
-                              << MesoCrystalItem::M_TYPE);
+    registerTag(T_BASIS_PARTICLE, 0, 1, {ParticleItem::M_TYPE, ParticleCoreShellItem::M_TYPE,
+                                         ParticleCompositionItem::M_TYPE, MesoCrystalItem::M_TYPE});
     setDefaultTag(T_BASIS_PARTICLE);
 }
 
@@ -111,10 +108,10 @@ std::unique_ptr<IParticle> MesoCrystalItem::getBasis() const
         if (childlist[i]->hasModelType<ParticleItem>()) {
             auto* particle_item = dynamic_cast<ParticleItem*>(childlist[i]);
             return particle_item->createParticle();
-        } else if (childlist[i]->modelType() == "ParticleCoreShell") {
+        } else if (childlist[i]->hasModelType<ParticleCoreShellItem>()) {
             auto* particle_coreshell_item = dynamic_cast<ParticleCoreShellItem*>(childlist[i]);
             return particle_coreshell_item->createParticleCoreShell();
-        } else if (childlist[i]->modelType() == ParticleCompositionItem::M_TYPE) {
+        } else if (childlist[i]->hasModelType<ParticleCompositionItem>()) {
             auto* particlecomposition_item = dynamic_cast<ParticleCompositionItem*>(childlist[i]);
             return particlecomposition_item->createParticleComposition();
         } else if (childlist[i]->hasModelType<MesoCrystalItem>()) {
diff --git a/GUI/Models/ParticleCompositionItem.cpp b/GUI/Models/ParticleCompositionItem.cpp
index 7be5245e352d5c89cdd15a19b3da52aa051e6ea6..0f79826e522fba0213a3226abfd75c0e64113214 100644
--- a/GUI/Models/ParticleCompositionItem.cpp
+++ b/GUI/Models/ParticleCompositionItem.cpp
@@ -42,11 +42,8 @@ ParticleCompositionItem::ParticleCompositionItem()
 {
     setToolTip("Composition of particles with fixed positions");
 
-    registerTag(T_PARTICLES, 0, -1,
-                QStringList() << ParticleItem::M_TYPE
-                              << "ParticleCoreShell"
-                              << ParticleCompositionItem::M_TYPE
-                              << MesoCrystalItem::M_TYPE);
+    registerTag(T_PARTICLES, 0, -1, {ParticleItem::M_TYPE, ParticleCoreShellItem::M_TYPE,
+                                     ParticleCompositionItem::M_TYPE, MesoCrystalItem::M_TYPE});
     setDefaultTag(T_PARTICLES);
 }
 
@@ -62,7 +59,7 @@ std::unique_ptr<ParticleComposition> ParticleCompositionItem::createParticleComp
             if (P_particle) {
                 P_composition->addParticle(*P_particle);
             }
-        } else if (childlist[i]->modelType() == "ParticleCoreShell") {
+        } else if (childlist[i]->hasModelType<ParticleCoreShellItem>()) {
             auto* particle_coreshell_item = dynamic_cast<ParticleCoreShellItem*>(childlist[i]);
             auto P_particle_coreshell = particle_coreshell_item->createParticleCoreShell();
             if (P_particle_coreshell) {
diff --git a/GUI/Models/ParticleCoreShellItem.cpp b/GUI/Models/ParticleCoreShellItem.cpp
index 20532997d21efd0ab78220ab7087d44474597639..53674d7db36be6e636f9f6284ede995d3e31633c 100644
--- a/GUI/Models/ParticleCoreShellItem.cpp
+++ b/GUI/Models/ParticleCoreShellItem.cpp
@@ -34,9 +34,11 @@ const QString position_tooltip = "Relative position of the particle's reference
 const QString ParticleCoreShellItem::T_CORE = "Core tag";
 const QString ParticleCoreShellItem::T_SHELL = "Shell tag";
 
+const QString ParticleCoreShellItem::M_TYPE = "ParticleCoreShell";
+
 ParticleCoreShellItem::ParticleCoreShellItem()
-    : SessionGraphicsItem("ParticleCoreShell"),
-      ItemWithParticles("ParticleCoreShell", abundance_tooltip, position_tooltip)
+    : SessionGraphicsItem(M_TYPE),
+      ItemWithParticles(M_TYPE, abundance_tooltip, position_tooltip)
 {
     setToolTip("A particle with a core/shell geometry");
 
diff --git a/GUI/Models/ParticleCoreShellItem.h b/GUI/Models/ParticleCoreShellItem.h
index 735983f1a97d3436cf7dbfd91ac702390eb6e3ca..23b2e0df242aa010e471607cccfa4c7232b056fd 100644
--- a/GUI/Models/ParticleCoreShellItem.h
+++ b/GUI/Models/ParticleCoreShellItem.h
@@ -25,6 +25,8 @@ public:
     static const QString T_CORE;
     static const QString T_SHELL;
 
+    static const QString M_TYPE;
+
     ParticleCoreShellItem();
 
     std::unique_ptr<ParticleCoreShell> createParticleCoreShell() const;
diff --git a/GUI/Models/ParticleItem.cpp b/GUI/Models/ParticleItem.cpp
index 24fa01336aea23cf90264c07fe0fedeff1ce7853..16bc9dc734411987cc609444735f0bfa76bd4370 100644
--- a/GUI/Models/ParticleItem.cpp
+++ b/GUI/Models/ParticleItem.cpp
@@ -93,7 +93,7 @@ bool ParticleItem::isShellParticle() const
     if (!parent())
         return false;
 
-    return parent()->modelType() == "ParticleCoreShell"
+    return parent()->hasModelType<ParticleCoreShellItem>()
            && parent()->tagFromItem(this) == ParticleCoreShellItem::T_SHELL;
 }
 
diff --git a/GUI/Models/ParticleLayoutItem.cpp b/GUI/Models/ParticleLayoutItem.cpp
index 4e48570baf53a32fa027299cd0b3f8e3b84f412e..eb068600efd6260d2802627bb3a04e8d99f51c41 100644
--- a/GUI/Models/ParticleLayoutItem.cpp
+++ b/GUI/Models/ParticleLayoutItem.cpp
@@ -17,6 +17,7 @@
 #include "GUI/Models/Lattice2DItems.h"
 #include "GUI/Models/MesoCrystalItem.h"
 #include "GUI/Models/ParticleCompositionItem.h"
+#include "GUI/Models/ParticleCoreShellItem.h"
 #include "GUI/Models/ParticleItem.h"
 #include <QDebug>
 
@@ -60,11 +61,8 @@ ParticleLayoutItem::ParticleLayoutItem() : SessionGraphicsItem("ParticleLayout")
     getItem(P_TOTAL_DENSITY)->setDecimals(10);
     addProperty(P_WEIGHT, 1.0)->setToolTip(weight_tooltip);
 
-    registerTag(T_PARTICLES, 0, -1,
-                QStringList() << ParticleItem::M_TYPE
-                              << "ParticleCoreShell"
-                              << ParticleCompositionItem::M_TYPE
-                              << MesoCrystalItem::M_TYPE);
+    registerTag(T_PARTICLES, 0, -1, {ParticleItem::M_TYPE, ParticleCoreShellItem::M_TYPE,
+                                     ParticleCompositionItem::M_TYPE, MesoCrystalItem::M_TYPE});
     setDefaultTag(T_PARTICLES);
     registerTag(
         T_INTERFERENCE, 0, 1,
diff --git a/GUI/Models/SampleValidator.cpp b/GUI/Models/SampleValidator.cpp
index 071decc49dce598362d2feb760762135be1dd97e..d84b4a9655cc58b42d3767e12270e8c788e8a9a1 100644
--- a/GUI/Models/SampleValidator.cpp
+++ b/GUI/Models/SampleValidator.cpp
@@ -50,7 +50,7 @@ void SampleValidator::validateItem(const SessionItem* item)
         diagnosis = validateMultiLayerItem(polymorphic_downcast<const MultiLayerItem*>(item));
     } else if (item->modelType() == "ParticleLayout") {
         diagnosis = validateParticleLayoutItem(item);
-    } else if (item->modelType() == "ParticleCoreShell") {
+    } else if (item->modelType() == ParticleCoreShellItem::M_TYPE) {
         diagnosis = validateParticleCoreShellItem(item);
     } else if (item->hasModelType<ParticleCompositionItem>()) {
         diagnosis = validateParticleCompositionItem
diff --git a/GUI/Models/SessionItemUtils.cpp b/GUI/Models/SessionItemUtils.cpp
index 8b99ae58be404ce452921d43c0afc8c19a44eebf..05048af49d7cdadd704a40c0f5a58232346ec912 100644
--- a/GUI/Models/SessionItemUtils.cpp
+++ b/GUI/Models/SessionItemUtils.cpp
@@ -17,6 +17,7 @@
 #include "GUI/Models/GroupInfoCatalog.h"
 #include "GUI/Models/MesoCrystalItem.h"
 #include "GUI/Models/ParticleCompositionItem.h"
+#include "GUI/Models/ParticleCoreShellItem.h"
 #include "GUI/Models/SessionGraphicsItem.h"
 #include <QColor>
 #include <QIcon>
@@ -31,9 +32,8 @@ const GroupInfoCatalog& groupInfoCatalog()
 
 QStringList parents_with_abundance()
 {
-    return QStringList() << "ParticleCoreShell"
-                         << ParticleCompositionItem::M_TYPE
-                         << MesoCrystalItem::M_TYPE;
+    return {ParticleCoreShellItem::M_TYPE, ParticleCompositionItem::M_TYPE,
+            MesoCrystalItem::M_TYPE};
 }
 
 } // namespace
diff --git a/GUI/Models/TransformToDomain.cpp b/GUI/Models/TransformToDomain.cpp
index d7530871b6835f9be12ab7134e809eb0b6cbb615..b5b23f709e5a9ac2c4dea86e2bf2b475f6595de2 100644
--- a/GUI/Models/TransformToDomain.cpp
+++ b/GUI/Models/TransformToDomain.cpp
@@ -110,7 +110,7 @@ std::unique_ptr<IParticle> GUI::Transform::ToDomain::createIParticle(const Sessi
     if (item.hasModelType<ParticleItem>()) {
         auto& particle_item = dynamic_cast<const ParticleItem&>(item);
         P_particle = particle_item.createParticle();
-    } else if (item.modelType() == "ParticleCoreShell") {
+    } else if (item.hasModelType<ParticleCoreShellItem>()) {
         auto& particle_coreshell_item = dynamic_cast<const ParticleCoreShellItem&>(item);
         P_particle = particle_coreshell_item.createParticleCoreShell();
     } else if (item.hasModelType<ParticleCompositionItem>()) {
diff --git a/GUI/Views/RealSpaceWidgets/RealSpaceBuilder.cpp b/GUI/Views/RealSpaceWidgets/RealSpaceBuilder.cpp
index 2abb5b8a27c3d1e3872d7d5793b960bfaa4ae7ba..7c64077659654157f73e8a378443c0e037fdf9a8 100644
--- a/GUI/Views/RealSpaceWidgets/RealSpaceBuilder.cpp
+++ b/GUI/Views/RealSpaceWidgets/RealSpaceBuilder.cpp
@@ -63,7 +63,7 @@ void RealSpaceBuilder::populate(RealSpaceModel* model, const SessionItem& item,
     else if (item.hasModelType<ParticleCompositionItem>())
         populateParticleFromParticleItem(model, item);
 
-    else if (item.modelType() == "ParticleCoreShell")
+    else if (item.hasModelType<ParticleCoreShellItem>())
         populateParticleFromParticleItem(model, item);
 
     else if (item.hasModelType<MesoCrystalItem>())
@@ -131,7 +131,7 @@ void RealSpaceBuilder::populateParticleFromParticleItem(RealSpaceModel* model,
         auto pItem = dynamic_cast<const ParticleItem*>(&particleItem);
         auto particle = pItem->createParticle();
         particle3DContainer = GUI::RealSpace::BuilderUtils::singleParticle3DContainer(*particle);
-    } else if (particleItem.modelType() == "ParticleCoreShell") {
+    } else if (particleItem.hasModelType<ParticleCoreShellItem>()) {
         auto particleCoreShellItem = dynamic_cast<const ParticleCoreShellItem*>(&particleItem);
         // If there is no CORE or SHELL to populate inside ParticleCoreShellItem
         if (!particleCoreShellItem->getItem(ParticleCoreShellItem::T_CORE)
diff --git a/GUI/Views/RealSpaceWidgets/RealSpaceBuilderUtils.cpp b/GUI/Views/RealSpaceWidgets/RealSpaceBuilderUtils.cpp
index 8d24ce741b04be19ce0b7ab46ff9d4e78024cafe..abb035033ec9ef228a99c781e9cdd9fadf803fde 100644
--- a/GUI/Views/RealSpaceWidgets/RealSpaceBuilderUtils.cpp
+++ b/GUI/Views/RealSpaceWidgets/RealSpaceBuilderUtils.cpp
@@ -219,7 +219,7 @@ GUI::RealSpace::BuilderUtils::particle3DContainerVector(const SessionItem& layou
             auto pItem = dynamic_cast<const ParticleItem*>(particleItem);
             auto particle = pItem->createParticle();
             particle3DContainer = singleParticle3DContainer(*particle, total_abundance, origin);
-        } else if (particleItem->modelType() == "ParticleCoreShell") {
+        } else if (particleItem->hasModelType<ParticleCoreShellItem>()) {
             auto particleCoreShellItem = dynamic_cast<const ParticleCoreShellItem*>(particleItem);
             // If there is no CORE or SHELL to populate inside ParticleCoreShellItem
             if (!particleCoreShellItem->getItem(ParticleCoreShellItem::T_CORE)
diff --git a/GUI/Views/SampleDesigner/DesignerScene.cpp b/GUI/Views/SampleDesigner/DesignerScene.cpp
index f01929e6734fc0febb9f5a770a88e0550b75968b..ba0bf818347717a813e81a628d3adc42352b5ca2 100644
--- a/GUI/Views/SampleDesigner/DesignerScene.cpp
+++ b/GUI/Views/SampleDesigner/DesignerScene.cpp
@@ -362,14 +362,14 @@ void DesignerScene::onEstablishedConnection(NodeEditorConnection* connection_ptr
     if (parentItem->modelType() == "ParticleLayout") {
         if (connection->inputPort()->getPortType() == NodeEditorPort::INTERFERENCE)
             tag = ParticleLayoutItem::T_INTERFERENCE;
-    } else if ((parentItem->modelType() == "ParticleCoreShell"
+    } else if ((parentItem->hasModelType<ParticleCoreShellItem>()
                 || parentItem->hasModelType<ParticleCompositionItem>()
                 || parentItem->hasModelType<MesoCrystalItem>())
                && connection->inputPort()->getPortType() == NodeEditorPort::TRANSFORMATION) {
         polymorphic_cast<ItemWithParticles*>(parentItem)->setTransformation
             (polymorphic_downcast<RotationItem*>(childItem));
         return;
-    } else if (parentItem->modelType() == "ParticleCoreShell") {
+    } else if (parentItem->hasModelType<ParticleCoreShellItem>()) {
         if (parentView->getInputPortIndex(connection->inputPort()) == 0)
             tag = ParticleCoreShellItem::T_CORE;
         else if (parentView->getInputPortIndex(connection->inputPort()) == 1)
diff --git a/GUI/Views/SampleDesigner/SampleViewFactory.cpp b/GUI/Views/SampleDesigner/SampleViewFactory.cpp
index 66ff0e18cceff2f8dfa3b321a31dbcdaa6607805..ddcb881c1b3d977858c711867a299f034aeeff8c 100644
--- a/GUI/Views/SampleDesigner/SampleViewFactory.cpp
+++ b/GUI/Views/SampleDesigner/SampleViewFactory.cpp
@@ -18,6 +18,7 @@
 #include "GUI/Models/MesoCrystalItem.h"
 #include "GUI/Models/MultiLayerItem.h"
 #include "GUI/Models/ParticleCompositionItem.h"
+#include "GUI/Models/ParticleCoreShellItem.h"
 #include "GUI/Models/ParticleItem.h"
 #include "GUI/Views/SampleDesigner/InterferenceFunctionViews.h"
 #include "GUI/Views/SampleDesigner/LayerView.h"
@@ -35,7 +36,7 @@ QStringList SampleViewFactory::m_valid_item_types = {
     "ParticleLayout",
     ParticleItem::M_TYPE,
     "Rotation",
-    "ParticleCoreShell",
+    ParticleCoreShellItem::M_TYPE,
     ParticleCompositionItem::M_TYPE,
     MesoCrystalItem::M_TYPE,
     InterferenceFunction1DLatticeItem::M_TYPE,
@@ -66,7 +67,7 @@ IView* SampleViewFactory::createSampleView(const QString& model_type)
         return new ParticleView();
     } else if (model_type == "Rotation") {
         return new TransformationView();
-    } else if (model_type == "ParticleCoreShell") {
+    } else if (model_type == ParticleCoreShellItem::M_TYPE) {
         return new ParticleCoreShellView();
     } else if (model_type == ParticleCompositionItem::M_TYPE) {
         return new ParticleCompositionView();