diff --git a/App/main.cpp b/App/main.cpp
index 663f58a9ddeec1291bb5345e1ff49bf3efeb57f7..f017b48da80c0e31982c0028fd27568d99f28948 100644
--- a/App/main.cpp
+++ b/App/main.cpp
@@ -15,9 +15,8 @@
 #include "App/AppOptions.h"
 #include "Base/Util/Assert.h"
 #include "GUI/Model/Project/ProjectDocument.h"
-#include "GUI/Support/Data/Dirs.h"
 #include "GUI/Support/Util/Path.h"
-#include "GUI/View/Layout/ApplicationSettings.h"
+#include "GUI/View/Layout/AppConfig.h"
 #include "GUI/View/Main/MainWindow.h"
 #include "GUI/View/Tool/Globals.h"
 #include "config_build.h"
@@ -70,13 +69,7 @@ int main(int argc, char* argv[])
     app.setWindowIcon(QIcon(":/images/BornAgain.ico"));
 #endif
 
-    ApplicationSettings applicationSettings;
-
-    QString dir = GUI::Path::appDataFolder();
-    if (!QDir().exists(dir))
-        QDir().mkpath(dir);
-
-    gDirs = std::make_unique<Dirs>();
+    gApp = std::make_unique<AppConfig>();
     gDoc = std::make_unique<ProjectDocument>();
 
     MainWindow win;
diff --git a/GUI/Support/Util/Path.cpp b/GUI/Support/Util/Path.cpp
index a3f14db83d6fca0e551a662058243103a67d706e..3aa3bebafc09f8c426a9f5f04231d0689a100dfa 100644
--- a/GUI/Support/Util/Path.cpp
+++ b/GUI/Support/Util/Path.cpp
@@ -135,8 +135,3 @@ QString GUI::Path::baseName(const QString& fname)
     QFileInfo info(fname);
     return info.baseName();
 }
-
-QString GUI::Path::appDataFolder()
-{
-    return QStandardPaths::writableLocation(QStandardPaths::AppDataLocation);
-}
diff --git a/GUI/Support/Util/Path.h b/GUI/Support/Util/Path.h
index 0e79b20a2d81367d19d4380917c8c7b9a92a200d..13f936009168005138e408ea31746b8510e43d34 100644
--- a/GUI/Support/Util/Path.h
+++ b/GUI/Support/Util/Path.h
@@ -37,11 +37,6 @@ int versionCode(const QString& version);
 
 bool isVersionMatchMinimal(const QString& version, const QString& minimal_version);
 
-//! The folder where persistent application data shall be stored.
-//! Under Windows this is the AppData/Roaming location.
-//! Used e.g. for storing the instrument library.
-QString appDataFolder();
-
 } // namespace GUI::Path
 
 #endif // BORNAGAIN_GUI_SUPPORT_UTIL_PATH_H
diff --git a/GUI/View/Canvas/SavePlotAssistant.cpp b/GUI/View/Canvas/SavePlotAssistant.cpp
index 8ab027690fdfc4b093dbe8cac646bbacfa501599..2365e0215704573aec89e2b91d4cc2fcf91d68bf 100644
--- a/GUI/View/Canvas/SavePlotAssistant.cpp
+++ b/GUI/View/Canvas/SavePlotAssistant.cpp
@@ -15,8 +15,7 @@
 #include "GUI/View/Canvas/SavePlotAssistant.h"
 #include "Base/Util/Assert.h"
 #include "Device/IO/IOFactory.h"
-#include "GUI/Support/Data/Dirs.h"
-#include "GUI/View/Layout/ApplicationSettings.h"
+#include "GUI/View/Layout/AppConfig.h"
 #include "GUI/View/Plotter/ColorMap.h"
 #include "GUI/View/Widget/FileDialog.h"
 #include <QFile>
