diff --git a/GUI/Model/Axis/PointwiseAxisItem.cpp b/GUI/Model/Axis/PointwiseAxisItem.cpp
index 6bf8ed5b368b2ae67785627b27d37d6845eab55d..e02f7c9e1aba219195b1c3b8ef74e0486bca0803 100644
--- a/GUI/Model/Axis/PointwiseAxisItem.cpp
+++ b/GUI/Model/Axis/PointwiseAxisItem.cpp
@@ -25,7 +25,7 @@
 namespace {
 namespace Tag {
 
-const QString NativeUnits("NativeUnits");
+const QString NativeUnits("NativeUnits"); // obsolete since v22.0
 const QString BinaryData("BinaryData");
 const QString BaseData("BaseData");
 
@@ -34,7 +34,6 @@ const QString BaseData("BaseData");
 
 PointwiseAxisItem::PointwiseAxisItem(QObject* parent)
     : BasicAxisItem(parent)
-    , m_nativeAxisUnits("bin")
 {
 }
 
@@ -43,7 +42,6 @@ PointwiseAxisItem::~PointwiseAxisItem() = default;
 void PointwiseAxisItem::setAxis(const Scale& axis)
 {
     m_axis = std::unique_ptr<Scale>(axis.clone());
-    m_nativeAxisUnits = QString::fromStdString(axis.unit());
 }
 
 const Scale* PointwiseAxisItem::axis() const
@@ -51,11 +49,6 @@ const Scale* PointwiseAxisItem::axis() const
     return m_axis.get();
 }
 
-QString PointwiseAxisItem::nativeAxisUnits() const
-{
-    return m_nativeAxisUnits;
-}
-
 QByteArray PointwiseAxisItem::serializeBinaryData() const
 {
     if (!m_axis)
@@ -79,7 +72,7 @@ void PointwiseAxisItem::deserializeBinaryData(const QByteArray& data)
 
 void PointwiseAxisItem::writeTo(QXmlStreamWriter* w) const
 {
-    XML::writeAttribute(w, XML::Attrib::version, uint(1));
+    XML::writeAttribute(w, XML::Attrib::version, uint(2));
 
     // parameters from base class
     w->writeStartElement(Tag::BaseData);
@@ -93,11 +86,6 @@ void PointwiseAxisItem::writeTo(QXmlStreamWriter* w) const
         w->writeCharacters(a.toBase64());
         w->writeEndElement();
     }
-
-    // native units
-    w->writeStartElement(Tag::NativeUnits);
-    XML::writeAttribute(w, XML::Attrib::value, m_nativeAxisUnits);
-    w->writeEndElement();
 }
 
 void PointwiseAxisItem::readFrom(QXmlStreamReader* r)
@@ -120,11 +108,6 @@ void PointwiseAxisItem::readFrom(QXmlStreamReader* r)
             deserializeBinaryData(data);
             XML::gotoEndElementOfTag(r, tag);
 
-            // native units
-        } else if (tag == Tag::NativeUnits) {
-            XML::readAttribute(r, XML::Attrib::value, &m_nativeAxisUnits);
-            XML::gotoEndElementOfTag(r, tag);
-
         } else
             r->skipCurrentElement();
     }
