diff --git a/Device/IO/IOFactory.cpp b/Device/IO/IOFactory.cpp
index 13158eafa9b706a15468f5decc3da7971b08dda8..ab749e168f2df3dd6468149ce2c0805521f9325e 100644
--- a/Device/IO/IOFactory.cpp
+++ b/Device/IO/IOFactory.cpp
@@ -108,7 +108,7 @@ void stream2file(const std::string& file_name, std::stringstream& s)
     fout.close();
 }
 
-bool fileTypeMatchesLoaderSelector(const std::string& fileName, IO::LoaderSelector selector)
+bool fileTypeMatchesFiletype2D(const std::string& fileName, IO::Filetype2D selector)
 {
     switch (selector) {
     case IO::bornagain:
@@ -117,7 +117,7 @@ bool fileTypeMatchesLoaderSelector(const std::string& fileName, IO::LoaderSelect
         return DataUtil::Format::isNicosFile(fileName);
     case IO::tiff:
         return DataUtil::Format::isTiffFile(fileName);
-    case IO::automatic:
+    case IO::auto2D:
         return false;
     }
 
@@ -127,12 +127,11 @@ bool fileTypeMatchesLoaderSelector(const std::string& fileName, IO::LoaderSelect
 } // namespace
 
 
-Datafield* IO::readData2D(const std::string& file_name, LoaderSelector selector)
+Datafield* IO::readData2D(const std::string& file_name, Filetype2D selector)
 {
-    const auto readAs = [=](LoaderSelector testForSelector) {
+    const auto readAs = [=](Filetype2D testForSelector) {
         return (selector == testForSelector)
-               || (selector == automatic
-                   && ::fileTypeMatchesLoaderSelector(file_name, testForSelector));
+               || (selector == auto2D && ::fileTypeMatchesFiletype2D(file_name, testForSelector));
     };
 
     auto s = ::file2stream(file_name);
diff --git a/Device/IO/IOFactory.h b/Device/IO/IOFactory.h
index b0848e59de1c4fa2f9e40900491a30bc63fe7a9c..35a578834ebb08efd2b06dce8b09aeb16f147829 100644
--- a/Device/IO/IOFactory.h
+++ b/Device/IO/IOFactory.h
@@ -21,19 +21,20 @@ class Datafield;
 
 namespace IO {
 
-enum LoaderSelector { automatic, bornagain, tiff, nicos };
+enum Filetype2D { auto2D, bornagain, tiff, nicos };
+enum Filetype1D { auto1D, mft };
 
 //! Reads file and returns newly created Datafield object.
-//! If selector is 'automatic', then the file extension will determine the loader to be used.
+//! If selector is 'auto2D', then the file extension will determine the loader to be used.
 //! 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* readData2D(const std::string& file_name, LoaderSelector selector = automatic);
+Datafield* readData2D(const std::string& file_name, Filetype2D selector = auto2D);
 
 Datafield* readReflectometryData(const std::string& file_name);
 
 //! Writes Datafield to file.
-//! If selector is 'automatic', then the file extension will determine the loader to be used.
+//! If selector is 'auto2D', then the file extension will determine the loader to be used.
 //! For any other selector, the file extension is ignored.
 //! If file name ends with "*.gz" or "*.bz2" the file will be zipped on the fly.
 void writeDatafield(const Datafield& data, const std::string& file_name);
diff --git a/Device/IO/ReadWriteNicos.h b/Device/IO/ReadWriteNicos.h
index 9cd70c360aa3cb0c9e83a6f3ecdbabaf9b71b81d..936ba0917e24c878d47c5b80a1775fb56e250062 100644
--- a/Device/IO/ReadWriteNicos.h
+++ b/Device/IO/ReadWriteNicos.h
@@ -24,6 +24,6 @@ namespace Util::RW {
 //! Read/write SANSDRaw files written by Nicos (*.001).
 Datafield* readNicos(std::istream& input_stream);
 
-};
+}; // namespace Util::RW
 
 #endif // BORNAGAIN_DEVICE_IO_READWRITENICOS_H
diff --git a/GUI/View/Import/ImportDataUtil.cpp b/GUI/View/Import/ImportDataUtil.cpp
index 64577c000ff79df1ff2901f3a39cebd252b7312f..3ff6ba9b703fa391d1e52796e37db124d7400edd 100644
--- a/GUI/View/Import/ImportDataUtil.cpp
+++ b/GUI/View/Import/ImportDataUtil.cpp
@@ -33,7 +33,7 @@ const QString filter_string_ascii = "Intensity File (*.int *.int.gz *.txt *.csv
 //! Currently used for all 2D, and some 1D data files.
 
 std::unique_ptr<Datafield> ImportKnownData(const QString& fileName,
-                                           IO::LoaderSelector loader = IO::automatic)
+                                           IO::Filetype2D loader = IO::auto2D)
 {
     // Try to use the canonical tools for importing data
     std::unique_ptr<Datafield> result;
@@ -52,7 +52,7 @@ std::unique_ptr<Datafield> ImportKnownData(const QString& fileName,
 
 
 std::unique_ptr<Datafield> GUI::View::ImportDataUtil::Import2dData(const QString& fileName,
-                                                                   IO::LoaderSelector loader)
+                                                                   IO::Filetype2D loader)
 {
     return ImportKnownData(fileName, loader);
 }
diff --git a/GUI/View/Import/ImportDataUtil.h b/GUI/View/Import/ImportDataUtil.h
index ac931285b99b2af6b3f6afca2d4eaf7012a52af7..38ca1a1f60f6ca13509e393977dce0a2df95fece 100644
--- a/GUI/View/Import/ImportDataUtil.h
+++ b/GUI/View/Import/ImportDataUtil.h
@@ -29,7 +29,7 @@ class AbstractDataLoader;
 namespace GUI::View::ImportDataUtil {
 
 //! Imports 2D data, stores them as Datafield, and returns owning pointer.
-std::unique_ptr<Datafield> Import2dData(const QString& fileName, IO::LoaderSelector loader);
+std::unique_ptr<Datafield> Import2dData(const QString& fileName, IO::Filetype2D loader);
 
 //! Imports 1D data into the given item.
 
diff --git a/GUI/View/Import/RealDataSelectorWidget.cpp b/GUI/View/Import/RealDataSelectorWidget.cpp
index 5e6bdd7ff824250e661b4da89e8fb421225882a5..f6ea07d54eb55a2992cb808fb2cafa0fe92d602f 100644
--- a/GUI/View/Import/RealDataSelectorWidget.cpp
+++ b/GUI/View/Import/RealDataSelectorWidget.cpp
@@ -282,10 +282,10 @@ void RealDataSelectorWidget::importData1D()
 
 void RealDataSelectorWidget::importData2D()
 {
-    QMap<QString, IO::LoaderSelector> loaderOfFilter;
+    QMap<QString, IO::Filetype2D> loaderOfFilter;
     QString filters;
 
-    const auto addFilter = [&](IO::LoaderSelector loaderSelector, const QString& filter) {
+    const auto addFilter = [&](IO::Filetype2D loaderSelector, const QString& filter) {
         if (!filters.isEmpty())
             filters += ";;";
         filters += filter;
@@ -294,8 +294,8 @@ void RealDataSelectorWidget::importData2D()
     addFilter(IO::tiff, "TIFF (*.tif *.tiff *.tif.gz)");
     addFilter(IO::nicos, "Nicos/SANSDRaw (*.001)");
     addFilter(IO::bornagain, "BornAgain (*.int.gz)");
-    addFilter(IO::automatic, "CSV (*.txt *.csv *.dat)");
-    addFilter(IO::automatic, "All (*.*)");
+    addFilter(IO::auto2D, "CSV (*.txt *.csv *.dat)");
+    addFilter(IO::auto2D, "All (*.*)");
 
     QString selectedFilter = ProjectManager::instance()->recentlyUsedImportFilter2D();
 
@@ -310,7 +310,7 @@ void RealDataSelectorWidget::importData2D()
     ProjectManager::instance()->setImportDirFromFilePath(fileNames[0]);
     ProjectManager::instance()->setRecentlyUsedImportFilter2D(selectedFilter);
 
-    const auto selectedLoader = loaderOfFilter.value(selectedFilter, IO::automatic);
+    const auto selectedLoader = loaderOfFilter.value(selectedFilter, IO::auto2D);
 
     for (const auto& fileName : fileNames) {
         std::unique_ptr<Datafield> data =
diff --git a/Tests/Unit/Device/ReadSANSDRawTest.cpp b/Tests/Unit/Device/ReadSANSDRawTest.cpp
index 822cefa0caf527e09ba713f6615f8d2c0cb8def9..5fa6b9ee33ce3c59665e272a3a7d3760a0b9a1df 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::readData2D(fname, IO::automatic);
+    Datafield* data = IO::readData2D(fname, IO::auto2D);
     EXPECT_NE(data, nullptr);
     if (!data)
         return;
diff --git a/auto/Wrap/libBornAgainDevice.py b/auto/Wrap/libBornAgainDevice.py
index f1df29624efdbe47619d5c77a64c483de2f4c0df..44fc50324ea0e5af7d6d7c08c3203c6edae97755 100644
--- a/auto/Wrap/libBornAgainDevice.py
+++ b/auto/Wrap/libBornAgainDevice.py
@@ -2989,7 +2989,7 @@ class SphericalDetector(IDetector):
 
 # Register SphericalDetector in _libBornAgainDevice:
 _libBornAgainDevice.SphericalDetector_swigregister(SphericalDetector)
-automatic = _libBornAgainDevice.automatic
+auto2D = _libBornAgainDevice.auto2D
 
 bornagain = _libBornAgainDevice.bornagain
 
@@ -2997,10 +2997,14 @@ tiff = _libBornAgainDevice.tiff
 
 nicos = _libBornAgainDevice.nicos
 
+auto1D = _libBornAgainDevice.auto1D
 
-def readDatafield(*args):
-    r"""readDatafield(std::string const & file_name, IOFactory::LoaderSelector selector=automatic) -> Datafield"""
-    return _libBornAgainDevice.readDatafield(*args)
+mft = _libBornAgainDevice.mft
+
+
+def readData2D(*args):
+    r"""readData2D(std::string const & file_name, IO::Filetype2D selector=auto2D) -> Datafield"""
+    return _libBornAgainDevice.readData2D(*args)
 
 def readReflectometryData(file_name):
     r"""readReflectometryData(std::string const & file_name) -> Datafield"""
diff --git a/auto/Wrap/libBornAgainDevice_wrap.cpp b/auto/Wrap/libBornAgainDevice_wrap.cpp
index 775ab95d4f4c717489a3f55880fbacb03fb3563c..860e7ab79c5aa5f0940161aa36416327f2a8e842 100644
--- a/auto/Wrap/libBornAgainDevice_wrap.cpp
+++ b/auto/Wrap/libBornAgainDevice_wrap.cpp
@@ -36182,10 +36182,10 @@ SWIGINTERN PyObject *SphericalDetector_swiginit(PyObject *SWIGUNUSEDPARM(self),
   return SWIG_Python_InitShadowInstance(args);
 }
 
-SWIGINTERN PyObject *_wrap_readDatafield__SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_readData2D__SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   std::string *arg1 = 0 ;
-  IOFactory::LoaderSelector arg2 ;
+  IO::Filetype2D arg2 ;
   int res1 = SWIG_OLDOBJ ;
   int val2 ;
   int ecode2 = 0 ;
@@ -36196,19 +36196,19 @@ SWIGINTERN PyObject *_wrap_readDatafield__SWIG_0(PyObject *self, Py_ssize_t nobj
     std::string *ptr = (std::string *)0;
     res1 = SWIG_AsPtr_std_string(swig_obj[0], &ptr);
     if (!SWIG_IsOK(res1)) {
-      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "readDatafield" "', argument " "1"" of type '" "std::string const &""'"); 
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "readData2D" "', argument " "1"" of type '" "std::string const &""'"); 
     }
     if (!ptr) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "readDatafield" "', argument " "1"" of type '" "std::string const &""'"); 
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "readData2D" "', argument " "1"" of type '" "std::string const &""'"); 
     }
     arg1 = ptr;
   }
   ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
   if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "readDatafield" "', argument " "2"" of type '" "IOFactory::LoaderSelector""'");
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "readData2D" "', argument " "2"" of type '" "IO::Filetype2D""'");
   } 
-  arg2 = static_cast< IOFactory::LoaderSelector >(val2);
-  result = (Datafield *)IOFactory::readDatafield((std::string const &)*arg1,arg2);
+  arg2 = static_cast< IO::Filetype2D >(val2);
+  result = (Datafield *)IO::readData2D((std::string const &)*arg1,arg2);
   resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Datafield, 0 |  0 );
   if (SWIG_IsNewObj(res1)) delete arg1;
   return resultobj;
