diff --git a/deps/deps-macos.cmake b/deps/deps-macos.cmake
index 790a65aeb..c7c6819e3 100644
--- a/deps/deps-macos.cmake
+++ b/deps/deps-macos.cmake
@@ -89,10 +89,12 @@ ExternalProject_Add(dep_libcurl
 
 ExternalProject_Add(dep_wxwidgets
     EXCLUDE_FROM_ALL 1
-    URL "https://github.com/wxWidgets/wxWidgets/releases/download/v3.1.2/wxWidgets-3.1.2.tar.bz2"
-    URL_HASH SHA256=4cb8d23d70f9261debf7d6cfeca667fc0a7d2b6565adb8f1c484f9b674f1f27a
+    GIT_REPOSITORY "https://github.com/prusa3d/wxWidgets"
+    GIT_TAG v3.1.1-patched
+#    URL "https://github.com/wxWidgets/wxWidgets/releases/download/v3.1.2/wxWidgets-3.1.2.tar.bz2"
+#    URL_HASH SHA256=4cb8d23d70f9261debf7d6cfeca667fc0a7d2b6565adb8f1c484f9b674f1f27a
     BUILD_IN_SOURCE 1
-    PATCH_COMMAND "${CMAKE_COMMAND}" -E copy "${CMAKE_CURRENT_SOURCE_DIR}/wxwidgets-pngprefix.h" src/png/pngprefix.h
+#    PATCH_COMMAND "${CMAKE_COMMAND}" -E copy "${CMAKE_CURRENT_SOURCE_DIR}/wxwidgets-pngprefix.h" src/png/pngprefix.h
     CONFIGURE_COMMAND env "CXXFLAGS=${DEP_WERRORS_SDK}" "CFLAGS=${DEP_WERRORS_SDK}" ./configure
         "--prefix=${DESTDIR}/usr/local"
         --disable-shared
diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp
index a143051e0..3e1fc5c3d 100644
--- a/src/libslic3r/PrintConfig.cpp
+++ b/src/libslic3r/PrintConfig.cpp
@@ -2266,7 +2266,7 @@ void PrintConfigDef::init_sla_params()
     def->tooltip  = L("Printer scaling correction");
     def->min = 0;
     def->mode = comExpert;
-    def->default_value = new ConfigOptionFloats( { 1., 1., 1. } );
+    def->default_value = new ConfigOptionFloats( { 1., 1. } );
     
     def = this->add("absolute_correction", coFloat);
     def->label = L("Printer absolute correction");
@@ -2323,7 +2323,7 @@ void PrintConfigDef::init_sla_params()
     def->tooltip  = L("Correction for expansion");
     def->min = 0;
     def->mode = comExpert;
-    def->default_value = new ConfigOptionFloats( { 1. , 1., 1. } );
+    def->default_value = new ConfigOptionFloats( { 1. , 1. } );
 
     def = this->add("material_notes", coString);
     def->label = L("SLA print material notes");
diff --git a/src/libslic3r/SLAPrint.cpp b/src/libslic3r/SLAPrint.cpp
index 3122beece..4210b46d5 100644
--- a/src/libslic3r/SLAPrint.cpp
+++ b/src/libslic3r/SLAPrint.cpp
@@ -1174,8 +1174,9 @@ void SLAPrint::process()
             for(const SliceRecord& record : layer.slices()) {
                 const SLAPrintObject *po = record.print_obj();
 
-                const ExPolygons &rawmodelslices = record.get_slice(soModel);
-                const ExPolygons &modelslices = clpr_back_offs != 0 ? offset_ex(rawmodelslices, clpr_back_offs) : rawmodelslices;
+                // const ExPolygons &rawmodelslices = record.get_slice(soModel);
+                // const ExPolygons &modelslices = clpr_back_offs != 0 ? offset_ex(rawmodelslices, clpr_back_offs) : rawmodelslices;
+                const ExPolygons &modelslices = record.get_slice(soModel);
                 
                 bool is_lefth = record.print_obj()->is_left_handed();
                 if (!modelslices.empty()) {
@@ -1183,8 +1184,9 @@ void SLAPrint::process()
                     for(ClipperPolygon& p_tmp : v) model_polygons.emplace_back(std::move(p_tmp));
                 }
 
-                const ExPolygons &rawsupportslices = record.get_slice(soSupport);
-                const ExPolygons &supportslices = clpr_back_offs != 0 ? offset_ex(rawsupportslices, clpr_back_offs) : rawsupportslices;
+                // const ExPolygons &rawsupportslices = record.get_slice(soSupport);
+                // const ExPolygons &supportslices = clpr_back_offs != 0 ? offset_ex(rawsupportslices, clpr_back_offs) : rawsupportslices;
+                const ExPolygons &supportslices = record.get_slice(soSupport);
                 
                 if (!supportslices.empty()) {
                     ClipperPolygons v = get_all_polygons(supportslices, po->instances(), is_lefth);
@@ -1662,16 +1664,16 @@ Vec3d SLAPrint::relative_correction() const
 {
     Vec3d corr(1., 1., 1.);
 
-    if(printer_config().relative_correction.values.size() == 2) {
+    if(printer_config().relative_correction.values.size() >= 2) {
         corr(X) = printer_config().relative_correction.values[0];
         corr(Y) = printer_config().relative_correction.values[0];
-        corr(Z) = printer_config().relative_correction.values[1];
-    }
+        corr(Z) = printer_config().relative_correction.values.back();
+    } 
 
-    if(material_config().material_correction.values.size() == 2) {
+    if(material_config().material_correction.values.size() >= 2) {
         corr(X) *= material_config().material_correction.values[0];
         corr(Y) *= material_config().material_correction.values[0];
-        corr(Z) *= material_config().material_correction.values[1];
+        corr(Z) *= material_config().material_correction.values.back();
     }
 
     return corr;
diff --git a/src/slic3r/CMakeLists.txt b/src/slic3r/CMakeLists.txt
index f54189762..570e23baa 100644
--- a/src/slic3r/CMakeLists.txt
+++ b/src/slic3r/CMakeLists.txt
@@ -151,7 +151,10 @@ set(SLIC3R_GUI_SOURCES
 )
 
 if (APPLE)
-    list(APPEND SLIC3R_GUI_SOURCES Utils/RetinaHelperImpl.mm)
+    list(APPEND SLIC3R_GUI_SOURCES
+            Utils/RetinaHelperImpl.mm
+            Utils/MacDarkMode.mm
+        )
 endif ()
 
 add_library(libslic3r_gui STATIC ${SLIC3R_GUI_SOURCES})
diff --git a/src/slic3r/GUI/3DBed.cpp b/src/slic3r/GUI/3DBed.cpp
index 05f4fd8fd..8392e534a 100644
--- a/src/slic3r/GUI/3DBed.cpp
+++ b/src/slic3r/GUI/3DBed.cpp
@@ -8,6 +8,7 @@
 
 #include "GUI_App.hpp"
 #include "PresetBundle.hpp"
+#include "Gizmos/GLGizmoBase.hpp"
 
 #include <GL/glew.h>
 
@@ -232,7 +233,7 @@ void Bed3D::Axes::render() const
     glsafe(::glEnable(GL_LIGHTING));
 
     // x axis
-    glsafe(::glColor3f(1.0f, 0.0f, 0.0f));
+    glsafe(::glColor3fv(AXES_COLOR[0]));
     glsafe(::glPushMatrix());
     glsafe(::glTranslated(origin(0), origin(1), origin(2)));
     glsafe(::glRotated(90.0, 0.0, 1.0, 0.0));
@@ -240,7 +241,7 @@ void Bed3D::Axes::render() const
     glsafe(::glPopMatrix());
 
     // y axis
-    glsafe(::glColor3f(0.0f, 1.0f, 0.0f));
+    glsafe(::glColor3fv(AXES_COLOR[1]));
     glsafe(::glPushMatrix());
     glsafe(::glTranslated(origin(0), origin(1), origin(2)));
     glsafe(::glRotated(-90.0, 1.0, 0.0, 0.0));
@@ -248,7 +249,7 @@ void Bed3D::Axes::render() const
     glsafe(::glPopMatrix());
 
     // z axis
-    glsafe(::glColor3f(0.0f, 0.0f, 1.0f));
+    glsafe(::glColor3fv(AXES_COLOR[2]));
     glsafe(::glPushMatrix());
     glsafe(::glTranslated(origin(0), origin(1), origin(2)));
     render_axis(length(2));
diff --git a/src/slic3r/GUI/Camera.cpp b/src/slic3r/GUI/Camera.cpp
index 7a1023e62..dd6cbefe1 100644
--- a/src/slic3r/GUI/Camera.cpp
+++ b/src/slic3r/GUI/Camera.cpp
@@ -25,6 +25,7 @@ Camera::Camera()
     , phi(45.0f)
 //    , distance(0.0f)
     , requires_zoom_to_bed(false)
+    , inverted_phi(false)
     , m_theta(45.0f)
     , m_target(Vec3d::Zero())
 {
diff --git a/src/slic3r/GUI/Camera.hpp b/src/slic3r/GUI/Camera.hpp
index d19bc870e..b9c5dfc32 100644
--- a/src/slic3r/GUI/Camera.hpp
+++ b/src/slic3r/GUI/Camera.hpp
@@ -22,6 +22,7 @@ struct Camera
     float phi;
 //    float distance;
     bool requires_zoom_to_bed;
+    bool inverted_phi;
 
 private:
     Vec3d m_target;
diff --git a/src/slic3r/GUI/ConfigWizard.cpp b/src/slic3r/GUI/ConfigWizard.cpp
index 93cf1c73f..93c780909 100644
--- a/src/slic3r/GUI/ConfigWizard.cpp
+++ b/src/slic3r/GUI/ConfigWizard.cpp
@@ -649,12 +649,6 @@ void PageTemperatures::apply_custom_config(DynamicPrintConfig &config)
 
 ConfigWizardIndex::ConfigWizardIndex(wxWindow *parent)
     : wxPanel(parent)
-    /* #ys_FIXME_delete_after_testing by VK
-    , bg(GUI::from_u8(Slic3r::var("Slic3r_192px_transparent.png")), wxBITMAP_TYPE_PNG)
-    , bullet_black(GUI::from_u8(Slic3r::var("bullet_black.png")), wxBITMAP_TYPE_PNG)
-    , bullet_blue(GUI::from_u8(Slic3r::var("bullet_blue.png")), wxBITMAP_TYPE_PNG)
-    , bullet_white(GUI::from_u8(Slic3r::var("bullet_white.png")), wxBITMAP_TYPE_PNG)
-    */
     , bg(ScalableBitmap(parent, "Slic3r_192px_transparent.png", 192))
     , bullet_black(ScalableBitmap(parent, "bullet_black.png"))
     , bullet_blue(ScalableBitmap(parent, "bullet_blue.png"))
@@ -675,9 +669,6 @@ ConfigWizardIndex::ConfigWizardIndex(wxWindow *parent)
     // In some cases it didn't work at all. And so wxStaticBitmap is used here instead,
     // because it has all the platform quirks figured out.
     auto *sizer = new wxBoxSizer(wxVERTICAL);
-    /* #ys_FIXME_delete_after_testing by VK
-    auto *logo = new wxStaticBitmap(this, wxID_ANY, bg);
-    */
     logo = new wxStaticBitmap(this, wxID_ANY, bg.bmp());
     sizer->AddStretchSpacer();
     sizer->Add(logo);
@@ -786,10 +777,6 @@ void ConfigWizardIndex::on_paint(wxPaintEvent & evt)
 
     wxPaintDC dc(this);
 
-    /* #ys_FIXME_delete_after_testing by VK
-    const auto bullet_w = bullet_black.GetSize().GetWidth();
-    const auto bullet_h = bullet_black.GetSize().GetHeight();
-    */
     const auto bullet_w = bullet_black.bmp().GetSize().GetWidth();
     const auto bullet_h = bullet_black.bmp().GetSize().GetHeight();
     const int yoff_icon = bullet_h < em_h ? (em_h - bullet_h) / 2 : 0;
@@ -804,12 +791,6 @@ void ConfigWizardIndex::on_paint(wxPaintEvent & evt)
         unsigned x = em_w/2 + item.indent * em_w;
 
         if (i == item_active || item_hover >= 0 && i == (size_t)item_hover) {
-            /*#ys_FIXME_delete_after_testing by VK
-            dc.DrawBitmap(bullet_blue,  x, y + yoff_icon, false);
-        }
-        else if (i < item_active)  { dc.DrawBitmap(bullet_black, x, y + yoff_icon, false); }
-        else if (i > item_active)  { dc.DrawBitmap(bullet_white, x, y + yoff_icon, false); }
-            */
             dc.DrawBitmap(bullet_blue.bmp(), x, y + yoff_icon, false);
         }
         else if (i < item_active)  { dc.DrawBitmap(bullet_black.bmp(), x, y + yoff_icon, false); }
@@ -848,6 +829,10 @@ void ConfigWizardIndex::on_mouse_move(wxMouseEvent &evt)
 
 void ConfigWizardIndex::msw_rescale()
 {
+    const wxSize size = GetTextExtent("m");
+    em_w = size.x;
+    em_h = size.y;
+
     bg.msw_rescale();
     SetMinSize(bg.bmp().GetSize());
     logo->SetBitmap(bg.bmp());
@@ -897,6 +882,29 @@ void ConfigWizard::priv::load_pages(bool custom_setup)
     q->Layout();
 }
 
+void ConfigWizard::priv::init_dialog_size()
+{
+    // Clamp the Wizard size based on screen dimensions
+
+    const auto idx = wxDisplay::GetFromWindow(q);
+    wxDisplay display(idx != wxNOT_FOUND ? idx : 0u);
+
+    const auto disp_rect = display.GetClientArea();
+    wxRect window_rect(
+        disp_rect.x + disp_rect.width / 20,
+        disp_rect.y + disp_rect.height / 20,
+        9*disp_rect.width / 10,
+        9*disp_rect.height / 10);
+
+    const int width_hint = index->GetSize().GetWidth() + page_fff->get_width() + 30 * em();    // XXX: magic constant, I found no better solution
+    if (width_hint < window_rect.width) {
+        window_rect.x += (window_rect.width - width_hint) / 2;
+        window_rect.width = width_hint;
+    }
+
+    q->SetSize(window_rect);
+}
+
 bool ConfigWizard::priv::check_first_variant() const
 {
     return run_reason == RR_DATA_EMPTY || run_reason == RR_DATA_LEGACY;
@@ -982,10 +990,11 @@ void ConfigWizard::priv::apply_config(AppConfig *app_config, PresetBundle *prese
 
         size_t size_sum = 0;
         for (const auto &model : vendor->second) { size_sum += model.second.size(); }
-        if (size_sum == 0) { continue; }
 
-        // This vendor needs to be installed
-        install_bundles.emplace_back(vendor_rsrc.second);
+        if (size_sum > 0) {
+            // This vendor needs to be installed
+            install_bundles.emplace_back(vendor_rsrc.second);
+        }
     }
 
     // Decide whether to create snapshot based on run_reason and the reset profile checkbox
@@ -1011,9 +1020,26 @@ void ConfigWizard::priv::apply_config(AppConfig *app_config, PresetBundle *prese
     app_config->set_vendors(appconfig_vendors);
     app_config->set("version_check", page_update->version_check ? "1" : "0");
     app_config->set("preset_update", page_update->preset_update ? "1" : "0");
-    app_config->reset_selections();
-    preset_bundle->load_presets(*app_config);
 
+    std::string preferred_model;
+
+    // Figure out the default pre-selected printer based on the seletions in the picker.
+    // The default is the first selected printer model (one with at least 1 variant selected).
+    // The default is only applied by load_presets() if the user doesn't have a (visible) printer
+    // selected already.
+    const auto vendor_prusa = vendors.find("PrusaResearch");
+    const auto config_prusa = enabled_vendors.find("PrusaResearch");
+    if (vendor_prusa != vendors.end() && config_prusa != enabled_vendors.end()) {
+        for (const auto &model : vendor_prusa->second.models) {
+            const auto model_it = config_prusa->second.find(model.id);
+            if (model_it != config_prusa->second.end() && model_it->second.size() > 0) {
+                preferred_model = model.id;
+                break;
+            }
+        }
+    }
+
+    preset_bundle->load_presets(*app_config, preferred_model);
 
     if (page_custom->custom_wanted()) {
         page_firmware->apply_custom_config(*custom_config);
@@ -1107,25 +1133,7 @@ ConfigWizard::ConfigWizard(wxWindow *parent, RunReason reason)
     p->hscroll->SetScrollRate(30, 30);
 
     on_window_geometry(this, [this]() {
-        // Clamp the Wizard size based on screen dimensions
-
-        const auto idx = wxDisplay::GetFromWindow(this);
-        wxDisplay display(idx != wxNOT_FOUND ? idx : 0u);
-
-        const auto disp_rect = display.GetClientArea();
-        wxRect window_rect(
-            disp_rect.x + disp_rect.width / 20,
-            disp_rect.y + disp_rect.height / 20,
-            9*disp_rect.width / 10,
-            9*disp_rect.height / 10);
-
-        const int width_hint = p->index->GetSize().GetWidth() + p->page_fff->get_width() + 30 * p->em();    // XXX: magic constant, I found no better solution
-        if (width_hint < window_rect.width) {
-            window_rect.x += (window_rect.width - width_hint) / 2;
-            window_rect.width = width_hint;
-        }
-
-        SetSize(window_rect);
+        p->init_dialog_size();
     });
 
     p->btn_prev->Bind(wxEVT_BUTTON, [this](const wxCommandEvent &) { this->p->index->go_prev(); });
@@ -1194,7 +1202,7 @@ void ConfigWizard::on_dpi_changed(const wxRect &suggested_rect)
     for (auto printer_picker: p->page_fff->printer_pickers)
         msw_buttons_rescale(this, em, printer_picker->get_button_indexes());
 
-    // FIXME VK SetSize(???)
+    p->init_dialog_size();
 
     Refresh();
 }
diff --git a/src/slic3r/GUI/ConfigWizard_private.hpp b/src/slic3r/GUI/ConfigWizard_private.hpp
index 95411e2aa..f4848933f 100644
--- a/src/slic3r/GUI/ConfigWizard_private.hpp
+++ b/src/slic3r/GUI/ConfigWizard_private.hpp
@@ -292,6 +292,7 @@ struct ConfigWizard::priv
     priv(ConfigWizard *q) : q(q) {}
 
     void load_pages(bool custom_setup);
+    void init_dialog_size();
 
     bool check_first_variant() const;
     void load_vendors();
diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp
index 985f7ded2..37e5a9ba7 100644
--- a/src/slic3r/GUI/GLCanvas3D.cpp
+++ b/src/slic3r/GUI/GLCanvas3D.cpp
@@ -2821,7 +2821,8 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt)
             if (m_hover_volume_idxs.empty() && m_mouse.is_start_position_3D_defined())
             {
                 const Vec3d& orig = m_mouse.drag.start_position_3D;
-                m_camera.phi += (((float)pos(0) - (float)orig(0)) * TRACKBALLSIZE);
+                float sign = m_camera.inverted_phi ? -1.0f : 1.0f;
+                m_camera.phi += sign * ((float)pos(0) - (float)orig(0)) * TRACKBALLSIZE;
                 m_camera.set_theta(m_camera.get_theta() - ((float)pos(1) - (float)orig(1)) * TRACKBALLSIZE, wxGetApp().preset_bundle->printers.get_edited_preset().printer_technology() != ptSLA);
                 m_dirty = true;
             }
@@ -2880,6 +2881,9 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt)
                 post_event(SimpleEvent(EVT_GLCANVAS_OBJECT_SELECT));
             }
         }
+        else if (evt.LeftUp() && m_mouse.dragging)
+            // Flips X mouse deltas if bed is upside down
+            m_camera.inverted_phi = (m_camera.get_dir_up()(2) < 0.0);
         else if (evt.RightUp())
         {
             m_mouse.position = pos.cast<double>();
@@ -5257,6 +5261,10 @@ bool GLCanvas3D::_travel_paths_by_tool(const GCodePreviewData& preview_data, con
     // creates a new volume for each tool
     for (Tool& tool : tools)
     {
+        // tool.value could be invalid (as it was with https://github.com/prusa3d/Slic3r/issues/2179), we better check
+        if (tool.value >= tool_colors.size())
+            continue;
+
         GLVolume* volume = new GLVolume(tool_colors.data() + tool.value * 4);
         if (volume == nullptr)
             return false;
@@ -5271,7 +5279,7 @@ bool GLCanvas3D::_travel_paths_by_tool(const GCodePreviewData& preview_data, con
     for (const GCodePreviewData::Travel::Polyline& polyline : preview_data.travel.polylines)
     {
         ToolsList::iterator tool = std::find(tools.begin(), tools.end(), Tool(polyline.extruder_id));
-        if (tool != tools.end())
+        if (tool != tools.end() && tool->volume != nullptr)
         {
             tool->volume->print_zs.push_back(unscale<double>(polyline.polyline.bounding_box().min(2)));
             tool->volume->offsets.push_back(tool->volume->indexed_vertex_array.quad_indices.size());
diff --git a/src/slic3r/GUI/GUI.cpp b/src/slic3r/GUI/GUI.cpp
index 4a3ccc356..9a641c7c0 100644
--- a/src/slic3r/GUI/GUI.cpp
+++ b/src/slic3r/GUI/GUI.cpp
@@ -125,9 +125,6 @@ void config_wizard(int reason)
     if (! wxGetApp().check_unsaved_changes())
     	return;
 
-    // save selected preset before config wizard running
-    const auto printer_preset_name = wxGetApp().preset_bundle->printers.get_edited_preset().name;
-
 	try {
 		ConfigWizard wizard(nullptr, static_cast<ConfigWizard::RunReason>(reason));
         wizard.run(wxGetApp().preset_bundle, wxGetApp().preset_updater);
@@ -136,10 +133,8 @@ void config_wizard(int reason)
 		show_error(nullptr, e.what());
 	}
 
-    // select old(before config wizard running) preset
-	wxGetApp().get_tab(Preset::TYPE_PRINTER)->select_preset(printer_preset_name); 
-    // If old preset if invisible now, then first visible preset will be selected
-    // So, let control the case if multi-part object is on the scene and first visible preset is SLA
+	wxGetApp().load_current_presets();
+
     if (wxGetApp().preset_bundle->printers.get_edited_preset().printer_technology() == ptSLA &&
         wxGetApp().obj_list()->has_multi_part_objects())
     {
diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp
index 0ffdd576f..595a968bd 100644
--- a/src/slic3r/GUI/GUI_App.cpp
+++ b/src/slic3r/GUI/GUI_App.cpp
@@ -34,6 +34,7 @@
 
 #include "../Utils/PresetUpdater.hpp"
 #include "../Utils/PrintHost.hpp"
+#include "../Utils/MacDarkMode.hpp"
 #include "ConfigWizard.hpp"
 #include "slic3r/Config/Snapshot.hpp"
 #include "ConfigSnapshotDialog.hpp"
@@ -284,10 +285,24 @@ unsigned GUI_App::get_colour_approx_luma(const wxColour &colour)
         ));
 }
 
+bool GUI_App::dark_mode()
+{
+    const unsigned luma = get_colour_approx_luma(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW));
+    return luma < 128;
+}
+
+bool GUI_App::dark_mode_menus()
+{
+#if __APPLE__
+    return mac_dark_mode();
+#else
+    return dark_mode();
+#endif
+}
+
 void GUI_App::init_label_colours()
 {
-    auto luma = get_colour_approx_luma(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW));
-    if (luma >= 128) {
+    if (dark_mode()) {
         m_color_label_modified = wxColour(252, 77, 1);
         m_color_label_sys = wxColour(26, 132, 57);
     }
@@ -451,7 +466,7 @@ void GUI_App::update_ui_from_settings()
     mainframe->update_ui_from_settings();
 }
 
-void GUI_App::persist_window_geometry(wxTopLevelWindow *window)
+void GUI_App::persist_window_geometry(wxTopLevelWindow *window, bool default_maximized)
 {
     const std::string name = into_u8(window->GetName());
 
@@ -460,7 +475,7 @@ void GUI_App::persist_window_geometry(wxTopLevelWindow *window)
         event.Skip();
     });
 
-    window_pos_restore(window, name);
+    window_pos_restore(window, name, default_maximized);
 
     on_window_geometry(window, [=]() {
         window_pos_sanitize(window);
@@ -868,15 +883,21 @@ void GUI_App::window_pos_save(wxTopLevelWindow* window, const std::string &name)
     app_config->save();
 }
 
-void GUI_App::window_pos_restore(wxTopLevelWindow* window, const std::string &name)
+void GUI_App::window_pos_restore(wxTopLevelWindow* window, const std::string &name, bool default_maximized)
 {
     if (name.empty()) { return; }
     const auto config_key = (boost::format("window_%1%") % name).str();
 
-    if (! app_config->has(config_key)) { return; }
+    if (! app_config->has(config_key)) {
+        window->Maximize(default_maximized);
+        return;
+    }
 
     auto metrics = WindowMetrics::deserialize(app_config->get(config_key));
-    if (! metrics) { return; }
+    if (! metrics) {
+        window->Maximize(default_maximized);
+        return;
+    }
 
     window->SetSize(metrics->get_rect());
     window->Maximize(metrics->get_maximized());
diff --git a/src/slic3r/GUI/GUI_App.hpp b/src/slic3r/GUI/GUI_App.hpp
index d3c9e0afa..3a6a443f0 100644
--- a/src/slic3r/GUI/GUI_App.hpp
+++ b/src/slic3r/GUI/GUI_App.hpp
@@ -94,7 +94,9 @@ public:
 
     GUI_App();
 
-    unsigned        get_colour_approx_luma(const wxColour &colour);
+    static unsigned get_colour_approx_luma(const wxColour &colour);
+    static bool     dark_mode();
+    static bool     dark_mode_menus();
     void            init_label_colours();
     void            update_label_colours_from_appconfig();
     void            init_fonts();
@@ -122,7 +124,7 @@ public:
                                 const std::string& err);
 //     void            notify(/*message*/);
 
-    void            persist_window_geometry(wxTopLevelWindow *window);
+    void            persist_window_geometry(wxTopLevelWindow *window, bool default_maximized = false);
     void            update_ui_from_settings();
 
     bool            select_language(wxArrayString & names, wxArrayLong & identifiers);
@@ -174,7 +176,7 @@ public:
 private:
     bool            on_init_inner();
     void            window_pos_save(wxTopLevelWindow* window, const std::string &name);
-    void            window_pos_restore(wxTopLevelWindow* window, const std::string &name);
+    void            window_pos_restore(wxTopLevelWindow* window, const std::string &name, bool default_maximized = false);
     void            window_pos_sanitize(wxTopLevelWindow* window);
 };
 DECLARE_APP(GUI_App)
diff --git a/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp b/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp
index 461f65570..b07984ef1 100644
--- a/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp
+++ b/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp
@@ -23,7 +23,7 @@ namespace GUI {
 static const float DEFAULT_BASE_COLOR[3] = { 0.625f, 0.625f, 0.625f };
 static const float DEFAULT_DRAG_COLOR[3] = { 1.0f, 1.0f, 1.0f };
 static const float DEFAULT_HIGHLIGHT_COLOR[3] = { 1.0f, 0.38f, 0.0f };
-static const float AXES_COLOR[3][3] = { { 1.0f, 0.0f, 0.0f }, { 0.0f, 1.0f, 0.0f }, { 0.0f, 0.0f, 1.0f } };
+static const float AXES_COLOR[3][3] = { { 0.75f, 0.0f, 0.0f }, { 0.0f, 0.75f, 0.0f }, { 0.0f, 0.0f, 0.75f } };
 
 
 
diff --git a/src/slic3r/GUI/MainFrame.cpp b/src/slic3r/GUI/MainFrame.cpp
index 571b57235..cbc85ef23 100644
--- a/src/slic3r/GUI/MainFrame.cpp
+++ b/src/slic3r/GUI/MainFrame.cpp
@@ -129,7 +129,7 @@ DPIFrame(NULL, wxID_ANY, SLIC3R_BUILD, wxDefaultPosition, wxDefaultSize, wxDEFAU
         event.Skip();
     });
 
-    wxGetApp().persist_window_geometry(this);
+    wxGetApp().persist_window_geometry(this, true);
 
     update_ui_from_settings();    // FIXME (?)
 }
@@ -332,6 +332,7 @@ void MainFrame::init_menubar()
         wxMenu* export_menu = new wxMenu();
         wxMenuItem* item_export_gcode = append_menu_item(export_menu, wxID_ANY, _(L("Export &G-code")) + dots +"\tCtrl+G", _(L("Export current plate as G-code")),
             [this](wxCommandEvent&) { if (m_plater) m_plater->export_gcode(); }, "export_gcode");
+        m_changeable_menu_items.push_back(item_export_gcode);
         export_menu->AppendSeparator();
         wxMenuItem* item_export_stl = append_menu_item(export_menu, wxID_ANY, _(L("Export plate as &STL")) + dots, _(L("Export current plate as STL")),
             [this](wxCommandEvent&) { if (m_plater) m_plater->export_stl(); }, "export_plater");
@@ -444,8 +445,9 @@ void MainFrame::init_menubar()
         }
         append_menu_item(windowMenu, wxID_HIGHEST + 2, _(L("P&rint Settings Tab")) + "\tCtrl+2", _(L("Show the print settings")),
             [this, tab_offset](wxCommandEvent&) { select_tab(tab_offset + 0); }, "cog");
-        append_menu_item(windowMenu, wxID_HIGHEST + 3, _(L("&Filament Settings Tab")) + "\tCtrl+3", _(L("Show the filament settings")),
-            [this, tab_offset](wxCommandEvent&) { select_tab(tab_offset + 1); }, "spool.png");
+        wxMenuItem* item_material_tab = append_menu_item(windowMenu, wxID_HIGHEST + 3, _(L("&Filament Settings Tab")) + "\tCtrl+3", _(L("Show the filament settings")),
+            [this, tab_offset](wxCommandEvent&) { select_tab(tab_offset + 1); }, "spool");
+        m_changeable_menu_items.push_back(item_material_tab);
         append_menu_item(windowMenu, wxID_HIGHEST + 4, _(L("Print&er Settings Tab")) + "\tCtrl+4", _(L("Show the printer settings")),
             [this, tab_offset](wxCommandEvent&) { select_tab(tab_offset + 2); }, "printer");
         if (m_plater) {
@@ -554,6 +556,19 @@ void MainFrame::init_menubar()
         }, wxID_EXIT);
     }
 #endif
+
+    if (plater()->printer_technology() == ptSLA)
+        update_menubar();
+}
+
+void MainFrame::update_menubar()
+{
+    const bool is_fff = plater()->printer_technology() == ptFFF;
+
+    m_changeable_menu_items[miExport]       ->SetItemLabel((is_fff ? _(L("Export &G-code"))         : _(L("Export"))                    )   + dots + "\tCtrl+G");
+
+    m_changeable_menu_items[miMaterialTab]  ->SetItemLabel((is_fff ? _(L("&Filament Settings Tab")) : _(L("Mate&rial Settings Tab")))   + "\tCtrl+3");
+    m_changeable_menu_items[miMaterialTab]  ->SetBitmap(create_scaled_bitmap(this, is_fff ? "spool": "resin"));
 }
 
 // To perform the "Quck Slice", "Quick Slice and Save As", "Repeat last Quick Slice" and "Slice to SVG".
diff --git a/src/slic3r/GUI/MainFrame.hpp b/src/slic3r/GUI/MainFrame.hpp
index a8b2be2bc..13bf07922 100644
--- a/src/slic3r/GUI/MainFrame.hpp
+++ b/src/slic3r/GUI/MainFrame.hpp
@@ -70,6 +70,16 @@ class MainFrame : public DPIFrame
     bool can_delete() const;
     bool can_delete_all() const;
 
+    // MenuBar items changeable in respect to printer technology 
+    enum MenuItems
+    {                   //   FFF                  SLA
+        miExport = 0,   // Export G-code        Export
+        miMaterialTab,  // Filament Settings    Material Settings
+    };
+
+    // vector of a MenuBar items changeable in respect to printer technology 
+    std::vector<wxMenuItem*> m_changeable_menu_items;
+
 protected:
     virtual void on_dpi_changed(const wxRect &suggested_rect);
 
@@ -83,6 +93,7 @@ public:
     void        create_preset_tabs();
     void        add_created_tab(Tab* panel);
     void        init_menubar();
+    void        update_menubar();
 
     void        update_ui_from_settings();
     bool        is_loaded() const { return m_loaded; }
diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp
index 02cdaf208..2195471da 100644
--- a/src/slic3r/GUI/Plater.cpp
+++ b/src/slic3r/GUI/Plater.cpp
@@ -3747,6 +3747,9 @@ void Plater::set_printer_technology(PrinterTechnology printer_technology)
 
     p->label_btn_export = printer_technology == ptFFF ? L("Export G-code") : L("Export");
     p->label_btn_send   = printer_technology == ptFFF ? L("Send G-code")   : L("Send to printer");
+
+    if (wxGetApp().mainframe)
+        wxGetApp().mainframe->update_menubar();
 }
 
 void Plater::changed_object(int obj_idx)
diff --git a/src/slic3r/GUI/Preset.cpp b/src/slic3r/GUI/Preset.cpp
index 9875586ed..6fb3da5a6 100644
--- a/src/slic3r/GUI/Preset.cpp
+++ b/src/slic3r/GUI/Preset.cpp
@@ -1330,4 +1330,15 @@ const Preset& PrinterPresetCollection::default_preset_for(const DynamicPrintConf
 	return this->default_preset((opt_printer_technology == nullptr || opt_printer_technology->value == ptFFF) ? 0 : 1);
 }
 
+const Preset* PrinterPresetCollection::find_by_model_id(const std::string &model_id) const
+{
+    if (model_id.empty()) { return nullptr; }
+
+    const auto it = std::find_if(cbegin(), cend(), [&](const Preset &preset) {
+        return preset.config.opt_string("printer_model") == model_id;
+    });
+
+    return it != cend() ? &*it : nullptr;
+}
+
 } // namespace Slic3r