@@ -132,7 +115,7 @@ void PointwiseAxisItem::readFrom(QXmlStreamReader* r)
 
 void PointwiseAxisItem::updateAxIndicators(const Frame& frame)
 {
-    if (!m_axis || nativeAxisUnits() == "bin")
+    if (!m_axis || m_axis->unit() == "bin")
         return;
 
     if (frame.axis(0).unit() == "rad") {
diff --git a/GUI/Model/Axis/PointwiseAxisItem.h b/GUI/Model/Axis/PointwiseAxisItem.h
index 51bad66f1f5c03d49da426ca6eb8a4e573dc522d..0726cc2312102bb7b0afb87be64951e145ab6406 100644
--- a/GUI/Model/Axis/PointwiseAxisItem.h
+++ b/GUI/Model/Axis/PointwiseAxisItem.h
@@ -30,8 +30,6 @@ public:
     void setAxis(const Scale& axis);
     const Scale* axis() const;
 
-    QString nativeAxisUnits() const;
-
     void updateAxIndicators(const Frame& frame);
 
     QByteArray serializeBinaryData() const;
@@ -42,7 +40,6 @@ public:
 
 private:
     std::unique_ptr<Scale> m_axis;
-    QString m_nativeAxisUnits;
 };
 
 #endif // BORNAGAIN_GUI_MODEL_AXIS_POINTWISEAXISITEM_H
diff --git a/GUI/Model/Device/DatafileItem.cpp b/GUI/Model/Device/DatafileItem.cpp
index 8e932035dabd405d2694d1c9c8e1991b73b6d0ba..499176ef28bd170eec83412a7c985262c54da3eb 100644
--- a/GUI/Model/Device/DatafileItem.cpp
+++ b/GUI/Model/Device/DatafileItem.cpp
@@ -34,8 +34,8 @@ const QString BinaryData("BinaryData");
 const QString Data("Data");
 const QString InstrumentId("InstrumentId");
 const QString Name("Name");
-const QString NativeData("NativeData");
-const QString NativeDataUnits("NativeDataUnits");
+const QString NativeData("NativeData");           // obsolete since v22.0
+const QString NativeDataUnits("NativeDataUnits"); // obsolete since v22.0
 const QString PresentationType("PresentationType");
 
 } // namespace Tag
@@ -117,22 +117,6 @@ size_t DatafileItem::rank() const
     return data1DItem() ? 1 : 2;
 }
 
-bool DatafileItem::hasNativeData() const
-{
-    return nativeDataItem() && nativeDataItem()->c_field();
-}
-
-DataItem* DatafileItem::nativeDataItem() const
-{
-    return m_nativeDataItem.get();
-}
-
-DataItem* DatafileItem::initNativeData()
-{
-    initDataItem(rank(), m_nativeDataItem);
-    return m_nativeDataItem.get();
-}
-
 bool DatafileItem::holdsDimensionalData() const
 {
     const Frame& frame = dataItem()->c_field()->frame();
@@ -143,11 +127,6 @@ bool DatafileItem::holdsDimensionalData() const
     return false;
 }
 
-const Datafield* DatafileItem::nativeDatafield() const
-{
-    return hasNativeData() ? nativeDataItem()->c_field() : nullptr;
-}
-
 //! Sets Datafield to underlying item.
 
 void DatafileItem::setTheDatafield(const Datafield& data)
@@ -232,14 +211,11 @@ void DatafileItem::updateFileName()
 {
     if (DataItem* item = dataItem())
         item->setFileName(GUI::Path::intensityDataFileName(realItemName(), "realdata"));
-
-    if (DataItem* item = nativeDataItem())
-        item->setFileName(GUI::Path::intensityDataFileName(realItemName(), "nativedata"));
 }
 
 void DatafileItem::writeTo(QXmlStreamWriter* w) const
 {
-    XML::writeAttribute(w, XML::Attrib::version, uint(1));
+    XML::writeAttribute(w, XML::Attrib::version, uint(2));
 
     // NOTE: The ordering of the XML elements is important in initialization
 
@@ -258,11 +234,6 @@ void DatafileItem::writeTo(QXmlStreamWriter* w) const
     XML::writeAttribute(w, XML::Attrib::value, m_presentationType);
     w->writeEndElement();
 
-    // native data units
-    w->writeStartElement(Tag::NativeDataUnits);
-    XML::writeAttribute(w, XML::Attrib::value, m_nativeDataUnits);
-    w->writeEndElement();
-
     // data
     if (m_dataItem) {
         w->writeStartElement(Tag::Data);
@@ -270,14 +241,6 @@ void DatafileItem::writeTo(QXmlStreamWriter* w) const
         m_dataItem->writeTo(w);
         w->writeEndElement();
     }
-
-    // native data
-    if (m_nativeDataItem) {
-        w->writeStartElement(Tag::NativeData);
-        XML::writeAttribute(w, XML::Attrib::type, m_nativeDataItem->TYPE);
-        m_nativeDataItem->writeTo(w);
-        w->writeEndElement();
-    }
 }
 
 void DatafileItem::readFrom(QXmlStreamReader* r)
