From 753d385473210c08fbaee9fdaccee58610c784f0 Mon Sep 17 00:00:00 2001
From: Jeff Young <jeff@rokeby.ie>
Date: Sun, 8 Dec 2024 21:46:47 +0000
Subject: [PATCH] Reduce dependency on dynamic_cast.

Also switches to checking __clang__ instead of __WXMAC__.
---
 3d-viewer/3d_canvas/board_adapter.cpp         | 12 +---
 3d-viewer/3d_canvas/eda_3d_canvas.cpp         |  2 +-
 3d-viewer/3d_viewer/eda_3d_viewer_frame.cpp   |  7 ++-
 .../dialogs/panel_3D_display_options.cpp      |  6 +-
 3d-viewer/dialogs/panel_3D_opengl_options.cpp |  6 +-
 .../dialogs/panel_3D_raytracing_options.cpp   |  8 +--
 3d-viewer/dialogs/panel_preview_3d_model.cpp  |  3 +-
 common/design_block_lib_table.cpp             |  2 +-
 .../dialogs/panel_design_block_lib_table.cpp  |  6 +-
 common/dialogs/panel_packages_and_updates.cpp | 24 ++++----
 common/fp_lib_table.cpp                       |  2 +-
 .../dialogs/dialog_lib_edit_pin_table.cpp     |  3 +-
 .../dialogs/dialog_lib_symbol_properties.cpp  |  5 +-
 .../panel_eeschema_annotation_options.cpp     |  4 +-
 .../dialogs/panel_eeschema_color_settings.cpp |  9 +--
 .../panel_eeschema_display_options.cpp        |  4 +-
 .../panel_eeschema_editing_options.cpp        |  4 +-
 .../dialogs/panel_simulator_preferences.cpp   | 13 +++--
 eeschema/dialogs/panel_sym_color_settings.cpp |  4 +-
 .../dialogs/panel_sym_display_options.cpp     |  4 +-
 .../dialogs/panel_sym_editing_options.cpp     | 24 ++++----
 eeschema/dialogs/panel_sym_lib_table.cpp      |  9 ++-
 .../dialogs/panel_template_fieldnames.cpp     |  6 +-
 eeschema/eeschema.cpp                         |  8 +--
 eeschema/eeschema_settings.cpp                |  7 ++-
 eeschema/pin_layout_cache.cpp                 |  3 +-
 eeschema/sch_base_frame.cpp                   |  4 +-
 eeschema/sch_edit_frame.cpp                   |  3 +-
 eeschema/sch_item.cpp                         |  3 +-
 eeschema/sch_pin.cpp                          | 12 ++--
 eeschema/schematic_settings.cpp               | 35 +++++-------
 eeschema/symbol_editor/symbol_edit_frame.cpp  | 20 ++-----
 eeschema/symbol_lib_table.cpp                 |  2 +-
 eeschema/symbol_viewer_frame.cpp              |  9 ++-
 eeschema/tools/sch_edit_tool.cpp              |  3 +-
 eeschema/tools/sch_move_tool.cpp              | 13 +----
 .../tools/symbol_editor_drawing_tools.cpp     | 23 ++++----
 eeschema/tools/symbol_editor_pin_tool.cpp     | 33 ++++++-----
 .../widgets/design_block_preview_widget.cpp   |  5 +-
 .../widgets/panel_design_block_chooser.cpp    |  2 +-
 eeschema/widgets/panel_symbol_chooser.cpp     |  8 ++-
 eeschema/widgets/symbol_preview_widget.cpp    |  5 +-
 .../dialogs/panel_gerbview_color_settings.cpp |  9 +--
 .../panel_gerbview_display_options.cpp        |  9 ++-
 .../panel_gerbview_excellon_settings.cpp      | 21 ++++---
 gerbview/gerbview.cpp                         |  2 +-
 gerbview/gerbview_frame.cpp                   |  6 +-
 gerbview/gerbview_painter.cpp                 |  2 +-
 include/settings/settings_manager.h           | 49 ++++-------------
 kicad/dialogs/dialog_update_check_prompt.cpp  |  2 +-
 kicad/pcm/dialogs/dialog_pcm.cpp              |  4 +-
 kicad/pcm/dialogs/panel_packages_view.cpp     |  6 +-
 kicad/tools/kicad_manager_control.cpp         |  6 +-
 kicad/update_manager.cpp                      |  7 ++-
 .../panel_pl_editor_color_settings.cpp        | 14 +++--
 pagelayout_editor/pl_draw_panel_gal.cpp       |  7 ++-
 pagelayout_editor/pl_editor.cpp               |  4 +-
 pagelayout_editor/pl_editor_frame.cpp         |  6 +-
 pcbnew/dialogs/dialog_export_2581.cpp         |  6 +-
 pcbnew/dialogs/dialog_export_odbpp.cpp        |  6 +-
 pcbnew/dialogs/dialog_footprint_chooser.cpp   |  3 +-
 .../dialogs/dialog_footprint_wizard_list.cpp  | 15 ++---
 pcbnew/dialogs/dialog_plot.cpp                |  2 +-
 pcbnew/dialogs/panel_edit_options.cpp         |  8 +--
 .../panel_fp_editor_color_settings.cpp        | 13 +++--
 pcbnew/dialogs/panel_fp_editor_defaults.cpp   |  4 +-
 pcbnew/dialogs/panel_fp_lib_table.cpp         |  9 ++-
 .../dialogs/panel_fp_properties_3d_model.cpp  |  3 +-
 pcbnew/dialogs/panel_pcb_display_options.cpp  |  5 +-
 .../dialogs/panel_pcbnew_color_settings.cpp   | 17 +++---
 pcbnew/footprint_chooser_frame.cpp            |  4 +-
 pcbnew/footprint_edit_frame.cpp               | 16 ++++--
 pcbnew/footprint_viewer_frame.cpp             | 11 ++--
 pcbnew/pcbnew.cpp                             | 55 +++++++++----------
 pcbnew/pcbnew_jobs_handler.cpp                |  7 +--
 pcbnew/pcbnew_printout.cpp                    | 11 +++-
 pcbnew/pcbnew_settings.cpp                    |  9 +--
 .../scripting/pcbnew_action_plugins.cpp       |  6 +-
 pcbnew/sel_layer.cpp                          |  4 +-
 pcbnew/tools/drawing_tool.cpp                 |  8 +--
 pcbnew/tools/pcb_editor_conditions.cpp        |  4 +-
 pcbnew/tools/pcb_tool_base.cpp                |  4 +-
 pcbnew/tools/pcb_viewer_tools.cpp             |  4 +-
 pcbnew/tools/position_relative_tool.cpp       |  4 +-
 qa/qa_utils/pcb_test_frame.cpp                |  8 +--
 85 files changed, 394 insertions(+), 371 deletions(-)

