diff --git a/GUI/Model/Beam/GrazingScanItem.cpp b/GUI/Model/Beam/GrazingScanItem.cpp
index f1e98861e929253aecce7b940a2ee569e332655e..7c4f205ad8092ca3da97092bae724df5d39b15d9 100644
--- a/GUI/Model/Beam/GrazingScanItem.cpp
+++ b/GUI/Model/Beam/GrazingScanItem.cpp
@@ -108,13 +108,11 @@ void GrazingScanItem::readFrom(QXmlStreamReader* r)
         else if (tag == Tag::UniformAxis) {
             m_uniform_alpha_axis = std::make_unique<BasicAxisItem>();
             setAxisPresentationDefaults(m_uniform_alpha_axis.get());
-            m_uniform_alpha_axis->readFrom(r);
-            XML::gotoEndElementOfTag(r, tag);
+            XML::readTaggedElement(r, tag, *m_uniform_alpha_axis);
         } else if (tag == Tag::ListScan || tag == Tag::PointwiseAxis) { // compatibility with pre-21
             m_pointwise_alpha_axis = std::make_unique<PointwiseAxisItem>();
             setAxisPresentationDefaults(m_pointwise_alpha_axis.get());
-            m_pointwise_alpha_axis->readFrom(r);
-            XML::gotoEndElementOfTag(r, tag);
+            XML::readTaggedElement(r, tag, *m_pointwise_alpha_axis);
 
         } else
             r->skipCurrentElement();
diff --git a/GUI/Model/Beam/SourceItems.cpp b/GUI/Model/Beam/SourceItems.cpp
index 1d61c688110d4034158ec8a6c20af1bdd86dddeb..ebb92b6e9cbbb8b45d83fc9edf95c5fc4a1f663f 100644
--- a/GUI/Model/Beam/SourceItems.cpp
+++ b/GUI/Model/Beam/SourceItems.cpp
@@ -83,13 +83,11 @@ void SourceItem::readFrom(QXmlStreamReader* r)
         QString tag = r->name().toString();
         if (tag == Tag::Intensity) {
             m_intensity.readFrom2(r, tag);
-        } else if (tag == Tag::Wavelength) {
-            m_wavelength_item->readFrom(r);
-            XML::gotoEndElementOfTag(r, tag);
-        } else if (tag == Tag::AzimuthalAngle) {
-            m_azimuthal_angle_item->readFrom(r);
-            XML::gotoEndElementOfTag(r, tag);
-        } else if (tag == Tag::ExpandBeamParametersGroupbox)
+        } else if (tag == Tag::Wavelength)
+            XML::readTaggedElement(r, tag, *m_wavelength_item);
+        else if (tag == Tag::AzimuthalAngle)
+            XML::readTaggedElement(r, tag, *m_azimuthal_angle_item);
+        else if (tag == Tag::ExpandBeamParametersGroupbox)
             expandBeamParameters = XML::readTaggedBool(r, tag);
         else if (tag == Tag::Footprint)
             XML::readTaggedElement(r, tag, m_footprint);
@@ -187,11 +185,10 @@ void BeamItem::readFrom(QXmlStreamReader* r)
         if (tag == Tag::BaseData) {
             SourceItem::readFrom(r);
             XML::gotoEndElementOfTag(r, tag);
-        } else if (tag == Tag::InclinationAngle) {
-            m_inclination_angle_item->readFrom(r);
-            XML::gotoEndElementOfTag(r, tag);
+        } else if (tag == Tag::InclinationAngle)
+            XML::readTaggedElement(r, tag, *m_inclination_angle_item);
 
-        } else
+        else
             r->skipCurrentElement();
     }
 }
@@ -277,11 +274,10 @@ void ScanItem::readFrom(QXmlStreamReader* r)
             // footprint groupbox: is expanded? (moved to base class since v21 (version == 2))
         } else if (version == 1 && tag == Tag::ExpandFootprintGroupbox)
             expandFootprint = XML::readTaggedBool(r, tag);
-        else if (tag == Tag::GrazingScan) {
-            m_grazing_scan_item->readFrom(r);
-            XML::gotoEndElementOfTag(r, tag);
+        else if (tag == Tag::GrazingScan)
+            XML::readTaggedElement(r, tag, *m_grazing_scan_item);
 
-        } else
+        else
             r->skipCurrentElement();
     }
 }
