diff --git a/GUI/Models/BeamDistributionItem.cpp b/GUI/Models/BeamDistributionItem.cpp
index 1015dd0ea5005135b71b5ed08603a3c83320d252..417ee04582a00f415dc3058565091d18dd86d10d 100644
--- a/GUI/Models/BeamDistributionItem.cpp
+++ b/GUI/Models/BeamDistributionItem.cpp
@@ -128,11 +128,6 @@ SessionItem* BeamDistributionItem::distributionGroupItem() const
     return getGroupItem(P_DISTRIBUTION);
 }
 
-SessionItem* BeamDistributionItem::setDistributionGroupItem(const QString& model_type)
-{
-    return setGroupProperty(P_DISTRIBUTION, model_type);
-}
-
 SessionItem* BeamDistributionItem::distributionItem() const
 {
     return getItem(P_DISTRIBUTION);
diff --git a/GUI/Models/BeamDistributionItem.h b/GUI/Models/BeamDistributionItem.h
index fb17495facb220330123d429cbb2c66f5f3b2cbc..26d90ea8884d676adcd123ebc63e2682fa0ab410 100644
--- a/GUI/Models/BeamDistributionItem.h
+++ b/GUI/Models/BeamDistributionItem.h
@@ -37,7 +37,7 @@ public:
     virtual double scaleFactor() const;
 
     SessionItem* distributionGroupItem() const;
-    SessionItem* setDistributionGroupItem(const QString& model_type);
+    template<typename T> T* setDistributionGroupItem();
     SessionItem* distributionItem() const;    
 
 protected:
@@ -47,4 +47,14 @@ protected:
     virtual std::unique_ptr<IDistribution1D> createDistribution1D() const;
 };
 
+template<typename T>
+T* BeamDistributionItem::setDistributionGroupItem()
+{
+    static_assert(std::is_base_of<DistributionItem,T>::value,
+                  "Class must be derived from DistributionItem");
+
+    return dynamic_cast<T*>(setGroupProperty(P_DISTRIBUTION, T::M_TYPE));
+}
+
+
 #endif // BORNAGAIN_GUI_MODELS_BEAMDISTRIBUTIONITEM_H
diff --git a/GUI/Models/TransformFromDomain.cpp b/GUI/Models/TransformFromDomain.cpp
index d74793fec0d78f82876ad0c5860d2e6bac47fd58..149fecdc967ce933e450ada8b68cd79f25675f14 100644
--- a/GUI/Models/TransformFromDomain.cpp
+++ b/GUI/Models/TransformFromDomain.cpp
@@ -749,14 +749,13 @@ void setDistribution(BeamDistributionItem* part_distr_item, ParameterDistributio
 
     SessionItem* item = nullptr;
     if (const DistributionGate* distr = dynamic_cast<const DistributionGate*>(p_distribution)) {
-        item = part_distr_item->setDistributionGroupItem(DistributionGateItem::M_TYPE);
+        item = part_distr_item->setDistributionGroupItem<DistributionGateItem>();
         item->setItemValue(DistributionGateItem::P_MIN, factor * distr->lowerBound());
         item->setItemValue(DistributionGateItem::P_MAX, factor * distr->upperBound());
     } else if (const DistributionLorentz* distr =
                    dynamic_cast<const DistributionLorentz*>(p_distribution)) {
         DistributionLorentzItem* distr_lorentz_item =
-            dynamic_cast<DistributionLorentzItem*>
-            (part_distr_item->setDistributionGroupItem(DistributionLorentzItem::M_TYPE));
+            part_distr_item->setDistributionGroupItem<DistributionLorentzItem>();
         distr_lorentz_item->setMeanValue(factor * distr->getMean());
         distr_lorentz_item->setItemValue(DistributionLorentzItem::P_HWHM,
                                          factor * distr->getHWHM());
@@ -764,28 +763,26 @@ void setDistribution(BeamDistributionItem* part_distr_item, ParameterDistributio
     } else if (const DistributionGaussian* distr =
                    dynamic_cast<const DistributionGaussian*>(p_distribution)) {
         DistributionGaussianItem* distr_gauss_item =
-            dynamic_cast<DistributionGaussianItem*>
-            (part_distr_item->setDistributionGroupItem(DistributionGaussianItem::M_TYPE));
+            part_distr_item->setDistributionGroupItem<DistributionGaussianItem>();
         distr_gauss_item->setMeanValue(factor * distr->getMean());
         distr_gauss_item->setItemValue(DistributionGaussianItem::P_STD_DEV,
                                        factor * distr->getStdDev());
         item = distr_gauss_item;
     } else if (const DistributionLogNormal* distr =
                    dynamic_cast<const DistributionLogNormal*>(p_distribution)) {
-        item = part_distr_item->setDistributionGroupItem(DistributionLogNormalItem::M_TYPE);
+        item = part_distr_item->setDistributionGroupItem<DistributionLogNormalItem>();
         item->setItemValue(DistributionLogNormalItem::P_MEDIAN, factor * distr->getMedian());
         item->setItemValue(DistributionLogNormalItem::P_SCALE_PAR, distr->getScalePar());
     } else if (const DistributionCosine* distr =
                    dynamic_cast<const DistributionCosine*>(p_distribution)) {
         DistributionCosineItem* distr_cos_item =
-            dynamic_cast<DistributionCosineItem*>
-            (part_distr_item->setDistributionGroupItem(DistributionCosineItem::M_TYPE));
+            part_distr_item->setDistributionGroupItem<DistributionCosineItem>();
         distr_cos_item->setMeanValue(factor * distr->getMean());
         distr_cos_item->setItemValue(DistributionCosineItem::P_SIGMA, factor * distr->getSigma());
         item = distr_cos_item;
     } else if (const DistributionTrapezoid* distr =
                    dynamic_cast<const DistributionTrapezoid*>(p_distribution)) {
-        item = part_distr_item->setDistributionGroupItem(DistributionTrapezoidItem::M_TYPE);
+        item = part_distr_item->setDistributionGroupItem<DistributionTrapezoidItem>();
         item->setItemValue(DistributionTrapezoidItem::P_CENTER, factor * distr->getMean());
         item->setItemValue(DistributionTrapezoidItem::P_LEFTWIDTH, factor * distr->getLeftWidth());
         item->setItemValue(DistributionTrapezoidItem::P_MIDDLEWIDTH,