@@ -317,17 +280,6 @@ void DatafileItem::readFrom(QXmlStreamReader* r)
             m_dataItem->readFrom(r);
             XML::gotoEndElementOfTag(r, tag);
 
-            // native data
-        } else if (tag == Tag::NativeData) {
-            ASSERT(m_dataItem); // read 'm_dataItem' before
-            initNativeData()->readFrom(r);
-            XML::gotoEndElementOfTag(r, tag);
-
-            // native data units
-        } else if (tag == Tag::NativeDataUnits) {
-            XML::readAttribute(r, XML::Attrib::value, &m_nativeDataUnits);
-            XML::gotoEndElementOfTag(r, tag);
-
         } else
             r->skipCurrentElement();
     }
@@ -337,30 +289,16 @@ void DatafileItem::writeDatafiles(const QString& projectDir) const
 {
     if (m_dataItem)
         m_dataItem->saveDatafield(projectDir);
-
-    if (m_nativeDataItem)
-        m_nativeDataItem->saveDatafield(projectDir);
 }
 
 QString DatafileItem::readDatafiles(const QString& projectDir, MessageService* messageService)
 {
-    QString dataError, nativeDataError;
-
-    if (m_dataItem)
-        dataError = m_dataItem->loadDatafield(messageService, projectDir, rank());
-
-    if (m_nativeDataItem)
-        nativeDataError = m_nativeDataItem->loadDatafield(messageService, projectDir, rank());
-
-    // return error message
-    if (dataError.isEmpty() && nativeDataError.isEmpty())
-        return {};
-    else if (!dataError.isEmpty() && nativeDataError.isEmpty())
-        return (dataError);
-    else if (dataError.isEmpty() && !nativeDataError.isEmpty())
-        return (nativeDataError);
-    else
-        return (dataError + "\n" + nativeDataError);
+    if (m_dataItem) {
+        QString dataError = m_dataItem->loadDatafield(messageService, projectDir, rank());
+        if (!dataError.isEmpty())
+            return (dataError);
+    }
+    return {};
 }
 
 void DatafileItem::copyTo(DatafileItem* const dest) const
@@ -369,9 +307,6 @@ void DatafileItem::copyTo(DatafileItem* const dest) const
 
     if (m_dataItem)
         dest->dataItem()->setDatafield(*dataItem()->c_field());
-
-    if (m_nativeDataItem)
-        dest->nativeDataItem()->setDatafield(*nativeDataItem()->c_field());
 }
 
 std::vector<int> DatafileItem::shape() const
@@ -394,8 +329,5 @@ void DatafileItem::updateToInstrument(const InstrumentItem* instrument)
         return;
 
     // instrument == nullptr => unlinking => going back to native data
-    auto* native_data_item = nativeDataItem();
-    auto* data_source = native_data_item ? native_data_item : data_item;
-
-    std::unique_ptr<Datafield> native_data(data_source->c_field()->clone());
+    // TODO now the function does nothing. do not remove this function, but give it meaning again
 }
diff --git a/GUI/Model/Device/DatafileItem.h b/GUI/Model/Device/DatafileItem.h
index e8291e15e66e38b250f0efaeb0bda3380f0888ab..d27a5d99054e6b70c108be2d5d5fd95052132e41 100644
--- a/GUI/Model/Device/DatafileItem.h
+++ b/GUI/Model/Device/DatafileItem.h
@@ -51,17 +51,7 @@ public:
 
     size_t rank() const;
 