@@ -137,7 +136,7 @@ void GUI::Plot::savePlot(QCustomPlot* plot, const Datafield* output_data)
 {
     static const QString defaultExtension = ".png";
     QString fname =
-        GUI::FileDialog::w1_1f("Save Plot", gDirs->artifact_export_dir, "*" + defaultExtension);
+        GUI::FileDialog::w1_1f("Save Plot", gApp->artifact_export_dir, "*" + defaultExtension);
     if (fname.isEmpty())
         return;
     if (!fname.endsWith(defaultExtension))
diff --git a/GUI/Support/Data/Dirs.cpp b/GUI/View/Layout/AppConfig.cpp
similarity index 56%
rename from GUI/Support/Data/Dirs.cpp
rename to GUI/View/Layout/AppConfig.cpp
index 58c619e2c0b8cf998dfb27a90924bb6bde1e39bf..4fd4b06157676614740e3dc025f3a9960b0401cc 100644
--- a/GUI/Support/Data/Dirs.cpp
+++ b/GUI/View/Layout/AppConfig.cpp
@@ -2,19 +2,25 @@
 //
 //  BornAgain: simulate and fit reflection and scattering
 //
-//! @file      GUI/Support/Data/Dirs.cpp
-//! @brief     Implements class Dirs.
+//! @file      GUI/View/Layout/AppConfig.cpp
+//! @brief     Implements class AppConfig.
 //!
 //! @homepage  http://www.bornagainproject.org
 //! @license   GNU General Public License v3 or higher (see COPYING)
-//! @copyright Forschungszentrum Jülich GmbH 2018
+//! @copyright Forschungszentrum Jülich GmbH 2021
 //! @authors   Scientific Computing Group at MLZ (see CITATION, AUTHORS)
 //
 //  ************************************************************************************************
 
-#include "GUI/Support/Data/Dirs.h"
+#include "GUI/View/Layout/AppConfig.h"
+#include <QApplication>
 #include <QDir>
+#include <QFile>
 #include <QSettings>
+#include <QStandardPaths>
+#include <QStyle>
+
+BA_GUI_API_ std::unique_ptr<AppConfig> gApp; //!< global pointer to _the_ instance
 
 namespace {
 
@@ -28,21 +34,43 @@ const QString S_LASTUSEDIMPORFILTER2D = "LastUsedImportFilter2D";
 
 } // namespace
 
-BA_GUI_API_ std::unique_ptr<Dirs> gDirs;
 
-Dirs::Dirs()
+AppConfig::AppConfig()
 {
+    QFile base(":/styles/Base.stylesheet");
+    base.open(QFile::ReadOnly);
+    QString stylesheet = base.readAll();
+    qApp->setStyleSheet(stylesheet);
+
+    QPalette styleSheetPalette = qApp->style()->standardPalette();
+    styleSheetPalette.setColor(QPalette::Text, Qt::black);
+    styleSheetPalette.setColor(QPalette::WindowText, Qt::black);
+    styleSheetPalette.setColor(QPalette::Base, Qt::white);
+    styleSheetPalette.setColor(QPalette::AlternateBase, QColor(255, 255, 255).darker(105));
+    styleSheetPalette.setColor(QPalette::Dark, QColor(255, 255, 255).darker(110));
+    QApplication::setPalette(styleSheetPalette);
+
+    xml_dir = QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation);
     artifact_export_dir = QDir::homePath();
     data_import_dir = QDir::homePath();
     script_import_dir = QDir::homePath();
-    readSettings();
+    // TODO replace homePath by QStandardPaths::writableLocation(QStandardPaths::AppDataLocation) ?
+
+    loadSettings();
 }
 
-Dirs::~Dirs() = default;
+bool AppConfig::useNativeFileDialog() const
+{
+#ifdef _WIN32
+    return true;
+#else
+    return false;
+#endif
+}
 
-//! Reads settings of Dirs from global settings.
+//! Reads settings of AppConfig from global settings.
 
-void Dirs::readSettings()
+void AppConfig::loadSettings()
 {
     QSettings s;
     if (s.childGroups().contains(S_DIRS)) {
@@ -59,9 +87,9 @@ void Dirs::readSettings()
     }
 }
 
-//! Saves settings of Dirs in global settings.
+//! Saves settings of AppConfig in global settings.
 