@@ -36218,7 +36218,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_readDatafield__SWIG_1(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_readData2D__SWIG_1(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   std::string *arg1 = 0 ;
   int res1 = SWIG_OLDOBJ ;
@@ -36229,14 +36229,14 @@ SWIGINTERN PyObject *_wrap_readDatafield__SWIG_1(PyObject *self, Py_ssize_t nobj
     std::string *ptr = (std::string *)0;
     res1 = SWIG_AsPtr_std_string(swig_obj[0], &ptr);
     if (!SWIG_IsOK(res1)) {
-      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "readDatafield" "', argument " "1"" of type '" "std::string const &""'"); 
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "readData2D" "', argument " "1"" of type '" "std::string const &""'"); 
     }
     if (!ptr) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "readDatafield" "', argument " "1"" of type '" "std::string const &""'"); 
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "readData2D" "', argument " "1"" of type '" "std::string const &""'"); 
     }
     arg1 = ptr;
   }
-  result = (Datafield *)IOFactory::readDatafield((std::string const &)*arg1);
+  result = (Datafield *)IO::readData2D((std::string const &)*arg1);
   resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Datafield, 0 |  0 );
   if (SWIG_IsNewObj(res1)) delete arg1;
   return resultobj;
@@ -36246,20 +36246,20 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_readDatafield(PyObject *self, PyObject *args) {
+SWIGINTERN PyObject *_wrap_readData2D(PyObject *self, PyObject *args) {
   Py_ssize_t argc;
   PyObject *argv[3] = {
     0
   };
   
-  if (!(argc = SWIG_Python_UnpackTuple(args, "readDatafield", 0, 2, argv))) SWIG_fail;
+  if (!(argc = SWIG_Python_UnpackTuple(args, "readData2D", 0, 2, argv))) SWIG_fail;
   --argc;
   if (argc == 1) {
     int _v = 0;
     int res = SWIG_AsPtr_std_string(argv[0], (std::string**)(0));
     _v = SWIG_CheckState(res);
     if (_v) {
-      return _wrap_readDatafield__SWIG_1(self, argc, argv);
+      return _wrap_readData2D__SWIG_1(self, argc, argv);
     }
   }
   if (argc == 2) {
@@ -36272,16 +36272,16 @@ SWIGINTERN PyObject *_wrap_readDatafield(PyObject *self, PyObject *args) {
         _v = SWIG_CheckState(res);
       }
       if (_v) {
-        return _wrap_readDatafield__SWIG_0(self, argc, argv);
+        return _wrap_readData2D__SWIG_0(self, argc, argv);
       }
     }
   }
   
 fail:
-  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'readDatafield'.\n"
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'readData2D'.\n"
     "  Possible C/C++ prototypes are:\n"
-    "    IOFactory::readDatafield(std::string const &,IOFactory::LoaderSelector)\n"
-    "    IOFactory::readDatafield(std::string const &)\n");
+    "    IO::readData2D(std::string const &,IO::Filetype2D)\n"
+    "    IO::readData2D(std::string const &)\n");
   return 0;
 }
 