diff --git a/3d-viewer/3d_canvas/board_adapter.cpp b/3d-viewer/3d_canvas/board_adapter.cpp
index 42e3d9507a..4e0c5ddffa 100644
--- a/3d-viewer/3d_canvas/board_adapter.cpp
+++ b/3d-viewer/3d_canvas/board_adapter.cpp
@@ -227,16 +227,8 @@ void BOARD_ADAPTER::ReloadColorSettings() noexcept
 {
     wxCHECK( PgmOrNull(), /* void */ );
 
-    PCBNEW_SETTINGS* cfg = nullptr;
-
-    try
-    {
-        cfg = Pgm().GetSettingsManager().GetAppSettings<PCBNEW_SETTINGS>( "pcbnew" );
-    }
-    catch( const std::runtime_error& e )
-    {
-        wxFAIL_MSG( e.what() );
-    }
+    SETTINGS_MANAGER& mgr = Pgm().GetSettingsManager();
+    PCBNEW_SETTINGS*  cfg = mgr.GetAppSettings<PCBNEW_SETTINGS>( "pcbnew" );
 
     if( cfg )
     {
diff --git a/3d-viewer/3d_canvas/eda_3d_canvas.cpp b/3d-viewer/3d_canvas/eda_3d_canvas.cpp
index 81b2a0064b..edfe5af80e 100644
--- a/3d-viewer/3d_canvas/eda_3d_canvas.cpp
+++ b/3d-viewer/3d_canvas/eda_3d_canvas.cpp
@@ -1093,7 +1093,7 @@ bool EDA_3D_CANVAS::SetView3D( VIEW3D_TYPE aRequestedView )
 void EDA_3D_CANVAS::RenderEngineChanged()
 {
     SETTINGS_MANAGER&       mgr = Pgm().GetSettingsManager();
-    EDA_3D_VIEWER_SETTINGS* cfg = mgr.GetAppSettings<EDA_3D_VIEWER_SETTINGS>();
+    EDA_3D_VIEWER_SETTINGS* cfg = mgr.GetAppSettings<EDA_3D_VIEWER_SETTINGS>( "3d_viewer" );
 
     switch( cfg->m_Render.engine )
     {
diff --git a/3d-viewer/3d_viewer/eda_3d_viewer_frame.cpp b/3d-viewer/3d_viewer/eda_3d_viewer_frame.cpp
index d3f8a12529..463fb9209f 100644
--- a/3d-viewer/3d_viewer/eda_3d_viewer_frame.cpp
+++ b/3d-viewer/3d_viewer/eda_3d_viewer_frame.cpp
@@ -480,7 +480,9 @@ void EDA_3D_VIEWER_FRAME::Process_Special_Functions( wxCommandEvent &event )
 
     case ID_MENU3D_RESET_DEFAULTS:
     {
-        auto cfg = Pgm().GetSettingsManager().GetAppSettings<EDA_3D_VIEWER_SETTINGS>( "3d_viewer" );
+        SETTINGS_MANAGER&       mgr = Pgm().GetSettingsManager();
+        EDA_3D_VIEWER_SETTINGS* cfg = mgr.GetAppSettings<EDA_3D_VIEWER_SETTINGS>( "3d_viewer" );
+
         cfg->ResetToDefaults();
         LoadSettings( cfg );
 
@@ -607,7 +609,8 @@ void EDA_3D_VIEWER_FRAME::LoadSettings( APP_SETTINGS_BASE *aCfg )
 
 void EDA_3D_VIEWER_FRAME::SaveSettings( APP_SETTINGS_BASE *aCfg )
 {
-    auto cfg = Pgm().GetSettingsManager().GetAppSettings<EDA_3D_VIEWER_SETTINGS>( "3d_viewer" );
+    SETTINGS_MANAGER&       mgr = Pgm().GetSettingsManager();
+    EDA_3D_VIEWER_SETTINGS* cfg = mgr.GetAppSettings<EDA_3D_VIEWER_SETTINGS>( "3d_viewer" );
 
     EDA_BASE_FRAME::SaveSettings( cfg );
 
diff --git a/3d-viewer/dialogs/panel_3D_display_options.cpp b/3d-viewer/dialogs/panel_3D_display_options.cpp
index b6b14cee8c..95e3e6ec48 100644
--- a/3d-viewer/dialogs/panel_3D_display_options.cpp
+++ b/3d-viewer/dialogs/panel_3D_display_options.cpp
@@ -64,7 +64,8 @@ void PANEL_3D_DISPLAY_OPTIONS::loadViewSettings( EDA_3D_VIEWER_SETTINGS* aCfg )
 
 bool PANEL_3D_DISPLAY_OPTIONS::TransferDataToWindow()
 {
-    EDA_3D_VIEWER_SETTINGS* cfg = Pgm().GetSettingsManager().GetAppSettings<EDA_3D_VIEWER_SETTINGS>();
+    SETTINGS_MANAGER&       mgr = Pgm().GetSettingsManager();
+    EDA_3D_VIEWER_SETTINGS* cfg = mgr.GetAppSettings<EDA_3D_VIEWER_SETTINGS>( "3d_viewer" );
 
     loadViewSettings( cfg );
 
@@ -74,7 +75,8 @@ bool PANEL_3D_DISPLAY_OPTIONS::TransferDataToWindow()
 
 bool PANEL_3D_DISPLAY_OPTIONS::TransferDataFromWindow()
 {
-    EDA_3D_VIEWER_SETTINGS* cfg = Pgm().GetSettingsManager().GetAppSettings<EDA_3D_VIEWER_SETTINGS>();
+    SETTINGS_MANAGER&       mgr = Pgm().GetSettingsManager();
+    EDA_3D_VIEWER_SETTINGS* cfg = mgr.GetAppSettings<EDA_3D_VIEWER_SETTINGS>( "3d_viewer" );
 
     // Set visibility of items
     cfg->m_Render.show_zones = m_checkBoxAreas->GetValue();
diff --git a/3d-viewer/dialogs/panel_3D_opengl_options.cpp b/3d-viewer/dialogs/panel_3D_opengl_options.cpp
index c6537319d1..c6f00282e1 100644
--- a/3d-viewer/dialogs/panel_3D_opengl_options.cpp
+++ b/3d-viewer/dialogs/panel_3D_opengl_options.cpp
@@ -56,7 +56,8 @@ void PANEL_3D_OPENGL_OPTIONS::loadSettings( EDA_3D_VIEWER_SETTINGS* aCfg )
 
 bool PANEL_3D_OPENGL_OPTIONS::TransferDataToWindow()
 {
-    EDA_3D_VIEWER_SETTINGS* cfg = Pgm().GetSettingsManager().GetAppSettings<EDA_3D_VIEWER_SETTINGS>();
+    SETTINGS_MANAGER&       mgr = Pgm().GetSettingsManager();
+    EDA_3D_VIEWER_SETTINGS* cfg = mgr.GetAppSettings<EDA_3D_VIEWER_SETTINGS>( "3d_viewer" );
 
     loadSettings( cfg );
 
@@ -66,7 +67,8 @@ bool PANEL_3D_OPENGL_OPTIONS::TransferDataToWindow()
 
 bool PANEL_3D_OPENGL_OPTIONS::TransferDataFromWindow()
 {
-    EDA_3D_VIEWER_SETTINGS* cfg = Pgm().GetSettingsManager().GetAppSettings<EDA_3D_VIEWER_SETTINGS>();
+    SETTINGS_MANAGER&       mgr = Pgm().GetSettingsManager();
+    EDA_3D_VIEWER_SETTINGS* cfg = mgr.GetAppSettings<EDA_3D_VIEWER_SETTINGS>( "3d_viewer" );
 
     cfg->m_Render.opengl_copper_thickness = m_checkBoxCuThickness->GetValue();
     cfg->m_Render.show_model_bbox = m_checkBoxBoundingBoxes->GetValue();
diff --git a/3d-viewer/dialogs/panel_3D_raytracing_options.cpp b/3d-viewer/dialogs/panel_3D_raytracing_options.cpp
index 51257fb9f2..4add9e0cc9 100644
--- a/3d-viewer/dialogs/panel_3D_raytracing_options.cpp
+++ b/3d-viewer/dialogs/panel_3D_raytracing_options.cpp
@@ -110,8 +110,8 @@ void PANEL_3D_RAYTRACING_OPTIONS::loadSettings( EDA_3D_VIEWER_SETTINGS* aCfg )
 
 bool PANEL_3D_RAYTRACING_OPTIONS::TransferDataToWindow()
 {
-    SETTINGS_MANAGER& mgr = Pgm().GetSettingsManager();
-    EDA_3D_VIEWER_SETTINGS* cfg = mgr.GetAppSettings<EDA_3D_VIEWER_SETTINGS>();
+    SETTINGS_MANAGER&       mgr = Pgm().GetSettingsManager();
+    EDA_3D_VIEWER_SETTINGS* cfg = mgr.GetAppSettings<EDA_3D_VIEWER_SETTINGS>( "3d_viewer" );
 
     loadSettings( cfg );
 
@@ -121,8 +121,8 @@ bool PANEL_3D_RAYTRACING_OPTIONS::TransferDataToWindow()
 
 bool PANEL_3D_RAYTRACING_OPTIONS::TransferDataFromWindow()
 {
-    SETTINGS_MANAGER& mgr = Pgm().GetSettingsManager();
-    EDA_3D_VIEWER_SETTINGS* cfg = mgr.GetAppSettings<EDA_3D_VIEWER_SETTINGS>();
+    SETTINGS_MANAGER&       mgr = Pgm().GetSettingsManager();
+    EDA_3D_VIEWER_SETTINGS* cfg = mgr.GetAppSettings<EDA_3D_VIEWER_SETTINGS>( "3d_viewer" );
 
     cfg->m_Render.raytrace_shadows = m_cbRaytracing_renderShadows->GetValue();
     cfg->m_Render.raytrace_backfloor = m_cbRaytracing_addFloor->GetValue();
diff --git a/3d-viewer/dialogs/panel_preview_3d_model.cpp b/3d-viewer/dialogs/panel_preview_3d_model.cpp
index b0a4c07a03..cc019b162a 100644
--- a/3d-viewer/dialogs/panel_preview_3d_model.cpp
+++ b/3d-viewer/dialogs/panel_preview_3d_model.cpp
@@ -204,7 +204,8 @@ void PANEL_PREVIEW_3D_MODEL::loadSettings()
     // TODO(JE) use all control options
     m_boardAdapter.m_MousewheelPanning = settings->m_Input.scroll_modifier_zoom != 0;
 
-    auto* cfg = Pgm().GetSettingsManager().GetAppSettings<EDA_3D_VIEWER_SETTINGS>( "3d_viewer" );
+    SETTINGS_MANAGER&       mgr = Pgm().GetSettingsManager();
+    EDA_3D_VIEWER_SETTINGS* cfg = mgr.GetAppSettings<EDA_3D_VIEWER_SETTINGS>( "3d_viewer" );
 
     if( cfg )
     {
diff --git a/common/design_block_lib_table.cpp b/common/design_block_lib_table.cpp
index 8e34fdfb2a..b180ef36d9 100644
--- a/common/design_block_lib_table.cpp
+++ b/common/design_block_lib_table.cpp
@@ -627,7 +627,7 @@ bool DESIGN_BLOCK_LIB_TABLE::LoadGlobalTable( DESIGN_BLOCK_LIB_TABLE& aTable )
     aTable.Load( fn.GetFullPath() );
 
     SETTINGS_MANAGER& mgr = Pgm().GetSettingsManager();
-    KICAD_SETTINGS*   settings = mgr.GetAppSettings<KICAD_SETTINGS>();
+    KICAD_SETTINGS*   settings = mgr.GetAppSettings<KICAD_SETTINGS>( "kicad" );
 
     const ENV_VAR_MAP& env = Pgm().GetLocalEnvVariables();
     wxString           packagesPath;
diff --git a/common/dialogs/panel_design_block_lib_table.cpp b/common/dialogs/panel_design_block_lib_table.cpp
index 9512764144..0432781d7d 100644
--- a/common/dialogs/panel_design_block_lib_table.cpp
+++ b/common/dialogs/panel_design_block_lib_table.cpp
@@ -314,7 +314,8 @@ PANEL_DESIGN_BLOCK_LIB_TABLE::PANEL_DESIGN_BLOCK_LIB_TABLE( DIALOG_EDIT_LIBRARY_
         choices.Add( DESIGN_BLOCK_IO_MGR::ShowType( fileType ) );
 
 
-    KICAD_SETTINGS* cfg = Pgm().GetSettingsManager().GetAppSettings<KICAD_SETTINGS>();
+    SETTINGS_MANAGER& mgr = Pgm().GetSettingsManager();
+    KICAD_SETTINGS*   cfg = mgr.GetAppSettings<KICAD_SETTINGS>( "kicad" );
 
     if( cfg->m_lastDesignBlockLibDir.IsEmpty() )
         cfg->m_lastDesignBlockLibDir = PATHS::GetDefaultUserDesignBlocksPath();
@@ -916,7 +917,8 @@ void PANEL_DESIGN_BLOCK_LIB_TABLE::browseLibrariesHandler( wxCommandEvent& event
     }
 
     const IO_BASE::IO_FILE_DESC& fileDesc = m_supportedDesignBlockFiles.at( fileType );
-    KICAD_SETTINGS*              cfg = Pgm().GetSettingsManager().GetAppSettings<KICAD_SETTINGS>();
+    SETTINGS_MANAGER&            mgr = Pgm().GetSettingsManager();
+    KICAD_SETTINGS*              cfg = mgr.GetAppSettings<KICAD_SETTINGS>( "kicad" );
 
     wxString title =
             wxString::Format( _( "Select %s Library" ), DESIGN_BLOCK_IO_MGR::ShowType( fileType ) );
diff --git a/common/dialogs/panel_packages_and_updates.cpp b/common/dialogs/panel_packages_and_updates.cpp
index ba7cc802de..ec817a4c3b 100644
--- a/common/dialogs/panel_packages_and_updates.cpp
+++ b/common/dialogs/panel_packages_and_updates.cpp
@@ -48,13 +48,13 @@ PANEL_PACKAGES_AND_UPDATES::PANEL_PACKAGES_AND_UPDATES( wxWindow* parent ) :
 bool PANEL_PACKAGES_AND_UPDATES::TransferDataToWindow()
 {
     SETTINGS_MANAGER& mgr = Pgm().GetSettingsManager();
-    KICAD_SETTINGS*   settings = mgr.GetAppSettings<KICAD_SETTINGS>();
+    KICAD_SETTINGS*   cfg = mgr.GetAppSettings<KICAD_SETTINGS>( "kicad" );
 
-    m_cbKicadUpdate->SetValue( settings->m_KiCadUpdateCheck );
-    m_cbPcmUpdate->SetValue( settings->m_PcmUpdateCheck );
-    m_libAutoAdd->SetValue( settings->m_PcmLibAutoAdd );
-    m_libAutoRemove->SetValue( settings->m_PcmLibAutoRemove );
-    m_libPrefix->SetValue( settings->m_PcmLibPrefix );
+    m_cbKicadUpdate->SetValue( cfg->m_KiCadUpdateCheck );
+    m_cbPcmUpdate->SetValue( cfg->m_PcmUpdateCheck );
+    m_libAutoAdd->SetValue( cfg->m_PcmLibAutoAdd );
+    m_libAutoRemove->SetValue( cfg->m_PcmLibAutoRemove );
+    m_libPrefix->SetValue( cfg->m_PcmLibPrefix );
 
     return true;
 }
@@ -63,13 +63,13 @@ bool PANEL_PACKAGES_AND_UPDATES::TransferDataToWindow()
 bool PANEL_PACKAGES_AND_UPDATES::TransferDataFromWindow()
 {
     SETTINGS_MANAGER& mgr = Pgm().GetSettingsManager();
-    KICAD_SETTINGS*   settings = mgr.GetAppSettings<KICAD_SETTINGS>();
+    KICAD_SETTINGS*   cfg = mgr.GetAppSettings<KICAD_SETTINGS>( "kicad" );
 
-    settings->m_KiCadUpdateCheck = m_cbKicadUpdate->GetValue();
-    settings->m_PcmUpdateCheck = m_cbPcmUpdate->GetValue();
-    settings->m_PcmLibAutoAdd = m_libAutoAdd->GetValue();
-    settings->m_PcmLibAutoRemove = m_libAutoRemove->GetValue();
-    settings->m_PcmLibPrefix = m_libPrefix->GetValue();
+    cfg->m_KiCadUpdateCheck = m_cbKicadUpdate->GetValue();
+    cfg->m_PcmUpdateCheck = m_cbPcmUpdate->GetValue();
+    cfg->m_PcmLibAutoAdd = m_libAutoAdd->GetValue();
+    cfg->m_PcmLibAutoRemove = m_libAutoRemove->GetValue();
+    cfg->m_PcmLibPrefix = m_libPrefix->GetValue();
 
     return true;
 }
diff --git a/common/fp_lib_table.cpp b/common/fp_lib_table.cpp
index 43adfa10b7..27fd8cee9a 100644
--- a/common/fp_lib_table.cpp
+++ b/common/fp_lib_table.cpp
@@ -622,7 +622,7 @@ bool FP_LIB_TABLE::LoadGlobalTable( FP_LIB_TABLE& aTable )
     aTable.Load( fn.GetFullPath() );
 
     SETTINGS_MANAGER& mgr = Pgm().GetSettingsManager();
-    KICAD_SETTINGS*   settings = mgr.GetAppSettings<KICAD_SETTINGS>();
+    KICAD_SETTINGS*   settings = mgr.GetAppSettings<KICAD_SETTINGS>( "kicad" );
 
     const ENV_VAR_MAP& env = Pgm().GetLocalEnvVariables();
     wxString packagesPath;
diff --git a/eeschema/dialogs/dialog_lib_edit_pin_table.cpp b/eeschema/dialogs/dialog_lib_edit_pin_table.cpp
index ced9f689c4..1d881eeb84 100644
--- a/eeschema/dialogs/dialog_lib_edit_pin_table.cpp
+++ b/eeschema/dialogs/dialog_lib_edit_pin_table.cpp
@@ -328,7 +328,8 @@ public:
 
                     VECTOR2I pos = last->GetPosition();
 
-                    auto* cfg = Pgm().GetSettingsManager().GetAppSettings<SYMBOL_EDITOR_SETTINGS>();
+                    SETTINGS_MANAGER&       mgr = Pgm().GetSettingsManager();
+                    SYMBOL_EDITOR_SETTINGS* cfg = mgr.GetAppSettings<SYMBOL_EDITOR_SETTINGS>( "symbol_editor" );
 
                     if( last->GetOrientation() == PIN_ORIENTATION::PIN_LEFT
                         || last->GetOrientation() == PIN_ORIENTATION::PIN_RIGHT )
diff --git a/eeschema/dialogs/dialog_lib_symbol_properties.cpp b/eeschema/dialogs/dialog_lib_symbol_properties.cpp
index 39f146ca7a..03742e88fd 100644
--- a/eeschema/dialogs/dialog_lib_symbol_properties.cpp
+++ b/eeschema/dialogs/dialog_lib_symbol_properties.cpp
@@ -187,7 +187,10 @@ bool DIALOG_LIB_SYMBOL_PROPERTIES::TransferDataToWindow()
 
     // Add in any template fieldnames not yet defined:
     // Read global fieldname templates
-    if( EESCHEMA_SETTINGS* cfg = Pgm().GetSettingsManager().GetAppSettings<EESCHEMA_SETTINGS>() )
+    SETTINGS_MANAGER&  mgr = Pgm().GetSettingsManager();
+    EESCHEMA_SETTINGS* cfg = mgr.GetAppSettings<EESCHEMA_SETTINGS>( "eeschema" );
+
+    if( cfg )
     {
         TEMPLATES templateMgr;
 
diff --git a/eeschema/dialogs/panel_eeschema_annotation_options.cpp b/eeschema/dialogs/panel_eeschema_annotation_options.cpp
index 9e749e1d51..6c74ec8c8e 100644
--- a/eeschema/dialogs/panel_eeschema_annotation_options.cpp
+++ b/eeschema/dialogs/panel_eeschema_annotation_options.cpp
@@ -80,7 +80,7 @@ void PANEL_EESCHEMA_ANNOTATION_OPTIONS::loadEEschemaSettings( EESCHEMA_SETTINGS*
 bool PANEL_EESCHEMA_ANNOTATION_OPTIONS::TransferDataToWindow()
 {
     SETTINGS_MANAGER&  mgr = Pgm().GetSettingsManager();
-    EESCHEMA_SETTINGS* cfg = mgr.GetAppSettings<EESCHEMA_SETTINGS>();
+    EESCHEMA_SETTINGS* cfg = mgr.GetAppSettings<EESCHEMA_SETTINGS>( "eeschema" );
 
     loadEEschemaSettings( cfg );
 
@@ -91,7 +91,7 @@ bool PANEL_EESCHEMA_ANNOTATION_OPTIONS::TransferDataToWindow()
 bool PANEL_EESCHEMA_ANNOTATION_OPTIONS::TransferDataFromWindow()
 {
     SETTINGS_MANAGER&  mgr = Pgm().GetSettingsManager();
-    EESCHEMA_SETTINGS* cfg = mgr.GetAppSettings<EESCHEMA_SETTINGS>();
+    EESCHEMA_SETTINGS* cfg = mgr.GetAppSettings<EESCHEMA_SETTINGS>( "eeschema" );
 
     cfg->m_AnnotatePanel.automatic = m_checkAutoAnnotate->GetValue();
 
diff --git a/eeschema/dialogs/panel_eeschema_color_settings.cpp b/eeschema/dialogs/panel_eeschema_color_settings.cpp
index dff864fba7..8e7f492350 100644
--- a/eeschema/dialogs/panel_eeschema_color_settings.cpp
+++ b/eeschema/dialogs/panel_eeschema_color_settings.cpp
@@ -69,7 +69,7 @@ PANEL_EESCHEMA_COLOR_SETTINGS::PANEL_EESCHEMA_COLOR_SETTINGS( wxWindow* aParent
 
     SETTINGS_MANAGER&  mgr = Pgm().GetSettingsManager();
     COMMON_SETTINGS*   common_settings = Pgm().GetCommonSettings();
-    EESCHEMA_SETTINGS* app_settings = mgr.GetAppSettings<EESCHEMA_SETTINGS>();
+    EESCHEMA_SETTINGS* app_settings = mgr.GetAppSettings<EESCHEMA_SETTINGS>( "eeschema" );
     COLOR_SETTINGS*    current = mgr.GetColorSettings( app_settings->m_ColorTheme );
 
     // Saved theme doesn't exist?  Reset to default
@@ -122,9 +122,10 @@ bool PANEL_EESCHEMA_COLOR_SETTINGS::TransferDataFromWindow()
     if( !saveCurrentTheme( true ) )
         return false;
 
-    SETTINGS_MANAGER& settingsMgr = Pgm().GetSettingsManager();
-    EESCHEMA_SETTINGS* app_settings = settingsMgr.GetAppSettings<EESCHEMA_SETTINGS>();
-    app_settings->m_ColorTheme = m_currentSettings->GetFilename();
+    SETTINGS_MANAGER&  mgr = Pgm().GetSettingsManager();
+    EESCHEMA_SETTINGS* cfg = mgr.GetAppSettings<EESCHEMA_SETTINGS>( "eeschema" );
+
+    cfg->m_ColorTheme = m_currentSettings->GetFilename();
 
     return true;
 }
diff --git a/eeschema/dialogs/panel_eeschema_display_options.cpp b/eeschema/dialogs/panel_eeschema_display_options.cpp
index 928f2f6cdb..12d102e0eb 100644
--- a/eeschema/dialogs/panel_eeschema_display_options.cpp
+++ b/eeschema/dialogs/panel_eeschema_display_options.cpp
@@ -81,7 +81,7 @@ void PANEL_EESCHEMA_DISPLAY_OPTIONS::loadEEschemaSettings( EESCHEMA_SETTINGS* cf
 bool PANEL_EESCHEMA_DISPLAY_OPTIONS::TransferDataToWindow()
 {
     SETTINGS_MANAGER&  mgr = Pgm().GetSettingsManager();
-    EESCHEMA_SETTINGS* cfg = mgr.GetAppSettings<EESCHEMA_SETTINGS>();
+    EESCHEMA_SETTINGS* cfg = mgr.GetAppSettings<EESCHEMA_SETTINGS>( "eeschema" );
 
     loadEEschemaSettings( cfg );
 
@@ -94,7 +94,7 @@ bool PANEL_EESCHEMA_DISPLAY_OPTIONS::TransferDataToWindow()
 bool PANEL_EESCHEMA_DISPLAY_OPTIONS::TransferDataFromWindow()
 {
     SETTINGS_MANAGER&  mgr = Pgm().GetSettingsManager();
-    EESCHEMA_SETTINGS* cfg = mgr.GetAppSettings<EESCHEMA_SETTINGS>();
+    EESCHEMA_SETTINGS* cfg = mgr.GetAppSettings<EESCHEMA_SETTINGS>( "eeschema" );
 
     cfg->m_Appearance.default_font = m_defaultFontCtrl->GetSelection() <= 0
                                         ? wxString( KICAD_FONT_NAME )   // This is a keyword. Do not translate
diff --git a/eeschema/dialogs/panel_eeschema_editing_options.cpp b/eeschema/dialogs/panel_eeschema_editing_options.cpp
index 39c19231c3..dace090ca9 100644
--- a/eeschema/dialogs/panel_eeschema_editing_options.cpp
+++ b/eeschema/dialogs/panel_eeschema_editing_options.cpp
@@ -93,7 +93,7 @@ void PANEL_EESCHEMA_EDITING_OPTIONS::loadEEschemaSettings( EESCHEMA_SETTINGS* aC
 bool PANEL_EESCHEMA_EDITING_OPTIONS::TransferDataToWindow()
 {
     SETTINGS_MANAGER&  mgr = Pgm().GetSettingsManager();
-    EESCHEMA_SETTINGS* cfg = mgr.GetAppSettings<EESCHEMA_SETTINGS>();
+    EESCHEMA_SETTINGS* cfg = mgr.GetAppSettings<EESCHEMA_SETTINGS>( "eeschema" );
 
     loadEEschemaSettings( cfg );
 
@@ -104,7 +104,7 @@ bool PANEL_EESCHEMA_EDITING_OPTIONS::TransferDataToWindow()
 bool PANEL_EESCHEMA_EDITING_OPTIONS::TransferDataFromWindow()
 {
     SETTINGS_MANAGER&  mgr = Pgm().GetSettingsManager();
-    EESCHEMA_SETTINGS* cfg = mgr.GetAppSettings<EESCHEMA_SETTINGS>();
+    EESCHEMA_SETTINGS* cfg = mgr.GetAppSettings<EESCHEMA_SETTINGS>( "eeschema" );
 
     cfg->m_Drawing.default_sheet_border_color = m_borderColorSwatch->GetSwatchColor();
     cfg->m_Drawing.default_sheet_background_color = m_backgroundColorSwatch->GetSwatchColor();
diff --git a/eeschema/dialogs/panel_simulator_preferences.cpp b/eeschema/dialogs/panel_simulator_preferences.cpp
index fe5f3e9097..0bbddcc163 100644
--- a/eeschema/dialogs/panel_simulator_preferences.cpp
+++ b/eeschema/dialogs/panel_simulator_preferences.cpp
@@ -86,9 +86,9 @@ bool PANEL_SIMULATOR_PREFERENCES::TransferDataFromWindow()
                 return static_cast<SIM_MOUSE_WHEEL_ACTION>( aChoice->GetSelection() );
             };
 
-    SETTINGS_MANAGER& mgr = Pgm().GetSettingsManager();
-    EESCHEMA_SETTINGS* settings = mgr.GetAppSettings<EESCHEMA_SETTINGS>();
-    SIM_MOUSE_WHEEL_ACTION_SET& actions = settings->m_Simulator.preferences.mouse_wheel_actions;
+    SETTINGS_MANAGER&           mgr = Pgm().GetSettingsManager();
+    EESCHEMA_SETTINGS*          cfg = mgr.GetAppSettings<EESCHEMA_SETTINGS>( "eeschema" );
+    SIM_MOUSE_WHEEL_ACTION_SET& actions = cfg->m_Simulator.preferences.mouse_wheel_actions;
 
     actions.vertical_unmodified = toAction( m_choiceVScrollUnmodified );
     actions.vertical_with_ctrl  = toAction( m_choiceVScrollCtrl );
@@ -103,9 +103,10 @@ bool PANEL_SIMULATOR_PREFERENCES::TransferDataFromWindow()
 
 bool PANEL_SIMULATOR_PREFERENCES::TransferDataToWindow()
 {
-    SETTINGS_MANAGER& mgr = Pgm().GetSettingsManager();
-    const EESCHEMA_SETTINGS* settings = mgr.GetAppSettings<EESCHEMA_SETTINGS>();
-    applyMouseScrollActionsToPanel( settings->m_Simulator.preferences.mouse_wheel_actions );
+    SETTINGS_MANAGER&  mgr = Pgm().GetSettingsManager();
+    EESCHEMA_SETTINGS* cfg = mgr.GetAppSettings<EESCHEMA_SETTINGS>( "eeschema" );
+
+    applyMouseScrollActionsToPanel( cfg->m_Simulator.preferences.mouse_wheel_actions );
     return true;
 }
 
diff --git a/eeschema/dialogs/panel_sym_color_settings.cpp b/eeschema/dialogs/panel_sym_color_settings.cpp
index a49e72bf29..02c8c37249 100644
--- a/eeschema/dialogs/panel_sym_color_settings.cpp
+++ b/eeschema/dialogs/panel_sym_color_settings.cpp
@@ -36,7 +36,7 @@ PANEL_SYM_COLOR_SETTINGS::PANEL_SYM_COLOR_SETTINGS( wxWindow* aWindow ) :
 bool PANEL_SYM_COLOR_SETTINGS::TransferDataToWindow()
 {
     SETTINGS_MANAGER&       mgr = Pgm().GetSettingsManager();
-    SYMBOL_EDITOR_SETTINGS* cfg = mgr.GetAppSettings<SYMBOL_EDITOR_SETTINGS>();
+    SYMBOL_EDITOR_SETTINGS* cfg = mgr.GetAppSettings<SYMBOL_EDITOR_SETTINGS>( "symbol_editor" );
 
     if( cfg->m_UseEeschemaColorSettings )
         m_eeschemaRB->SetValue( true );
@@ -73,7 +73,7 @@ bool PANEL_SYM_COLOR_SETTINGS::TransferDataToWindow()
 bool PANEL_SYM_COLOR_SETTINGS::TransferDataFromWindow()
 {
     SETTINGS_MANAGER&       mgr = Pgm().GetSettingsManager();
-    SYMBOL_EDITOR_SETTINGS* cfg = mgr.GetAppSettings<SYMBOL_EDITOR_SETTINGS>();
+    SYMBOL_EDITOR_SETTINGS* cfg = mgr.GetAppSettings<SYMBOL_EDITOR_SETTINGS>( "symbol_editor" );
 
     cfg->m_UseEeschemaColorSettings = m_eeschemaRB->GetValue();
 
diff --git a/eeschema/dialogs/panel_sym_display_options.cpp b/eeschema/dialogs/panel_sym_display_options.cpp
index fa28675100..ddc742c2ae 100644
--- a/eeschema/dialogs/panel_sym_display_options.cpp
+++ b/eeschema/dialogs/panel_sym_display_options.cpp
@@ -51,7 +51,7 @@ void PANEL_SYM_DISPLAY_OPTIONS::loadSymEditorSettings( SYMBOL_EDITOR_SETTINGS* c
 bool PANEL_SYM_DISPLAY_OPTIONS::TransferDataToWindow()
 {
     SETTINGS_MANAGER&       mgr = Pgm().GetSettingsManager();
-    SYMBOL_EDITOR_SETTINGS* cfg = mgr.GetAppSettings<SYMBOL_EDITOR_SETTINGS>();
+    SYMBOL_EDITOR_SETTINGS* cfg = mgr.GetAppSettings<SYMBOL_EDITOR_SETTINGS>( "symbol_editor" );
 
     loadSymEditorSettings( cfg );
 
@@ -64,7 +64,7 @@ bool PANEL_SYM_DISPLAY_OPTIONS::TransferDataToWindow()
 bool PANEL_SYM_DISPLAY_OPTIONS::TransferDataFromWindow()
 {
     SETTINGS_MANAGER&       mgr = Pgm().GetSettingsManager();
-    SYMBOL_EDITOR_SETTINGS* cfg = mgr.GetAppSettings<SYMBOL_EDITOR_SETTINGS>();
+    SYMBOL_EDITOR_SETTINGS* cfg = mgr.GetAppSettings<SYMBOL_EDITOR_SETTINGS>( "symbol_editor" );
 
     cfg->m_ShowHiddenPins = m_checkShowHiddenPins->GetValue();
     cfg->m_ShowHiddenFields = m_checkShowHiddenFields->GetValue();
diff --git a/eeschema/dialogs/panel_sym_editing_options.cpp b/eeschema/dialogs/panel_sym_editing_options.cpp
index b47309e4f3..472b3df72f 100644
--- a/eeschema/dialogs/panel_sym_editing_options.cpp
+++ b/eeschema/dialogs/panel_sym_editing_options.cpp
@@ -62,9 +62,9 @@ void PANEL_SYM_EDITING_OPTIONS::loadSymEditorSettings( SYMBOL_EDITOR_SETTINGS* a
 bool PANEL_SYM_EDITING_OPTIONS::TransferDataToWindow()
 {
     SETTINGS_MANAGER&       mgr = Pgm().GetSettingsManager();
-    SYMBOL_EDITOR_SETTINGS* settings = mgr.GetAppSettings<SYMBOL_EDITOR_SETTINGS>();
+    SYMBOL_EDITOR_SETTINGS* cfg = mgr.GetAppSettings<SYMBOL_EDITOR_SETTINGS>( "symbol_editor" );
 
-    loadSymEditorSettings( settings );
+    loadSymEditorSettings( cfg );
 
     return true;
 }
@@ -73,19 +73,19 @@ bool PANEL_SYM_EDITING_OPTIONS::TransferDataToWindow()
 bool PANEL_SYM_EDITING_OPTIONS::TransferDataFromWindow()
 {
     SETTINGS_MANAGER&       mgr = Pgm().GetSettingsManager();
-    SYMBOL_EDITOR_SETTINGS* settings = mgr.GetAppSettings<SYMBOL_EDITOR_SETTINGS>();
+    SYMBOL_EDITOR_SETTINGS* cfg = mgr.GetAppSettings<SYMBOL_EDITOR_SETTINGS>( "symbol_editor" );
 
-    settings->m_Defaults.line_width = schIUScale.IUToMils( m_lineWidth.GetIntValue() );
-    settings->m_Defaults.text_size = schIUScale.IUToMils( m_textSize.GetIntValue() );
-    settings->m_Defaults.pin_length = schIUScale.IUToMils( m_pinLength.GetIntValue() );
-    settings->m_Defaults.pin_num_size = schIUScale.IUToMils( m_pinNumberSize.GetIntValue() );
-    settings->m_Defaults.pin_name_size = schIUScale.IUToMils( m_pinNameSize.GetIntValue() );
-    settings->m_Repeat.label_delta = m_spinRepeatLabel->GetValue();
-    settings->m_Repeat.pin_step = schIUScale.IUToMils( m_pinPitch.GetIntValue() );
-    settings->m_dragPinsAlongWithEdges = m_dragPinsWithEdges->GetValue();
+    cfg->m_Defaults.line_width = schIUScale.IUToMils( m_lineWidth.GetIntValue() );
+    cfg->m_Defaults.text_size = schIUScale.IUToMils( m_textSize.GetIntValue() );
+    cfg->m_Defaults.pin_length = schIUScale.IUToMils( m_pinLength.GetIntValue() );
+    cfg->m_Defaults.pin_num_size = schIUScale.IUToMils( m_pinNumberSize.GetIntValue() );
+    cfg->m_Defaults.pin_name_size = schIUScale.IUToMils( m_pinNameSize.GetIntValue() );
+    cfg->m_Repeat.label_delta = m_spinRepeatLabel->GetValue();
+    cfg->m_Repeat.pin_step = schIUScale.IUToMils( m_pinPitch.GetIntValue() );
+    cfg->m_dragPinsAlongWithEdges = m_dragPinsWithEdges->GetValue();
 
     // Force pin_step to a grid multiple
-    settings->m_Repeat.pin_step = KiROUND( double( settings->m_Repeat.pin_step ) / MIN_GRID ) * MIN_GRID;
+    cfg->m_Repeat.pin_step = KiROUND( double( cfg->m_Repeat.pin_step ) / MIN_GRID ) * MIN_GRID;
 
     return true;
 }
diff --git a/eeschema/dialogs/panel_sym_lib_table.cpp b/eeschema/dialogs/panel_sym_lib_table.cpp
index 2468e78123..602c473141 100644
--- a/eeschema/dialogs/panel_sym_lib_table.cpp
+++ b/eeschema/dialogs/panel_sym_lib_table.cpp
@@ -247,7 +247,8 @@ void PANEL_SYM_LIB_TABLE::setupGrid( WX_GRID* aGrid )
             aCurrGrid->SetColSize( aCol, std::max( prevWidth, aCurrGrid->GetColSize( aCol ) ) );
         };
 
-    EESCHEMA_SETTINGS* cfg = Pgm().GetSettingsManager().GetAppSettings<EESCHEMA_SETTINGS>();
+    SETTINGS_MANAGER&  mgr = Pgm().GetSettingsManager();
+    EESCHEMA_SETTINGS* cfg = mgr.GetAppSettings<EESCHEMA_SETTINGS>( "eeschema" );
 
     // Give a bit more room for combobox editors
     for( int ii = 0; ii < aGrid->GetNumberRows(); ++ii )
@@ -342,7 +343,8 @@ PANEL_SYM_LIB_TABLE::PANEL_SYM_LIB_TABLE( DIALOG_EDIT_LIBRARY_TABLES* aParent, P
             m_pluginChoices.Add( SCH_IO_MGR::ShowType( type ) );
     }
 
-    EESCHEMA_SETTINGS* cfg = Pgm().GetSettingsManager().GetAppSettings<EESCHEMA_SETTINGS>();
+    SETTINGS_MANAGER&  mgr = Pgm().GetSettingsManager();
+    EESCHEMA_SETTINGS* cfg = mgr.GetAppSettings<EESCHEMA_SETTINGS>( "eeschema" );
 
     if( cfg->m_lastSymbolLibDir.IsEmpty() )
         cfg->m_lastSymbolLibDir = PATHS::GetDefaultUserSymbolsPath();
@@ -628,7 +630,8 @@ void PANEL_SYM_LIB_TABLE::browseLibrariesHandler( wxCommandEvent& event )
     fileFiltersStr = _( "All supported formats" ) + wxT( "|" ) + allWildcardsStr + wxT( "|" )
                      + fileFiltersStr;
 
-    EESCHEMA_SETTINGS* cfg = Pgm().GetSettingsManager().GetAppSettings<EESCHEMA_SETTINGS>();
+    SETTINGS_MANAGER&  mgr = Pgm().GetSettingsManager();
+    EESCHEMA_SETTINGS* cfg = mgr.GetAppSettings<EESCHEMA_SETTINGS>( "eeschema" );
 
     wxString openDir = cfg->m_lastSymbolLibDir;
 
diff --git a/eeschema/dialogs/panel_template_fieldnames.cpp b/eeschema/dialogs/panel_template_fieldnames.cpp
index 2d40bcce68..547d6aa555 100644
--- a/eeschema/dialogs/panel_template_fieldnames.cpp
+++ b/eeschema/dialogs/panel_template_fieldnames.cpp
@@ -52,7 +52,8 @@ PANEL_TEMPLATE_FIELDNAMES::PANEL_TEMPLATE_FIELDNAMES( wxWindow* aWindow,
         m_global = true;
         m_templateMgr = &m_templateMgrInstance;
 
-        EESCHEMA_SETTINGS* cfg = Pgm().GetSettingsManager().GetAppSettings<EESCHEMA_SETTINGS>();
+        SETTINGS_MANAGER&  mgr = Pgm().GetSettingsManager();
+        EESCHEMA_SETTINGS* cfg = mgr.GetAppSettings<EESCHEMA_SETTINGS>( "eeschema" );
 
         if( cfg && !cfg->m_Drawing.field_names.IsEmpty() )
             m_templateMgr->AddTemplateFieldNames( cfg->m_Drawing.field_names );
@@ -229,7 +230,8 @@ bool PANEL_TEMPLATE_FIELDNAMES::TransferDataFromWindow()
 
     if( m_global )
     {
-        EESCHEMA_SETTINGS* cfg = Pgm().GetSettingsManager().GetAppSettings<EESCHEMA_SETTINGS>();
+        SETTINGS_MANAGER&  mgr = Pgm().GetSettingsManager();
+        EESCHEMA_SETTINGS* cfg = mgr.GetAppSettings<EESCHEMA_SETTINGS>( "eeschema" );
 
         if( cfg )
         {
diff --git a/eeschema/eeschema.cpp b/eeschema/eeschema.cpp
index 35dfa65f58..c654f0dba3 100644
--- a/eeschema/eeschema.cpp
+++ b/eeschema/eeschema.cpp
@@ -208,7 +208,7 @@ static struct IFACE : public KIFACE_BASE, public UNITS_PROVIDER
         case PANEL_SYM_DISP_OPTIONS:
         {
             SETTINGS_MANAGER&  mgr = Pgm().GetSettingsManager();
-            APP_SETTINGS_BASE* cfg = mgr.GetAppSettings<SYMBOL_EDITOR_SETTINGS>();
+            APP_SETTINGS_BASE* cfg = mgr.GetAppSettings<SYMBOL_EDITOR_SETTINGS>( "symbol_editor" );
 
             return new PANEL_SYM_DISPLAY_OPTIONS( aParent, cfg );
         }
@@ -216,7 +216,7 @@ static struct IFACE : public KIFACE_BASE, public UNITS_PROVIDER
         case PANEL_SYM_EDIT_GRIDS:
         {
             SETTINGS_MANAGER&  mgr = Pgm().GetSettingsManager();
-            APP_SETTINGS_BASE* cfg = mgr.GetAppSettings<SYMBOL_EDITOR_SETTINGS>();
+            APP_SETTINGS_BASE* cfg = mgr.GetAppSettings<SYMBOL_EDITOR_SETTINGS>( "symbol_editor" );
             EDA_BASE_FRAME*    frame = aKiway->Player( FRAME_SCH_SYMBOL_EDITOR, false );
 
             if( !frame )
@@ -253,7 +253,7 @@ static struct IFACE : public KIFACE_BASE, public UNITS_PROVIDER
         case PANEL_SCH_DISP_OPTIONS:
         {
             SETTINGS_MANAGER&  mgr = Pgm().GetSettingsManager();
-            APP_SETTINGS_BASE* cfg = mgr.GetAppSettings<EESCHEMA_SETTINGS>();
+            EESCHEMA_SETTINGS* cfg = mgr.GetAppSettings<EESCHEMA_SETTINGS>( "eeschema" );
 
             return new PANEL_EESCHEMA_DISPLAY_OPTIONS( aParent, cfg );
         }
@@ -261,7 +261,7 @@ static struct IFACE : public KIFACE_BASE, public UNITS_PROVIDER
         case PANEL_SCH_GRIDS:
         {
             SETTINGS_MANAGER&  mgr = Pgm().GetSettingsManager();
-            APP_SETTINGS_BASE* cfg = mgr.GetAppSettings<EESCHEMA_SETTINGS>();
+            EESCHEMA_SETTINGS* cfg = mgr.GetAppSettings<EESCHEMA_SETTINGS>( "eeschema" );
             EDA_BASE_FRAME*    frame = aKiway->Player( FRAME_SCH, false );
 
             if( !frame )
diff --git a/eeschema/eeschema_settings.cpp b/eeschema/eeschema_settings.cpp
index 34eb12339a..93b81b1f10 100644
--- a/eeschema/eeschema_settings.cpp
+++ b/eeschema/eeschema_settings.cpp
@@ -977,7 +977,8 @@ bool EESCHEMA_SETTINGS::MigrateFromLegacy( wxConfigBase* aCfg )
     if( aCfg->Read( "MoveWarpsCursor", &tmp ) )
         Pgm().GetCommonSettings()->m_Input.warp_mouse_on_move = tmp;
 
-    COLOR_SETTINGS* cs = Pgm().GetSettingsManager().GetMigratedColorSettings();
+    SETTINGS_MANAGER& mgr = Pgm().GetSettingsManager();
+    COLOR_SETTINGS*   cs = mgr.GetMigratedColorSettings();
 
     auto migrateLegacyColor = [&] ( const std::string& aKey, int aLayerId ) {
         wxString str;
@@ -1016,14 +1017,14 @@ bool EESCHEMA_SETTINGS::MigrateFromLegacy( wxConfigBase* aCfg )
     migrateLegacyColor( "Color4DWireEx",            LAYER_WIRE );
     migrateLegacyColor( "Color4DWorksheetEx",       LAYER_SCHEMATIC_DRAWINGSHEET );
 
-    Pgm().GetSettingsManager().SaveColorSettings( cs, "schematic" );
+    mgr.SaveColorSettings( cs, "schematic" );
 
     Set( "appearance.color_theme", cs->GetFilename() );
 
     // LibEdit settings were stored with eeschema.  If eeschema is the first app to run,
     // we need to migrate the LibEdit settings here
 
-    auto libedit = Pgm().GetSettingsManager().GetAppSettings<SYMBOL_EDITOR_SETTINGS>();
+    SYMBOL_EDITOR_SETTINGS* libedit = mgr.GetAppSettings<SYMBOL_EDITOR_SETTINGS>( "symbol_editor" );
     libedit->MigrateFromLegacy( aCfg );
     libedit->Load();
 
diff --git a/eeschema/pin_layout_cache.cpp b/eeschema/pin_layout_cache.cpp
index d519a09fc0..a2c71f2a05 100644
--- a/eeschema/pin_layout_cache.cpp
+++ b/eeschema/pin_layout_cache.cpp
@@ -138,7 +138,8 @@ void PIN_LAYOUT_CACHE::recomputeExtentsCache( bool aDefinitelyDirty, KIFONT::FON
 
 void PIN_LAYOUT_CACHE::recomputeCaches()
 {
-    EESCHEMA_SETTINGS*     cfg = Pgm().GetSettingsManager().GetAppSettings<EESCHEMA_SETTINGS>();
+    SETTINGS_MANAGER&      mgr = Pgm().GetSettingsManager();
+    EESCHEMA_SETTINGS*     cfg = mgr.GetAppSettings<EESCHEMA_SETTINGS>( "eeschema" );
     KIFONT::FONT*          font = KIFONT::FONT::GetFont( cfg->m_Appearance.default_font );
     const KIFONT::METRICS& metrics = m_pin.GetFontMetrics();
 
diff --git a/eeschema/sch_base_frame.cpp b/eeschema/sch_base_frame.cpp
index 5de66c2cae..b385aa252e 100644
--- a/eeschema/sch_base_frame.cpp
+++ b/eeschema/sch_base_frame.cpp
@@ -535,12 +535,12 @@ COLOR_SETTINGS* SCH_BASE_FRAME::GetColorSettings( bool aForceRefresh ) const
     if( !m_colorSettings || aForceRefresh )
     {
         SETTINGS_MANAGER&  mgr = Pgm().GetSettingsManager();
-        EESCHEMA_SETTINGS* cfg = mgr.GetAppSettings<EESCHEMA_SETTINGS>();
+        EESCHEMA_SETTINGS* cfg = mgr.GetAppSettings<EESCHEMA_SETTINGS>( "eeschema" );
         wxString           colorTheme = cfg->m_ColorTheme;
 
         if( IsType( FRAME_SCH_SYMBOL_EDITOR ) )
         {
-            SYMBOL_EDITOR_SETTINGS* symCfg = mgr.GetAppSettings<SYMBOL_EDITOR_SETTINGS>();
+            SYMBOL_EDITOR_SETTINGS* symCfg = mgr.GetAppSettings<SYMBOL_EDITOR_SETTINGS>( "symbol_editor" );
 
             if( !symCfg->m_UseEeschemaColorSettings )
                 colorTheme = symCfg->m_ColorTheme;
diff --git a/eeschema/sch_edit_frame.cpp b/eeschema/sch_edit_frame.cpp
index 2102644620..5d779ede8d 100644
--- a/eeschema/sch_edit_frame.cpp
+++ b/eeschema/sch_edit_frame.cpp
@@ -2145,7 +2145,8 @@ void SCH_EDIT_FRAME::CommonSettingsChanged( bool aEnvVarsChanged, bool aTextVars
 
     ShowAllIntersheetRefs( settings.m_IntersheetRefsShow );
 
-    EESCHEMA_SETTINGS* cfg = Pgm().GetSettingsManager().GetAppSettings<EESCHEMA_SETTINGS>();
+    SETTINGS_MANAGER&  mgr = Pgm().GetSettingsManager();
+    EESCHEMA_SETTINGS* cfg = mgr.GetAppSettings<EESCHEMA_SETTINGS>( "eeschema" );
     GetGalDisplayOptions().ReadWindowSettings( cfg->m_Window );
     GetRenderSettings()->SetDefaultFont( cfg->m_Appearance.default_font );
 
diff --git a/eeschema/sch_item.cpp b/eeschema/sch_item.cpp
index b2bbf316ad..35149600b0 100644
--- a/eeschema/sch_item.cpp
+++ b/eeschema/sch_item.cpp
@@ -454,7 +454,8 @@ int SCH_ITEM::compare( const SCH_ITEM& aOther, int aCompareFlags ) const
 
 const wxString& SCH_ITEM::GetDefaultFont() const
 {
-    EESCHEMA_SETTINGS* cfg = Pgm().GetSettingsManager().GetAppSettings<EESCHEMA_SETTINGS>();
+    SETTINGS_MANAGER&  mgr = Pgm().GetSettingsManager();
+    EESCHEMA_SETTINGS* cfg = mgr.GetAppSettings<EESCHEMA_SETTINGS>( "eeschema" );
 
     return cfg->m_Appearance.default_font;
 }
diff --git a/eeschema/sch_pin.cpp b/eeschema/sch_pin.cpp
index 593d2a6196..99e6edbce3 100644
--- a/eeschema/sch_pin.cpp
+++ b/eeschema/sch_pin.cpp
@@ -110,14 +110,16 @@ SCH_PIN::SCH_PIN( LIB_SYMBOL* aParentSymbol ) :
 {
     // Use the application settings for pin sizes if exists.
     // pgm can be nullptr when running a shared lib from a script, not from a kicad appl
-    PGM_BASE* pgm  = PgmOrNull();
+    PGM_BASE* pgm = PgmOrNull();
 
     if( pgm )
     {
-        auto* settings = pgm->GetSettingsManager().GetAppSettings<SYMBOL_EDITOR_SETTINGS>();
-        m_length       = schIUScale.MilsToIU( settings->m_Defaults.pin_length );
-        m_numTextSize  = schIUScale.MilsToIU( settings->m_Defaults.pin_num_size );
-        m_nameTextSize = schIUScale.MilsToIU( settings->m_Defaults.pin_name_size );
+        SETTINGS_MANAGER&       mgr = pgm->GetSettingsManager();
+        SYMBOL_EDITOR_SETTINGS* cfg = mgr.GetAppSettings<SYMBOL_EDITOR_SETTINGS>( "symbol_editor" );
+
+        m_length       = schIUScale.MilsToIU( cfg->m_Defaults.pin_length );
+        m_numTextSize  = schIUScale.MilsToIU( cfg->m_Defaults.pin_num_size );
+        m_nameTextSize = schIUScale.MilsToIU( cfg->m_Defaults.pin_name_size );
     }
     else    // Use hardcoded eeschema defaults: symbol_editor settings are not existing.
     {
diff --git a/eeschema/schematic_settings.cpp b/eeschema/schematic_settings.cpp
index 309207ea32..de3d7371ab 100644
--- a/eeschema/schematic_settings.cpp
+++ b/eeschema/schematic_settings.cpp
@@ -66,26 +66,20 @@ SCHEMATIC_SETTINGS::SCHEMATIC_SETTINGS( JSON_SETTINGS* aParent, const std::strin
         m_SpiceModelCurSheetAsRoot( true ),
         m_NgspiceSettings( nullptr )
 {
-    EESCHEMA_SETTINGS* appSettings = Pgm().GetSettingsManager().GetAppSettings<EESCHEMA_SETTINGS>();
+    SETTINGS_MANAGER&  mgr = Pgm().GetSettingsManager();
+    EESCHEMA_SETTINGS* cfg = mgr.GetAppSettings<EESCHEMA_SETTINGS>( "eeschema" );
 
-    int defaultLineThickness =
-            appSettings ? appSettings->m_Drawing.default_line_thickness : DEFAULT_LINE_WIDTH_MILS;
-    int defaultTextSize =
-            appSettings ? appSettings->m_Drawing.default_text_size : DEFAULT_TEXT_SIZE;
-    int defaultPinSymbolSize =
-            appSettings ? appSettings->m_Drawing.pin_symbol_size : DEFAULT_TEXT_SIZE / 2;
-    int defaultJunctionSizeChoice =
-            appSettings ? appSettings->m_Drawing.junction_size_choice : 3;
-    bool defaultIntersheetsRefShow =
-            appSettings ? appSettings->m_Drawing.intersheets_ref_show : false;
-    bool defaultIntersheetsRefOwnPage =
-            appSettings ? appSettings->m_Drawing.intersheets_ref_own_page : true;
-    bool defaultIntersheetsRefFormatShort =
-            appSettings ? appSettings->m_Drawing.intersheets_ref_short : false;
-    wxString defaultIntersheetsRefPrefix =
-            appSettings ? appSettings->m_Drawing.intersheets_ref_prefix : wxString( wxS( DEFAULT_IREF_PREFIX ) );
-    wxString defaultIntersheetsRefSuffix =
-            appSettings ? appSettings->m_Drawing.intersheets_ref_suffix : wxString( wxS( DEFAULT_IREF_SUFFIX ) );
+    int defaultLineThickness = cfg ? cfg->m_Drawing.default_line_thickness : DEFAULT_LINE_WIDTH_MILS;
+    int defaultTextSize = cfg ? cfg->m_Drawing.default_text_size : DEFAULT_TEXT_SIZE;
+    int defaultPinSymbolSize = cfg ? cfg->m_Drawing.pin_symbol_size : DEFAULT_TEXT_SIZE / 2;
+    int defaultJunctionSizeChoice = cfg ? cfg->m_Drawing.junction_size_choice : 3;
+    bool defaultIntersheetsRefShow = cfg ? cfg->m_Drawing.intersheets_ref_show : false;
+    bool defaultIntersheetsRefOwnPage = cfg ? cfg->m_Drawing.intersheets_ref_own_page : true;
+    bool defaultIntersheetsRefFormatShort = cfg ? cfg->m_Drawing.intersheets_ref_short : false;
+    wxString defaultIntersheetsRefPrefix = cfg ? cfg->m_Drawing.intersheets_ref_prefix
+                                               : wxString( wxS( DEFAULT_IREF_PREFIX ) );
+    wxString defaultIntersheetsRefSuffix = cfg ? cfg->m_Drawing.intersheets_ref_suffix
+                                               : wxString( wxS( DEFAULT_IREF_SUFFIX ) );
 
     m_params.emplace_back( new PARAM<bool>( "drawing.intersheets_ref_show",
             &m_IntersheetRefsShow, defaultIntersheetsRefShow ) );
@@ -191,7 +185,8 @@ SCHEMATIC_SETTINGS::SCHEMATIC_SETTINGS( JSON_SETTINGS* aParent, const std::strin
                 }
 
                 // Read global fieldname templates
-                auto* cfg = Pgm().GetSettingsManager().GetAppSettings<EESCHEMA_SETTINGS>();
+                SETTINGS_MANAGER&  mgr = Pgm().GetSettingsManager();
+                EESCHEMA_SETTINGS* cfg = mgr.GetAppSettings<EESCHEMA_SETTINGS>( "eeschema" );
 
                 if( cfg && !cfg->m_Drawing.field_names.IsEmpty() )
                     m_TemplateFieldNames.AddTemplateFieldNames( cfg->m_Drawing.field_names );
diff --git a/eeschema/symbol_editor/symbol_edit_frame.cpp b/eeschema/symbol_editor/symbol_edit_frame.cpp
index 34972cc68d..964e4fcfa2 100644
--- a/eeschema/symbol_editor/symbol_edit_frame.cpp
+++ b/eeschema/symbol_editor/symbol_edit_frame.cpp
@@ -137,7 +137,7 @@ SYMBOL_EDIT_FRAME::SYMBOL_EDIT_FRAME( KIWAY* aKiway, wxWindow* aParent ) :
 
     SetIcons( icon_bundle );
 
-    m_settings = Pgm().GetSettingsManager().GetAppSettings<SYMBOL_EDITOR_SETTINGS>();
+    m_settings = Pgm().GetSettingsManager().GetAppSettings<SYMBOL_EDITOR_SETTINGS>( "symbol_editor" );
     LoadSettings( m_settings );
 
     m_libMgr = new LIB_SYMBOL_LIBRARY_MANAGER( *this );
@@ -301,19 +301,11 @@ SYMBOL_EDIT_FRAME::~SYMBOL_EDIT_FRAME()
     // current screen is destroyed in EDA_DRAW_FRAME
     SetScreen( m_dummyScreen );
 
-    SYMBOL_EDITOR_SETTINGS* cfg = nullptr;
-
-    try
-    {
-        cfg = Pgm().GetSettingsManager().GetAppSettings<SYMBOL_EDITOR_SETTINGS>();
-    }
-    catch( const std::runtime_error& e )
-    {
-        wxFAIL_MSG( e.what() );
-    }
+    SETTINGS_MANAGER&       mgr = Pgm().GetSettingsManager();
+    SYMBOL_EDITOR_SETTINGS* cfg = mgr.GetAppSettings<SYMBOL_EDITOR_SETTINGS>( "symbol_editor" );
 
     if( cfg )
-        Pgm().GetSettingsManager().Save( cfg );
+        mgr.Save( cfg );
 
     delete m_libMgr;
 }
@@ -370,7 +362,7 @@ COLOR_SETTINGS* SYMBOL_EDIT_FRAME::GetColorSettings( bool aForceRefresh ) const
     SETTINGS_MANAGER& mgr = Pgm().GetSettingsManager();
 
     if( GetSettings()->m_UseEeschemaColorSettings )
-        return mgr.GetColorSettings( mgr.GetAppSettings<EESCHEMA_SETTINGS>()->m_ColorTheme );
+        return mgr.GetColorSettings( mgr.GetAppSettings<EESCHEMA_SETTINGS>( "eeschema" )->m_ColorTheme );
     else
         return mgr.GetColorSettings( GetSettings()->m_ColorTheme );
 }
@@ -1349,7 +1341,7 @@ void SYMBOL_EDIT_FRAME::CommonSettingsChanged( bool aEnvVarsChanged, bool aTextV
     SCH_BASE_FRAME::CommonSettingsChanged( aEnvVarsChanged, aTextVarsChanged );
 
     SETTINGS_MANAGER*       mgr = GetSettingsManager();
-    SYMBOL_EDITOR_SETTINGS* cfg = mgr->GetAppSettings<SYMBOL_EDITOR_SETTINGS>();
+    SYMBOL_EDITOR_SETTINGS* cfg = mgr->GetAppSettings<SYMBOL_EDITOR_SETTINGS>( "symbol_editor" );
 
     GetRenderSettings()->m_ShowPinsElectricalType = cfg->m_ShowPinElectricalType;
     GetRenderSettings()->m_ShowHiddenPins = cfg->m_ShowHiddenPins;
diff --git a/eeschema/symbol_lib_table.cpp b/eeschema/symbol_lib_table.cpp
index 803f35abe9..a5d499b17c 100644
--- a/eeschema/symbol_lib_table.cpp
+++ b/eeschema/symbol_lib_table.cpp
@@ -665,7 +665,7 @@ bool SYMBOL_LIB_TABLE::LoadGlobalTable( SYMBOL_LIB_TABLE& aTable )
     aTable.Load( fn.GetFullPath() );
 
     SETTINGS_MANAGER& mgr = Pgm().GetSettingsManager();
-    KICAD_SETTINGS*   settings = mgr.GetAppSettings<KICAD_SETTINGS>();
+    KICAD_SETTINGS*   settings = mgr.GetAppSettings<KICAD_SETTINGS>( "kicad" );
 
     wxCHECK( settings, false );
 
diff --git a/eeschema/symbol_viewer_frame.cpp b/eeschema/symbol_viewer_frame.cpp
index b38cfd2d71..034239a988 100644
--- a/eeschema/symbol_viewer_frame.cpp
+++ b/eeschema/symbol_viewer_frame.cpp
@@ -845,7 +845,8 @@ void SYMBOL_VIEWER_FRAME::DClickOnSymbolList( wxCommandEvent& event )
 
 void SYMBOL_VIEWER_FRAME::LoadSettings( APP_SETTINGS_BASE* aCfg )
 {
-    auto cfg = Pgm().GetSettingsManager().GetAppSettings<EESCHEMA_SETTINGS>();
+    SETTINGS_MANAGER&  mgr = Pgm().GetSettingsManager();
+    EESCHEMA_SETTINGS* cfg = mgr.GetAppSettings<EESCHEMA_SETTINGS>( "eeschema" );
 
     SCH_BASE_FRAME::LoadSettings( cfg );
 
@@ -871,7 +872,8 @@ void SYMBOL_VIEWER_FRAME::LoadSettings( APP_SETTINGS_BASE* aCfg )
 
 void SYMBOL_VIEWER_FRAME::SaveSettings( APP_SETTINGS_BASE* aCfg)
 {
-    EESCHEMA_SETTINGS* cfg = Pgm().GetSettingsManager().GetAppSettings<EESCHEMA_SETTINGS>();
+    SETTINGS_MANAGER&  mgr = Pgm().GetSettingsManager();
+    EESCHEMA_SETTINGS* cfg = mgr.GetAppSettings<EESCHEMA_SETTINGS>( "eeschema" );
 
     SCH_BASE_FRAME::SaveSettings( cfg );
 
@@ -903,7 +905,8 @@ void SYMBOL_VIEWER_FRAME::CommonSettingsChanged( bool aEnvVarsChanged, bool aTex
 {
     SCH_BASE_FRAME::CommonSettingsChanged( aEnvVarsChanged, aTextVarsChanged );
 
-    EESCHEMA_SETTINGS* cfg = Pgm().GetSettingsManager().GetAppSettings<EESCHEMA_SETTINGS>();
+    SETTINGS_MANAGER&  mgr = Pgm().GetSettingsManager();
+    EESCHEMA_SETTINGS* cfg = mgr.GetAppSettings<EESCHEMA_SETTINGS>( "eeschema" );
     GetGalDisplayOptions().ReadWindowSettings( cfg->m_LibViewPanel.window );
 
     GetCanvas()->GetGAL()->SetAxesColor( m_colorSettings->GetColor( LAYER_SCHEMATIC_GRID_AXES ) );
diff --git a/eeschema/tools/sch_edit_tool.cpp b/eeschema/tools/sch_edit_tool.cpp
index eed1f273d3..ba4f07ab92 100644
--- a/eeschema/tools/sch_edit_tool.cpp
+++ b/eeschema/tools/sch_edit_tool.cpp
@@ -1446,7 +1446,8 @@ int SCH_EDIT_TOOL::RepeatDrawItem( const TOOL_EVENT& aEvent )
     for( const std::unique_ptr<SCH_ITEM>& item : sourceItems )
     {
         SCH_ITEM*          newItem = item->Duplicate();
-        EESCHEMA_SETTINGS* cfg = Pgm().GetSettingsManager().GetAppSettings<EESCHEMA_SETTINGS>();
+        SETTINGS_MANAGER&  mgr = Pgm().GetSettingsManager();
+        EESCHEMA_SETTINGS* cfg = mgr.GetAppSettings<EESCHEMA_SETTINGS>( "eeschema" );
         bool               restore_state = false;
 
         // Ensure newItem has a suitable parent: the current screen, because an item from
diff --git a/eeschema/tools/sch_move_tool.cpp b/eeschema/tools/sch_move_tool.cpp
index 237266228f..c2d3a49d14 100644
--- a/eeschema/tools/sch_move_tool.cpp
+++ b/eeschema/tools/sch_move_tool.cpp
@@ -404,17 +404,8 @@ int SCH_MOVE_TOOL::Main( const TOOL_EVENT& aEvent )
 
 bool SCH_MOVE_TOOL::doMoveSelection( const TOOL_EVENT& aEvent, SCH_COMMIT* aCommit, bool aIsSlice )
 {
-    EESCHEMA_SETTINGS*    cfg = nullptr;
-
-    try
-    {
-        cfg = Pgm().GetSettingsManager().GetAppSettings<EESCHEMA_SETTINGS>();
-    }
-    catch( const std::runtime_error& e )
-    {
-        wxCHECK_MSG( false, false, e.what() );
-    }
-
+    SETTINGS_MANAGER&     mgr = Pgm().GetSettingsManager();
+    EESCHEMA_SETTINGS*    cfg = mgr.GetAppSettings<EESCHEMA_SETTINGS>( "eeschema" );
     KIGFX::VIEW_CONTROLS* controls = getViewControls();
     EE_GRID_HELPER        grid( m_toolMgr );
     bool                  wasDragging = m_moveInProgress && m_isDrag;
diff --git a/eeschema/tools/symbol_editor_drawing_tools.cpp b/eeschema/tools/symbol_editor_drawing_tools.cpp
index 4fe8cb8a3b..5c472f5f72 100644
--- a/eeschema/tools/symbol_editor_drawing_tools.cpp
+++ b/eeschema/tools/symbol_editor_drawing_tools.cpp
@@ -81,9 +81,12 @@ bool SYMBOL_EDITOR_DRAWING_TOOLS::Init()
 
 int SYMBOL_EDITOR_DRAWING_TOOLS::TwoClickPlace( const TOOL_EVENT& aEvent )
 {
-    KICAD_T type = aEvent.Parameter<KICAD_T>();
-    auto*   settings = Pgm().GetSettingsManager().GetAppSettings<SYMBOL_EDITOR_SETTINGS>();
-    auto*   pinTool = type == SCH_PIN_T ? m_toolMgr->GetTool<SYMBOL_EDITOR_PIN_TOOL>() : nullptr;
+    KICAD_T                 type = aEvent.Parameter<KICAD_T>();
+    SETTINGS_MANAGER&       mgr = Pgm().GetSettingsManager();
+    SYMBOL_EDITOR_SETTINGS* cfg = mgr.GetAppSettings<SYMBOL_EDITOR_SETTINGS>( "symbol_editor" );
+    SYMBOL_EDITOR_PIN_TOOL* pinTool = type == SCH_PIN_T
+                                                ? m_toolMgr->GetTool<SYMBOL_EDITOR_PIN_TOOL>()
+                                                : nullptr;
 
     if( m_inTwoClickPlace )
         return 0;
@@ -231,8 +234,8 @@ int SYMBOL_EDITOR_DRAWING_TOOLS::TwoClickPlace( const TOOL_EVENT& aEvent )
                     if( m_drawSpecificBodyStyle )
                         text->SetBodyStyle( m_frame->GetBodyStyle() );
 
-                    text->SetTextSize( VECTOR2I( schIUScale.MilsToIU( settings->m_Defaults.text_size ),
-                                                 schIUScale.MilsToIU( settings->m_Defaults.text_size ) ) );
+                    text->SetTextSize( VECTOR2I( schIUScale.MilsToIU( cfg->m_Defaults.text_size ),
+                                                 schIUScale.MilsToIU( cfg->m_Defaults.text_size ) ) );
                     text->SetTextAngle( m_lastTextAngle );
 
                     DIALOG_TEXT_PROPERTIES dlg( m_frame, text );
@@ -358,8 +361,8 @@ int SYMBOL_EDITOR_DRAWING_TOOLS::doDrawShape( const TOOL_EVENT& aEvent, std::opt
     SHAPE_T toolType  = aDrawingShape.value_or( SHAPE_T::SEGMENT );
 
     KIGFX::VIEW_CONTROLS*   controls = getViewControls();
-    SETTINGS_MANAGER&       settingsMgr = Pgm().GetSettingsManager();
-    SYMBOL_EDITOR_SETTINGS* settings = settingsMgr.GetAppSettings<SYMBOL_EDITOR_SETTINGS>();
+    SETTINGS_MANAGER&       mgr = Pgm().GetSettingsManager();
+    SYMBOL_EDITOR_SETTINGS* cfg = mgr.GetAppSettings<SYMBOL_EDITOR_SETTINGS>( "symbol_editor" );
     EE_GRID_HELPER          grid( m_toolMgr );
     VECTOR2I                cursorPos;
     SHAPE_T                 shapeType = toolType == SHAPE_T::SEGMENT ? SHAPE_T::POLY : toolType;
@@ -460,15 +463,15 @@ int SYMBOL_EDITOR_DRAWING_TOOLS::doDrawShape( const TOOL_EVENT& aEvent, std::opt
 
             m_toolMgr->RunAction( EE_ACTIONS::clearSelection );
 
-            int lineWidth = schIUScale.MilsToIU( settings->m_Defaults.line_width );
+            int lineWidth = schIUScale.MilsToIU( cfg->m_Defaults.line_width );
 
             if( isTextBox )
             {
                 SCH_TEXTBOX* textbox = new SCH_TEXTBOX( LAYER_DEVICE, lineWidth, m_lastFillStyle );
 
                 textbox->SetParent( symbol );
-                textbox->SetTextSize( VECTOR2I( schIUScale.MilsToIU( settings->m_Defaults.text_size ),
-                                                schIUScale.MilsToIU( settings->m_Defaults.text_size ) ) );
+                textbox->SetTextSize( VECTOR2I( schIUScale.MilsToIU( cfg->m_Defaults.text_size ),
+                                                schIUScale.MilsToIU( cfg->m_Defaults.text_size ) ) );
 
                 // Must be after SetTextSize()
                 textbox->SetBold( m_lastTextBold );
diff --git a/eeschema/tools/symbol_editor_pin_tool.cpp b/eeschema/tools/symbol_editor_pin_tool.cpp
index 19ac3f23f5..4d8e5dbb4c 100644
--- a/eeschema/tools/symbol_editor_pin_tool.cpp
+++ b/eeschema/tools/symbol_editor_pin_tool.cpp
@@ -53,8 +53,10 @@ static int GetLastPinLength()
 {
     if( g_LastPinLength == -1 )
     {
-        auto* settings = Pgm().GetSettingsManager().GetAppSettings<SYMBOL_EDITOR_SETTINGS>();
-        g_LastPinLength = schIUScale.MilsToIU( settings->m_Defaults.pin_length );
+        SETTINGS_MANAGER&       mgr = Pgm().GetSettingsManager();
+        SYMBOL_EDITOR_SETTINGS* cfg = mgr.GetAppSettings<SYMBOL_EDITOR_SETTINGS>( "symbol_editor" );
+
+        g_LastPinLength = schIUScale.MilsToIU( cfg->m_Defaults.pin_length );
     }
 
     return g_LastPinLength;
@@ -64,8 +66,10 @@ static int GetLastPinNameSize()
 {
     if( g_LastPinNameSize == -1 )
     {
-        auto* settings = Pgm().GetSettingsManager().GetAppSettings<SYMBOL_EDITOR_SETTINGS>();
-        g_LastPinNameSize = schIUScale.MilsToIU( settings->m_Defaults.pin_name_size );
+        SETTINGS_MANAGER&       mgr = Pgm().GetSettingsManager();
+        SYMBOL_EDITOR_SETTINGS* cfg = mgr.GetAppSettings<SYMBOL_EDITOR_SETTINGS>( "symbol_editor" );
+
+        g_LastPinNameSize = schIUScale.MilsToIU( cfg->m_Defaults.pin_name_size );
     }
 
     return g_LastPinNameSize;
@@ -75,8 +79,10 @@ static int GetLastPinNumSize()
 {
     if( g_LastPinNumSize == -1 )
     {
-        auto* settings = Pgm().GetSettingsManager().GetAppSettings<SYMBOL_EDITOR_SETTINGS>();
-        g_LastPinNumSize = schIUScale.MilsToIU( settings->m_Defaults.pin_num_size );
+        SETTINGS_MANAGER&       mgr = Pgm().GetSettingsManager();
+        SYMBOL_EDITOR_SETTINGS* cfg = mgr.GetAppSettings<SYMBOL_EDITOR_SETTINGS>( "symbol_editor" );
+
+        g_LastPinNumSize = schIUScale.MilsToIU( cfg->m_Defaults.pin_num_size );
     }
 
     return g_LastPinNumSize;
@@ -419,25 +425,26 @@ SCH_PIN* SYMBOL_EDITOR_PIN_TOOL::RepeatPin( const SCH_PIN* aSourcePin )
     pin->ClearFlags();
     pin->SetFlags( IS_NEW );
 
-    auto* settings = Pgm().GetSettingsManager().GetAppSettings<SYMBOL_EDITOR_SETTINGS>();
+    SETTINGS_MANAGER&       mgr = Pgm().GetSettingsManager();
+    SYMBOL_EDITOR_SETTINGS* cfg = mgr.GetAppSettings<SYMBOL_EDITOR_SETTINGS>( "symbol_editor" );
 
     switch( pin->GetOrientation() )
     {
     default:
-    case PIN_ORIENTATION::PIN_RIGHT: step.y = schIUScale.MilsToIU(-settings->m_Repeat.pin_step);  break;
-    case PIN_ORIENTATION::PIN_UP:    step.x = schIUScale.MilsToIU(settings->m_Repeat.pin_step);   break;
-    case PIN_ORIENTATION::PIN_DOWN:  step.x = schIUScale.MilsToIU(settings->m_Repeat.pin_step);   break;
-    case PIN_ORIENTATION::PIN_LEFT:  step.y = schIUScale.MilsToIU(-settings->m_Repeat.pin_step);  break;
+    case PIN_ORIENTATION::PIN_RIGHT: step.y = schIUScale.MilsToIU( -cfg->m_Repeat.pin_step ); break;
+    case PIN_ORIENTATION::PIN_UP:    step.x = schIUScale.MilsToIU( cfg->m_Repeat.pin_step );  break;
+    case PIN_ORIENTATION::PIN_DOWN:  step.x = schIUScale.MilsToIU( cfg->m_Repeat.pin_step) ;  break;
+    case PIN_ORIENTATION::PIN_LEFT:  step.y = schIUScale.MilsToIU( -cfg->m_Repeat.pin_step ); break;
     }
 
     pin->Move( step );
 
     wxString nextName = pin->GetName();
-    IncrementString( nextName, settings->m_Repeat.label_delta );
+    IncrementString( nextName, cfg->m_Repeat.label_delta );
     pin->SetName( nextName );
 
     wxString nextNumber = pin->GetNumber();
-    IncrementString( nextNumber, settings->m_Repeat.label_delta );
+    IncrementString( nextNumber, cfg->m_Repeat.label_delta );
     pin->SetNumber( nextNumber );
 
     if( m_frame->SynchronizePins() )
diff --git a/eeschema/widgets/design_block_preview_widget.cpp b/eeschema/widgets/design_block_preview_widget.cpp
index a9b1af086c..e0b17925eb 100644
--- a/eeschema/widgets/design_block_preview_widget.cpp
+++ b/eeschema/widgets/design_block_preview_widget.cpp
@@ -48,8 +48,9 @@ DESIGN_BLOCK_PREVIEW_WIDGET::DESIGN_BLOCK_PREVIEW_WIDGET( wxWindow* aParent, boo
         m_statusSizer( nullptr ),
         m_previewItem( nullptr )
 {
-    auto common_settings = Pgm().GetCommonSettings();
-    auto app_settings = Pgm().GetSettingsManager().GetAppSettings<EESCHEMA_SETTINGS>();
+    SETTINGS_MANAGER&  mgr = Pgm().GetSettingsManager();
+    COMMON_SETTINGS*   common_settings = Pgm().GetCommonSettings();
+    EESCHEMA_SETTINGS* app_settings = mgr.GetAppSettings<EESCHEMA_SETTINGS>( "eeschema" );
 
     m_galDisplayOptions.ReadConfig( *common_settings, app_settings->m_Window, this );
     m_galDisplayOptions.m_forceDisplayCursor = false;
diff --git a/eeschema/widgets/panel_design_block_chooser.cpp b/eeschema/widgets/panel_design_block_chooser.cpp
index 325a1644b1..02876c5d15 100644
--- a/eeschema/widgets/panel_design_block_chooser.cpp
+++ b/eeschema/widgets/panel_design_block_chooser.cpp
@@ -64,7 +64,7 @@ PANEL_DESIGN_BLOCK_CHOOSER::PANEL_DESIGN_BLOCK_CHOOSER( SCH_EDIT_FRAME* aFrame,
     DESIGN_BLOCK_LIB_TABLE* libs = m_frame->Prj().DesignBlockLibs();
 
     // Make sure settings are loaded before we start running multi-threaded design block loaders
-    Pgm().GetSettingsManager().GetAppSettings<EESCHEMA_SETTINGS>();
+    Pgm().GetSettingsManager().GetAppSettings<EESCHEMA_SETTINGS>( "eeschema" );
 
     // Load design block files:
     WX_PROGRESS_REPORTER* progressReporter =
diff --git a/eeschema/widgets/panel_symbol_chooser.cpp b/eeschema/widgets/panel_symbol_chooser.cpp
index 5f7c5d5ffa..ddbfbd188a 100644
--- a/eeschema/widgets/panel_symbol_chooser.cpp
+++ b/eeschema/widgets/panel_symbol_chooser.cpp
@@ -79,8 +79,8 @@ PANEL_SYMBOL_CHOOSER::PANEL_SYMBOL_CHOOSER( SCH_BASE_FRAME* aFrame, wxWindow* aP
     PROJECT_FILE&             project = m_frame->Prj().GetProjectFile();
 
     // Make sure settings are loaded before we start running multi-threaded symbol loaders
-    Pgm().GetSettingsManager().GetAppSettings<EESCHEMA_SETTINGS>();
-    Pgm().GetSettingsManager().GetAppSettings<SYMBOL_EDITOR_SETTINGS>();
+    Pgm().GetSettingsManager().GetAppSettings<EESCHEMA_SETTINGS>( "eeschema" );
+    Pgm().GetSettingsManager().GetAppSettings<SYMBOL_EDITOR_SETTINGS>( "symbol_editor" );
 
     m_adapter = SYMBOL_TREE_MODEL_ADAPTER::Create( m_frame, libs );
     SYMBOL_TREE_MODEL_ADAPTER* adapter = static_cast<SYMBOL_TREE_MODEL_ADAPTER*>( m_adapter.get() );
@@ -374,7 +374,9 @@ wxPanel* PANEL_SYMBOL_CHOOSER::constructRightPanel( wxWindow* aParent )
     }
     else
     {
-        EESCHEMA_SETTINGS* cfg = Pgm().GetSettingsManager().GetAppSettings<EESCHEMA_SETTINGS>();
+        SETTINGS_MANAGER&  mgr = Pgm().GetSettingsManager();
+        EESCHEMA_SETTINGS* cfg = mgr.GetAppSettings<EESCHEMA_SETTINGS>( "eeschema" );
+
         backend = (EDA_DRAW_PANEL_GAL::GAL_TYPE) cfg->m_Graphics.canvas_type;
     }
 
diff --git a/eeschema/widgets/symbol_preview_widget.cpp b/eeschema/widgets/symbol_preview_widget.cpp
index 161aa589fb..59bef5b7aa 100644
--- a/eeschema/widgets/symbol_preview_widget.cpp
+++ b/eeschema/widgets/symbol_preview_widget.cpp
@@ -45,8 +45,9 @@ SYMBOL_PREVIEW_WIDGET::SYMBOL_PREVIEW_WIDGET( wxWindow* aParent, KIWAY* aKiway,
         m_statusSizer( nullptr ),
         m_previewItem( nullptr )
 {
-    auto common_settings = Pgm().GetCommonSettings();
-    auto app_settings = Pgm().GetSettingsManager().GetAppSettings<EESCHEMA_SETTINGS>();
+    SETTINGS_MANAGER&  mgr = Pgm().GetSettingsManager();
+    COMMON_SETTINGS*   common_settings = Pgm().GetCommonSettings();
+    EESCHEMA_SETTINGS* app_settings = mgr.GetAppSettings<EESCHEMA_SETTINGS>( "eeschema" );
 
     m_galDisplayOptions.ReadConfig( *common_settings, app_settings->m_Window, this );
     m_galDisplayOptions.m_forceDisplayCursor = false;
diff --git a/gerbview/dialogs/panel_gerbview_color_settings.cpp b/gerbview/dialogs/panel_gerbview_color_settings.cpp
index 3efc302b5c..063757810d 100644
--- a/gerbview/dialogs/panel_gerbview_color_settings.cpp
+++ b/gerbview/dialogs/panel_gerbview_color_settings.cpp
@@ -32,7 +32,7 @@ PANEL_GERBVIEW_COLOR_SETTINGS::PANEL_GERBVIEW_COLOR_SETTINGS( wxWindow* aParent
     m_colorNamespace = "gerbview";
 
     SETTINGS_MANAGER&  mgr          = Pgm().GetSettingsManager();
-    GERBVIEW_SETTINGS* app_settings = mgr.GetAppSettings<GERBVIEW_SETTINGS>();
+    GERBVIEW_SETTINGS* app_settings = mgr.GetAppSettings<GERBVIEW_SETTINGS>( "gerbview" );
     COLOR_SETTINGS*    current      = mgr.GetColorSettings( app_settings->m_ColorTheme );
 
     // Colors can also be modified from the LayersManager, so collect last settings if exist
@@ -75,9 +75,10 @@ PANEL_GERBVIEW_COLOR_SETTINGS::~PANEL_GERBVIEW_COLOR_SETTINGS()
 
 bool PANEL_GERBVIEW_COLOR_SETTINGS::TransferDataFromWindow()
 {
-    SETTINGS_MANAGER&   mgr = Pgm().GetSettingsManager();
-    GERBVIEW_SETTINGS*  app_settings = mgr.GetAppSettings<GERBVIEW_SETTINGS>();
-    app_settings->m_ColorTheme = m_currentSettings->GetFilename();
+    SETTINGS_MANAGER&  mgr = Pgm().GetSettingsManager();
+    GERBVIEW_SETTINGS* cfg = mgr.GetAppSettings<GERBVIEW_SETTINGS>( "gerbview" );
+
+    cfg->m_ColorTheme = m_currentSettings->GetFilename();
 
     return true;
 }
diff --git a/gerbview/dialogs/panel_gerbview_display_options.cpp b/gerbview/dialogs/panel_gerbview_display_options.cpp
index 9c5af9bd68..0363c31e15 100644
--- a/gerbview/dialogs/panel_gerbview_display_options.cpp
+++ b/gerbview/dialogs/panel_gerbview_display_options.cpp
@@ -43,7 +43,8 @@ static const wxChar* gerberPageSizeList[] =
 PANEL_GERBVIEW_DISPLAY_OPTIONS::PANEL_GERBVIEW_DISPLAY_OPTIONS( wxWindow* aParent ) :
     PANEL_GERBVIEW_DISPLAY_OPTIONS_BASE( aParent, wxID_ANY )
 {
-    GERBVIEW_SETTINGS* cfg = Pgm().GetSettingsManager().GetAppSettings<GERBVIEW_SETTINGS>();
+    SETTINGS_MANAGER&  mgr = Pgm().GetSettingsManager();
+    GERBVIEW_SETTINGS* cfg = mgr.GetAppSettings<GERBVIEW_SETTINGS>( "gerbview" );
 
     m_galOptsPanel = new GAL_OPTIONS_PANEL( this, cfg );
     m_galOptionsSizer->Add( m_galOptsPanel, 0, wxEXPAND|wxRIGHT, 15 );
@@ -78,7 +79,8 @@ bool PANEL_GERBVIEW_DISPLAY_OPTIONS::TransferDataToWindow()
 {
     m_galOptsPanel->TransferDataToWindow();
 
-    GERBVIEW_SETTINGS* cfg = Pgm().GetSettingsManager().GetAppSettings<GERBVIEW_SETTINGS>();
+    SETTINGS_MANAGER&  mgr = Pgm().GetSettingsManager();
+    GERBVIEW_SETTINGS* cfg = mgr.GetAppSettings<GERBVIEW_SETTINGS>( "gerbview" );
 
     loadSettings( cfg );
 
@@ -88,7 +90,8 @@ bool PANEL_GERBVIEW_DISPLAY_OPTIONS::TransferDataToWindow()
 
 bool PANEL_GERBVIEW_DISPLAY_OPTIONS::TransferDataFromWindow()
 {
-    GERBVIEW_SETTINGS* cfg = Pgm().GetSettingsManager().GetAppSettings<GERBVIEW_SETTINGS>();
+    SETTINGS_MANAGER&  mgr = Pgm().GetSettingsManager();
+    GERBVIEW_SETTINGS* cfg = mgr.GetAppSettings<GERBVIEW_SETTINGS>( "gerbview" );
 
     m_galOptsPanel->TransferDataFromWindow();
 
diff --git a/gerbview/dialogs/panel_gerbview_excellon_settings.cpp b/gerbview/dialogs/panel_gerbview_excellon_settings.cpp
index 25292764d3..703e92c26d 100644
--- a/gerbview/dialogs/panel_gerbview_excellon_settings.cpp
+++ b/gerbview/dialogs/panel_gerbview_excellon_settings.cpp
@@ -39,9 +39,11 @@ PANEL_GERBVIEW_EXCELLON_SETTINGS::PANEL_GERBVIEW_EXCELLON_SETTINGS( wxWindow* aP
 
 bool PANEL_GERBVIEW_EXCELLON_SETTINGS::TransferDataToWindow( )
 {
-    GERBVIEW_SETTINGS* config = Pgm().GetSettingsManager().GetAppSettings<GERBVIEW_SETTINGS>();
+    SETTINGS_MANAGER&  mgr = Pgm().GetSettingsManager();
+    GERBVIEW_SETTINGS* cfg = mgr.GetAppSettings<GERBVIEW_SETTINGS>( "gerbview" );
     EXCELLON_DEFAULTS  curr_settings;
-    config->GetExcellonDefaults( curr_settings );
+
+    cfg->GetExcellonDefaults( curr_settings );
 
     applySettingsToPanel( curr_settings );
 
@@ -51,16 +53,17 @@ bool PANEL_GERBVIEW_EXCELLON_SETTINGS::TransferDataToWindow( )
 
 bool PANEL_GERBVIEW_EXCELLON_SETTINGS::TransferDataFromWindow()
 {
-    GERBVIEW_SETTINGS* config = Pgm().GetSettingsManager().GetAppSettings<GERBVIEW_SETTINGS>();
+    SETTINGS_MANAGER&  mgr = Pgm().GetSettingsManager();
+    GERBVIEW_SETTINGS* cfg = mgr.GetAppSettings<GERBVIEW_SETTINGS>( "gerbview" );
 
-    config->m_ExcellonDefaults.m_UnitsMM = m_rbUnits->GetSelection() != 0;
-    config->m_ExcellonDefaults.m_LeadingZero = m_rbZeroFormat->GetSelection();
+    cfg->m_ExcellonDefaults.m_UnitsMM = m_rbUnits->GetSelection() != 0;
+    cfg->m_ExcellonDefaults.m_LeadingZero = m_rbZeroFormat->GetSelection();
     // The first value of these param is 2, not 0
     #define FIRST_VALUE 2
-    config->m_ExcellonDefaults.m_MmIntegerLen = m_choiceIntegerMM->GetSelection()+FIRST_VALUE;
-    config->m_ExcellonDefaults.m_MmMantissaLen = m_choiceMantissaMM->GetSelection()+FIRST_VALUE;
-    config->m_ExcellonDefaults.m_InchIntegerLen = m_choiceIntegerInch->GetSelection()+FIRST_VALUE;
-    config->m_ExcellonDefaults.m_InchMantissaLen = m_choiceMantissaInch->GetSelection()+FIRST_VALUE;
+    cfg->m_ExcellonDefaults.m_MmIntegerLen = m_choiceIntegerMM->GetSelection()+FIRST_VALUE;
+    cfg->m_ExcellonDefaults.m_MmMantissaLen = m_choiceMantissaMM->GetSelection()+FIRST_VALUE;
+    cfg->m_ExcellonDefaults.m_InchIntegerLen = m_choiceIntegerInch->GetSelection()+FIRST_VALUE;
+    cfg->m_ExcellonDefaults.m_InchMantissaLen = m_choiceMantissaInch->GetSelection()+FIRST_VALUE;
 
     return true;
 }
diff --git a/gerbview/gerbview.cpp b/gerbview/gerbview.cpp
index 6b3f5bd149..bc2d543671 100644
--- a/gerbview/gerbview.cpp
+++ b/gerbview/gerbview.cpp
@@ -79,7 +79,7 @@ static struct IFACE : public KIFACE_BASE, public UNITS_PROVIDER
         case PANEL_GBR_GRIDS:
         {
             SETTINGS_MANAGER&  mgr = Pgm().GetSettingsManager();
-            APP_SETTINGS_BASE* cfg = mgr.GetAppSettings<GERBVIEW_SETTINGS>();
+            GERBVIEW_SETTINGS* cfg = mgr.GetAppSettings<GERBVIEW_SETTINGS>( "gerbview" );
             EDA_BASE_FRAME*    frame = aKiway->Player( FRAME_GERBER, false );
 
             if( frame )
diff --git a/gerbview/gerbview_frame.cpp b/gerbview/gerbview_frame.cpp
index 709aefe694..ca5ab6f8fb 100644
--- a/gerbview/gerbview_frame.cpp
+++ b/gerbview/gerbview_frame.cpp
@@ -392,7 +392,7 @@ void GERBVIEW_FRAME::SaveSettings( APP_SETTINGS_BASE* aCfg )
 COLOR_SETTINGS* GERBVIEW_FRAME::GetColorSettings( bool aForceRefresh ) const
 {
     SETTINGS_MANAGER&  mgr = Pgm().GetSettingsManager();
-    GERBVIEW_SETTINGS* cfg = mgr.GetAppSettings<GERBVIEW_SETTINGS>();
+    GERBVIEW_SETTINGS* cfg = mgr.GetAppSettings<GERBVIEW_SETTINGS>( "gerbview" );
     wxString currentTheme = cfg->m_ColorTheme;
     return mgr.GetColorSettings( currentTheme );
 }
@@ -1215,7 +1215,9 @@ void GERBVIEW_FRAME::CommonSettingsChanged( bool aEnvVarsChanged, bool aTextVars
     EDA_DRAW_FRAME::CommonSettingsChanged( aEnvVarsChanged, aTextVarsChanged );
 
     // Update gal display options like cursor shape, grid options:
-    GERBVIEW_SETTINGS* cfg = Pgm().GetSettingsManager().GetAppSettings<GERBVIEW_SETTINGS>();
+    SETTINGS_MANAGER&  mgr = Pgm().GetSettingsManager();
+    GERBVIEW_SETTINGS* cfg = mgr.GetAppSettings<GERBVIEW_SETTINGS>( "gerbview" );
+
     GetGalDisplayOptions().ReadWindowSettings( cfg->m_Window );
 
     SetPageSettings( PAGE_INFO( gvconfig()->m_Appearance.page_type ) );
diff --git a/gerbview/gerbview_painter.cpp b/gerbview/gerbview_painter.cpp
index 8a2960c732..8700e01800 100644
--- a/gerbview/gerbview_painter.cpp
+++ b/gerbview/gerbview_painter.cpp
@@ -37,7 +37,7 @@ using namespace KIGFX;
 
 GERBVIEW_SETTINGS* gvconfig()
 {
-    return Pgm().GetSettingsManager().GetAppSettings<GERBVIEW_SETTINGS>();
+    return Pgm().GetSettingsManager().GetAppSettings<GERBVIEW_SETTINGS>( "gerbview" );
 }
 
 
diff --git a/include/settings/settings_manager.h b/include/settings/settings_manager.h
index d2615e0697..2ad27f33db 100644
--- a/include/settings/settings_manager.h
+++ b/include/settings/settings_manager.h
@@ -93,11 +93,12 @@ public:
      * settings manager and returns a pointer to it.
      *
      * @tparam T is a type derived from APP_SETTINGS_BASE
-     * @param aLoadNow is true to load the registered file from disk immediately
+     * @param aFilename is used to find the correct settings under clang (where
+     *                  RTTI doesn't work across compile boundaries)
      * @return a pointer to a loaded settings object
      */
     template<typename T>
-    T* GetAppSettings()
+    T* GetAppSettings( const wxString& aFilename )
     {
         T*     ret      = nullptr;
         size_t typeHash = typeid( T ).hash_code();
@@ -108,11 +109,19 @@ public:
         if( ret )
             return ret;
 
+#if defined(__clang__)
+        auto it = std::find_if( m_settings.begin(), m_settings.end(),
+                                [&]( const std::unique_ptr<JSON_SETTINGS>& aSettings )
+                                {
+                                    return aSettings->GetFilename() == aFilename;
+                                } );
+#else
         auto it = std::find_if( m_settings.begin(), m_settings.end(),
                                 []( const std::unique_ptr<JSON_SETTINGS>& aSettings )
                                 {
                                     return dynamic_cast<T*>( aSettings.get() );
                                 } );
+#endif
 
         if( it != m_settings.end() )
         {
@@ -128,42 +137,6 @@ public:
         return ret;
     }
 
-    template<typename T>
-    T* GetAppSettings( const wxString& aFilename )
-    {
-#ifndef __WXMAC__
-        return GetAppSettings<T>();
-#else
-        T*     ret      = nullptr;
-        size_t typeHash = typeid( T ).hash_code();
-
-         if( m_app_settings_cache.count( typeHash ) )
-            ret = static_cast<T*>( m_app_settings_cache.at( typeHash ) );
-
-        if( ret )
-            return ret;
-
-        auto it = std::find_if( m_settings.begin(), m_settings.end(),
-                                [&]( const std::unique_ptr<JSON_SETTINGS>& aSettings )
-                                {
-                                    return aSettings->GetFilename() == aFilename;
-                                } );
-
-        if( it != m_settings.end() )
-        {
-            ret = static_cast<T*>( it->get() );
-        }
-        else
-        {
-            throw std::runtime_error( "Tried to GetAppSettings before registering" );
-        }
-
-        m_app_settings_cache[typeHash] = ret;
-
-        return ret;
-#endif
-    }
-
     /**
      * Retrieves a color settings object that applications can read colors from.
      * If the given settings file cannot be found, returns the default settings.
diff --git a/kicad/dialogs/dialog_update_check_prompt.cpp b/kicad/dialogs/dialog_update_check_prompt.cpp
index d7c0632913..b33ff70085 100644
--- a/kicad/dialogs/dialog_update_check_prompt.cpp
+++ b/kicad/dialogs/dialog_update_check_prompt.cpp
@@ -39,7 +39,7 @@ DIALOG_UPDATE_CHECK_PROMPT::DIALOG_UPDATE_CHECK_PROMPT( wxWindow* aWindow ) :
 bool DIALOG_UPDATE_CHECK_PROMPT::TransferDataFromWindow()
 {
     SETTINGS_MANAGER& mgr = Pgm().GetSettingsManager();
-    KICAD_SETTINGS*   settings = mgr.GetAppSettings<KICAD_SETTINGS>();
+    KICAD_SETTINGS*   settings = mgr.GetAppSettings<KICAD_SETTINGS>( "kicad" );
 
     settings->m_PcmUpdateCheck = m_cbPCMUpdates->GetValue();
 #ifndef KICAD_UPDATE_CHECK
diff --git a/kicad/pcm/dialogs/dialog_pcm.cpp b/kicad/pcm/dialogs/dialog_pcm.cpp
index 628b21ad58..29f98d5d9b 100644
--- a/kicad/pcm/dialogs/dialog_pcm.cpp
+++ b/kicad/pcm/dialogs/dialog_pcm.cpp
@@ -244,9 +244,9 @@ void DIALOG_PCM::OnManageRepositoriesClicked( wxCommandEvent& event )
         m_pcm->SetRepositoryList( dialog_data );
 
         SETTINGS_MANAGER& mgr = Pgm().GetSettingsManager();
-        KICAD_SETTINGS*   app_settings = mgr.GetAppSettings<KICAD_SETTINGS>();
+        KICAD_SETTINGS*   cfg = mgr.GetAppSettings<KICAD_SETTINGS>( "kicad" );
 
-        app_settings->m_PcmRepositories = std::move( dialog_data );
+        cfg->m_PcmRepositories = std::move( dialog_data );
 
         setRepositoryListFromPcm();
     }
diff --git a/kicad/pcm/dialogs/panel_packages_view.cpp b/kicad/pcm/dialogs/panel_packages_view.cpp
index f07aeaa8eb..3252a04465 100644
--- a/kicad/pcm/dialogs/panel_packages_view.cpp
+++ b/kicad/pcm/dialogs/panel_packages_view.cpp
@@ -524,10 +524,10 @@ void PANEL_PACKAGES_VIEW::OnDownloadVersionClicked( wxCommandEvent& event )
     const wxString& url = *ver_it->download_url;
 
     SETTINGS_MANAGER& mgr = Pgm().GetSettingsManager();
-    KICAD_SETTINGS*   app_settings = mgr.GetAppSettings<KICAD_SETTINGS>();
+    KICAD_SETTINGS*   cfg = mgr.GetAppSettings<KICAD_SETTINGS>( "kicad" );
 
     wxWindow* topLevelParent = wxGetTopLevelParent( this );
-    wxFileDialog dialog( topLevelParent, _( "Save Package" ), app_settings->m_PcmLastDownloadDir,
+    wxFileDialog dialog( topLevelParent, _( "Save Package" ), cfg->m_PcmLastDownloadDir,
                          wxString::Format( wxT( "%s_v%s.zip" ), package.identifier, version ),
                          wxT( "ZIP files (*.zip)|*.zip" ), wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
 
@@ -535,7 +535,7 @@ void PANEL_PACKAGES_VIEW::OnDownloadVersionClicked( wxCommandEvent& event )
         return;
 
     wxString path = dialog.GetPath();
-    app_settings->m_PcmLastDownloadDir = wxPathOnly( path );
+    cfg->m_PcmLastDownloadDir = wxPathOnly( path );
 
     std::ofstream output( path.ToUTF8(), std::ios_base::binary );
 
diff --git a/kicad/tools/kicad_manager_control.cpp b/kicad/tools/kicad_manager_control.cpp
index 7b6fe8fbcd..b137e5079f 100644
--- a/kicad/tools/kicad_manager_control.cpp
+++ b/kicad/tools/kicad_manager_control.cpp
@@ -225,7 +225,8 @@ int KICAD_MANAGER_CONTROL::NewJobsetFile( const TOOL_EVENT& aEvent )
 
 int KICAD_MANAGER_CONTROL::NewFromTemplate( const TOOL_EVENT& aEvent )
 {
-    KICAD_SETTINGS* settings = Pgm().GetSettingsManager().GetAppSettings<KICAD_SETTINGS>();
+    SETTINGS_MANAGER&         mgr = Pgm().GetSettingsManager();
+    KICAD_SETTINGS*           settings = mgr.GetAppSettings<KICAD_SETTINGS>( "kicad" );
     DIALOG_TEMPLATE_SELECTOR* ps = new DIALOG_TEMPLATE_SELECTOR( m_frame, settings->m_TemplateWindowPos,
                                                                 settings->m_TemplateWindowSize );
 
@@ -942,7 +943,8 @@ int KICAD_MANAGER_CONTROL::ShowPluginManager( const TOOL_EVENT& aEvent )
         m_frame->Kiway().ExpressMail( FRAME_PCB_EDITOR, MAIL_RELOAD_PLUGINS, payload );
     }
 
-    KICAD_SETTINGS* settings = Pgm().GetSettingsManager().GetAppSettings<KICAD_SETTINGS>();
+    SETTINGS_MANAGER& mgr = Pgm().GetSettingsManager();
+    KICAD_SETTINGS*   settings = mgr.GetAppSettings<KICAD_SETTINGS>( "kicad" );
 
     if( changed.count( PCM_PACKAGE_TYPE::PT_LIBRARY )
         && ( settings->m_PcmLibAutoAdd || settings->m_PcmLibAutoRemove ) )
diff --git a/kicad/update_manager.cpp b/kicad/update_manager.cpp
index 8a0853575b..bb9bb24dbe 100644
--- a/kicad/update_manager.cpp
+++ b/kicad/update_manager.cpp
@@ -201,7 +201,8 @@ void UPDATE_MANAGER::CheckForUpdate( wxWindow* aNoticeParent )
         requestContent.current_version = verString;
         requestContent.lang = Pgm().GetLanguageTag();
 
-        KICAD_SETTINGS* settings = Pgm().GetSettingsManager().GetAppSettings<KICAD_SETTINGS>();
+        SETTINGS_MANAGER& mgr = Pgm().GetSettingsManager();
+        KICAD_SETTINGS*   settings = mgr.GetAppSettings<KICAD_SETTINGS>( "kicad" );
 
         requestContent.last_check = settings->m_lastUpdateCheckTime;
 
@@ -240,8 +241,8 @@ void UPDATE_MANAGER::CheckForUpdate( wxWindow* aNoticeParent )
                                     // basically saving the last received update prevents us from
                                     // prompting again
                                     SETTINGS_MANAGER& mgr = Pgm().GetSettingsManager();
-                                    KICAD_SETTINGS*   curr_settings = mgr.GetAppSettings<KICAD_SETTINGS>();
-                                    curr_settings->m_lastReceivedUpdate = response.version;
+                                    KICAD_SETTINGS*   cfg = mgr.GetAppSettings<KICAD_SETTINGS>( "kicad" );
+                                    cfg->m_lastReceivedUpdate = response.version;
                                 }
                             } );
                 }
diff --git a/pagelayout_editor/dialogs/panel_pl_editor_color_settings.cpp b/pagelayout_editor/dialogs/panel_pl_editor_color_settings.cpp
index f6ed4bbf7a..635e07c586 100644
--- a/pagelayout_editor/dialogs/panel_pl_editor_color_settings.cpp
+++ b/pagelayout_editor/dialogs/panel_pl_editor_color_settings.cpp
@@ -31,9 +31,9 @@ PANEL_PL_EDITOR_COLOR_SETTINGS::PANEL_PL_EDITOR_COLOR_SETTINGS( wxWindow* aParen
 
 bool PANEL_PL_EDITOR_COLOR_SETTINGS::TransferDataToWindow()
 {
-    PL_EDITOR_SETTINGS* cfg = Pgm().GetSettingsManager().GetAppSettings<PL_EDITOR_SETTINGS>();
-
-    COLOR_SETTINGS* current = Pgm().GetSettingsManager().GetColorSettings( cfg->m_ColorTheme );
+    SETTINGS_MANAGER&   mgr = Pgm().GetSettingsManager();
+    PL_EDITOR_SETTINGS* cfg = mgr.GetAppSettings<PL_EDITOR_SETTINGS>( "pl_editor" );
+    COLOR_SETTINGS*     current = Pgm().GetSettingsManager().GetColorSettings( cfg->m_ColorTheme );
 
     int width    = 0;
     int height   = 0;
@@ -66,9 +66,11 @@ bool PANEL_PL_EDITOR_COLOR_SETTINGS::TransferDataFromWindow()
 
     if( sel >= 0 )
     {
-        SETTINGS_MANAGER& mgr = Pgm().GetSettingsManager();
-        COLOR_SETTINGS*   colors = static_cast<COLOR_SETTINGS*>( m_themes->GetClientData( sel ) );
-        mgr.GetAppSettings<PL_EDITOR_SETTINGS>()->m_ColorTheme = colors->GetFilename();
+        SETTINGS_MANAGER&   mgr = Pgm().GetSettingsManager();
+        PL_EDITOR_SETTINGS* cfg = mgr.GetAppSettings<PL_EDITOR_SETTINGS>( "pl_editor" );
+        COLOR_SETTINGS*     colors = static_cast<COLOR_SETTINGS*>( m_themes->GetClientData( sel ) );
+
+        cfg->m_ColorTheme = colors->GetFilename();
     }
 
     return true;
diff --git a/pagelayout_editor/pl_draw_panel_gal.cpp b/pagelayout_editor/pl_draw_panel_gal.cpp
index f93afcea94..16c42962fa 100644
--- a/pagelayout_editor/pl_draw_panel_gal.cpp
+++ b/pagelayout_editor/pl_draw_panel_gal.cpp
@@ -54,9 +54,10 @@ PL_DRAW_PANEL_GAL::PL_DRAW_PANEL_GAL( wxWindow* aParentWindow, wxWindowID aWindo
 
     m_painter = std::make_unique<KIGFX::DS_PAINTER>( m_gal );
 
-    SETTINGS_MANAGER&   settingsManager = Pgm().GetSettingsManager();
-    PL_EDITOR_SETTINGS* cfg = settingsManager.GetAppSettings<PL_EDITOR_SETTINGS>();
-    m_painter->GetSettings()->LoadColors( settingsManager.GetColorSettings( cfg->m_ColorTheme ) );
+    SETTINGS_MANAGER&   mgr = Pgm().GetSettingsManager();
+    PL_EDITOR_SETTINGS* cfg = mgr.GetAppSettings<PL_EDITOR_SETTINGS>( "pl_editor" );
+
+    m_painter->GetSettings()->LoadColors( mgr.GetColorSettings( cfg->m_ColorTheme ) );
 
     m_view->SetPainter( m_painter.get() );
     // This fixes the zoom in and zoom out limits
diff --git a/pagelayout_editor/pl_editor.cpp b/pagelayout_editor/pl_editor.cpp
index 0d5bc1c068..223b2d1a25 100644
--- a/pagelayout_editor/pl_editor.cpp
+++ b/pagelayout_editor/pl_editor.cpp
@@ -65,7 +65,7 @@ static struct IFACE : public KIFACE_BASE, public UNITS_PROVIDER
         case PANEL_DS_DISPLAY_OPTIONS:
         {
             SETTINGS_MANAGER&  mgr = Pgm().GetSettingsManager();
-            APP_SETTINGS_BASE* cfg = mgr.GetAppSettings<PL_EDITOR_SETTINGS>();
+            APP_SETTINGS_BASE* cfg = mgr.GetAppSettings<PL_EDITOR_SETTINGS>( "pl_editor" );
 
             return new PANEL_PL_EDITOR_DISPLAY_OPTIONS( aParent, cfg );
         }
@@ -73,7 +73,7 @@ static struct IFACE : public KIFACE_BASE, public UNITS_PROVIDER
         case PANEL_DS_GRIDS:
         {
             SETTINGS_MANAGER&  mgr = Pgm().GetSettingsManager();
-            APP_SETTINGS_BASE* cfg = mgr.GetAppSettings<PL_EDITOR_SETTINGS>();
+            APP_SETTINGS_BASE* cfg = mgr.GetAppSettings<PL_EDITOR_SETTINGS>( "pl_editor" );
             EDA_BASE_FRAME*    frame = aKiway->Player( FRAME_PL_EDITOR, false );
 
             if( frame )
diff --git a/pagelayout_editor/pl_editor_frame.cpp b/pagelayout_editor/pl_editor_frame.cpp
index 22e13299fe..6d5710f348 100644
--- a/pagelayout_editor/pl_editor_frame.cpp
+++ b/pagelayout_editor/pl_editor_frame.cpp
@@ -638,9 +638,9 @@ void PL_EDITOR_FRAME::CommonSettingsChanged( bool aEnvVarsChanged, bool aTextVar
 {
     EDA_DRAW_FRAME::CommonSettingsChanged( aEnvVarsChanged, aTextVarsChanged );
 
-    SETTINGS_MANAGER&   settingsManager = Pgm().GetSettingsManager();
-    PL_EDITOR_SETTINGS* cfg = settingsManager.GetAppSettings<PL_EDITOR_SETTINGS>();
-    COLOR_SETTINGS*     colors = settingsManager.GetColorSettings( cfg->m_ColorTheme );
+    SETTINGS_MANAGER&   mgr = Pgm().GetSettingsManager();
+    PL_EDITOR_SETTINGS* cfg = mgr.GetAppSettings<PL_EDITOR_SETTINGS>( "pl_editor" );
+    COLOR_SETTINGS*     colors = mgr.GetColorSettings( cfg->m_ColorTheme );
 
     // Update gal display options like cursor shape, grid options:
     GetGalDisplayOptions().ReadWindowSettings( cfg->m_Window );
diff --git a/pcbnew/dialogs/dialog_export_2581.cpp b/pcbnew/dialogs/dialog_export_2581.cpp
index 6ecb9ecfd7..a605bf341c 100644
--- a/pcbnew/dialogs/dialog_export_2581.cpp
+++ b/pcbnew/dialogs/dialog_export_2581.cpp
@@ -244,7 +244,8 @@ void DIALOG_EXPORT_2581::onDistPNChange( wxCommandEvent& event )
 
 bool DIALOG_EXPORT_2581::Init()
 {
-    PCBNEW_SETTINGS* cfg = Pgm().GetSettingsManager().GetAppSettings<PCBNEW_SETTINGS>();
+    SETTINGS_MANAGER& mgr = Pgm().GetSettingsManager();
+    PCBNEW_SETTINGS*  cfg = mgr.GetAppSettings<PCBNEW_SETTINGS>( "pcbnew" );
 
     std::set<wxString> options;
     BOARD* board = m_parent->GetBoard();
@@ -352,7 +353,8 @@ bool DIALOG_EXPORT_2581::TransferDataFromWindow()
 {
     if( !m_job )
     {
-        PCBNEW_SETTINGS* cfg = Pgm().GetSettingsManager().GetAppSettings<PCBNEW_SETTINGS>();
+        SETTINGS_MANAGER& mgr = Pgm().GetSettingsManager();
+        PCBNEW_SETTINGS*  cfg = mgr.GetAppSettings<PCBNEW_SETTINGS>( "pcbnew" );
 
         cfg->m_Export2581.units = m_choiceUnits->GetSelection();
         cfg->m_Export2581.precision = m_precision->GetValue();
diff --git a/pcbnew/dialogs/dialog_export_odbpp.cpp b/pcbnew/dialogs/dialog_export_odbpp.cpp
index b8a31b9246..ec952d9bcb 100644
--- a/pcbnew/dialogs/dialog_export_odbpp.cpp
+++ b/pcbnew/dialogs/dialog_export_odbpp.cpp
@@ -123,7 +123,8 @@ void DIALOG_EXPORT_ODBPP::onOKClick( wxCommandEvent& event )
 
 bool DIALOG_EXPORT_ODBPP::Init()
 {
-    PCBNEW_SETTINGS* cfg = Pgm().GetSettingsManager().GetAppSettings<PCBNEW_SETTINGS>();
+    SETTINGS_MANAGER& mgr = Pgm().GetSettingsManager();
+    PCBNEW_SETTINGS*  cfg = mgr.GetAppSettings<PCBNEW_SETTINGS>( "pcbnew" );
 
     if( !m_job )
     {
@@ -146,7 +147,8 @@ bool DIALOG_EXPORT_ODBPP::TransferDataFromWindow()
 {
     if( !m_job )
     {
-        PCBNEW_SETTINGS* cfg = Pgm().GetSettingsManager().GetAppSettings<PCBNEW_SETTINGS>();
+        SETTINGS_MANAGER& mgr = Pgm().GetSettingsManager();
+        PCBNEW_SETTINGS*  cfg = mgr.GetAppSettings<PCBNEW_SETTINGS>( "pcbnew" );
 
         cfg->m_ExportODBPP.units = m_choiceUnits->GetSelection();
         cfg->m_ExportODBPP.precision = m_precision->GetValue();
diff --git a/pcbnew/dialogs/dialog_footprint_chooser.cpp b/pcbnew/dialogs/dialog_footprint_chooser.cpp
index cd5c33ea03..7782673540 100644
--- a/pcbnew/dialogs/dialog_footprint_chooser.cpp
+++ b/pcbnew/dialogs/dialog_footprint_chooser.cpp
@@ -188,7 +188,8 @@ void DIALOG_FOOTPRINT_CHOOSER::build3DCanvas()
     // TODO(JE) use all control options
     m_boardAdapter.m_MousewheelPanning = settings->m_Input.scroll_modifier_zoom != 0;
 
-    auto* cfg = Pgm().GetSettingsManager().GetAppSettings<EDA_3D_VIEWER_SETTINGS>( "3d_viewer" );
+    SETTINGS_MANAGER&       mgr = Pgm().GetSettingsManager();
+    EDA_3D_VIEWER_SETTINGS* cfg = mgr.GetAppSettings<EDA_3D_VIEWER_SETTINGS>( "3d_viewer" );
 
     if( cfg )
     {
diff --git a/pcbnew/dialogs/dialog_footprint_wizard_list.cpp b/pcbnew/dialogs/dialog_footprint_wizard_list.cpp
index 4d050071f3..0c0f8f1129 100644
--- a/pcbnew/dialogs/dialog_footprint_wizard_list.cpp
+++ b/pcbnew/dialogs/dialog_footprint_wizard_list.cpp
@@ -52,7 +52,8 @@ DIALOG_FOOTPRINT_WIZARD_LIST::DIALOG_FOOTPRINT_WIZARD_LIST( wxWindow* aParent )
 {
     initLists();
 
-    auto cfg = Pgm().GetSettingsManager().GetAppSettings<PCBNEW_SETTINGS>();
+    SETTINGS_MANAGER& mgr = Pgm().GetSettingsManager();
+    PCBNEW_SETTINGS*  cfg = mgr.GetAppSettings<PCBNEW_SETTINGS>( "pcbnew" );
 
     wxSize size;
     size.x = cfg->m_FootprintWizardList.width;
@@ -68,16 +69,8 @@ DIALOG_FOOTPRINT_WIZARD_LIST::DIALOG_FOOTPRINT_WIZARD_LIST( wxWindow* aParent )
 
 DIALOG_FOOTPRINT_WIZARD_LIST::~DIALOG_FOOTPRINT_WIZARD_LIST()
 {
-    PCBNEW_SETTINGS* cfg = nullptr;
-
-    try
-    {
-        cfg = Pgm().GetSettingsManager().GetAppSettings<PCBNEW_SETTINGS>();
-    }
-    catch( const std::runtime_error& e )
-    {
-        wxFAIL_MSG( e.what() );
-    }
+    SETTINGS_MANAGER& mgr = Pgm().GetSettingsManager();
+    PCBNEW_SETTINGS*  cfg = mgr.GetAppSettings<PCBNEW_SETTINGS>( "pcbnew" );
 
     if( cfg && !IsIconized() )
     {
diff --git a/pcbnew/dialogs/dialog_plot.cpp b/pcbnew/dialogs/dialog_plot.cpp
index c12b1fc3f1..5722111942 100644
--- a/pcbnew/dialogs/dialog_plot.cpp
+++ b/pcbnew/dialogs/dialog_plot.cpp
@@ -1167,7 +1167,7 @@ void DIALOG_PLOT::Plot( wxCommandEvent& event )
         applyPlotSettings();
 
         SETTINGS_MANAGER& mgr = Pgm().GetSettingsManager();
-        PCBNEW_SETTINGS*  cfg = mgr.GetAppSettings<PCBNEW_SETTINGS>();
+        PCBNEW_SETTINGS*  cfg = mgr.GetAppSettings<PCBNEW_SETTINGS>( "pcbnew" );
 
         m_plotOpts.SetColorSettings( mgr.GetColorSettings( cfg->m_ColorTheme ) );
 
diff --git a/pcbnew/dialogs/panel_edit_options.cpp b/pcbnew/dialogs/panel_edit_options.cpp
index c7fc01100f..0ead5be641 100644
--- a/pcbnew/dialogs/panel_edit_options.cpp
+++ b/pcbnew/dialogs/panel_edit_options.cpp
@@ -108,13 +108,13 @@ bool PANEL_EDIT_OPTIONS::TransferDataToWindow()
 
     if( m_isFootprintEditor )
     {
-        FOOTPRINT_EDITOR_SETTINGS* cfg = mgr.GetAppSettings<FOOTPRINT_EDITOR_SETTINGS>();
+        FOOTPRINT_EDITOR_SETTINGS* cfg = mgr.GetAppSettings<FOOTPRINT_EDITOR_SETTINGS>( "fpedit" );
 
         loadFPSettings( cfg );
     }
     else
     {
-        PCBNEW_SETTINGS* cfg = mgr.GetAppSettings<PCBNEW_SETTINGS>();
+        PCBNEW_SETTINGS* cfg = mgr.GetAppSettings<PCBNEW_SETTINGS>( "pcbnew" );
 
         loadPCBSettings( cfg );
     }
@@ -129,7 +129,7 @@ bool PANEL_EDIT_OPTIONS::TransferDataFromWindow()
 
     if( m_isFootprintEditor )
     {
-        FOOTPRINT_EDITOR_SETTINGS* cfg = mgr.GetAppSettings<FOOTPRINT_EDITOR_SETTINGS>();
+        FOOTPRINT_EDITOR_SETTINGS* cfg = mgr.GetAppSettings<FOOTPRINT_EDITOR_SETTINGS>( "fpedit" );
 
         cfg->m_RotationAngle = m_rotationAngle.GetAngleValue();
 
@@ -142,7 +142,7 @@ bool PANEL_EDIT_OPTIONS::TransferDataFromWindow()
     }
     else
     {
-        PCBNEW_SETTINGS* cfg = mgr.GetAppSettings<PCBNEW_SETTINGS>();
+        PCBNEW_SETTINGS* cfg = mgr.GetAppSettings<PCBNEW_SETTINGS>( "pcbnew" );
 
         cfg->m_Display.m_DisplayRatsnestLinesCurved = m_OptDisplayCurvedRatsnestLines->GetValue();
         cfg->m_Display.m_ShowModuleRatsnest = m_showSelectedRatsnest->GetValue();
diff --git a/pcbnew/dialogs/panel_fp_editor_color_settings.cpp b/pcbnew/dialogs/panel_fp_editor_color_settings.cpp
index 0f639dbcea..6ce8b6177d 100644
--- a/pcbnew/dialogs/panel_fp_editor_color_settings.cpp
+++ b/pcbnew/dialogs/panel_fp_editor_color_settings.cpp
@@ -34,8 +34,8 @@ PANEL_FP_EDITOR_COLOR_SETTINGS::PANEL_FP_EDITOR_COLOR_SETTINGS( wxWindow* aParen
     m_colorNamespace = "board";
 
     SETTINGS_MANAGER&          mgr = Pgm().GetSettingsManager();
-    FOOTPRINT_EDITOR_SETTINGS* settings = mgr.GetAppSettings<FOOTPRINT_EDITOR_SETTINGS>();
-    COLOR_SETTINGS*            current  = mgr.GetColorSettings( settings->m_ColorTheme );
+    FOOTPRINT_EDITOR_SETTINGS* cfg = mgr.GetAppSettings<FOOTPRINT_EDITOR_SETTINGS>( "fpedit" );
+    COLOR_SETTINGS*            current  = mgr.GetColorSettings( cfg->m_ColorTheme );
 
     // Store the current settings before reloading below
     current->Store();
@@ -46,7 +46,7 @@ PANEL_FP_EDITOR_COLOR_SETTINGS::PANEL_FP_EDITOR_COLOR_SETTINGS( wxWindow* aParen
     m_currentSettings = new COLOR_SETTINGS( *current );
 
     mgr.ReloadColorSettings();
-    createThemeList( settings->m_ColorTheme );
+    createThemeList( cfg->m_ColorTheme );
 
     m_validLayers.push_back( F_Cu );
     m_validLayers.push_back( In1_Cu );  // "Internal Layers"
@@ -78,9 +78,10 @@ PANEL_FP_EDITOR_COLOR_SETTINGS::~PANEL_FP_EDITOR_COLOR_SETTINGS()
 
 bool PANEL_FP_EDITOR_COLOR_SETTINGS::TransferDataFromWindow()
 {
-    SETTINGS_MANAGER&          settingsMgr = Pgm().GetSettingsManager();
-    FOOTPRINT_EDITOR_SETTINGS* settings = settingsMgr.GetAppSettings<FOOTPRINT_EDITOR_SETTINGS>();
-    settings->m_ColorTheme = m_currentSettings->GetFilename();
+    SETTINGS_MANAGER&          mgr = Pgm().GetSettingsManager();
+    FOOTPRINT_EDITOR_SETTINGS* cfg = mgr.GetAppSettings<FOOTPRINT_EDITOR_SETTINGS>( "fpedit" );
+
+    cfg->m_ColorTheme = m_currentSettings->GetFilename();
 
     return true;
 }
diff --git a/pcbnew/dialogs/panel_fp_editor_defaults.cpp b/pcbnew/dialogs/panel_fp_editor_defaults.cpp
index b42ee54d0e..e30bb6221b 100644
--- a/pcbnew/dialogs/panel_fp_editor_defaults.cpp
+++ b/pcbnew/dialogs/panel_fp_editor_defaults.cpp
@@ -318,7 +318,7 @@ void PANEL_FP_EDITOR_DEFAULTS::loadFPSettings( FOOTPRINT_EDITOR_SETTINGS* aCfg )
 bool PANEL_FP_EDITOR_DEFAULTS::TransferDataToWindow()
 {
     SETTINGS_MANAGER&          mgr = Pgm().GetSettingsManager();
-    FOOTPRINT_EDITOR_SETTINGS* cfg = mgr.GetAppSettings<FOOTPRINT_EDITOR_SETTINGS>();
+    FOOTPRINT_EDITOR_SETTINGS* cfg = mgr.GetAppSettings<FOOTPRINT_EDITOR_SETTINGS>( "fpedit" );
 
     loadFPSettings( cfg );
 
@@ -355,7 +355,7 @@ bool PANEL_FP_EDITOR_DEFAULTS::TransferDataFromWindow()
         return false;
 
     SETTINGS_MANAGER&      mgr = Pgm().GetSettingsManager();
-    BOARD_DESIGN_SETTINGS& cfg = mgr.GetAppSettings<FOOTPRINT_EDITOR_SETTINGS>()->m_DesignSettings;
+    BOARD_DESIGN_SETTINGS& cfg = mgr.GetAppSettings<FOOTPRINT_EDITOR_SETTINGS>( "fpedit" )->m_DesignSettings;
 
     // A minimal value for sizes and thickness:
     const int minWidth = pcbIUScale.mmToIU( MINIMUM_LINE_WIDTH_MM );
diff --git a/pcbnew/dialogs/panel_fp_lib_table.cpp b/pcbnew/dialogs/panel_fp_lib_table.cpp
index 08d1b2bc20..977788eba4 100644
--- a/pcbnew/dialogs/panel_fp_lib_table.cpp
+++ b/pcbnew/dialogs/panel_fp_lib_table.cpp
@@ -317,7 +317,8 @@ protected:
 
 void PANEL_FP_LIB_TABLE::setupGrid( WX_GRID* aGrid )
 {
-    PCBNEW_SETTINGS* cfg = Pgm().GetSettingsManager().GetAppSettings<PCBNEW_SETTINGS>();
+    SETTINGS_MANAGER& mgr = Pgm().GetSettingsManager();
+    PCBNEW_SETTINGS*  cfg = mgr.GetAppSettings<PCBNEW_SETTINGS>( "pcbnew" );
 
     auto autoSizeCol = [&]( WX_GRID* aLocGrid, int aCol )
     {
@@ -408,7 +409,8 @@ PANEL_FP_LIB_TABLE::PANEL_FP_LIB_TABLE( DIALOG_EDIT_LIBRARY_TABLES* aParent, PRO
         m_pluginChoices.Add( PCB_IO_MGR::ShowType( fileType ) );
 
 
-    PCBNEW_SETTINGS* cfg = Pgm().GetSettingsManager().GetAppSettings<PCBNEW_SETTINGS>();
+    SETTINGS_MANAGER& mgr = Pgm().GetSettingsManager();
+    PCBNEW_SETTINGS*  cfg = mgr.GetAppSettings<PCBNEW_SETTINGS>( "pcbnew" );
 
     if( cfg->m_lastFootprintLibDir.IsEmpty() )
         cfg->m_lastFootprintLibDir = PATHS::GetDefaultUserFootprintsPath();
@@ -951,7 +953,8 @@ void PANEL_FP_LIB_TABLE::browseLibrariesHandler( wxCommandEvent& event )
     }
 
     const IO_BASE::IO_FILE_DESC& fileDesc = m_supportedFpFiles.at( fileType );
-    PCBNEW_SETTINGS*        cfg = Pgm().GetSettingsManager().GetAppSettings<PCBNEW_SETTINGS>();
+    SETTINGS_MANAGER&            mgr = Pgm().GetSettingsManager();
+    PCBNEW_SETTINGS*             cfg = mgr.GetAppSettings<PCBNEW_SETTINGS>( "pcbnew" );
 
     wxString title = wxString::Format( _( "Select %s Library" ), PCB_IO_MGR::ShowType( fileType ) );
     wxString openDir = cfg->m_lastFootprintLibDir;
diff --git a/pcbnew/dialogs/panel_fp_properties_3d_model.cpp b/pcbnew/dialogs/panel_fp_properties_3d_model.cpp
index a668ca7209..a0398c1676 100644
--- a/pcbnew/dialogs/panel_fp_properties_3d_model.cpp
+++ b/pcbnew/dialogs/panel_fp_properties_3d_model.cpp
@@ -84,7 +84,8 @@ PANEL_FP_PROPERTIES_3D_MODEL::PANEL_FP_PROPERTIES_3D_MODEL( PCB_BASE_EDIT_FRAME*
     m_modelsGrid->PushEventHandler( trick );
 
     // Get the last 3D directory
-    PCBNEW_SETTINGS* cfg = Pgm().GetSettingsManager().GetAppSettings<PCBNEW_SETTINGS>();
+    SETTINGS_MANAGER& mgr = Pgm().GetSettingsManager();
+    PCBNEW_SETTINGS*  cfg = mgr.GetAppSettings<PCBNEW_SETTINGS>( "pcbnew" );
 
     if( cfg->m_lastFootprint3dDir.IsEmpty() )
     {
diff --git a/pcbnew/dialogs/panel_pcb_display_options.cpp b/pcbnew/dialogs/panel_pcb_display_options.cpp
index 0e161cfb2d..a798175359 100644
--- a/pcbnew/dialogs/panel_pcb_display_options.cpp
+++ b/pcbnew/dialogs/panel_pcb_display_options.cpp
@@ -69,7 +69,7 @@ bool PANEL_PCB_DISPLAY_OPTIONS::TransferDataToWindow()
     if( m_isPCBEdit )
     {
         SETTINGS_MANAGER& mgr = Pgm().GetSettingsManager();
-        PCBNEW_SETTINGS*  cfg = mgr.GetAppSettings<PCBNEW_SETTINGS>();
+        PCBNEW_SETTINGS*  cfg = mgr.GetAppSettings<PCBNEW_SETTINGS>( "pcbnew" );
 
         loadPCBSettings( cfg );
     }
@@ -89,7 +89,8 @@ bool PANEL_PCB_DISPLAY_OPTIONS::TransferDataFromWindow()
 
     if( m_isPCBEdit )
     {
-        PCBNEW_SETTINGS* cfg = Pgm().GetSettingsManager().GetAppSettings<PCBNEW_SETTINGS>();
+        SETTINGS_MANAGER& mgr = Pgm().GetSettingsManager();
+        PCBNEW_SETTINGS*  cfg = mgr.GetAppSettings<PCBNEW_SETTINGS>( "pcbnew" );
 
         int i = m_OptDisplayTracksClearance->GetSelection();
         cfg->m_Display.m_TrackClearance = UTIL::GetValFromConfig( clearanceModeMap, i );
diff --git a/pcbnew/dialogs/panel_pcbnew_color_settings.cpp b/pcbnew/dialogs/panel_pcbnew_color_settings.cpp
index cdea2fc2a2..4cd46b96fb 100644
--- a/pcbnew/dialogs/panel_pcbnew_color_settings.cpp
+++ b/pcbnew/dialogs/panel_pcbnew_color_settings.cpp
@@ -691,15 +691,15 @@ PANEL_PCBNEW_COLOR_SETTINGS::PANEL_PCBNEW_COLOR_SETTINGS( wxWindow* aParent, BOA
 {
     m_colorNamespace = "board";
 
-    SETTINGS_MANAGER& mgr          = Pgm().GetSettingsManager();
-    PCBNEW_SETTINGS*  app_settings = mgr.GetAppSettings<PCBNEW_SETTINGS>();
-    COLOR_SETTINGS*   current      = mgr.GetColorSettings( app_settings->m_ColorTheme );
+    SETTINGS_MANAGER& mgr     = Pgm().GetSettingsManager();
+    PCBNEW_SETTINGS*  cfg     = mgr.GetAppSettings<PCBNEW_SETTINGS>( "pcbnew" );
+    COLOR_SETTINGS*   current = mgr.GetColorSettings( cfg->m_ColorTheme );
 
     // Saved theme doesn't exist?  Reset to default
-    if( current->GetFilename() != app_settings->m_ColorTheme )
-        app_settings->m_ColorTheme = current->GetFilename();
+    if( current->GetFilename() != cfg->m_ColorTheme )
+        cfg->m_ColorTheme = current->GetFilename();
 
-    createThemeList( app_settings->m_ColorTheme );
+    createThemeList( cfg->m_ColorTheme );
 
     // Currently this only applies to eeschema
     m_optOverrideColors->Hide();
@@ -740,8 +740,9 @@ PANEL_PCBNEW_COLOR_SETTINGS::~PANEL_PCBNEW_COLOR_SETTINGS()
 bool PANEL_PCBNEW_COLOR_SETTINGS::TransferDataFromWindow()
 {
     SETTINGS_MANAGER& mgr = Pgm().GetSettingsManager();
-    PCBNEW_SETTINGS*  app_settings = mgr.GetAppSettings<PCBNEW_SETTINGS>();
-    app_settings->m_ColorTheme = m_currentSettings->GetFilename();
+    PCBNEW_SETTINGS*  cfg = mgr.GetAppSettings<PCBNEW_SETTINGS>( "pcbnew" );
+
+    cfg->m_ColorTheme = m_currentSettings->GetFilename();
 
     return true;
 }
diff --git a/pcbnew/footprint_chooser_frame.cpp b/pcbnew/footprint_chooser_frame.cpp
index b12a041672..3a0c8b9056 100644
--- a/pcbnew/footprint_chooser_frame.cpp
+++ b/pcbnew/footprint_chooser_frame.cpp
@@ -597,7 +597,9 @@ void FOOTPRINT_CHOOSER_FRAME::build3DCanvas()
     m_boardAdapter.m_IsBoardView = false;
     m_boardAdapter.m_IsPreviewer = true;   // Force display 3D models, regardless the 3D viewer options
 
-    EDA_3D_VIEWER_SETTINGS* cfg = Pgm().GetSettingsManager().GetAppSettings<EDA_3D_VIEWER_SETTINGS>();
+    SETTINGS_MANAGER&       mgr = Pgm().GetSettingsManager();
+    EDA_3D_VIEWER_SETTINGS* cfg = mgr.GetAppSettings<EDA_3D_VIEWER_SETTINGS>( "3d_viewer" );
+
     m_boardAdapter.m_Cfg = cfg;
 
     // Build the 3D canvas
diff --git a/pcbnew/footprint_edit_frame.cpp b/pcbnew/footprint_edit_frame.cpp
index 91ae2aaeff..76de45f3c7 100644
--- a/pcbnew/footprint_edit_frame.cpp
+++ b/pcbnew/footprint_edit_frame.cpp
@@ -641,7 +641,11 @@ void FOOTPRINT_EDIT_FRAME::SetPlotSettings( const PCB_PLOT_PARAMS& aSettings )
 FOOTPRINT_EDITOR_SETTINGS* FOOTPRINT_EDIT_FRAME::GetSettings()
 {
     if( !m_editorSettings )
-        m_editorSettings = Pgm().GetSettingsManager().GetAppSettings<FOOTPRINT_EDITOR_SETTINGS>();
+    {
+        SETTINGS_MANAGER& mgr = Pgm().GetSettingsManager();
+
+        m_editorSettings = mgr.GetAppSettings<FOOTPRINT_EDITOR_SETTINGS>( "fpedit" );
+    }
 
     return m_editorSettings;
 }
@@ -649,8 +653,10 @@ FOOTPRINT_EDITOR_SETTINGS* FOOTPRINT_EDIT_FRAME::GetSettings()
 
 APP_SETTINGS_BASE* FOOTPRINT_EDIT_FRAME::config() const
 {
-    return m_editorSettings ? m_editorSettings
-                            : Pgm().GetSettingsManager().GetAppSettings<FOOTPRINT_EDITOR_SETTINGS>();
+    if( m_editorSettings )
+        return m_editorSettings;
+
+    return Pgm().GetSettingsManager().GetAppSettings<FOOTPRINT_EDITOR_SETTINGS>( "fpedit" );
 }
 
 
@@ -1384,7 +1390,9 @@ void FOOTPRINT_EDIT_FRAME::CommonSettingsChanged( bool aEnvVarsChanged, bool aTe
 {
     PCB_BASE_EDIT_FRAME::CommonSettingsChanged( aEnvVarsChanged, aTextVarsChanged );
 
-    auto cfg = Pgm().GetSettingsManager().GetAppSettings<FOOTPRINT_EDITOR_SETTINGS>();
+    SETTINGS_MANAGER&          mgr = Pgm().GetSettingsManager();
+    FOOTPRINT_EDITOR_SETTINGS* cfg = mgr.GetAppSettings<FOOTPRINT_EDITOR_SETTINGS>( "fpedit" );
+
     GetGalDisplayOptions().ReadWindowSettings( cfg->m_Window );
 
     GetBoard()->GetDesignSettings() = cfg->m_DesignSettings;
diff --git a/pcbnew/footprint_viewer_frame.cpp b/pcbnew/footprint_viewer_frame.cpp
index 8a3d2cfe29..a39821c5ea 100644
--- a/pcbnew/footprint_viewer_frame.cpp
+++ b/pcbnew/footprint_viewer_frame.cpp
@@ -811,7 +811,9 @@ void FOOTPRINT_VIEWER_FRAME::LoadSettings( APP_SETTINGS_BASE* aCfg )
     PCB_BASE_FRAME::LoadSettings( aCfg );
 
     // Fetch display and grid settings from Footprint Editor
-    auto* fpedit = Pgm().GetSettingsManager().GetAppSettings<FOOTPRINT_EDITOR_SETTINGS>( "fpedit" );
+    SETTINGS_MANAGER&          mgr = Pgm().GetSettingsManager();
+    FOOTPRINT_EDITOR_SETTINGS* fpedit = mgr.GetAppSettings<FOOTPRINT_EDITOR_SETTINGS>( "fpedit" );
+
     m_displayOptions = fpedit->m_Display;
     GetGalDisplayOptions().ReadWindowSettings( fpedit->m_Window );
 
@@ -861,12 +863,13 @@ WINDOW_SETTINGS* FOOTPRINT_VIEWER_FRAME::GetWindowSettings( APP_SETTINGS_BASE* a
 
 COLOR_SETTINGS* FOOTPRINT_VIEWER_FRAME::GetColorSettings( bool aForceRefresh ) const
 {
-    auto* cfg = Pgm().GetSettingsManager().GetAppSettings<FOOTPRINT_EDITOR_SETTINGS>( "fpedit" );
+    SETTINGS_MANAGER&          mgr = Pgm().GetSettingsManager();
+    FOOTPRINT_EDITOR_SETTINGS* cfg = mgr.GetAppSettings<FOOTPRINT_EDITOR_SETTINGS>( "fpedit" );
 
     if( cfg )
-        return Pgm().GetSettingsManager().GetColorSettings( cfg->m_ColorTheme );
+        return mgr.GetColorSettings( cfg->m_ColorTheme );
     else
-        return Pgm().GetSettingsManager().GetColorSettings();
+        return mgr.GetColorSettings();
 }
 
 
diff --git a/pcbnew/pcbnew.cpp b/pcbnew/pcbnew.cpp
index 50b91049ce..d1ecc8f7f2 100644
--- a/pcbnew/pcbnew.cpp
+++ b/pcbnew/pcbnew.cpp
@@ -148,17 +148,17 @@ static struct IFACE : public KIFACE_BASE, public UNITS_PROVIDER
 
         case PANEL_FP_DISPLAY_OPTIONS:
         {
-            SETTINGS_MANAGER&  mgr = Pgm().GetSettingsManager();
-            APP_SETTINGS_BASE* cfg = mgr.GetAppSettings<FOOTPRINT_EDITOR_SETTINGS>();
+            SETTINGS_MANAGER&          mgr = Pgm().GetSettingsManager();
+            FOOTPRINT_EDITOR_SETTINGS* cfg = mgr.GetAppSettings<FOOTPRINT_EDITOR_SETTINGS>( "fpedit" );
 
             return new PANEL_PCB_DISPLAY_OPTIONS( aParent, cfg );
         }
 
         case PANEL_FP_GRIDS:
         {
-            SETTINGS_MANAGER&  mgr = Pgm().GetSettingsManager();
-            APP_SETTINGS_BASE* cfg = mgr.GetAppSettings<FOOTPRINT_EDITOR_SETTINGS>();
-            EDA_BASE_FRAME*    frame = aKiway->Player( FRAME_FOOTPRINT_EDITOR, false );
+            SETTINGS_MANAGER&          mgr = Pgm().GetSettingsManager();
+            FOOTPRINT_EDITOR_SETTINGS* cfg = mgr.GetAppSettings<FOOTPRINT_EDITOR_SETTINGS>( "fpedit" );
+            EDA_BASE_FRAME*            frame = aKiway->Player( FRAME_FOOTPRINT_EDITOR, false );
 
             if( !frame )
                 frame = aKiway->Player( FRAME_FOOTPRINT_VIEWER, false );
@@ -174,8 +174,8 @@ static struct IFACE : public KIFACE_BASE, public UNITS_PROVIDER
 
         case PANEL_FP_ORIGINS_AXES:
         {
-            SETTINGS_MANAGER&  mgr = Pgm().GetSettingsManager();
-            APP_SETTINGS_BASE* cfg = mgr.GetAppSettings<FOOTPRINT_EDITOR_SETTINGS>();
+            SETTINGS_MANAGER&          mgr = Pgm().GetSettingsManager();
+            FOOTPRINT_EDITOR_SETTINGS* cfg = mgr.GetAppSettings<FOOTPRINT_EDITOR_SETTINGS>( "fpedit" );
 
             return new PANEL_PCBNEW_DISPLAY_ORIGIN( aParent, cfg, FRAME_FOOTPRINT_EDITOR );
         }
@@ -217,17 +217,17 @@ static struct IFACE : public KIFACE_BASE, public UNITS_PROVIDER
 
         case PANEL_PCB_DISPLAY_OPTS:
         {
-            SETTINGS_MANAGER&  mgr = Pgm().GetSettingsManager();
-            APP_SETTINGS_BASE* cfg = mgr.GetAppSettings<PCBNEW_SETTINGS>();
+            SETTINGS_MANAGER& mgr = Pgm().GetSettingsManager();
+            PCBNEW_SETTINGS*  cfg = mgr.GetAppSettings<PCBNEW_SETTINGS>( "pcbnew" );
 
             return new PANEL_PCB_DISPLAY_OPTIONS( aParent, cfg );
         }
 
         case PANEL_PCB_GRIDS:
         {
-            SETTINGS_MANAGER&  mgr = Pgm().GetSettingsManager();
-            APP_SETTINGS_BASE* cfg = mgr.GetAppSettings<PCBNEW_SETTINGS>();
-            EDA_BASE_FRAME*    frame = aKiway->Player( FRAME_PCB_EDITOR, false );
+            SETTINGS_MANAGER& mgr = Pgm().GetSettingsManager();
+            PCBNEW_SETTINGS*  cfg = mgr.GetAppSettings<PCBNEW_SETTINGS>( "pcbnew" );
+            EDA_BASE_FRAME*   frame = aKiway->Player( FRAME_PCB_EDITOR, false );
 
             if( !frame )
                 frame = aKiway->Player( FRAME_FOOTPRINT_EDITOR, false );
@@ -243,8 +243,8 @@ static struct IFACE : public KIFACE_BASE, public UNITS_PROVIDER
 
         case PANEL_PCB_ORIGINS_AXES:
         {
-            SETTINGS_MANAGER&  mgr = Pgm().GetSettingsManager();
-            APP_SETTINGS_BASE* cfg = mgr.GetAppSettings<PCBNEW_SETTINGS>();
+            SETTINGS_MANAGER& mgr = Pgm().GetSettingsManager();
+            PCBNEW_SETTINGS*  cfg = mgr.GetAppSettings<PCBNEW_SETTINGS>( "pcbnew" );
 
             return new PANEL_PCBNEW_DISPLAY_ORIGIN( aParent, cfg, FRAME_PCB_EDITOR );
         }
@@ -380,34 +380,31 @@ bool IFACE::OnKifaceStart( PGM_BASE* aProgram, int aCtlBits, KIWAY* aKiway )
     // This is process-level-initialization, not project-level-initialization of the DSO.
     // Do nothing in here pertinent to a project!
     InitSettings( new PCBNEW_SETTINGS );
-    aProgram->GetSettingsManager().RegisterSettings( new FOOTPRINT_EDITOR_SETTINGS );
-    aProgram->GetSettingsManager().RegisterSettings( new EDA_3D_VIEWER_SETTINGS );
+
+    SETTINGS_MANAGER& mgr = aProgram->GetSettingsManager();
+
+    mgr.RegisterSettings( new FOOTPRINT_EDITOR_SETTINGS );
+    mgr.RegisterSettings( new EDA_3D_VIEWER_SETTINGS );
 
     // We intentionally register KifaceSettings after FOOTPRINT_EDITOR_SETTINGS and EDA_3D_VIEWER_SETTINGS
     // In legacy configs, many settings were in a single editor config and the migration routine
     // for the main editor file will try and call into the now separate settings stores
     // to move the settings into them
-    aProgram->GetSettingsManager().RegisterSettings( KifaceSettings() );
+    mgr.RegisterSettings( KifaceSettings() );
 
     // Register the footprint editor settings as well because they share a KiFACE and need to be
     // loaded prior to use to avoid threading deadlocks
-    aProgram->GetSettingsManager().RegisterSettings( new CVPCB_SETTINGS );
+    mgr.RegisterSettings( new CVPCB_SETTINGS );
 
     start_common( aCtlBits );
 
     if( !loadGlobalLibTable() )
     {
-        // we didnt get anywhere deregister the
-        aProgram->GetSettingsManager().FlushAndRelease(
-                aProgram->GetSettingsManager().GetAppSettings<CVPCB_SETTINGS>(), false );
-
-        aProgram->GetSettingsManager().FlushAndRelease( KifaceSettings(), false );
-
-        aProgram->GetSettingsManager().FlushAndRelease(
-                aProgram->GetSettingsManager().GetAppSettings<FOOTPRINT_EDITOR_SETTINGS>(), false );
-
-        aProgram->GetSettingsManager().FlushAndRelease(
-                aProgram->GetSettingsManager().GetAppSettings<EDA_3D_VIEWER_SETTINGS>(), false );
+        // we didnt get anywhere deregister the settings
+        mgr.FlushAndRelease( mgr.GetAppSettings<CVPCB_SETTINGS>( "cvpcb" ), false );
+        mgr.FlushAndRelease( KifaceSettings(), false );
+        mgr.FlushAndRelease( mgr.GetAppSettings<FOOTPRINT_EDITOR_SETTINGS>( "fpedit" ), false );
+        mgr.FlushAndRelease( mgr.GetAppSettings<EDA_3D_VIEWER_SETTINGS>( "3d_viewer" ), false );
 
         return false;
     }
diff --git a/pcbnew/pcbnew_jobs_handler.cpp b/pcbnew/pcbnew_jobs_handler.cpp
index c081a45f3e..657690626f 100644
--- a/pcbnew/pcbnew_jobs_handler.cpp
+++ b/pcbnew/pcbnew_jobs_handler.cpp
@@ -443,11 +443,10 @@ int PCBNEW_JOBS_HANDLER::JobExportRender( JOB* aJob )
 
     boardAdapter.SetBoard( brd );
     boardAdapter.m_IsBoardView = false;
-    boardAdapter.m_IsPreviewer =
-            true; // Force display 3D models, regardless the 3D viewer options
+    boardAdapter.m_IsPreviewer = true; // Force display 3D models, regardless of 3D viewer options
 
-    EDA_3D_VIEWER_SETTINGS* cfg =
-            Pgm().GetSettingsManager().GetAppSettings<EDA_3D_VIEWER_SETTINGS>();
+    SETTINGS_MANAGER&       mgr = Pgm().GetSettingsManager();
+    EDA_3D_VIEWER_SETTINGS* cfg = mgr.GetAppSettings<EDA_3D_VIEWER_SETTINGS>( "3d_viewer" );
 
     if( aRenderJob->m_quality == JOB_PCB_RENDER::QUALITY::BASIC )
     {
diff --git a/pcbnew/pcbnew_printout.cpp b/pcbnew/pcbnew_printout.cpp
index 7105841d97..26301ff1b8 100644
--- a/pcbnew/pcbnew_printout.cpp
+++ b/pcbnew/pcbnew_printout.cpp
@@ -38,6 +38,7 @@
 #include <pad.h>
 
 #include <advanced_config.h>
+#include <pgm_base.h>
 
 PCBNEW_PRINTOUT_SETTINGS::PCBNEW_PRINTOUT_SETTINGS( const PAGE_INFO& aPageInfo ) :
         BOARD_PRINTOUT_SETTINGS( aPageInfo )
@@ -53,7 +54,10 @@ void PCBNEW_PRINTOUT_SETTINGS::Load( APP_SETTINGS_BASE* aConfig )
 {
     BOARD_PRINTOUT_SETTINGS::Load( aConfig );
 
-    if( PCBNEW_SETTINGS* cfg = dynamic_cast<PCBNEW_SETTINGS*>( aConfig ) )
+    SETTINGS_MANAGER& mgr = Pgm().GetSettingsManager();
+    PCBNEW_SETTINGS*  cfg = mgr.GetAppSettings<PCBNEW_SETTINGS>( "pcbnew" );
+
+    if( cfg )
     {
         m_DrillMarks = static_cast<DRILL_MARKS>( cfg->m_Plot.pads_drill_mode );
         m_Pagination = static_cast<PAGINATION_T>( cfg->m_Plot.all_layers_on_one_page );
@@ -68,7 +72,10 @@ void PCBNEW_PRINTOUT_SETTINGS::Save( APP_SETTINGS_BASE* aConfig )
 {
     BOARD_PRINTOUT_SETTINGS::Save( aConfig );
 
-    if( PCBNEW_SETTINGS* cfg = dynamic_cast<PCBNEW_SETTINGS*>( aConfig ) )
+    SETTINGS_MANAGER& mgr = Pgm().GetSettingsManager();
+    PCBNEW_SETTINGS*  cfg = mgr.GetAppSettings<PCBNEW_SETTINGS>( "pcbnew" );
+
+    if( cfg )
     {
         cfg->m_Plot.pads_drill_mode        = (int)m_DrillMarks;
         cfg->m_Plot.all_layers_on_one_page = m_Pagination;
diff --git a/pcbnew/pcbnew_settings.cpp b/pcbnew/pcbnew_settings.cpp
index cd2e25ba40..4911f6e7ea 100644
--- a/pcbnew/pcbnew_settings.cpp
+++ b/pcbnew/pcbnew_settings.cpp
@@ -937,7 +937,8 @@ bool PCBNEW_SETTINGS::MigrateFromLegacy( wxConfigBase* aCfg )
 
     // Migrate color settings that were stored in the pcbnew config file
 
-    COLOR_SETTINGS* cs = Pgm().GetSettingsManager().GetMigratedColorSettings();
+    SETTINGS_MANAGER& mgr = Pgm().GetSettingsManager();
+    COLOR_SETTINGS*   cs = mgr.GetMigratedColorSettings();
 
     auto migrateLegacyColor =
             [&] ( const std::string& aKey, int aLayerId )
@@ -967,7 +968,7 @@ bool PCBNEW_SETTINGS::MigrateFromLegacy( wxConfigBase* aCfg )
     migrateLegacyColor( "Color4DWorksheet",          LAYER_DRAWINGSHEET );
     migrateLegacyColor( "Color4DGrid",               LAYER_PAGE_LIMITS );
 
-    Pgm().GetSettingsManager().SaveColorSettings( cs, "board" );
+    mgr.SaveColorSettings( cs, "board" );
 
     Set( "appearance.color_theme", cs->GetFilename() );
 
@@ -987,12 +988,12 @@ bool PCBNEW_SETTINGS::MigrateFromLegacy( wxConfigBase* aCfg )
     }
 
     // Footprint editor settings were stored in pcbnew config file.  Migrate them here.
-    auto fpedit = Pgm().GetSettingsManager().GetAppSettings<FOOTPRINT_EDITOR_SETTINGS>();
+    FOOTPRINT_EDITOR_SETTINGS* fpedit = mgr.GetAppSettings<FOOTPRINT_EDITOR_SETTINGS>( "fpedit" );
     fpedit->MigrateFromLegacy( aCfg );
     fpedit->Load();
 
     // Same with 3D viewer
-    auto viewer3d = Pgm().GetSettingsManager().GetAppSettings<EDA_3D_VIEWER_SETTINGS>();
+    EDA_3D_VIEWER_SETTINGS* viewer3d = mgr.GetAppSettings<EDA_3D_VIEWER_SETTINGS>( "3d_viewer" );
     viewer3d->MigrateFromLegacy( aCfg );
     viewer3d->Load();
 
diff --git a/pcbnew/python/scripting/pcbnew_action_plugins.cpp b/pcbnew/python/scripting/pcbnew_action_plugins.cpp
index e31e91d893..5c2cef59d5 100644
--- a/pcbnew/python/scripting/pcbnew_action_plugins.cpp
+++ b/pcbnew/python/scripting/pcbnew_action_plugins.cpp
@@ -531,7 +531,8 @@ void PCB_EDIT_FRAME::AddActionPluginTools()
 
 std::vector<ACTION_PLUGIN*> PCB_EDIT_FRAME::GetOrderedActionPlugins()
 {
-    PCBNEW_SETTINGS* cfg = Pgm().GetSettingsManager().GetAppSettings<PCBNEW_SETTINGS>();
+    SETTINGS_MANAGER& mgr = Pgm().GetSettingsManager();
+    PCBNEW_SETTINGS*  cfg = mgr.GetAppSettings<PCBNEW_SETTINGS>( "pcbnew" );
 
     std::vector<ACTION_PLUGIN*> plugins;
     std::vector<ACTION_PLUGIN*> orderedPlugins;
@@ -566,7 +567,8 @@ std::vector<ACTION_PLUGIN*> PCB_EDIT_FRAME::GetOrderedActionPlugins()
 bool PCB_EDIT_FRAME::GetActionPluginButtonVisible( const wxString& aPluginPath,
                                                    bool aPluginDefault )
 {
-    PCBNEW_SETTINGS* cfg = Pgm().GetSettingsManager().GetAppSettings<PCBNEW_SETTINGS>();
+    SETTINGS_MANAGER& mgr = Pgm().GetSettingsManager();
+    PCBNEW_SETTINGS*  cfg = mgr.GetAppSettings<PCBNEW_SETTINGS>( "pcbnew" );
 
     for( const auto& entry : cfg->m_VisibleActionPlugins )
     {
diff --git a/pcbnew/sel_layer.cpp b/pcbnew/sel_layer.cpp
index 3ab7707927..3ff2c2b42d 100644
--- a/pcbnew/sel_layer.cpp
+++ b/pcbnew/sel_layer.cpp
@@ -67,8 +67,8 @@ COLOR4D PCB_LAYER_PRESENTATION::getLayerColor( int aLayer ) const
     else
     {
         SETTINGS_MANAGER&          mgr = Pgm().GetSettingsManager();
-        FOOTPRINT_EDITOR_SETTINGS* settings = mgr.GetAppSettings<FOOTPRINT_EDITOR_SETTINGS>();
-        COLOR_SETTINGS*            current = mgr.GetColorSettings( settings->m_ColorTheme );
+        FOOTPRINT_EDITOR_SETTINGS* cfg = mgr.GetAppSettings<FOOTPRINT_EDITOR_SETTINGS>( "fpedit" );
+        COLOR_SETTINGS*            current = mgr.GetColorSettings( cfg->m_ColorTheme );
 
         return current->GetColor( aLayer );
     }
diff --git a/pcbnew/tools/drawing_tool.cpp b/pcbnew/tools/drawing_tool.cpp
index 36853f037a..16652af3b3 100644
--- a/pcbnew/tools/drawing_tool.cpp
+++ b/pcbnew/tools/drawing_tool.cpp
@@ -338,9 +338,9 @@ void DRAWING_TOOL::UpdateStatusBar() const
         bool              constrained;
 
         if( m_frame->IsType( FRAME_PCB_EDITOR ) )
-            constrained = mgr.GetAppSettings<PCBNEW_SETTINGS>()->m_Use45DegreeLimit;
+            constrained = mgr.GetAppSettings<PCBNEW_SETTINGS>( "pcbnew" )->m_Use45DegreeLimit;
         else
-            constrained = mgr.GetAppSettings<FOOTPRINT_EDITOR_SETTINGS>()->m_Use45Limit;
+            constrained = mgr.GetAppSettings<FOOTPRINT_EDITOR_SETTINGS>( "fpedit" )->m_Use45Limit;
 
         m_frame->DisplayConstraintsMsg( constrained ? _( "Constrain to H, V, 45" ) : wxString( "" ) );
     }
@@ -2113,9 +2113,9 @@ int DRAWING_TOOL::ToggleHV45Mode( const TOOL_EVENT& toolEvent )
     SETTINGS_MANAGER& mgr = Pgm().GetSettingsManager();
 
     if( frame()->IsType( FRAME_PCB_EDITOR ) )
-        TOGGLE( mgr.GetAppSettings<PCBNEW_SETTINGS>()->m_Use45DegreeLimit );
+        TOGGLE( mgr.GetAppSettings<PCBNEW_SETTINGS>( "pcbnew" )->m_Use45DegreeLimit );
     else
-        TOGGLE( mgr.GetAppSettings<FOOTPRINT_EDITOR_SETTINGS>()->m_Use45Limit );
+        TOGGLE( mgr.GetAppSettings<FOOTPRINT_EDITOR_SETTINGS>( "fpedit" )->m_Use45Limit );
 
     UpdateStatusBar();
 
diff --git a/pcbnew/tools/pcb_editor_conditions.cpp b/pcbnew/tools/pcb_editor_conditions.cpp
index 52d42e0413..3a5f216ad7 100644
--- a/pcbnew/tools/pcb_editor_conditions.cpp
+++ b/pcbnew/tools/pcb_editor_conditions.cpp
@@ -191,7 +191,7 @@ bool PCB_EDITOR_CONDITIONS::get45degModeFunc( const SELECTION& aSelection, PCB_B
     SETTINGS_MANAGER& mgr = Pgm().GetSettingsManager();
 
     if( aFrame->IsType( FRAME_PCB_EDITOR ) )
-        return mgr.GetAppSettings<PCBNEW_SETTINGS>()->m_Use45DegreeLimit;
+        return mgr.GetAppSettings<PCBNEW_SETTINGS>( "pcbnew" )->m_Use45DegreeLimit;
     else
-        return mgr.GetAppSettings<FOOTPRINT_EDITOR_SETTINGS>()->m_Use45Limit;
+        return mgr.GetAppSettings<FOOTPRINT_EDITOR_SETTINGS>( "fpedit" )->m_Use45Limit;
 }
diff --git a/pcbnew/tools/pcb_tool_base.cpp b/pcbnew/tools/pcb_tool_base.cpp
index 7f4f05eec4..8e6f55b49f 100644
--- a/pcbnew/tools/pcb_tool_base.cpp
+++ b/pcbnew/tools/pcb_tool_base.cpp
@@ -333,9 +333,9 @@ bool PCB_TOOL_BASE::Is45Limited() const
     SETTINGS_MANAGER& mgr = Pgm().GetSettingsManager();
 
     if( frame()->IsType( FRAME_PCB_EDITOR ) )
-        return mgr.GetAppSettings<PCBNEW_SETTINGS>()->m_Use45DegreeLimit;
+        return mgr.GetAppSettings<PCBNEW_SETTINGS>( "pcbnew" )->m_Use45DegreeLimit;
     else
-        return mgr.GetAppSettings<FOOTPRINT_EDITOR_SETTINGS>()->m_Use45Limit;
+        return mgr.GetAppSettings<FOOTPRINT_EDITOR_SETTINGS>( "fpedit" )->m_Use45Limit;
 }
 
 
diff --git a/pcbnew/tools/pcb_viewer_tools.cpp b/pcbnew/tools/pcb_viewer_tools.cpp
index 26851d9925..ab3025eb85 100644
--- a/pcbnew/tools/pcb_viewer_tools.cpp
+++ b/pcbnew/tools/pcb_viewer_tools.cpp
@@ -323,9 +323,9 @@ int PCB_VIEWER_TOOLS::MeasureTool( const TOOL_EVENT& aEvent )
             bool              force45Deg;
 
             if( frame()->IsType( FRAME_PCB_EDITOR ) )
-                force45Deg = mgr.GetAppSettings<PCBNEW_SETTINGS>()->m_Use45DegreeLimit;
+                force45Deg = mgr.GetAppSettings<PCBNEW_SETTINGS>( "pcbnew" )->m_Use45DegreeLimit;
             else
-                force45Deg = mgr.GetAppSettings<FOOTPRINT_EDITOR_SETTINGS>()->m_Use45Limit;
+                force45Deg = mgr.GetAppSettings<FOOTPRINT_EDITOR_SETTINGS>( "fpedit" )->m_Use45Limit;
 
             twoPtMgr.SetAngleSnap( force45Deg );
             twoPtMgr.SetEnd( cursorPos );
diff --git a/pcbnew/tools/position_relative_tool.cpp b/pcbnew/tools/position_relative_tool.cpp
index 44d636cd75..cc73ed88f5 100644
--- a/pcbnew/tools/position_relative_tool.cpp
+++ b/pcbnew/tools/position_relative_tool.cpp
@@ -326,9 +326,9 @@ int POSITION_RELATIVE_TOOL::PositionRelativeInteractively( const TOOL_EVENT& aEv
             bool              force45Deg;
 
             if( frame()->IsType( FRAME_PCB_EDITOR ) )
-                force45Deg = mgr.GetAppSettings<PCBNEW_SETTINGS>()->m_Use45DegreeLimit;
+                force45Deg = mgr.GetAppSettings<PCBNEW_SETTINGS>( "pcbnew" )->m_Use45DegreeLimit;
             else
-                force45Deg = mgr.GetAppSettings<FOOTPRINT_EDITOR_SETTINGS>()->m_Use45Limit;
+                force45Deg = mgr.GetAppSettings<FOOTPRINT_EDITOR_SETTINGS>( "fpedit" )->m_Use45Limit;
 
             twoPtMgr.SetAngleSnap( force45Deg );
             twoPtMgr.SetEnd( cursorPos );
diff --git a/qa/qa_utils/pcb_test_frame.cpp b/qa/qa_utils/pcb_test_frame.cpp
index ac401dcbc2..175f2876d9 100644
--- a/qa/qa_utils/pcb_test_frame.cpp
+++ b/qa/qa_utils/pcb_test_frame.cpp
@@ -90,12 +90,8 @@ void PCB_TEST_FRAME_BASE::SetBoard( std::shared_ptr<BOARD> b )
     KI_TRACE( traceGalProfile, "%s\n", cntView.to_string() );
 
 #ifdef USE_TOOL_MANAGER
-    SETTINGS_MANAGER&       mgr = Pgm().GetSettingsManager();
-
-    mgr.RegisterSettings( new PCBNEW_SETTINGS, false );
-
-    PCBNEW_SETTINGS* cfg = mgr.GetAppSettings<PCBNEW_SETTINGS>();
-
+    SETTINGS_MANAGER& mgr = Pgm().GetSettingsManager();
+    PCBNEW_SETTINGS*  cfg = mgr.RegisterSettings( new PCBNEW_SETTINGS, false );
     
     m_toolManager = new TOOL_MANAGER;