diff --git a/GUI/Model/Data/Data2DItem.cpp b/GUI/Model/Data/Data2DItem.cpp
index 5e3b86d424f61b420edbd1901eea818d3e88c51d..3624287e79130b0e0021c87cd708e7f9bc521323 100644
--- a/GUI/Model/Data/Data2DItem.cpp
+++ b/GUI/Model/Data/Data2DItem.cpp
@@ -231,11 +231,10 @@ void Data2DItem::readFrom(QXmlStreamReader* r)
             XML::gotoEndElementOfTag(r, tag);
         } else if (tag == Tag::Interpolation)
             m_is_interpolated = XML::readTaggedBool(r, tag);
-        else if (tag == Tag::ZAxis) {
-            m_z_axis->readFrom(r);
-            XML::gotoEndElementOfTag(r, tag);
+        else if (tag == Tag::ZAxis)
+            XML::readTaggedElement(r, tag, *m_z_axis);
 
-        } else
+        else
             r->skipCurrentElement();
     }
 }
diff --git a/GUI/Model/Data/DataItem.cpp b/GUI/Model/Data/DataItem.cpp
index 75d646de6fac4dd6fa781ab026f7939ee2568792..af3848c6e58b2398253117006fe27472387589dd 100644
--- a/GUI/Model/Data/DataItem.cpp
+++ b/GUI/Model/Data/DataItem.cpp
@@ -230,14 +230,12 @@ void DataItem::readFrom(QXmlStreamReader* r)
         QString tag = r->name().toString();
         if (tag == Tag::FileName)
             m_fname = XML::readTaggedString(r, tag);
-        else if (tag == Tag::XAxis) {
-            m_x_axis->readFrom(r);
-            XML::gotoEndElementOfTag(r, tag);
-        } else if (tag == Tag::YAxis) {
-            m_y_axis->readFrom(r);
-            XML::gotoEndElementOfTag(r, tag);
-
-        } else
+        else if (tag == Tag::XAxis)
+            XML::readTaggedElement(r, tag, *m_x_axis);
+        else if (tag == Tag::YAxis)
+            XML::readTaggedElement(r, tag, *m_y_axis);
+
+        else
             r->skipCurrentElement();
     }
 }
diff --git a/GUI/Model/Detector/DetectorItem.cpp b/GUI/Model/Detector/DetectorItem.cpp
index 780788e30f457eff3ca058cb9f91f76cf2516f36..fcc6870b8201d5f8548a58b80210eff021f98613 100644
--- a/GUI/Model/Detector/DetectorItem.cpp
+++ b/GUI/Model/Detector/DetectorItem.cpp
@@ -112,14 +112,12 @@ void DetectorItem::readFrom(QXmlStreamReader* r)
             XML::readTaggedElement(r, tag, m_resolution_function);
         else if (tag == Tag::ExpandResolutionFuncGroupbox)
             expandResolutionFunc = XML::readTaggedBool(r, tag);
-        else if (tag == Tag::MaskContainer) {
-            m_masks->readFrom(r);
-            XML::gotoEndElementOfTag(r, tag);
-        } else if (tag == Tag::ProjectionContainer) {
-            m_prjns->readFrom(r);
-            XML::gotoEndElementOfTag(r, tag);
-
-        } else
+        else if (tag == Tag::MaskContainer)
+            XML::readTaggedElement(r, tag, *m_masks);
+        else if (tag == Tag::ProjectionContainer)
+            XML::readTaggedElement(r, tag, *m_prjns);
+
+        else
             r->skipCurrentElement();
     }
 }
diff --git a/GUI/Model/File/DatafileItem.cpp b/GUI/Model/File/DatafileItem.cpp
index a274e18d86ed46656f0846b8886250e35666ccb3..333f32d1b8dcc721fd421ca5f944ee6b185c7de9 100644
--- a/GUI/Model/File/DatafileItem.cpp
+++ b/GUI/Model/File/DatafileItem.cpp
@@ -167,8 +167,7 @@ void DatafileItem::readFrom(QXmlStreamReader* r)
                 m_data_item = std::make_unique<Data2DItem>();
             else
                 ASSERT_NEVER;
-            m_data_item->readFrom(r);
-            XML::gotoEndElementOfTag(r, tag);
+            XML::readTaggedElement(r, tag, *m_data_item);
 
         } else
             r->skipCurrentElement();
