diff --git a/common/CMakeLists.txt b/common/CMakeLists.txt
index 808c7caf53..0353f40836 100644
--- a/common/CMakeLists.txt
+++ b/common/CMakeLists.txt
@@ -229,7 +229,7 @@ set( COMMON_WIDGET_SRCS
     widgets/msgpanel.cpp
     widgets/number_badge.cpp
     widgets/paged_dialog.cpp
-    widgets/progress_reporter.cpp
+    widgets/progress_reporter_base.cpp
     widgets/split_button.cpp
     widgets/stepped_slider.cpp
     widgets/text_ctrl_eval.cpp
@@ -241,6 +241,7 @@ set( COMMON_WIDGET_SRCS
     widgets/wx_busy_indicator.cpp
     widgets/wx_ellipsized_static_text.cpp
     widgets/wx_grid.cpp
+    widgets/wx_progress_reporters.cpp
     )
 
 set( COMMON_DRAWING_SHEET_SRCS
diff --git a/common/widgets/footprint_select_widget.cpp b/common/widgets/footprint_select_widget.cpp
index de096e9647..f000288bc5 100644
--- a/common/widgets/footprint_select_widget.cpp
+++ b/common/widgets/footprint_select_widget.cpp
@@ -23,7 +23,7 @@
 #include <project.h>
 #include <widgets/footprint_choice.h>
 #include <widgets/footprint_select_widget.h>
-#include <widgets/progress_reporter.h>
+#include <progress_reporter.h>
 #include <footprint_info_impl.h>
 #include <wx/wupdlock.h>
 
diff --git a/common/widgets/progress_reporter_base.cpp b/common/widgets/progress_reporter_base.cpp
new file mode 100644
index 0000000000..a4103846fc
--- /dev/null
+++ b/common/widgets/progress_reporter_base.cpp
@@ -0,0 +1,141 @@
+/*
+ * This program source code file is part of KiCad, a free EDA CAD application.
+ *
+ * Copyright (C) 2017 CERN
+ * Copyright (C) 2021 KiCad Developers, see AUTHORS.txt for contributors.
+ *
+ * Author: Tomasz Wlostowski <tomasz.wlostowski@cern.ch>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, you may find one here:
+ * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
+ * or you may search the http://www.gnu.org website for the version 2 license,
+ * or you may write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+ */
+
+#include <wx/evtloop.h>
+#include <thread>
+#include <widgets/progress_reporter_base.h>
+
+PROGRESS_REPORTER_BASE::PROGRESS_REPORTER_BASE( int aNumPhases ) :
+    PROGRESS_REPORTER(),
+    m_msgChanged( false ),
+    m_phase( 0 ),
+    m_numPhases( aNumPhases ),
+    m_progress( 0 ),
+    m_maxProgress( 1000 ),
+    m_cancelled( false )
+{
+}
+
+
+void PROGRESS_REPORTER_BASE::BeginPhase( int aPhase )
+{
+    m_phase.store( aPhase );
+    m_progress.store( 0 );
+}
+
+
+void PROGRESS_REPORTER_BASE::AdvancePhase()
+{
+    m_phase.fetch_add( 1 );
+    m_progress.store( 0 );
+}
+
+
+void PROGRESS_REPORTER_BASE::AdvancePhase( const wxString& aMessage )
+{
+    AdvancePhase();
+    Report( aMessage );
+}
+
+
+void PROGRESS_REPORTER_BASE::Report( const wxString& aMessage )
+{
+    std::lock_guard<std::mutex> guard( m_mutex );
+    m_rptMessage = aMessage;
+    m_msgChanged = true;
+}
+
+
+void PROGRESS_REPORTER_BASE::SetMaxProgress( int aMaxProgress )
+{
+    m_maxProgress.store( aMaxProgress );
+}
+
+
+void PROGRESS_REPORTER_BASE::SetCurrentProgress( double aProgress )
+{
+    m_maxProgress.store( 1000 );
+    m_progress.store( (int) ( aProgress * 1000.0 ) );
+}
+
+
+void PROGRESS_REPORTER_BASE::AdvanceProgress()
+{
+    m_progress.fetch_add( 1 );
+}
+
+
+void PROGRESS_REPORTER_BASE::SetNumPhases( int aNumPhases )
+{
+    m_numPhases = aNumPhases;
+}
+
+
+void PROGRESS_REPORTER_BASE::AddPhases( int aNumPhases )
+{
+    m_numPhases += aNumPhases;
+}
+
+
+int PROGRESS_REPORTER_BASE::currentProgress() const
+{
+    double current = ( 1.0 / (double) m_numPhases ) *
+                     ( (double) m_phase + ( (double) m_progress.load() / (double) m_maxProgress ) );
+
+    return (int)( current * 1000 );
+}
+
+
+bool PROGRESS_REPORTER_BASE::KeepRefreshing( bool aWait )
+{
+    if( aWait )
+    {
+        while( m_progress.load() < m_maxProgress && m_maxProgress > 0 )
+        {
+            if( !updateUI() )
+            {
+                m_cancelled.store( true );
+                return false;
+            }
+
+            wxMilliSleep( 20 );
+        }
+
+        return true;
+    }
+    else
+    {
+        if( !updateUI() )
+        {
+            m_cancelled.store( true );
+            return false;
+        }
+
+        return true;
+    }
+}
+
+
diff --git a/common/widgets/progress_reporter_base.h b/common/widgets/progress_reporter_base.h
new file mode 100644
index 0000000000..f7fd54b48b
--- /dev/null
+++ b/common/widgets/progress_reporter_base.h
@@ -0,0 +1,127 @@
+/*
+ * This program source code file is part of KiCad, a free EDA CAD application.
+ *
+ * Copyright (C) 2017 CERN
+ * Copyright (C) 2021 KiCad Developers, see AUTHORS.txt for contributors.
+ *
+ * Author: Tomasz Wlostowski <tomasz.wlostowski@cern.ch>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, you may find one here:
+ * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
+ * or you may search the http://www.gnu.org website for the version 2 license,
+ * or you may write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+ */
+
+#ifndef GENERIC_PROGRESS_REPORTER_H
+#define GENERIC_PROGRESS_REPORTER_H
+
+#include <mutex>
+#include <atomic>
+#include <progress_reporter.h>
+
+/**
+ * This implements all the tricky bits for thread safety, but the GUI is left to derived classes.
+ */
+class PROGRESS_REPORTER_BASE : public PROGRESS_REPORTER
+{
+public:
+
+    PROGRESS_REPORTER_BASE( int aNumPhases );
+    PROGRESS_REPORTER_BASE( const PROGRESS_REPORTER_BASE& ) = delete;
+
+    virtual ~PROGRESS_REPORTER_BASE()
+    {
+    }
+
+    /**
+     * Set the number of phases.
+     */
+    void SetNumPhases( int aNumPhases ) override;
+    void AddPhases( int aNumPhases ) override;
+
+    /**
+     * Initialize the \a aPhase virtual zone of the dialog progress bar.
+     */
+    virtual void BeginPhase( int aPhase ) override;
+
+    /**
+     * Use the next available virtual zone of the dialog progress bar.
+     */
+    virtual void AdvancePhase() override;
+
+    /**
+     * Use the next available virtual zone of the dialog progress bar and updates the message.
+     */
+    virtual void AdvancePhase( const wxString& aMessage ) override;
+
+    /**
+     * Display \a aMessage in the progress bar dialog.
+     */
+    virtual void Report( const wxString& aMessage ) override;
+
+    /**
+     * Set the progress value to aProgress (0..1).
+     */
+    virtual void SetCurrentProgress( double aProgress ) override;
+
+    /**
+     * Fix the value that gives the 100 percent progress bar length
+     * (inside the current virtual zone).
+     */
+    void SetMaxProgress( int aMaxProgress ) override;
+
+    /**
+     * Increment the progress bar length (inside the current virtual zone).
+     */
+    void AdvanceProgress() override;
+
+    /**
+     * Update the UI dialog.
+     *
+     * @warning This should  only be called from the main thread.
+     *
+     * @return false if the user clicked Cancel.
+     */
+    bool KeepRefreshing( bool aWait = false ) override;
+
+    /**
+     * Change the title displayed on the window caption.
+     *
+     * Has meaning only for some reporters.  Does nothing for others.
+     *
+     * @warning This should only be called from the main thread.
+     */
+    void SetTitle( const wxString& aTitle ) override { }
+
+    bool IsCancelled() const override { return m_cancelled; }
+
+protected:
+    int currentProgress() const;
+
+    virtual bool updateUI() = 0;
+
+    wxString           m_rptMessage;
+    bool               m_msgChanged;    // true after change in m_rptMessage
+
+    mutable std::mutex m_mutex;
+    std::atomic_int    m_phase;
+    std::atomic_int    m_numPhases;
+    std::atomic_int    m_progress;
+    std::atomic_int    m_maxProgress;
+    std::atomic_bool   m_cancelled;
+};
+
+
+#endif
diff --git a/common/widgets/progress_reporter.cpp b/common/widgets/wx_progress_reporters.cpp
similarity index 59%
rename from common/widgets/progress_reporter.cpp
rename to common/widgets/wx_progress_reporters.cpp
index 41c779352a..a14620a703 100644
--- a/common/widgets/progress_reporter.cpp
+++ b/common/widgets/wx_progress_reporters.cpp
@@ -24,124 +24,16 @@
  * 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
  */
 
-#include <widgets/progress_reporter.h>
 #include <wx/evtloop.h>
 #include <thread>
-
-PROGRESS_REPORTER::PROGRESS_REPORTER( int aNumPhases ) :
-    m_msgChanged( false ),
-    m_phase( 0 ),
-    m_numPhases( aNumPhases ),
-    m_progress( 0 ),
-    m_maxProgress( 1000 ),
-    m_cancelled( false )
-{
-}
-
-
-void PROGRESS_REPORTER::BeginPhase( int aPhase )
-{
-    m_phase.store( aPhase );
-    m_progress.store( 0 );
-}
-
-
-void PROGRESS_REPORTER::AdvancePhase()
-{
-    m_phase.fetch_add( 1 );
-    m_progress.store( 0 );
-}
-
-
-void PROGRESS_REPORTER::AdvancePhase( const wxString& aMessage )
-{
-    AdvancePhase();
-    Report( aMessage );
-}
-
-
-void PROGRESS_REPORTER::Report( const wxString& aMessage )
-{
-    std::lock_guard<std::mutex> guard( m_mutex );
-    m_rptMessage = aMessage;
-    m_msgChanged = true;
-}
-
-
-void PROGRESS_REPORTER::SetMaxProgress( int aMaxProgress )
-{
-    m_maxProgress.store( aMaxProgress );
-}
-
-void PROGRESS_REPORTER::SetCurrentProgress( double aProgress )
-{
-    m_maxProgress.store( 1000 );
-    m_progress.store( (int) ( aProgress * 1000.0 ) );
-}
-
-
-void PROGRESS_REPORTER::AdvanceProgress()
-{
-    m_progress.fetch_add( 1 );
-}
-
-
-void PROGRESS_REPORTER::SetNumPhases( int aNumPhases )
-{
-    m_numPhases = aNumPhases;
-}
-
-
-void PROGRESS_REPORTER::AddPhases( int aNumPhases )
-{
-    m_numPhases += aNumPhases;
-}
-
-
-int PROGRESS_REPORTER::currentProgress() const
-{
-    double current = ( 1.0 / (double) m_numPhases ) *
-                     ( (double) m_phase + ( (double) m_progress.load() / (double) m_maxProgress ) );
-
-    return (int)( current * 1000 );
-}
-
-
-bool PROGRESS_REPORTER::KeepRefreshing( bool aWait )
-{
-    if( aWait )
-    {
-        while( m_progress.load() < m_maxProgress && m_maxProgress > 0 )
-        {
-            if( !updateUI() )
-            {
-                m_cancelled.store( true );
-                return false;
-            }
-
-            wxMilliSleep( 20 );
-        }
-
-        return true;
-    }
-    else
-    {
-        if( !updateUI() )
-        {
-            m_cancelled.store( true );
-            return false;
-        }
-
-        return true;
-    }
-}
+#include <widgets/wx_progress_reporters.h>
 
 
 WX_PROGRESS_REPORTER::WX_PROGRESS_REPORTER( wxWindow* aParent, const wxString& aTitle,
                                             int aNumPhases, bool aCanAbort,
                                             bool aReserveSpaceForMessage ) :
-    PROGRESS_REPORTER( aNumPhases ),
-    wxProgressDialog( aTitle, ( aReserveSpaceForMessage ? wxT( " " ) : wxT( "" ) ), 1, aParent,
+        PROGRESS_REPORTER_BASE( aNumPhases ),
+        wxProgressDialog( aTitle, ( aReserveSpaceForMessage ? wxT( " " ) : wxT( "" ) ), 1, aParent,
                       // wxPD_APP_MODAL |   // Don't use; messes up OSX when called from
                                             // quasi-modal dialog
                       wxPD_AUTO_HIDE |      // *MUST* use; otherwise wxWidgets will spin
@@ -151,7 +43,7 @@ WX_PROGRESS_REPORTER::WX_PROGRESS_REPORTER( wxWindow* aParent, const wxString& a
                       wxPD_ELAPSED_TIME )
 #if wxCHECK_VERSION( 3, 1, 0 )
     ,
-    m_appProgressIndicator( aParent )
+        m_appProgressIndicator( aParent )
 #endif
 {
 #if wxCHECK_VERSION( 3, 1, 0 )
@@ -196,7 +88,7 @@ bool WX_PROGRESS_REPORTER::updateUI()
 
 
 GAUGE_PROGRESS_REPORTER::GAUGE_PROGRESS_REPORTER( wxWindow* aParent, int aNumPhases ) :
-        PROGRESS_REPORTER( aNumPhases ),
+        PROGRESS_REPORTER_BASE( aNumPhases ),
         wxGauge( aParent, wxID_ANY, 1000, wxDefaultPosition, wxDefaultSize, wxGA_HORIZONTAL,
                  wxDefaultValidator, wxGaugeNameStr )
 {
diff --git a/cvpcb/cvpcb_mainframe.cpp b/cvpcb/cvpcb_mainframe.cpp
index d94cc4aa80..4aefa92d34 100644
--- a/cvpcb/cvpcb_mainframe.cpp
+++ b/cvpcb/cvpcb_mainframe.cpp
@@ -39,7 +39,7 @@
 #include <tool/editor_conditions.h>
 #include <tool/tool_dispatcher.h>
 #include <tool/tool_manager.h>
-#include <widgets/progress_reporter.h>
+#include <widgets/wx_progress_reporters.h>
 #include <wx/statline.h>
 #include <wx/stattext.h>
 
diff --git a/eeschema/dialogs/dialog_erc.cpp b/eeschema/dialogs/dialog_erc.cpp
index 956d326ab2..735aee1ba5 100644
--- a/eeschema/dialogs/dialog_erc.cpp
+++ b/eeschema/dialogs/dialog_erc.cpp
@@ -54,7 +54,7 @@
 
 DIALOG_ERC::DIALOG_ERC( SCH_EDIT_FRAME* parent ) :
         DIALOG_ERC_BASE( parent ),
-        PROGRESS_REPORTER( 1 ),
+        PROGRESS_REPORTER_BASE( 1 ),
         m_parent( parent ),
         m_running( false ),
         m_ercRun( false ),
@@ -143,7 +143,7 @@ bool DIALOG_ERC::updateUI()
 void DIALOG_ERC::AdvancePhase( const wxString& aMessage )
 {
     // Will also call Report( aMessage ):
-    PROGRESS_REPORTER::AdvancePhase( aMessage );
+    PROGRESS_REPORTER_BASE::AdvancePhase( aMessage );
     SetCurrentProgress( 0.0 );
 }
 
diff --git a/eeschema/dialogs/dialog_erc.h b/eeschema/dialogs/dialog_erc.h
index a0160f6a08..47afc2b496 100644
--- a/eeschema/dialogs/dialog_erc.h
+++ b/eeschema/dialogs/dialog_erc.h
@@ -30,17 +30,17 @@
 #include <lib_pin.h>        // For PINTYPE_COUNT definition
 
 #include <dialog_erc_base.h>
-#include <widgets/progress_reporter.h>
+#include <widgets/progress_reporter_base.h>
 #include <erc_settings.h>
 
 
-class DIALOG_ERC : public DIALOG_ERC_BASE, PROGRESS_REPORTER
+class DIALOG_ERC : public DIALOG_ERC_BASE, PROGRESS_REPORTER_BASE
 {
 public:
     DIALOG_ERC( SCH_EDIT_FRAME* parent );
     ~DIALOG_ERC();
 
-    // PROGRESS_REPORTER calls
+    // PROGRESS_REPORTER_BASE calls
     bool updateUI() override;
     void AdvancePhase( const wxString& aMessage ) override;
     void Report( const wxString& aMessage ) override;
diff --git a/eeschema/files-io.cpp b/eeschema/files-io.cpp
index 5c12db06ff..d14ef4aca3 100644
--- a/eeschema/files-io.cpp
+++ b/eeschema/files-io.cpp
@@ -61,7 +61,7 @@
 #include <tools/ee_inspection_tool.h>
 #include <paths.h>
 #include <wx_filename.h>  // For ::ResolvePossibleSymlinks
-#include <widgets/progress_reporter.h>
+#include <widgets/wx_progress_reporters.h>
 
 bool SCH_EDIT_FRAME::SaveEEFile( SCH_SHEET* aSheet, bool aSaveUnderNewName )
 {
diff --git a/eeschema/sch_plugins/eagle/sch_eagle_plugin.cpp b/eeschema/sch_plugins/eagle/sch_eagle_plugin.cpp
index 22c0ee3d19..23f1ac837c 100644
--- a/eeschema/sch_plugins/eagle/sch_eagle_plugin.cpp
+++ b/eeschema/sch_plugins/eagle/sch_eagle_plugin.cpp
@@ -61,7 +61,7 @@
 #include <schematic.h>
 #include <symbol_lib_table.h>
 #include <wildcards_and_files_ext.h>
-#include <widgets/progress_reporter.h>
+#include <progress_reporter.h>
 
 
 // Eagle schematic axes are aligned with x increasing left to right and Y increasing bottom to top
diff --git a/eeschema/sch_plugins/kicad/sch_sexpr_parser.cpp b/eeschema/sch_plugins/kicad/sch_sexpr_parser.cpp
index c1aeadddf6..569d768d9f 100644
--- a/eeschema/sch_plugins/kicad/sch_sexpr_parser.cpp
+++ b/eeschema/sch_plugins/kicad/sch_sexpr_parser.cpp
@@ -55,7 +55,7 @@
 #include <sch_plugins/kicad/sch_sexpr_parser.h>
 #include <template_fieldnames.h>
 #include <trigo.h>
-#include <widgets/progress_reporter.h>
+#include <progress_reporter.h>
 
 
 using namespace TSCHEMATIC_T;
diff --git a/eeschema/sch_plugins/kicad/sch_sexpr_plugin.cpp b/eeschema/sch_plugins/kicad/sch_sexpr_plugin.cpp
index 8df05f1cc1..fcf9dd6ca3 100644
--- a/eeschema/sch_plugins/kicad/sch_sexpr_plugin.cpp
+++ b/eeschema/sch_plugins/kicad/sch_sexpr_plugin.cpp
@@ -61,7 +61,7 @@
 #include <ee_selection.h>
 #include <string_utils.h>
 #include <wx_filename.h>       // for ::ResolvePossibleSymlinks()
-#include <widgets/progress_reporter.h>
+#include <progress_reporter.h>
 
 
 using namespace TSCHEMATIC_T;
diff --git a/eeschema/sch_plugins/legacy/sch_legacy_plugin.cpp b/eeschema/sch_plugins/legacy/sch_legacy_plugin.cpp
index eea9fd08f6..45e4e6c590 100644
--- a/eeschema/sch_plugins/legacy/sch_legacy_plugin.cpp
+++ b/eeschema/sch_plugins/legacy/sch_legacy_plugin.cpp
@@ -39,7 +39,7 @@
 #include <richio.h>
 #include <trace_helpers.h>
 #include <trigo.h>
-#include <widgets/progress_reporter.h>
+#include <progress_reporter.h>
 #include <general.h>
 #include <sch_bitmap.h>
 #include <sch_bus_entry.h>
diff --git a/eeschema/symbol_async_loader.cpp b/eeschema/symbol_async_loader.cpp
index f8c5360cbf..2f1720d876 100644
--- a/eeschema/symbol_async_loader.cpp
+++ b/eeschema/symbol_async_loader.cpp
@@ -23,7 +23,7 @@
 #include <core/wx_stl_compat.h>
 #include <symbol_async_loader.h>
 #include <symbol_lib_table.h>
-#include <widgets/progress_reporter.h>
+#include <progress_reporter.h>
 
 
 SYMBOL_ASYNC_LOADER::SYMBOL_ASYNC_LOADER( const std::vector<wxString>& aNicknames,
diff --git a/eeschema/symbol_editor/symbol_edit_frame.cpp b/eeschema/symbol_editor/symbol_edit_frame.cpp
index cb102a535a..9bbf6ca70a 100644
--- a/eeschema/symbol_editor/symbol_edit_frame.cpp
+++ b/eeschema/symbol_editor/symbol_edit_frame.cpp
@@ -67,7 +67,7 @@
 #include <widgets/app_progress_dialog.h>
 #include <widgets/infobar.h>
 #include <widgets/lib_tree.h>
-#include <widgets/progress_reporter.h>
+#include <widgets/wx_progress_reporters.h>
 #include <widgets/symbol_tree_pane.h>
 #include <wildcards_and_files_ext.h>
 #include <panel_sym_lib_table.h>
diff --git a/eeschema/symbol_editor/symbol_library_manager.cpp b/eeschema/symbol_editor/symbol_library_manager.cpp
index 52a567299a..9690dcce39 100644
--- a/eeschema/symbol_editor/symbol_library_manager.cpp
+++ b/eeschema/symbol_editor/symbol_library_manager.cpp
@@ -35,7 +35,7 @@
 #include <sch_plugins/legacy/sch_legacy_plugin.h>
 #include <symbol_lib_table.h>
 #include <symbol_async_loader.h>
-#include <widgets/progress_reporter.h>
+#include <progress_reporter.h>
 #include <list>
 #include <locale_io.h>
 #include <wx/log.h>
diff --git a/eeschema/symbol_tree_model_adapter.cpp b/eeschema/symbol_tree_model_adapter.cpp
index 5876c8cb0c..5d47d124be 100644
--- a/eeschema/symbol_tree_model_adapter.cpp
+++ b/eeschema/symbol_tree_model_adapter.cpp
@@ -22,8 +22,7 @@
 #include <wx/log.h>
 #include <wx/tokenzr.h>
 #include <wx/window.h>
-#include <widgets/progress_reporter.h>
-
+#include <widgets/wx_progress_reporters.h>
 #include <dialogs/html_messagebox.h>
 #include <eda_pattern_match.h>
 #include <generate_alias_info.h>
diff --git a/gerbview/files.cpp b/gerbview/files.cpp
index 5f1b1e0b1d..0abac6ebd2 100644
--- a/gerbview/files.cpp
+++ b/gerbview/files.cpp
@@ -33,7 +33,7 @@
 #include <gerber_file_image_list.h>
 #include <excellon_image.h>
 #include <wildcards_and_files_ext.h>
-#include <widgets/progress_reporter.h>
+#include <widgets/wx_progress_reporters.h>
 #include "widgets/gerbview_layer_widget.h"
 
 // HTML Messages used more than one time:
diff --git a/include/progress_reporter.h b/include/progress_reporter.h
new file mode 100644
index 0000000000..73db3b4ab3
--- /dev/null
+++ b/include/progress_reporter.h
@@ -0,0 +1,112 @@
+/*
+ * This program source code file is part of KiCad, a free EDA CAD application.
+ *
+ * Copyright (C) 2017 CERN
+ * Copyright (C) 2021 KiCad Developers, see AUTHORS.txt for contributors.
+ *
+ * Author: Tomasz Wlostowski <tomasz.wlostowski@cern.ch>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, you may find one here:
+ * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
+ * or you may search the http://www.gnu.org website for the version 2 license,
+ * or you may write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+ */
+
+#ifndef PROGRESS_REPORTER_H
+#define PROGRESS_REPORTER_H
+
+/**
+ * A progress reporter interface for use in multi-threaded environments.  The various advancement
+ * and message methods can be called from sub-threads.  The KeepRefreshing method *MUST* be called
+ * only from the main thread (primarily a MSW requirement, which won't allow access to UI objects
+ * allocated from a separate thread).
+ */
+class PROGRESS_REPORTER
+{
+public:
+
+    PROGRESS_REPORTER()
+    { }
+
+    PROGRESS_REPORTER( const PROGRESS_REPORTER& ) = delete;
+
+    virtual ~PROGRESS_REPORTER()
+    { }
+
+    /**
+     * Set the number of phases.
+     */
+    virtual void SetNumPhases( int aNumPhases ) = 0;
+    virtual void AddPhases( int aNumPhases ) = 0;
+
+    /**
+     * Initialize the \a aPhase virtual zone of the dialog progress bar.
+     */
+    virtual void BeginPhase( int aPhase ) = 0;
+
+    /**
+     * Use the next available virtual zone of the dialog progress bar.
+     */
+    virtual void AdvancePhase() = 0;
+
+    /**
+     * Use the next available virtual zone of the dialog progress bar and updates the message.
+     */
+    virtual void AdvancePhase( const wxString& aMessage ) = 0;
+
+    /**
+     * Display \a aMessage in the progress bar dialog.
+     */
+    virtual void Report( const wxString& aMessage ) = 0;
+
+    /**
+     * Set the progress value to aProgress (0..1).
+     */
+    virtual void SetCurrentProgress( double aProgress ) = 0;
+
+    /**
+     * Fix the value that gives the 100 percent progress bar length
+     * (inside the current virtual zone).
+     */
+    virtual void SetMaxProgress( int aMaxProgress ) = 0;
+
+    /**
+     * Increment the progress bar length (inside the current virtual zone).
+     */
+    virtual void AdvanceProgress() = 0;
+
+    /**
+     * Update the UI (if any).
+     *
+     * @warning This should  only be called from the main thread.
+     *
+     * @return false if the user cancelled.
+     */
+    virtual bool KeepRefreshing( bool aWait = false ) = 0;
+
+    /**
+     * Change the title displayed on the window caption.
+     *
+     * Has meaning only for some reporters.  Does nothing for others.
+     *
+     * @warning This should only be called from the main thread.
+     */
+    virtual void SetTitle( const wxString& aTitle ) = 0;
+
+    virtual bool IsCancelled() const = 0;
+};
+
+
+#endif
diff --git a/include/widgets/progress_reporter.h b/include/widgets/progress_reporter.h
deleted file mode 100644
index 0e993c8492..0000000000
--- a/include/widgets/progress_reporter.h
+++ /dev/null
@@ -1,198 +0,0 @@
-/*
- * This program source code file is part of KiCad, a free EDA CAD application.
- *
- * Copyright (C) 2017 CERN
- * Copyright (C) 2021 KiCad Developers, see AUTHORS.txt for contributors.
- *
- * Author: Tomasz Wlostowski <tomasz.wlostowski@cern.ch>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, you may find one here:
- * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
- * or you may search the http://www.gnu.org website for the version 2 license,
- * or you may write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
- */
-
-#ifndef __PROGRESS_REPORTER
-#define __PROGRESS_REPORTER
-
-#include <mutex>
-#include <atomic>
-
-#include <wx/progdlg.h>
-#include <wx/gauge.h>
-#if wxCHECK_VERSION( 3, 1, 0 )
-#include <wx/appprogress.h>
-#endif
-
-/**
- * A progress reporter for use in multi-threaded environments.  The various advancement
- * and message methods can be called from sub-threads.  The KeepRefreshing method *MUST*
- * be called only from the main thread (primarily a MSW requirement, which won't allow
- * access to UI objects allocated from a separate thread).
- */
-class PROGRESS_REPORTER
-{
-public:
-
-    PROGRESS_REPORTER( int aNumPhases );
-    PROGRESS_REPORTER( const PROGRESS_REPORTER& ) = delete;
-
-    virtual ~PROGRESS_REPORTER()
-    {
-    }
-
-    /**
-     * Set the number of phases.
-     */
-    void SetNumPhases( int aNumPhases );
-    void AddPhases( int aNumPhases );
-
-    /**
-     * Initialize the \a aPhase virtual zone of the dialog progress bar.
-     */
-    virtual void BeginPhase( int aPhase );
-
-    /**
-     * Use the next available virtual zone of the dialog progress bar.
-     */
-    virtual void AdvancePhase();
-
-    /**
-     * Use the next available virtual zone of the dialog progress bar and updates
-     * the message.
-     */
-    virtual void AdvancePhase( const wxString& aMessage );
-
-    /**
-     * Display \a aMessage in the progress bar dialog.
-     */
-    virtual void Report( const wxString& aMessage );
-
-    /**
-     * Set the progress value to aProgress (0..1).
-     */
-    virtual void SetCurrentProgress( double aProgress );
-
-    /**
-     * Fix the value that gives the 100 percent progress bar length
-     * (inside the current virtual zone).
-     */
-    void SetMaxProgress( int aMaxProgress );
-
-    /**
-     * Increment the progress bar length (inside the current virtual zone).
-     */
-    void AdvanceProgress();
-
-    /**
-     * Update the UI dialog.
-     *
-     * @warning This should  only be called from the main thread.
-     *
-     * @return false if the user clicked Cancel.
-     */
-    bool KeepRefreshing( bool aWait = false );
-
-    /**
-     * Change the title displayed on the window caption.
-     *
-     * Has meaning only for some reporters.  Does nothing for others.
-     *
-     * @warning This should only be called from the main thread.
-     */
-    virtual void SetTitle( const wxString& aTitle ) {}
-
-    bool IsCancelled() const { return m_cancelled.load(); }
-
-protected:
-
-    int currentProgress() const;
-
-    virtual bool updateUI() = 0;
-
-    wxString           m_rptMessage;
-    bool               m_msgChanged;    // true after change in m_rptMessage
-                                        // the dialog needs perhaps a resize
-    mutable std::mutex m_mutex;
-    std::atomic_int    m_phase;
-    std::atomic_int    m_numPhases;
-    std::atomic_int    m_progress;
-    std::atomic_int    m_maxProgress;
-    std::atomic_bool   m_cancelled;
-};
-
-/**
-* Multi-thread safe progress reporter dialog, intended for use of tasks that parallel reporting
-* back of work status.
-*
-* @see PROGRESS_REPORTER.
-*/
-class WX_PROGRESS_REPORTER : public PROGRESS_REPORTER, public wxProgressDialog
-{
-public:
-    /**
-     * The #PROGRESS_REPORTER will stay on top of \a aParent.
-     *
-     * The style is wxPD_AUTO_HIDE | wxPD_CAN_ABORT | wxPD_ELAPSED_TIME.
-     *
-     * @param aParent is the wxDialog of Frame that manage this.
-     * @param aTitle is the dialog progress title
-     * @param aNumPhases is the number of "virtual sections" of the progress bar
-     *   aNumPhases = 1 is the usual progress bar
-     *   aNumPhases = n creates n virtual progress bar zones: a 0 to 100 percent width
-     *   of a virtual zone fills 0 to 1/n progress bar full size of the nth virtual zone index
-     * @param aCanAbort is true if the abort button should be shown
-     * @param aReserveSpaceForMessage will ensure that the dialog is laid out for status messages,
-     *        preventing layout issues on Windows when reporting a message after the initial layout
-     */
-    WX_PROGRESS_REPORTER( wxWindow* aParent, const wxString& aTitle, int aNumPhases,
-                          bool aCanAbort = true, bool aReserveSpaceForMessage = true );
-    ~WX_PROGRESS_REPORTER();
-
-    /**
-     * Change the title displayed on the window caption.
-     */
-    virtual void SetTitle( const wxString& aTitle ) override
-    {
-        wxProgressDialog::SetTitle( aTitle );
-    }
-
-private:
-#if wxCHECK_VERSION( 3, 1, 0 )
-    wxAppProgressIndicator m_appProgressIndicator;
-#endif
-
-    virtual bool updateUI() override;
-};
-
-
-class GAUGE_PROGRESS_REPORTER : public PROGRESS_REPORTER, public wxGauge
-{
-public:
-    /**
-     * @param aParent is the parent of the wxGauge control
-     * @param aNumPhases is the number of "virtual sections" of the progress bar
-     *   aNumPhases = 1 is the usual progress bar
-     *   aNumPhases = n creates n virtual progress bar zones: a 0 to 100 percent width
-     *   of a virtual zone fills 0 to 1/n progress bar full size of the nth virtual zone index
-     */
-    GAUGE_PROGRESS_REPORTER( wxWindow* aParent, int aNumPhases );
-
-private:
-
-    bool updateUI() override;
-};
-
-#endif
diff --git a/include/widgets/wx_progress_reporters.h b/include/widgets/wx_progress_reporters.h
new file mode 100644
index 0000000000..074347a687
--- /dev/null
+++ b/include/widgets/wx_progress_reporters.h
@@ -0,0 +1,99 @@
+/*
+ * This program source code file is part of KiCad, a free EDA CAD application.
+ *
+ * Copyright (C) 2017 CERN
+ * Copyright (C) 2021 KiCad Developers, see AUTHORS.txt for contributors.
+ *
+ * Author: Tomasz Wlostowski <tomasz.wlostowski@cern.ch>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, you may find one here:
+ * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
+ * or you may search the http://www.gnu.org website for the version 2 license,
+ * or you may write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+ */
+
+#ifndef WX_PROGRESS_REPORTERS_H
+#define WX_PROGRESS_REPORTERS_H
+
+#include <wx/progdlg.h>
+#include <wx/gauge.h>
+#if wxCHECK_VERSION( 3, 1, 0 )
+#include <wx/appprogress.h>
+#endif
+
+#include <widgets/progress_reporter_base.h>
+
+/**
+ * Multi-thread safe progress reporter dialog, intended for use of tasks that parallel reporting
+ * back of work status.
+ *
+ * @see PROGRESS_REPORTER.
+ */
+class WX_PROGRESS_REPORTER : public PROGRESS_REPORTER_BASE, public wxProgressDialog
+{
+public:
+    /**
+     * The #PROGRESS_REPORTER will stay on top of \a aParent.
+     *
+     * The style is wxPD_AUTO_HIDE | wxPD_CAN_ABORT | wxPD_ELAPSED_TIME.
+     *
+     * @param aParent is the wxDialog of Frame that manage this.
+     * @param aTitle is the dialog progress title
+     * @param aNumPhases is the number of "virtual sections" of the progress bar
+     *   aNumPhases = 1 is the usual progress bar
+     *   aNumPhases = n creates n virtual progress bar zones: a 0 to 100 percent width
+     *   of a virtual zone fills 0 to 1/n progress bar full size of the nth virtual zone index
+     * @param aCanAbort is true if the abort button should be shown
+     * @param aReserveSpaceForMessage will ensure that the dialog is laid out for status messages,
+     *        preventing layout issues on Windows when reporting a message after the initial layout
+     */
+    WX_PROGRESS_REPORTER( wxWindow* aParent, const wxString& aTitle, int aNumPhases,
+                          bool aCanAbort = true, bool aReserveSpaceForMessage = true );
+    ~WX_PROGRESS_REPORTER();
+
+    /**
+     * Change the title displayed on the window caption.
+     */
+    void SetTitle( const wxString& aTitle ) override
+    {
+        wxProgressDialog::SetTitle( aTitle );
+    }
+
+private:
+#if wxCHECK_VERSION( 3, 1, 0 )
+    wxAppProgressIndicator m_appProgressIndicator;
+#endif
+
+    bool updateUI() override;
+};
+
+
+class GAUGE_PROGRESS_REPORTER : public PROGRESS_REPORTER_BASE, public wxGauge
+{
+public:
+    /**
+     * @param aParent is the parent of the wxGauge control
+     * @param aNumPhases is the number of "virtual sections" of the progress bar
+     *   aNumPhases = 1 is the usual progress bar
+     *   aNumPhases = n creates n virtual progress bar zones: a 0 to 100 percent width
+     *   of a virtual zone fills 0 to 1/n progress bar full size of the nth virtual zone index
+     */
+    GAUGE_PROGRESS_REPORTER( wxWindow* aParent, int aNumPhases );
+
+private:
+    bool updateUI() override;
+};
+
+#endif
diff --git a/pagelayout_editor/tools/pl_point_editor.cpp b/pagelayout_editor/tools/pl_point_editor.cpp
index 4e9fdd1be9..83a08d3f7a 100644
--- a/pagelayout_editor/tools/pl_point_editor.cpp
+++ b/pagelayout_editor/tools/pl_point_editor.cpp
@@ -36,7 +36,7 @@ using namespace std::placeholders;
 #include <status_popup.h>
 #include <drawing_sheet/ds_draw_item.h>
 #include <drawing_sheet/ds_data_item.h>
-#include <widgets/progress_reporter.h>
+#include <progress_reporter.h>
 
 #include "pl_editor_frame.h"
 #include "pl_editor_id.h"
diff --git a/pcbnew/autorouter/ar_autoplacer.cpp b/pcbnew/autorouter/ar_autoplacer.cpp
index d86917d378..9c8b9fcbb9 100644
--- a/pcbnew/autorouter/ar_autoplacer.cpp
+++ b/pcbnew/autorouter/ar_autoplacer.cpp
@@ -35,7 +35,7 @@
 #include <pad.h>
 #include <board_commit.h>
 #include <connectivity/connectivity_data.h>
-#include <widgets/progress_reporter.h>
+#include <progress_reporter.h>
 
 #include "ar_autoplacer.h"
 #include "ar_matrix.h"
diff --git a/pcbnew/autorouter/autoplace_tool.cpp b/pcbnew/autorouter/autoplace_tool.cpp
index 55d86cf418..6dc07338d5 100644
--- a/pcbnew/autorouter/autoplace_tool.cpp
+++ b/pcbnew/autorouter/autoplace_tool.cpp
@@ -25,7 +25,7 @@
 #include <board_commit.h>
 #include <tools/pcb_actions.h>
 #include <widgets/infobar.h>
-#include <widgets/progress_reporter.h>
+#include <widgets/wx_progress_reporters.h>
 
 #include "ar_autoplacer.h"
 #include "autoplace_tool.h"
diff --git a/pcbnew/connectivity/connectivity_algo.cpp b/pcbnew/connectivity/connectivity_algo.cpp
index f0d80e79da..5325ef51db 100644
--- a/pcbnew/connectivity/connectivity_algo.cpp
+++ b/pcbnew/connectivity/connectivity_algo.cpp
@@ -25,7 +25,7 @@
  */
 
 #include <connectivity/connectivity_algo.h>
-#include <widgets/progress_reporter.h>
+#include <progress_reporter.h>
 #include <geometry/geometry_utils.h>
 #include <board_commit.h>
 
diff --git a/pcbnew/dialogs/dialog_board_setup.cpp b/pcbnew/dialogs/dialog_board_setup.cpp
index f4b159646e..aaf822cc6d 100644
--- a/pcbnew/dialogs/dialog_board_setup.cpp
+++ b/pcbnew/dialogs/dialog_board_setup.cpp
@@ -38,7 +38,7 @@
 #include <settings/settings_manager.h>
 #include <widgets/infobar.h>
 #include <widgets/resettable_panel.h>
-#include <widgets/progress_reporter.h>
+#include <widgets/wx_progress_reporters.h>
 #include <wildcards_and_files_ext.h>
 
 #include "dialog_board_setup.h"
diff --git a/pcbnew/dialogs/dialog_drc.cpp b/pcbnew/dialogs/dialog_drc.cpp
index ed781982de..316bcc21f3 100644
--- a/pcbnew/dialogs/dialog_drc.cpp
+++ b/pcbnew/dialogs/dialog_drc.cpp
@@ -39,7 +39,7 @@
 #include <wx/wupdlock.h>
 #include <widgets/appearance_controls.h>
 #include <widgets/ui_common.h>
-#include <widgets/progress_reporter.h>
+#include <widgets/progress_reporter_base.h>
 #include <dialogs/wx_html_report_box.h>
 #include <dialogs/panel_setup_rules_base.h>
 #include <tools/drc_tool.h>
@@ -49,7 +49,7 @@
 
 DIALOG_DRC::DIALOG_DRC( PCB_EDIT_FRAME* aEditorFrame, wxWindow* aParent ) :
         DIALOG_DRC_BASE( aParent ),
-        PROGRESS_REPORTER( 1 ),
+        PROGRESS_REPORTER_BASE( 1 ),
         m_running( false ),
         m_cancelled( false ),
         m_drcRun( false ),
@@ -167,7 +167,7 @@ bool DIALOG_DRC::updateUI()
 
 void DIALOG_DRC::AdvancePhase( const wxString& aMessage )
 {
-    PROGRESS_REPORTER::AdvancePhase( aMessage );
+    PROGRESS_REPORTER_BASE::AdvancePhase( aMessage );
     SetCurrentProgress( 0.0 );
 
     m_messages->Report( aMessage );
diff --git a/pcbnew/dialogs/dialog_drc.h b/pcbnew/dialogs/dialog_drc.h
index 729716e888..75f09fb843 100644
--- a/pcbnew/dialogs/dialog_drc.h
+++ b/pcbnew/dialogs/dialog_drc.h
@@ -32,7 +32,7 @@
 #include <pcb_marker.h>
 #include <board.h>
 #include <dialog_drc_base.h>
-#include <widgets/progress_reporter.h>
+#include <widgets/progress_reporter_base.h>
 
 
 class BOARD_DESIGN_SETTINGS;
@@ -41,7 +41,7 @@ class BOARD_DESIGN_SETTINGS;
 #define DIALOG_DRC_WINDOW_NAME "DialogDrcWindowName"
 
 class
-DIALOG_DRC: public DIALOG_DRC_BASE, PROGRESS_REPORTER
+DIALOG_DRC: public DIALOG_DRC_BASE, PROGRESS_REPORTER_BASE
 {
 public:
     /// Constructors
diff --git a/pcbnew/drc/drc_engine.cpp b/pcbnew/drc/drc_engine.cpp
index c029c727bb..d219838f89 100644
--- a/pcbnew/drc/drc_engine.cpp
+++ b/pcbnew/drc/drc_engine.cpp
@@ -24,7 +24,7 @@
  */
 
 #include <reporter.h>
-#include <widgets/progress_reporter.h>
+#include <progress_reporter.h>
 #include <string_utils.h>
 #include <board_design_settings.h>
 #include <drc/drc_engine.h>
diff --git a/pcbnew/edit_zone_helpers.cpp b/pcbnew/edit_zone_helpers.cpp
index c197356309..ab9c472cc8 100644
--- a/pcbnew/edit_zone_helpers.cpp
+++ b/pcbnew/edit_zone_helpers.cpp
@@ -33,7 +33,7 @@
 #include <zones.h>
 #include <zones_functions_for_undo_redo.h>
 #include <connectivity/connectivity_data.h>
-#include <widgets/progress_reporter.h>
+#include <widgets/wx_progress_reporters.h>
 #include <zone_filler.h>
 
 
@@ -136,7 +136,10 @@ void PCB_EDIT_FRAME::Edit_Zone_Params( ZONE* aZone )
             ZONE_FILLER filler( GetBoard(), &commit );
             wxString    title = wxString::Format( _( "Refill %d Zones" ),
                                                   (int) zones_to_refill.size() );
-            filler.InstallNewProgressReporter( this, title, 4 );
+
+            std::unique_ptr<WX_PROGRESS_REPORTER> reporter;
+            reporter = std::make_unique<WX_PROGRESS_REPORTER>( this, title, 4 );
+            filler.SetProgressReporter( reporter.get() );
 
             if( !filler.Fill( zones_to_refill ) )
             {
diff --git a/pcbnew/files.cpp b/pcbnew/files.cpp
index 20d701ebae..a88141d8dd 100644
--- a/pcbnew/files.cpp
+++ b/pcbnew/files.cpp
@@ -47,7 +47,7 @@
 #include <kiplatform/app.h>
 #include <widgets/appearance_controls.h>
 #include <widgets/infobar.h>
-#include <widgets/progress_reporter.h>
+#include <widgets/wx_progress_reporters.h>
 #include <settings/settings_manager.h>
 #include <paths.h>
 #include <project/project_file.h>
diff --git a/pcbnew/footprint_edit_frame.cpp b/pcbnew/footprint_edit_frame.cpp
index e77d59daac..4a6b2ec89e 100644
--- a/pcbnew/footprint_edit_frame.cpp
+++ b/pcbnew/footprint_edit_frame.cpp
@@ -75,7 +75,7 @@
 #include <widgets/lib_tree.h>
 #include <widgets/paged_dialog.h>
 #include <widgets/panel_selection_filter.h>
-#include <widgets/progress_reporter.h>
+#include <widgets/wx_progress_reporters.h>
 #include <wildcards_and_files_ext.h>
 #include <wx/filedlg.h>
 #include <wx/treebook.h>
diff --git a/pcbnew/footprint_info_impl.cpp b/pcbnew/footprint_info_impl.cpp
index e4e6b317ce..f3e9fef433 100644
--- a/pcbnew/footprint_info_impl.cpp
+++ b/pcbnew/footprint_info_impl.cpp
@@ -31,7 +31,7 @@
 #include <kiway.h>
 #include <lib_id.h>
 #include <wildcards_and_files_ext.h>
-#include <widgets/progress_reporter.h>
+#include <progress_reporter.h>
 #include <wx/textfile.h>
 #include <wx/txtstrm.h>
 #include <wx/wfstream.h>
diff --git a/pcbnew/load_select_footprint.cpp b/pcbnew/load_select_footprint.cpp
index 10868cfc73..d893c1d729 100644
--- a/pcbnew/load_select_footprint.cpp
+++ b/pcbnew/load_select_footprint.cpp
@@ -47,7 +47,7 @@ using namespace std::placeholders;
 #include <pcbnew_settings.h>
 #include <view/view_controls.h>
 #include <widgets/lib_tree.h>
-#include <widgets/progress_reporter.h>
+#include <widgets/wx_progress_reporters.h>
 #include <dialog_pad_properties.h>
 
 #include "fp_tree_model_adapter.h"
diff --git a/pcbnew/plugins/altium/altium_pcb.cpp b/pcbnew/plugins/altium/altium_pcb.cpp
index c9c7045d7b..69961b54bc 100644
--- a/pcbnew/plugins/altium/altium_pcb.cpp
+++ b/pcbnew/plugins/altium/altium_pcb.cpp
@@ -52,7 +52,7 @@
 #include <wx/mstream.h>
 #include <wx/wfstream.h>
 #include <wx/zstream.h>
-#include <widgets/progress_reporter.h>
+#include <progress_reporter.h>
 
 
 void ParseAltiumPcb( BOARD* aBoard, const wxString& aFileName, PROGRESS_REPORTER* aProgressReporter,
diff --git a/pcbnew/plugins/eagle/eagle_plugin.cpp b/pcbnew/plugins/eagle/eagle_plugin.cpp
index 4eda9535be..5b7693a0d7 100644
--- a/pcbnew/plugins/eagle/eagle_plugin.cpp
+++ b/pcbnew/plugins/eagle/eagle_plugin.cpp
@@ -67,7 +67,7 @@ Load() TODO's
 #include <properties.h>
 #include <trigo.h>
 #include <math/util.h>      // for KiROUND
-#include <widgets/progress_reporter.h>
+#include <progress_reporter.h>
 
 #include <board.h>
 #include <board_design_settings.h>
diff --git a/pcbnew/plugins/fabmaster/fabmaster_plugin.cpp b/pcbnew/plugins/fabmaster/fabmaster_plugin.cpp
index d6e425acef..98ec115ab5 100644
--- a/pcbnew/plugins/fabmaster/fabmaster_plugin.cpp
+++ b/pcbnew/plugins/fabmaster/fabmaster_plugin.cpp
@@ -29,7 +29,7 @@
 
 #include "fabmaster_plugin.h"
 #include <board.h>
-#include <widgets/progress_reporter.h>
+#include <progress_reporter.h>
 #include <common.h>
 #include <macros.h>
 
diff --git a/pcbnew/plugins/fabmaster/import_fabmaster.cpp b/pcbnew/plugins/fabmaster/import_fabmaster.cpp
index a4695a8ea8..0507e1b968 100644
--- a/pcbnew/plugins/fabmaster/import_fabmaster.cpp
+++ b/pcbnew/plugins/fabmaster/import_fabmaster.cpp
@@ -53,7 +53,7 @@
 #include <common.h>
 #include <geometry/shape_arc.h>
 #include <string_utils.h>
-#include <widgets/progress_reporter.h>
+#include <progress_reporter.h>
 #include <math/util.h>
 #include <wx/filename.h>
 
diff --git a/pcbnew/plugins/kicad/kicad_plugin.cpp b/pcbnew/plugins/kicad/kicad_plugin.cpp
index 03c8e275be..946f895a8c 100644
--- a/pcbnew/plugins/kicad/kicad_plugin.cpp
+++ b/pcbnew/plugins/kicad/kicad_plugin.cpp
@@ -47,7 +47,7 @@
 #include <plugins/kicad/pcb_parser.h>
 #include <trace_helpers.h>
 #include <pcb_track.h>
-#include <widgets/progress_reporter.h>
+#include <progress_reporter.h>
 #include <wildcards_and_files_ext.h>
 #include <wx/dir.h>
 #include <wx/log.h>
diff --git a/pcbnew/plugins/kicad/pcb_parser.cpp b/pcbnew/plugins/kicad/pcb_parser.cpp
index e35132fa21..a112f708ca 100644
--- a/pcbnew/plugins/kicad/pcb_parser.cpp
+++ b/pcbnew/plugins/kicad/pcb_parser.cpp
@@ -57,7 +57,7 @@
 #include <math/util.h>                           // KiROUND, Clamp
 #include <string_utils.h>
 #include <wx/log.h>
-#include <widgets/progress_reporter.h>
+#include <progress_reporter.h>
 
 using namespace PCB_KEYS_T;
 
diff --git a/pcbnew/plugins/legacy/legacy_plugin.cpp b/pcbnew/plugins/legacy/legacy_plugin.cpp
index 0ad9a8f86a..5093bbcc03 100644
--- a/pcbnew/plugins/legacy/legacy_plugin.cpp
+++ b/pcbnew/plugins/legacy/legacy_plugin.cpp
@@ -88,7 +88,7 @@
 #include <trigo.h>
 #include <confirm.h>
 #include <math/util.h>      // for KiROUND
-#include <widgets/progress_reporter.h>
+#include <progress_reporter.h>
 
 typedef LEGACY_PLUGIN::BIU      BIU;
 
diff --git a/pcbnew/tools/drc_tool.cpp b/pcbnew/tools/drc_tool.cpp
index ce083b09f5..b6b46a86f6 100644
--- a/pcbnew/tools/drc_tool.cpp
+++ b/pcbnew/tools/drc_tool.cpp
@@ -32,7 +32,7 @@
 #include <dialog_drc.h>
 #include <board_commit.h>
 #include <board_design_settings.h>
-#include <widgets/progress_reporter.h>
+#include <progress_reporter.h>
 #include <drc/drc_engine.h>
 #include <drc/drc_results_provider.h>
 #include <netlist_reader/pcb_netlist.h>
diff --git a/pcbnew/tools/pcb_control.cpp b/pcbnew/tools/pcb_control.cpp
index 948e944ade..d6c1020d76 100644
--- a/pcbnew/tools/pcb_control.cpp
+++ b/pcbnew/tools/pcb_control.cpp
@@ -55,7 +55,7 @@
 #include <tool/tool_manager.h>
 #include <footprint_viewer_frame.h>
 #include <footprint_edit_frame.h>
-#include <widgets/progress_reporter.h>
+#include <widgets/wx_progress_reporters.h>
 #include <widgets/infobar.h>
 #include <wx/hyperlink.h>
 
diff --git a/pcbnew/tools/pcb_point_editor.cpp b/pcbnew/tools/pcb_point_editor.cpp
index b880c7e296..09e900f3e5 100644
--- a/pcbnew/tools/pcb_point_editor.cpp
+++ b/pcbnew/tools/pcb_point_editor.cpp
@@ -45,7 +45,7 @@ using namespace std::placeholders;
 #include <pad.h>
 #include <zone.h>
 #include <connectivity/connectivity_data.h>
-#include <widgets/progress_reporter.h>
+#include <progress_reporter.h>
 
 
 // Few constants to avoid using bare numbers for point indices
diff --git a/pcbnew/tools/zone_filler_tool.cpp b/pcbnew/tools/zone_filler_tool.cpp
index 3be0e99d64..8e6ef6fe4e 100644
--- a/pcbnew/tools/zone_filler_tool.cpp
+++ b/pcbnew/tools/zone_filler_tool.cpp
@@ -28,8 +28,9 @@
 #include <connectivity/connectivity_data.h>
 #include <board_commit.h>
 #include <board_design_settings.h>
-#include <widgets/progress_reporter.h>
+#include <progress_reporter.h>
 #include <widgets/infobar.h>
+#include <widgets/wx_progress_reporters.h>
 #include <wx/event.h>
 #include <wx/hyperlink.h>
 #include <tool/tool_manager.h>
@@ -67,14 +68,19 @@ void ZONE_FILLER_TOOL::CheckAllZones( wxWindow* aCaller, PROGRESS_REPORTER* aRep
     for( ZONE* zone : board()->Zones() )
         toFill.push_back(zone);
 
-    BOARD_COMMIT commit( this );
-
-    ZONE_FILLER filler( frame()->GetBoard(), &commit );
+    BOARD_COMMIT                          commit( this );
+    std::unique_ptr<WX_PROGRESS_REPORTER> reporter;
+    ZONE_FILLER                           filler( frame()->GetBoard(), &commit );
 
     if( aReporter )
+    {
         filler.SetProgressReporter( aReporter );
+    }
     else
-        filler.InstallNewProgressReporter( aCaller, _( "Checking Zones" ), 4 );
+    {
+        reporter = std::make_unique<WX_PROGRESS_REPORTER>( aCaller, _( "Checking Zones" ), 4 );
+        filler.SetProgressReporter( reporter.get() );
+    }
 
     std::lock_guard<KISPINLOCK> lock( board()->GetConnectivity()->GetLock() );
 
@@ -103,7 +109,6 @@ void ZONE_FILLER_TOOL::singleShotRefocus( wxIdleEvent& )
 void ZONE_FILLER_TOOL::FillAllZones( wxWindow* aCaller, PROGRESS_REPORTER* aReporter )
 {
     PCB_EDIT_FRAME*    frame = getEditFrame<PCB_EDIT_FRAME>();
-    BOARD_COMMIT       commit( this );
     std::vector<ZONE*> toFill;
 
     if( m_fillInProgress )
@@ -116,7 +121,9 @@ void ZONE_FILLER_TOOL::FillAllZones( wxWindow* aCaller, PROGRESS_REPORTER* aRepo
 
     board()->IncrementTimeStamp();    // Clear caches
 
-    ZONE_FILLER filler( board(), &commit );
+    BOARD_COMMIT                          commit( this );
+    std::unique_ptr<WX_PROGRESS_REPORTER> reporter;
+    ZONE_FILLER                           filler( board(), &commit );
 
     if( !board()->GetDesignSettings().m_DRCEngine->RulesValid() )
     {
@@ -139,9 +146,14 @@ void ZONE_FILLER_TOOL::FillAllZones( wxWindow* aCaller, PROGRESS_REPORTER* aRepo
     }
 
     if( aReporter )
+    {
         filler.SetProgressReporter( aReporter );
+    }
     else
-        filler.InstallNewProgressReporter( aCaller, _( "Fill All Zones" ), 3 );
+    {
+        reporter = std::make_unique<WX_PROGRESS_REPORTER>( aCaller, _( "Fill All Zones" ), 3 );
+        filler.SetProgressReporter( reporter.get() );
+    }
 
     std::lock_guard<KISPINLOCK> lock( board()->GetConnectivity()->GetLock() );
 
@@ -179,8 +191,6 @@ int ZONE_FILLER_TOOL::ZoneFill( const TOOL_EVENT& aEvent )
 
     std::vector<ZONE*> toFill;
 
-    BOARD_COMMIT commit( this );
-
     if( ZONE* passedZone = aEvent.Parameter<ZONE*>() )
     {
         toFill.push_back( passedZone );
@@ -194,8 +204,12 @@ int ZONE_FILLER_TOOL::ZoneFill( const TOOL_EVENT& aEvent )
         }
     }
 
-    ZONE_FILLER filler( board(), &commit );
-    filler.InstallNewProgressReporter( frame(), _( "Fill Zone" ), 4 );
+    BOARD_COMMIT                          commit( this );
+    std::unique_ptr<WX_PROGRESS_REPORTER> reporter;
+    ZONE_FILLER                           filler( board(), &commit );
+
+    reporter = std::make_unique<WX_PROGRESS_REPORTER>( frame(), _( "Fill Zone" ), 4 );
+    filler.SetProgressReporter( reporter.get() );
 
     std::lock_guard<KISPINLOCK> lock( board()->GetConnectivity()->GetLock() );
 
diff --git a/pcbnew/zone_filler.cpp b/pcbnew/zone_filler.cpp
index 44cfc07d55..a09925da56 100644
--- a/pcbnew/zone_filler.cpp
+++ b/pcbnew/zone_filler.cpp
@@ -39,7 +39,7 @@
 #include <connectivity/connectivity_data.h>
 #include <convert_basic_shapes_to_polygon.h>
 #include <board_commit.h>
-#include <widgets/progress_reporter.h>
+#include <progress_reporter.h>
 #include <geometry/shape_poly_set.h>
 #include <geometry/convex_hull.h>
 #include <geometry/geometry_utils.h>
@@ -69,14 +69,6 @@ ZONE_FILLER::~ZONE_FILLER()
 }
 
 
-void ZONE_FILLER::InstallNewProgressReporter( wxWindow* aParent, const wxString& aTitle,
-                                              int aNumPhases )
-{
-    m_uniqueReporter = std::make_unique<WX_PROGRESS_REPORTER>( aParent, aTitle, aNumPhases );
-    SetProgressReporter( m_uniqueReporter.get() );
-}
-
-
 void ZONE_FILLER::SetProgressReporter( PROGRESS_REPORTER* aReporter )
 {
     m_progressReporter = aReporter;
diff --git a/pcbnew/zone_filler.h b/pcbnew/zone_filler.h
index 174396e326..3683126e0f 100644
--- a/pcbnew/zone_filler.h
+++ b/pcbnew/zone_filler.h
@@ -23,13 +23,13 @@
  * 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
  */
 
-#ifndef __ZONE_FILLER_H
-#define __ZONE_FILLER_H
+#ifndef ZONE_FILLER_H
+#define ZONE_FILLER_H
 
 #include <vector>
 #include <zone.h>
 
-class WX_PROGRESS_REPORTER;
+class PROGRESS_REPORTER;
 class BOARD;
 class COMMIT;
 class SHAPE_POLY_SET;
@@ -43,7 +43,6 @@ public:
     ~ZONE_FILLER();
 
     void SetProgressReporter( PROGRESS_REPORTER* aReporter );
-    void InstallNewProgressReporter( wxWindow* aParent, const wxString& aTitle, int aNumPhases );
 
     /**
      * Fills the given list of zones.  Invalidates connectivity - it is up to the caller to obtain
@@ -127,8 +126,6 @@ private:
     COMMIT*               m_commit;
     PROGRESS_REPORTER*    m_progressReporter;
 
-    std::unique_ptr<WX_PROGRESS_REPORTER> m_uniqueReporter;
-
     int                   m_maxError;
     int                   m_worstClearance;
 
diff --git a/qa/drc_proto/drc_proto.cpp b/qa/drc_proto/drc_proto.cpp
index 0db2eff6c6..2e9ff08a98 100644
--- a/qa/drc_proto/drc_proto.cpp
+++ b/qa/drc_proto/drc_proto.cpp
@@ -44,7 +44,7 @@
 #include <connectivity/connectivity_algo.h>
 
 #include <reporter.h>
-#include <widgets/progress_reporter.h>
+#include <widgets/progress_reporter_base.h>
 
 #include <project.h>
 #include <settings/settings_manager.h>
diff --git a/qa/drc_proto/drc_proto.h b/qa/drc_proto/drc_proto.h
index fe9701193c..67b30d75d2 100644
--- a/qa/drc_proto/drc_proto.h
+++ b/qa/drc_proto/drc_proto.h
@@ -26,7 +26,7 @@
 
 #include <string>
 
-#include <widgets/progress_reporter.h>
+#include <widgets/progress_reporter_base.h>
 #include <reporter.h>
 #include <core/optional.h>
 #include <netlist_reader/pcb_netlist.h>
@@ -94,11 +94,11 @@ private:
     std::mutex m_lock;
 };
 
-class CONSOLE_PROGRESS_REPORTER : public PROGRESS_REPORTER
+class CONSOLE_PROGRESS_REPORTER : public PROGRESS_REPORTER_BASE
 {
 public:
     CONSOLE_PROGRESS_REPORTER( CONSOLE_LOG* log ) :
-        PROGRESS_REPORTER( 0 ),
+        PROGRESS_REPORTER_BASE( 0 ),
         m_log( log ) {};
     ~CONSOLE_PROGRESS_REPORTER() {};