-    // native data
-
-    bool hasNativeData() const;
-    DataItem* nativeDataItem() const;
-
-    DataItem* initNativeData();
-
     bool holdsDimensionalData() const;
-
-    const Datafield* nativeDatafield() const;
-
     void setTheDatafield(const Datafield& data);
 
     // instrument
@@ -103,23 +93,10 @@ private:
 
     QString m_instrumentId;
     QString m_name;
-    QString m_nativeDataUnits = "bin";
     QString m_presentationType;
 
     // DataItem can be `Data2DItem` and `Data1DItem` (default `Data2DItem`).
-    /*
-      "Native_data" is introduced and used in specular mode to keep the original axis
-      of the dataset. It also stores a copy of original intensity values inside datafield,
-      but these values are always the same for "data" and "native_data".
-
-      At the moment of loading file to DatafileItem "data" and "native_data" are completely equal.
-      But after linking DatafileItem to instrument and changing the current units the axis of "data"
-      is changed. When we unlink DatafileItem from instrument, we restore the original axis from
-      "native_data", because now there is no other way to transform axis without Frame
-      coming from instrument.
-    */
     std::unique_ptr<DataItem> m_dataItem;
-    std::unique_ptr<DataItem> m_nativeDataItem;
 };
 
 #endif // BORNAGAIN_GUI_MODEL_DEVICE_DATAFILEITEM_H
diff --git a/GUI/Model/Device/InstrumentItems.cpp b/GUI/Model/Device/InstrumentItems.cpp
index fb69b026e1f0de54c019c9615cc8f80b58133c8b..78d5ef737d2a150c52c49ec762383c9a9cc4f030 100644
--- a/GUI/Model/Device/InstrumentItems.cpp
+++ b/GUI/Model/Device/InstrumentItems.cpp
@@ -371,7 +371,7 @@ void SpecularInstrumentItem::updateToRealData(const DatafileItem* item)
     if (shape().size() != item->shape().size())
         throw std::runtime_error("Specular instrument type is incompatible with passed data shape");
 
-    const auto& dataAxis = item->nativeDatafield()->axis(0);
+    const auto& dataAxis = item->dataItem()->c_field()->axis(0);
     scanItem()->updateToData(dataAxis);
     scanItem()->grazingScanItem()->updateAxIndicators(makeFrame());
 }
@@ -393,12 +393,7 @@ bool SpecularInstrumentItem::alignedWith(const DatafileItem* item) const
     if (!instrumentAxis)
         return false;
 
-    if (!item->hasNativeData())
-        return false;
-
-    // TODO remove native data from everywhere
-    // https://jugit.fz-juelich.de/mlz/bornagain/-/issues/331
-    const auto& native_axis = item->nativeDatafield()->axis(0);
+    const auto& native_axis = item->dataItem()->c_field()->axis(0);
     return *instrumentAxis == native_axis;
 }
 
diff --git a/GUI/Model/Job/JobItem.cpp b/GUI/Model/Job/JobItem.cpp
index a07850b35ffc796a8bab419fe2d9bc942afc1cbe..cf709399a613dd409a08fbac377d62ed7e695ac3 100644
--- a/GUI/Model/Job/JobItem.cpp
+++ b/GUI/Model/Job/JobItem.cpp
@@ -301,11 +301,12 @@ DataItem* JobItem::createDiffDataItem()
     ASSERT(!diffDataItem());
     m_diffDataItem.reset(createNewDataItem());
 
-    // use the same axes as real item
     ASSERT(m_realItem);
-    GUI::Util::copyContents(m_realItem->dataItem()->axItemX(), m_diffDataItem->axItemX());
+    // use the same axes as simulated item (same as external data item if loading pre-22.0 project)
+    const DataItem* source = m_simulatedDataItem ? simulatedDataItem() : m_realItem->dataItem();
+    GUI::Util::copyContents(source->axItemX(), m_diffDataItem->axItemX());
     if (rank() == 2)