diff --git a/GUI/Model/Job/JobItem.cpp b/GUI/Model/Job/JobItem.cpp
index 33ac005570869d30e198cf57f7973e147de17374..23be55dd2bac9ddc085aa52df815d837adb81cfa 100644
--- a/GUI/Model/Job/JobItem.cpp
+++ b/GUI/Model/Job/JobItem.cpp
@@ -238,37 +238,31 @@ void JobItem::readFrom(QXmlStreamReader* r)
 
     while (r->readNextStartElement()) {
         QString tag = r->name().toString();
-        if (tag == Tag::SimulationOptions) {
-            m_simulation_options_item->readFrom(r);
-            XML::gotoEndElementOfTag(r, tag);
-        } else if (tag == Tag::Instrument)
+        if (tag == Tag::SimulationOptions)
+            XML::readTaggedElement(r, tag, *m_simulation_options_item);
+        else if (tag == Tag::Instrument)
             XML::readTaggedElement(r, tag, m_instrument);
         else if (tag == Tag::ParameterContainer) {
             createParameterTree();
-            m_parameter_container->readFrom(r);
-            XML::gotoEndElementOfTag(r, tag);
-        } else if (tag == Tag::Sample) {
-            m_sample_item->readFrom(r);
-            XML::gotoEndElementOfTag(r, tag);
-        } else if (tag == Tag::Activity)
+            XML::readTaggedElement(r, tag, *m_parameter_container);
+        } else if (tag == Tag::Sample)
+            XML::readTaggedElement(r, tag, *m_sample_item);
+        else if (tag == Tag::Activity)
             m_activity = XML::readTaggedString(r, tag);
-        else if (tag == Tag::BatchInfo) {
-            m_batch_info->readFrom(r);
-            XML::gotoEndElementOfTag(r, tag);
-        } else if (tag == Tag::SimulatedData) {
+        else if (tag == Tag::BatchInfo)
+            XML::readTaggedElement(r, tag, *m_batch_info);
+        else if (tag == Tag::SimulatedData) {
             createSimulatedDataItem();
-            m_simulated_data_item->readFrom(r);
-            XML::gotoEndElementOfTag(r, tag);
+            XML::readTaggedElement(r, tag, *m_simulated_data_item);
         } else if (tag == Tag::DatafileItem) {
             m_dfile_item = std::make_unique<DatafileItem>();
             m_dfile_item->readFrom(r);
             createDiffDataItem()->checkXYranges(m_dfile_item->dataItem());
             XML::gotoEndElementOfTag(r, tag);
-        } else if (tag == Tag::FitSuite) {
-            m_fit_suite_item->readFrom(r);
-            XML::gotoEndElementOfTag(r, tag);
+        } else if (tag == Tag::FitSuite)
+            XML::readTaggedElement(r, tag, *m_fit_suite_item);
 
-        } else
+        else
             r->skipCurrentElement();
     }
 }
diff --git a/GUI/Model/Job/JobsSet.cpp b/GUI/Model/Job/JobsSet.cpp
index cb37d0f903b7d42fff7729128460fe655dd45fdc..e09104ad127528d66fbe707cf385c6fdbb82350b 100644
--- a/GUI/Model/Job/JobsSet.cpp
+++ b/GUI/Model/Job/JobsSet.cpp
@@ -61,8 +61,7 @@ void JobsSet::readFrom(QXmlStreamReader* r)
         QString tag = r->name().toString();
         if (tag == Tag::Job) {
             auto* job_item = createJobItem();
-            job_item->readFrom(r);
-            XML::gotoEndElementOfTag(r, tag);
+            XML::readTaggedElement(r, tag, *job_item);
         } else if (tag == Tag::CurrentIndex) {
             size_t i = XML::readTaggedSize(r, tag);
             setCurrentIndex(i);
diff --git a/GUI/Model/Mini/MinimizerItems.cpp b/GUI/Model/Mini/MinimizerItems.cpp
index a641a103dd6d4f7f84a9d5669decf20ef80ee88b..93dda943896158cd7ad3831c9cc7f66932aec218 100644
--- a/GUI/Model/Mini/MinimizerItems.cpp
+++ b/GUI/Model/Mini/MinimizerItems.cpp
@@ -313,23 +313,18 @@ void MinimizerContainerItem::readFrom(QXmlStreamReader* r)
             XML::readTaggedElement(r, tag, m_metric);
         else if (tag == Tag::Norm)
             XML::readTaggedElement(r, tag, m_norm);
-        else if (tag == Tag::MinuitMinimizer) {
-            m_MinuitMinimizer->readFrom(r);
-            XML::gotoEndElementOfTag(r, tag);
-        } else if (tag == Tag::GSLMultiMinimizer) {
-            m_GSLMultiMinimizer->readFrom(r);
-            XML::gotoEndElementOfTag(r, tag);
-        } else if (tag == Tag::GeneticMinimizer) {
-            m_GeneticMinimizer->readFrom(r);
-            XML::gotoEndElementOfTag(r, tag);
-        } else if (tag == Tag::SimAnMinimizer) {
-            m_SimAnMinimizer->readFrom(r);
-            XML::gotoEndElementOfTag(r, tag);
-        } else if (tag == Tag::GSLLMAMinimizer) {
-            m_GSLLMAMinimizer->readFrom(r);
-            XML::gotoEndElementOfTag(r, tag);
-
-        } else
+        else if (tag == Tag::MinuitMinimizer)
+            XML::readTaggedElement(r, tag, *m_MinuitMinimizer);
+        else if (tag == Tag::GSLMultiMinimizer)
+            XML::readTaggedElement(r, tag, *m_GSLMultiMinimizer);
+        else if (tag == Tag::GeneticMinimizer)
+            XML::readTaggedElement(r, tag, *m_GeneticMinimizer);
+        else if (tag == Tag::SimAnMinimizer)
+            XML::readTaggedElement(r, tag, *m_SimAnMinimizer);
+        else if (tag == Tag::GSLLMAMinimizer)
+            XML::readTaggedElement(r, tag, *m_GSLLMAMinimizer);
+
+        else
             r->skipCurrentElement();
     }
 }
