diff --git a/GUI/Model/Data/DataItem.cpp b/GUI/Model/Data/DataItem.cpp
index b541159594aff7b81941366a51a26066e9576581..bffd5caef4dcbae6b80eeb58e5b313bd30c94450 100644
--- a/GUI/Model/Data/DataItem.cpp
+++ b/GUI/Model/Data/DataItem.cpp
@@ -19,7 +19,6 @@
 #include "GUI/Util/Error.h"
 
 namespace {
-
 namespace Tag {
 
 const QString FileName("FileName");
@@ -28,13 +27,6 @@ const QString XAxis("XAxis");
 const QString YAxis("YAxis");
 
 } // namespace Tag
-
-namespace Attrib {
-
-const QString value("value");
-
-} // namespace Attrib
-
 } // namespace
 
 const QString x_axis_default_name = "X [nbins]";
@@ -267,11 +259,13 @@ void DataItem::setAxesRangeToData()
     setUpperY(yMax());
 }
 
-void DataItem::writeTo(QXmlStreamWriter* writer) const
+void DataItem::writeBaseData(QXmlStreamWriter* writer) const
 {
+    XML::writeAttribute(writer, XML::Attrib::version, uint(1));
+
     // file name
     writer->writeStartElement(Tag::FileName);
-    XML::writeAttribute(writer, Attrib::value, m_fileName);
+    XML::writeAttribute(writer, XML::Attrib::value, m_fileName);
     writer->writeEndElement();
 
     // axes units
@@ -290,34 +284,35 @@ void DataItem::writeTo(QXmlStreamWriter* writer) const
     writer->writeEndElement();
 }
 
-void DataItem::readFrom(QXmlStreamReader* reader)
+void DataItem::readBaseData(QXmlStreamReader* reader)
 {
-    while (reader->readNextStartElement())
-        readBasicTags(reader);
-}
+    uint version = XML::readUIntAttribute(reader, XML::Attrib::version);
+    Q_UNUSED(version)
 
-void DataItem::readBasicTags(QXmlStreamReader* reader)
-{
-    // file name
-    if (reader->name() == Tag::FileName) {
-        XML::readAttribute(reader, Attrib::value, &m_fileName);
-        XML::gotoEndElementOfTag(reader, Tag::FileName);
-
-        // axes units
-    } else if (reader->name() == Tag::AxesUnits) {
-        m_axesUnits.readFrom(reader);
-        XML::gotoEndElementOfTag(reader, Tag::AxesUnits);
-
-        // x axis
-    } else if (reader->name() == Tag::XAxis) {
-        m_xAxis->readFrom(reader);
-        XML::gotoEndElementOfTag(reader, Tag::XAxis);
-
-        // y axis
-    } else if (reader->name() == Tag::YAxis) {
-        m_yAxis->readFrom(reader);
-        XML::gotoEndElementOfTag(reader, Tag::YAxis);
-
-    } else
-        reader->skipCurrentElement();
+    while (reader->readNextStartElement()) {
+        QString name = reader->name().toString();
+
+        // file name
+        if (name == Tag::FileName) {
+            XML::readAttribute(reader, XML::Attrib::value, &m_fileName);
+            XML::gotoEndElementOfTag(reader, name);
+
+            // axes units
+        } else if (name == Tag::AxesUnits) {
+            m_axesUnits.readFrom(reader);
+            XML::gotoEndElementOfTag(reader, name);
+
+            // x axis
+        } else if (name == Tag::XAxis) {
+            m_xAxis->readFrom(reader);
+            XML::gotoEndElementOfTag(reader, name);
+
+            // y axis
+        } else if (name == Tag::YAxis) {
+            m_yAxis->readFrom(reader);
+            XML::gotoEndElementOfTag(reader, name);
+
+        } else
+            reader->skipCurrentElement();
+    }
 }
diff --git a/GUI/Model/Data/DataItem.h b/GUI/Model/Data/DataItem.h
index 0c5756fef1faa4d81619b357df058b1c49868649..efe24cce3eaa16822b0e78d3ce8eb9bd440d24ee 100644
--- a/GUI/Model/Data/DataItem.h
+++ b/GUI/Model/Data/DataItem.h
@@ -121,11 +121,12 @@ public:
     //! Set axes viewport to original data.
     virtual void resetView() = 0;
 
+    virtual void writeTo(QXmlStreamWriter* writer) const = 0;
+    virtual void readFrom(QXmlStreamReader* reader) = 0;
+
 protected:
-    // write/read
-    virtual void writeTo(QXmlStreamWriter* writer) const;
-    virtual void readFrom(QXmlStreamReader* reader);
-    void readBasicTags(QXmlStreamReader* reader);
+    void writeBaseData(QXmlStreamWriter* writer) const;
+    void readBaseData(QXmlStreamReader* reader);
 
 signals:
     void datafieldChanged();