-void Dirs::writeSettings()
+void AppConfig::saveSettings()
 {
     QSettings s;
     s.beginGroup(S_DIRS);
diff --git a/GUI/Support/Data/Dirs.h b/GUI/View/Layout/AppConfig.h
similarity index 61%
rename from GUI/Support/Data/Dirs.h
rename to GUI/View/Layout/AppConfig.h
index 68bda63afbdaa08d649b3d6b6c5a25ab54041fc8..a5a930ea6e106b95cab08db4c7041413845ae665 100644
--- a/GUI/Support/Data/Dirs.h
+++ b/GUI/View/Layout/AppConfig.h
@@ -2,28 +2,29 @@
 //
 //  BornAgain: simulate and fit reflection and scattering
 //
-//! @file      GUI/Support/Data/Dirs.h
-//! @brief     Defines class Dirs.
+//! @file      GUI/View/Layout/AppConfig.h
+//! @brief     Defines class AppConfig.
 //!
 //! @homepage  http://www.bornagainproject.org
 //! @license   GNU General Public License v3 or higher (see COPYING)
-//! @copyright Forschungszentrum Jülich GmbH 2018
+//! @copyright Forschungszentrum Jülich GmbH 2021
 //! @authors   Scientific Computing Group at MLZ (see CITATION, AUTHORS)
 //
 //  ************************************************************************************************
 
-#ifndef BORNAGAIN_GUI_SUPPORT_DATA_DIRS_H
-#define BORNAGAIN_GUI_SUPPORT_DATA_DIRS_H
+#ifndef BORNAGAIN_GUI_VIEW_LAYOUT_APPCONFIG_H
+#define BORNAGAIN_GUI_VIEW_LAYOUT_APPCONFIG_H
 
 #include "Wrap/WinDllMacros.h"
 #include <QString>
 
-//! Handles activity related to opening/save projects.
+//! Application-wide settings.
 
-class Dirs {
+class AppConfig {
 public:
-    Dirs();
-    ~Dirs();
+    AppConfig();
+
+    bool useNativeFileDialog() const;
 
     QString import_filter_1D; //!< Last used import filter for 1D files
     QString import_filter_2D; //!< Last used import filter for 2D files
@@ -31,13 +32,14 @@ public:
     QString artifact_export_dir; //!< Last used directory to save image, script, ...
     QString data_import_dir;     //!< Last data were imported from this directory
     QString script_import_dir;   //!< Last script was imported from this directory
+    QString xml_dir;             //!< Last directory for component IO
 
-    void writeSettings();
+    void saveSettings();
 
 private:
-    void readSettings();
+    void loadSettings();
 };
 
-BA_GUI_API_ extern std::unique_ptr<Dirs> gDirs;
+BA_GUI_API_ extern std::unique_ptr<AppConfig> gApp; //!< global pointer to _the_ instance
 
-#endif // BORNAGAIN_GUI_SUPPORT_DATA_DIRS_H
+#endif // BORNAGAIN_GUI_VIEW_LAYOUT_APPCONFIG_H
diff --git a/GUI/View/Layout/ApplicationSettings.cpp b/GUI/View/Layout/ApplicationSettings.cpp
deleted file mode 100644
index e70a085062c0a9446a38c571cb95ee522b34d909..0000000000000000000000000000000000000000
--- a/GUI/View/Layout/ApplicationSettings.cpp
+++ /dev/null
@@ -1,80 +0,0 @@
-//  ************************************************************************************************
-//
-//  BornAgain: simulate and fit reflection and scattering
-//
-//! @file      GUI/View/Layout/ApplicationSettings.cpp
-//! @brief     Implements class ApplicationSettings.
-//!
-//! @homepage  http://www.bornagainproject.org
-//! @license   GNU General Public License v3 or higher (see COPYING)
-//! @copyright Forschungszentrum Jülich GmbH 2021
-//! @authors   Scientific Computing Group at MLZ (see CITATION, AUTHORS)
-//
-//  ************************************************************************************************
-
-#include "GUI/View/Layout/ApplicationSettings.h"
-#include "Base/Util/Assert.h"
-#include <QApplication>
-#include <QFile>
-#include <QSettings>
-#include <QStandardPaths>
-#include <QStyle>
-
-namespace {
-
-const QString S_SIZE = "Size";
-const QString S_POS = "Pos";
-const QString S_SINGLE_SAMPLE_MODE = "SingleSampleMode";
-
-} // namespace
-
-ApplicationSettings* appSettings; //!< global pointer to _the_ instance
-
-ApplicationSettings::ApplicationSettings()
-{
-    appSettings = this;
-
-    QFile base(":/styles/Base.stylesheet");
-    base.open(QFile::ReadOnly);
-    QString stylesheet = base.readAll();
-    qApp->setStyleSheet(stylesheet);
-
-    QPalette styleSheetPalette = qApp->style()->standardPalette();
-    styleSheetPalette.setColor(QPalette::Text, Qt::black);
-    styleSheetPalette.setColor(QPalette::WindowText, Qt::black);
-    styleSheetPalette.setColor(QPalette::Base, Qt::white);
-    styleSheetPalette.setColor(QPalette::AlternateBase, QColor(255, 255, 255).darker(105));
-    styleSheetPalette.setColor(QPalette::Dark, QColor(255, 255, 255).darker(110));
-    QApplication::setPalette(styleSheetPalette);
-
-    xml_dir = QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation);
-}
-
-bool ApplicationSettings::useNativeFileDialog() const
-{
-#ifdef _WIN32
-    return true;
-#else
-    return false;
-#endif
-}
-
-void ApplicationSettings::saveWindowSizeAndPos(const QWidget* w)
-{
-    ASSERT(!w->objectName().isEmpty());
-    QSettings settings;
-    settings.setValue(S_SIZE + "/" + w->objectName(), w->size());
-    settings.setValue(S_POS + "/" + w->objectName(), w->pos());
-}
-
-void ApplicationSettings::loadWindowSizeAndPos(QWidget* w)
-{
-    ASSERT(!w->objectName().isEmpty());
-
-    QSettings settings;
-    const QSize size = settings.value(S_SIZE + "/" + w->objectName(), QSize()).toSize();
-    if (size.isValid())
-        w->resize(size);
-    if (settings.contains(S_POS + "/" + w->objectName()))
-        w->move(settings.value(S_POS + "/" + w->objectName()).toPoint());
-}
diff --git a/GUI/View/Layout/ApplicationSettings.h b/GUI/View/Layout/ApplicationSettings.h
deleted file mode 100644
index ede86df61628235b1d38124548c6dabbe567a407..0000000000000000000000000000000000000000
--- a/GUI/View/Layout/ApplicationSettings.h
+++ /dev/null
@@ -1,38 +0,0 @@
-//  ************************************************************************************************
-//
-//  BornAgain: simulate and fit reflection and scattering
-//
-//! @file      GUI/View/Layout/ApplicationSettings.h
-//! @brief     Defines class ApplicationSettings.
-//!
-//! @homepage  http://www.bornagainproject.org
-//! @license   GNU General Public License v3 or higher (see COPYING)
-//! @copyright Forschungszentrum Jülich GmbH 2021
-//! @authors   Scientific Computing Group at MLZ (see CITATION, AUTHORS)
-//
-//  ************************************************************************************************
-
-#ifndef BORNAGAIN_GUI_VIEW_LAYOUT_APPLICATIONSETTINGS_H
-#define BORNAGAIN_GUI_VIEW_LAYOUT_APPLICATIONSETTINGS_H
-
-#include <QWidget>
-
-//! Application wide settings.
-//!
-//! Contains settings which the user can change. Also
-//! contains settings which may be user editable in the future.
-class ApplicationSettings {
-public:
-    ApplicationSettings();
-
-    bool useNativeFileDialog() const;
-
-    void saveWindowSizeAndPos(const QWidget* w);
-    void loadWindowSizeAndPos(QWidget* w);
-
-    QString xml_dir;
-};
-
-extern ApplicationSettings* appSettings; //!< global pointer to the single instance
-
-#endif // BORNAGAIN_GUI_VIEW_LAYOUT_APPLICATIONSETTINGS_H
diff --git a/GUI/View/Loader/ComponentRW.cpp b/GUI/View/Loader/ComponentRW.cpp
index 973108d84df43b251d14f41476ff8fafcc409f1a..e2f4ea4517ec2c035221a14cd109fb3bd76f50b2 100644
--- a/GUI/View/Loader/ComponentRW.cpp
+++ b/GUI/View/Loader/ComponentRW.cpp
@@ -15,7 +15,7 @@
 #include "GUI/View/Loader/ComponentRW.h"
 #include "GUI/Model/Device/InstrumentItems.h"
 #include "GUI/Model/Device/InstrumentXML.h"
-#include "GUI/View/Layout/ApplicationSettings.h"
+#include "GUI/View/Layout/AppConfig.h"
 #include "GUI/View/Widget/FileDialog.h"
 #include <QMessageBox>
 
@@ -45,8 +45,8 @@ template <class T> void RW::saveComponentToXML(const QString& type, const T* t)
     if (!t)
         return;
 
-    QString fname = GUI::FileDialog::w1_1f("Save " + type, appSettings->xml_dir,
-                                           "XML files (*.xml)", t->name() + ".xml");
+    QString fname = GUI::FileDialog::w1_1f("Save " + type, gApp->xml_dir, "XML files (*.xml)",
+                                           t->name() + ".xml");
     if (fname.isEmpty())
         return;
 
@@ -61,8 +61,7 @@ template <class T> void RW::saveComponentToXML(const QString& type, const T* t)
 
 template <class T> T* RW::loadComponentFromXML(const QString& type)
 {
-    QString fname =
-        GUI::FileDialog::r1_1f("Load " + type, appSettings->xml_dir, "XML files (*.xml)");
+    QString fname = GUI::FileDialog::r1_1f("Load " + type, gApp->xml_dir, "XML files (*.xml)");
     if (fname.isEmpty())
         return nullptr;
 
diff --git a/GUI/View/Loader/DataLoader.cpp b/GUI/View/Loader/DataLoader.cpp
index 5ed0de128605c4994afd277de12f39fe902104a9..f4e8d613ada2d584ae457091729f49a8f862aa52 100644
--- a/GUI/View/Loader/DataLoader.cpp
+++ b/GUI/View/Loader/DataLoader.cpp
@@ -19,10 +19,9 @@
 #include "Device/IO/ZipUtil.h"
 #include "GUI/Model/Data/DataItem.h"
 #include "GUI/Model/Files/DatafileItem.h"
-#include "GUI/Support/Data/Dirs.h"
 #include "GUI/Support/Util/Path.h"
 #include "GUI/View/Info/MessageBox.h"
-#include "GUI/View/Layout/ApplicationSettings.h"
+#include "GUI/View/Layout/AppConfig.h"
 #include "GUI/View/Loader/ImportDialogs.h"
 #include <QFileDialog>
 #include <QFileInfo>
@@ -66,15 +65,13 @@ std::vector<DatafileItem*> RW::importData1D()
     static const QString filters = ::join_filterkeys(filters1D, ";;");
 
     const QStringList fnames = QFileDialog::getOpenFileNames(
-        Q_NULLPTR, "Open Intensity Files", gDirs->data_import_dir, filters,
-        &gDirs->import_filter_1D,
-        appSettings->useNativeFileDialog() ? QFileDialog::Options()
-                                           : QFileDialog::DontUseNativeDialog);
+        Q_NULLPTR, "Open Intensity Files", gApp->data_import_dir, filters, &gApp->import_filter_1D,
+        gApp->useNativeFileDialog() ? QFileDialog::Options() : QFileDialog::DontUseNativeDialog);
     if (fnames.isEmpty())
         return {};
 
-    gDirs->data_import_dir = GUI::Path::fileDir(fnames[0]); // all in list have same dir
-    const IO::Filetype1D global_ftype = ::filterkey2type(filters1D, gDirs->import_filter_1D);
+    gApp->data_import_dir = GUI::Path::fileDir(fnames[0]); // all in list have same dir
+    const IO::Filetype1D global_ftype = ::filterkey2type(filters1D, gApp->import_filter_1D);
 
     std::vector<DatafileItem*> result;
     for (const QString& fname : fnames) {
@@ -123,15 +120,13 @@ std::vector<DatafileItem*> RW::importData2D()
     static const QString filters = ::join_filterkeys(filters2D, ";;");
 
     const QStringList fnames = QFileDialog::getOpenFileNames(
-        Q_NULLPTR, "Open Intensity Files", gDirs->data_import_dir, filters,
-        &gDirs->import_filter_2D,
-        appSettings->useNativeFileDialog() ? QFileDialog::Options()
-                                           : QFileDialog::DontUseNativeDialog);
+        Q_NULLPTR, "Open Intensity Files", gApp->data_import_dir, filters, &gApp->import_filter_2D,
+        gApp->useNativeFileDialog() ? QFileDialog::Options() : QFileDialog::DontUseNativeDialog);
     if (fnames.isEmpty())
         return {};
 
-    gDirs->data_import_dir = GUI::Path::fileDir(fnames[0]); // all in list have same dir
-    const IO::Filetype2D global_ftype = ::filterkey2type(filters2D, gDirs->import_filter_2D);
+    gApp->data_import_dir = GUI::Path::fileDir(fnames[0]); // all in list have same dir
+    const IO::Filetype2D global_ftype = ::filterkey2type(filters2D, gApp->import_filter_2D);
 
     std::vector<DatafileItem*> result;
     for (const QString& fname : fnames) {
diff --git a/GUI/View/Loader/ProjectionsSaver.cpp b/GUI/View/Loader/ProjectionsSaver.cpp
index f641200481f9bf329aab2a5a778ac4321b17be86..8fbe7363e7ec7c9fa76ed5f796ecb7980f1ab644 100644
--- a/GUI/View/Loader/ProjectionsSaver.cpp
+++ b/GUI/View/Loader/ProjectionsSaver.cpp
@@ -19,8 +19,7 @@
 #include "GUI/Model/Data/Data2DItem.h"
 #include "GUI/Model/Mask/MasksSet.h"
 #include "GUI/Model/Project/ProjectDocument.h"
-#include "GUI/Support/Data/Dirs.h"
-#include "GUI/View/Layout/ApplicationSettings.h"
+#include "GUI/View/Layout/AppConfig.h"
 #include "GUI/View/Widget/FileDialog.h"
 #include <QFile>
 #include <QString>
@@ -152,7 +151,7 @@ void GUI::IO::saveProjections(const Data2DItem* data_item)
     if (!data_item)
         return;
 
-    QString fname = GUI::FileDialog::w1_1f("Save projections data", gDirs->artifact_export_dir, "");
+    QString fname = GUI::FileDialog::w1_1f("Save projections data", gApp->artifact_export_dir, "");
     if (fname.isEmpty())
         return;
 
diff --git a/GUI/View/Loader/PythonScriptWidget.cpp b/GUI/View/Loader/PythonScriptWidget.cpp
index 35a8be98b9fc2d263bb5d99afefd0af877d99cf7..ff6f872004c168ef21b88bc5916a1bfbbf5eb16b 100644
--- a/GUI/View/Loader/PythonScriptWidget.cpp
+++ b/GUI/View/Loader/PythonScriptWidget.cpp
@@ -17,8 +17,9 @@
 #include "GUI/Support/Style/Style.h"
 #include "GUI/View/Info/CautionSign.h"
 #include "GUI/View/Info/PythonSyntaxHighlighter.h"
-#include "GUI/View/Layout/ApplicationSettings.h"
+#include "GUI/View/Layout/AppConfig.h"
 #include "GUI/View/Widget/StyledToolbar.h"
+#include "GUI/View/Widget/WidgetSettings.h"
 #include "Sim/Export/ExportToPython.h"
 #include "Sim/Simulation/ScatteringSimulation.h"
 #include <QFileDialog>
@@ -69,13 +70,12 @@ PythonScriptWidget::PythonScriptWidget(QWidget* parent)
 
     setAttribute(Qt::WA_DeleteOnClose, true);
     GUI::Style::setResizable(this);
-    appSettings->loadWindowSizeAndPos(this);
+    GUI::WidgetSettings::load(this);
 }
 
-
 PythonScriptWidget::~PythonScriptWidget()
 {
-    appSettings->saveWindowSizeAndPos(this);
+    GUI::WidgetSettings::save(this);
 }
 
 void PythonScriptWidget::generatePythonScript(const SampleItem* sampleItem,
@@ -119,8 +119,7 @@ void PythonScriptWidget::onExportToFileButton()
 
     QString fname = QFileDialog::getSaveFileName(
         nullptr, "Save file", defaultName, filters, &defaultFilter,
-        appSettings->useNativeFileDialog() ? QFileDialog::Options()
-                                           : QFileDialog::DontUseNativeDialog);
+        gApp->useNativeFileDialog() ? QFileDialog::Options() : QFileDialog::DontUseNativeDialog);
 
     if (fname.isEmpty())
         return;
diff --git a/GUI/View/Main/ActionManager.cpp b/GUI/View/Main/ActionManager.cpp
index f49d31a3ab8b9094bef60589da35097d3a39d331..0e0b41c7ca0706594dddf77918e90e8c5711707f 100644
--- a/GUI/View/Main/ActionManager.cpp
+++ b/GUI/View/Main/ActionManager.cpp
@@ -17,7 +17,7 @@
 #include "Base/Util/SysUtil.h"
 #include "GUI/Model/Project/ProjectDocument.h"
 #include "GUI/Support/Util/Path.h"
-#include "GUI/View/Layout/ApplicationSettings.h"
+#include "GUI/View/Layout/AppConfig.h"
 #include "GUI/View/Layout/mainwindow_constants.h"
 #include "GUI/View/Main/AboutDialog.h"
 #include "GUI/View/Manager/ProjectManager.h"
diff --git a/GUI/View/Main/MainWindow.cpp b/GUI/View/Main/MainWindow.cpp
index b49e36213f606bdc292c97f427bc6ccf8b091f35..b5f2b2a2f30127afda6ec095201f3458b0392698 100644
--- a/GUI/View/Main/MainWindow.cpp
+++ b/GUI/View/Main/MainWindow.cpp
@@ -15,9 +15,8 @@
 #include "GUI/View/Main/MainWindow.h"
 #include "GUI/Model/Job/JobsSet.h"
 #include "GUI/Model/Project/ProjectDocument.h"
-#include "GUI/Support/Data/Dirs.h"
 #include "GUI/Support/Util/Path.h"
-#include "GUI/View/Layout/ApplicationSettings.h"
+#include "GUI/View/Layout/AppConfig.h"
 #include "GUI/View/Layout/mainwindow_constants.h"
 #include "GUI/View/Main/ActionManager.h"
 #include "GUI/View/Main/CentralWidget.h"
@@ -40,7 +39,7 @@ MainWindow::MainWindow()
     setCentralWidget(m_central_widget);
 
     initApplication();
-    readSettings();
+    loadSettings();
 
     connect(m_project_manager, &ProjectManager::documentOpenedOrClosed, this,
             &MainWindow::onDocumentOpenedOrClosed);
@@ -78,7 +77,7 @@ void MainWindow::closeEvent(QCloseEvent* event)
         return;
     }
     if (m_project_manager->saveOnQuit()) {
-        writeSettings();
+        saveSettings();
         event->accept();
     } else {
         event->ignore();
@@ -105,25 +104,25 @@ void MainWindow::initApplication()
     setCorner(Qt::BottomRightCorner, Qt::BottomDockWidgetArea);
 }
 