diff --git a/src/slic3r/GUI/Preset.hpp b/src/slic3r/GUI/Preset.hpp
index 051a55f66..bac1bfc4f 100644
--- a/src/slic3r/GUI/Preset.hpp
+++ b/src/slic3r/GUI/Preset.hpp
@@ -312,7 +312,7 @@ public:
     const Preset&   get_edited_preset() const   { return m_edited_preset; }
 
 	// used to update preset_choice from Tab
-	const std::deque<Preset>&	get_presets()	{ return m_presets; }
+	const std::deque<Preset>&	get_presets() const	{ return m_presets; }
 	int						get_idx_selected()	{ return m_idx_selected; }
 	static const std::string&	get_suffix_modified();
 
@@ -503,6 +503,8 @@ public:
     PrinterPresetCollection(Preset::Type type, const std::vector<std::string> &keys, const Slic3r::StaticPrintConfig &defaults, const std::string &default_name = "- default -") :
 		PresetCollection(type, keys, defaults, default_name) {}
     const Preset&   default_preset_for(const DynamicPrintConfig &config) const override;
+
+    const Preset*   find_by_model_id(const std::string &model_id) const;
 };
 
 } // namespace Slic3r
diff --git a/src/slic3r/GUI/PresetBundle.cpp b/src/slic3r/GUI/PresetBundle.cpp
index b2fa0a857..6acaf31c9 100644
--- a/src/slic3r/GUI/PresetBundle.cpp
+++ b/src/slic3r/GUI/PresetBundle.cpp
@@ -191,7 +191,7 @@ void PresetBundle::setup_directories()
     }
 }
 