-        GUI::Util::copyContents(m_realItem->dataItem()->axItemY(), m_diffDataItem->axItemY());
+        GUI::Util::copyContents(source->axItemY(), m_diffDataItem->axItemY());
 
     if (auto* spec_diff = dynamic_cast<Data1DItem*>(diffDataItem()))
         spec_diff->setDiffPlotStyle();
@@ -405,7 +406,7 @@ void JobItem::cropRealData()
 
 void JobItem::writeTo(QXmlStreamWriter* w) const
 {
-    XML::writeAttribute(w, XML::Attrib::version, uint(1));
+    XML::writeAttribute(w, XML::Attrib::version, uint(2));
 
     // NOTE: The ordering of the XML elements is important in initialization
 
@@ -479,13 +480,6 @@ void JobItem::writeTo(QXmlStreamWriter* w) const
     XML::writeAttribute(w, XML::Attrib::value, m_comments);
     w->writeEndElement();
 
-    // real item
-    if (m_realItem) {
-        w->writeStartElement(Tag::DatafileItem);
-        m_realItem->writeTo(w);
-        w->writeEndElement();
-    }
-
     // simulated data
     if (m_simulatedDataItem) {
         w->writeStartElement(Tag::SimulatedData);
@@ -493,6 +487,13 @@ void JobItem::writeTo(QXmlStreamWriter* w) const
         w->writeEndElement();
     }
 
+    // real item
+    if (m_realItem) {
+        w->writeStartElement(Tag::DatafileItem);
+        m_realItem->writeTo(w);
+        w->writeEndElement();
+    }
+
     // fit suite
     if (m_fitSuiteItem) {
         w->writeStartElement(Tag::FitSuite);
@@ -588,6 +589,12 @@ void JobItem::readFrom(QXmlStreamReader* r)
             XML::readAttribute(r, XML::Attrib::value, &m_name);
             XML::gotoEndElementOfTag(r, tag);
 
+            // simulated data
+        } else if (tag == Tag::SimulatedData) {
+            createSimulatedDataItem();
+            m_simulatedDataItem->readFrom(r);
+            XML::gotoEndElementOfTag(r, tag);
+
             // real item
         } else if (tag == Tag::DatafileItem) {
             createDatafileItem();
@@ -596,12 +603,6 @@ void JobItem::readFrom(QXmlStreamReader* r)
             importMasksFromDatafileItem();
             XML::gotoEndElementOfTag(r, tag);
 
-            // simulated data
-        } else if (tag == Tag::SimulatedData) {
-            createSimulatedDataItem();
-            m_simulatedDataItem->readFrom(r);
-            XML::gotoEndElementOfTag(r, tag);
-
             // fit suite
         } else if (tag == Tag::FitSuite) {
             createFitSuiteItem()->readFrom(r);
@@ -663,11 +664,7 @@ void JobItem::updateFileName()
     if (DataItem* item = simulatedDataItem())
         item->setFileName(GUI::Path::intensityDataFileName(jobName(), "jobdata"));
 
-    if (DatafileItem* real = realItem()) {
+    if (DatafileItem* real = realItem())
         if (DataItem* item = real->dataItem())
             item->setFileName(GUI::Path::intensityDataFileName(jobName(), "refdata"));
-
-        if (DataItem* item = real->nativeDataItem())
-            item->setFileName(GUI::Path::intensityDataFileName(identifier(), "nativedata"));
-    }
 }
diff --git a/GUI/Model/Model/DatafilesModel.cpp b/GUI/Model/Model/DatafilesModel.cpp
index e005ec1436666b13289105b16e02468aa36eac59..e0fd2959e481c7058e775be8a6dd3ff0ec1e708c 100644
--- a/GUI/Model/Model/DatafilesModel.cpp
+++ b/GUI/Model/Model/DatafilesModel.cpp
@@ -37,12 +37,10 @@ DatafilesModel::~DatafilesModel() = default;
 QVector<DataItem*> DatafilesModel::dataItems() const
 {
     QVector<DataItem*> result;
-    for (auto* realData : realItems()) {
+    for (auto* realData : realItems())
         if (auto* data2DItem = realData->dataItem())
             result.push_back(data2DItem);
-        if (auto* native_data_item = realData->nativeDataItem())
-            result.push_back(native_data_item);
-    }
+
     return result;
 }
 
diff --git a/GUI/Model/Model/JobModel.cpp b/GUI/Model/Model/JobModel.cpp
index 5b386d0a9c2c802f61132441491ca23a194c7f66..3f826bc0832f7b16f727ba10f281e57b414cb0be 100644
--- a/GUI/Model/Model/JobModel.cpp
+++ b/GUI/Model/Model/JobModel.cpp
@@ -125,14 +125,10 @@ QVector<DataItem*> JobModel::dataItems() const
         if (auto* dataItem = jobItem->simulatedDataItem())
             result.push_back(dataItem);
 
-        if (auto* real_data = dynamic_cast<DatafileItem*>(jobItem->realItem())) {
+        if (auto* real_data = dynamic_cast<DatafileItem*>(jobItem->realItem()))
             if (auto* data_item = real_data->dataItem())
                 result.push_back(data_item);
-            if (auto* native_data = real_data->nativeDataItem())
-                result.push_back(native_data);
-        }
     }