@@ -36306,7 +36306,7 @@ SWIGINTERN PyObject *_wrap_readReflectometryData(PyObject *self, PyObject *args)
     }
     arg1 = ptr;
   }
-  result = (Datafield *)IOFactory::readReflectometryData((std::string const &)*arg1);
+  result = (Datafield *)IO::readReflectometryData((std::string const &)*arg1);
   resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Datafield, 0 |  0 );
   if (SWIG_IsNewObj(res1)) delete arg1;
   return resultobj;
@@ -36345,7 +36345,7 @@ SWIGINTERN PyObject *_wrap_writeDatafield(PyObject *self, PyObject *args) {
     }
     arg2 = ptr;
   }
-  IOFactory::writeDatafield((Datafield const &)*arg1,(std::string const &)*arg2);
+  IO::writeDatafield((Datafield const &)*arg1,(std::string const &)*arg2);
   resultobj = SWIG_Py_Void();
   if (SWIG_IsNewObj(res2)) delete arg2;
   return resultobj;
@@ -36395,7 +36395,7 @@ SWIGINTERN PyObject *_wrap_filesAgree(PyObject *self, PyObject *args) {
     SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "filesAgree" "', argument " "3"" of type '" "double""'");
   } 
   arg3 = static_cast< double >(val3);