-void PresetBundle::load_presets(const AppConfig &config)
+void PresetBundle::load_presets(const AppConfig &config, const std::string &preferred_model_id)
 {
     // First load the vendor specific system presets.
     std::string errors_cummulative = this->load_system_presets();
@@ -234,7 +234,7 @@ void PresetBundle::load_presets(const AppConfig &config)
     if (! errors_cummulative.empty())
         throw std::runtime_error(errors_cummulative);
 
-    this->load_selections(config);
+    this->load_selections(config, preferred_model_id);
 }
 
 // Load system presets into this PresetBundle.
@@ -324,7 +324,7 @@ void PresetBundle::load_installed_printers(const AppConfig &config)
 
 // Load selections (current print, current filaments, current printer) from config.ini
 // This is done on application start up or after updates are applied.
-void PresetBundle::load_selections(const AppConfig &config)
+void PresetBundle::load_selections(const AppConfig &config, const std::string &preferred_model_id)
 {
 	// Update visibility of presets based on application vendor / model / variant configuration.
 	this->load_installed_printers(config);
@@ -336,11 +336,21 @@ void PresetBundle::load_selections(const AppConfig &config)
     std::string initial_sla_material_profile_name = remove_ini_suffix(config.get("presets", "sla_material"));
 	std::string initial_printer_profile_name      = remove_ini_suffix(config.get("presets", "printer"));
 
-	// Activate print / filament / printer profiles from the config.
-	// If the printer profile enumerated by the config are not visible, select an alternate preset.
+    // Activate print / filament / printer profiles from either the config,
+    // or from the preferred_model_id suggestion passed in by ConfigWizard.
+    // If the printer profile enumerated by the config are not visible, select an alternate preset.
     // Do not select alternate profiles for the print / filament profiles as those presets
     // will be selected by the following call of this->update_compatible(true).
-    printers.select_preset_by_name(initial_printer_profile_name, true);
+
+    const Preset *initial_printer = printers.find_preset(initial_printer_profile_name);
+    const Preset *preferred_printer = printers.find_by_model_id(preferred_model_id);
+
+    if (preferred_printer != nullptr && (initial_printer == nullptr || !initial_printer->is_visible)) {
+        printers.select_preset_by_name(preferred_printer->name, true);
+    } else {
+        printers.select_preset_by_name(initial_printer_profile_name, true);
+    }
+
     PrinterTechnology printer_technology = printers.get_selected_preset().printer_technology();
     if (printer_technology == ptFFF) {
         prints.select_preset_by_name_strict(initial_print_profile_name);
diff --git a/src/slic3r/GUI/PresetBundle.hpp b/src/slic3r/GUI/PresetBundle.hpp
index 069ebd784..f351f66ac 100644
--- a/src/slic3r/GUI/PresetBundle.hpp
+++ b/src/slic3r/GUI/PresetBundle.hpp
@@ -31,7 +31,7 @@ public:
     // Load ini files of all types (print, filament, printer) from Slic3r::data_dir() / presets.
     // Load selections (current print, current filaments, current printer) from config.ini
     // This is done just once on application start up.
-    void            load_presets(const AppConfig &config);
+    void            load_presets(const AppConfig &config, const std::string &preferred_model_id = "");
 
     // Export selections (current print, current filaments, current printer) into config.ini
     void            export_selections(AppConfig &config);
@@ -143,7 +143,7 @@ private:
 
     // Load selections (current print, current filaments, current printer) from config.ini
     // This is done just once on application start up.
-    void                        load_selections(const AppConfig &config);
+    void                        load_selections(const AppConfig &config, const std::string &preferred_model_id = "");
 
     // Load print, filament & printer presets from a config. If it is an external config, then the name is extracted from the external path.
     // and the external config is just referenced, not stored into user profile directory.
diff --git a/src/slic3r/GUI/wxExtensions.cpp b/src/slic3r/GUI/wxExtensions.cpp
index d76e0da93..00d37d664 100644
--- a/src/slic3r/GUI/wxExtensions.cpp
+++ b/src/slic3r/GUI/wxExtensions.cpp
@@ -2351,8 +2351,9 @@ void ModeButton::SetState(const bool state)
 
 void ModeButton::focus_button(const bool focus)
 {
-    wxFont font = GetFont();
-    const wxFont& new_font = focus ? font.Bold() : font.GetBaseFont();
+    const wxFont& new_font = focus ? 
+                             Slic3r::GUI::wxGetApp().bold_font() : 
+                             Slic3r::GUI::wxGetApp().normal_font();
 
     SetFont(new_font);
 
diff --git a/src/slic3r/Utils/MacDarkMode.hpp b/src/slic3r/Utils/MacDarkMode.hpp
new file mode 100644
index 000000000..cfdc02888
--- /dev/null
+++ b/src/slic3r/Utils/MacDarkMode.hpp
@@ -0,0 +1,15 @@
+#ifndef slic3r_MacDarkMode_hpp_
+#define slic3r_MacDarkMode_hpp_
+
+namespace Slic3r {
+namespace GUI {
+
+#if __APPLE__
+extern bool mac_dark_mode();
+#endif
+
+
+} // namespace GUI
+} // namespace Slic3r
+
+#endif // MacDarkMode_h
diff --git a/src/slic3r/Utils/MacDarkMode.mm b/src/slic3r/Utils/MacDarkMode.mm
new file mode 100644
index 000000000..4177ee371
--- /dev/null
+++ b/src/slic3r/Utils/MacDarkMode.mm
@@ -0,0 +1,22 @@
+#import "MacDarkMode.hpp"
+
+#import <Foundation/Foundation.h>
+
+
+@implementation MacDarkMode
+
+namespace Slic3r {
+namespace GUI {
+
+bool mac_dark_mode()
+{
+    NSString *style = [[NSUserDefaults standardUserDefaults] stringForKey:@"AppleInterfaceStyle"];
+    return style && [style isEqualToString:@"Dark"];
+
+}
+
+
+}
+}
+
+@end