-
     return result;
 }
 
diff --git a/GUI/Model/Project/LinkInstrumentManager.cpp b/GUI/Model/Project/LinkInstrumentManager.cpp
index cbdaa4e223f9b20a71264091ed120061707d4584..59d914415843a5c54395fde1557f9aac3b142515 100644
--- a/GUI/Model/Project/LinkInstrumentManager.cpp
+++ b/GUI/Model/Project/LinkInstrumentManager.cpp
@@ -98,13 +98,6 @@ bool LinkInstrumentManager::canLinkDataToInstrument(const DatafileItem* realItem
         return false;
     }
 
-    /*
-    if (realItem->rank() == 1 && !realItem->hasNativeData()) {
-        ::warn(parent, "Cannot link, data is empty.");
-        return false;
-    }
-    */
-
     if (instrumentItem->alignedWith(realItem))
         return true;
 
diff --git a/GUI/View/Data/DatafilesSelector.cpp b/GUI/View/Data/DatafilesSelector.cpp
index 77c87907d92945ecee722928f631f607f8bfff69..85e9b8f5421c227ba33ca41201a4697f8d531623 100644
--- a/GUI/View/Data/DatafilesSelector.cpp
+++ b/GUI/View/Data/DatafilesSelector.cpp
@@ -297,8 +297,6 @@ void DatafilesSelector::importData1D()
             realItem->setTheDatafield(*df);
             setCurrentItem(realItem);
 
-            realItem->initNativeData();
-            realItem->nativeDataItem()->setDatafield(*df);
             realItem->updateFileName();
         } catch (std::exception& ex) {
             m_treeModel->removeDataItem(realItem);
diff --git a/Tests/Unit/GUI/TestLinkInstrument.cpp b/Tests/Unit/GUI/TestLinkInstrument.cpp
index 9d27153acd628f409abf7d1ce717e983b5cd29d8..f76b3f3f3acbd83a8264ec6617df23e7ad0ce361 100644
--- a/Tests/Unit/GUI/TestLinkInstrument.cpp
+++ b/Tests/Unit/GUI/TestLinkInstrument.cpp
@@ -81,8 +81,6 @@ TEST(TestLinkInstrument, canLinkToSpecular)
     instrument->scanItem()->grazingScanItem()->selectListScan();
 
     realData->dataItem()->setOriginalDatafield({frame.clonedAxes()});
-    realData->initNativeData();
-    realData->nativeDataItem()->setOriginalDatafield({frame.clonedAxes()});
 
     ASSERT_TRUE(
         document.linkInstrumentManager()->canLinkDataToInstrument(realData, identifier, nullptr));