diff --git a/Device/IO/IOFactory.cpp b/Device/IO/IOFactory.cpp
index d8db7ce2339f1a6c64bfb17efdb62e13e373d2a8..13158eafa9b706a15468f5decc3da7971b08dda8 100644
--- a/Device/IO/IOFactory.cpp
+++ b/Device/IO/IOFactory.cpp
@@ -127,7 +127,7 @@ bool fileTypeMatchesLoaderSelector(const std::string& fileName, IO::LoaderSelect
 } // namespace
 
 
-Datafield* IO::readDatafield(const std::string& file_name, LoaderSelector selector)
+Datafield* IO::readData2D(const std::string& file_name, LoaderSelector selector)
 {
     const auto readAs = [=](LoaderSelector testForSelector) {
         return (selector == testForSelector)
@@ -187,7 +187,7 @@ bool Util::RW::filesAgree(const std::string& datFileName, const std::string& ref
 {
     std::unique_ptr<Datafield> datDat;
     try {
-        datDat.reset(IO::readDatafield(datFileName));
+        datDat.reset(IO::readData2D(datFileName));
     } catch (const std::runtime_error& ex) {
         std::cerr << "File comparison: Could not read data from file " << datFileName
                   << ". Runtime error: " << ex.what() << std::endl;
@@ -203,7 +203,7 @@ bool Util::RW::filesAgree(const std::string& datFileName, const std::string& ref
 
     std::unique_ptr<Datafield> refDat;
     try {
-        refDat.reset(IO::readDatafield(refFileName));
+        refDat.reset(IO::readData2D(refFileName));
     } catch (...) {
         std::cerr << "File comparison: Could not read reference data from file " << refFileName
                   << std::endl;
diff --git a/Device/IO/IOFactory.h b/Device/IO/IOFactory.h
index e212220b044b8f34fc3fcab22155d3f23a755d50..b0848e59de1c4fa2f9e40900491a30bc63fe7a9c 100644
--- a/Device/IO/IOFactory.h
+++ b/Device/IO/IOFactory.h
@@ -28,7 +28,7 @@ enum LoaderSelector { automatic, bornagain, tiff, nicos };
 //! For any other selector, the file extension is ignored.
 //! If file name ends with "*.gz" or "*.bz2" the file will be unzipped on the fly.
 //! May throw, but will never return nullptr.
-Datafield* readDatafield(const std::string& file_name, LoaderSelector selector = automatic);
+Datafield* readData2D(const std::string& file_name, LoaderSelector selector = automatic);
 
 Datafield* readReflectometryData(const std::string& file_name);
 
diff --git a/Examples/bayesian/likelihood_sampling.py b/Examples/bayesian/likelihood_sampling.py
index 0828ae9d7ea24dd7b10a3f60b9cea0b3f1f179d6..e5c1e7dbd250bd4faa83151827df538d09059ce7 100755
--- a/Examples/bayesian/likelihood_sampling.py
+++ b/Examples/bayesian/likelihood_sampling.py
@@ -64,7 +64,7 @@ def get_real_data():
     """
     if not hasattr(get_real_data, "data"):
         filepath = path.join(datadir, 'genx_interchanging_layers.dat.gz')
-        real_data = ba.readDatafield(filepath).npArray()
+        real_data = ba.readData2D(filepath).npArray()
         # translating axis values from double incident angle (degs)
         # to incident angle (radians)
         real_data[:, 0] *= np.pi/360
diff --git a/Examples/fit/scatter2d/expfit_galaxi.py b/Examples/fit/scatter2d/expfit_galaxi.py
index 8f9d463316fa4bd5e68259fa97cc7018e8b6ab37..ea940852c70ed4376601b73c889c7bccfcb6a7ce 100755
--- a/Examples/fit/scatter2d/expfit_galaxi.py
+++ b/Examples/fit/scatter2d/expfit_galaxi.py
@@ -125,7 +125,7 @@ def load_real_data(filename):
     Loads experimental data and returns numpy array.
     """
     filepath = os.path.join(datadir, filename)
-    return ba.readDatafield(filepath).npArray()
+    return ba.readData2D(filepath).npArray()
 
 
 def run_fitting():
diff --git a/GUI/Model/Data/DataItem.cpp b/GUI/Model/Data/DataItem.cpp
index d08f9a5547d2666ad90bbdb7c6b1a3dc910355d3..f1b24d072be292e892a271ae4e195f36092c4f64 100644
--- a/GUI/Model/Data/DataItem.cpp
+++ b/GUI/Model/Data/DataItem.cpp
@@ -105,7 +105,7 @@ QString DataItem::loadDatafield(MessageService* messageService, const QString& p
     ASSERT(messageService);
     const auto file = dataFullPath(projectDir);
     try {
-        auto* data = IO::readDatafield(file.toStdString());
+        auto* data = IO::readData2D(file.toStdString());
         if (!data)
             throw std::runtime_error("Datafield is not created for file: " + file.toStdString());
         setDatafield(data);
diff --git a/GUI/View/Import/ImportDataUtil.cpp b/GUI/View/Import/ImportDataUtil.cpp
index 17fe8a265f1ff87a3f9b2752f35e9a688fdddcbe..64577c000ff79df1ff2901f3a39cebd252b7312f 100644
--- a/GUI/View/Import/ImportDataUtil.cpp
+++ b/GUI/View/Import/ImportDataUtil.cpp
@@ -38,7 +38,7 @@ std::unique_ptr<Datafield> ImportKnownData(const QString& fileName,
     // Try to use the canonical tools for importing data
     std::unique_ptr<Datafield> result;
     try {
-        result.reset(IO::readDatafield(fileName.toStdString(), loader));
+        result.reset(IO::readData2D(fileName.toStdString(), loader));
     } catch (std::exception& ex) {
         QString message = QString("Error while trying to read file\n\n'%1'\n\n%2")
                               .arg(fileName)
diff --git a/Tests/Functional/Consistence/CompareTwoReferences.cpp b/Tests/Functional/Consistence/CompareTwoReferences.cpp
index 2b13e018631cdbfc2e092c4589dc7fd510a8e704..0bbf7af89b5bbaec2e1128593c974f63110cf4c3 100644
--- a/Tests/Functional/Consistence/CompareTwoReferences.cpp
+++ b/Tests/Functional/Consistence/CompareTwoReferences.cpp
@@ -30,7 +30,7 @@ std::unique_ptr<Datafield> load(const std::string& name)
         BaseUtil::Filesystem::jointPath(BATesting::ReferenceDir_Suite(), name + ".int.gz");
     std::unique_ptr<Datafield> data;
     try {
-        data.reset(IO::readDatafield(path));
+        data.reset(IO::readData2D(path));
     } catch (const std::exception&) {
         std::cout << "Data file " << path << "not found.\n"
                   << "Run the pertinent Core standard test, copy the fresh data file"
diff --git a/Tests/Functional/CoreSpecial/CoreIOPathTest.cpp b/Tests/Functional/CoreSpecial/CoreIOPathTest.cpp
index 90333b3df04784aa9a85b968fc43e859707f9d5f..e3d6b0227a01e432e879b8de1947541f11f0d7e2 100644
--- a/Tests/Functional/CoreSpecial/CoreIOPathTest.cpp
+++ b/Tests/Functional/CoreSpecial/CoreIOPathTest.cpp
@@ -36,7 +36,7 @@ std::unique_ptr<Datafield> createTestData()
 bool test_io(const Datafield* data, const std::string& file_name)
 {
     IO::writeDatafield(*data, file_name);
-    std::unique_ptr<Datafield> loaded(IO::readDatafield(file_name));
+    std::unique_ptr<Datafield> loaded(IO::readData2D(file_name));
     return DiffUtil::meanRelVecDiff(data->flatVector(), loaded->flatVector()) <= 1e-06;
 }
 
diff --git a/Tests/Functional/CoreSpecial/FourierTransformationTest.cpp b/Tests/Functional/CoreSpecial/FourierTransformationTest.cpp
index 1cf1dd029b8d3236ff7aaa2524b424e424523f5a..df4481abb71e01b20f527b2e905408524d976c85 100644
--- a/Tests/Functional/CoreSpecial/FourierTransformationTest.cpp
+++ b/Tests/Functional/CoreSpecial/FourierTransformationTest.cpp
@@ -46,7 +46,7 @@ bool test_fft(const std::string& input_image_name, const std::string& reference_
     try {
         const auto filename =
             BaseUtil::Filesystem::jointPath(BATesting::ReferenceDir_Suite(), input_image_name);
-        input_image.reset(IO::readDatafield(filename));
+        input_image.reset(IO::readData2D(filename));
     } catch (const std::exception&) {
         std::cout << "Error: no input image.\n";
         return false;
@@ -58,7 +58,7 @@ bool test_fft(const std::string& input_image_name, const std::string& reference_
     std::cout << "loading reference" << std::endl;
     std::unique_ptr<Datafield> reference_fft;
     try {
-        reference_fft.reset(IO::readDatafield(reference_fft_name));
+        reference_fft.reset(IO::readData2D(reference_fft_name));
     } catch (const std::exception&) {
         std::cout << "Error: no reference fft image. Creating new one.\n";
     }
diff --git a/Tests/Py/Unit/intensitydata_io.py b/Tests/Py/Unit/intensitydata_io.py
index 931190fdfb354f6c27bbffeb017e56657a36d8aa..640afeb71c98062dc0be5e910d2f25dbca27aa9b 100644
--- a/Tests/Py/Unit/intensitydata_io.py
+++ b/Tests/Py/Unit/intensitydata_io.py
@@ -43,14 +43,14 @@ class IOTest(unittest.TestCase):
     def test_SaveNumpyArray_ReadDatafield(self):
         arr = numpy.array([[0, 1, 2, 3.0], [4, 5, 6, 7.0], [8, 9, 10, 11.0]])
         numpy.savetxt('tmp.txt', arr)
-        newdata = ba.readDatafield("tmp.txt")
+        newdata = ba.readData2D("tmp.txt")
         self.assertTrue(numpy.array_equal(newdata.npArray(), arr))
 
     def test_SaveNumpyArray_ReadRawDataVector(self):
         arr = numpy.array([[0, 1, 2, 3.0], [4, 5, 6, 7.0], [8, 9, 10, 11.0]])
         numpy.savetxt('tmp.txt', arr)
         newdata = numpy.array(
-            ba.readDatafield("tmp.txt").flatVector())
+            ba.readData2D("tmp.txt").flatVector())
         expected = numpy.array(
             [8., 4., 0., 9., 5., 1., 10., 6., 2., 11., 7., 3.])
         self.assertTrue(numpy.array_equal(newdata, expected))
diff --git a/Tests/Suite/Persist/Check.cpp b/Tests/Suite/Persist/Check.cpp
index 8df5bc0b4840d08fb06429f583fadc81c7c0291a..cf55bfdc08fab85631efd36b3b79de10ee320e91 100644
--- a/Tests/Suite/Persist/Check.cpp
+++ b/Tests/Suite/Persist/Check.cpp
@@ -38,7 +38,7 @@ bool checkSimulation(const std::string& name, ISimulation& direct_simulation, co
         const std::string refPath =
             BaseUtil::Filesystem::jointPath(BATesting::ReferenceDir_Suite(), name + ".int.gz");
         std::cout << "- reference: " << refPath << "\n";
-        reference.reset(IO::readDatafield(refPath));
+        reference.reset(IO::readData2D(refPath));
     } catch (const std::exception&) {
         std::cerr << "FAILED: cannot read reference\n";
     }
diff --git a/Tests/Suite/Py/Check.cpp b/Tests/Suite/Py/Check.cpp
index 55ec51300c054e6c7269b33b281c9df152f5763f..e3921a4713f915dcab091d8c68ce32da67807735 100644
--- a/Tests/Suite/Py/Check.cpp
+++ b/Tests/Suite/Py/Check.cpp
@@ -61,7 +61,7 @@ std::vector<double> domainData(const std::string& test_name, const ISimulation&
     if (err)
         throw std::runtime_error("Exported Python script did not execute properly");
 
-    auto result = std::unique_ptr<Datafield>(IO::readDatafield(output_path));
+    auto result = std::unique_ptr<Datafield>(IO::readData2D(output_path));
     if (!result)
         throw std::runtime_error("Could not read back simulation output from file " + output_path);
     return result->flatVector();
diff --git a/Tests/Unit/Device/ReadSANSDRawTest.cpp b/Tests/Unit/Device/ReadSANSDRawTest.cpp
index 0a8eb39d8152b8f85fef6d4d599c4453984a4226..822cefa0caf527e09ba713f6615f8d2c0cb8def9 100644
--- a/Tests/Unit/Device/ReadSANSDRawTest.cpp
+++ b/Tests/Unit/Device/ReadSANSDRawTest.cpp
@@ -6,7 +6,7 @@
 TEST(ReadSANSDRawTest, Read)
 {
     const auto fname = BATesting::ExampleDataDir() + "/SANSDRaw.001";
-    Datafield* data = IO::readDatafield(fname, IO::automatic);
+    Datafield* data = IO::readData2D(fname, IO::automatic);
     EXPECT_NE(data, nullptr);
     if (!data)
         return;
diff --git a/Tests/Unit/GUI/TestJobModel.cpp b/Tests/Unit/GUI/TestJobModel.cpp
index 260437eb2c3e7da47f11320a0933168c292e74e0..2e5d197e51b5dbbb43406285b6810ab55a019a14 100644
--- a/Tests/Unit/GUI/TestJobModel.cpp
+++ b/Tests/Unit/GUI/TestJobModel.cpp
@@ -88,8 +88,8 @@ TEST(TestJobModel, saveNonXMLData)
     EXPECT_TRUE(QFile::exists(fname2));
 
     // read data from disk, check it is the same
-    std::unique_ptr<Datafield> dataOnDisk1(IO::readDatafield(fname1.toStdString()));
-    std::unique_ptr<Datafield> dataOnDisk2(IO::readDatafield(fname2.toStdString()));
+    std::unique_ptr<Datafield> dataOnDisk1(IO::readData2D(fname1.toStdString()));
+    std::unique_ptr<Datafield> dataOnDisk2(IO::readData2D(fname2.toStdString()));
     EXPECT_TRUE(UTest::GUI::isTheSame(*dataOnDisk1, *jobItem->simulatedDataItem()->c_field()));
     EXPECT_TRUE(UTest::GUI::isTheSame(*dataOnDisk2, *jobItem->realItem()->dataItem()->c_field()));
 
@@ -103,7 +103,7 @@ TEST(TestJobModel, saveNonXMLData)
     EXPECT_TRUE(UTest::GUI::isTheSame(*dataOnDisk2, *jobItem->realItem()->dataItem()->c_field()));
 
     // check that data on disk has changed
-    dataOnDisk1.reset(IO::readDatafield(fname1.toStdString()));
+    dataOnDisk1.reset(IO::readData2D(fname1.toStdString()));
     EXPECT_TRUE(UTest::GUI::isTheSame(*dataOnDisk1, *jobItem->simulatedDataItem()->c_field()));
 
     // rename job and check that file on disk changed the name
diff --git a/Tests/Unit/GUI/TestRealModel.cpp b/Tests/Unit/GUI/TestRealModel.cpp
index fb881ef1d271fa860e6d6264949310304f540355..dd224f23f7f8e93b7e67e2a4010e712fff7745bb 100644
--- a/Tests/Unit/GUI/TestRealModel.cpp
+++ b/Tests/Unit/GUI/TestRealModel.cpp
@@ -125,8 +125,8 @@ TEST(TestRealModel, saveNonXMLData)
     EXPECT_TRUE(QFile::exists(fname2));
 
     // read data from disk, checking it is the same
-    std::unique_ptr<Datafield> dataOnDisk1(IO::readDatafield(fname1.toStdString()));
-    std::unique_ptr<Datafield> dataOnDisk2(IO::readDatafield(fname2.toStdString()));
+    std::unique_ptr<Datafield> dataOnDisk1(IO::readData2D(fname1.toStdString()));
+    std::unique_ptr<Datafield> dataOnDisk2(IO::readData2D(fname2.toStdString()));
     EXPECT_TRUE(UTest::GUI::isTheSame(*dataOnDisk1, *item1->dataItem()->c_field()));
     EXPECT_TRUE(UTest::GUI::isTheSame(*dataOnDisk2, *item2->dataItem()->c_field()));
 
@@ -139,7 +139,7 @@ TEST(TestRealModel, saveNonXMLData)
     EXPECT_FALSE(UTest::GUI::isTheSame(*dataOnDisk2, *item2->dataItem()->c_field()));
 
     // check that data on disk has changed
-    dataOnDisk2.reset(IO::readDatafield(fname2.toStdString()));
+    dataOnDisk2.reset(IO::readData2D(fname2.toStdString()));
     EXPECT_TRUE(UTest::GUI::isTheSame(*dataOnDisk2, *item2->dataItem()->c_field()));
 
     // rename RealData and check that file on disk changed the name
diff --git a/Tests/Unit/GUI/Utils.cpp b/Tests/Unit/GUI/Utils.cpp
index 4018bf1632145b48b545b30f0f768bd98562c323..ff31835191ace6af378c5fbdfef096004eb9fbde 100644
--- a/Tests/Unit/GUI/Utils.cpp
+++ b/Tests/Unit/GUI/Utils.cpp
@@ -67,6 +67,6 @@ bool UTest::GUI::isTheSame(const Datafield& data1, const Datafield& data2)
 
 bool UTest::GUI::isTheSame(const QString& fileName, const Datafield& data)
 {
-    std::unique_ptr<Datafield> dataOnDisk(IO::readDatafield(fileName.toStdString()));
+    std::unique_ptr<Datafield> dataOnDisk(IO::readData2D(fileName.toStdString()));
     return isTheSame(*dataOnDisk, data);
 }