-void MainWindow::readSettings()
+void MainWindow::loadSettings()
 {
     QSettings s;
     s.beginGroup(GUI::Style::S_MAIN_WINDOW);
     resize(s.value(GUI::Style::S_WINDOW_SIZE, QSize(1000, 600)).toSize());
     move(s.value(GUI::Style::S_WINDOW_POSITION, QPoint(500, 300)).toPoint());
     s.endGroup();
-    m_project_manager->readSettings();
+    m_project_manager->loadSettings();
 }
 
-void MainWindow::writeSettings()
+void MainWindow::saveSettings()
 {
     QSettings s;
     s.beginGroup(GUI::Style::S_MAIN_WINDOW);
     s.setValue(GUI::Style::S_WINDOW_SIZE, size());
     s.setValue(GUI::Style::S_WINDOW_POSITION, pos());
     s.endGroup();
-    m_project_manager->writeSettings();
-    gDirs->writeSettings();
+    m_project_manager->saveSettings();
+    gApp->saveSettings();
     s.sync();
 }
 
diff --git a/GUI/View/Main/MainWindow.h b/GUI/View/Main/MainWindow.h
index 5097970b4fc1192bdd84bef629f22c34226e02df..d534e0dd4a1a3b95b930487771ad020b20d7bdf8 100644
--- a/GUI/View/Main/MainWindow.h
+++ b/GUI/View/Main/MainWindow.h
@@ -38,8 +38,8 @@ private:
     void closeEvent(QCloseEvent* event) override;
     void initApplication();
 