-  result = (bool)IOUtil::filesAgree((std::string const &)*arg1,(std::string const &)*arg2,arg3);
+  result = (bool)Util::RW::filesAgree((std::string const &)*arg1,(std::string const &)*arg2,arg3);
   resultobj = SWIG_From_bool(static_cast< bool >(result));
   if (SWIG_IsNewObj(res1)) delete arg1;
   if (SWIG_IsNewObj(res2)) delete arg2;
@@ -38188,7 +38188,7 @@ static PyMethodDef SwigMethods[] = {
 	 { "SphericalDetector_indexOfSpecular", _wrap_SphericalDetector_indexOfSpecular, METH_VARARGS, "SphericalDetector_indexOfSpecular(SphericalDetector self, Beam beam) -> size_t"},
 	 { "SphericalDetector_swigregister", SphericalDetector_swigregister, METH_O, NULL},
 	 { "SphericalDetector_swiginit", SphericalDetector_swiginit, METH_VARARGS, NULL},
-	 { "readDatafield", _wrap_readDatafield, METH_VARARGS, "readDatafield(std::string const & file_name, IOFactory::LoaderSelector selector=automatic) -> Datafield"},
+	 { "readData2D", _wrap_readData2D, METH_VARARGS, "readData2D(std::string const & file_name, IO::Filetype2D selector=auto2D) -> Datafield"},
 	 { "readReflectometryData", _wrap_readReflectometryData, METH_O, "readReflectometryData(std::string const & file_name) -> Datafield"},
 	 { "writeDatafield", _wrap_writeDatafield, METH_VARARGS, "writeDatafield(Datafield data, std::string const & file_name)"},
 	 { "filesAgree", _wrap_filesAgree, METH_VARARGS, "filesAgree(std::string const & datFileName, std::string const & refFileName, double tol) -> bool"},
@@ -39187,10 +39187,12 @@ SWIG_init(void) {
   SWIG_Python_SetConstant(d, "RectangularDetector_PERPENDICULAR_TO_SAMPLE",SWIG_From_int(static_cast< int >(RectangularDetector::PERPENDICULAR_TO_SAMPLE)));
   SWIG_Python_SetConstant(d, "RectangularDetector_PERPENDICULAR_TO_DIRECT_BEAM",SWIG_From_int(static_cast< int >(RectangularDetector::PERPENDICULAR_TO_DIRECT_BEAM)));
   SWIG_Python_SetConstant(d, "RectangularDetector_PERPENDICULAR_TO_REFLECTED_BEAM",SWIG_From_int(static_cast< int >(RectangularDetector::PERPENDICULAR_TO_REFLECTED_BEAM)));
-  SWIG_Python_SetConstant(d, "automatic",SWIG_From_int(static_cast< int >(IOFactory::automatic)));
-  SWIG_Python_SetConstant(d, "bornagain",SWIG_From_int(static_cast< int >(IOFactory::bornagain)));
-  SWIG_Python_SetConstant(d, "tiff",SWIG_From_int(static_cast< int >(IOFactory::tiff)));
-  SWIG_Python_SetConstant(d, "nicos",SWIG_From_int(static_cast< int >(IOFactory::nicos)));
+  SWIG_Python_SetConstant(d, "auto2D",SWIG_From_int(static_cast< int >(IO::auto2D)));
+  SWIG_Python_SetConstant(d, "bornagain",SWIG_From_int(static_cast< int >(IO::bornagain)));
+  SWIG_Python_SetConstant(d, "tiff",SWIG_From_int(static_cast< int >(IO::tiff)));
+  SWIG_Python_SetConstant(d, "nicos",SWIG_From_int(static_cast< int >(IO::nicos)));
+  SWIG_Python_SetConstant(d, "auto1D",SWIG_From_int(static_cast< int >(IO::auto1D)));
+  SWIG_Python_SetConstant(d, "mft",SWIG_From_int(static_cast< int >(IO::mft)));
 #if PY_VERSION_HEX >= 0x03000000
   return m;
 #else