diff --git a/src/PrusaSlicer.cpp b/src/PrusaSlicer.cpp
index b41894ebb..ccae13815 100644
--- a/src/PrusaSlicer.cpp
+++ b/src/PrusaSlicer.cpp
@@ -588,9 +588,9 @@ int CLI::run(int argc, char **argv)
 //		gui->autosave = m_config.opt_string("autosave");
         GUI::GUI_App::SetInstance(gui);
 #if ENABLE_GCODE_VIEWER
-        gui->m_after_init_loads.set_params(load_configs, m_extra_config, m_input_files, start_as_gcodeviewer);
+        gui->after_init_loads.set_params(load_configs, m_extra_config, m_input_files, start_as_gcodeviewer);
 #else
-        gui->m_after_init_loads.set_params(load_configs, m_extra_config, m_input_files);
+        gui->after_init_loads.set_params(load_configs, m_extra_config, m_input_files);
 #endif // ENABLE_GCODE_VIEWER
 /*
 #if ENABLE_GCODE_VIEWER
diff --git a/src/libslic3r/PrintBase.hpp b/src/libslic3r/PrintBase.hpp
index 647c24c1c..66851f16e 100644
--- a/src/libslic3r/PrintBase.hpp
+++ b/src/libslic3r/PrintBase.hpp
@@ -406,7 +406,7 @@ public:
         // set to an ObjectID of a Print or a PrintObject based on flags
         // (whether UPDATE_PRINT_STEP_WARNINGS or UPDATE_PRINT_OBJECT_STEP_WARNINGS is set).
         ObjectID        warning_object_id;
-        // For which Print or PrintObject step a new warning is beeing issued?
+        // For which Print or PrintObject step a new warning is being issued?
         int             warning_step { -1 };
     };
     typedef std::function<void(const SlicingStatus&)>  status_callback_type;
diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp
index d11ca1f38..f5624bb6a 100644
--- a/src/slic3r/GUI/GUI_App.cpp
+++ b/src/slic3r/GUI/GUI_App.cpp
@@ -533,7 +533,7 @@ static void generic_exception_handle()
     }
 }
 
-void GUI_App::AFTER_INIT_LOADS::on_loads(GUI_App* gui)
+void GUI_App::AfterInitLoads::on_loads(GUI_App* gui)
 {
     if (!gui->initialized())
         return;
@@ -847,7 +847,10 @@ bool GUI_App::on_init_inner()
         static bool update_gui_after_init = true;
         if (update_gui_after_init) {
             update_gui_after_init = false;
-            m_after_init_loads.on_loads(this);
+#ifdef WIN32
+            this->mainframe->register_win32_callbacks();
+#endif
+            this->after_init_loads.on_loads(this);
         }
 
 		// Preset updating & Configwizard are done after the above initializations,
diff --git a/src/slic3r/GUI/GUI_App.hpp b/src/slic3r/GUI/GUI_App.hpp
index dd2d54c0d..fa2872a53 100644
--- a/src/slic3r/GUI/GUI_App.hpp
+++ b/src/slic3r/GUI/GUI_App.hpp
@@ -143,7 +143,7 @@ private:
 	size_t m_instance_hash_int;
 
     // parameters needed for the after OnInit() loads
-    struct AFTER_INIT_LOADS
+    struct AfterInitLoads 
     {
         std::vector<std::string>    m_load_configs;
         DynamicPrintConfig          m_extra_config;
@@ -272,7 +272,7 @@ public:
     PresetUpdater*  preset_updater{ nullptr };
     MainFrame*      mainframe{ nullptr };
     Plater*         plater_{ nullptr };
-    AFTER_INIT_LOADS m_after_init_loads;
+    AfterInitLoads  after_init_loads;
 
 	PresetUpdater* get_preset_updater() { return preset_updater; }
 
diff --git a/src/slic3r/GUI/MainFrame.cpp b/src/slic3r/GUI/MainFrame.cpp
index 8db0bba5b..67ccd385e 100644
--- a/src/slic3r/GUI/MainFrame.cpp
+++ b/src/slic3r/GUI/MainFrame.cpp
@@ -217,65 +217,6 @@ DPIFrame(NULL, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, wxDEFAULT_FRAME_S
     update_title();
 
     // declare events
-    Bind(wxEVT_CREATE, [this](wxWindowCreateEvent& event) {
-
-#ifdef _WIN32
-		//static GUID GUID_DEVINTERFACE_USB_DEVICE	= { 0xA5DCBF10, 0x6530, 0x11D2, 0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED };
-		//static GUID GUID_DEVINTERFACE_DISK 		= { 0x53f56307, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b };
-		//static GUID GUID_DEVINTERFACE_VOLUME 	    = { 0x71a27cdd, 0x812a, 0x11d0, 0xbe, 0xc7, 0x08, 0x00, 0x2b, 0xe2, 0x09, 0x2f };
-		static GUID GUID_DEVINTERFACE_HID			= { 0x4D1E55B2, 0xF16F, 0x11CF, 0x88, 0xCB, 0x00, 0x11, 0x11, 0x00, 0x00, 0x30 };
-
-    	// Register USB HID (Human Interface Devices) notifications to trigger the 3DConnexion enumeration.
-		DEV_BROADCAST_DEVICEINTERFACE NotificationFilter = { 0 };
-		NotificationFilter.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);
-		NotificationFilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
-		NotificationFilter.dbcc_classguid = GUID_DEVINTERFACE_HID;
-		m_hDeviceNotify = ::RegisterDeviceNotification(this->GetHWND(), &NotificationFilter, DEVICE_NOTIFY_WINDOW_HANDLE);
-
-// or register for file handle change?
-//		DEV_BROADCAST_HANDLE NotificationFilter = { 0 };
-//		NotificationFilter.dbch_size = sizeof(DEV_BROADCAST_HANDLE);
-//		NotificationFilter.dbch_devicetype = DBT_DEVTYP_HANDLE;
-
-		// Using Win32 Shell API to register for media insert / removal events.
-		LPITEMIDLIST ppidl;
-		if (SHGetSpecialFolderLocation(this->GetHWND(), CSIDL_DESKTOP, &ppidl) == NOERROR) {
-			SHChangeNotifyEntry shCNE;
-			shCNE.pidl       = ppidl;
-			shCNE.fRecursive = TRUE;
-			// Returns a positive integer registration identifier (ID).
-			// Returns zero if out of memory or in response to invalid parameters.
-			m_ulSHChangeNotifyRegister = SHChangeNotifyRegister(this->GetHWND(),		// Hwnd to receive notification
-				SHCNE_DISKEVENTS,														// Event types of interest (sources)
-				SHCNE_MEDIAINSERTED | SHCNE_MEDIAREMOVED,
-				//SHCNE_UPDATEITEM,														// Events of interest - use SHCNE_ALLEVENTS for all events
-				WM_USER_MEDIACHANGED,													// Notification message to be sent upon the event
-				1,																		// Number of entries in the pfsne array
-				&shCNE);																// Array of SHChangeNotifyEntry structures that 
-																						// contain the notifications. This array should 
-																						// always be set to one when calling SHChnageNotifyRegister
-																						// or SHChangeNotifyDeregister will not work properly.
-			assert(m_ulSHChangeNotifyRegister != 0);    // Shell notification failed
-		} else {
-			// Failed to get desktop location
-			assert(false); 
-		}
-
-		{
-			static constexpr int device_count = 1;
-			RAWINPUTDEVICE devices[device_count] = { 0 };
-			// multi-axis mouse (SpaceNavigator, etc.)
-			devices[0].usUsagePage = 0x01;
-			devices[0].usUsage = 0x08;
-			if (! RegisterRawInputDevices(devices, device_count, sizeof(RAWINPUTDEVICE)))
-				BOOST_LOG_TRIVIAL(error) << "RegisterRawInputDevices failed";
-		}
-#endif // _WIN32
-
-        // propagate event
-        event.Skip();
-    });
-
     Bind(wxEVT_CLOSE_WINDOW, [this](wxCloseEvent& event) {
         if (event.CanVeto() && !wxGetApp().check_unsaved_changes()) {
             event.Veto();
@@ -286,6 +227,8 @@ DPIFrame(NULL, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, wxDEFAULT_FRAME_S
         event.Skip();
     });
 
+    //FIXME it seems this method is not called on application start-up, at least not on Windows. Why?
+    // The same applies to wxEVT_CREATE, it is not being called on startup on Windows.
     Bind(wxEVT_ACTIVATE, [this](wxActivateEvent& event) {
         if (m_plater != nullptr && event.GetActive())
             m_plater->on_activate();
@@ -656,6 +599,62 @@ void MainFrame::init_tabpanel()
     }
 }
 
+#ifdef WIN32
+void MainFrame::register_win32_callbacks()
+{
+    //static GUID GUID_DEVINTERFACE_USB_DEVICE  = { 0xA5DCBF10, 0x6530, 0x11D2, 0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED };
+    //static GUID GUID_DEVINTERFACE_DISK        = { 0x53f56307, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b };
+    //static GUID GUID_DEVINTERFACE_VOLUME      = { 0x71a27cdd, 0x812a, 0x11d0, 0xbe, 0xc7, 0x08, 0x00, 0x2b, 0xe2, 0x09, 0x2f };
+    static GUID GUID_DEVINTERFACE_HID           = { 0x4D1E55B2, 0xF16F, 0x11CF, 0x88, 0xCB, 0x00, 0x11, 0x11, 0x00, 0x00, 0x30 };
+
+    // Register USB HID (Human Interface Devices) notifications to trigger the 3DConnexion enumeration.
+    DEV_BROADCAST_DEVICEINTERFACE NotificationFilter = { 0 };
+    NotificationFilter.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);
+    NotificationFilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
+    NotificationFilter.dbcc_classguid = GUID_DEVINTERFACE_HID;
+    m_hDeviceNotify = ::RegisterDeviceNotification(this->GetHWND(), &NotificationFilter, DEVICE_NOTIFY_WINDOW_HANDLE);
+
+// or register for file handle change?
+//      DEV_BROADCAST_HANDLE NotificationFilter = { 0 };
+//      NotificationFilter.dbch_size = sizeof(DEV_BROADCAST_HANDLE);
+//      NotificationFilter.dbch_devicetype = DBT_DEVTYP_HANDLE;
+
+    // Using Win32 Shell API to register for media insert / removal events.
+    LPITEMIDLIST ppidl;
+    if (SHGetSpecialFolderLocation(this->GetHWND(), CSIDL_DESKTOP, &ppidl) == NOERROR) {
+        SHChangeNotifyEntry shCNE;
+        shCNE.pidl       = ppidl;
+        shCNE.fRecursive = TRUE;
+        // Returns a positive integer registration identifier (ID).
+        // Returns zero if out of memory or in response to invalid parameters.
+        m_ulSHChangeNotifyRegister = SHChangeNotifyRegister(this->GetHWND(),        // Hwnd to receive notification
+            SHCNE_DISKEVENTS,                                                       // Event types of interest (sources)
+            SHCNE_MEDIAINSERTED | SHCNE_MEDIAREMOVED,
+            //SHCNE_UPDATEITEM,                                                     // Events of interest - use SHCNE_ALLEVENTS for all events
+            WM_USER_MEDIACHANGED,                                                   // Notification message to be sent upon the event
+            1,                                                                      // Number of entries in the pfsne array
+            &shCNE);                                                                // Array of SHChangeNotifyEntry structures that 
+                                                                                    // contain the notifications. This array should 
+                                                                                    // always be set to one when calling SHChnageNotifyRegister
+                                                                                    // or SHChangeNotifyDeregister will not work properly.
+        assert(m_ulSHChangeNotifyRegister != 0);    // Shell notification failed
+    } else {
+        // Failed to get desktop location
+        assert(false); 
+    }
+
+    {
+        static constexpr int device_count = 1;
+        RAWINPUTDEVICE devices[device_count] = { 0 };
+        // multi-axis mouse (SpaceNavigator, etc.)
+        devices[0].usUsagePage = 0x01;
+        devices[0].usUsage = 0x08;
+        if (! RegisterRawInputDevices(devices, device_count, sizeof(RAWINPUTDEVICE)))
+            BOOST_LOG_TRIVIAL(error) << "RegisterRawInputDevices failed";
+    }
+}
+#endif // _WIN32
+
 void MainFrame::create_preset_tabs()
 {
     wxGetApp().update_label_colours_from_appconfig();
diff --git a/src/slic3r/GUI/MainFrame.hpp b/src/slic3r/GUI/MainFrame.hpp
index 9be9bbad9..3a8443cb8 100644
--- a/src/slic3r/GUI/MainFrame.hpp
+++ b/src/slic3r/GUI/MainFrame.hpp
@@ -156,6 +156,9 @@ public:
     void        create_preset_tabs();
     void        add_created_tab(Tab* panel);
     bool        is_active_and_shown_tab(Tab* tab);
+    // Register Win32 RawInput callbacks (3DConnexion) and removable media insert / remove callbacks.
+    // Called from wxEVT_ACTIVATE, as wxEVT_CREATE was not reliable (bug in wxWidgets?).
+    void        register_win32_callbacks();
 #if ENABLE_GCODE_VIEWER
     void        init_menubar_as_editor();
     void        init_menubar_as_gcodeviewer();