diff --git a/GUI/Models/ItemCatalog.cpp b/GUI/Models/ItemCatalog.cpp
index 2b4a41fcd5d1334a108a98ae6869d4e21e0c3c22..c890517c3e2dcea5e3c4e6dac5879f6d5ba90e81 100644
--- a/GUI/Models/ItemCatalog.cpp
+++ b/GUI/Models/ItemCatalog.cpp
@@ -80,8 +80,8 @@ ItemCatalog::ItemCatalog()
     add("GISASInstrument", create_new<GISASInstrumentItem>);
     add("OffSpecularInstrument", create_new<OffSpecularInstrumentItem>);
     add("SpecularInstrument", create_new<SpecularInstrumentItem>);
-    add(GISASBeamItem::M_TYPE, create_new<GISASBeamItem>);
-    add(SpecularBeamItem::M_TYPE, create_new<SpecularBeamItem>);
+    addItem<GISASBeamItem>();
+    addItem<SpecularBeamItem>();
     add("NoBackground", create_new<BackgroundNoneItem>);
     add("ConstantBackground", create_new<ConstantBackgroundItem>);
     add("PoissonNoiseBackground", create_new<PoissonNoiseBackgroundItem>);
@@ -165,16 +165,16 @@ ItemCatalog::ItemCatalog()
     add("SquareLattice2D", create_new<SquareLattice2DItem>);
     add("HexagonalLattice2D", create_new<HexagonalLattice2DItem>);
 
-    add(MaterialItem::M_TYPE, create_new<MaterialItem>);
-    add(MaterialItemContainer::M_TYPE, create_new<MaterialItemContainer>);
+    addItem<MaterialItem>();
+    addItem<MaterialItemContainer>();
 
-    add(MaterialRefractiveDataItem::M_TYPE, create_new<MaterialRefractiveDataItem>);
-    add(MaterialSLDDataItem::M_TYPE, create_new<MaterialSLDDataItem>);
+    addItem<MaterialRefractiveDataItem>();
+    addItem<MaterialSLDDataItem>();
 
     add("JobItem", create_new<JobItem>);
 
-    add(IntensityDataItem::M_TYPE, create_new<IntensityDataItem>);
-    add(SpecularDataItem::M_TYPE, create_new<SpecularDataItem>);
+    addItem<IntensityDataItem>();
+    addItem<SpecularDataItem>();
     add("Data1DViewItem", create_new<Data1DViewItem>);
     add("DataPropertyContainer", create_new<DataPropertyContainer>);
     add("DataItem1DProperties", create_new<Data1DProperties>);
@@ -269,3 +269,9 @@ void ItemCatalog::add(const QString& modelType, std::function<SessionItem*()> f)
 {
     m_data.registerItem(modelType, f);
 }
+
+template<typename T>
+void ItemCatalog::addItem()
+{
+    m_data.registerItem(T::M_TYPE, create_new<T>);
+}
diff --git a/GUI/Models/ItemCatalog.h b/GUI/Models/ItemCatalog.h
index f1b36f8bc2b27dac32a39bae46d5a0d4b13e6056..b995c3ea53c66d8bad3b540f2a401f906e8b3832 100644
--- a/GUI/Models/ItemCatalog.h
+++ b/GUI/Models/ItemCatalog.h
@@ -34,6 +34,8 @@ public:
 private:
     void add(const QString& modelType, std::function<SessionItem*()> f);
 
+    template <typename T> void addItem();
+    
     IFactory<QString, SessionItem> m_data;
 };