diff --git a/GUI/Model/Par/ParameterTreeItems.cpp b/GUI/Model/Par/ParameterTreeItems.cpp
index 1d41a80afeb4359fb507918ae80aa1c1ca0419c9..96d5873b265cf0c1ca4e544483a6bf6786409f62 100644
--- a/GUI/Model/Par/ParameterTreeItems.cpp
+++ b/GUI/Model/Par/ParameterTreeItems.cpp
@@ -199,8 +199,7 @@ void ParameterContainerItem::readFrom(QXmlStreamReader* r)
         } else if (tag == Tag::ParameterLabels) {
             auto list = m_parameter_tree_root->findChildren<ParameterLabelItem*>();
             for (const auto& item : list)
-                item->readFrom(r);
-            XML::gotoEndElementOfTag(r, tag);
+                XML::readTaggedElement(r, tag, *item);
 
         } else
             r->skipCurrentElement();
diff --git a/GUI/Model/Sim/InstrumentItems.cpp b/GUI/Model/Sim/InstrumentItems.cpp
index a79df0815714f6f1e1617132e5c92766ff0f3b80..050dc1f93a3b27d606c5bb640d8c72321adb6106 100644
--- a/GUI/Model/Sim/InstrumentItems.cpp
+++ b/GUI/Model/Sim/InstrumentItems.cpp
@@ -239,11 +239,10 @@ void ScanningInstrumentItem::readFrom(QXmlStreamReader* r)
 
     while (r->readNextStartElement()) {
         QString tag = r->name().toString();
-        if (tag == Tag::Scan) {
-            m_scan_item->readFrom(r);
-            XML::gotoEndElementOfTag(r, tag);
+        if (tag == Tag::Scan)
+            XML::readTaggedElement(r, tag, *m_scan_item);
 
-        } else
+        else
             r->skipCurrentElement();
     }
 }
@@ -324,14 +323,12 @@ void Scatter2DInstrumentItem::readFrom(QXmlStreamReader* r)
         if (tag == Tag::BaseData) {
             InstrumentItem::readFrom(r);
             XML::gotoEndElementOfTag(r, tag);
-        } else if (tag == Tag::Beam) {
-            m_beam_item->readFrom(r);
-            XML::gotoEndElementOfTag(r, tag);
-        } else if (tag == Tag::Detector) {
-            m_detector_item->readFrom(r);
-            XML::gotoEndElementOfTag(r, tag);
+        } else if (tag == Tag::Beam)
+            XML::readTaggedElement(r, tag, *m_beam_item);
+        else if (tag == Tag::Detector)
+            XML::readTaggedElement(r, tag, *m_detector_item);
 
-        } else
+        else
             r->skipCurrentElement();
     }
 }
@@ -421,11 +418,10 @@ void OffspecInstrumentItem::readFrom(QXmlStreamReader* r)
         } else if (tag == Tag::ScanParameters) {
             ScanningInstrumentItem::readFrom(r);
             XML::gotoEndElementOfTag(r, tag);
-        } else if (tag == Tag::Detector) {
-            m_detector->readFrom(r);
-            XML::gotoEndElementOfTag(r, tag);
+        } else if (tag == Tag::Detector)
+            XML::readTaggedElement(r, tag, *m_detector);
 