-    void readSettings();
-    void writeSettings();
+    void loadSettings();
+    void saveSettings();
 
     //! Recalculate the size of the view selection buttons to show complete button text
     void onDocumentOpenedOrClosed(bool open);
diff --git a/GUI/View/Manager/NewProjectDialog.cpp b/GUI/View/Manager/NewProjectDialog.cpp
index aa6c0225f871387823af4be30f3b7147f51f04e1..0dbd8eca22f8f811cb92843e16f6173110c829d6 100644
--- a/GUI/View/Manager/NewProjectDialog.cpp
+++ b/GUI/View/Manager/NewProjectDialog.cpp
@@ -15,7 +15,7 @@
 #include "GUI/View/Manager/NewProjectDialog.h"
 #include "GUI/Model/Project/ProjectDocument.h"
 #include "GUI/Model/Project/ProjectUtil.h"
-#include "GUI/View/Layout/ApplicationSettings.h"
+#include "GUI/View/Layout/AppConfig.h"
 #include <QFileDialog>
 #include <QGroupBox>
 #include <QPushButton>
@@ -109,7 +109,7 @@ void NewProjectDialog::onBrowseDirectory()
 {
     QFileDialog::Options options = QFileDialog::DontResolveSymlinks | QFileDialog::ShowDirsOnly;
 
-    if (!appSettings->useNativeFileDialog())
+    if (!gApp->useNativeFileDialog())
         options |= QFileDialog::DontUseNativeDialog;
 
     const QString dirname =
diff --git a/GUI/View/Manager/ProjectManager.cpp b/GUI/View/Manager/ProjectManager.cpp
index 41932cdbdc4464e2d0b990b91e3dcc25284bed87..418f92f95ff6065746fdcbbb8d13ff414f815380 100644
--- a/GUI/View/Manager/ProjectManager.cpp
+++ b/GUI/View/Manager/ProjectManager.cpp
@@ -18,7 +18,7 @@
 #include "GUI/Model/Project/ProjectDocument.h"
 #include "GUI/Model/Project/ProjectUtil.h"
 #include "GUI/View/Info/MessageBox.h"
-#include "GUI/View/Layout/ApplicationSettings.h"
+#include "GUI/View/Layout/AppConfig.h"
 #include "GUI/View/Manager/NewProjectDialog.h"
 #include "GUI/View/Tool/Globals.h"
 #include <QApplication>
@@ -26,7 +26,6 @@
 #include <QFileDialog>
 #include <QMessageBox>
 #include <QSettings>
-#include <memory>
 
 namespace {
 
@@ -48,7 +47,7 @@ ProjectManager::~ProjectManager() = default;
 
 //! Reads settings of ProjectManager from global settings.
 
-void ProjectManager::readSettings()
+void ProjectManager::loadSettings()
 {
     QSettings s;
     m_working_directory = QDir::homePath();
@@ -65,7 +64,7 @@ void ProjectManager::readSettings()
 
 //! Saves settings of ProjectManager in global settings.
 
-void ProjectManager::writeSettings()
+void ProjectManager::saveSettings()
 {
     QSettings s;
     s.beginGroup(S_PROJECTMANAGER);
@@ -203,8 +202,8 @@ void ProjectManager::openProject(QString projectPullPath)
         projectPullPath = QFileDialog::getOpenFileName(
             GUI::Global::mainWindow, "Open project file", m_working_directory,
             "BornAgain project Files (*" + ext + ")", nullptr,
-            appSettings->useNativeFileDialog() ? QFileDialog::Options()
-                                               : QFileDialog::DontUseNativeDialog);
+            gApp->useNativeFileDialog() ? QFileDialog::Options()
+                                        : QFileDialog::DontUseNativeDialog);
         if (projectPullPath.isEmpty())
             return;
     }
diff --git a/GUI/View/Manager/ProjectManager.h b/GUI/View/Manager/ProjectManager.h
index e362f402c47dceb9b1b3d94f052ee5b0add61744..becffeb113d2f8377256bf55978391cd9202e7a1 100644
--- a/GUI/View/Manager/ProjectManager.h
+++ b/GUI/View/Manager/ProjectManager.h
@@ -17,6 +17,7 @@
 
 #include <QObject>
 #include <QStringList>
+#include <memory>
 
 class AutosaveController;
 
@@ -28,8 +29,8 @@ public:
     ProjectManager(QObject* parent);
     ~ProjectManager() override;
 
-    void readSettings();
-    void writeSettings();
+    void loadSettings();
+    void saveSettings();
 
     bool saveOnQuit();
 
diff --git a/GUI/View/Manager/PyImportAssistant.cpp b/GUI/View/Manager/PyImportAssistant.cpp
index 54ab7632b4dac9084c5fec856735d6a706c05783..2143a44edd0c7b6a39b10aba703209363058ab0e 100644
--- a/GUI/View/Manager/PyImportAssistant.cpp
+++ b/GUI/View/Manager/PyImportAssistant.cpp
@@ -21,13 +21,12 @@
 #include "GUI/Model/FromCore/ItemizeSample.h"
 #include "GUI/Model/FromCore/ItemizeSimulation.h"
 #include "GUI/Model/Project/ProjectUtil.h"
-#include "GUI/Support/Data/Dirs.h"
 #include "GUI/Support/Util/Path.h"
 #include "GUI/Support/Util/String.h"
 #include "GUI/View/Info/ComboSelectorDialog.h"
 #include "GUI/View/Info/DetailedMessageBox.h"
 #include "GUI/View/Info/MessageBox.h"
-#include "GUI/View/Layout/ApplicationSettings.h"
+#include "GUI/View/Layout/AppConfig.h"
 #include "GUI/View/Tool/Globals.h"
 #include "PyCore/Embed/PyInterpreter.h"     // listOfFunctions
 #include "PyCore/Sample/ImportMultiLayer.h" // createMultiLayerFromPython
@@ -70,10 +69,9 @@ QString getCandidate(const QStringList& funcNames)
 QString fnameToOpen()
 {
     QString result = QFileDialog::getOpenFileName(
-        GUI::Global::mainWindow, "Open python script", gDirs->script_import_dir,
+        GUI::Global::mainWindow, "Open python script", gApp->script_import_dir,
         "Python scripts (*.py)", nullptr,
-        appSettings->useNativeFileDialog() ? QFileDialog::Options()
-                                           : QFileDialog::DontUseNativeDialog);
+        gApp->useNativeFileDialog() ? QFileDialog::Options() : QFileDialog::DontUseNativeDialog);
 
     return result;
 }
diff --git a/GUI/View/Material/MaterialEditorDialog.cpp b/GUI/View/Material/MaterialEditorDialog.cpp
index 6a67fcaa214026381b1b6bc4c278512eeac42e1d..621a26f5bb896dec9169014d215bde52d2beda37 100644
--- a/GUI/View/Material/MaterialEditorDialog.cpp
+++ b/GUI/View/Material/MaterialEditorDialog.cpp
@@ -18,11 +18,11 @@
 #include "GUI/Model/Sample/ItemWithMaterial.h"
 #include "GUI/Model/Sample/SampleItem.h"
 #include "GUI/Support/Style/Style.h"
-#include "GUI/View/Layout/ApplicationSettings.h"
 #include "GUI/View/Material/MaterialsQModel.h"
 #include "GUI/View/Numeric/DoubleSpinBox.h"
 #include "GUI/View/Setup/FrameActions.h"
 #include "GUI/View/Widget/StyledToolbar.h"
+#include "GUI/View/Widget/WidgetSettings.h"
 #include <QAction>
 #include <QColorDialog>
 #include <QDialog>
@@ -235,7 +235,7 @@ MaterialEditorDialog::MaterialEditorDialog(SampleItem* sample, const QString& id
     layout->insertWidget(0, toolbar);
 
     GUI::Style::setResizable(this);
-    appSettings->loadWindowSizeAndPos(this);
+    GUI::WidgetSettings::load(this);
 
     connect(m_tree_view->selectionModel(), &QItemSelectionModel::currentChanged, this,
             &MaterialEditorDialog::onChangeCurrent);
@@ -260,7 +260,7 @@ MaterialEditorDialog::MaterialEditorDialog(SampleItem* sample, const QString& id
 
 MaterialEditorDialog::~MaterialEditorDialog()
 {
-    appSettings->saveWindowSizeAndPos(this);
+    GUI::WidgetSettings::save(this);
 }
 
 void MaterialEditorDialog::addRefractiveMaterial()
diff --git a/GUI/View/Realspace/RealspaceWidget.cpp b/GUI/View/Realspace/RealspaceWidget.cpp
index 9dc711e71a70aa8d025967b23df53423fb1974ca..5461c6a6f5eff4c03a06a58f8e55116d5b9b3ce2 100644
--- a/GUI/View/Realspace/RealspaceWidget.cpp
+++ b/GUI/View/Realspace/RealspaceWidget.cpp
@@ -16,9 +16,8 @@
 #include "Base/Util/Assert.h"
 #include "GUI/Model/Material/MaterialItem.h"
 #include "GUI/Model/Sample/SampleItem.h"
-#include "GUI/Support/Data/Dirs.h"
 #include "GUI/View/Info/CautionSign.h"
-#include "GUI/View/Layout/ApplicationSettings.h"
+#include "GUI/View/Layout/AppConfig.h"
 #include "GUI/View/Realspace/RealspaceBuilder.h"
 #include "GUI/View/Widget/FileDialog.h"
 #include "Img3D/Model/Model.h"
@@ -79,7 +78,7 @@ void RealspaceWidget::showEvent(QShowEvent*)
 void RealspaceWidget::savePicture()
 {
     static const QString defaultExtension = ".png";
-    QString fname = GUI::FileDialog::w1_1f("Save 3D real space view", gDirs->artifact_export_dir,
+    QString fname = GUI::FileDialog::w1_1f("Save 3D real space view", gApp->artifact_export_dir,
                                            "*" + defaultExtension);
     if (fname.isEmpty())
         return;
diff --git a/GUI/View/Sample/SampleForm.cpp b/GUI/View/Sample/SampleForm.cpp
index 6dfe6e3de770e8fee681cfad9a06a995ed927992..dc8b853517cb0e9f010e86be111c12b75044f1e2 100644
--- a/GUI/View/Sample/SampleForm.cpp
+++ b/GUI/View/Sample/SampleForm.cpp
@@ -16,7 +16,7 @@
 #include "Base/Util/Vec.h"
 #include "GUI/Model/Project/ProjectDocument.h"
 #include "GUI/Model/Sample/SamplesSet.h"
-#include "GUI/View/Layout/ApplicationSettings.h"
+#include "GUI/View/Layout/AppConfig.h"
 #include "GUI/View/Layout/LayoutUtil.h"
 #include "GUI/View/Sample/CompoundForm.h"
 #include "GUI/View/Sample/CoreAndShellForm.h"
diff --git a/GUI/View/Views/InstrumentView.cpp b/GUI/View/Views/InstrumentView.cpp
index 2979c881e92674871e2bccab3c681e5b1ea586c3..903337a8efe4d4e61591301d2168b90f43934114 100644
--- a/GUI/View/Views/InstrumentView.cpp
+++ b/GUI/View/Views/InstrumentView.cpp
@@ -21,7 +21,7 @@
 #include "GUI/View/Instrument/OffspecInstrumentEditor.h"
 #include "GUI/View/Instrument/Scatter2DInstrumentEditor.h"
 #include "GUI/View/Instrument/SpecularInstrumentEditor.h"
-#include "GUI/View/Layout/ApplicationSettings.h"
+#include "GUI/View/Layout/AppConfig.h"
 #include "GUI/View/Loader/ComponentRW.h"
 #include "GUI/View/Modelview/SetView.h"
 #include "GUI/View/Setup/FrameActions.h"
diff --git a/GUI/View/Widget/WidgetSettings.cpp b/GUI/View/Widget/WidgetSettings.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..915cd401b44f70d395f8507f12b00b59190751b4
--- /dev/null
+++ b/GUI/View/Widget/WidgetSettings.cpp
@@ -0,0 +1,44 @@
+//  ************************************************************************************************
+//
+//  BornAgain: simulate and fit reflection and scattering
+//
+//! @file      GUI/View/Widget/WidgetSettings.cpp
+//! @brief     Implements namespace WidgetSettings
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2021
+//! @authors   Scientific Computing Group at MLZ (see CITATION, AUTHORS)
+//
+//  ************************************************************************************************
+
+#include "GUI/View/Widget/WidgetSettings.h"
+#include "Base/Util/Assert.h"
+#include <QSettings>
+
+namespace {
+
+const QString S_SIZE = "Size";
+const QString S_POS = "Pos";
+
+} // namespace
+
+void GUI::WidgetSettings::save(const QWidget* w)
+{
+    ASSERT(!w->objectName().isEmpty());
+    QSettings settings;
+    settings.setValue(S_SIZE + "/" + w->objectName(), w->size());
+    settings.setValue(S_POS + "/" + w->objectName(), w->pos());
+}
+
+void GUI::WidgetSettings::load(QWidget* w)
+{
+    ASSERT(!w->objectName().isEmpty());
+
+    QSettings settings;
+    const QSize size = settings.value(S_SIZE + "/" + w->objectName(), QSize()).toSize();
+    if (size.isValid())
+        w->resize(size);
+    if (settings.contains(S_POS + "/" + w->objectName()))
+        w->move(settings.value(S_POS + "/" + w->objectName()).toPoint());
+}
diff --git a/GUI/View/Widget/WidgetSettings.h b/GUI/View/Widget/WidgetSettings.h
new file mode 100644
index 0000000000000000000000000000000000000000..274885ec0174e16a62a7336f0bdfa52ec5b9415e
--- /dev/null
+++ b/GUI/View/Widget/WidgetSettings.h
@@ -0,0 +1,27 @@
+//  ************************************************************************************************
+//
+//  BornAgain: simulate and fit reflection and scattering
+//
+//! @file      GUI/View/Widget/WidgetSettings.h
+//! @brief     Defines namespace WidgetSettings
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2021
+//! @authors   Scientific Computing Group at MLZ (see CITATION, AUTHORS)
+//
+//  ************************************************************************************************
+
+#ifndef BORNAGAIN_GUI_VIEW_WIDGET_WIDGETSETTINGS_H
+#define BORNAGAIN_GUI_VIEW_WIDGET_WIDGETSETTINGS_H
+
+#include <QWidget>
+
+namespace GUI::WidgetSettings {
+
+void save(const QWidget* w);
+void load(QWidget* w);
+
+} // namespace GUI::WidgetSettings
+
+#endif // BORNAGAIN_GUI_VIEW_WIDGET_WIDGETSETTINGS_H