diff --git a/3d-viewer/3d_viewer/eda_3d_viewer_frame.cpp b/3d-viewer/3d_viewer/eda_3d_viewer_frame.cpp
index 22b7534061..847f311c62 100644
--- a/3d-viewer/3d_viewer/eda_3d_viewer_frame.cpp
+++ b/3d-viewer/3d_viewer/eda_3d_viewer_frame.cpp
@@ -714,8 +714,8 @@ void EDA_3D_VIEWER_FRAME::takeScreenshot( wxCommandEvent& event )
     if( event.GetId() != ID_TOOL_SCREENCOPY_TOCLIBBOARD )
     {
         // Remember path between saves during this session only.
-        const wxString wildcard = fmt_is_jpeg ? JpegFileWildcard() : PngFileWildcard();
-        const wxString ext = fmt_is_jpeg ? JpegFileExtension : PngFileExtension;
+        const wxString wildcard = fmt_is_jpeg ? FILEEXT::JpegFileWildcard() : FILEEXT::PngFileWildcard();
+        const wxString ext = fmt_is_jpeg ? FILEEXT::JpegFileExtension : FILEEXT::PngFileExtension;
 
         // First time path is set to the project path.
         if( !m_defaultSaveScreenshotFileName.IsOk() )
diff --git a/bitmap2component/bitmap2cmp_frame.cpp b/bitmap2component/bitmap2cmp_frame.cpp
index 20830f5a29..bd0f98e040 100644
--- a/bitmap2component/bitmap2cmp_frame.cpp
+++ b/bitmap2component/bitmap2cmp_frame.cpp
@@ -438,14 +438,14 @@ void BITMAP2CMP_FRAME::ExportDrawingSheetFormat()
         path = ::wxGetCwd();
 
     wxFileDialog fileDlg( this, _( "Create Drawing Sheet File" ), path, wxEmptyString,
-                          DrawingSheetFileWildcard(), wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
+                          FILEEXT::DrawingSheetFileWildcard(), wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
     int          diag = fileDlg.ShowModal();
 
     if( diag != wxID_OK )
         return;
 
     fn = fileDlg.GetPath();
-    fn.SetExt( DrawingSheetFileExtension );
+    fn.SetExt( FILEEXT::DrawingSheetFileExtension );
     m_convertedFileName = fn.GetFullPath();
 
     FILE*    outfile;
@@ -475,7 +475,7 @@ void BITMAP2CMP_FRAME::ExportPostScriptFormat()
         path = ::wxGetCwd();
 
     wxFileDialog fileDlg( this, _( "Create PostScript File" ), path, wxEmptyString,
-                          PSFileWildcard(), wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
+                          FILEEXT::PSFileWildcard(), wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
 
     if( fileDlg.ShowModal() != wxID_OK )
         return;
@@ -511,12 +511,13 @@ void BITMAP2CMP_FRAME::ExportEeschemaFormat()
         path = ::wxGetCwd();
 
     wxFileDialog fileDlg( this, _( "Create Symbol Library" ), path, wxEmptyString,
-                          KiCadSymbolLibFileWildcard(), wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
+                          FILEEXT::KiCadSymbolLibFileWildcard(),
+                          wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
 
     if( fileDlg.ShowModal() != wxID_OK )
         return;
 
-    fn = EnsureFileExtension( fileDlg.GetPath(), KiCadSymbolLibFileExtension );
+    fn = EnsureFileExtension( fileDlg.GetPath(), FILEEXT::KiCadSymbolLibFileExtension );
     m_convertedFileName = fn.GetFullPath();
 
     FILE*    outfile = wxFopen( m_convertedFileName, wxT( "w" ) );
@@ -545,12 +546,13 @@ void BITMAP2CMP_FRAME::ExportPcbnewFormat()
         path = m_mruPath;
 
     wxFileDialog fileDlg( this, _( "Create Footprint Library" ), path, wxEmptyString,
-                          KiCadFootprintLibFileWildcard(), wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
+                          FILEEXT::KiCadFootprintLibFileWildcard(),
+                          wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
 
     if( fileDlg.ShowModal() != wxID_OK )
         return;
 
-    fn = EnsureFileExtension( fileDlg.GetPath(), KiCadFootprintFileExtension );
+    fn = EnsureFileExtension( fileDlg.GetPath(), FILEEXT::KiCadFootprintFileExtension );
     m_convertedFileName = fn.GetFullPath();
 
     FILE* outfile = wxFopen( m_convertedFileName, wxT( "w" ) );
diff --git a/common/CMakeLists.txt b/common/CMakeLists.txt
index 6e1e7ac9ed..99feb628a1 100644
--- a/common/CMakeLists.txt
+++ b/common/CMakeLists.txt
@@ -119,6 +119,7 @@ set( KICOMMON_SRCS
     richio.cpp
     string_utils.cpp
     trace_helpers.cpp
+    wildcards_and_files_ext.cpp
     wx_filename.cpp
 
     io/kicad/kicad_io_utils.cpp    # needed by richio
@@ -509,7 +510,6 @@ set( COMMON_SRCS
     title_block.cpp
     undo_redo_container.cpp
     validators.cpp
-    wildcards_and_files_ext.cpp
     drawing_sheet/ds_painter.cpp
     xnode.cpp
     view/wx_view_controls.cpp
diff --git a/common/database/database_lib_settings.cpp b/common/database/database_lib_settings.cpp
index 252e71170c..f4685194f2 100644
--- a/common/database/database_lib_settings.cpp
+++ b/common/database/database_lib_settings.cpp
@@ -168,5 +168,5 @@ DATABASE_LIB_SETTINGS::DATABASE_LIB_SETTINGS( const std::string& aFilename ) :
 
 wxString DATABASE_LIB_SETTINGS::getFileExt() const
 {
-    return DatabaseLibraryFileExtension;
+    return FILEEXT::DatabaseLibraryFileExtension;
 }
diff --git a/common/dialogs/dialog_page_settings.cpp b/common/dialogs/dialog_page_settings.cpp
index 54f9bc7463..1371760356 100644
--- a/common/dialogs/dialog_page_settings.cpp
+++ b/common/dialogs/dialog_page_settings.cpp
@@ -793,7 +793,8 @@ void DIALOG_PAGES_SETTINGS::OnWksFileSelection( wxCommandEvent& event )
 
     // Display a file picker dialog
     wxFileDialog fileDialog( this, _( "Drawing Sheet File" ), path, name,
-                             DrawingSheetFileWildcard(), wxFD_DEFAULT_STYLE|wxFD_FILE_MUST_EXIST );
+                             FILEEXT::DrawingSheetFileWildcard(),
+                             wxFD_DEFAULT_STYLE | wxFD_FILE_MUST_EXIST );
 
     if( fileDialog.ShowModal() != wxID_OK )
         return;
diff --git a/common/dialogs/panel_hotkeys_editor.cpp b/common/dialogs/panel_hotkeys_editor.cpp
index 9236dd6fef..355ac96c7e 100644
--- a/common/dialogs/panel_hotkeys_editor.cpp
+++ b/common/dialogs/panel_hotkeys_editor.cpp
@@ -199,8 +199,8 @@ void PANEL_HOTKEYS_EDITOR::OnFilterSearch( wxCommandEvent& aEvent )
 void PANEL_HOTKEYS_EDITOR::ImportHotKeys()
 {
     wxString filename = wxFileSelector( _( "Import Hotkeys File:" ), m_frame->GetMruPath(),
-                                        wxEmptyString, HotkeyFileExtension,
-                                        HotkeyFileWildcard(), wxFD_OPEN, this );
+                                        wxEmptyString, FILEEXT::HotkeyFileExtension,
+                                        FILEEXT::HotkeyFileWildcard(), wxFD_OPEN, this );
 
     if( filename.IsEmpty() )
         return;
@@ -229,7 +229,7 @@ void PANEL_HOTKEYS_EDITOR::ImportHotKeys()
 void PANEL_HOTKEYS_EDITOR::dumpHotkeys()
 {
     wxString filename = wxFileSelector( wxT( "Hotkeys File" ), m_frame->GetMruPath(),
-                                        wxEmptyString, TextFileExtension, TextFileWildcard(),
+                                        wxEmptyString, FILEEXT::TextFileExtension, FILEEXT::TextFileWildcard(),
                                         wxFD_SAVE, this );
 
     if( filename.IsEmpty() )
diff --git a/common/eda_base_frame.cpp b/common/eda_base_frame.cpp
index 5acefea522..a7da7fee8b 100644
--- a/common/eda_base_frame.cpp
+++ b/common/eda_base_frame.cpp
@@ -1248,8 +1248,8 @@ void EDA_BASE_FRAME::OnDropFiles( wxDropFilesEvent& aEvent )
         wxString         ext = fn.GetExt();
 
         // Alias all gerber files as GerberFileExtension
-        if( IsGerberFileExtension( ext ) )
-            ext = GerberFileExtension;
+        if( FILEEXT::IsGerberFileExtension( ext ) )
+            ext = FILEEXT::GerberFileExtension;
 
         if( m_acceptedExts.find( ext.ToStdString() ) != m_acceptedExts.end() )
             m_AcceptedFiles.emplace_back( fn );
diff --git a/common/hotkeys_basic.cpp b/common/hotkeys_basic.cpp
index 4b66029279..8f4248b41d 100644
--- a/common/hotkeys_basic.cpp
+++ b/common/hotkeys_basic.cpp
@@ -356,7 +356,7 @@ void ReadHotKeyConfig( const wxString&                             aFileName,
     if( fileName.IsEmpty() )
     {
         wxFileName fn( wxS( "user" ) );
-        fn.SetExt( HotkeyFileExtension );
+        fn.SetExt( FILEEXT::HotkeyFileExtension );
         fn.SetPath( PATHS::GetUserSettingsPath() );
         fileName = fn.GetFullPath();
     }
@@ -411,7 +411,7 @@ int WriteHotKeyConfig( const std::vector<TOOL_ACTION*>& aActions )
     std::map<std::string, std::pair<int, int>> hotkeys;
     wxFileName fn( "user" );
 
-    fn.SetExt( HotkeyFileExtension );
+    fn.SetExt( FILEEXT::HotkeyFileExtension );
     fn.SetPath( PATHS::GetUserSettingsPath() );
 
     // Read the existing config (all hotkeys)
@@ -458,7 +458,7 @@ int ReadLegacyHotkeyConfigFile( const wxString& aFilename, std::map<std::string,
 {
     wxFileName fn( aFilename );
 
-    fn.SetExt( HotkeyFileExtension );
+    fn.SetExt( FILEEXT::HotkeyFileExtension );
     fn.SetPath( PATHS::GetUserSettingsPath() );
 
     if( !wxFile::Exists( fn.GetFullPath() ) )
diff --git a/common/http_lib/http_lib_settings.cpp b/common/http_lib/http_lib_settings.cpp
index afe516e144..9107707446 100644
--- a/common/http_lib/http_lib_settings.cpp
+++ b/common/http_lib/http_lib_settings.cpp
@@ -47,5 +47,5 @@ HTTP_LIB_SETTINGS::HTTP_LIB_SETTINGS( const std::string& aFilename ) :
 
 wxString HTTP_LIB_SETTINGS::getFileExt() const
 {
-    return HTTPLibraryFileExtension;
+    return FILEEXT::HTTPLibraryFileExtension;
 }
diff --git a/common/project.cpp b/common/project.cpp
index ea94277040..3808a825d3 100644
--- a/common/project.cpp
+++ b/common/project.cpp
@@ -121,7 +121,7 @@ void PROJECT::setProjectFullName( const wxString& aFullPathAndName )
 
         wxASSERT( m_project_name.IsAbsolute() );
 
-        wxASSERT( m_project_name.GetExt() == ProjectFileExtension );
+        wxASSERT( m_project_name.GetExt() == FILEEXT::ProjectFileExtension );
 
         // until multiple projects are in play, set an environment variable for the
         // the project pointer.
diff --git a/common/project/project_file.cpp b/common/project/project_file.cpp
index da488c2061..4fb682cafe 100644
--- a/common/project/project_file.cpp
+++ b/common/project/project_file.cpp
@@ -585,7 +585,7 @@ bool PROJECT_FILE::SaveToFile( const wxString& aDirectory, bool aForce )
 {
     wxASSERT( m_project );
 
-    Set( "meta.filename", m_project->GetProjectName() + "." + ProjectFileExtension );
+    Set( "meta.filename", m_project->GetProjectName() + "." + FILEEXT::ProjectFileExtension );
 
     return JSON_SETTINGS::SaveToFile( aDirectory, aForce );
 }
@@ -597,7 +597,7 @@ bool PROJECT_FILE::SaveAs( const wxString& aDirectory, const wxString& aFile )
     wxString   oldProjectName = oldFilename.GetName();
     wxString   oldProjectPath = oldFilename.GetPath();
 
-    Set( "meta.filename", aFile + "." + ProjectFileExtension );
+    Set( "meta.filename", aFile + "." + FILEEXT::ProjectFileExtension );
     SetFilename( aFile );
 
     auto updatePath =
@@ -638,13 +638,13 @@ bool PROJECT_FILE::SaveAs( const wxString& aDirectory, const wxString& aFile )
 
 wxString PROJECT_FILE::getFileExt() const
 {
-    return ProjectFileExtension;
+    return FILEEXT::ProjectFileExtension;
 }
 
 
 wxString PROJECT_FILE::getLegacyFileExt() const
 {
-    return LegacyProjectFileExtension;
+    return FILEEXT::LegacyProjectFileExtension;
 }
 
 
diff --git a/common/project/project_local_settings.cpp b/common/project/project_local_settings.cpp
index 29ff3f359c..0aa749c6b2 100644
--- a/common/project/project_local_settings.cpp
+++ b/common/project/project_local_settings.cpp
@@ -352,7 +352,7 @@ bool PROJECT_LOCAL_SETTINGS::SaveToFile( const wxString& aDirectory, bool aForce
 {
     wxASSERT( m_project );
 
-    Set( "meta.filename", m_project->GetProjectName() + "." + ProjectLocalSettingsFileExtension );
+    Set( "meta.filename", m_project->GetProjectName() + "." + FILEEXT::ProjectLocalSettingsFileExtension );
 
     return JSON_SETTINGS::SaveToFile( aDirectory, aForce );
 }
@@ -360,7 +360,7 @@ bool PROJECT_LOCAL_SETTINGS::SaveToFile( const wxString& aDirectory, bool aForce
 
 bool PROJECT_LOCAL_SETTINGS::SaveAs( const wxString& aDirectory, const wxString& aFile )
 {
-    Set( "meta.filename", aFile + "." + ProjectLocalSettingsFileExtension );
+    Set( "meta.filename", aFile + "." + FILEEXT::ProjectLocalSettingsFileExtension );
     SetFilename( aFile );
 
     return JSON_SETTINGS::SaveToFile( aDirectory, true );
diff --git a/common/settings/settings_manager.cpp b/common/settings/settings_manager.cpp
index 6de4d25dc1..992de85e4c 100644
--- a/common/settings/settings_manager.cpp
+++ b/common/settings/settings_manager.cpp
@@ -853,8 +853,8 @@ bool SETTINGS_MANAGER::LoadProject( const wxString& aFullPath, bool aSetActive )
     // Normalize path to new format even if migrating from a legacy file
     wxFileName path( aFullPath );
 
-    if( path.GetExt() == LegacyProjectFileExtension )
-        path.SetExt( ProjectFileExtension );
+    if( path.GetExt() == FILEEXT::LegacyProjectFileExtension )
+        path.SetExt( FILEEXT::ProjectFileExtension );
 
     wxString fullPath = path.GetFullPath();
 
@@ -1166,7 +1166,7 @@ bool SETTINGS_MANAGER::BackupProject( REPORTER& aReporter ) const
     wxFileName target;
     target.SetPath( GetProjectBackupsPath() );
     target.SetName( fileName );
-    target.SetExt( ArchiveFileExtension );
+    target.SetExt( FILEEXT::ArchiveFileExtension );
 
     if( !target.DirExists() && !wxMkdir( target.GetPath() ) )
     {
diff --git a/common/widgets/wx_html_report_panel.cpp b/common/widgets/wx_html_report_panel.cpp
index a18838693f..8c50688dff 100644
--- a/common/widgets/wx_html_report_panel.cpp
+++ b/common/widgets/wx_html_report_panel.cpp
@@ -366,7 +366,7 @@ void WX_HTML_REPORT_PANEL::onBtnSaveToFile( wxCommandEvent& event )
         fn = m_reportFileName;
 
     wxFileDialog dlg( this, _( "Save Report File" ), fn.GetPath(), fn.GetFullName(),
-                      TextFileWildcard(), wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
+                      FILEEXT::TextFileWildcard(), wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
 
     if( dlg.ShowModal() != wxID_OK )
         return;
diff --git a/common/wildcards_and_files_ext.cpp b/common/wildcards_and_files_ext.cpp
index 42fecb5847..52eba28183 100644
--- a/common/wildcards_and_files_ext.cpp
+++ b/common/wildcards_and_files_ext.cpp
@@ -122,84 +122,84 @@ wxString AddFileExtListToFilter( const std::vector<std::string>& aExts )
     return files_filter;
 }
 
-const std::string BackupFileSuffix( "-bak" );
-const std::string LockFilePrefix( "~" );
-const std::string LockFileExtension( "lck" );
+const std::string FILEEXT::BackupFileSuffix( "-bak" );
+const std::string FILEEXT::LockFilePrefix( "~" );
+const std::string FILEEXT::LockFileExtension( "lck" );
 
-const std::string KiCadSymbolLibFileExtension( "kicad_sym" );
-const std::string SchematicSymbolFileExtension( "sym" );
-const std::string LegacySymbolLibFileExtension( "lib" );
-const std::string LegacySymbolDocumentFileExtension( "dcm" );
+const std::string FILEEXT::KiCadSymbolLibFileExtension( "kicad_sym" );
+const std::string FILEEXT::SchematicSymbolFileExtension( "sym" );
+const std::string FILEEXT::LegacySymbolLibFileExtension( "lib" );
+const std::string FILEEXT::LegacySymbolDocumentFileExtension( "dcm" );
 
-const std::string VrmlFileExtension( "wrl" );
+const std::string FILEEXT::VrmlFileExtension( "wrl" );
 
-const std::string ProjectFileExtension( "kicad_pro" );
-const std::string LegacyProjectFileExtension( "pro" );
-const std::string ProjectLocalSettingsFileExtension( "kicad_prl" );
-const std::string LegacySchematicFileExtension( "sch" );
-const std::string CadstarSchematicFileExtension( "csa" );
-const std::string CadstarPartsLibraryFileExtension( "lib" );
-const std::string KiCadSchematicFileExtension( "kicad_sch" );
-const std::string SpiceFileExtension( "cir" );
-const std::string CadstarNetlistFileExtension( "frp" );
-const std::string OrCadPcb2NetlistFileExtension( "net" );
-const std::string NetlistFileExtension( "net" );
-const std::string AllegroNetlistFileExtension( "txt" );
-const std::string FootprintAssignmentFileExtension( "cmp" );
-const std::string GerberFileExtension( "gbr" );
-const std::string GerberJobFileExtension( "gbrjob" );
-const std::string HtmlFileExtension( "html" );
-const std::string EquFileExtension( "equ" );
-const std::string HotkeyFileExtension( "hotkeys" );
-const std::string DatabaseLibraryFileExtension( "kicad_dbl" );
-const std::string HTTPLibraryFileExtension( "kicad_httplib" );
+const std::string FILEEXT::ProjectFileExtension( "kicad_pro" );
+const std::string FILEEXT::LegacyProjectFileExtension( "pro" );
+const std::string FILEEXT::ProjectLocalSettingsFileExtension( "kicad_prl" );
+const std::string FILEEXT::LegacySchematicFileExtension( "sch" );
+const std::string FILEEXT::CadstarSchematicFileExtension( "csa" );
+const std::string FILEEXT::CadstarPartsLibraryFileExtension( "lib" );
+const std::string FILEEXT::KiCadSchematicFileExtension( "kicad_sch" );
+const std::string FILEEXT::SpiceFileExtension( "cir" );
+const std::string FILEEXT::CadstarNetlistFileExtension( "frp" );
+const std::string FILEEXT::OrCadPcb2NetlistFileExtension( "net" );
+const std::string FILEEXT::NetlistFileExtension( "net" );
+const std::string FILEEXT::AllegroNetlistFileExtension( "txt" );
+const std::string FILEEXT::FootprintAssignmentFileExtension( "cmp" );
+const std::string FILEEXT::GerberFileExtension( "gbr" );
+const std::string FILEEXT::GerberJobFileExtension( "gbrjob" );
+const std::string FILEEXT::HtmlFileExtension( "html" );
+const std::string FILEEXT::EquFileExtension( "equ" );
+const std::string FILEEXT::HotkeyFileExtension( "hotkeys" );
+const std::string FILEEXT::DatabaseLibraryFileExtension( "kicad_dbl" );
+const std::string FILEEXT::HTTPLibraryFileExtension( "kicad_httplib" );
 
-const std::string ArchiveFileExtension( "zip" );
+const std::string FILEEXT::ArchiveFileExtension( "zip" );
 
-const std::string LegacyPcbFileExtension( "brd" );
-const std::string EaglePcbFileExtension( "brd" );
-const std::string CadstarPcbFileExtension( "cpa" );
-const std::string KiCadPcbFileExtension( "kicad_pcb" );
-const std::string DrawingSheetFileExtension( "kicad_wks" );
-const std::string DesignRulesFileExtension( "kicad_dru" );
+const std::string FILEEXT::LegacyPcbFileExtension( "brd" );
+const std::string FILEEXT::EaglePcbFileExtension( "brd" );
+const std::string FILEEXT::CadstarPcbFileExtension( "cpa" );
+const std::string FILEEXT::KiCadPcbFileExtension( "kicad_pcb" );
+const std::string FILEEXT::DrawingSheetFileExtension( "kicad_wks" );
+const std::string FILEEXT::DesignRulesFileExtension( "kicad_dru" );
 
-const std::string PdfFileExtension( "pdf" );
-const std::string MacrosFileExtension( "mcr" );
-const std::string DrillFileExtension( "drl" );
-const std::string SVGFileExtension( "svg" );
-const std::string ReportFileExtension( "rpt" );
-const std::string FootprintPlaceFileExtension( "pos" );
+const std::string FILEEXT::PdfFileExtension( "pdf" );
+const std::string FILEEXT::MacrosFileExtension( "mcr" );
+const std::string FILEEXT::DrillFileExtension( "drl" );
+const std::string FILEEXT::SVGFileExtension( "svg" );
+const std::string FILEEXT::ReportFileExtension( "rpt" );
+const std::string FILEEXT::FootprintPlaceFileExtension( "pos" );
 
-const std::string KiCadFootprintLibPathExtension( "pretty" );   // this is a directory
-const std::string LegacyFootprintLibPathExtension( "mod" );     // this is a file
-const std::string AltiumFootprintLibPathExtension( "PcbLib" );  // this is a file
-const std::string CadstarFootprintLibPathExtension( "cpa" );    // this is a file
-const std::string EagleFootprintLibPathExtension( "lbr" );      // this is a file
-const std::string GedaPcbFootprintLibFileExtension( "fp" );     // this is a file
+const std::string FILEEXT::KiCadFootprintLibPathExtension( "pretty" ); // this is a directory
+const std::string FILEEXT::LegacyFootprintLibPathExtension( "mod" );   // this is a file
+const std::string FILEEXT::AltiumFootprintLibPathExtension( "PcbLib" ); // this is a file
+const std::string FILEEXT::CadstarFootprintLibPathExtension( "cpa" );   // this is a file
+const std::string FILEEXT::EagleFootprintLibPathExtension( "lbr" );     // this is a file
+const std::string FILEEXT::GedaPcbFootprintLibFileExtension( "fp" );    // this is a file
 
-const std::string KiCadFootprintFileExtension( "kicad_mod" );
-const std::string SpecctraDsnFileExtension( "dsn" );
-const std::string SpecctraSessionFileExtension( "ses" );
-const std::string IpcD356FileExtension( "d356" );
-const std::string Ipc2581FileExtension( "xml" );
-const std::string WorkbookFileExtension( "wbk" );
+const std::string FILEEXT::KiCadFootprintFileExtension( "kicad_mod" );
+const std::string FILEEXT::SpecctraDsnFileExtension( "dsn" );
+const std::string FILEEXT::SpecctraSessionFileExtension( "ses" );
+const std::string FILEEXT::IpcD356FileExtension( "d356" );
+const std::string FILEEXT::Ipc2581FileExtension( "xml" );
+const std::string FILEEXT::WorkbookFileExtension( "wbk" );
 
-const std::string PngFileExtension( "png" );
-const std::string JpegFileExtension( "jpg" );
-const std::string TextFileExtension( "txt" );
-const std::string MarkdownFileExtension( "md" );
-const std::string CsvFileExtension( "csv" );
-const std::string XmlFileExtension( "xml" );
-const std::string JsonFileExtension( "json" );
+const std::string FILEEXT::PngFileExtension( "png" );
+const std::string FILEEXT::JpegFileExtension( "jpg" );
+const std::string FILEEXT::TextFileExtension( "txt" );
+const std::string FILEEXT::MarkdownFileExtension( "md" );
+const std::string FILEEXT::CsvFileExtension( "csv" );
+const std::string FILEEXT::XmlFileExtension( "xml" );
+const std::string FILEEXT::JsonFileExtension( "json" );
 
-const std::string StepFileExtension( "step" );
-const std::string StepFileAbrvExtension( "stp" );
-const std::string GltfBinaryFileExtension( "glb" );
+const std::string FILEEXT::StepFileExtension( "step" );
+const std::string FILEEXT::StepFileAbrvExtension( "stp" );
+const std::string FILEEXT::GltfBinaryFileExtension( "glb" );
 
-const wxString GerberFileExtensionsRegex( "(gbr|gko|pho|(g[tb][alops])|(gm?\\d\\d*)|(gp[tb]))" );
+const wxString FILEEXT::GerberFileExtensionsRegex( "(gbr|gko|pho|(g[tb][alops])|(gm?\\d\\d*)|(gp[tb]))" );
 
 
-bool IsGerberFileExtension( const wxString& ext )
+bool FILEEXT::IsGerberFileExtension( const wxString& ext )
 {
     static wxRegEx gerberRE( GerberFileExtensionsRegex, wxRE_ICASE );
 
@@ -207,125 +207,125 @@ bool IsGerberFileExtension( const wxString& ext )
 }
 
 
-wxString AllFilesWildcard()
+wxString FILEEXT::AllFilesWildcard()
 {
     return _( "All files" ) + AddFileExtListToFilter( {} );
 }
 
 
-wxString KiCadSymbolLibFileWildcard()
+wxString FILEEXT::KiCadSymbolLibFileWildcard()
 {
     return _( "KiCad symbol library files" )
             + AddFileExtListToFilter( { KiCadSymbolLibFileExtension } );
 }
 
 
-wxString ProjectFileWildcard()
+wxString FILEEXT::ProjectFileWildcard()
 {
     return _( "KiCad project files" ) + AddFileExtListToFilter( { ProjectFileExtension } );
 }
 
 
-wxString LegacyProjectFileWildcard()
+wxString FILEEXT::LegacyProjectFileWildcard()
 {
     return _( "KiCad legacy project files" )
             + AddFileExtListToFilter( { LegacyProjectFileExtension } );
 }
 
 
-wxString AllProjectFilesWildcard()
+wxString FILEEXT::AllProjectFilesWildcard()
 {
     return _( "All KiCad project files" )
             + AddFileExtListToFilter( { ProjectFileExtension, LegacyProjectFileExtension } );
 }
 
 
-wxString AllSchematicFilesWildcard()
+wxString FILEEXT::AllSchematicFilesWildcard()
 {
     return _( "All KiCad schematic files" )
             + AddFileExtListToFilter( { KiCadSchematicFileExtension, LegacySchematicFileExtension } );
 }
 
 
-wxString LegacySchematicFileWildcard()
+wxString FILEEXT::LegacySchematicFileWildcard()
 {
     return _( "KiCad legacy schematic files" )
             + AddFileExtListToFilter( { LegacySchematicFileExtension } );
 }
 
 
-wxString KiCadSchematicFileWildcard()
+wxString FILEEXT::KiCadSchematicFileWildcard()
 {
     return _( "KiCad s-expression schematic files" )
             + AddFileExtListToFilter( { KiCadSchematicFileExtension } );
 }
 
 
-wxString CadstarArchiveFilesWildcard()
+wxString FILEEXT::CadstarArchiveFilesWildcard()
 {
     return _( "CADSTAR Archive files" ) + AddFileExtListToFilter( { "csa", "cpa" } );
 }
 
 
-wxString EagleFilesWildcard()
+wxString FILEEXT::EagleFilesWildcard()
 {
     return _( "Eagle XML files" ) + AddFileExtListToFilter( { "sch", "brd" } );
 }
 
 
-wxString OrCadPcb2NetlistFileWildcard()
+wxString FILEEXT::OrCadPcb2NetlistFileWildcard()
 {
     return _( "OrcadPCB2 netlist files" )
             + AddFileExtListToFilter( { OrCadPcb2NetlistFileExtension } );
 }
 
 
-wxString NetlistFileWildcard()
+wxString FILEEXT::NetlistFileWildcard()
 {
     return _( "KiCad netlist files" ) + AddFileExtListToFilter( { "net" } );
 }
 
 
-wxString AllegroNetlistFileWildcard()
+wxString FILEEXT::AllegroNetlistFileWildcard()
 {
     return _( "Allegro netlist files" )
             + AddFileExtListToFilter( { AllegroNetlistFileExtension } );
 }
 
 
-wxString EasyEdaArchiveWildcard()
+wxString FILEEXT::EasyEdaArchiveWildcard()
 {
     return _( "EasyEDA (JLCEDA) Std backup archive" ) + AddFileExtListToFilter( { "zip" } );
 }
 
 
-wxString EasyEdaProFileWildcard()
+wxString FILEEXT::EasyEdaProFileWildcard()
 {
     return _( "EasyEDA (JLCEDA) Pro files" ) + AddFileExtListToFilter( { "epro", "zip" } );
 }
 
 
-wxString PcbFileWildcard()
+wxString FILEEXT::PcbFileWildcard()
 {
     return _( "KiCad printed circuit board files" )
            + AddFileExtListToFilter( { KiCadPcbFileExtension } );
 }
 
 
-wxString KiCadFootprintLibFileWildcard()
+wxString FILEEXT::KiCadFootprintLibFileWildcard()
 {
     return _( "KiCad footprint files" ) + AddFileExtListToFilter( { KiCadFootprintFileExtension } );
 }
 
 
-wxString KiCadFootprintLibPathWildcard()
+wxString FILEEXT::KiCadFootprintLibPathWildcard()
 {
     return _( "KiCad footprint library paths" )
             + AddFileExtListToFilter( { KiCadFootprintLibPathExtension } );
 }
 
 
-wxString DrawingSheetFileWildcard()
+wxString FILEEXT::DrawingSheetFileWildcard()
 {
     return _( "Drawing sheet files" )
             + AddFileExtListToFilter( { DrawingSheetFileExtension } );
@@ -333,7 +333,7 @@ wxString DrawingSheetFileWildcard()
 
 
 // Wildcard for cvpcb symbol to footprint link file
-wxString FootprintAssignmentFileWildcard()
+wxString FILEEXT::FootprintAssignmentFileWildcard()
 {
     return _( "KiCad symbol footprint link files" )
             + AddFileExtListToFilter( { FootprintAssignmentFileExtension } );
@@ -341,180 +341,180 @@ wxString FootprintAssignmentFileWildcard()
 
 
 // Wildcard for reports and fabrication documents
-wxString DrillFileWildcard()
+wxString FILEEXT::DrillFileWildcard()
 {
     return _( "Drill files" )
             + AddFileExtListToFilter( { DrillFileExtension, "nc", "xnc", "txt" } );
 }
 
 
-wxString SVGFileWildcard()
+wxString FILEEXT::SVGFileWildcard()
 {
     return _( "SVG files" ) + AddFileExtListToFilter( { SVGFileExtension } );
 }
 
 
-wxString HtmlFileWildcard()
+wxString FILEEXT::HtmlFileWildcard()
 {
     return _( "HTML files" ) + AddFileExtListToFilter( { "htm", "html" } );
 }
 
 
-wxString CsvFileWildcard()
+wxString FILEEXT::CsvFileWildcard()
 {
     return _( "CSV Files" ) + AddFileExtListToFilter( { CsvFileExtension } );
 }
 
 
-wxString PdfFileWildcard()
+wxString FILEEXT::PdfFileWildcard()
 {
     return _( "Portable document format files" ) + AddFileExtListToFilter( { "pdf" } );
 }
 
 
-wxString PSFileWildcard()
+wxString FILEEXT::PSFileWildcard()
 {
     return _( "PostScript files" ) + AddFileExtListToFilter( { "ps" } );
 }
 
 
-wxString JsonFileWildcard()
+wxString FILEEXT::JsonFileWildcard()
 {
     return _( "Json files" ) + AddFileExtListToFilter( { JsonFileExtension } );
 }
 
 
-wxString ReportFileWildcard()
+wxString FILEEXT::ReportFileWildcard()
 {
     return _( "Report files" ) + AddFileExtListToFilter( { ReportFileExtension } );
 }
 
 
-wxString FootprintPlaceFileWildcard()
+wxString FILEEXT::FootprintPlaceFileWildcard()
 {
     return _( "Component placement files" ) + AddFileExtListToFilter( { "pos" } );
 }
 
 
-wxString Shapes3DFileWildcard()
+wxString FILEEXT::Shapes3DFileWildcard()
 {
     return _( "VRML and X3D files" ) + AddFileExtListToFilter( { "wrl", "x3d" } );
 }
 
 
-wxString IDF3DFileWildcard()
+wxString FILEEXT::IDF3DFileWildcard()
 {
     return _( "IDFv3 footprint files" ) + AddFileExtListToFilter( { "idf" } );
 }
 
 
-wxString TextFileWildcard()
+wxString FILEEXT::TextFileWildcard()
 {
     return _( "Text files" ) + AddFileExtListToFilter( { "txt" } );
 }
 
 
-wxString ModLegacyExportFileWildcard()
+wxString FILEEXT::ModLegacyExportFileWildcard()
 {
     return _( "Legacy footprint export files" ) + AddFileExtListToFilter( { "emp" } );
 }
 
 
-wxString ErcFileWildcard()
+wxString FILEEXT::ErcFileWildcard()
 {
     return _( "Electrical rule check file" ) + AddFileExtListToFilter( { "erc" } );
 }
 
 
-wxString SpiceLibraryFileWildcard()
+wxString FILEEXT::SpiceLibraryFileWildcard()
 {
     return _( "Spice library file" ) + AddFileExtListToFilter( { "lib", "mod" } );
 }
 
 
-wxString SpiceNetlistFileWildcard()
+wxString FILEEXT::SpiceNetlistFileWildcard()
 {
     return _( "SPICE netlist file" ) + AddFileExtListToFilter( { "cir" } );
 }
 
 
-wxString CadstarNetlistFileWildcard()
+wxString FILEEXT::CadstarNetlistFileWildcard()
 {
     return _( "CadStar netlist file" ) + AddFileExtListToFilter( { "frp" } );
 }
 
 
-wxString EquFileWildcard()
+wxString FILEEXT::EquFileWildcard()
 {
     return _( "Symbol footprint association files" ) + AddFileExtListToFilter( { "equ" } );
 }
 
 
-wxString ZipFileWildcard()
+wxString FILEEXT::ZipFileWildcard()
 {
     return _( "Zip file" ) + AddFileExtListToFilter( { "zip" } );
 }
 
 
-wxString GencadFileWildcard()
+wxString FILEEXT::GencadFileWildcard()
 {
     return _( "GenCAD 1.4 board files" ) + AddFileExtListToFilter( { "cad" } );
 }
 
 
-wxString DxfFileWildcard()
+wxString FILEEXT::DxfFileWildcard()
 {
     return _( "DXF Files" ) + AddFileExtListToFilter( { "dxf" } );
 }
 
 
-wxString GerberJobFileWildcard()
+wxString FILEEXT::GerberJobFileWildcard()
 {
     return _( "Gerber job file" ) + AddFileExtListToFilter( { GerberJobFileExtension } );
 }
 
 
-wxString SpecctraDsnFileWildcard()
+wxString FILEEXT::SpecctraDsnFileWildcard()
 {
     return _( "Specctra DSN file" )
             + AddFileExtListToFilter( { SpecctraDsnFileExtension } );
 }
 
 
-wxString SpecctraSessionFileWildcard()
+wxString FILEEXT::SpecctraSessionFileWildcard()
 {
     return _( "Specctra Session file" )
             + AddFileExtListToFilter( { SpecctraSessionFileExtension } );
 }
 
 
-wxString IpcD356FileWildcard()
+wxString FILEEXT::IpcD356FileWildcard()
 {
     return _( "IPC-D-356 Test Files" )
             + AddFileExtListToFilter( { IpcD356FileExtension } );
 }
 
 
-wxString WorkbookFileWildcard()
+wxString FILEEXT::WorkbookFileWildcard()
 {
     return _( "Workbook file" )
             + AddFileExtListToFilter( { WorkbookFileExtension } );
 }
 
 
-wxString PngFileWildcard()
+wxString FILEEXT::PngFileWildcard()
 {
     return _( "PNG file" ) + AddFileExtListToFilter( { "png" } );
 }
 
 
-wxString JpegFileWildcard()
+wxString FILEEXT::JpegFileWildcard()
 {
     return _( "Jpeg file" ) + AddFileExtListToFilter( { "jpg", "jpeg" } );
 }
 
 
-wxString HotkeyFileWildcard()
+wxString FILEEXT::HotkeyFileWildcard()
 {
     return _( "Hotkey file" ) + AddFileExtListToFilter( { HotkeyFileExtension } );
 }
diff --git a/cvpcb/dialogs/dialog_config_equfiles.cpp b/cvpcb/dialogs/dialog_config_equfiles.cpp
index 56de032698..09e95bd1d3 100644
--- a/cvpcb/dialogs/dialog_config_equfiles.cpp
+++ b/cvpcb/dialogs/dialog_config_equfiles.cpp
@@ -208,7 +208,7 @@ void DIALOG_CONFIG_EQUFILES::OnAddFiles( wxCommandEvent& event )
     wxString   libpath = m_gridEnvVars->GetCellValue( wxGridCellCoords( row, 1 ) );
 
     wxFileDialog dlg( this, _( "Footprint Association File" ), libpath, wxEmptyString,
-                      EquFileWildcard(), wxFD_DEFAULT_STYLE | wxFD_MULTIPLE );
+                      FILEEXT::EquFileWildcard(), wxFD_DEFAULT_STYLE | wxFD_MULTIPLE );
 
     if( dlg.ShowModal() != wxID_OK )
         return;
diff --git a/eeschema/dialogs/dialog_erc.cpp b/eeschema/dialogs/dialog_erc.cpp
index 2661523e1b..33a04b0b5b 100644
--- a/eeschema/dialogs/dialog_erc.cpp
+++ b/eeschema/dialogs/dialog_erc.cpp
@@ -880,10 +880,10 @@ void DIALOG_ERC::deleteAllMarkers( bool aIncludeExclusions )
 
 void DIALOG_ERC::OnSaveReport( wxCommandEvent& aEvent )
 {
-    wxFileName fn( wxS( "ERC." ) + ReportFileExtension );
+    wxFileName fn( wxS( "ERC." ) + FILEEXT::ReportFileExtension );
 
     wxFileDialog dlg( this, _( "Save Report File" ), Prj().GetProjectPath(), fn.GetFullName(),
-                      ReportFileWildcard() + wxS( "|" ) + JsonFileWildcard(),
+                      FILEEXT::ReportFileWildcard() + wxS( "|" ) + FILEEXT::JsonFileWildcard(),
                       wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
 
     if( dlg.ShowModal() != wxID_OK )
@@ -892,7 +892,7 @@ void DIALOG_ERC::OnSaveReport( wxCommandEvent& aEvent )
     fn = dlg.GetPath();
 
     if( fn.GetExt().IsEmpty() )
-        fn.SetExt( ReportFileExtension );
+        fn.SetExt( FILEEXT::ReportFileExtension );
 
     if( !fn.IsAbsolute() )
     {
@@ -903,7 +903,7 @@ void DIALOG_ERC::OnSaveReport( wxCommandEvent& aEvent )
     ERC_REPORT reportWriter( &m_parent->Schematic(), m_parent->GetUserUnits() );
 
     bool success = false;
-    if( fn.GetExt() == JsonFileExtension )
+    if( fn.GetExt() == FILEEXT::JsonFileExtension )
         success = reportWriter.WriteJsonReport( fn.GetFullPath() );
     else
         success = reportWriter.WriteTextReport( fn.GetFullPath() );
diff --git a/eeschema/dialogs/dialog_export_netlist.cpp b/eeschema/dialogs/dialog_export_netlist.cpp
index e1a926b24a..7d24a3bb35 100644
--- a/eeschema/dialogs/dialog_export_netlist.cpp
+++ b/eeschema/dialogs/dialog_export_netlist.cpp
@@ -523,7 +523,7 @@ bool DIALOG_EXPORT_NETLIST::TransferDataFromWindow()
 
     if( runExternalSpiceCommand )
     {
-        fn.SetExt( SpiceFileExtension );
+        fn.SetExt( FILEEXT::SpiceFileExtension );
         fullpath = fn.GetFullPath();
     }
     else
@@ -647,32 +647,32 @@ bool DIALOG_EXPORT_NETLIST::FilenamePrms( NETLIST_TYPE_ID aType, wxString * aExt
     switch( aType )
     {
     case NET_TYPE_SPICE:
-        fileExt = SpiceFileExtension;
-        fileWildcard = SpiceNetlistFileWildcard();
+        fileExt = FILEEXT::SpiceFileExtension;
+        fileWildcard = FILEEXT::SpiceNetlistFileWildcard();
         break;
 
     case NET_TYPE_CADSTAR:
-        fileExt = CadstarNetlistFileExtension;
-        fileWildcard = CadstarNetlistFileWildcard();
+        fileExt = FILEEXT::CadstarNetlistFileExtension;
+        fileWildcard = FILEEXT::CadstarNetlistFileWildcard();
         break;
 
     case NET_TYPE_ORCADPCB2:
-        fileExt = OrCadPcb2NetlistFileExtension;
-        fileWildcard = OrCadPcb2NetlistFileWildcard();
+        fileExt = FILEEXT::OrCadPcb2NetlistFileExtension;
+        fileWildcard = FILEEXT::OrCadPcb2NetlistFileWildcard();
         break;
 
     case NET_TYPE_PCBNEW:
-        fileExt = NetlistFileExtension;
-        fileWildcard = NetlistFileWildcard();
+        fileExt = FILEEXT::NetlistFileExtension;
+        fileWildcard = FILEEXT::NetlistFileWildcard();
         break;
 
     case NET_TYPE_ALLEGRO:
-        fileExt = AllegroNetlistFileExtension;
-        fileWildcard = AllegroNetlistFileWildcard();
+        fileExt = FILEEXT::AllegroNetlistFileExtension;
+        fileWildcard = FILEEXT::AllegroNetlistFileWildcard();
         break;
 
     default:    // custom, NET_TYPE_CUSTOM1 and greater
-        fileWildcard = AllFilesWildcard();
+        fileWildcard = FILEEXT::AllFilesWildcard();
         ret = false;
     }
 
diff --git a/eeschema/dialogs/dialog_field_properties.cpp b/eeschema/dialogs/dialog_field_properties.cpp
index 5940eb6f1c..07327ee51a 100644
--- a/eeschema/dialogs/dialog_field_properties.cpp
+++ b/eeschema/dialogs/dialog_field_properties.cpp
@@ -364,7 +364,7 @@ bool DIALOG_FIELD_PROPERTIES::TransferDataFromWindow()
     }
     else if( m_fieldId == SHEETFILENAME_V )
     {
-        m_text = EnsureFileExtension( m_text, KiCadSchematicFileExtension );
+        m_text = EnsureFileExtension( m_text, FILEEXT::KiCadSchematicFileExtension );
     }
 
     m_position = VECTOR2I( m_posX.GetValue(), m_posY.GetValue() );
diff --git a/eeschema/dialogs/dialog_sch_import_settings.cpp b/eeschema/dialogs/dialog_sch_import_settings.cpp
index 0612a58289..5d73098e91 100644
--- a/eeschema/dialogs/dialog_sch_import_settings.cpp
+++ b/eeschema/dialogs/dialog_sch_import_settings.cpp
@@ -55,10 +55,11 @@ bool DIALOG_SCH_IMPORT_SETTINGS::TransferDataToWindow()
 void DIALOG_SCH_IMPORT_SETTINGS::OnBrowseClicked( wxCommandEvent& event )
 {
     wxFileName fn = m_frame->Schematic().Root().GetFileName();
-    fn.SetExt( ProjectFileExtension );
+    fn.SetExt( FILEEXT::ProjectFileExtension );
 
     wxFileDialog dlg( this, _( "Import Settings From" ), fn.GetPath(), fn.GetFullName(),
-                      ProjectFileWildcard(), wxFD_OPEN | wxFD_FILE_MUST_EXIST | wxFD_CHANGE_DIR );
+                      FILEEXT::ProjectFileWildcard(),
+                      wxFD_OPEN | wxFD_FILE_MUST_EXIST | wxFD_CHANGE_DIR );
 
     if( dlg.ShowModal() == wxID_OK )
         m_filePathCtrl->SetValue( dlg.GetPath() );
diff --git a/eeschema/dialogs/dialog_sheet_properties.cpp b/eeschema/dialogs/dialog_sheet_properties.cpp
index dfb6835bbe..c2f9b71ebf 100644
--- a/eeschema/dialogs/dialog_sheet_properties.cpp
+++ b/eeschema/dialogs/dialog_sheet_properties.cpp
@@ -273,7 +273,7 @@ bool DIALOG_SHEET_PROPERTIES::TransferDataFromWindow()
 
     // Ensure the filename extension is OK.  (In normal use will be caught by grid validators,
     // but unedited data from existing files can be bad.)
-    sheetFileName = EnsureFileExtension( sheetFileName, KiCadSchematicFileExtension );
+    sheetFileName = EnsureFileExtension( sheetFileName, FILEEXT::KiCadSchematicFileExtension );
 
     wxFileName fn( sheetFileName );
     wxString newRelativeFilename = fn.GetFullPath();
@@ -416,7 +416,8 @@ bool DIALOG_SHEET_PROPERTIES::TransferDataFromWindow()
 bool DIALOG_SHEET_PROPERTIES::onSheetFilenameChanged( const wxString& aNewFilename )
 {
     wxString   msg;
-    wxFileName sheetFileName( EnsureFileExtension( aNewFilename, KiCadSchematicFileExtension ) );
+    wxFileName sheetFileName(
+            EnsureFileExtension( aNewFilename, FILEEXT::KiCadSchematicFileExtension ) );
 
     // Sheet file names are relative to the path of the current sheet.  This allows for
     // nesting of schematic files in subfolders.  Screen file names are always absolute.
diff --git a/eeschema/dialogs/dialog_symbol_fields_table.cpp b/eeschema/dialogs/dialog_symbol_fields_table.cpp
index 6329b23bb1..11f794a8e6 100644
--- a/eeschema/dialogs/dialog_symbol_fields_table.cpp
+++ b/eeschema/dialogs/dialog_symbol_fields_table.cpp
@@ -1192,10 +1192,10 @@ void DIALOG_SYMBOL_FIELDS_TABLE::OnOutputFileBrowseClicked( wxCommandEvent& even
 
     // Calculate the export filename
     wxFileName fn( Prj().AbsolutePath( m_parent->Schematic().GetFileName() ) );
-    fn.SetExt( CsvFileExtension );
+    fn.SetExt( FILEEXT::CsvFileExtension );
 
     wxFileDialog saveDlg( this, _( "Bill of Materials Output File" ), path, fn.GetFullName(),
-                          CsvFileWildcard(), wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
+                          FILEEXT::CsvFileWildcard(), wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
 
     if( saveDlg.ShowModal() == wxID_CANCEL )
         return;
diff --git a/eeschema/dialogs/dialog_symbol_remap.cpp b/eeschema/dialogs/dialog_symbol_remap.cpp
index 23ffd94ca6..5a2fbe5dd0 100644
--- a/eeschema/dialogs/dialog_symbol_remap.cpp
+++ b/eeschema/dialogs/dialog_symbol_remap.cpp
@@ -453,7 +453,7 @@ bool DIALOG_SYMBOL_REMAP::backupProject( REPORTER& aReporter )
         // Back up the cache library.
         srcFileName.SetPath( Prj().GetProjectPath() );
         srcFileName.SetName( Prj().GetProjectName() + wxS( "-cache" ) );
-        srcFileName.SetExt( LegacySymbolLibFileExtension );
+        srcFileName.SetExt( FILEEXT::LegacySymbolLibFileExtension );
 
         destFileName = srcFileName;
         destFileName.SetName( destFileName.GetName() + timeStamp );
@@ -488,7 +488,7 @@ bool DIALOG_SYMBOL_REMAP::backupProject( REPORTER& aReporter )
         }
 
         // Back up the rescue symbol library document file if it exists.
-        srcFileName.SetExt( LegacySymbolDocumentFileExtension );
+        srcFileName.SetExt( FILEEXT::LegacySymbolDocumentFileExtension );
         destFileName.SetExt( srcFileName.GetExt() );
 
         tmp.Printf( _( "Backing up file '%s' to '%s'." ),
diff --git a/eeschema/dialogs/panel_sym_lib_table.cpp b/eeschema/dialogs/panel_sym_lib_table.cpp
index 2e2639d2c4..385b313483 100644
--- a/eeschema/dialogs/panel_sym_lib_table.cpp
+++ b/eeschema/dialogs/panel_sym_lib_table.cpp
@@ -410,7 +410,7 @@ bool PANEL_SYM_LIB_TABLE::allowAutomaticPluginTypeSelection( wxString& aLibraryP
 
     // Currently, only the extension .lib is common to legacy libraries and Cadstar libraries
     // so return false in this case
-    if( ext == LegacySymbolLibFileExtension )
+    if( ext == FILEEXT::LegacySymbolLibFileExtension )
         return false;
 
     return true;
diff --git a/eeschema/eeschema.cpp b/eeschema/eeschema.cpp
index ee509ee289..5dc0eb9ef5 100644
--- a/eeschema/eeschema.cpp
+++ b/eeschema/eeschema.cpp
@@ -489,10 +489,10 @@ void IFACE::SaveFileAs( const wxString& aProjectBasePath, const wxString& aProje
 
     destFile.SetPath( destPath );
 
-    if( ext == LegacySchematicFileExtension ||
-        ext == LegacySchematicFileExtension + BackupFileSuffix ||
-        ext == KiCadSchematicFileExtension ||
-        ext == KiCadSchematicFileExtension + BackupFileSuffix )
+    if( ext == FILEEXT::LegacySchematicFileExtension
+        || ext == FILEEXT::LegacySchematicFileExtension + FILEEXT::BackupFileSuffix
+        || ext == FILEEXT::KiCadSchematicFileExtension
+        || ext == FILEEXT::KiCadSchematicFileExtension + FILEEXT::BackupFileSuffix )
     {
         if( destFile.GetName() == aProjectName )
         {
@@ -522,13 +522,14 @@ void IFACE::SaveFileAs( const wxString& aProjectBasePath, const wxString& aProje
 
         KiCopyFile( aSrcFilePath, destFile.GetFullPath(), aErrors );
     }
-    else if( ext == SchematicSymbolFileExtension )
+    else if( ext == FILEEXT::SchematicSymbolFileExtension )
     {
         // Symbols are not project-specific.  Keep their source names.
         KiCopyFile( aSrcFilePath, destFile.GetFullPath(), aErrors );
     }
-    else if( ext == LegacySymbolLibFileExtension || ext == LegacySymbolDocumentFileExtension ||
-             ext == KiCadSymbolLibFileExtension )
+    else if( ext == FILEEXT::LegacySymbolLibFileExtension
+             || ext == FILEEXT::LegacySymbolDocumentFileExtension
+             || ext == FILEEXT::KiCadSymbolLibFileExtension )
     {
         if( destFile.GetName() == aProjectName + wxS( "-cache" ) )
             destFile.SetName( aNewProjectName + wxS( "-cache" ) );
@@ -538,7 +539,7 @@ void IFACE::SaveFileAs( const wxString& aProjectBasePath, const wxString& aProje
 
         KiCopyFile( aSrcFilePath, destFile.GetFullPath(), aErrors );
     }
-    else if( ext == NetlistFileExtension )
+    else if( ext == FILEEXT::NetlistFileExtension )
     {
         bool success = false;
 
diff --git a/eeschema/eeschema_config.cpp b/eeschema/eeschema_config.cpp
index bc7bd32b25..ecdcea32dc 100644
--- a/eeschema/eeschema_config.cpp
+++ b/eeschema/eeschema_config.cpp
@@ -126,7 +126,7 @@ void SCH_EDIT_FRAME::saveProjectSettings()
 {
     wxFileName fn = Schematic().RootScreen()->GetFileName();  //ConfigFileName
 
-    fn.SetExt( ProjectFileExtension );
+    fn.SetExt( FILEEXT::ProjectFileExtension );
 
     if( !fn.HasName() || !IsWritable( fn, false ) )
         return;
diff --git a/eeschema/eeschema_helpers.cpp b/eeschema/eeschema_helpers.cpp
index 3c03c42675..56767601e0 100644
--- a/eeschema/eeschema_helpers.cpp
+++ b/eeschema/eeschema_helpers.cpp
@@ -80,9 +80,9 @@ PROJECT* EESCHEMA_HELPERS::GetDefaultProject()
 
 SCHEMATIC* EESCHEMA_HELPERS::LoadSchematic( wxString& aFileName )
 {
-    if( aFileName.EndsWith( KiCadSchematicFileExtension ) )
+    if( aFileName.EndsWith( FILEEXT::KiCadSchematicFileExtension ) )
         return LoadSchematic( aFileName, SCH_IO_MGR::SCH_KICAD );
-    else if( aFileName.EndsWith( LegacySchematicFileExtension ) )
+    else if( aFileName.EndsWith( FILEEXT::LegacySchematicFileExtension ) )
         return LoadSchematic( aFileName, SCH_IO_MGR::SCH_LEGACY );
 
     // as fall back for any other kind use the legacy format
@@ -93,7 +93,7 @@ SCHEMATIC* EESCHEMA_HELPERS::LoadSchematic( wxString& aFileName )
 SCHEMATIC* EESCHEMA_HELPERS::LoadSchematic( wxString& aFileName, SCH_IO_MGR::SCH_FILE_T aFormat )
 {
     wxFileName pro = aFileName;
-    pro.SetExt( ProjectFileExtension );
+    pro.SetExt( FILEEXT::ProjectFileExtension );
     pro.MakeAbsolute();
     wxString projectPath = pro.GetFullPath();
 
diff --git a/eeschema/eeschema_jobs_handler.cpp b/eeschema/eeschema_jobs_handler.cpp
index fc9350c685..678b55e557 100644
--- a/eeschema/eeschema_jobs_handler.cpp
+++ b/eeschema/eeschema_jobs_handler.cpp
@@ -278,28 +278,28 @@ int EESCHEMA_JOBS_HANDLER::JobExportNetlist( JOB* aJob )
     switch( aNetJob->format )
     {
     case JOB_EXPORT_SCH_NETLIST::FORMAT::KICADSEXPR:
-        fileExt = NetlistFileExtension;
+        fileExt = FILEEXT::NetlistFileExtension;
         helper = std::make_unique<NETLIST_EXPORTER_KICAD>( sch );
         break;
 
     case JOB_EXPORT_SCH_NETLIST::FORMAT::ORCADPCB2:
-        fileExt = OrCadPcb2NetlistFileExtension;
+        fileExt = FILEEXT::OrCadPcb2NetlistFileExtension;
         helper = std::make_unique<NETLIST_EXPORTER_ORCADPCB2>( sch );
         break;
 
     case JOB_EXPORT_SCH_NETLIST::FORMAT::CADSTAR:
-        fileExt = CadstarNetlistFileExtension;
+        fileExt = FILEEXT::CadstarNetlistFileExtension;
         helper = std::make_unique<NETLIST_EXPORTER_CADSTAR>( sch );
         break;
 
     case JOB_EXPORT_SCH_NETLIST::FORMAT::SPICE:
-        fileExt = SpiceFileExtension;
+        fileExt = FILEEXT::SpiceFileExtension;
         netlistOption = NETLIST_EXPORTER_SPICE::OPTION_SIM_COMMAND;
         helper = std::make_unique<NETLIST_EXPORTER_SPICE>( sch );
         break;
 
     case JOB_EXPORT_SCH_NETLIST::FORMAT::SPICEMODEL:
-        fileExt = SpiceFileExtension;
+        fileExt = FILEEXT::SpiceFileExtension;
         helper = std::make_unique<NETLIST_EXPORTER_SPICE_MODEL>( sch );
         break;
 
@@ -520,7 +520,7 @@ int EESCHEMA_JOBS_HANDLER::JobExportBom( JOB* aJob )
     {
         wxFileName fn = sch->GetFileName();
         fn.SetName( fn.GetName() );
-        fn.SetExt( CsvFileExtension );
+        fn.SetExt( FILEEXT::CsvFileExtension );
 
         aBomJob->m_outputFile = fn.GetFullName();
     }
@@ -638,7 +638,7 @@ int EESCHEMA_JOBS_HANDLER::JobExportPythonBom( JOB* aJob )
     {
         wxFileName fn = sch->GetFileName();
         fn.SetName( fn.GetName() + "-bom" );
-        fn.SetExt( XmlFileExtension );
+        fn.SetExt( FILEEXT::XmlFileExtension );
 
         aNetJob->m_outputFile = fn.GetFullName();
     }
@@ -699,7 +699,7 @@ int EESCHEMA_JOBS_HANDLER::doSymExportSvg( JOB_SYM_EXPORT_SVG*         aSvgJob,
             size_t     forbidden_char;
 
             fn.SetPath( aSvgJob->m_outputDirectory );
-            fn.SetExt( SVGFileExtension );
+            fn.SetExt( FILEEXT::SVGFileExtension );
 
             filename = symbol->GetName().Lower();
 
@@ -951,9 +951,9 @@ int EESCHEMA_JOBS_HANDLER::JobSchErc( JOB* aJob )
         fn.SetName( fn.GetName() );
 
         if( ercJob->m_format == JOB_SCH_ERC::OUTPUT_FORMAT::JSON )
-            fn.SetExt( JsonFileExtension );
+            fn.SetExt( FILEEXT::JsonFileExtension );
         else
-            fn.SetExt( ReportFileExtension );
+            fn.SetExt( FILEEXT::ReportFileExtension );
 
         ercJob->m_outputFile = fn.GetFullName();
     }
diff --git a/eeschema/fields_grid_table.cpp b/eeschema/fields_grid_table.cpp
index 02840521ac..d59e562726 100644
--- a/eeschema/fields_grid_table.cpp
+++ b/eeschema/fields_grid_table.cpp
@@ -225,7 +225,7 @@ void FIELDS_GRID_TABLE<T>::initGrid( WX_GRID* aGrid )
     // Create a wild card using wxFileDialog syntax.
     wxString wildCard( _( "Schematic Files" ) );
     std::vector<std::string> exts;
-    exts.push_back( KiCadSchematicFileExtension );
+    exts.push_back( FILEEXT::KiCadSchematicFileExtension );
     wildCard += AddFileExtListToFilter( exts );
 
     auto filepathEditor = new GRID_CELL_PATH_EDITOR( m_dialog, aGrid, &m_curdir, wildCard );
@@ -691,7 +691,7 @@ void FIELDS_GRID_TABLE<T>::SetValue( int aRow, int aCol, const wxString &aValue
     {
         if( m_parentType == SCH_SHEET_T && aRow == SHEETFILENAME )
         {
-            value = EnsureFileExtension( value, KiCadSchematicFileExtension );
+            value = EnsureFileExtension( value, FILEEXT::KiCadSchematicFileExtension );
         }
         else if( m_parentType == LIB_SYMBOL_T && aRow == VALUE_FIELD )
         {
diff --git a/eeschema/files-io.cpp b/eeschema/files-io.cpp
index 6d829dbe14..37fb947685 100644
--- a/eeschema/files-io.cpp
+++ b/eeschema/files-io.cpp
@@ -122,7 +122,7 @@ bool SCH_EDIT_FRAME::OpenProjectFiles( const std::vector<wxString>& aFileSet, in
 #endif
 
     wxFileName pro = fullFileName;
-    pro.SetExt( ProjectFileExtension );
+    pro.SetExt( FILEEXT::ProjectFileExtension );
 
     bool is_new = !wxFileName::IsFileReadable( fullFileName );
 
@@ -164,7 +164,7 @@ bool SCH_EDIT_FRAME::OpenProjectFiles( const std::vector<wxString>& aFileSet, in
         GetSettingsManager()->LoadProject( pro.GetFullPath() );
 
         wxFileName legacyPro( pro );
-        legacyPro.SetExt( LegacyProjectFileExtension );
+        legacyPro.SetExt( FILEEXT::LegacyProjectFileExtension );
 
         // Do not allow saving a project if one doesn't exist.  This normally happens if we are
         // standalone and opening a schematic that has been moved from its project folder.
@@ -421,7 +421,7 @@ bool SCH_EDIT_FRAME::OpenProjectFiles( const std::vector<wxString>& aFileSet, in
                 wxFileName cacheFn = pro;
 
                 cacheFn.SetName( cacheFn.GetName() + "-cache" );
-                cacheFn.SetExt( LegacySymbolLibFileExtension );
+                cacheFn.SetExt( FILEEXT::LegacySymbolLibFileExtension );
 
                 msg.Printf( _( "The project symbol library cache file '%s' was not found." ),
                             cacheFn.GetFullName() );
@@ -603,7 +603,7 @@ bool SCH_EDIT_FRAME::AppendSchematic()
     wxString path = wxPathOnly( Prj().GetProjectFullName() );
 
     wxFileDialog dlg( this, _( "Insert Schematic" ), path, wxEmptyString,
-                      KiCadSchematicFileWildcard(), wxFD_OPEN | wxFD_FILE_MUST_EXIST );
+                      FILEEXT::KiCadSchematicFileWildcard(), wxFD_OPEN | wxFD_FILE_MUST_EXIST );
 
     if( dlg.ShowModal() == wxID_CANCEL )
         return false;
@@ -712,7 +712,7 @@ void SCH_EDIT_FRAME::OnImportProject( wxCommandEvent& aEvent )
         Schematic().Reset();
 
         wxFileName projectFn( dlg.GetPath() );
-        projectFn.SetExt( ProjectFileExtension );
+        projectFn.SetExt( FILEEXT::ProjectFileExtension );
         GetSettingsManager()->LoadProject( projectFn.GetFullPath() );
 
         Schematic().SetProject( &Prj() );
@@ -774,7 +774,7 @@ bool SCH_EDIT_FRAME::saveSchematicFile( SCH_SHEET* aSheet, const wxString& aSave
 
     wxFileName projectFile( schematicFileName );
 
-    projectFile.SetExt( ProjectFileExtension );
+    projectFile.SetExt( FILEEXT::ProjectFileExtension );
 
     if( projectFile.FileExists() )
     {
@@ -908,12 +908,12 @@ bool SCH_EDIT_FRAME::SaveProject( bool aSaveAs )
         }
 
         if( savePath.HasExt() )
-            savePath.SetExt( KiCadSchematicFileExtension );
+            savePath.SetExt( FILEEXT::KiCadSchematicFileExtension );
         else
             savePath.SetName( wxEmptyString );
 
-        wxFileDialog dlg( this, _( "Schematic Files" ), savePath.GetPath(),
-                          savePath.GetFullName(), KiCadSchematicFileWildcard(),
+        wxFileDialog dlg( this, _( "Schematic Files" ), savePath.GetPath(), savePath.GetFullName(),
+                          FILEEXT::KiCadSchematicFileWildcard(),
                           wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
 
         FILEDLG_HOOK_SAVE_PROJECT newProjectHook;
@@ -927,7 +927,7 @@ bool SCH_EDIT_FRAME::SaveProject( bool aSaveAs )
         if( dlg.ShowModal() == wxID_CANCEL )
             return false;
 
-        newFileName = EnsureFileExtension( dlg.GetPath(), KiCadSchematicFileExtension );
+        newFileName = EnsureFileExtension( dlg.GetPath(), FILEEXT::KiCadSchematicFileExtension );
 
         if( ( !newFileName.DirExists() && !newFileName.Mkdir() ) ||
             !newFileName.IsDirWritable() )
@@ -1063,10 +1063,10 @@ bool SCH_EDIT_FRAME::SaveProject( bool aSaveAs )
         if( tmpFn.FileExists() && !tmpFn.IsFileWritable() )
             lockedFiles.Add( tmpFn.GetFullPath() );
 
-        if( tmpFn.GetExt() == KiCadSchematicFileExtension )
+        if( tmpFn.GetExt() == FILEEXT::KiCadSchematicFileExtension )
             continue;
 
-        tmpFn.SetExt( KiCadSchematicFileExtension );
+        tmpFn.SetExt( FILEEXT::KiCadSchematicFileExtension );
 
         if( tmpFn.FileExists() )
             overwrittenFiles.Add( tmpFn.GetFullPath() );
@@ -1125,20 +1125,21 @@ bool SCH_EDIT_FRAME::SaveProject( bool aSaveAs )
         // Convert legacy schematics file name extensions for the new format.
         wxFileName tmpFn = filenameMap[screen];
 
-        if( tmpFn.IsOk() && tmpFn.GetExt() != KiCadSchematicFileExtension )
+        if( tmpFn.IsOk() && tmpFn.GetExt() != FILEEXT::KiCadSchematicFileExtension )
         {
             updateFileHistory = true;
-            tmpFn.SetExt( KiCadSchematicFileExtension );
+            tmpFn.SetExt( FILEEXT::KiCadSchematicFileExtension );
 
             for( EDA_ITEM* item : screen->Items().OfType( SCH_SHEET_T ) )
             {
                 SCH_SHEET* sheet = static_cast<SCH_SHEET*>( item );
                 wxFileName sheetFileName = sheet->GetFileName();
 
-                if( !sheetFileName.IsOk() || sheetFileName.GetExt() == KiCadSchematicFileExtension )
+                if( !sheetFileName.IsOk()
+                    || sheetFileName.GetExt() == FILEEXT::KiCadSchematicFileExtension )
                     continue;
 
-                sheetFileName.SetExt( KiCadSchematicFileExtension );
+                sheetFileName.SetExt( FILEEXT::KiCadSchematicFileExtension );
                 sheet->SetFileName( sheetFileName.GetFullPath() );
                 UpdateItem( sheet );
             }
@@ -1207,7 +1208,7 @@ bool SCH_EDIT_FRAME::SaveProject( bool aSaveAs )
 
     wxASSERT( filenameMap.count( Schematic().RootScreen() ) );
     wxFileName projectPath( filenameMap.at( Schematic().RootScreen() ) );
-    projectPath.SetExt( ProjectFileExtension );
+    projectPath.SetExt( FILEEXT::ProjectFileExtension );
 
     if( Prj().IsNullProject() || ( aSaveAs && !saveCopy ) )
     {
@@ -1367,7 +1368,7 @@ bool SCH_EDIT_FRAME::importFile( const wxString& aFileName, int aFileType,
 
                 newfilename.SetPath( Prj().GetProjectPath() );
                 newfilename.SetName( Prj().GetProjectName() );
-                newfilename.SetExt( KiCadSchematicFileExtension );
+                newfilename.SetExt( FILEEXT::KiCadSchematicFileExtension );
 
                 SetScreen( GetCurrentSheet().LastScreen() );
 
@@ -1596,7 +1597,7 @@ void SCH_EDIT_FRAME::CheckForAutoSaveFile( const wxFileName& aFileName )
 
             wxFileName backupFn = recoveredFn;
 
-            backupFn.SetExt( backupFn.GetExt() + BackupFileSuffix );
+            backupFn.SetExt( backupFn.GetExt() + FILEEXT::BackupFileSuffix );
 
             wxLogTrace( traceAutoSave, wxS( "Recovering auto save file:\n"
                                             "  Original file:  '%s'\n"
diff --git a/eeschema/project_rescue.cpp b/eeschema/project_rescue.cpp
index 26aee7801a..b39db4e114 100644
--- a/eeschema/project_rescue.cpp
+++ b/eeschema/project_rescue.cpp
@@ -115,7 +115,7 @@ static wxFileName GetRescueLibraryFileName( SCHEMATIC* aSchematic )
 {
     wxFileName fn = aSchematic->GetFileName();
     fn.SetName( fn.GetName() + wxT( "-rescue" ) );
-    fn.SetExt( LegacySymbolLibFileExtension );
+    fn.SetExt( FILEEXT::LegacySymbolLibFileExtension );
     return fn;
 }
 
@@ -833,7 +833,7 @@ void SYMBOL_LIB_TABLE_RESCUER::OpenRescueLibrary()
     if( row )
     {
         if( SCH_IO_MGR::EnumFromStr( row->GetType() ) == SCH_IO_MGR::SCH_KICAD )
-            fn.SetExt( KiCadSymbolLibFileExtension );
+            fn.SetExt( FILEEXT::KiCadSymbolLibFileExtension );
 
         std::vector<LIB_SYMBOL*> symbols;
 
@@ -858,7 +858,7 @@ bool SYMBOL_LIB_TABLE_RESCUER::WriteRescueLibrary( wxWindow *aParent )
     wxFileName fn = GetRescueLibraryFileName( m_schematic );
     SYMBOL_LIB_TABLE_ROW* row = PROJECT_SCH::SchSymbolLibTable( m_prj )->FindRow( fn.GetName() );
 
-    fn.SetExt( KiCadSymbolLibFileExtension );
+    fn.SetExt( FILEEXT::KiCadSymbolLibFileExtension );
 
     try
     {
diff --git a/eeschema/sch_edit_frame.cpp b/eeschema/sch_edit_frame.cpp
index f11a853a37..7ac09334fe 100644
--- a/eeschema/sch_edit_frame.cpp
+++ b/eeschema/sch_edit_frame.cpp
@@ -367,7 +367,7 @@ SCH_EDIT_FRAME::SCH_EDIT_FRAME( KIWAY* aKiway, wxWindow* aParent ) :
     KIPLATFORM::APP::SetShutdownBlockReason( this, _( "New schematic file is unsaved" ) );
 
     // Init for dropping files
-    m_acceptedExts.emplace( KiCadSchematicFileExtension, &EE_ACTIONS::ddAppendFile );
+    m_acceptedExts.emplace( FILEEXT::KiCadSchematicFileExtension, &EE_ACTIONS::ddAppendFile );
     DragAcceptFiles( true );
 
     // Ensure the window is on top
@@ -1105,7 +1105,7 @@ void SCH_EDIT_FRAME::OnUpdatePCB( wxCommandEvent& event )
     if( !frame )
     {
         wxFileName fn = Prj().GetProjectFullName();
-        fn.SetExt( PcbFileExtension );
+        fn.SetExt( FILEEXT::PcbFileExtension );
 
         frame = Kiway().Player( FRAME_PCB_EDITOR, true );
 
@@ -1249,12 +1249,13 @@ void SCH_EDIT_FRAME::NewProject()
     wxString pro_dir = m_mruPath;
 
     wxFileDialog dlg( this, _( "New Schematic" ), pro_dir, wxEmptyString,
-                      KiCadSchematicFileWildcard(), wxFD_SAVE );
+                      FILEEXT::KiCadSchematicFileWildcard(), wxFD_SAVE );
 
     if( dlg.ShowModal() != wxID_CANCEL )
     {
         // Enforce the extension, wxFileDialog is inept.
-        wxFileName create_me = EnsureFileExtension( dlg.GetPath(), KiCadSchematicFileExtension );
+        wxFileName create_me =
+                EnsureFileExtension( dlg.GetPath(), FILEEXT::KiCadSchematicFileExtension );
 
         if( create_me.FileExists() )
         {
@@ -1276,9 +1277,9 @@ void SCH_EDIT_FRAME::NewProject()
 void SCH_EDIT_FRAME::LoadProject()
 {
     wxString pro_dir = m_mruPath;
-    wxString wildcards = AllSchematicFilesWildcard()
-                            + wxS( "|" ) + KiCadSchematicFileWildcard()
-                            + wxS( "|" ) + LegacySchematicFileWildcard();
+    wxString wildcards = FILEEXT::AllSchematicFilesWildcard()
+                            + wxS( "|" ) + FILEEXT::KiCadSchematicFileWildcard()
+                            + wxS( "|" ) + FILEEXT::LegacySchematicFileWildcard();
 
     wxFileDialog dlg( this, _( "Open Schematic" ), pro_dir, wxEmptyString,
                       wildcards, wxFD_OPEN | wxFD_FILE_MUST_EXIST );
@@ -1297,9 +1298,9 @@ void SCH_EDIT_FRAME::OnOpenPcbnew( wxCommandEvent& event )
 
     if( kicad_board.IsOk() && !Schematic().GetFileName().IsEmpty() )
     {
-        kicad_board.SetExt( PcbFileExtension );
+        kicad_board.SetExt( FILEEXT::PcbFileExtension );
         wxFileName legacy_board( kicad_board );
-        legacy_board.SetExt( LegacyPcbFileExtension );
+        legacy_board.SetExt( FILEEXT::LegacyPcbFileExtension );
         wxFileName& boardfn = legacy_board;
 
         if( !legacy_board.FileExists() || kicad_board.FileExists() )
@@ -1347,7 +1348,7 @@ void SCH_EDIT_FRAME::OnOpenPcbnew( wxCommandEvent& event )
 void SCH_EDIT_FRAME::OnOpenCvpcb( wxCommandEvent& event )
 {
     wxFileName fn = Prj().AbsolutePath( Schematic().GetFileName() );
-    fn.SetExt( NetlistFileExtension );
+    fn.SetExt( FILEEXT::NetlistFileExtension );
 
     if( !ReadyToNetlist( _( "Assigning footprints requires a fully annotated schematic." ) ) )
         return;
diff --git a/eeschema/sch_io/altium/sch_io_altium.cpp b/eeschema/sch_io/altium/sch_io_altium.cpp
index 1102ece612..1a2507c0bd 100644
--- a/eeschema/sch_io/altium/sch_io_altium.cpp
+++ b/eeschema/sch_io/altium/sch_io_altium.cpp
@@ -304,7 +304,8 @@ wxString SCH_IO_ALTIUM::getLibName()
 
 wxFileName SCH_IO_ALTIUM::getLibFileName()
 {
-    wxFileName fn( m_schematic->Prj().GetProjectPath(), getLibName(), KiCadSymbolLibFileExtension );
+    wxFileName fn( m_schematic->Prj().GetProjectPath(), getLibName(),
+                   FILEEXT::KiCadSymbolLibFileExtension );
 
     return fn;
 }
@@ -317,7 +318,7 @@ SCH_SHEET* SCH_IO_ALTIUM::LoadSchematicFile( const wxString& aFileName, SCHEMATI
     wxCHECK( !aFileName.IsEmpty() && aSchematic, nullptr );
 
     wxFileName fileName( aFileName );
-    fileName.SetExt( KiCadSchematicFileExtension );
+    fileName.SetExt( FILEEXT::KiCadSchematicFileExtension );
     m_schematic = aSchematic;
 
     // Delete on exception, if I own m_rootSheet, according to aAppendToMe
@@ -491,7 +492,7 @@ void SCH_IO_ALTIUM::ParseAltiumSch( const wxString& aFileName )
             // Map the loaded Altium file to the project file.
             wxFileName projectFileName = loadAltiumFileName;
             projectFileName.SetPath( m_schematic->Prj().GetProjectPath() );
-            projectFileName.SetExt( KiCadSchematicFileExtension );
+            projectFileName.SetExt( FILEEXT::KiCadSchematicFileExtension );
             sheet->SetFileName( projectFileName.GetFullName() );
             screen->SetFileName( projectFileName.GetFullPath() );
 
@@ -2505,9 +2506,10 @@ void SCH_IO_ALTIUM::ParseHarnessType( const std::map<wxString, wxString>& aPrope
     sheetNameField.SetTextColor( GetColorFromInt( elem.Color ) );
 
     SCH_FIELD& sheetFileName = sheetIt->second->GetFields()[SHEETFILENAME];
-    sheetFileName.SetText( elem.Text + wxT( "." ) + KiCadSchematicFileExtension );
+    sheetFileName.SetText( elem.Text + wxT( "." ) + FILEEXT::KiCadSchematicFileExtension );
 
-    wxFileName fn( m_schematic->Prj().GetProjectPath(), elem.Text, KiCadSchematicFileExtension );
+    wxFileName fn( m_schematic->Prj().GetProjectPath(), elem.Text,
+                   FILEEXT::KiCadSchematicFileExtension );
     wxString fullPath = fn.GetFullPath();
 
     fullPath.Replace( wxT( "\\" ), wxT( "/" ) );
diff --git a/eeschema/sch_io/cadstar/cadstar_sch_archive_loader.cpp b/eeschema/sch_io/cadstar/cadstar_sch_archive_loader.cpp
index 4b391ceded..2348ecf4fe 100644
--- a/eeschema/sch_io/cadstar/cadstar_sch_archive_loader.cpp
+++ b/eeschema/sch_io/cadstar/cadstar_sch_archive_loader.cpp
@@ -569,7 +569,7 @@ void CADSTAR_SCH_ARCHIVE_LOADER::loadSheets()
                                                  getSheetNumber( rootSheetID ) )
                                        .ToStdString();
         ReplaceIllegalFileNameChars( &filename );
-        filename += wxT( "." ) + KiCadSchematicFileExtension;
+        filename += wxT( "." ) + FILEEXT::KiCadSchematicFileExtension;
 
         wxFileName fn( m_schematic->Prj().GetProjectPath() + filename );
         m_rootSheet->GetScreen()->SetFileName( fn.GetFullPath() );
@@ -2493,7 +2493,7 @@ void CADSTAR_SCH_ARCHIVE_LOADER::loadSheetAndChildSheets( LAYER_ID
     std::string filename = wxString::Format( "%s_%02d", loadedFilename, sheetNum ).ToStdString();
 
     ReplaceIllegalFileNameChars( &filename );
-    filename += wxT( "." ) + KiCadSchematicFileExtension;
+    filename += wxT( "." ) + FILEEXT::KiCadSchematicFileExtension;
 
     filenameField.SetText( filename );
 
diff --git a/eeschema/sch_io/cadstar/sch_io_cadstar_archive.cpp b/eeschema/sch_io/cadstar/sch_io_cadstar_archive.cpp
index 0be4181db3..4debde89fb 100644
--- a/eeschema/sch_io/cadstar/sch_io_cadstar_archive.cpp
+++ b/eeschema/sch_io/cadstar/sch_io_cadstar_archive.cpp
@@ -113,7 +113,7 @@ SCH_SHEET* SCH_IO_CADSTAR_ARCHIVE::LoadSchematicFile( const wxString&        aFi
     libName = LIB_ID::FixIllegalChars( libName, true ).wx_str();
 
     wxFileName libFileName( aSchematic->Prj().GetProjectPath(), libName,
-                            KiCadSymbolLibFileExtension );
+                            FILEEXT::KiCadSymbolLibFileExtension );
 
     SCH_IO::SCH_IO_RELEASER sch_plugin;
     sch_plugin.set( SCH_IO_MGR::FindPlugin( SCH_IO_MGR::SCH_KICAD ) );
diff --git a/eeschema/sch_io/cadstar/sch_io_cadstar_archive.h b/eeschema/sch_io/cadstar/sch_io_cadstar_archive.h
index dae0cdf37d..0535af4d2c 100644
--- a/eeschema/sch_io/cadstar/sch_io_cadstar_archive.h
+++ b/eeschema/sch_io/cadstar/sch_io_cadstar_archive.h
@@ -53,13 +53,13 @@ public:
     const IO_BASE::IO_FILE_DESC GetSchematicFileDesc() const override
     {
         return IO_BASE::IO_FILE_DESC( _HKI( "CADSTAR Schematic Archive files" ),
-                                      { CadstarSchematicFileExtension } );
+                                      { FILEEXT::CadstarSchematicFileExtension } );
     }
 
     const IO_BASE::IO_FILE_DESC GetLibraryDesc() const override
     {
         return IO_BASE::IO_FILE_DESC( _HKI( "CADSTAR Parts Library files" ),
-                                      { CadstarPartsLibraryFileExtension } );
+                                      { FILEEXT::CadstarPartsLibraryFileExtension } );
     }
 
     bool CanReadLibrary( const wxString& aFileName ) const override;
diff --git a/eeschema/sch_io/database/sch_io_database.h b/eeschema/sch_io/database/sch_io_database.h
index 943d4a94d3..3748efa937 100644
--- a/eeschema/sch_io/database/sch_io_database.h
+++ b/eeschema/sch_io/database/sch_io_database.h
@@ -48,7 +48,7 @@ public:
     const IO_BASE::IO_FILE_DESC GetLibraryDesc() const override
     {
         return IO_BASE::IO_FILE_DESC( _HKI( "KiCad database library files" ),
-                                      { DatabaseLibraryFileExtension } );
+                                      { FILEEXT::DatabaseLibraryFileExtension } );
     }
 
     int GetModifyHash() const override { return 0; }
diff --git a/eeschema/sch_io/eagle/sch_io_eagle.cpp b/eeschema/sch_io/eagle/sch_io_eagle.cpp
index 6d7352a37a..4ff3898d58 100644
--- a/eeschema/sch_io/eagle/sch_io_eagle.cpp
+++ b/eeschema/sch_io/eagle/sch_io_eagle.cpp
@@ -176,7 +176,8 @@ wxFileName SCH_IO_EAGLE::getLibFileName()
 
     wxCHECK( m_schematic, fn );
 
-    fn.Assign( m_schematic->Prj().GetProjectPath(), getLibName(), KiCadSymbolLibFileExtension );
+    fn.Assign( m_schematic->Prj().GetProjectPath(), getLibName(),
+               FILEEXT::KiCadSymbolLibFileExtension );
 
     return fn;
 }
@@ -424,7 +425,7 @@ SCH_SHEET* SCH_IO_EAGLE::LoadSchematicFile( const wxString& aFileName, SCHEMATIC
     unique_ptr<SCH_SHEET> deleter( aAppendToMe ? nullptr : m_rootSheet );
 
     wxFileName newFilename( m_filename );
-    newFilename.SetExt( KiCadSchematicFileExtension );
+    newFilename.SetExt( FILEEXT::KiCadSchematicFileExtension );
 
     if( aAppendToMe )
     {
@@ -967,7 +968,7 @@ void SCH_IO_EAGLE::loadSheet( wxXmlNode* aSheetNode, int aSheetIndex )
 
     wxFileName fn( m_filename );
     fn.SetName( filename );
-    fn.SetExt( KiCadSchematicFileExtension );
+    fn.SetExt( FILEEXT::KiCadSchematicFileExtension );
 
     filenameField.SetText( fn.GetFullName() );
 
diff --git a/eeschema/sch_io/easyedapro/sch_io_easyedapro.cpp b/eeschema/sch_io/easyedapro/sch_io_easyedapro.cpp
index c979138664..463b6ce19a 100644
--- a/eeschema/sch_io/easyedapro/sch_io_easyedapro.cpp
+++ b/eeschema/sch_io/easyedapro/sch_io_easyedapro.cpp
@@ -417,7 +417,7 @@ SCH_SHEET* SCH_IO_EASYEDAPRO::LoadSchematicFile( const wxString& aFileName,
     wxFileName            fname( aFileName );
     wxString              libName = EASYEDAPRO::ShortenLibName( fname.GetName() );
 
-    wxFileName libFileName( fname.GetPath(), libName, KiCadSymbolLibFileExtension );
+    wxFileName libFileName( fname.GetPath(), libName, FILEEXT::KiCadSymbolLibFileExtension );
 
     if( fname.GetExt() != wxS( "epro" ) && fname.GetExt() != wxS( "zip" ) )
         return rootSheet;
@@ -455,7 +455,7 @@ SCH_SHEET* SCH_IO_EASYEDAPRO::LoadSchematicFile( const wxString& aFileName,
 
     wxFileName rootFname( aFileName );
     rootFname.SetFullName( rootBaseName + wxS( "." )
-                           + wxString::FromUTF8( KiCadSchematicFileExtension ) );
+                           + wxString::FromUTF8( FILEEXT::KiCadSchematicFileExtension ) );
 
     rootSheet->SetName( prjSchematics[schematicToLoad].name );
     rootSheet->SetFileName( rootFname.GetFullPath() );
@@ -505,7 +505,7 @@ SCH_SHEET* SCH_IO_EASYEDAPRO::LoadSchematicFile( const wxString& aFileName,
 
         wxFileName sheetFname( aFileName );
         sheetFname.SetFullName( sheetBaseName + wxS( "." )
-                                + wxString::FromUTF8( KiCadSchematicFileExtension ) );
+                                + wxString::FromUTF8( FILEEXT::KiCadSchematicFileExtension ) );
 
         std::unique_ptr<SCH_SHEET> subSheet = std::make_unique<SCH_SHEET>( aSchematic );
         subSheet->SetFileName( sheetFname.GetFullPath() );
diff --git a/eeschema/sch_io/http_lib/sch_io_http_lib.h b/eeschema/sch_io/http_lib/sch_io_http_lib.h
index 87125a6358..357b537bbb 100644
--- a/eeschema/sch_io/http_lib/sch_io_http_lib.h
+++ b/eeschema/sch_io/http_lib/sch_io_http_lib.h
@@ -45,7 +45,7 @@ public:
     const IO_BASE::IO_FILE_DESC GetLibraryDesc() const override
     {
         return IO_BASE::IO_FILE_DESC( _HKI( "KiCad HTTP library files" ),
-                                      { HTTPLibraryFileExtension } );
+                                      { FILEEXT::HTTPLibraryFileExtension } );
     }
 
     int GetModifyHash() const override { return 0; }
diff --git a/eeschema/sch_io/kicad_legacy/sch_io_kicad_legacy.h b/eeschema/sch_io/kicad_legacy/sch_io_kicad_legacy.h
index c54c3e1780..8953c059a3 100644
--- a/eeschema/sch_io/kicad_legacy/sch_io_kicad_legacy.h
+++ b/eeschema/sch_io/kicad_legacy/sch_io_kicad_legacy.h
@@ -73,13 +73,13 @@ public:
     const IO_BASE::IO_FILE_DESC GetSchematicFileDesc() const override
     {
         return IO_BASE::IO_FILE_DESC( _HKI( "KiCad legacy schematic files" ),
-                                      { LegacySchematicFileExtension } );
+                                      { FILEEXT::LegacySchematicFileExtension } );
     }
 
     const IO_BASE::IO_FILE_DESC GetLibraryDesc() const override
     {
         return IO_BASE::IO_FILE_DESC( _HKI( "KiCad legacy symbol library files" ),
-                                      { LegacySymbolLibFileExtension } );
+                                      { FILEEXT::LegacySymbolLibFileExtension } );
     }
 
     bool CanReadSchematicFile( const wxString& aFileName ) const override;
diff --git a/eeschema/sch_io/kicad_legacy/sch_io_kicad_legacy_lib_cache.cpp b/eeschema/sch_io/kicad_legacy/sch_io_kicad_legacy_lib_cache.cpp
index 6e1798cc30..486433f761 100644
--- a/eeschema/sch_io/kicad_legacy/sch_io_kicad_legacy_lib_cache.cpp
+++ b/eeschema/sch_io/kicad_legacy/sch_io_kicad_legacy_lib_cache.cpp
@@ -171,7 +171,7 @@ void SCH_IO_KICAD_LEGACY_LIB_CACHE::loadDocs()
     wxFileName  fn = m_libFileName;
     LIB_SYMBOL* symbol = nullptr;;
 
-    fn.SetExt( LegacySymbolDocumentFileExtension );
+    fn.SetExt( FILEEXT::LegacySymbolDocumentFileExtension );
 
     // Not all libraries will have a document file.
     if( !fn.FileExists() )
@@ -1856,7 +1856,7 @@ void SCH_IO_KICAD_LEGACY_LIB_CACHE::saveDocFile()
 
     wxFileName fileName = m_libFileName;
 
-    fileName.SetExt( LegacySymbolDocumentFileExtension );
+    fileName.SetExt( FILEEXT::LegacySymbolDocumentFileExtension );
     FILE_OUTPUTFORMATTER formatter( fileName.GetFullPath() );
 
     formatter.Print( 0, "%s\n", DOCFILE_IDENT );
diff --git a/eeschema/sch_io/kicad_sexpr/sch_io_kicad_sexpr.h b/eeschema/sch_io/kicad_sexpr/sch_io_kicad_sexpr.h
index 34f71e1c6e..b34df5fd2a 100644
--- a/eeschema/sch_io/kicad_sexpr/sch_io_kicad_sexpr.h
+++ b/eeschema/sch_io/kicad_sexpr/sch_io_kicad_sexpr.h
@@ -72,13 +72,13 @@ public:
     const IO_BASE::IO_FILE_DESC GetSchematicFileDesc() const override
     {
         return IO_BASE::IO_FILE_DESC( _HKI( "KiCad s-expression schematic files" ),
-                                      { KiCadSchematicFileExtension } );
+                                      { FILEEXT::KiCadSchematicFileExtension } );
     }
 
     const IO_BASE::IO_FILE_DESC GetLibraryDesc() const override
     {
         return IO_BASE::IO_FILE_DESC( _HKI( "KiCad symbol library files" ),
-                                      { KiCadSymbolLibFileExtension } );
+                                      { FILEEXT::KiCadSymbolLibFileExtension } );
     }
 
     /**
diff --git a/eeschema/sim/simulator_frame_ui.cpp b/eeschema/sim/simulator_frame_ui.cpp
index a42498064b..d367bb4134 100644
--- a/eeschema/sim/simulator_frame_ui.cpp
+++ b/eeschema/sim/simulator_frame_ui.cpp
@@ -2097,7 +2097,7 @@ bool SIMULATOR_FRAME_UI::SaveWorkbook( const wxString& aPath )
     updateMeasurementsFromGrid();
 
     wxFileName filename = aPath;
-    filename.SetExt( WorkbookFileExtension );
+    filename.SetExt( FILEEXT::WorkbookFileExtension );
 
     wxFile file;
 
diff --git a/eeschema/symbol_editor/symbol_edit_frame.cpp b/eeschema/symbol_editor/symbol_edit_frame.cpp
index 32e0d53dce..b7ff94eaf8 100644
--- a/eeschema/symbol_editor/symbol_edit_frame.cpp
+++ b/eeschema/symbol_editor/symbol_edit_frame.cpp
@@ -238,7 +238,7 @@ SYMBOL_EDIT_FRAME::SYMBOL_EDIT_FRAME( KIWAY* aKiway, wxWindow* aParent ) :
 
     m_toolManager->RunAction( ACTIONS::zoomFitScreen );
 
-    m_acceptedExts.emplace( KiCadSymbolLibFileExtension, &ACTIONS::ddAddLibrary );
+    m_acceptedExts.emplace( FILEEXT::KiCadSymbolLibFileExtension, &ACTIONS::ddAddLibrary );
     DragAcceptFiles( true );
 
     KIPLATFORM::APP::SetShutdownBlockReason( this, _( "Library changes are unsaved" ) );
@@ -904,8 +904,8 @@ wxString SYMBOL_EDIT_FRAME::AddLibraryFile( bool aCreateNew )
 
     wxFileName fn = m_libMgr->GetUniqueLibraryName();
 
-    if( !LibraryFileBrowser( !aCreateNew, fn, KiCadSymbolLibFileWildcard(),
-                             KiCadSymbolLibFileExtension, false,
+    if( !LibraryFileBrowser( !aCreateNew, fn, FILEEXT::KiCadSymbolLibFileWildcard(),
+                             FILEEXT::KiCadSymbolLibFileExtension, false,
                              ( libTable == &SYMBOL_LIB_TABLE::GetGlobalLibTable() ),
                              PATHS::GetDefaultUserSymbolsPath() ) )
     {
diff --git a/eeschema/symbol_editor/symbol_editor.cpp b/eeschema/symbol_editor/symbol_editor.cpp
index 0e5e91e77a..0a4b03fde9 100644
--- a/eeschema/symbol_editor/symbol_editor.cpp
+++ b/eeschema/symbol_editor/symbol_editor.cpp
@@ -1077,9 +1077,9 @@ bool SYMBOL_EDIT_FRAME::saveLibrary( const wxString& aLibrary, bool aNewFile )
             default_path = search->LastVisitedPath();
 
         fn.SetName( aLibrary );
-        fn.SetExt( KiCadSymbolLibFileExtension );
+        fn.SetExt( FILEEXT::KiCadSymbolLibFileExtension );
 
-        wxString wildcards = KiCadSymbolLibFileWildcard();
+        wxString wildcards = FILEEXT::KiCadSymbolLibFileWildcard();
 
         wxFileDialog dlg( this, wxString::Format( _( "Save Library '%s' As..." ), aLibrary ),
                           default_path, fn.GetFullName(), wildcards,
@@ -1096,7 +1096,7 @@ bool SYMBOL_EDIT_FRAME::saveLibrary( const wxString& aLibrary, bool aNewFile )
         prj.SetRString( PROJECT::SCH_LIB_PATH, fn.GetPath() );
 
         if( fn.GetExt().IsEmpty() )
-            fn.SetExt( KiCadSymbolLibFileExtension );
+            fn.SetExt( FILEEXT::KiCadSymbolLibFileExtension );
 
         type = saveAsHook.GetOption();
     }
diff --git a/eeschema/symbol_editor/symbol_editor_import_export.cpp b/eeschema/symbol_editor/symbol_editor_import_export.cpp
index c35ad9e855..cefba6c8e5 100644
--- a/eeschema/symbol_editor/symbol_editor_import_export.cpp
+++ b/eeschema/symbol_editor/symbol_editor_import_export.cpp
@@ -156,10 +156,10 @@ void SYMBOL_EDIT_FRAME::ExportSymbol()
     wxFileName fn;
 
     fn.SetName( symbol->GetName().Lower() );
-    fn.SetExt( KiCadSymbolLibFileExtension );
+    fn.SetExt( FILEEXT::KiCadSymbolLibFileExtension );
 
     wxFileDialog dlg( this, _( "Export Symbol" ), m_mruPath, fn.GetFullName(),
-                      KiCadSymbolLibFileWildcard(), wxFD_SAVE );
+                      FILEEXT::KiCadSymbolLibFileWildcard(), wxFD_SAVE );
 
     if( dlg.ShowModal() == wxID_CANCEL )
         return;
diff --git a/eeschema/symbol_library.cpp b/eeschema/symbol_library.cpp
index 8654f95e59..2dd500dad7 100644
--- a/eeschema/symbol_library.cpp
+++ b/eeschema/symbol_library.cpp
@@ -488,7 +488,7 @@ const wxString SYMBOL_LIBS::CacheName( const wxString& aFullProjectFilename )
     wxFileName  name = aFullProjectFilename;
 
     name.SetName( name.GetName() + "-cache" );
-    name.SetExt( LegacySymbolLibFileExtension );
+    name.SetExt( FILEEXT::LegacySymbolLibFileExtension );
 
     if( name.FileExists() )
         return name.GetFullPath();
@@ -536,7 +536,7 @@ void SYMBOL_LIBS::LoadAllLibraries( PROJECT* aProject, bool aShowProgress )
             // lib_names[] does not store the file extension. Set it.
             // Remember lib_names[i] can contain a '.' in name, so using a wxFileName
             // before adding the extension can create incorrect full filename
-            wxString fullname = lib_names[i] + "." + LegacySymbolLibFileExtension;
+            wxString fullname = lib_names[i] + "." + FILEEXT::LegacySymbolLibFileExtension;
             // Now the full name is set, we can use a wxFileName.
             wxFileName fn( fullname );
 
diff --git a/eeschema/tools/assign_footprints.cpp b/eeschema/tools/assign_footprints.cpp
index 27e7b5bd76..645c4a7216 100644
--- a/eeschema/tools/assign_footprints.cpp
+++ b/eeschema/tools/assign_footprints.cpp
@@ -211,7 +211,7 @@ int SCH_EDITOR_CONTROL::ImportFPAssignments( const TOOL_EVENT& aEvent )
 
     wxFileDialog dlg( m_frame, _( "Load Symbol Footprint Link File" ),
                       path, wxEmptyString,
-                      FootprintAssignmentFileWildcard(),
+                      FILEEXT::FootprintAssignmentFileWildcard(),
                       wxFD_OPEN | wxFD_FILE_MUST_EXIST );
 
     if( dlg.ShowModal() == wxID_CANCEL )
diff --git a/eeschema/tools/backannotate.cpp b/eeschema/tools/backannotate.cpp
index 171a2297ac..b80c33f34e 100644
--- a/eeschema/tools/backannotate.cpp
+++ b/eeschema/tools/backannotate.cpp
@@ -109,7 +109,7 @@ bool BACK_ANNOTATE::FetchNetlistFromPCB( std::string& aNetlist )
     if( !frame )
     {
         wxFileName fn( m_frame->Prj().GetProjectFullName() );
-        fn.SetExt( PcbFileExtension );
+        fn.SetExt( FILEEXT::PcbFileExtension );
 
         frame = m_frame->Kiway().Player( FRAME_PCB_EDITOR, true );
         frame->OpenProjectFiles( std::vector<wxString>( 1, fn.GetFullPath() ) );
diff --git a/eeschema/tools/sch_drawing_tools.cpp b/eeschema/tools/sch_drawing_tools.cpp
index a281613e61..18b5d53154 100644
--- a/eeschema/tools/sch_drawing_tools.cpp
+++ b/eeschema/tools/sch_drawing_tools.cpp
@@ -2088,7 +2088,7 @@ int SCH_DRAWING_TOOLS::DrawSheet( const TOOL_EVENT& aEvent )
             sheet->SetBorderColor( cfg->m_Drawing.default_sheet_border_color );
             sheet->SetBackgroundColor( cfg->m_Drawing.default_sheet_background_color );
             sheet->GetFields()[ SHEETNAME ].SetText( "Untitled Sheet" );
-            sheet->GetFields()[ SHEETFILENAME ].SetText( "untitled." + KiCadSchematicFileExtension );
+            sheet->GetFields()[ SHEETFILENAME ].SetText( "untitled." + FILEEXT::KiCadSchematicFileExtension );
             sizeSheet( sheet, cursorPos );
 
             m_view->ClearPreview();
diff --git a/eeschema/tools/sch_editor_control.cpp b/eeschema/tools/sch_editor_control.cpp
index 98f46ef50d..8089a17777 100644
--- a/eeschema/tools/sch_editor_control.cpp
+++ b/eeschema/tools/sch_editor_control.cpp
@@ -112,14 +112,15 @@ int SCH_EDITOR_CONTROL::SaveCurrSheetCopyAs( const TOOL_EVENT& aEvent )
 {
     SCH_SHEET* curr_sheet = m_frame->GetCurrentSheet().Last();
     wxFileName curr_fn = curr_sheet->GetFileName();
-    wxFileDialog dlg( m_frame, _( "Schematic Files" ), curr_fn.GetPath(),
-                      curr_fn.GetFullName(), KiCadSchematicFileWildcard(),
+    wxFileDialog dlg( m_frame, _( "Schematic Files" ), curr_fn.GetPath(), curr_fn.GetFullName(),
+                      FILEEXT::KiCadSchematicFileWildcard(),
                       wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
 
     if( dlg.ShowModal() == wxID_CANCEL )
         return false;
 
-    wxString newFilename = EnsureFileExtension( dlg.GetPath(), KiCadSchematicFileExtension );
+    wxString newFilename =
+            EnsureFileExtension( dlg.GetPath(), FILEEXT::KiCadSchematicFileExtension );
 
     m_frame->saveSchematicFile( curr_sheet, newFilename );
     return 0;
@@ -379,8 +380,8 @@ int SCH_EDITOR_CONTROL::ExportSymbolsToLibrary( const TOOL_EVENT& aEvent )
         if( !libTable )     // Cancelled by user
             return 0;
 
-        if( !m_frame->LibraryFileBrowser( false, fn, KiCadSymbolLibFileWildcard(),
-                                          KiCadSymbolLibFileExtension, false,
+        if( !m_frame->LibraryFileBrowser( false, fn, FILEEXT::KiCadSymbolLibFileWildcard(),
+                                          FILEEXT::KiCadSymbolLibFileExtension, false,
                                           ( libTable == &SYMBOL_LIB_TABLE::GetGlobalLibTable() ),
                                           PATHS::GetDefaultUserSymbolsPath() ) )
         {
diff --git a/eeschema/tools/simulator_control.cpp b/eeschema/tools/simulator_control.cpp
index 6ad6729f62..c43a9519d1 100644
--- a/eeschema/tools/simulator_control.cpp
+++ b/eeschema/tools/simulator_control.cpp
@@ -92,7 +92,7 @@ int SIMULATOR_CONTROL::NewAnalysisTab( const TOOL_EVENT& aEvent )
 int SIMULATOR_CONTROL::OpenWorkbook( const TOOL_EVENT& aEvent )
 {
     wxFileDialog openDlg( m_simulatorFrame, _( "Open Simulation Workbook" ), getDefaultPath(), "",
-                          WorkbookFileWildcard(), wxFD_OPEN | wxFD_FILE_MUST_EXIST );
+                          FILEEXT::WorkbookFileWildcard(), wxFD_OPEN | wxFD_FILE_MUST_EXIST );
 
     if( openDlg.ShowModal() == wxID_CANCEL )
         return -1;
@@ -111,12 +111,12 @@ wxString SIMULATOR_CONTROL::getDefaultFilename()
         if( m_simulatorFrame->Prj().GetProjectName().IsEmpty() )
         {
             filename.SetName( _( "noname" ) );
-            filename.SetExt( WorkbookFileExtension );
+            filename.SetExt( FILEEXT::WorkbookFileExtension );
         }
         else
         {
             filename.SetName( m_simulatorFrame->Prj().GetProjectName() );
-            filename.SetExt( WorkbookFileExtension );
+            filename.SetExt( FILEEXT::WorkbookFileExtension );
         }
     }
 
@@ -144,7 +144,8 @@ int SIMULATOR_CONTROL::SaveWorkbook( const TOOL_EVENT& aEvent )
     if( filename.IsEmpty() )
     {
         wxFileDialog saveAsDlg( m_simulatorFrame, _( "Save Simulation Workbook As" ),
-                                getDefaultPath(), getDefaultFilename(), WorkbookFileWildcard(),
+                                getDefaultPath(), getDefaultFilename(),
+                                FILEEXT::WorkbookFileWildcard(),
                                 wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
 
         if( saveAsDlg.ShowModal() == wxID_CANCEL )
@@ -163,7 +164,7 @@ int SIMULATOR_CONTROL::ExportPlotAsPNG( const TOOL_EVENT& aEvent )
     if( SIM_PLOT_TAB* plotTab = dynamic_cast<SIM_PLOT_TAB*>( getCurrentSimTab() ) )
     {
         wxFileDialog saveDlg( m_simulatorFrame, _( "Save Plot as Image" ), "", "",
-                              PngFileWildcard(), wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
+                              FILEEXT::PngFileWildcard(), wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
 
         if( saveDlg.ShowModal() == wxID_CANCEL )
             return -1;
@@ -187,7 +188,8 @@ int SIMULATOR_CONTROL::ExportPlotAsCSV( const TOOL_EVENT& aEvent )
     {
         const wxChar SEPARATOR = ';';
 
-        wxFileDialog saveDlg( m_simulatorFrame, _( "Save Plot Data" ), "", "", CsvFileWildcard(),
+        wxFileDialog saveDlg( m_simulatorFrame, _( "Save Plot Data" ), "", "",
+                              FILEEXT::CsvFileWildcard(),
                               wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
 
         if( saveDlg.ShowModal() == wxID_CANCEL )
diff --git a/eeschema/tools/symbol_editor_control.cpp b/eeschema/tools/symbol_editor_control.cpp
index 7d15a1538a..e24bae2083 100644
--- a/eeschema/tools/symbol_editor_control.cpp
+++ b/eeschema/tools/symbol_editor_control.cpp
@@ -576,7 +576,7 @@ int SYMBOL_EDITOR_CONTROL::ExportView( const TOOL_EVENT& aEvent )
     wxString projectPath = wxPathOnly( m_frame->Prj().GetProjectFullName() );
 
     wxFileDialog dlg( editFrame, _( "Export View as PNG" ), projectPath, fn.GetFullName(),
-                      PngFileWildcard(), wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
+                      FILEEXT::PngFileWildcard(), wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
 
     if( dlg.ShowModal() == wxID_OK && !dlg.GetPath().IsEmpty() )
     {
@@ -609,12 +609,13 @@ int SYMBOL_EDITOR_CONTROL::ExportSymbolAsSVG( const TOOL_EVENT& aEvent )
     }
 
     wxFileName fn( symbol->GetName() );
-    fn.SetExt( SVGFileExtension );
+    fn.SetExt( FILEEXT::SVGFileExtension );
 
     wxString pro_dir = wxPathOnly( m_frame->Prj().GetProjectFullName() );
 
     wxString fullFileName = wxFileSelector( _( "SVG File Name" ), pro_dir, fn.GetFullName(),
-                                            SVGFileExtension, SVGFileWildcard(), wxFD_SAVE,
+                                            FILEEXT::SVGFileExtension, FILEEXT::SVGFileWildcard(),
+                                            wxFD_SAVE,
                                             m_frame );
 
     if( !fullFileName.IsEmpty() )
diff --git a/gerbview/files.cpp b/gerbview/files.cpp
index adb4477323..533068d420 100644
--- a/gerbview/files.cpp
+++ b/gerbview/files.cpp
@@ -179,7 +179,7 @@ bool GERBVIEW_FRAME::LoadFileOrShowDialog( const wxString& aFileName,
 bool GERBVIEW_FRAME::LoadAutodetectedFiles( const wxString& aFileName )
 {
     // 2 = autodetect files
-    return LoadFileOrShowDialog( aFileName, AllFilesWildcard(), _( "Open Autodetected File(s)" ),
+    return LoadFileOrShowDialog( aFileName, FILEEXT::AllFilesWildcard(), _( "Open Autodetected File(s)" ),
                                  2 );
 }
 
@@ -219,7 +219,7 @@ bool GERBVIEW_FRAME::LoadGerberFiles( const wxString& aFileName )
     filetypes += _( "Bottom Pad Master" ) + AddFileExtListToFilter( { "gpb" } ) + wxT( "|" );
 
     // All filetypes
-    filetypes += AllFilesWildcard();
+    filetypes += FILEEXT::AllFilesWildcard();
 
     // 0 = gerber files
     return LoadFileOrShowDialog( aFileName, filetypes, _( "Open Gerber File(s)" ), 0 );
@@ -228,9 +228,9 @@ bool GERBVIEW_FRAME::LoadGerberFiles( const wxString& aFileName )
 
 bool GERBVIEW_FRAME::LoadExcellonFiles( const wxString& aFileName )
 {
-    wxString filetypes = DrillFileWildcard();
+    wxString filetypes = FILEEXT::DrillFileWildcard();
     filetypes << wxT( "|" );
-    filetypes += AllFilesWildcard();
+    filetypes += FILEEXT::AllFilesWildcard();
 
     // 1 = drill files
     return LoadFileOrShowDialog( aFileName, filetypes, _( "Open NC (Excellon) Drill File(s)" ), 1 );
@@ -278,7 +278,7 @@ bool GERBVIEW_FRAME::LoadListOfGerberAndDrillFiles( const wxString&      aPath,
             continue;
         }
 
-        if( filename.GetExt() == GerberJobFileExtension.c_str() )
+        if( filename.GetExt() == FILEEXT::GerberJobFileExtension.c_str() )
         {
             //We cannot read a gerber job file as a gerber plot file: skip it
             wxString txt;
@@ -473,7 +473,7 @@ bool GERBVIEW_FRAME::unarchiveFiles( const wxString& aFullFileName, REPORTER* aR
         // The archive contains Gerber and/or Excellon drill files. Use the right loader.
         // However it can contain a few other files (reports, pdf files...),
         // which will be skipped.
-        if( curr_ext == GerberJobFileExtension.c_str() )
+        if( curr_ext == FILEEXT::GerberJobFileExtension.c_str() )
         {
             //We cannot read a gerber job file as a gerber plot file: skip it
             if( aReporter )
@@ -636,7 +636,8 @@ bool GERBVIEW_FRAME::LoadZipArchiveFile( const wxString& aFullFileName )
             currentPath = m_mruPath;
 
         wxFileDialog dlg( this, _( "Open Zip File" ), currentPath, filename.GetFullName(),
-                          ZipFileWildcard(), wxFD_OPEN | wxFD_FILE_MUST_EXIST | wxFD_CHANGE_DIR );
+                          FILEEXT::ZipFileWildcard(),
+                          wxFD_OPEN | wxFD_FILE_MUST_EXIST | wxFD_CHANGE_DIR );
 
         if( dlg.ShowModal() == wxID_CANCEL )
             return false;
@@ -683,11 +684,11 @@ void GERBVIEW_FRAME::DoWithAcceptedFiles()
 
     for( const wxFileName& file : m_AcceptedFiles )
     {
-        if( file.GetExt() == ArchiveFileExtension )
+        if( file.GetExt() == FILEEXT::ArchiveFileExtension )
         {
             wxString fn = file.GetFullPath();
             // Open zip archive in editor
-            m_toolManager->RunAction<wxString*>( *m_acceptedExts.at( ArchiveFileExtension ), &fn );
+            m_toolManager->RunAction<wxString*>( *m_acceptedExts.at( FILEEXT::ArchiveFileExtension ), &fn );
         }
         else
         {
@@ -698,5 +699,5 @@ void GERBVIEW_FRAME::DoWithAcceptedFiles()
 
     // Open files in editor
     if( !gerbFn.IsEmpty() )
-        m_toolManager->RunAction<wxString*>( *m_acceptedExts.at( GerberFileExtension ), &gerbFn );
+        m_toolManager->RunAction<wxString*>( *m_acceptedExts.at( FILEEXT::GerberFileExtension ), &gerbFn );
 }
diff --git a/gerbview/gerbview.cpp b/gerbview/gerbview.cpp
index beb73619ed..d2160681db 100644
--- a/gerbview/gerbview.cpp
+++ b/gerbview/gerbview.cpp
@@ -175,7 +175,7 @@ void IFACE::SaveFileAs( const wxString& aProjectBasePath, const wxString& aProje
         destFile.SetPath( destPath );
     }
 
-    if( IsGerberFileExtension( ext ) )
+    if( FILEEXT::IsGerberFileExtension( ext ) )
     {
         wxString destFileName = destFile.GetName();
 
@@ -187,7 +187,7 @@ void IFACE::SaveFileAs( const wxString& aProjectBasePath, const wxString& aProje
 
         KiCopyFile( aSrcFilePath, destFile.GetFullPath(), aErrors );
     }
-    else if( ext == GerberJobFileExtension )
+    else if( ext == FILEEXT::GerberJobFileExtension )
     {
         if( destFile.GetName() == aProjectName + wxT( "-job" ) )
             destFile.SetName( aNewProjectName + wxT( "-job" )  );
@@ -248,7 +248,7 @@ void IFACE::SaveFileAs( const wxString& aProjectBasePath, const wxString& aProje
             aErrors += msg;
         }
     }
-    else if( ext == DrillFileExtension )
+    else if( ext == FILEEXT::DrillFileExtension )
     {
         wxString destFileName = destFile.GetName();
 
diff --git a/gerbview/gerbview_frame.cpp b/gerbview/gerbview_frame.cpp
index dc4d649c38..bae9c56c84 100644
--- a/gerbview/gerbview_frame.cpp
+++ b/gerbview/gerbview_frame.cpp
@@ -182,9 +182,9 @@ GERBVIEW_FRAME::GERBVIEW_FRAME( KIWAY* aKiway, wxWindow* aParent )
 
     // Drag and drop
     // Note that all gerber files are aliased as GerberFileExtension
-    m_acceptedExts.emplace( GerberFileExtension, &GERBVIEW_ACTIONS::loadGerbFiles );
-    m_acceptedExts.emplace( ArchiveFileExtension, &GERBVIEW_ACTIONS::loadZipFile );
-    m_acceptedExts.emplace( DrillFileExtension, &GERBVIEW_ACTIONS::loadGerbFiles );
+    m_acceptedExts.emplace( FILEEXT::GerberFileExtension, &GERBVIEW_ACTIONS::loadGerbFiles );
+    m_acceptedExts.emplace( FILEEXT::ArchiveFileExtension, &GERBVIEW_ACTIONS::loadZipFile );
+    m_acceptedExts.emplace( FILEEXT::DrillFileExtension, &GERBVIEW_ACTIONS::loadGerbFiles );
     DragAcceptFiles( true );
 
     GetToolManager()->RunAction( ACTIONS::zoomFitScreen );
@@ -269,9 +269,9 @@ bool GERBVIEW_FRAME::OpenProjectFiles( const std::vector<wxString>& aFileSet, in
         {
             wxString ext = wxFileName( aFileSet[i] ).GetExt().Lower();
 
-            if( ext == ArchiveFileExtension )
+            if( ext == FILEEXT::ArchiveFileExtension )
                 LoadZipArchiveFile( aFileSet[i] );
-            else if( ext == GerberJobFileExtension )
+            else if( ext == FILEEXT::GerberJobFileExtension )
                 LoadGerberJobFile( aFileSet[i] );
             else
             {
diff --git a/gerbview/job_file_reader.cpp b/gerbview/job_file_reader.cpp
index 93f1612097..d45438cb5f 100644
--- a/gerbview/job_file_reader.cpp
+++ b/gerbview/job_file_reader.cpp
@@ -192,7 +192,7 @@ bool GERBVIEW_FRAME::LoadGerberJobFile( const wxString& aFullFileName )
         wxFileDialog dlg( this, _( "Open Gerber Job File" ),
                           currentPath,
                           filename.GetFullName(),
-                          GerberJobFileWildcard(),
+                          FILEEXT::GerberJobFileWildcard(),
                           wxFD_OPEN | wxFD_FILE_MUST_EXIST | wxFD_CHANGE_DIR );
 
         if( dlg.ShowModal() == wxID_CANCEL )
diff --git a/gerbview/tools/gerbview_control.cpp b/gerbview/tools/gerbview_control.cpp
index e6bbcb7523..0af0b20bd3 100644
--- a/gerbview/tools/gerbview_control.cpp
+++ b/gerbview/tools/gerbview_control.cpp
@@ -120,16 +120,16 @@ int GERBVIEW_CONTROL::ExportToPcbnew( const TOOL_EVENT& aEvent )
         return 0;
     }
 
-    wxString     fileDialogName( NAMELESS_PROJECT + wxT( "." ) + KiCadPcbFileExtension );
+    wxString fileDialogName( NAMELESS_PROJECT + wxT( "." ) + FILEEXT::KiCadPcbFileExtension );
     wxString     path = m_frame->GetMruPath();
 
     wxFileDialog filedlg( m_frame, _( "Export as KiCad Board File" ), path, fileDialogName,
-                          PcbFileWildcard(), wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
+                          FILEEXT::PcbFileWildcard(), wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
 
     if( filedlg.ShowModal() == wxID_CANCEL )
         return 0;
 
-    wxFileName fileName = EnsureFileExtension( filedlg.GetPath(), KiCadPcbFileExtension );
+    wxFileName fileName = EnsureFileExtension( filedlg.GetPath(), FILEEXT::KiCadPcbFileExtension );
 
     /* Install a dialog frame to choose the mapping
      * between gerber layers and Pcbnew layers
diff --git a/include/lockfile.h b/include/lockfile.h
index 4174f2cedb..c89c368532 100644
--- a/include/lockfile.h
+++ b/include/lockfile.h
@@ -51,8 +51,8 @@ public:
 
         wxLogTrace( LCK, "Trying to lock %s", filename );
         wxFileName fn( filename );
-        fn.SetName( LockFilePrefix + fn.GetName() );
-        fn.SetExt( fn.GetExt() + '.' + LockFileExtension );
+        fn.SetName( FILEEXT::LockFilePrefix + fn.GetName() );
+        fn.SetExt( fn.GetExt() + '.' + FILEEXT::LockFileExtension );
 
         if( !fn.IsDirWritable() )
         {
diff --git a/include/project/project_local_settings.h b/include/project/project_local_settings.h
index 73505429e4..09491b207c 100644
--- a/include/project/project_local_settings.h
+++ b/include/project/project_local_settings.h
@@ -74,7 +74,7 @@ public:
 protected:
     wxString getFileExt() const override
     {
-        return ProjectLocalSettingsFileExtension;
+        return FILEEXT::ProjectLocalSettingsFileExtension;
     }
 
     wxString getLegacyFileExt() const override
diff --git a/include/wildcards_and_files_ext.h b/include/wildcards_and_files_ext.h
index 90c7b01a58..969dc6536a 100644
--- a/include/wildcards_and_files_ext.h
+++ b/include/wildcards_and_files_ext.h
@@ -32,23 +32,11 @@
 #ifndef INCLUDE_WILDCARDS_AND_FILES_EXT_H_
 #define INCLUDE_WILDCARDS_AND_FILES_EXT_H_
 
+#include <kicommon.h>
 #include <string>
 #include <vector>
 #include <wx/string.h>
 
-/**
- * \defgroup file_extensions File Extension Definitions
- *
- * @note Please do not changes these.  If a different file extension is needed, create a new
- *       definition in here.  If you create a extension definition in another file, make sure
- *       to add it to the Doxygen group "file_extensions" using the "addtogroup" tag. Also
- *       note, just because they are defined as const doesn't guarantee that they cannot be
- *       changed.
- *
- * @{
- */
-
-
 /**
  * Compare the given extension against the reference extensions to see if it matches any
  * of the reference extensions.
@@ -65,8 +53,8 @@
  *
  * @return if the extension matches any reference extensions
  */
-bool compareFileExtensions( const std::string& aExtension,
-        const std::vector<std::string>& aReference, bool aCaseSensitive = false );
+KICOMMON_API bool compareFileExtensions( const std::string&              aExtension,
+                                         const std::vector<std::string>& aReference, bool aCaseSensitive = false );
 
 /**
  * Build the wildcard extension file dialog wildcard filter to add to the base message dialog.
@@ -86,7 +74,7 @@ bool compareFileExtensions( const std::string& aExtension,
  * @return the appropriate file dialog wildcard filter list.
  */
 
-wxString AddFileExtListToFilter( const std::vector<std::string>& aExts );
+KICOMMON_API wxString AddFileExtListToFilter( const std::vector<std::string>& aExts );
 
 /**
  * Format wildcard extension to support case sensitive file dialogs.
@@ -106,156 +94,175 @@ wxString AddFileExtListToFilter( const std::vector<std::string>& aExts );
  *
  * @return the build appropriate file dialog wildcard filter.
  */
-wxString formatWildcardExt( const wxString& aWildcard );
-
-extern const std::string BackupFileSuffix;
-extern const std::string LockFilePrefix;
-extern const std::string LockFileExtension;
-
-extern const std::string SchematicSymbolFileExtension;
-extern const std::string LegacySymbolLibFileExtension;
-extern const std::string LegacySymbolDocumentFileExtension;
-extern const std::string SchematicBackupFileExtension;
-
-extern const std::string VrmlFileExtension;
-extern const std::string ProjectFileExtension;
-extern const std::string LegacyProjectFileExtension;
-extern const std::string ProjectLocalSettingsFileExtension;
-extern const std::string LegacySchematicFileExtension;
-extern const std::string CadstarSchematicFileExtension;
-extern const std::string CadstarPartsLibraryFileExtension;
-extern const std::string KiCadSchematicFileExtension;
-extern const std::string SpiceFileExtension;
-extern const std::string CadstarNetlistFileExtension;
-extern const std::string OrCadPcb2NetlistFileExtension;
-extern const std::string NetlistFileExtension;
-extern const std::string AllegroNetlistFileExtension;
-extern const std::string GerberFileExtension;
-extern const std::string GerberJobFileExtension;
-extern const std::string HtmlFileExtension;
-extern const std::string EquFileExtension;
-extern const std::string HotkeyFileExtension;
-extern const std::string DatabaseLibraryFileExtension;
-extern const std::string HTTPLibraryFileExtension;
-
-extern const std::string ArchiveFileExtension;
-
-extern const std::string LegacyPcbFileExtension;
-extern const std::string EaglePcbFileExtension;
-extern const std::string CadstarPcbFileExtension;
-extern const std::string KiCadPcbFileExtension;
-#define PcbFileExtension    KiCadPcbFileExtension       // symlink choice
-extern const std::string KiCadSymbolLibFileExtension;
-extern const std::string DrawingSheetFileExtension;
-extern const std::string DesignRulesFileExtension;
-
-extern const std::string LegacyFootprintLibPathExtension;
-extern const std::string PdfFileExtension;
-extern const std::string MacrosFileExtension;
-extern const std::string FootprintAssignmentFileExtension;
-extern const std::string DrillFileExtension;
-extern const std::string SVGFileExtension;
-extern const std::string ReportFileExtension;
-extern const std::string FootprintPlaceFileExtension;
-extern const std::string KiCadFootprintFileExtension;
-extern const std::string KiCadFootprintLibPathExtension;
-extern const std::string AltiumFootprintLibPathExtension;
-extern const std::string GedaPcbFootprintLibFileExtension;
-extern const std::string EagleFootprintLibPathExtension;
-extern const std::string DrawingSheetFileExtension;
-extern const std::string SpecctraDsnFileExtension;
-extern const std::string SpecctraSessionFileExtension;
-extern const std::string IpcD356FileExtension;
-extern const std::string Ipc2581FileExtension;
-extern const std::string WorkbookFileExtension;
-
-extern const std::string PngFileExtension;
-extern const std::string JpegFileExtension;
-extern const std::string TextFileExtension;
-extern const std::string MarkdownFileExtension;
-extern const std::string CsvFileExtension;
-extern const std::string XmlFileExtension;
-extern const std::string JsonFileExtension;
-
-extern const std::string StepFileExtension;
-extern const std::string StepFileAbrvExtension;
-extern const std::string GltfBinaryFileExtension;
-
-extern const wxString GerberFileExtensionsRegex;
-
-bool IsGerberFileExtension( const wxString& ext );
-
-/**
- * @}
- */
+KICOMMON_API wxString formatWildcardExt( const wxString& aWildcard );
 
 
-/**
- * \defgroup file_wildcards File Wildcard Definitions
- *
- * @note Please do not changes these.  If a different file wildcard is needed, create a new
- *       definition in here.  If you create a wildcard definition in another file, make sure
- *       to add it to the Doxygen group "file_extensions" using the "addtogroup" tag and
- *       correct handle the GTK+ file dialog case sensitivity issue.
- * @{
- */
+class KICOMMON_API FILEEXT
+{
+public:
+    FILEEXT() = delete;
 
-extern wxString AllFilesWildcard();
+    /**
+     * \defgroup file_extensions File Extension Definitions
+     *
+     * @note Please do not changes these.  If a different file extension is needed, create a new
+     *       definition in here.  If you create a extension definition in another file, make sure
+     *       to add it to the Doxygen group "file_extensions" using the "addtogroup" tag. Also
+     *       note, just because they are defined as const doesn't guarantee that they cannot be
+     *       changed.
+     *
+     * @{
+     */
+    static const std::string BackupFileSuffix;
+    static const std::string LockFilePrefix;
+    static const std::string LockFileExtension;
 
-extern wxString FootprintAssignmentFileWildcard();
-extern wxString DrawingSheetFileWildcard();
-extern wxString KiCadSymbolLibFileWildcard();
-extern wxString ProjectFileWildcard();
-extern wxString LegacyProjectFileWildcard();
-extern wxString AllProjectFilesWildcard();
-extern wxString AllSchematicFilesWildcard();
-extern wxString KiCadSchematicFileWildcard();
-extern wxString LegacySchematicFileWildcard();
-extern wxString BoardFileWildcard();
-extern wxString OrCadPcb2NetlistFileWildcard();
-extern wxString NetlistFileWildcard();
-extern wxString AllegroNetlistFileWildcard();
-extern wxString HtmlFileWildcard();
-extern wxString CsvFileWildcard();
-extern wxString PcbFileWildcard();
-extern wxString CadstarArchiveFilesWildcard();
-extern wxString EagleFilesWildcard();
-extern wxString EasyEdaArchiveWildcard();
-extern wxString EasyEdaProFileWildcard();
-extern wxString PdfFileWildcard();
-extern wxString PSFileWildcard();
-extern wxString MacrosFileWildcard();
-extern wxString DrillFileWildcard();
-extern wxString SVGFileWildcard();
-extern wxString JsonFileWildcard();
-extern wxString ReportFileWildcard();
-extern wxString FootprintPlaceFileWildcard();
-extern wxString Shapes3DFileWildcard();
-extern wxString IDF3DFileWildcard();
-extern wxString DocModulesFileName();
-extern wxString KiCadFootprintLibFileWildcard();
-extern wxString KiCadFootprintLibPathWildcard();
-extern wxString TextFileWildcard();
-extern wxString ModLegacyExportFileWildcard();
-extern wxString ErcFileWildcard();
-extern wxString SpiceLibraryFileWildcard();
-extern wxString SpiceNetlistFileWildcard();
-extern wxString CadstarNetlistFileWildcard();
-extern wxString EquFileWildcard();
-extern wxString ZipFileWildcard();
-extern wxString GencadFileWildcard();
-extern wxString DxfFileWildcard();
-extern wxString GerberJobFileWildcard();
-extern wxString SpecctraDsnFileWildcard();
-extern wxString SpecctraSessionFileWildcard();
-extern wxString IpcD356FileWildcard();
-extern wxString WorkbookFileWildcard();
-extern wxString PngFileWildcard();
-extern wxString JpegFileWildcard();
-extern wxString HotkeyFileWildcard();
+    static const std::string SchematicSymbolFileExtension;
+    static const std::string LegacySymbolLibFileExtension;
+    static const std::string LegacySymbolDocumentFileExtension;
+    static const std::string SchematicBackupFileExtension;
+
+    static const std::string VrmlFileExtension;
+    static const std::string ProjectFileExtension;
+    static const std::string LegacyProjectFileExtension;
+    static const std::string ProjectLocalSettingsFileExtension;
+    static const std::string LegacySchematicFileExtension;
+    static const std::string CadstarSchematicFileExtension;
+    static const std::string CadstarPartsLibraryFileExtension;
+    static const std::string KiCadSchematicFileExtension;
+    static const std::string SpiceFileExtension;
+    static const std::string CadstarNetlistFileExtension;
+    static const std::string OrCadPcb2NetlistFileExtension;
+    static const std::string NetlistFileExtension;
+    static const std::string AllegroNetlistFileExtension;
+    static const std::string GerberFileExtension;
+    static const std::string GerberJobFileExtension;
+    static const std::string HtmlFileExtension;
+    static const std::string EquFileExtension;
+    static const std::string HotkeyFileExtension;
+    static const std::string DatabaseLibraryFileExtension;
+    static const std::string HTTPLibraryFileExtension;
+
+    static const std::string ArchiveFileExtension;
+
+    static const std::string LegacyPcbFileExtension;
+    static const std::string EaglePcbFileExtension;
+    static const std::string CadstarPcbFileExtension;
+    static const std::string KiCadPcbFileExtension;
+    #define PcbFileExtension    KiCadPcbFileExtension       // symlink choice
+    static const std::string KiCadSymbolLibFileExtension;
+    static const std::string DrawingSheetFileExtension;
+    static const std::string DesignRulesFileExtension;
+
+    static const std::string LegacyFootprintLibPathExtension;
+    static const std::string PdfFileExtension;
+    static const std::string MacrosFileExtension;
+    static const std::string FootprintAssignmentFileExtension;
+    static const std::string DrillFileExtension;
+    static const std::string SVGFileExtension;
+    static const std::string ReportFileExtension;
+    static const std::string FootprintPlaceFileExtension;
+    static const std::string KiCadFootprintFileExtension;
+    static const std::string KiCadFootprintLibPathExtension;
+    static const std::string AltiumFootprintLibPathExtension;
+    static const std::string CadstarFootprintLibPathExtension;
+    static const std::string GedaPcbFootprintLibFileExtension;
+    static const std::string EagleFootprintLibPathExtension;
+    static const std::string DrawingSheetFileExtension;
+    static const std::string SpecctraDsnFileExtension;
+    static const std::string SpecctraSessionFileExtension;
+    static const std::string IpcD356FileExtension;
+    static const std::string Ipc2581FileExtension;
+    static const std::string WorkbookFileExtension;
+
+    static const std::string PngFileExtension;
+    static const std::string JpegFileExtension;
+    static const std::string TextFileExtension;
+    static const std::string MarkdownFileExtension;
+    static const std::string CsvFileExtension;
+    static const std::string XmlFileExtension;
+    static const std::string JsonFileExtension;
+
+    static const std::string StepFileExtension;
+    static const std::string StepFileAbrvExtension;
+    static const std::string GltfBinaryFileExtension;
+
+    static const wxString GerberFileExtensionsRegex;
+
+    /**
+     * @}
+     */
+
+    /**
+     * \defgroup file_wildcards File Wildcard Definitions
+     *
+     * @note Please do not changes these.  If a different file wildcard is needed, create a new
+     *       definition in here.  If you create a wildcard definition in another file, make sure
+     *       to add it to the Doxygen group "file_extensions" using the "addtogroup" tag and
+     *       correct handle the GTK+ file dialog case sensitivity issue.
+     * @{
+     */
+
+
+    static bool IsGerberFileExtension( const wxString& ext );
+    static wxString AllFilesWildcard();
+
+    static wxString FootprintAssignmentFileWildcard();
+    static wxString DrawingSheetFileWildcard();
+    static wxString KiCadSymbolLibFileWildcard();
+    static wxString ProjectFileWildcard();
+    static wxString LegacyProjectFileWildcard();
+    static wxString AllProjectFilesWildcard();
+    static wxString AllSchematicFilesWildcard();
+    static wxString KiCadSchematicFileWildcard();
+    static wxString LegacySchematicFileWildcard();
+    static wxString BoardFileWildcard();
+    static wxString OrCadPcb2NetlistFileWildcard();
+    static wxString NetlistFileWildcard();
+    static wxString AllegroNetlistFileWildcard();
+    static wxString HtmlFileWildcard();
+    static wxString CsvFileWildcard();
+    static wxString PcbFileWildcard();
+    static wxString CadstarArchiveFilesWildcard();
+    static wxString EagleFilesWildcard();
+    static wxString EasyEdaArchiveWildcard();
+    static wxString EasyEdaProFileWildcard();
+    static wxString PdfFileWildcard();
+    static wxString PSFileWildcard();
+    static wxString MacrosFileWildcard();
+    static wxString DrillFileWildcard();
+    static wxString SVGFileWildcard();
+    static wxString JsonFileWildcard();
+    static wxString ReportFileWildcard();
+    static wxString FootprintPlaceFileWildcard();
+    static wxString Shapes3DFileWildcard();
+    static wxString IDF3DFileWildcard();
+    static wxString DocModulesFileName();
+    static wxString KiCadFootprintLibFileWildcard();
+    static wxString KiCadFootprintLibPathWildcard();
+    static wxString TextFileWildcard();
+    static wxString ModLegacyExportFileWildcard();
+    static wxString ErcFileWildcard();
+    static wxString SpiceLibraryFileWildcard();
+    static wxString SpiceNetlistFileWildcard();
+    static wxString CadstarNetlistFileWildcard();
+    static wxString EquFileWildcard();
+    static wxString ZipFileWildcard();
+    static wxString GencadFileWildcard();
+    static wxString DxfFileWildcard();
+    static wxString GerberJobFileWildcard();
+    static wxString SpecctraDsnFileWildcard();
+    static wxString SpecctraSessionFileWildcard();
+    static wxString IpcD356FileWildcard();
+    static wxString WorkbookFileWildcard();
+    static wxString PngFileWildcard();
+    static wxString JpegFileWildcard();
+    static wxString HotkeyFileWildcard();
+
+    /**
+     * @}
+     */
+};
 
-/**
- * @}
- */
 
 #endif  // INCLUDE_WILDCARDS_AND_FILES_EXT_H_
diff --git a/kicad/files-io.cpp b/kicad/files-io.cpp
index ef65a17add..fe5dd3cc89 100644
--- a/kicad/files-io.cpp
+++ b/kicad/files-io.cpp
@@ -61,10 +61,10 @@ void KICAD_MANAGER_FRAME::OnUnarchiveFiles( wxCommandEvent& event )
 {
     wxFileName fn = Prj().GetProjectFullName();
 
-    fn.SetExt( ArchiveFileExtension );
+    fn.SetExt( FILEEXT::ArchiveFileExtension );
 
     wxFileDialog zipfiledlg( this, _( "Unzip Project" ), fn.GetPath(),
-                             fn.GetFullName(), ZipFileWildcard(),
+                             fn.GetFullName(), FILEEXT::ZipFileWildcard(),
                              wxFD_OPEN | wxFD_FILE_MUST_EXIST );
 
     if( zipfiledlg.ShowModal() == wxID_CANCEL )
@@ -112,11 +112,11 @@ void KICAD_MANAGER_FRAME::OnArchiveFiles( wxCommandEvent& event )
 {
     wxFileName  fileName = GetProjectFileName();
 
-    fileName.SetExt( ArchiveFileExtension );
+    fileName.SetExt( FILEEXT::ArchiveFileExtension );
 
     wxFileDialog dlg( this, _( "Archive Project Files" ),
                       fileName.GetPath(), fileName.GetFullName(),
-                      ZipFileWildcard(), wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
+                      FILEEXT::ZipFileWildcard(), wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
 
     if( dlg.ShowModal() == wxID_CANCEL )
         return;
diff --git a/kicad/import_project.cpp b/kicad/import_project.cpp
index c9eb737544..33beb91997 100644
--- a/kicad/import_project.cpp
+++ b/kicad/import_project.cpp
@@ -81,7 +81,7 @@ void KICAD_MANAGER_FRAME::ImportNonKiCadProject( const wxString& aWindowTitle,
 
     importProj.m_TargetProj.SetPath( targetDir );
     importProj.m_TargetProj.SetName( importProj.m_InputFile.GetName() );
-    importProj.m_TargetProj.SetExt( ProjectFileExtension );
+    importProj.m_TargetProj.SetExt( FILEEXT::ProjectFileExtension );
     importProj.m_TargetProj.MakeAbsolute();
 
     // Check if the project directory is empty
@@ -125,27 +125,27 @@ void KICAD_MANAGER_FRAME::ImportNonKiCadProject( const wxString& aWindowTitle,
 void KICAD_MANAGER_FRAME::OnImportCadstarArchiveFiles( wxCommandEvent& event )
 {
     ImportNonKiCadProject( _( "Import CADSTAR Archive Project Files" ),
-                           CadstarArchiveFilesWildcard(), { "csa" }, { "cpa" },
+                           FILEEXT::CadstarArchiveFilesWildcard(), { "csa" }, { "cpa" },
                            SCH_IO_MGR::SCH_CADSTAR_ARCHIVE, PCB_IO_MGR::CADSTAR_PCB_ARCHIVE );
 }
 
 
 void KICAD_MANAGER_FRAME::OnImportEagleFiles( wxCommandEvent& event )
 {
-    ImportNonKiCadProject( _( "Import Eagle Project Files" ), EagleFilesWildcard(), { "sch" },
+    ImportNonKiCadProject( _( "Import Eagle Project Files" ), FILEEXT::EagleFilesWildcard(), { "sch" },
                            { "brd" }, SCH_IO_MGR::SCH_EAGLE, PCB_IO_MGR::EAGLE );
 }
 
 
 void KICAD_MANAGER_FRAME::OnImportEasyEdaFiles( wxCommandEvent& event )
 {
-    ImportNonKiCadProject( _( "Import EasyEDA Std Backup" ), EasyEdaArchiveWildcard(), { "INPUT" },
+    ImportNonKiCadProject( _( "Import EasyEDA Std Backup" ), FILEEXT::EasyEdaArchiveWildcard(), { "INPUT" },
                            { "INPUT" }, SCH_IO_MGR::SCH_EASYEDA, PCB_IO_MGR::EASYEDA );
 }
 
 
 void KICAD_MANAGER_FRAME::OnImportEasyEdaProFiles( wxCommandEvent& event )
 {
-    ImportNonKiCadProject( _( "Import EasyEDA Pro Project" ), EasyEdaProFileWildcard(), { "INPUT" },
+    ImportNonKiCadProject( _( "Import EasyEDA Pro Project" ), FILEEXT::EasyEdaProFileWildcard(), { "INPUT" },
                            { "INPUT" }, SCH_IO_MGR::SCH_EASYEDAPRO, PCB_IO_MGR::EASYEDAPRO );
 }
\ No newline at end of file
diff --git a/kicad/kicad.cpp b/kicad/kicad.cpp
index 05e0353848..f76bcbf2ee 100644
--- a/kicad/kicad.cpp
+++ b/kicad/kicad.cpp
@@ -309,7 +309,8 @@ bool PGM_KICAD::OnPgmInit()
         {
             wxFileName tmp = App().argv[1];
 
-            if( tmp.GetExt() != ProjectFileExtension && tmp.GetExt() != LegacyProjectFileExtension )
+            if( tmp.GetExt() != FILEEXT::ProjectFileExtension
+                && tmp.GetExt() != FILEEXT::LegacyProjectFileExtension )
             {
                 wxString msg;
 
diff --git a/kicad/kicad_manager_frame.cpp b/kicad/kicad_manager_frame.cpp
index a4381090f5..60c97f5944 100644
--- a/kicad/kicad_manager_frame.cpp
+++ b/kicad/kicad_manager_frame.cpp
@@ -228,14 +228,14 @@ KICAD_MANAGER_FRAME::KICAD_MANAGER_FRAME( wxWindow* parent, const wxString& titl
     m_leftWin->SetFocus();
 
     // Init for dropping files
-    m_acceptedExts.emplace( ProjectFileExtension, &KICAD_MANAGER_ACTIONS::loadProject );
-    m_acceptedExts.emplace( LegacyProjectFileExtension, &KICAD_MANAGER_ACTIONS::loadProject );
+    m_acceptedExts.emplace( FILEEXT::ProjectFileExtension, &KICAD_MANAGER_ACTIONS::loadProject );
+    m_acceptedExts.emplace( FILEEXT::LegacyProjectFileExtension, &KICAD_MANAGER_ACTIONS::loadProject );
 
     // Gerber files
     // Note that all gerber files are aliased as GerberFileExtension
-    m_acceptedExts.emplace( GerberFileExtension, &KICAD_MANAGER_ACTIONS::viewDroppedGerbers );
-    m_acceptedExts.emplace( GerberJobFileExtension, &KICAD_MANAGER_ACTIONS::viewDroppedGerbers );
-    m_acceptedExts.emplace( DrillFileExtension, &KICAD_MANAGER_ACTIONS::viewDroppedGerbers );
+    m_acceptedExts.emplace( FILEEXT::GerberFileExtension, &KICAD_MANAGER_ACTIONS::viewDroppedGerbers );
+    m_acceptedExts.emplace( FILEEXT::GerberJobFileExtension, &KICAD_MANAGER_ACTIONS::viewDroppedGerbers );
+    m_acceptedExts.emplace( FILEEXT::DrillFileExtension, &KICAD_MANAGER_ACTIONS::viewDroppedGerbers );
 
     DragAcceptFiles( true );
 
@@ -394,7 +394,7 @@ const wxString KICAD_MANAGER_FRAME::SchFileName()
 {
    wxFileName   fn( GetProjectFileName() );
 
-   fn.SetExt( KiCadSchematicFileExtension );
+   fn.SetExt( FILEEXT::KiCadSchematicFileExtension );
    return fn.GetFullPath();
 }
 
@@ -403,7 +403,7 @@ const wxString KICAD_MANAGER_FRAME::SchLegacyFileName()
 {
    wxFileName   fn( GetProjectFileName() );
 
-   fn.SetExt( LegacySchematicFileExtension );
+   fn.SetExt( FILEEXT::LegacySchematicFileExtension );
    return fn.GetFullPath();
 }
 
@@ -412,7 +412,7 @@ const wxString KICAD_MANAGER_FRAME::PcbFileName()
 {
    wxFileName   fn( GetProjectFileName() );
 
-   fn.SetExt( PcbFileExtension );
+   fn.SetExt( FILEEXT::PcbFileExtension );
    return fn.GetFullPath();
 }
 
@@ -421,7 +421,7 @@ const wxString KICAD_MANAGER_FRAME::PcbLegacyFileName()
 {
    wxFileName   fn( GetProjectFileName() );
 
-   fn.SetExt( LegacyPcbFileExtension );
+   fn.SetExt( FILEEXT::LegacyPcbFileExtension );
    return fn.GetFullPath();
 }
 
@@ -464,7 +464,7 @@ void KICAD_MANAGER_FRAME::DoWithAcceptedFiles()
     {
         wxString ext = fileName.GetExt();
 
-        if( ext == ProjectFileExtension || ext == LegacyProjectFileExtension )
+        if( ext == FILEEXT::ProjectFileExtension || ext == FILEEXT::LegacyProjectFileExtension )
         {
             wxString fn = fileName.GetFullPath();
             m_toolManager->RunAction<wxString*>( *m_acceptedExts.at( fileName.GetExt() ), &fn );
@@ -481,8 +481,8 @@ void KICAD_MANAGER_FRAME::DoWithAcceptedFiles()
     {
         wxString ext = fileName.GetExt();
 
-        if( ext == GerberJobFileExtension || ext == DrillFileExtension
-            || IsGerberFileExtension( ext ) )
+        if( ext == FILEEXT::GerberJobFileExtension || ext == FILEEXT::DrillFileExtension
+            || FILEEXT::IsGerberFileExtension( ext ) )
         {
             gerberFiles += wxT( '\"' );
             gerberFiles += fileName.GetFullPath() + wxT( '\"' );
@@ -503,7 +503,7 @@ void KICAD_MANAGER_FRAME::DoWithAcceptedFiles()
         if( wxFileExists( fullEditorName ) )
         {
             wxString command = fullEditorName + " " + gerberFiles;
-            m_toolManager->RunAction<wxString*>( *m_acceptedExts.at( GerberFileExtension ),
+            m_toolManager->RunAction<wxString*>( *m_acceptedExts.at( FILEEXT::GerberFileExtension ),
                                                  &command );
         }
     }
@@ -648,7 +648,7 @@ void KICAD_MANAGER_FRAME::CreateNewProject( const wxFileName& aProjectFileName,
     if( !aProjectFileName.FileExists() )
     {
         wxFileName legacyPro( aProjectFileName );
-        legacyPro.SetExt( LegacyProjectFileExtension );
+        legacyPro.SetExt( FILEEXT::LegacyProjectFileExtension );
 
         if( legacyPro.FileExists() )
         {
@@ -663,7 +663,7 @@ void KICAD_MANAGER_FRAME::CreateNewProject( const wxFileName& aProjectFileName,
             wxString srcFileName = sys_search().FindValidPath( "kicad.kicad_pro" );
 
             wxFileName destFileName( aProjectFileName );
-            destFileName.SetExt( ProjectFileExtension );
+            destFileName.SetExt( FILEEXT::ProjectFileExtension );
 
             // Create a minimal project file if the template project file could not be copied
             if( !wxFileName::FileExists( srcFileName )
@@ -685,7 +685,7 @@ void KICAD_MANAGER_FRAME::CreateNewProject( const wxFileName& aProjectFileName,
     if( aCreateStubFiles )
     {
         wxFileName fn( aProjectFileName.GetFullPath() );
-        fn.SetExt( KiCadSchematicFileExtension );
+        fn.SetExt( FILEEXT::KiCadSchematicFileExtension );
 
         // If a <project>.kicad_sch file does not exist, create a "stub" file ( minimal schematic
         // file ).
@@ -704,9 +704,9 @@ void KICAD_MANAGER_FRAME::CreateNewProject( const wxFileName& aProjectFileName,
 
         // If a <project>.kicad_pcb or <project>.brd file does not exist,
         // create a .kicad_pcb "stub" file
-        fn.SetExt( KiCadPcbFileExtension );
+        fn.SetExt( FILEEXT::KiCadPcbFileExtension );
         wxFileName leg_fn( fn );
-        leg_fn.SetExt( LegacyPcbFileExtension );
+        leg_fn.SetExt( FILEEXT::LegacyPcbFileExtension );
 
         if( !fn.FileExists() && !leg_fn.FileExists() )
         {
@@ -733,7 +733,7 @@ void KICAD_MANAGER_FRAME::CreateNewProject( const wxFileName& aProjectFileName,
 void KICAD_MANAGER_FRAME::OnOpenFileInTextEditor( wxCommandEvent& event )
 {
     // show all files in file dialog (in Kicad all files are editable texts):
-    wxString wildcard = AllFilesWildcard();
+    wxString wildcard = FILEEXT::AllFilesWildcard();
 
     wxString default_dir = Prj().GetProjectPath();
 
@@ -901,7 +901,7 @@ void KICAD_MANAGER_FRAME::OnIdle( wxIdleEvent& aEvent )
                                Prj().GetLocalSettings().m_files.end(),
                                [&]( const PROJECT_FILE_STATE& f )
                                {
-                                   return !f.fileName.EndsWith( ProjectFileExtension ) && f.open;
+                                   return !f.fileName.EndsWith( FILEEXT::ProjectFileExtension ) && f.open;
                                } );
 
         if( previousOpenCount > 0 )
@@ -924,13 +924,13 @@ void KICAD_MANAGER_FRAME::OnIdle( wxIdleEvent& aEvent )
                     openedFiles.insert( file.fileName );
                     wxFileName fn( file.fileName );
 
-                    if( fn.GetExt() == LegacySchematicFileExtension
-                            || fn.GetExt() == KiCadSchematicFileExtension )
+                    if( fn.GetExt() == FILEEXT::LegacySchematicFileExtension
+                        || fn.GetExt() == FILEEXT::KiCadSchematicFileExtension )
                     {
                         GetToolManager()->RunAction( KICAD_MANAGER_ACTIONS::editSchematic );
                     }
-                    else if( fn.GetExt() == LegacyPcbFileExtension
-                             || fn.GetExt() == KiCadPcbFileExtension )
+                    else if( fn.GetExt() == FILEEXT::LegacyPcbFileExtension
+                             || fn.GetExt() == FILEEXT::KiCadPcbFileExtension )
                     {
                         GetToolManager()->RunAction( KICAD_MANAGER_ACTIONS::editPCB );
                     }
diff --git a/kicad/project_template.cpp b/kicad/project_template.cpp
index ce9cdf8e59..4ea45e2386 100644
--- a/kicad/project_template.cpp
+++ b/kicad/project_template.cpp
@@ -156,7 +156,8 @@ size_t PROJECT_TEMPLATE::GetDestinationFiles( const wxFileName& aNewProjectPath,
 
     for( wxFileName& file : srcFiles )
     {
-        if( file.GetExt() == ProjectFileExtension || file.GetExt() == LegacyProjectFileExtension )
+        if( file.GetExt() == FILEEXT::ProjectFileExtension
+            || file.GetExt() == FILEEXT::LegacyProjectFileExtension )
         {
             if( !basename.IsEmpty() && basename != file.GetName() )
                 multipleProjectFilesFound = true;
@@ -205,7 +206,8 @@ bool PROJECT_TEMPLATE::CreateProject( wxFileName& aNewProjectPath, wxString* aEr
 
     for( wxFileName& file : srcFiles )
     {
-        if( file.GetExt() == ProjectFileExtension || file.GetExt() == LegacyProjectFileExtension )
+        if( file.GetExt() == FILEEXT::ProjectFileExtension
+            || file.GetExt() == FILEEXT::LegacyProjectFileExtension )
         {
             if( !basename.IsEmpty() && basename != file.GetName() )
                 multipleProjectFilesFound = true;
@@ -225,7 +227,7 @@ bool PROJECT_TEMPLATE::CreateProject( wxFileName& aNewProjectPath, wxString* aEr
         // Replace the template filename with the project filename for the new project creation
         wxString currname = destFile.GetName();
 
-        if( destFile.GetExt() == DrawingSheetFileExtension )
+        if( destFile.GetExt() == FILEEXT::DrawingSheetFileExtension )
         {
             // Don't rename drawing sheet definitions; they're often shared
         }
diff --git a/kicad/project_tree_pane.cpp b/kicad/project_tree_pane.cpp
index 76fdab8863..d184aae006 100644
--- a/kicad/project_tree_pane.cpp
+++ b/kicad/project_tree_pane.cpp
@@ -298,33 +298,33 @@ wxString PROJECT_TREE_PANE::GetFileExt( TREE_FILE_TYPE type )
 {
     switch( type )
     {
-    case TREE_FILE_TYPE::LEGACY_PROJECT:        return LegacyProjectFileExtension;
-    case TREE_FILE_TYPE::JSON_PROJECT:          return ProjectFileExtension;
-    case TREE_FILE_TYPE::LEGACY_SCHEMATIC:      return LegacySchematicFileExtension;
-    case TREE_FILE_TYPE::SEXPR_SCHEMATIC:       return KiCadSchematicFileExtension;
-    case TREE_FILE_TYPE::LEGACY_PCB:            return LegacyPcbFileExtension;
-    case TREE_FILE_TYPE::SEXPR_PCB:             return KiCadPcbFileExtension;
-    case TREE_FILE_TYPE::GERBER:                return GerberFileExtensionsRegex;
-    case TREE_FILE_TYPE::GERBER_JOB_FILE:       return GerberJobFileExtension;
-    case TREE_FILE_TYPE::HTML:                  return HtmlFileExtension;
-    case TREE_FILE_TYPE::PDF:                   return PdfFileExtension;
-    case TREE_FILE_TYPE::TXT:                   return TextFileExtension;
-    case TREE_FILE_TYPE::MD:                    return MarkdownFileExtension;
-    case TREE_FILE_TYPE::NET:                   return NetlistFileExtension;
-    case TREE_FILE_TYPE::NET_SPICE:             return SpiceFileExtension;
-    case TREE_FILE_TYPE::CMP_LINK:              return FootprintAssignmentFileExtension;
-    case TREE_FILE_TYPE::REPORT:                return ReportFileExtension;
-    case TREE_FILE_TYPE::FP_PLACE:              return FootprintPlaceFileExtension;
-    case TREE_FILE_TYPE::DRILL:                 return DrillFileExtension;
+    case TREE_FILE_TYPE::LEGACY_PROJECT:        return FILEEXT::LegacyProjectFileExtension;
+    case TREE_FILE_TYPE::JSON_PROJECT:          return FILEEXT::ProjectFileExtension;
+    case TREE_FILE_TYPE::LEGACY_SCHEMATIC:      return FILEEXT::LegacySchematicFileExtension;
+    case TREE_FILE_TYPE::SEXPR_SCHEMATIC:       return FILEEXT::KiCadSchematicFileExtension;
+    case TREE_FILE_TYPE::LEGACY_PCB:            return FILEEXT::LegacyPcbFileExtension;
+    case TREE_FILE_TYPE::SEXPR_PCB:             return FILEEXT::KiCadPcbFileExtension;
+    case TREE_FILE_TYPE::GERBER:                return FILEEXT::GerberFileExtensionsRegex;
+    case TREE_FILE_TYPE::GERBER_JOB_FILE:       return FILEEXT::GerberJobFileExtension;
+    case TREE_FILE_TYPE::HTML:                  return FILEEXT::HtmlFileExtension;
+    case TREE_FILE_TYPE::PDF:                   return FILEEXT::PdfFileExtension;
+    case TREE_FILE_TYPE::TXT:                   return FILEEXT::TextFileExtension;
+    case TREE_FILE_TYPE::MD:                    return FILEEXT::MarkdownFileExtension;
+    case TREE_FILE_TYPE::NET:                   return FILEEXT::NetlistFileExtension;
+    case TREE_FILE_TYPE::NET_SPICE:             return FILEEXT::SpiceFileExtension;
+    case TREE_FILE_TYPE::CMP_LINK:              return FILEEXT::FootprintAssignmentFileExtension;
+    case TREE_FILE_TYPE::REPORT:                return FILEEXT::ReportFileExtension;
+    case TREE_FILE_TYPE::FP_PLACE:              return FILEEXT::FootprintPlaceFileExtension;
+    case TREE_FILE_TYPE::DRILL:                 return FILEEXT::DrillFileExtension;
     case TREE_FILE_TYPE::DRILL_NC:              return "nc";
     case TREE_FILE_TYPE::DRILL_XNC:             return "xnc";
-    case TREE_FILE_TYPE::SVG:                   return SVGFileExtension;
-    case TREE_FILE_TYPE::DRAWING_SHEET:         return DrawingSheetFileExtension;
-    case TREE_FILE_TYPE::FOOTPRINT_FILE:        return KiCadFootprintFileExtension;
-    case TREE_FILE_TYPE::SCHEMATIC_LIBFILE:     return LegacySymbolLibFileExtension;
-    case TREE_FILE_TYPE::SEXPR_SYMBOL_LIB_FILE: return KiCadSymbolLibFileExtension;
-    case TREE_FILE_TYPE::DESIGN_RULES:          return DesignRulesFileExtension;
-    case TREE_FILE_TYPE::ZIP_ARCHIVE:           return ArchiveFileExtension;
+    case TREE_FILE_TYPE::SVG:                   return FILEEXT::SVGFileExtension;
+    case TREE_FILE_TYPE::DRAWING_SHEET:         return FILEEXT::DrawingSheetFileExtension;
+    case TREE_FILE_TYPE::FOOTPRINT_FILE:        return FILEEXT::KiCadFootprintFileExtension;
+    case TREE_FILE_TYPE::SCHEMATIC_LIBFILE:     return FILEEXT::LegacySymbolLibFileExtension;
+    case TREE_FILE_TYPE::SEXPR_SYMBOL_LIB_FILE: return FILEEXT::KiCadSymbolLibFileExtension;
+    case TREE_FILE_TYPE::DESIGN_RULES:          return FILEEXT::DesignRulesFileExtension;
+    case TREE_FILE_TYPE::ZIP_ARCHIVE:           return FILEEXT::ArchiveFileExtension;
 
     case TREE_FILE_TYPE::ROOT:
     case TREE_FILE_TYPE::UNKNOWN:
@@ -346,7 +346,8 @@ std::vector<wxString> getProjects( const wxDir& dir )
     {
         wxFileName file( dir_filename );
 
-        if( file.GetExt() == LegacyProjectFileExtension || file.GetExt() == ProjectFileExtension )
+        if( file.GetExt() == FILEEXT::LegacyProjectFileExtension
+            || file.GetExt() == FILEEXT::ProjectFileExtension )
             projects.push_back( file.GetName() );
 
         haveFile = dir.GetNext( &dir_filename );
@@ -622,7 +623,7 @@ void PROJECT_TREE_PANE::ReCreateTreePrj()
         fn.Clear();
         fn.SetPath( PATHS::GetDefaultUserProjectsPath() );
         fn.SetName( NAMELESS_PROJECT );
-        fn.SetExt( ProjectFileExtension );
+        fn.SetExt( FILEEXT::ProjectFileExtension );
         prjReset = true;
     }
 
@@ -647,11 +648,11 @@ void PROJECT_TREE_PANE::ReCreateTreePrj()
     // name of the migrated (new format) file, which may not have been saved to disk yet.
     if( !prjOpened && !prjReset )
     {
-        fn.SetExt( LegacyProjectFileExtension );
+        fn.SetExt( FILEEXT::LegacyProjectFileExtension );
         prjOpened = fn.FileExists();
 
         // Set the ext back so that in the tree view we see the (not-yet-saved) new file
-        fn.SetExt( ProjectFileExtension );
+        fn.SetExt( FILEEXT::ProjectFileExtension );
     }
 
     // root tree:
diff --git a/kicad/tools/kicad_manager_control.cpp b/kicad/tools/kicad_manager_control.cpp
index 084ebc7bc4..464f2798bf 100644
--- a/kicad/tools/kicad_manager_control.cpp
+++ b/kicad/tools/kicad_manager_control.cpp
@@ -70,7 +70,7 @@ wxFileName KICAD_MANAGER_CONTROL::newProjectDirectory( wxString* aFileName )
 
     wxString        default_dir = m_frame->GetMruPath();
     wxFileDialog    dlg( m_frame, _( "Create New Project" ), default_dir, default_filename,
-                         ProjectFileWildcard(), wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
+                         FILEEXT::ProjectFileWildcard(), wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
 
     // Add a "Create a new directory" checkbox
     FILEDLG_NEW_PROJECT newProjectHook;
@@ -83,10 +83,10 @@ wxFileName KICAD_MANAGER_CONTROL::newProjectDirectory( wxString* aFileName )
 
     // wxFileName automatically extracts an extension.  But if it isn't
     // a .pro extension, we should keep it as part of the filename
-    if( !pro.GetExt().IsEmpty() && pro.GetExt().ToStdString() != ProjectFileExtension )
+    if( !pro.GetExt().IsEmpty() && pro.GetExt().ToStdString() != FILEEXT::ProjectFileExtension )
         pro.SetName( pro.GetName() + wxT( "." ) + pro.GetExt() );
 
-    pro.SetExt( ProjectFileExtension );     // enforce extension
+    pro.SetExt( FILEEXT::ProjectFileExtension ); // enforce extension
 
     if( !pro.IsAbsolute() )
         pro.MakeAbsolute();
@@ -244,7 +244,7 @@ int KICAD_MANAGER_CONTROL::NewFromTemplate( const TOOL_EVENT& aEvent )
     // Get project destination folder and project file name.
     wxString        default_dir = wxFileName( Prj().GetProjectFullName() ).GetPathWithSep();
     wxString        title = _( "New Project Folder" );
-    wxFileDialog    dlg( m_frame, title, default_dir, wxEmptyString, ProjectFileWildcard(),
+    wxFileDialog    dlg( m_frame, title, default_dir, wxEmptyString, FILEEXT::ProjectFileWildcard(),
                          wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
 
     // Add a "Create a new directory" checkbox
@@ -258,10 +258,10 @@ int KICAD_MANAGER_CONTROL::NewFromTemplate( const TOOL_EVENT& aEvent )
 
     // wxFileName automatically extracts an extension.  But if it isn't a .kicad_pro extension,
     // we should keep it as part of the filename
-    if( !fn.GetExt().IsEmpty() && fn.GetExt().ToStdString() != ProjectFileExtension )
+    if( !fn.GetExt().IsEmpty() && fn.GetExt().ToStdString() != FILEEXT::ProjectFileExtension )
         fn.SetName( fn.GetName() + wxT( "." ) + fn.GetExt() );
 
-    fn.SetExt( ProjectFileExtension );
+    fn.SetExt( FILEEXT::ProjectFileExtension );
 
     if( !fn.IsAbsolute() )
         fn.MakeAbsolute();
@@ -357,9 +357,9 @@ int KICAD_MANAGER_CONTROL::NewFromTemplate( const TOOL_EVENT& aEvent )
 
 int KICAD_MANAGER_CONTROL::openProject( const wxString& aDefaultDir )
 {
-    wxString wildcard = AllProjectFilesWildcard()
-                        + "|" + ProjectFileWildcard()
-                        + "|" + LegacyProjectFileWildcard();
+    wxString wildcard = FILEEXT::AllProjectFilesWildcard()
+                        + "|" + FILEEXT::ProjectFileWildcard()
+                        + "|" + FILEEXT::LegacyProjectFileWildcard();
 
     wxFileDialog dlg( m_frame, _( "Open Existing Project" ), aDefaultDir, wxEmptyString, wildcard,
                       wxFD_OPEN | wxFD_FILE_MUST_EXIST );
@@ -440,9 +440,9 @@ public:
         wxString   ext = destFile.GetExt();
         bool       atRoot = destFile.GetPath() == m_projectDirPath;
 
-        if( ext == LegacyProjectFileExtension
-          || ext == ProjectFileExtension
-          || ext == ProjectLocalSettingsFileExtension )
+        if( ext == FILEEXT::LegacyProjectFileExtension
+          || ext == FILEEXT::ProjectFileExtension
+          || ext == FILEEXT::ProjectLocalSettingsFileExtension )
         {
             wxString destPath = destFile.GetPath();
 
@@ -456,70 +456,71 @@ public:
             {
                 destFile.SetName( m_newProjectName );
 
-                if( atRoot && ext != ProjectLocalSettingsFileExtension )
+                if( atRoot && ext != FILEEXT::ProjectLocalSettingsFileExtension )
                     m_newProjectFile = destFile;
             }
 
-            if( ext == LegacyProjectFileExtension )
+            if( ext == FILEEXT::LegacyProjectFileExtension )
             {
                 // All paths in the settings file are relative so we can just do a straight copy
                 KiCopyFile( aSrcFilePath, destFile.GetFullPath(), m_errors );
             }
-            else if( ext == ProjectFileExtension )
+            else if( ext == FILEEXT::ProjectFileExtension )
             {
                 PROJECT_FILE projectFile( aSrcFilePath );
                 projectFile.LoadFromFile();
                 projectFile.SaveAs( destFile.GetPath(), destFile.GetName() );
             }
-            else if( ext == ProjectLocalSettingsFileExtension )
+            else if( ext == FILEEXT::ProjectLocalSettingsFileExtension )
             {
                 PROJECT_LOCAL_SETTINGS projectLocalSettings( nullptr, aSrcFilePath );
                 projectLocalSettings.LoadFromFile();
                 projectLocalSettings.SaveAs( destFile.GetPath(), destFile.GetName() );
             }
         }
-        else if( ext == KiCadSchematicFileExtension
-               || ext == KiCadSchematicFileExtension + BackupFileSuffix
-               || ext == LegacySchematicFileExtension
-               || ext == LegacySchematicFileExtension + BackupFileSuffix
-               || ext == SchematicSymbolFileExtension
-               || ext == LegacySymbolLibFileExtension
-               || ext == LegacySymbolDocumentFileExtension
-               || ext == KiCadSymbolLibFileExtension
-               || ext == NetlistFileExtension
+        else if( ext == FILEEXT::KiCadSchematicFileExtension
+                 || ext == FILEEXT::KiCadSchematicFileExtension + FILEEXT::BackupFileSuffix
+                 || ext == FILEEXT::LegacySchematicFileExtension
+                 || ext == FILEEXT::LegacySchematicFileExtension + FILEEXT::BackupFileSuffix
+                 || ext == FILEEXT::SchematicSymbolFileExtension
+                 || ext == FILEEXT::LegacySymbolLibFileExtension
+                 || ext == FILEEXT::LegacySymbolDocumentFileExtension
+                 || ext == FILEEXT::KiCadSymbolLibFileExtension
+                 || ext == FILEEXT::NetlistFileExtension
                || destFile.GetName() == "sym-lib-table" )
         {
             KIFACE* eeschema = m_frame->Kiway().KiFACE( KIWAY::FACE_SCH );
             eeschema->SaveFileAs( m_projectDirPath, m_projectName, m_newProjectDirPath,
                                   m_newProjectName, aSrcFilePath, m_errors );
         }
-        else if( ext == KiCadPcbFileExtension
-               || ext == KiCadPcbFileExtension + BackupFileSuffix
-               || ext == LegacyPcbFileExtension
-               || ext == KiCadFootprintFileExtension
-               || ext == LegacyFootprintLibPathExtension
-               || ext == FootprintAssignmentFileExtension
+        else if( ext == FILEEXT::KiCadPcbFileExtension
+                 || ext == FILEEXT::KiCadPcbFileExtension + FILEEXT::BackupFileSuffix
+                 || ext == FILEEXT::LegacyPcbFileExtension
+                 || ext == FILEEXT::KiCadFootprintFileExtension
+                 || ext == FILEEXT::LegacyFootprintLibPathExtension
+                 || ext == FILEEXT::FootprintAssignmentFileExtension
                || destFile.GetName() == "fp-lib-table" )
         {
             KIFACE* pcbnew = m_frame->Kiway().KiFACE( KIWAY::FACE_PCB );
             pcbnew->SaveFileAs( m_projectDirPath, m_projectName, m_newProjectDirPath,
                                 m_newProjectName, aSrcFilePath, m_errors );
         }
-        else if( ext == DrawingSheetFileExtension )
+        else if( ext == FILEEXT::DrawingSheetFileExtension )
         {
             KIFACE* pleditor = m_frame->Kiway().KiFACE( KIWAY::FACE_PL_EDITOR );
             pleditor->SaveFileAs( m_projectDirPath, m_projectName, m_newProjectDirPath,
                                   m_newProjectName, aSrcFilePath, m_errors );
         }
-        else if( ext == GerberJobFileExtension
-               || ext == DrillFileExtension
-               || IsGerberFileExtension(ext) )
+        else if( ext == FILEEXT::GerberJobFileExtension
+               || ext == FILEEXT::DrillFileExtension
+                 || FILEEXT::IsGerberFileExtension( ext ) )
         {
             KIFACE* gerbview = m_frame->Kiway().KiFACE( KIWAY::FACE_GERBVIEW );
             gerbview->SaveFileAs( m_projectDirPath, m_projectName, m_newProjectDirPath,
                                   m_newProjectName, aSrcFilePath, m_errors );
         }
-        else if(destFile.GetName().StartsWith( LockFilePrefix ) && ext == LockFileExtension )
+        else if( destFile.GetName().StartsWith( FILEEXT::LockFilePrefix )
+                 && ext == FILEEXT::LockFileExtension )
         {
             // Ignore lock files
         }
diff --git a/pagelayout_editor/files.cpp b/pagelayout_editor/files.cpp
index 762981f13b..6df21e0034 100644
--- a/pagelayout_editor/files.cpp
+++ b/pagelayout_editor/files.cpp
@@ -130,7 +130,7 @@ void PL_EDITOR_FRAME::Files_io( wxCommandEvent& event )
     {
          wxFileDialog openFileDialog( this, _( "Append Existing Drawing Sheet" ),
                                       wxEmptyString, wxEmptyString,
-                                      DrawingSheetFileWildcard(), wxFD_OPEN );
+                                      FILEEXT::DrawingSheetFileWildcard(), wxFD_OPEN );
 
         if( openFileDialog.ShowModal() == wxID_CANCEL )
             return;
@@ -155,7 +155,7 @@ void PL_EDITOR_FRAME::Files_io( wxCommandEvent& event )
     case wxID_OPEN:
     {
          wxFileDialog openFileDialog( this, _( "Open Drawing Sheet" ), wxEmptyString, wxEmptyString,
-                                      DrawingSheetFileWildcard(), wxFD_OPEN );
+                                     FILEEXT::DrawingSheetFileWildcard(), wxFD_OPEN );
 
         if( openFileDialog.ShowModal() == wxID_CANCEL )
             return;
@@ -193,7 +193,7 @@ void PL_EDITOR_FRAME::Files_io( wxCommandEvent& event )
     {
         wxString dir = PATHS::GetUserTemplatesPath();
         wxFileDialog openFileDialog( this, _( "Save Drawing Sheet As" ), dir, wxEmptyString,
-                                     DrawingSheetFileWildcard(),
+                                     FILEEXT::DrawingSheetFileWildcard(),
                                      wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
 
         if( openFileDialog.ShowModal() == wxID_CANCEL )
@@ -206,8 +206,8 @@ void PL_EDITOR_FRAME::Files_io( wxCommandEvent& event )
         // extension
         wxFileName fn(filename);
 
-        if( fn.GetExt() != DrawingSheetFileExtension )
-            filename << wxT(".") << DrawingSheetFileExtension;
+        if( fn.GetExt() != FILEEXT::DrawingSheetFileExtension )
+            filename << wxT( "." ) << FILEEXT::DrawingSheetFileExtension;
 
         if( !SaveDrawingSheetFile( filename ) )
         {
diff --git a/pagelayout_editor/pl_editor_frame.cpp b/pagelayout_editor/pl_editor_frame.cpp
index 61c1d6d433..aa13959d41 100644
--- a/pagelayout_editor/pl_editor_frame.cpp
+++ b/pagelayout_editor/pl_editor_frame.cpp
@@ -119,7 +119,7 @@ PL_EDITOR_FRAME::PL_EDITOR_FRAME( KIWAY* aKiway, wxWindow* aParent ) :
 
     LoadSettings( config() );
 
-    m_acceptedExts.emplace( DrawingSheetFileExtension, nullptr );
+    m_acceptedExts.emplace( FILEEXT::DrawingSheetFileExtension, nullptr );
     DragAcceptFiles( true );
 
     VECTOR2I pageSizeIU = GetPageLayout().GetPageSettings().GetSizeIU( drawSheetIUScale.IU_PER_MILS );
diff --git a/pcbnew/build_BOM_from_board.cpp b/pcbnew/build_BOM_from_board.cpp
index cd5605a7bf..d7081682d6 100644
--- a/pcbnew/build_BOM_from_board.cpp
+++ b/pcbnew/build_BOM_from_board.cpp
@@ -82,12 +82,12 @@ void PCB_EDIT_FRAME::RecreateBOMFileFromBoard( wxCommandEvent& aEvent )
 
     /* Set the file extension: */
     fn = GetBoard()->GetFileName();
-    fn.SetExt( CsvFileExtension );
+    fn.SetExt( FILEEXT::CsvFileExtension );
 
     wxString pro_dir = wxPathOnly( Prj().GetProjectFullName() );
 
     wxFileDialog dlg( this, _( "Save Bill of Materials" ), pro_dir, fn.GetFullName(),
-                      CsvFileWildcard(), wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
+                      FILEEXT::CsvFileWildcard(), wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
 
     if( dlg.ShowModal() == wxID_CANCEL )
         return;
diff --git a/pcbnew/dialogs/dialog_board_setup.cpp b/pcbnew/dialogs/dialog_board_setup.cpp
index 2fc1aec951..f53784f8ff 100644
--- a/pcbnew/dialogs/dialog_board_setup.cpp
+++ b/pcbnew/dialogs/dialog_board_setup.cpp
@@ -263,7 +263,7 @@ void DIALOG_BOARD_SETUP::onAuxiliaryAction( wxCommandEvent& aEvent )
     wxFileName boardFn( importDlg.GetFilePath() );
     wxFileName projectFn( boardFn );
 
-    projectFn.SetExt( ProjectFileExtension );
+    projectFn.SetExt( FILEEXT::ProjectFileExtension );
 
     if( !m_frame->GetSettingsManager()->LoadProject( projectFn.GetFullPath(), false ) )
     {
diff --git a/pcbnew/dialogs/dialog_board_statistics.cpp b/pcbnew/dialogs/dialog_board_statistics.cpp
index d313a88586..7af477cfaf 100644
--- a/pcbnew/dialogs/dialog_board_statistics.cpp
+++ b/pcbnew/dialogs/dialog_board_statistics.cpp
@@ -642,7 +642,7 @@ void DIALOG_BOARD_STATISTICS::saveReportClicked( wxCommandEvent& aEvent )
     wxFileName fn = m_parentFrame->GetBoard()->GetFileName();
     boardName = fn.GetName();
     wxFileDialog dlg( this, _( "Save Report File" ), s_savedDialogState.saveReportFolder,
-                      s_savedDialogState.saveReportName, TextFileWildcard(),
+                      s_savedDialogState.saveReportName, FILEEXT::TextFileWildcard(),
                       wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
 
     if( dlg.ShowModal() == wxID_CANCEL )
diff --git a/pcbnew/dialogs/dialog_drc.cpp b/pcbnew/dialogs/dialog_drc.cpp
index 3ff04aab89..1f4265f8b5 100644
--- a/pcbnew/dialogs/dialog_drc.cpp
+++ b/pcbnew/dialogs/dialog_drc.cpp
@@ -872,10 +872,10 @@ void DIALOG_DRC::OnSeverity( wxCommandEvent& aEvent )
 
 void DIALOG_DRC::OnSaveReport( wxCommandEvent& aEvent )
 {
-    wxFileName fn( "DRC." + ReportFileExtension );
+    wxFileName fn( "DRC." + FILEEXT::ReportFileExtension );
 
     wxFileDialog dlg( this, _( "Save Report File" ), Prj().GetProjectPath(), fn.GetFullName(),
-                      ReportFileWildcard() + wxS( "|" ) + JsonFileWildcard(),
+                      FILEEXT::ReportFileWildcard() + wxS( "|" ) + FILEEXT::JsonFileWildcard(),
                       wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
 
     if( dlg.ShowModal() != wxID_OK )
@@ -884,7 +884,7 @@ void DIALOG_DRC::OnSaveReport( wxCommandEvent& aEvent )
     fn = dlg.GetPath();
 
     if( fn.GetExt().IsEmpty() )
-        fn.SetExt( ReportFileExtension );
+        fn.SetExt( FILEEXT::ReportFileExtension );
 
     if( !fn.IsAbsolute() )
     {
@@ -896,7 +896,7 @@ void DIALOG_DRC::OnSaveReport( wxCommandEvent& aEvent )
                              m_ratsnestProvider, m_fpWarningsProvider );
 
     bool success = false;
-    if( fn.GetExt() == JsonFileExtension )
+    if( fn.GetExt() == FILEEXT::JsonFileExtension )
         success = reportWriter.WriteJsonReport( fn.GetFullPath() );
     else
         success = reportWriter.WriteTextReport( fn.GetFullPath() );
diff --git a/pcbnew/dialogs/dialog_export_step.cpp b/pcbnew/dialogs/dialog_export_step.cpp
index 70b714229e..29f4370980 100644
--- a/pcbnew/dialogs/dialog_export_step.cpp
+++ b/pcbnew/dialogs/dialog_export_step.cpp
@@ -338,9 +338,9 @@ void DIALOG_EXPORT_STEP::onUpdateYPos( wxUpdateUIEvent& aEvent )
 void DIALOG_EXPORT_STEP::onBrowseClicked( wxCommandEvent& aEvent )
 {
     wxString filter = _( "STEP files" )
-                      + AddFileExtListToFilter( { StepFileExtension, StepFileAbrvExtension } ) + "|"
+                      + AddFileExtListToFilter( { FILEEXT::StepFileExtension, FILEEXT::StepFileAbrvExtension } ) + "|"
                       + _( "Binary GTLF files" )
-                      + AddFileExtListToFilter( { GltfBinaryFileExtension } );
+                      + AddFileExtListToFilter( { FILEEXT::GltfBinaryFileExtension } );
 
     // Build the absolute path of current output directory to preselect it in the file browser.
     wxString   path = ExpandEnvVarSubstitutions( m_outputFileName->GetValue(), &Prj() );
@@ -442,7 +442,7 @@ void DIALOG_EXPORT_STEP::onExportButton( wxCommandEvent& aEvent )
     cmdK2S.Append( wxT( " pcb" ) );
     cmdK2S.Append( wxT( " export" ) );
 
-    if( fn.GetExt() == GltfBinaryFileExtension )
+    if( fn.GetExt() == FILEEXT::GltfBinaryFileExtension )
         cmdK2S.Append( wxT( " glb" ) );
     else
         cmdK2S.Append( wxT( " step" ) );
diff --git a/pcbnew/dialogs/dialog_export_svg.cpp b/pcbnew/dialogs/dialog_export_svg.cpp
index d0467bec40..77c2ae5ed5 100644
--- a/pcbnew/dialogs/dialog_export_svg.cpp
+++ b/pcbnew/dialogs/dialog_export_svg.cpp
@@ -339,7 +339,7 @@ void DIALOG_EXPORT_SVG::ExportSVGFile( bool aOnlyOneFile )
         wxFileName   fn( boardFilename );
         wxString     suffix = aOnlyOneFile ? wxString( wxT( "brd" ) ) : m_board->GetStandardLayerName( layer );
 
-        BuildPlotFileName( &fn, outputDir.GetPath(), suffix, SVGFileExtension );
+        BuildPlotFileName( &fn, outputDir.GetPath(), suffix, FILEEXT::SVGFileExtension );
         wxString svgPath = fn.GetFullPath();
 
         m_printMaskLayer = aOnlyOneFile ? all_selected.SeqStackupForPlotting() : LSEQ( { layer } );
diff --git a/pcbnew/dialogs/dialog_gen_footprint_position.cpp b/pcbnew/dialogs/dialog_gen_footprint_position.cpp
index 7a7f6ee854..6f45f20a60 100644
--- a/pcbnew/dialogs/dialog_gen_footprint_position.cpp
+++ b/pcbnew/dialogs/dialog_gen_footprint_position.cpp
@@ -418,12 +418,12 @@ bool DIALOG_GEN_FOOTPRINT_POSITION::CreateAsciiFiles()
 
     if( useCSVfmt )
     {
-        fn.SetName( fn.GetName() + wxT( "-" ) + FootprintPlaceFileExtension );
+        fn.SetName( fn.GetName() + wxT( "-" ) + FILEEXT::FootprintPlaceFileExtension );
         fn.SetExt( wxT( "csv" ) );
     }
     else
     {
-        fn.SetExt( FootprintPlaceFileExtension );
+        fn.SetExt( FILEEXT::FootprintPlaceFileExtension );
     }
 
     int fpcount = m_parent->DoGenFootprintsPositionFile( fn.GetFullPath(), UnitsMM(), OnlySMD(),
@@ -464,12 +464,12 @@ bool DIALOG_GEN_FOOTPRINT_POSITION::CreateAsciiFiles()
 
     if( useCSVfmt )
     {
-        fn.SetName( fn.GetName() + wxT( "-" ) + FootprintPlaceFileExtension );
+        fn.SetName( fn.GetName() + wxT( "-" ) + FILEEXT::FootprintPlaceFileExtension );
         fn.SetExt( wxT( "csv" ) );
     }
     else
     {
-        fn.SetExt( FootprintPlaceFileExtension );
+        fn.SetExt( FILEEXT::FootprintPlaceFileExtension );
     }
 
     fpcount = m_parent->DoGenFootprintsPositionFile( fn.GetFullPath(), UnitsMM(), OnlySMD(),
diff --git a/pcbnew/dialogs/dialog_gencad_export_options.cpp b/pcbnew/dialogs/dialog_gencad_export_options.cpp
index ba5ecb99f5..a2ea51ae27 100644
--- a/pcbnew/dialogs/dialog_gencad_export_options.cpp
+++ b/pcbnew/dialogs/dialog_gencad_export_options.cpp
@@ -47,7 +47,7 @@ DIALOG_GENCAD_EXPORT_OPTIONS::DIALOG_GENCAD_EXPORT_OPTIONS( PCB_EDIT_FRAME* aPar
     // is set to.
     m_filePicker = new wxFilePickerCtrl( this, wxID_ANY, "",
                                          _("Select a GenCAD export filename"),
-                                         GencadFileWildcard(),
+                                         FILEEXT::GencadFileWildcard(),
                                          wxDefaultPosition, wxSize( -1,-1 ),
                                          wxFLP_SAVE|wxFLP_USE_TEXTCTRL );
     m_mainSizer->Add( m_filePicker, 0, wxEXPAND | wxTOP | wxLEFT | wxRIGHT, 5 );
diff --git a/pcbnew/dialogs/dialog_gendrill.cpp b/pcbnew/dialogs/dialog_gendrill.cpp
index 8e38ad7b13..97d885b0b5 100644
--- a/pcbnew/dialogs/dialog_gendrill.cpp
+++ b/pcbnew/dialogs/dialog_gendrill.cpp
@@ -445,7 +445,7 @@ void DIALOG_GENDRILL::OnGenReportFile( wxCommandEvent& event )
     wxFileName fn = m_board->GetFileName();
 
     fn.SetName( fn.GetName() + wxT( "-drl" ) );
-    fn.SetExt( ReportFileExtension );
+    fn.SetExt( FILEEXT::ReportFileExtension );
 
     wxString defaultPath = ExpandEnvVarSubstitutions( m_plotOpts.GetOutputDirectory(), &Prj() );
     defaultPath = Prj().AbsolutePath( defaultPath );
@@ -454,7 +454,7 @@ void DIALOG_GENDRILL::OnGenReportFile( wxCommandEvent& event )
         defaultPath = PATHS::GetDefaultUserProjectsPath();
 
     wxFileDialog dlg( this, _( "Save Drill Report File" ), defaultPath, fn.GetFullName(),
-                      ReportFileWildcard(), wxFD_SAVE );
+                      FILEEXT::ReportFileWildcard(), wxFD_SAVE );
 
     if( dlg.ShowModal() == wxID_CANCEL )
         return;
diff --git a/pcbnew/dialogs/dialog_import_netlist.cpp b/pcbnew/dialogs/dialog_import_netlist.cpp
index b172fc948a..fb0af64f9b 100644
--- a/pcbnew/dialogs/dialog_import_netlist.cpp
+++ b/pcbnew/dialogs/dialog_import_netlist.cpp
@@ -133,7 +133,8 @@ void DIALOG_IMPORT_NETLIST::onBrowseNetlistFiles( wxCommandEvent& event )
     }
 
     wxFileDialog FilesDialog( this, _( "Import Netlist" ), dirPath, filename,
-                              NetlistFileWildcard(), wxFD_DEFAULT_STYLE | wxFD_FILE_MUST_EXIST );
+                              FILEEXT::NetlistFileWildcard(),
+                              wxFD_DEFAULT_STYLE | wxFD_FILE_MUST_EXIST );
 
     if( FilesDialog.ShowModal() != wxID_OK )
         return;
diff --git a/pcbnew/dialogs/dialog_import_settings.cpp b/pcbnew/dialogs/dialog_import_settings.cpp
index 2827cc9f3e..2b12e2d865 100644
--- a/pcbnew/dialogs/dialog_import_settings.cpp
+++ b/pcbnew/dialogs/dialog_import_settings.cpp
@@ -113,7 +113,8 @@ void DIALOG_IMPORT_SETTINGS::OnBrowseClicked( wxCommandEvent& event )
     wxFileName fn = m_frame->GetBoard()->GetFileName();
 
     wxFileDialog dlg( this, _( "Import Settings From" ), fn.GetPath(), fn.GetFullName(),
-                      PcbFileWildcard(), wxFD_OPEN | wxFD_FILE_MUST_EXIST | wxFD_CHANGE_DIR );
+                      FILEEXT::PcbFileWildcard(),
+                      wxFD_OPEN | wxFD_FILE_MUST_EXIST | wxFD_CHANGE_DIR );
 
     if( dlg.ShowModal() == wxID_OK )
         m_filePathCtrl->SetValue( dlg.GetPath() );
diff --git a/pcbnew/dialogs/dialog_plot.cpp b/pcbnew/dialogs/dialog_plot.cpp
index eba1d410df..901086b94a 100644
--- a/pcbnew/dialogs/dialog_plot.cpp
+++ b/pcbnew/dialogs/dialog_plot.cpp
@@ -1259,7 +1259,8 @@ void DIALOG_PLOT::Plot( wxCommandEvent& event )
         wxFileName fn( boardFilename );
 
         // Build gerber job file from basename
-        BuildPlotFileName( &fn, outputDir.GetPath(), wxT( "job" ), GerberJobFileExtension );
+        BuildPlotFileName( &fn, outputDir.GetPath(), wxT( "job" ),
+                           FILEEXT::GerberJobFileExtension );
         jobfile_writer.CreateJobFile( fn.GetFullPath() );
     }
 
diff --git a/pcbnew/dialogs/panel_fp_lib_table.cpp b/pcbnew/dialogs/panel_fp_lib_table.cpp
index caaf17eae5..e4279e371a 100644
--- a/pcbnew/dialogs/panel_fp_lib_table.cpp
+++ b/pcbnew/dialogs/panel_fp_lib_table.cpp
@@ -846,7 +846,7 @@ void PANEL_FP_LIB_TABLE::onMigrateLibraries( wxCommandEvent& event )
         }
 
         wxFileName newLib( resolvedPath );
-        newLib.AppendDir( newLib.GetName() + "." + KiCadFootprintLibPathExtension );
+        newLib.AppendDir( newLib.GetName() + "." + FILEEXT::KiCadFootprintLibPathExtension );
         newLib.SetName( "" );
         newLib.ClearExt();
 
@@ -1006,7 +1006,7 @@ void PANEL_FP_LIB_TABLE::browseLibrariesHandler( wxCommandEvent& event )
     }
 
     // Drop the last directory if the path is a .pretty folder
-    if( cfg->m_lastFootprintLibDir.EndsWith( KiCadFootprintLibPathExtension ) )
+    if( cfg->m_lastFootprintLibDir.EndsWith( FILEEXT::KiCadFootprintLibPathExtension ) )
         cfg->m_lastFootprintLibDir = cfg->m_lastFootprintLibDir.BeforeLast( wxFileName::GetPathSeparator() );
 
     const ENV_VAR_MAP& envVars       = Pgm().GetLocalEnvVariables();
@@ -1023,7 +1023,8 @@ void PANEL_FP_LIB_TABLE::browseLibrariesHandler( wxCommandEvent& event )
         wxString   nickname = LIB_ID::FixIllegalChars( fn.GetName(), true );
         bool       doAdd    = true;
 
-        if( fileType == PCB_IO_MGR::KICAD_SEXP && fn.GetExt() != KiCadFootprintLibPathExtension )
+        if( fileType == PCB_IO_MGR::KICAD_SEXP
+            && fn.GetExt() != FILEEXT::KiCadFootprintLibPathExtension )
             nickname = LIB_ID::FixIllegalChars( fn.GetFullName(), true ).wx_str();
 
         if( cur_model()->ContainsNickname( nickname ) )
diff --git a/pcbnew/dialogs/panel_setup_rules.cpp b/pcbnew/dialogs/panel_setup_rules.cpp
index 52f86ce883..4a584d88ea 100644
--- a/pcbnew/dialogs/panel_setup_rules.cpp
+++ b/pcbnew/dialogs/panel_setup_rules.cpp
@@ -728,7 +728,7 @@ void PANEL_SETUP_RULES::ImportSettingsFrom( BOARD* aBoard )
     if( !m_frame->Prj().IsNullProject() )
     {
         wxFileName relFile = aBoard->GetFileName();
-        relFile.SetExt( DesignRulesFileExtension );
+        relFile.SetExt( FILEEXT::DesignRulesFileExtension );
 
         wxFileName absFile( aBoard->GetProject()->AbsolutePath( relFile.GetFullName() ) );
 
diff --git a/pcbnew/exporters/export_d356.cpp b/pcbnew/exporters/export_d356.cpp
index c8e50fc775..d98719611a 100644
--- a/pcbnew/exporters/export_d356.cpp
+++ b/pcbnew/exporters/export_d356.cpp
@@ -371,8 +371,8 @@ void PCB_EDIT_FRAME::GenD356File( wxCommandEvent& aEvent )
     wxFileName  fn = GetBoard()->GetFileName();
     wxString    ext, wildcard;
 
-    ext = IpcD356FileExtension;
-    wildcard = IpcD356FileWildcard();
+    ext = FILEEXT::IpcD356FileExtension;
+    wildcard = FILEEXT::IpcD356FileWildcard();
     fn.SetExt( ext );
 
     wxString pro_dir = wxPathOnly( Prj().GetProjectFullName() );
diff --git a/pcbnew/exporters/export_footprint_associations.cpp b/pcbnew/exporters/export_footprint_associations.cpp
index af8c5270d9..fa7d203ef0 100644
--- a/pcbnew/exporters/export_footprint_associations.cpp
+++ b/pcbnew/exporters/export_footprint_associations.cpp
@@ -68,10 +68,10 @@ void PCB_EDIT_FRAME::RecreateCmpFileFromBoard( wxCommandEvent& aEvent )
     wxString   projectDir = wxPathOnly( Prj().GetProjectFullName() );
     wxFileName fn = GetBoard()->GetFileName();
 
-    fn.SetExt( FootprintAssignmentFileExtension );
+    fn.SetExt( FILEEXT::FootprintAssignmentFileExtension );
 
-    wxFileDialog dlg( this, _( "Save Footprint Association File" ),
-                      projectDir, fn.GetFullName(), FootprintAssignmentFileWildcard(),
+    wxFileDialog dlg( this, _( "Save Footprint Association File" ), projectDir, fn.GetFullName(),
+                      FILEEXT::FootprintAssignmentFileWildcard(),
                       wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
 
     if( dlg.ShowModal() == wxID_CANCEL )
diff --git a/pcbnew/exporters/gendrill_Excellon_writer.cpp b/pcbnew/exporters/gendrill_Excellon_writer.cpp
index e7cac26426..3fa73482ec 100644
--- a/pcbnew/exporters/gendrill_Excellon_writer.cpp
+++ b/pcbnew/exporters/gendrill_Excellon_writer.cpp
@@ -68,7 +68,7 @@ EXCELLON_WRITER::EXCELLON_WRITER( BOARD* aPcb )
     m_mirror = false;
     m_merge_PTH_NPTH = false;
     m_minimalHeader = false;
-    m_drillFileExtension = DrillFileExtension;
+    m_drillFileExtension = FILEEXT::DrillFileExtension;
     m_useRouteModeForOval = true;
 }
 
diff --git a/pcbnew/exporters/gerber_placefile_writer.cpp b/pcbnew/exporters/gerber_placefile_writer.cpp
index 0e8d35948c..ed2c785bda 100644
--- a/pcbnew/exporters/gerber_placefile_writer.cpp
+++ b/pcbnew/exporters/gerber_placefile_writer.cpp
@@ -368,7 +368,7 @@ const wxString PLACEFILE_GERBER_WRITER::GetPlaceFileName( const wxString& aFullB
     wxString post_id = wxT( "-pnp_" );
     post_id += aLayer == B_Cu ? wxT( "bottom" ) : wxT( "top" );
     fn.SetName( fn.GetName() + post_id );
-    fn.SetExt( GerberFileExtension );
+    fn.SetExt( FILEEXT::GerberFileExtension );
 
     return fn.GetFullPath();
 }
diff --git a/pcbnew/files.cpp b/pcbnew/files.cpp
index dbedc9cc33..de4b26930d 100644
--- a/pcbnew/files.cpp
+++ b/pcbnew/files.cpp
@@ -199,10 +199,10 @@ bool AskLoadBoardFileName( PCB_EDIT_FRAME* aParent, wxString* aFileName, int aCt
  */
 bool AskSaveBoardFileName( PCB_EDIT_FRAME* aParent, wxString* aFileName, bool* aCreateProject )
 {
-    wxString    wildcard =  PcbFileWildcard();
+    wxString   wildcard = FILEEXT::PcbFileWildcard();
     wxFileName  fn = *aFileName;
 
-    fn.SetExt( KiCadPcbFileExtension );
+    fn.SetExt( FILEEXT::KiCadPcbFileExtension );
 
     wxFileDialog dlg( aParent, _( "Save Board File As" ), fn.GetPath(), fn.GetFullName(), wildcard,
                       wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
@@ -217,7 +217,7 @@ bool AskSaveBoardFileName( PCB_EDIT_FRAME* aParent, wxString* aFileName, bool* a
         return false;
 
     *aFileName = dlg.GetPath();
-    *aFileName = EnsureFileExtension( *aFileName, KiCadPcbFileExtension );
+    *aFileName = EnsureFileExtension( *aFileName, FILEEXT::KiCadPcbFileExtension );
 
     if( newProjectHook.IsAttachedToDialog() )
         *aCreateProject = newProjectHook.GetCreateNewProject();
@@ -407,7 +407,7 @@ bool PCB_EDIT_FRAME::Files_io_from_id( int id )
                 savePath = PATHS::GetDefaultUserProjectsPath();
         }
 
-        wxFileName  fn( savePath.GetPath(), orig_name, KiCadPcbFileExtension );
+        wxFileName  fn( savePath.GetPath(), orig_name, FILEEXT::KiCadPcbFileExtension );
         wxString    filename = fn.GetFullPath();
         bool        createProject = false;
         bool        success = false;
@@ -535,7 +535,7 @@ bool PCB_EDIT_FRAME::OpenProjectFiles( const std::vector<wxString>& aFileSet, in
     }
 
     wxFileName pro = fullFileName;
-    pro.SetExt( ProjectFileExtension );
+    pro.SetExt( FILEEXT::ProjectFileExtension );
 
     bool is_new = !wxFileName::IsFileReadable( fullFileName );
 
@@ -872,7 +872,7 @@ bool PCB_EDIT_FRAME::OpenProjectFiles( const std::vector<wxString>& aFileSet, in
         wxFileName fn = fullFileName;
 
         if( converted )
-            fn.SetExt( PcbFileExtension );
+            fn.SetExt( FILEEXT::PcbFileExtension );
 
         wxString fname = fn.GetFullPath();
 
@@ -932,8 +932,8 @@ bool PCB_EDIT_FRAME::SavePcbFile( const wxString& aFileName, bool addToHistory,
     // please, keep it simple.  prompting goes elsewhere.
     wxFileName pcbFileName = aFileName;
 
-    if( pcbFileName.GetExt() == LegacyPcbFileExtension )
-        pcbFileName.SetExt( KiCadPcbFileExtension );
+    if( pcbFileName.GetExt() == FILEEXT::LegacyPcbFileExtension )
+        pcbFileName.SetExt( FILEEXT::KiCadPcbFileExtension );
 
     // Write through symlinks, don't replace them
     WX_FILENAME::ResolvePossibleSymlinks( pcbFileName );
@@ -952,8 +952,8 @@ bool PCB_EDIT_FRAME::SavePcbFile( const wxString& aFileName, bool addToHistory,
     wxFileName rulesFile( pcbFileName );
     wxString   msg;
 
-    projectFile.SetExt( ProjectFileExtension );
-    rulesFile.SetExt( DesignRulesFileExtension );
+    projectFile.SetExt( FILEEXT::ProjectFileExtension );
+    rulesFile.SetExt( FILEEXT::DesignRulesFileExtension );
 
     if( projectFile.FileExists() )
     {
@@ -1075,7 +1075,7 @@ bool PCB_EDIT_FRAME::SavePcbFile( const wxString& aFileName, bool addToHistory,
 
 bool PCB_EDIT_FRAME::SavePcbCopy( const wxString& aFileName, bool aCreateProject )
 {
-    wxFileName pcbFileName( EnsureFileExtension( aFileName, KiCadPcbFileExtension ) );
+    wxFileName pcbFileName( EnsureFileExtension( aFileName, FILEEXT::KiCadPcbFileExtension ) );
 
     if( !IsWritable( pcbFileName ) )
     {
@@ -1111,8 +1111,8 @@ bool PCB_EDIT_FRAME::SavePcbCopy( const wxString& aFileName, bool aCreateProject
     wxFileName rulesFile( pcbFileName );
     wxString   msg;
 
-    projectFile.SetExt( ProjectFileExtension );
-    rulesFile.SetExt( DesignRulesFileExtension );
+    projectFile.SetExt( FILEEXT::ProjectFileExtension );
+    rulesFile.SetExt( FILEEXT::DesignRulesFileExtension );
 
     if( aCreateProject && !projectFile.FileExists() )
         GetSettingsManager()->SaveProjectCopy( projectFile.GetFullPath() );
@@ -1148,7 +1148,7 @@ bool PCB_EDIT_FRAME::doAutoSave()
     if( GetBoard()->GetFileName().IsEmpty() )
     {
         tmpFileName = wxFileName( PATHS::GetDefaultUserProjectsPath(), NAMELESS_PROJECT,
-                                  KiCadPcbFileExtension );
+                                  FILEEXT::KiCadPcbFileExtension );
         GetBoard()->SetFileName( tmpFileName.GetFullPath() );
     }
     else
@@ -1324,7 +1324,7 @@ void PCB_EDIT_FRAME::GenIPC2581File( wxCommandEvent& event )
     if( dlg.GetCompress() )
     {
         wxFileName tempfn = pcbFileName;
-        tempfn.SetExt( Ipc2581FileExtension );
+        tempfn.SetExt( FILEEXT::Ipc2581FileExtension );
         wxFileName zipfn = tempFile;
         zipfn.SetExt( "zip" );
 
diff --git a/pcbnew/footprint_edit_frame.cpp b/pcbnew/footprint_edit_frame.cpp
index 9e9e7e7acb..5ce16b15f2 100644
--- a/pcbnew/footprint_edit_frame.cpp
+++ b/pcbnew/footprint_edit_frame.cpp
@@ -252,8 +252,8 @@ FOOTPRINT_EDIT_FRAME::FOOTPRINT_EDIT_FRAME( KIWAY* aKiway, wxWindow* aParent ) :
     // The selection filter doesn't need to grow in the vertical direction when docked
     m_auimgr.GetPane( "SelectionFilter" ).dock_proportion = 0;
 
-    m_acceptedExts.emplace( KiCadFootprintLibPathExtension, &ACTIONS::ddAddLibrary );
-    m_acceptedExts.emplace( KiCadFootprintFileExtension, &PCB_ACTIONS::ddImportFootprint );
+    m_acceptedExts.emplace( FILEEXT::KiCadFootprintLibPathExtension, &ACTIONS::ddAddLibrary );
+    m_acceptedExts.emplace( FILEEXT::KiCadFootprintFileExtension, &PCB_ACTIONS::ddImportFootprint );
     DragAcceptFiles( true );
 
     ActivateGalCanvas();
@@ -942,7 +942,7 @@ void FOOTPRINT_EDIT_FRAME::UpdateTitle()
         title += footprint->GetReference();
         title += wxS( " " ) + wxString::Format( _( "[from %s]" ), Prj().GetProjectName()
                                                                               + wxT( "." )
-                                                                              + PcbFileExtension );
+                                                                              + FILEEXT::PcbFileExtension );
     }
     else if( fpid.IsValid() )
     {
@@ -1363,8 +1363,8 @@ void FOOTPRINT_EDIT_FRAME::OnSaveFootprintAsPng( wxCommandEvent& event )
 
     wxString projectPath = wxPathOnly( Prj().GetProjectFullName() );
 
-    wxFileDialog dlg( this, _( "Export View as PNG" ), projectPath,
-                      fn.GetFullName(), PngFileWildcard(), wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
+    wxFileDialog dlg( this, _( "Export View as PNG" ), projectPath, fn.GetFullName(),
+                      FILEEXT::PngFileWildcard(), wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
 
     if( dlg.ShowModal() == wxID_CANCEL || dlg.GetPath().IsEmpty() )
         return;
diff --git a/pcbnew/footprint_libraries_utils.cpp b/pcbnew/footprint_libraries_utils.cpp
index de5badca70..87c46e45e7 100644
--- a/pcbnew/footprint_libraries_utils.cpp
+++ b/pcbnew/footprint_libraries_utils.cpp
@@ -227,9 +227,9 @@ void FOOTPRINT_EDIT_FRAME::ExportFootprint( FOOTPRINT* aFootprint )
 
     fn.SetName( aFootprint->GetFPID().GetLibItemName() );
 
-    wxString    wildcard = KiCadFootprintLibFileWildcard();
+    wxString wildcard = FILEEXT::KiCadFootprintLibFileWildcard();
 
-    fn.SetExt( KiCadFootprintFileExtension );
+    fn.SetExt( FILEEXT::KiCadFootprintFileExtension );
 
     if( !cfg->m_LastExportPath.empty() )
         fn.SetPath( cfg->m_LastExportPath );
@@ -242,7 +242,7 @@ void FOOTPRINT_EDIT_FRAME::ExportFootprint( FOOTPRINT* aFootprint )
     if( dlg.ShowModal() == wxID_CANCEL )
         return;
 
-    fn = EnsureFileExtension( dlg.GetPath(), KiCadFootprintFileExtension );
+    fn = EnsureFileExtension( dlg.GetPath(), FILEEXT::KiCadFootprintFileExtension );
     cfg->m_LastExportPath = fn.GetPath();
 
     try
@@ -320,8 +320,8 @@ wxString PCB_BASE_EDIT_FRAME::createNewLibrary( const wxString& aLibName,
     {
         fn = initialPath;
 
-        if( !LibraryFileBrowser( false, fn, KiCadFootprintLibPathWildcard(),
-                                 KiCadFootprintLibPathExtension, false, isGlobal,
+        if( !LibraryFileBrowser( false, fn, FILEEXT::KiCadFootprintLibPathWildcard(),
+                                 FILEEXT::KiCadFootprintLibPathExtension, false, isGlobal,
                                  PATHS::GetDefaultUserFootprintsPath() ) )
         {
             return wxEmptyString;
@@ -331,7 +331,7 @@ wxString PCB_BASE_EDIT_FRAME::createNewLibrary( const wxString& aLibName,
     }
     else
     {
-        fn = EnsureFileExtension( aLibName, KiCadFootprintLibPathExtension );
+        fn = EnsureFileExtension( aLibName, FILEEXT::KiCadFootprintLibPathExtension );
 
         if( !fn.IsAbsolute() )
         {
@@ -456,8 +456,8 @@ bool PCB_BASE_EDIT_FRAME::AddLibrary( const wxString& aFilename, FP_LIB_TABLE* a
 
     if( aFilename.IsEmpty() )
     {
-        if( !LibraryFileBrowser( true, fn, KiCadFootprintLibPathWildcard(),
-                                 KiCadFootprintLibPathExtension, true, isGlobal,
+        if( !LibraryFileBrowser( true, fn, FILEEXT::KiCadFootprintLibPathWildcard(),
+                                 FILEEXT::KiCadFootprintLibPathExtension, true, isGlobal,
                                  PATHS::GetDefaultUserFootprintsPath() ) )
         {
             return false;
@@ -479,7 +479,8 @@ bool PCB_BASE_EDIT_FRAME::AddLibrary( const wxString& aFilename, FP_LIB_TABLE* a
 
     // KiCad lib is our default guess.  So it might not have the .pretty extension
     // In this case, the extension is part of the library name
-    if( lib_type == PCB_IO_MGR::KICAD_SEXP && fn.GetExt() != KiCadFootprintLibPathExtension )
+    if( lib_type == PCB_IO_MGR::KICAD_SEXP
+        && fn.GetExt() != FILEEXT::KiCadFootprintLibPathExtension )
         libName = fn.GetFullName();
 
     // try to use path normalized to an environmental variable or project path
diff --git a/pcbnew/pcb_base_edit_frame.cpp b/pcbnew/pcb_base_edit_frame.cpp
index fe77b21b27..73d6a72d56 100644
--- a/pcbnew/pcb_base_edit_frame.cpp
+++ b/pcbnew/pcb_base_edit_frame.cpp
@@ -269,7 +269,7 @@ wxString PCB_BASE_EDIT_FRAME::GetDesignRulesPath()
         return wxEmptyString;
 
     wxFileName fn = GetBoard()->GetFileName();
-    fn.SetExt( DesignRulesFileExtension );
+    fn.SetExt( FILEEXT::DesignRulesFileExtension );
     return Prj().AbsolutePath( fn.GetFullName() );
 }
 
diff --git a/pcbnew/pcb_base_frame.cpp b/pcbnew/pcb_base_frame.cpp
index af67258470..9223f3662c 100644
--- a/pcbnew/pcb_base_frame.cpp
+++ b/pcbnew/pcb_base_frame.cpp
@@ -1158,7 +1158,7 @@ void PCB_BASE_FRAME::setFPWatcher( FOOTPRINT* aFootprint )
     }
 
     m_watcherFileName.Assign( libfullname, aFootprint->GetFPID().GetLibItemName(),
-                              KiCadFootprintFileExtension );
+                              FILEEXT::KiCadFootprintFileExtension );
 
     if( !m_watcherFileName.FileExists() )
         return;
diff --git a/pcbnew/pcb_edit_frame.cpp b/pcbnew/pcb_edit_frame.cpp
index 535338ab92..564dc97914 100644
--- a/pcbnew/pcb_edit_frame.cpp
+++ b/pcbnew/pcb_edit_frame.cpp
@@ -487,8 +487,8 @@ PCB_EDIT_FRAME::PCB_EDIT_FRAME( KIWAY* aKiway, wxWindow* aParent ) :
           this );
     Bind( EDA_EVT_CLOSE_NET_INSPECTOR_DIALOG, &PCB_EDIT_FRAME::onCloseNetInspectorDialog, this );
     Bind( EDA_EVT_UNITS_CHANGED, &PCB_EDIT_FRAME::onUnitsChanged, this );
-    m_acceptedExts.emplace( KiCadPcbFileExtension, &PCB_ACTIONS::ddAppendBoard );
-    m_acceptedExts.emplace( LegacyPcbFileExtension, &PCB_ACTIONS::ddAppendBoard );
+    m_acceptedExts.emplace( FILEEXT::KiCadPcbFileExtension, &PCB_ACTIONS::ddAppendBoard );
+    m_acceptedExts.emplace( FILEEXT::LegacyPcbFileExtension, &PCB_ACTIONS::ddAppendBoard );
     DragAcceptFiles( true );
 }
 
@@ -1836,13 +1836,13 @@ int PCB_EDIT_FRAME::TestStandalone()
     if( !frame->IsShownOnScreen() )
     {
         wxFileName fn( Prj().GetProjectPath(), Prj().GetProjectName(),
-                       KiCadSchematicFileExtension );
+                       FILEEXT::KiCadSchematicFileExtension );
 
         // Maybe the file hasn't been converted to the new s-expression file format so
         // see if the legacy schematic file is still in play.
         if( !fn.FileExists() )
         {
-            fn.SetExt( LegacySchematicFileExtension );
+            fn.SetExt( FILEEXT::LegacySchematicFileExtension );
 
             if( !fn.FileExists() )
             {
@@ -1922,12 +1922,12 @@ void PCB_EDIT_FRAME::RunEeschema()
 {
     wxString   msg;
     wxFileName schematic( Prj().GetProjectPath(), Prj().GetProjectName(),
-                          KiCadSchematicFileExtension );
+                          FILEEXT::KiCadSchematicFileExtension );
 
     if( !schematic.FileExists() )
     {
         wxFileName legacySchematic( Prj().GetProjectPath(), Prj().GetProjectName(),
-                                    LegacySchematicFileExtension );
+                                    FILEEXT::LegacySchematicFileExtension );
 
         if( legacySchematic.FileExists() )
         {
diff --git a/pcbnew/pcb_io/geda/pcb_io_geda.cpp b/pcbnew/pcb_io/geda/pcb_io_geda.cpp
index 2e9d2c0b5f..30d02dd20a 100644
--- a/pcbnew/pcb_io/geda/pcb_io_geda.cpp
+++ b/pcbnew/pcb_io/geda/pcb_io_geda.cpp
@@ -230,7 +230,7 @@ void GPCB_FPL_CACHE::Load()
     }
 
     wxString fullName;
-    wxString fileSpec = wxT( "*." ) + GedaPcbFootprintLibFileExtension;
+    wxString fileSpec = wxT( "*." ) + FILEEXT::GedaPcbFootprintLibFileExtension;
 
     // wxFileName construction is egregiously slow.  Construct it once and just swap out
     // the filename thereafter.
@@ -301,7 +301,7 @@ bool GPCB_FPL_CACHE::IsModified()
 
 long long GPCB_FPL_CACHE::GetTimestamp( const wxString& aLibPath )
 {
-    wxString fileSpec = wxT( "*." ) + GedaPcbFootprintLibFileExtension;
+    wxString fileSpec = wxT( "*." ) + FILEEXT::GedaPcbFootprintLibFileExtension;
 
     return TimestampDir( aLibPath, fileSpec );
 }
@@ -1001,7 +1001,7 @@ bool PCB_IO_GEDA::DeleteLibrary( const wxString& aLibraryPath, const STRING_UTF8
         {
             tmp = files[i];
 
-            if( tmp.GetExt() != KiCadFootprintFileExtension )
+            if( tmp.GetExt() != FILEEXT::KiCadFootprintFileExtension )
             {
                 THROW_IO_ERROR( wxString::Format( _( "Unexpected file '%s' found in library '%s'." ),
                                                   files[i].GetData(),
diff --git a/pcbnew/pcb_io/kicad_sexpr/pcb_io_kicad_sexpr.cpp b/pcbnew/pcb_io/kicad_sexpr/pcb_io_kicad_sexpr.cpp
index 54b7646431..6fee37768f 100644
--- a/pcbnew/pcb_io/kicad_sexpr/pcb_io_kicad_sexpr.cpp
+++ b/pcbnew/pcb_io/kicad_sexpr/pcb_io_kicad_sexpr.cpp
@@ -170,7 +170,7 @@ void FP_CACHE::Load()
     }
 
     wxString fullName;
-    wxString fileSpec = wxT( "*." ) + KiCadFootprintFileExtension;
+    wxString fileSpec = wxT( "*." ) + FILEEXT::KiCadFootprintFileExtension;
 
     // wxFileName construction is egregiously slow.  Construct it once and just swap out
     // the filename thereafter.
@@ -267,7 +267,7 @@ bool FP_CACHE::IsModified()
 
 long long FP_CACHE::GetTimestamp( const wxString& aLibPath )
 {
-    wxString fileSpec = wxT( "*." ) + KiCadFootprintFileExtension;
+    wxString fileSpec = wxT( "*." ) + FILEEXT::KiCadFootprintFileExtension;
 
     return TimestampDir( aLibPath, fileSpec );
 }
@@ -2574,7 +2574,7 @@ bool PCB_IO_KICAD_SEXPR::FootprintExists( const wxString& aLibraryPath, const wx
     // case-insensitive filesystem) handled "for free".
     // Warning: footprint names frequently contain a point. So be careful when initializing
     // wxFileName, and use a CTOR with extension specified
-    wxFileName footprintFile( aLibraryPath, aFootprintName, KiCadFootprintFileExtension );
+    wxFileName footprintFile( aLibraryPath, aFootprintName, FILEEXT::KiCadFootprintFileExtension );
 
     return footprintFile.Exists();
 }
@@ -2663,7 +2663,7 @@ void PCB_IO_KICAD_SEXPR::FootprintSave( const wxString& aLibraryPath, const FOOT
 
     // Quietly overwrite footprint and delete footprint file from path for any by same name.
     wxFileName fn( aLibraryPath, aFootprint->GetFPID().GetLibItemName(),
-                   KiCadFootprintFileExtension );
+                   FILEEXT::KiCadFootprintFileExtension );
 
     // Write through symlinks, don't replace them
     WX_FILENAME::ResolvePossibleSymlinks( fn );
@@ -2798,7 +2798,7 @@ bool PCB_IO_KICAD_SEXPR::DeleteLibrary( const wxString& aLibraryPath, const STRI
         {
             tmp = files[i];
 
-            if( tmp.GetExt() != KiCadFootprintFileExtension )
+            if( tmp.GetExt() != FILEEXT::KiCadFootprintFileExtension )
             {
                 THROW_IO_ERROR( wxString::Format( _( "Unexpected file '%s' found in library "
                                                      "path '%s'." ),
diff --git a/pcbnew/pcbnew.cpp b/pcbnew/pcbnew.cpp
index d846e6c61c..211ff2c87f 100644
--- a/pcbnew/pcbnew.cpp
+++ b/pcbnew/pcbnew.cpp
@@ -504,26 +504,28 @@ void IFACE::SaveFileAs( const wxString& aProjectBasePath, const wxString& aSrcPr
 
     destFile.SetPath( destPath );
 
-    if( ext == KiCadPcbFileExtension || ext == KiCadPcbFileExtension + BackupFileSuffix )
+    if( ext == FILEEXT::KiCadPcbFileExtension
+        || ext == FILEEXT::KiCadPcbFileExtension + FILEEXT::BackupFileSuffix )
     {
         if( destFile.GetName() == aSrcProjectName )
             destFile.SetName( aNewProjectName );
 
         KiCopyFile( aSrcFilePath, destFile.GetFullPath(), aErrors );
     }
-    else if( ext == LegacyPcbFileExtension )
+    else if( ext == FILEEXT::LegacyPcbFileExtension )
     {
         if( destFile.GetName() == aSrcProjectName )
             destFile.SetName( aNewProjectName );
 
         KiCopyFile( aSrcFilePath, destFile.GetFullPath(), aErrors );
     }
-    else if( ext == LegacyFootprintLibPathExtension || ext == KiCadFootprintFileExtension )
+    else if( ext == FILEEXT::LegacyFootprintLibPathExtension
+             || ext == FILEEXT::KiCadFootprintFileExtension )
     {
         // Footprints are not project-specific.  Keep their source names.
         KiCopyFile( aSrcFilePath, destFile.GetFullPath(), aErrors );
     }
-    else if( ext == FootprintAssignmentFileExtension )
+    else if( ext == FILEEXT::FootprintAssignmentFileExtension )
     {
         // TODO
     }
diff --git a/pcbnew/pcbnew_jobs_handler.cpp b/pcbnew/pcbnew_jobs_handler.cpp
index 11fcaffbaf..00b6a192a6 100644
--- a/pcbnew/pcbnew_jobs_handler.cpp
+++ b/pcbnew/pcbnew_jobs_handler.cpp
@@ -415,7 +415,7 @@ int PCBNEW_JOBS_HANDLER::JobExportGerbers( JOB* aJob )
         if( plotOpts.GetUseGerberProtelExtensions() )
             fileExt = GetGerberProtelExtension( layer );
         else
-            fileExt = GerberFileExtension;
+            fileExt = FILEEXT::GerberFileExtension;
 
         BuildPlotFileName( &fn, aGerberJob->m_outputFile, brd->GetLayerName( layer ), fileExt );
         wxString fullname = fn.GetFullName();
@@ -447,7 +447,8 @@ int PCBNEW_JOBS_HANDLER::JobExportGerbers( JOB* aJob )
     wxFileName fn( aGerberJob->m_filename );
 
     // Build gerber job file from basename
-    BuildPlotFileName( &fn, aGerberJob->m_outputFile, wxT( "job" ), GerberJobFileExtension );
+    BuildPlotFileName( &fn, aGerberJob->m_outputFile, wxT( "job" ),
+                       FILEEXT::GerberJobFileExtension );
     jobfile_writer.CreateJobFile( fn.GetFullPath() );
 
     return exitCode;
@@ -671,11 +672,11 @@ int PCBNEW_JOBS_HANDLER::JobExportPos( JOB* aJob )
         fn.SetName( fn.GetName() );
 
         if( aPosJob->m_format == JOB_EXPORT_PCB_POS::FORMAT::ASCII )
-            fn.SetExt( FootprintPlaceFileExtension );
+            fn.SetExt( FILEEXT::FootprintPlaceFileExtension );
         else if( aPosJob->m_format == JOB_EXPORT_PCB_POS::FORMAT::CSV )
-            fn.SetExt( CsvFileExtension );
+            fn.SetExt( FILEEXT::CsvFileExtension );
         else if( aPosJob->m_format == JOB_EXPORT_PCB_POS::FORMAT::GERBER )
-            fn.SetExt( GerberFileExtension );
+            fn.SetExt( FILEEXT::GerberFileExtension );
 
         aPosJob->m_outputFile = fn.GetFullName();
     }
@@ -898,7 +899,7 @@ int PCBNEW_JOBS_HANDLER::doFpExportSvg( JOB_FP_EXPORT_SVG* aSvgJob, const FOOTPR
     wxFileName outputFile;
     outputFile.SetPath( aSvgJob->m_outputDirectory );
     outputFile.SetName( aFootprint->GetFPID().GetLibItemName().wx_str() );
-    outputFile.SetExt( SVGFileExtension );
+    outputFile.SetExt( FILEEXT::SVGFileExtension );
 
     m_reporter->Report( wxString::Format( _( "Plotting footprint '%s' to '%s'\n" ),
                                           aFootprint->GetFPID().GetLibItemName().wx_str(),
@@ -942,9 +943,9 @@ int PCBNEW_JOBS_HANDLER::JobExportDrc( JOB* aJob )
         fn.SetName( fn.GetName() );
 
         if( drcJob->m_format == JOB_PCB_DRC::OUTPUT_FORMAT::JSON )
-            fn.SetExt( JsonFileExtension );
+            fn.SetExt( FILEEXT::JsonFileExtension );
         else
-            fn.SetExt( ReportFileExtension );
+            fn.SetExt( FILEEXT::ReportFileExtension );
 
         drcJob->m_outputFile = fn.GetFullName();
     }
diff --git a/pcbnew/python/scripting/pcbnew_scripting_helpers.cpp b/pcbnew/python/scripting/pcbnew_scripting_helpers.cpp
index 2c1e031099..e7f315c174 100644
--- a/pcbnew/python/scripting/pcbnew_scripting_helpers.cpp
+++ b/pcbnew/python/scripting/pcbnew_scripting_helpers.cpp
@@ -86,9 +86,9 @@ void ScriptingOnDestructPcbEditFrame( PCB_EDIT_FRAME* aPcbEditFrame )
 
 BOARD* LoadBoard( wxString& aFileName )
 {
-    if( aFileName.EndsWith( KiCadPcbFileExtension ) )
+    if( aFileName.EndsWith( FILEEXT::KiCadPcbFileExtension ) )
         return LoadBoard( aFileName, PCB_IO_MGR::KICAD_SEXP );
-    else if( aFileName.EndsWith( LegacyPcbFileExtension ) )
+    else if( aFileName.EndsWith( FILEEXT::LegacyPcbFileExtension ) )
         return LoadBoard( aFileName, PCB_IO_MGR::LEGACY );
 
     // as fall back for any other kind use the legacy format
@@ -137,7 +137,7 @@ PROJECT* GetDefaultProject()
 BOARD* LoadBoard( wxString& aFileName, PCB_IO_MGR::PCB_FILE_T aFormat )
 {
     wxFileName pro = aFileName;
-    pro.SetExt( ProjectFileExtension );
+    pro.SetExt( FILEEXT::ProjectFileExtension );
     pro.MakeAbsolute();
     wxString projectPath = pro.GetFullPath();
 
@@ -194,7 +194,7 @@ BOARD* LoadBoard( wxString& aFileName, PCB_IO_MGR::PCB_FILE_T aFormat )
         try
         {
             wxFileName rules = pro;
-            rules.SetExt( DesignRulesFileExtension );
+            rules.SetExt( FILEEXT::DesignRulesFileExtension );
             bds.m_DRCEngine->InitEngine( rules );
         }
         catch( ... )
@@ -219,7 +219,7 @@ BOARD* NewBoard( wxString& aFileName )
 {
     wxFileName boardFn = aFileName;
     wxFileName proFn   = aFileName;
-    proFn.SetExt( ProjectFileExtension );
+    proFn.SetExt( FILEEXT::ProjectFileExtension );
     proFn.MakeAbsolute();
 
     wxString projectPath = proFn.GetFullPath();
@@ -278,7 +278,7 @@ bool SaveBoard( wxString& aFileName, BOARD* aBoard, PCB_IO_MGR::PCB_FILE_T aForm
     if( !aSkipSettings )
     {
         wxFileName pro = aFileName;
-        pro.SetExt( ProjectFileExtension );
+        pro.SetExt( FILEEXT::ProjectFileExtension );
         pro.MakeAbsolute();
 
         GetSettingsManager()->SaveProjectAs( pro.GetFullPath(), aBoard->GetProject() );
@@ -503,7 +503,7 @@ bool WriteDRCReport( BOARD* aBoard, const wxString& aFileName, EDA_UNITS aUnits,
     wxCHECK( engine, false );
 
     wxFileName fn = aBoard->GetFileName();
-    fn.SetExt( DesignRulesFileExtension );
+    fn.SetExt( FILEEXT::DesignRulesFileExtension );
     PROJECT* prj = nullptr;
 
     if( aBoard->GetProject() )
diff --git a/pcbnew/tools/board_editor_control.cpp b/pcbnew/tools/board_editor_control.cpp
index 6eb3e38465..da6acbca60 100644
--- a/pcbnew/tools/board_editor_control.cpp
+++ b/pcbnew/tools/board_editor_control.cpp
@@ -378,11 +378,11 @@ int BOARD_EDITOR_CONTROL::ImportSpecctraSession( const TOOL_EVENT& aEvent )
     wxString ext;
 
     wxFileName::SplitPath( fullFileName, &path, &name, &ext );
-    name += wxT( "." ) + SpecctraSessionFileExtension;
+    name += wxT( "." ) + FILEEXT::SpecctraSessionFileExtension;
 
     fullFileName = wxFileSelector( _( "Specctra Session File" ), path, name,
-                                   wxT( "." ) + SpecctraSessionFileExtension,
-                                   SpecctraSessionFileWildcard(), wxFD_OPEN | wxFD_CHANGE_DIR,
+                                   wxT( "." ) + FILEEXT::SpecctraSessionFileExtension,
+                                   FILEEXT::SpecctraSessionFileWildcard(), wxFD_OPEN | wxFD_CHANGE_DIR,
                                    frame() );
 
     if( !fullFileName.IsEmpty() )
@@ -400,7 +400,7 @@ int BOARD_EDITOR_CONTROL::ExportSpecctraDSN( const TOOL_EVENT& aEvent )
     if( fullFileName.IsEmpty() )
     {
         fn = m_frame->GetBoard()->GetFileName();
-        fn.SetExt( SpecctraDsnFileExtension );
+        fn.SetExt( FILEEXT::SpecctraDsnFileExtension );
     }
     else
     {
@@ -408,7 +408,7 @@ int BOARD_EDITOR_CONTROL::ExportSpecctraDSN( const TOOL_EVENT& aEvent )
     }
 
     fullFileName = wxFileSelector( _( "Specctra DSN File" ), fn.GetPath(), fn.GetFullName(),
-                                   SpecctraDsnFileExtension, SpecctraDsnFileWildcard(),
+                                   FILEEXT::SpecctraDsnFileExtension, FILEEXT::SpecctraDsnFileWildcard(),
                                    wxFD_SAVE | wxFD_OVERWRITE_PROMPT | wxFD_CHANGE_DIR, frame() );
 
     if( !fullFileName.IsEmpty() )
diff --git a/qa/schematic_utils/eeschema_test_utils.cpp b/qa/schematic_utils/eeschema_test_utils.cpp
index 94ca2ea867..65c0ef4cd0 100644
--- a/qa/schematic_utils/eeschema_test_utils.cpp
+++ b/qa/schematic_utils/eeschema_test_utils.cpp
@@ -41,7 +41,7 @@ void KI_TEST::SCHEMATIC_TEST_FIXTURE::LoadSchematic( const wxString& aBaseName )
     BOOST_TEST_MESSAGE( fn.GetFullPath() );
 
     wxFileName pro( fn );
-    pro.SetExt( ProjectFileExtension );
+    pro.SetExt( FILEEXT::ProjectFileExtension );
 
     // Schematic must be reset before a project is reloaded
     m_schematic.Reset();
@@ -98,7 +98,7 @@ wxFileName KI_TEST::SCHEMATIC_TEST_FIXTURE::GetSchematicPath( const wxString& aB
     fn.AppendDir( "netlists" );
     fn.AppendDir( aBaseName );
     fn.SetName( aBaseName );
-    fn.SetExt( KiCadSchematicFileExtension );
+    fn.SetExt( FILEEXT::KiCadSchematicFileExtension );
 
     return fn;
 }
@@ -112,7 +112,7 @@ wxString TEST_NETLIST_EXPORTER_FIXTURE<Exporter>::GetNetlistPath( bool aTest )
     if( aTest )
         netFile.SetName( netFile.GetName() + "_test" );
 
-    netFile.SetExt( NetlistFileExtension );
+    netFile.SetExt( FILEEXT::NetlistFileExtension );
 
     return netFile.GetFullPath();
 }
diff --git a/qa/tests/eeschema/test_sch_sheet_list.cpp b/qa/tests/eeschema/test_sch_sheet_list.cpp
index dbf7e52017..dfdc56fafd 100644
--- a/qa/tests/eeschema/test_sch_sheet_list.cpp
+++ b/qa/tests/eeschema/test_sch_sheet_list.cpp
@@ -36,7 +36,7 @@ wxFileName TEST_SCH_SHEET_LIST_FIXTURE::GetSchematicPath( const wxString& aRelat
     fn.AppendDir( "netlists" );
 
     wxString path = fn.GetFullPath();
-    path += aRelativePath + wxT( "." ) + KiCadSchematicFileExtension;
+    path += aRelativePath + wxT( "." ) + FILEEXT::KiCadSchematicFileExtension;
 
     return wxFileName( path );
 }
@@ -106,13 +106,13 @@ BOOST_AUTO_TEST_CASE( TestEditPageNumbersInSharedDesign )
         wxFileName rootFn = GetSchematicPath( "complex_hierarchy_shared/complex_hierarchy" );
         wxFileName prjFn = rootFn;
 
-        prjFn.SetExt( ProjectFileExtension );
+        prjFn.SetExt( FILEEXT::ProjectFileExtension );
 
         rootFn.AppendDir( "temp" );
         BOOST_CHECK( rootFn.Mkdir() );
 
         wxFileName newPrjFn = rootFn;
-        newPrjFn.SetExt( ProjectFileExtension );
+        newPrjFn.SetExt( FILEEXT::ProjectFileExtension );
         BOOST_CHECK( wxCopyFile( prjFn.GetFullPath(), newPrjFn.GetFullPath() ) );
 
         m_pi->SaveSchematicFile( rootFn.GetFullPath(), &m_schematic.Root(), &m_schematic );
diff --git a/qa/tests/spice/test_netlist_exporter_spice.h b/qa/tests/spice/test_netlist_exporter_spice.h
index b58c84b34e..5db8dd533b 100644
--- a/qa/tests/spice/test_netlist_exporter_spice.h
+++ b/qa/tests/spice/test_netlist_exporter_spice.h
@@ -88,7 +88,7 @@ public:
         fn.AppendDir( "spice_netlists" );
         fn.AppendDir( aBaseName );
         fn.SetName( aBaseName );
-        fn.SetExt( KiCadSchematicFileExtension );
+        fn.SetExt( FILEEXT::KiCadSchematicFileExtension );
 
         return fn;
     }
diff --git a/qa/tests/spice/test_sim_regressions.cpp b/qa/tests/spice/test_sim_regressions.cpp
index ec6a16c6c1..6fa294e51e 100644
--- a/qa/tests/spice/test_sim_regressions.cpp
+++ b/qa/tests/spice/test_sim_regressions.cpp
@@ -46,7 +46,7 @@ public:
     {
         wxFileName fn( KI_TEST::GetEeschemaTestDataDir() );
         fn.SetName( aBaseName );
-        fn.SetExt( KiCadSchematicFileExtension );
+        fn.SetExt( FILEEXT::KiCadSchematicFileExtension );
 
         return fn;
     }