diff --git a/GUI/Model/Data/IntensityDataItem.cpp b/GUI/Model/Data/IntensityDataItem.cpp
index 8214f5d92950d6fcf002178b9149a6826038fd38..a2a629536966b7ce34b6adf35044a1b2862fe8bd 100644
--- a/GUI/Model/Data/IntensityDataItem.cpp
+++ b/GUI/Model/Data/IntensityDataItem.cpp
@@ -28,18 +28,13 @@ namespace {
 
 namespace Tag {
 
+const QString BaseData("BaseData");
 const QString ZAxis("ZAxis");
 const QString Interpolation("Interpolation");
 const QString Gradient("Gradient");
 
 } // namespace Tag
 
-namespace Attrib {
-
-const QString value("value");
-
-} // namespace Attrib
-
 // gradient map for colormaps
 const QMap<QString, QCPColorGradient::GradientPreset> gradient_map = {
     {"Grayscale", QCPColorGradient::gpGrayscale},
@@ -321,11 +316,16 @@ void IntensityDataItem::resetView()
 
 void IntensityDataItem::writeTo(QXmlStreamWriter* writer) const
 {
-    DataItem::writeTo(writer);
+    XML::writeAttribute(writer, XML::Attrib::version, uint(1));
+
+    // parameters from base class
+    writer->writeStartElement(Tag::BaseData);
+    DataItem::writeBaseData(writer);
+    writer->writeEndElement();
 
     // interpolation
     writer->writeStartElement(Tag::Interpolation);
-    XML::writeAttribute(writer, Attrib::value, m_isInterpolated);
+    XML::writeAttribute(writer, XML::Attrib::value, m_isInterpolated);
     writer->writeEndElement();
 
     // gradient
@@ -341,27 +341,34 @@ void IntensityDataItem::writeTo(QXmlStreamWriter* writer) const
 
 void IntensityDataItem::readFrom(QXmlStreamReader* reader)
 {
+    uint version = XML::readUIntAttribute(reader, XML::Attrib::version);
+    Q_UNUSED(version)
+
     while (reader->readNextStartElement()) {
+        QString name = reader->name().toString();
+
+        // parameters from base class
+        if (name == Tag::BaseData) {
+            DataItem::readBaseData(reader);
+            XML::gotoEndElementOfTag(reader, name);
 
-        // interpolation
-        if (reader->name() == Tag::Interpolation) {
-            XML::readAttribute(reader, Attrib::value, &m_isInterpolated);
-            XML::gotoEndElementOfTag(reader, Tag::Interpolation);
+            // interpolation
+        } else if (name == Tag::Interpolation) {
+            XML::readAttribute(reader, XML::Attrib::value, &m_isInterpolated);
+            XML::gotoEndElementOfTag(reader, name);
 
             // gradient
-        } else if (reader->name() == Tag::Gradient) {
+        } else if (name == Tag::Gradient) {
             m_gradient.readFrom(reader);
-            XML::gotoEndElementOfTag(reader, Tag::Gradient);
+            XML::gotoEndElementOfTag(reader, name);
 
             // z axis
-        } else if (reader->name() == Tag::ZAxis) {
+        } else if (name == Tag::ZAxis) {
             m_zAxis->readFrom(reader);
-            XML::gotoEndElementOfTag(reader, Tag::ZAxis);
+            XML::gotoEndElementOfTag(reader, name);
 
-            // types from base class
-        } else {
-            DataItem::readBasicTags(reader);
-        }
+        } else
+            reader->skipCurrentElement();
     }
 }
 
diff --git a/GUI/Model/Data/SpecularDataItem.cpp b/GUI/Model/Data/SpecularDataItem.cpp
index 27e0bdddd87353a5adf796bf4b7befeacbf2f6ee..338af33b6c1bcee8cb3b0a520469fe95d95ab7ad 100644
--- a/GUI/Model/Data/SpecularDataItem.cpp
+++ b/GUI/Model/Data/SpecularDataItem.cpp
@@ -21,9 +21,9 @@
 #include "GUI/Util/Error.h"
 
 namespace {
-
 namespace Tag {
 
+const QString BaseData("BaseData");
 const QString LineType("LineType");
 const QString Color("Color");
 const QString Thickness("Thickness");
@@ -32,12 +32,6 @@ const QString ScatterSize("ScatterSize");
 
 } // namespace Tag
 
-namespace Attrib {
-
-const QString value("value");
-
-} // namespace Attrib
-
 // scatters for representation of 1D graphs
 const QMap<QString, QCPScatterStyle::ScatterShape> scatter_map = {
     {"None", QCPScatterStyle::ScatterShape::ssNone},
@@ -215,69 +209,81 @@ void SpecularDataItem::setRealPlotStyle()
 
 void SpecularDataItem::writeTo(QXmlStreamWriter* writer) const
 {
-    DataItem::writeTo(writer);
+    XML::writeAttribute(writer, XML::Attrib::version, uint(1));
+
+    // parameters from base class
+    writer->writeStartElement(Tag::BaseData);
+    DataItem::writeBaseData(writer);
+    writer->writeEndElement();
 
     // line type
     writer->writeStartElement(Tag::LineType);
-    XML::writeAttribute(writer, Attrib::value, m_lineType);
+    XML::writeAttribute(writer, XML::Attrib::value, m_lineType);
     writer->writeEndElement();
 
     // color
     writer->writeStartElement(Tag::Color);
-    XML::writeAttribute(writer, Attrib::value, m_color.name(QColor::HexArgb));
+    XML::writeAttribute(writer, XML::Attrib::value, m_color.name(QColor::HexArgb));
     writer->writeEndElement();
 
     // thickness
     writer->writeStartElement(Tag::Thickness);
-    XML::writeAttribute(writer, Attrib::value, m_thickness);
+    XML::writeAttribute(writer, XML::Attrib::value, m_thickness);
     writer->writeEndElement();
 
     // scatter type
     writer->writeStartElement(Tag::ScatterType);
-    XML::writeAttribute(writer, Attrib::value, m_scatterType);
+    XML::writeAttribute(writer, XML::Attrib::value, m_scatterType);
     writer->writeEndElement();
 
     // scatter size
     writer->writeStartElement(Tag::ScatterSize);
-    XML::writeAttribute(writer, Attrib::value, m_scatterSize);
+    XML::writeAttribute(writer, XML::Attrib::value, m_scatterSize);
     writer->writeEndElement();
 }
 
 void SpecularDataItem::readFrom(QXmlStreamReader* reader)
 {
+    uint version = XML::readUIntAttribute(reader, XML::Attrib::version);
+    Q_UNUSED(version)
+
     while (reader->readNextStartElement()) {
+        QString name = reader->name().toString();
 
-        // line type
-        if (reader->name() == Tag::LineType) {
-            XML::readAttribute(reader, Attrib::value, &m_lineType);
-            XML::gotoEndElementOfTag(reader, Tag::LineType);
+        // parameters from base class
+        if (name == Tag::BaseData) {
+            DataItem::readBaseData(reader);
+            XML::gotoEndElementOfTag(reader, name);
+
+            // line type
+        } else if (name == Tag::LineType) {
+            XML::readAttribute(reader, XML::Attrib::value, &m_lineType);
+            XML::gotoEndElementOfTag(reader, name);
 
             // color
-        } else if (reader->name() == Tag::Color) {
+        } else if (name == Tag::Color) {
             QString col;
-            XML::readAttribute(reader, Attrib::value, &col);
+            XML::readAttribute(reader, XML::Attrib::value, &col);
             m_color = QColor(col);
-            XML::gotoEndElementOfTag(reader, Tag::Color);
+            XML::gotoEndElementOfTag(reader, name);
 
             // thickness
-        } else if (reader->name() == Tag::Thickness) {
-            XML::readAttribute(reader, Attrib::value, &m_thickness);
-            XML::gotoEndElementOfTag(reader, Tag::Thickness);
+        } else if (name == Tag::Thickness) {
+            XML::readAttribute(reader, XML::Attrib::value, &m_thickness);
+            XML::gotoEndElementOfTag(reader, name);
 
             // scatter type
-        } else if (reader->name() == Tag::ScatterType) {
-            XML::readAttribute(reader, Attrib::value, &m_scatterType);
-            XML::gotoEndElementOfTag(reader, Tag::ScatterType);
+        } else if (name == Tag::ScatterType) {
+            XML::readAttribute(reader, XML::Attrib::value, &m_scatterType);
+            XML::gotoEndElementOfTag(reader, name);
 
             // scatter size
-        } else if (reader->name() == Tag::ScatterSize) {
-            XML::readAttribute(reader, Attrib::value, &m_scatterSize);
-            XML::gotoEndElementOfTag(reader, Tag::ScatterSize);
-
-            // types from base class
-        } else {
-            DataItem::readBasicTags(reader);
-        }
+        } else if (name == Tag::ScatterSize) {
+            XML::readAttribute(reader, XML::Attrib::value, &m_scatterSize);
+            XML::gotoEndElementOfTag(reader, name);
+
+        } else
+            reader->skipCurrentElement();
     }
 }
 
diff --git a/GUI/Model/Project/ProjectDocument.cpp b/GUI/Model/Project/ProjectDocument.cpp
index ab653cde70a536473ba8a471f58ba124c7deb97d..1f32de750e976baf9adf0e08b8b662eca9f288dc 100644
--- a/GUI/Model/Project/ProjectDocument.cpp
+++ b/GUI/Model/Project/ProjectDocument.cpp
@@ -50,7 +50,7 @@ const QString Instruments("Instruments");
 
 namespace Attrib {
 
-const QString version("Version");
+const QString BA_Version("BA_Version");
 const QString projectName("projectName");
 
 } // namespace Attrib
@@ -319,7 +319,7 @@ ProjectDocument::ReadResult ProjectDocument::readProject(QIODevice* device,
             if (reader.isStartElement()) {
                 if (reader.name() == Tag::BornAgain) {
                     Streamer(&reader).assertVersion(2);
-                    m_currentVersion = reader.attributes().value(Attrib::version).toString();
+                    m_currentVersion = reader.attributes().value(Attrib::BA_Version).toString();
 
                     if (!GUI::Util::Path::isVersionMatchMinimal(m_currentVersion,
                                                                 minimal_supported_version)) {
@@ -392,7 +392,7 @@ void ProjectDocument::writeTo(QIODevice* device)
     writer.writeStartDocument();
     writer.writeStartElement(Tag::BornAgain);
     QString version_string = GUI::Util::Path::getBornAgainVersionString();
-    writer.writeAttribute(Attrib::version, version_string);
+    writer.writeAttribute(Attrib::BA_Version, version_string);
     Streamer(&writer).writeVersion(2);
 
     writer.writeStartElement(Tag::DocumentInfo);
diff --git a/GUI/Support/XML/UtilXML.cpp b/GUI/Support/XML/UtilXML.cpp
index 6592d5970de7bc3a857b997b93901a67bd9b8901..511cbd1e82b8da71d56aec58b0d6ba19132c78e0 100644
--- a/GUI/Support/XML/UtilXML.cpp
+++ b/GUI/Support/XML/UtilXML.cpp
@@ -126,16 +126,6 @@ void XML::writeAttribute(QXmlStreamWriter* writer, const QString& attributeName,
     writer->writeAttribute(attributeName, QString::number(d));
 }
 
-void XML::writeUid(QXmlStreamWriter* writer, const QString& id)
-{
-    writer->writeAttribute(Tags::Id, id);
-}
-
-void XML::writeUid(QXmlStreamWriter* writer, const QUuid& id)
-{
-    writer->writeAttribute(Tags::Id, id.toString());
-}
-
 void XML::writeVariant(QXmlStreamWriter* writer, QVariant variant, int role)
 {
     ASSERT(writer);
@@ -144,7 +134,7 @@ void XML::writeVariant(QXmlStreamWriter* writer, QVariant variant, int role)
         writer->writeAttribute(Tags::ParameterTypeAttribute, variant.typeName());
         writer->writeAttribute(Tags::ParameterRoleAttribute, QString::number(role));
         writeAttribute(writer, Tags::ParameterValueAttribute, variant);
-        writer->writeEndElement(); // end ParameterTag
+        writer->writeEndElement();
     }
 }
 
diff --git a/GUI/Support/XML/UtilXML.h b/GUI/Support/XML/UtilXML.h
index 15dd258fbe83a84883bd1b8ffbdc818342aecadf..b7b2e1f9f213e87fc5029a39ee06ec5c6c232ec2 100644
--- a/GUI/Support/XML/UtilXML.h
+++ b/GUI/Support/XML/UtilXML.h
@@ -20,15 +20,15 @@
 #include <heinz/Complex.h>
 #include <heinz/Vectors3D.h>
 
-class QXmlStreamReader;
-class MessageService;
-class QUuid;
+namespace XML {
+namespace Attrib {
 
+const QString version("version");
+const QString value("value");
 
-namespace XML {
+} // namespace Attrib
 
 namespace Tags {
-constexpr auto Id("id");
 constexpr auto TagAttribute("Tag");
 constexpr auto ModelTypeAttribute("ModelType");
 constexpr auto DisplayNameAttribute("DisplayName");
@@ -56,8 +56,6 @@ void writeVariant(QXmlStreamWriter* writer, QVariant variant, int role);
 void writeAttribute(QXmlStreamWriter* writer, const QString& attributeName,
                     const QVariant& variant);
 
-void writeUid(QXmlStreamWriter* writer, const QString& id);
-void writeUid(QXmlStreamWriter* writer, const QUuid& id);
 void writeAttribute(QXmlStreamWriter* writer, const QString& attributeName, int d);
 void writeAttribute(QXmlStreamWriter* writer, const QString& attributeName, bool b);
 void writeAttribute(QXmlStreamWriter* writer, const QString& attributeName, unsigned d);