-        } else
+        else
             r->skipCurrentElement();
     }
 }
diff --git a/GUI/Model/Tune/FitParameterItem.cpp b/GUI/Model/Tune/FitParameterItem.cpp
index b34c6a881e7c3f5e300e27a521413a698c8feb90..78cbe72662749780ec776e427933a58633a7d531 100644
--- a/GUI/Model/Tune/FitParameterItem.cpp
+++ b/GUI/Model/Tune/FitParameterItem.cpp
@@ -352,19 +352,15 @@ void FitParameterItem::readFrom(QXmlStreamReader* r)
         QString tag = r->name().toString();
         if (tag == Tag::DisplayName)
             m_display_name = XML::readTaggedString(r, tag);
-        else if (tag == Tag::TypeItem) {
-            m_type_item->readFrom(r);
-            XML::gotoEndElementOfTag(r, tag);
-        } else if (tag == Tag::StartValue) {
-            m_start_value_item->readFrom(r);
-            XML::gotoEndElementOfTag(r, tag);
-        } else if (tag == Tag::MinValue) {
-            m_min_item->readFrom(r);
-            XML::gotoEndElementOfTag(r, tag);
-        } else if (tag == Tag::MaxValue) {
-            m_max_item->readFrom(r);
-            XML::gotoEndElementOfTag(r, tag);
-        } else if (tag == Tag::FitLinkItem) {
+        else if (tag == Tag::TypeItem)
+            XML::readTaggedElement(r, tag, *m_type_item);
+        else if (tag == Tag::StartValue)
+            XML::readTaggedElement(r, tag, *m_start_value_item);
+        else if (tag == Tag::MinValue)
+            XML::readTaggedElement(r, tag, *m_min_item);
+        else if (tag == Tag::MaxValue)
+            XML::readTaggedElement(r, tag, *m_max_item);
+        else if (tag == Tag::FitLinkItem) {
             addLinkItem("", "")->readFrom(r);
             XML::gotoEndElementOfTag(r, tag);
 
diff --git a/GUI/Model/Tune/FitParameterLinkItem.cpp b/GUI/Model/Tune/FitParameterLinkItem.cpp
index d2e1094b91cc90d6dde54e4d93f8e7cc74316042..4e28c29e58956afbf845d11640989fdd39db9217 100644
--- a/GUI/Model/Tune/FitParameterLinkItem.cpp
+++ b/GUI/Model/Tune/FitParameterLinkItem.cpp
@@ -80,11 +80,10 @@ void FitParameterLinkItem::readFrom(QXmlStreamReader* r)
         QString tag = r->name().toString();
         if (tag == Tag::Title)
             m_title = XML::readTaggedString(r, tag);
-        else if (tag == Tag::LinkItem) {
-            m_link_item->readFrom(r);
-            XML::gotoEndElementOfTag(r, tag);
+        else if (tag == Tag::LinkItem)
+            XML::readTaggedElement(r, tag, *m_link_item);
 
-        } else
+        else
             r->skipCurrentElement();
     }
 }
diff --git a/GUI/Model/Tune/FitSuiteItem.cpp b/GUI/Model/Tune/FitSuiteItem.cpp
index 26976a6a026c9ed2b32f48ddfd9da8894bcf7c3f..4d2494442fa4537348398cf82b889e1d1262d038 100644
--- a/GUI/Model/Tune/FitSuiteItem.cpp
+++ b/GUI/Model/Tune/FitSuiteItem.cpp
@@ -90,14 +90,12 @@ void FitSuiteItem::readFrom(QXmlStreamReader* r)
             m_iter_count = XML::readTaggedInt(r, tag);
         else if (tag == Tag::Chi2)
             m_chi2 = XML::readTaggedDouble(r, tag);
-        else if (tag == Tag::MinimizerContainer) {
-            m_minimizer_container->readFrom(r);
-            XML::gotoEndElementOfTag(r, tag);
-        } else if (tag == Tag::FitParameterContainer) {
-            m_fit_container->readFrom(r);
-            XML::gotoEndElementOfTag(r, tag);
-
-        } else
+        else if (tag == Tag::MinimizerContainer)
+            XML::readTaggedElement(r, tag, *m_minimizer_container);
+        else if (tag == Tag::FitParameterContainer)
+            XML::readTaggedElement(r, tag, *m_fit_container);
+
+        else
             r->skipCurrentElement();
     }
 }