diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp
index ec5acf43b..dfa783927 100644
--- a/src/libslic3r/PrintConfig.cpp
+++ b/src/libslic3r/PrintConfig.cpp
@@ -131,7 +131,7 @@ void PrintConfigDef::init_fff_params()
                    "as [layer_num] and [layer_z].");
     def->multiline = true;
     def->full_width = true;
-    def->height = 50;
+    def->height = 5;
     def->mode = comExpert;
     def->default_value = new ConfigOptionString("");
 
@@ -140,7 +140,7 @@ void PrintConfigDef::init_fff_params()
     def->tooltip = L("This code is inserted between objects when using sequential printing. By default extruder and bed temperature are reset using non-wait command; however if M104, M109, M140 or M190 are detected in this custom code, Slic3r will not add temperature commands. Note that you can use placeholder variables for all Slic3r settings, so you can put a \"M109 S[first_layer_temperature]\" command wherever you want.");
     def->multiline = true;
     def->full_width = true;
-    def->height = 120;
+    def->height = 12;
     def->mode = comExpert;
     def->default_value = new ConfigOptionString("");
 
@@ -360,7 +360,7 @@ void PrintConfigDef::init_fff_params()
                    "Note that you can use placeholder variables for all Slic3r settings.");
     def->multiline = true;
     def->full_width = true;
-    def->height = 120;
+    def->height = 12;
     def->mode = comExpert;
     def->default_value = new ConfigOptionString("M104 S0 ; turn off temperature\nG28 X0  ; home X axis\nM84     ; disable motors\n");
 
@@ -539,7 +539,7 @@ void PrintConfigDef::init_fff_params()
     def->tooltip = L("If layer print time is estimated below this number of seconds, fan will be enabled "
                    "and its speed will be calculated by interpolating the minimum and maximum speeds.");
     def->sidetext = L("approximate seconds");
-    def->width = 60;
+    def->width = 6;
     def->min = 0;
     def->max = 1000;
     def->mode = comExpert;
@@ -556,7 +556,7 @@ void PrintConfigDef::init_fff_params()
     def->tooltip = L("You can put your notes regarding the filament here.");
     def->multiline = true;
     def->full_width = true;
-    def->height = 130;
+    def->height = 13;
     def->mode = comAdvanced;
     def->default_value = new ConfigOptionStrings { "" };
 
@@ -1007,7 +1007,7 @@ void PrintConfigDef::init_fff_params()
     def->label = L("Inherits profile");
     def->tooltip = L("Name of the profile, from which this profile inherits.");
     def->full_width = true;
-    def->height = 50;
+    def->height = 5;
     def->default_value = new ConfigOptionString();
     def->cli = ConfigOptionDef::nocli;
 
@@ -1034,7 +1034,7 @@ void PrintConfigDef::init_fff_params()
     def->cli = "after-layer-gcode|layer-gcode";
     def->multiline = true;
     def->full_width = true;
-    def->height = 50;
+    def->height = 5;
     def->mode = comExpert;
     def->default_value = new ConfigOptionString("");
 
@@ -1053,7 +1053,7 @@ void PrintConfigDef::init_fff_params()
     def->mode = comExpert;
 	def->default_value = new ConfigOptionBool(true);
 
-	const int machine_limits_opt_width = 70;
+	const int machine_limits_opt_width = 7;
 	{
 		struct AxisDefault {
 			std::string         name;
@@ -1252,7 +1252,7 @@ void PrintConfigDef::init_fff_params()
                    "header comments.");
     def->multiline = true;
     def->full_width = true;
-    def->height = 130;
+    def->height = 13;
     def->mode = comAdvanced;
     def->default_value = new ConfigOptionString("");
 
@@ -1387,7 +1387,7 @@ void PrintConfigDef::init_fff_params()
     def->gui_flags = "serialized";
     def->multiline = true;
     def->full_width = true;
-	def->height = 60;
+	def->height = 6;
     def->mode = comExpert;
 	def->default_value = new ConfigOptionStrings();
 
@@ -1402,7 +1402,7 @@ void PrintConfigDef::init_fff_params()
     def->tooltip = L("You can put your notes regarding the printer here.");
     def->multiline = true;
     def->full_width = true;
-    def->height = 130;
+    def->height = 13;
     def->mode = comAdvanced;
     def->default_value = new ConfigOptionString("");
 
@@ -1589,7 +1589,7 @@ void PrintConfigDef::init_fff_params()
     def->label = "";
     def->full_label = L("Serial port");
     def->tooltip = L("USB/serial port for printer connection.");
-    def->width = 200;
+    def->width = 20;
     def->default_value = new ConfigOptionString("");
 
     def = this->add("serial_speed", coInt);
@@ -1635,7 +1635,7 @@ void PrintConfigDef::init_fff_params()
     def->tooltip = L("If layer print time is estimated below this number of seconds, print moves "
                    "speed will be scaled down to extend duration to this value.");
     def->sidetext = L("approximate seconds");
-    def->width = 60;
+    def->width = 6;
     def->min = 0;
     def->max = 1000;
     def->mode = comExpert;
@@ -1742,7 +1742,7 @@ void PrintConfigDef::init_fff_params()
                    "a \"M109 S[first_layer_temperature]\" command wherever you want.");
     def->multiline = true;
     def->full_width = true;
-    def->height = 120;
+    def->height = 12;
     def->mode = comExpert;
     def->default_value = new ConfigOptionString("G28 ; home all axes\nG1 Z5 F5000 ; lift nozzle\n");
 
@@ -1758,7 +1758,7 @@ void PrintConfigDef::init_fff_params()
                    "in extruder order.");
     def->multiline = true;
     def->full_width = true;
-    def->height = 120;
+    def->height = 12;
     def->mode = comExpert;
     def->default_value = new ConfigOptionStrings { "; Filament gcode\n" };
 
@@ -2008,7 +2008,7 @@ void PrintConfigDef::init_fff_params()
                    "as [previous_extruder] and [next_extruder].");
     def->multiline = true;
     def->full_width = true;
-    def->height = 50;
+    def->height = 5;
     def->mode = comExpert;
     def->default_value = new ConfigOptionString("");
 
@@ -2330,7 +2330,7 @@ void PrintConfigDef::init_sla_params()
     def->tooltip = L("You can put your notes regarding the SLA print material here.");
     def->multiline = true;
     def->full_width = true;
-    def->height = 130;
+    def->height = 13;
     def->mode = comAdvanced;
     def->default_value = new ConfigOptionString("");
 
diff --git a/src/slic3r/GUI/AboutDialog.cpp b/src/slic3r/GUI/AboutDialog.cpp
index 86b12a95f..b2b025880 100644
--- a/src/slic3r/GUI/AboutDialog.cpp
+++ b/src/slic3r/GUI/AboutDialog.cpp
@@ -32,8 +32,11 @@ void AboutDialogLogo::onRepaint(wxEvent &event)
 }
 
 AboutDialog::AboutDialog()
-    : wxDialog(NULL, wxID_ANY, wxString::Format(_(L("About %s")), SLIC3R_APP_NAME), wxDefaultPosition, wxDefaultSize, wxCAPTION)
+    : DPIDialog(NULL, wxID_ANY, wxString::Format(_(L("About %s")), SLIC3R_APP_NAME), wxDefaultPosition, 
+                wxDefaultSize, /*wxCAPTION*/wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER)
 {
+    SetFont(wxGetApp().normal_font());
+
 	wxColour bgr_clr = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW);
 	SetBackgroundColour(bgr_clr);
     wxBoxSizer* hsizer = new wxBoxSizer(wxHORIZONTAL);
@@ -42,8 +45,10 @@ AboutDialog::AboutDialog()
 	main_sizer->Add(hsizer, 0, wxEXPAND | wxALL, 20);
 
     // logo
-    auto *logo = new wxStaticBitmap(this, wxID_ANY, create_scaled_bitmap(this, "Slic3r_192px.png", 192));
-	hsizer->Add(logo, 1, wxALIGN_CENTER_VERTICAL);
+    m_logo_bitmap = PrusaBitmap(this, "Slic3r_192px.png", 192);
+    m_logo = new wxStaticBitmap(this, wxID_ANY, m_logo_bitmap.bmp());
+//     auto *logo = new wxStaticBitmap(this, wxID_ANY, create_scaled_bitmap(this, "Slic3r_192px.png", 192));
+	hsizer->Add(m_logo, 1, wxALIGN_CENTER_VERTICAL);
     
     wxBoxSizer* vsizer = new wxBoxSizer(wxVERTICAL); 	
     hsizer->Add(vsizer, 2, wxEXPAND|wxLEFT, 20);
@@ -51,8 +56,8 @@ AboutDialog::AboutDialog()
     // title
     {
         wxStaticText* title = new wxStaticText(this, wxID_ANY, SLIC3R_APP_NAME, wxDefaultPosition, wxDefaultSize);
-        wxFont title_font = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT);
-        title_font.SetWeight(wxFONTWEIGHT_BOLD);
+        wxFont title_font = GUI::wxGetApp().bold_font();// wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT);
+//         title_font.SetWeight(wxFONTWEIGHT_BOLD);
         title_font.SetFamily(wxFONTFAMILY_ROMAN);
         title_font.SetPointSize(24);
         title->SetFont(title_font);
@@ -63,9 +68,9 @@ AboutDialog::AboutDialog()
     {
         auto version_string = _(L("Version"))+ " " + std::string(SLIC3R_VERSION);
         wxStaticText* version = new wxStaticText(this, wxID_ANY, version_string.c_str(), wxDefaultPosition, wxDefaultSize);
-        wxFont version_font = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT);
+        wxFont version_font = GetFont();//wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT);
         #ifdef __WXMSW__
-            version_font.SetPointSize(9);
+        version_font.SetPointSize(/*9*/version_font.GetPointSize()-1);
         #else
             version_font.SetPointSize(11);
         #endif
@@ -74,18 +79,18 @@ AboutDialog::AboutDialog()
     }
     
     // text
-    wxHtmlWindow* html = new wxHtmlWindow(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHW_SCROLLBAR_AUTO/*NEVER*/);
+    m_html = new wxHtmlWindow(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHW_SCROLLBAR_AUTO/*NEVER*/);
     {
-        html->SetMinSize(wxSize(-1, 16 * wxGetApp().em_unit()));
-        wxFont font = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT);
+        m_html->SetMinSize(wxSize(-1, 16 * wxGetApp().em_unit()));
+        wxFont font = GetFont();//GUI::wxGetApp().normal_font(); // wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT);
         const auto text_clr = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT);
 		auto text_clr_str = wxString::Format(wxT("#%02X%02X%02X"), text_clr.Red(), text_clr.Green(), text_clr.Blue());
 		auto bgr_clr_str = wxString::Format(wxT("#%02X%02X%02X"), bgr_clr.Red(), bgr_clr.Green(), bgr_clr.Blue());
 
 		const int fs = font.GetPointSize()-1;
         int size[] = {fs,fs,fs,fs,fs,fs,fs};
-        html->SetFonts(font.GetFaceName(), font.GetFaceName(), size);
-        html->SetBorders(2);
+        m_html->SetFonts(font.GetFaceName(), font.GetFaceName(), size);
+        m_html->SetBorders(2);
 		const auto text = wxString::Format(
             "<html>"
             "<body bgcolor= %s link= %s>"
@@ -101,9 +106,9 @@ AboutDialog::AboutDialog()
             "</font>"
             "</body>"
             "</html>", bgr_clr_str, text_clr_str, text_clr_str);
-        html->SetPage(text);
-        vsizer->Add(html, 1, wxEXPAND | wxBOTTOM, 10);
-        html->Bind(wxEVT_HTML_LINK_CLICKED, &AboutDialog::onLinkClicked, this);
+        m_html->SetPage(text);
+        vsizer->Add(m_html, 1, wxEXPAND | wxBOTTOM, 10);
+        m_html->Bind(wxEVT_HTML_LINK_CLICKED, &AboutDialog::onLinkClicked, this);
     }
     
     wxStdDialogButtonSizer* buttons = this->CreateStdDialogButtonSizer(wxCLOSE);
@@ -118,6 +123,29 @@ AboutDialog::AboutDialog()
 	main_sizer->SetSizeHints(this);
 }
 
+void AboutDialog::on_dpi_changed(const wxRect &suggested_rect)
+{
+    m_logo_bitmap.rescale();
+    m_logo->SetBitmap(m_logo_bitmap.bmp());
+
+    const wxFont& font = GetFont();
+    const int fs = font.GetPointSize() - 1;
+    int font_size[] = { fs, fs, fs, fs, fs, fs, fs };
+    m_html->SetFonts(font.GetFaceName(), font.GetFaceName(), font_size);
+
+    const int& em = em_unit();
+
+    m_html->SetMinSize(wxSize(-1, 16 * em));
+    m_html->Refresh();
+
+    const wxSize& size = wxSize(65 * em, 30 * em);
+
+    SetMinSize(size);
+    SetSize(size);
+
+    Refresh();
+}
+
 void AboutDialog::onLinkClicked(wxHtmlLinkEvent &event)
 {
     wxLaunchDefaultBrowser(event.GetLinkInfo().GetHref());
diff --git a/src/slic3r/GUI/AboutDialog.hpp b/src/slic3r/GUI/AboutDialog.hpp
index 01f7564c5..f74ab52f3 100644
--- a/src/slic3r/GUI/AboutDialog.hpp
+++ b/src/slic3r/GUI/AboutDialog.hpp
@@ -7,6 +7,9 @@
 #include <wx/intl.h>
 #include <wx/html/htmlwin.h>
 
+#include "GUI_Utils.hpp"
+#include "wxExtensions.hpp"
+
 namespace Slic3r { 
 namespace GUI {
 
@@ -20,10 +23,16 @@ private:
     void onRepaint(wxEvent &event);
 };
 
-class AboutDialog : public wxDialog
+class AboutDialog : public DPIDialog
 {
+    PrusaBitmap     m_logo_bitmap;
+    wxHtmlWindow*   m_html;
+    wxStaticBitmap* m_logo;
 public:
     AboutDialog();
+
+protected:
+    void on_dpi_changed(const wxRect &suggested_rect) override;
     
 private:
     void onLinkClicked(wxHtmlLinkEvent &event);
diff --git a/src/slic3r/GUI/BedShapeDialog.cpp b/src/slic3r/GUI/BedShapeDialog.cpp
index 7bbf1ac7f..2762f0db7 100644
--- a/src/slic3r/GUI/BedShapeDialog.cpp
+++ b/src/slic3r/GUI/BedShapeDialog.cpp
@@ -18,6 +18,7 @@ namespace GUI {
 
 void BedShapeDialog::build_dialog(ConfigOptionPoints* default_pt)
 {
+    SetFont(wxGetApp().normal_font());
 	m_panel = new BedShapePanel(this);
 	m_panel->build_panel(default_pt);
 
@@ -36,6 +37,22 @@ void BedShapeDialog::build_dialog(ConfigOptionPoints* default_pt)
 	}));
 }
 
+void BedShapeDialog::on_dpi_changed(const wxRect &suggested_rect)
+{
+    const int& em = em_unit();
+    m_panel->m_shape_options_book->SetMinSize(wxSize(25 * em, -1));
+
+    for (auto og : m_panel->m_optgroups)
+        og->rescale();
+
+    const wxSize& size = wxSize(50 * em, -1);
+
+    SetMinSize(size);
+    SetSize(size);
+
+    Refresh();
+}
+
 void BedShapePanel::build_panel(ConfigOptionPoints* default_pt)
 {
 //  on_change(nullptr);
@@ -125,7 +142,7 @@ ConfigOptionsGroupShp BedShapePanel::init_shape_options_page(wxString title)
 	ConfigOptionsGroupShp optgroup;
 	optgroup = std::make_shared<ConfigOptionsGroup>(panel, _(L("Settings")));
 
-    optgroup->label_width = 10*wxGetApp().em_unit();//100;
+    optgroup->label_width = 10;
 	optgroup->m_on_change = [this](t_config_option_key opt_key, boost::any value) {
 		update_shape();
 	};
diff --git a/src/slic3r/GUI/BedShapeDialog.hpp b/src/slic3r/GUI/BedShapeDialog.hpp
index 538fccc34..72e50a05d 100644
--- a/src/slic3r/GUI/BedShapeDialog.hpp
+++ b/src/slic3r/GUI/BedShapeDialog.hpp
@@ -16,11 +16,8 @@ namespace GUI {
 using ConfigOptionsGroupShp = std::shared_ptr<ConfigOptionsGroup>;
 class BedShapePanel : public wxPanel
 {
-	wxChoicebook*	m_shape_options_book;
 	Bed_2D*			m_canvas;
 
-	std::vector <ConfigOptionsGroupShp>	m_optgroups;
-
 public:
 	BedShapePanel(wxWindow* parent) : wxPanel(parent, wxID_ANY) {}
 	~BedShapePanel() {}
@@ -35,18 +32,25 @@ public:
 	
 	// Returns the resulting bed shape polygon. This value will be stored to the ini file.
 	std::vector<Vec2d>	GetValue() { return m_canvas->m_bed_shape; }
+
+	wxChoicebook*	m_shape_options_book;
+	std::vector <ConfigOptionsGroupShp>	m_optgroups;
+
 };
 
-class BedShapeDialog : public wxDialog
+class BedShapeDialog : public DPIDialog
 {
 	BedShapePanel*	m_panel;
 public:
-	BedShapeDialog(wxWindow* parent) : wxDialog(parent, wxID_ANY, _(L("Bed Shape")),
+	BedShapeDialog(wxWindow* parent) : DPIDialog(parent, wxID_ANY, _(L("Bed Shape")),
         wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER) {}
 	~BedShapeDialog() {}
 
 	void		build_dialog(ConfigOptionPoints* default_pt);
 	std::vector<Vec2d>	GetValue() { return m_panel->GetValue(); }
+
+protected:
+    void on_dpi_changed(const wxRect &suggested_rect) override;
 };
 
 } // GUI
diff --git a/src/slic3r/GUI/BitmapCache.cpp b/src/slic3r/GUI/BitmapCache.cpp
index 551882410..db116a5dd 100644
--- a/src/slic3r/GUI/BitmapCache.cpp
+++ b/src/slic3r/GUI/BitmapCache.cpp
@@ -23,6 +23,8 @@ void BitmapCache::clear()
 {
     for (std::pair<const std::string, wxBitmap*> &bitmap : m_map)
         delete bitmap.second;
+
+    m_map.clear();
 }
 
 static wxBitmap wxImage_to_wxBitmap_with_alpha(wxImage &&image, float scale = 1.0f)
diff --git a/src/slic3r/GUI/ButtonsDescription.cpp b/src/slic3r/GUI/ButtonsDescription.cpp
index fb4c24286..9def34749 100644
--- a/src/slic3r/GUI/ButtonsDescription.cpp
+++ b/src/slic3r/GUI/ButtonsDescription.cpp
@@ -7,6 +7,7 @@
 #include "GUI.hpp"
 #include "GUI_App.hpp"
 #include "I18N.hpp"
+#include "wxExtensions.hpp"
 
 namespace Slic3r {
 namespace GUI {
@@ -23,7 +24,7 @@ ButtonsDescription::ButtonsDescription(wxWindow* parent, t_icon_descriptions* ic
 	// Icon description
 	for (auto pair : *m_icon_descriptions)
 	{
-		auto icon = new wxStaticBitmap(this, wxID_ANY, *pair.first);
+		auto icon = new wxStaticBitmap(this, wxID_ANY, /***/pair.first->bmp());
 		grid_sizer->Add(icon, -1, wxALIGN_CENTRE_VERTICAL);
 
 		std::istringstream f(pair.second);
diff --git a/src/slic3r/GUI/ButtonsDescription.hpp b/src/slic3r/GUI/ButtonsDescription.hpp
index 81baaf191..ccd992406 100644
--- a/src/slic3r/GUI/ButtonsDescription.hpp
+++ b/src/slic3r/GUI/ButtonsDescription.hpp
@@ -4,10 +4,12 @@
 #include <wx/dialog.h>
 #include <vector>
 
+class PrusaBitmap;
+
 namespace Slic3r {
 namespace GUI {
 
-using t_icon_descriptions = std::vector<std::pair<wxBitmap*, std::string>>;
+using t_icon_descriptions = std::vector<std::pair</*wxBitmap*/PrusaBitmap*, std::string>>;
 
 class ButtonsDescription : public wxDialog
 {
diff --git a/src/slic3r/GUI/ConfigSnapshotDialog.cpp b/src/slic3r/GUI/ConfigSnapshotDialog.cpp
index 205e84f57..dd3e46229 100644
--- a/src/slic3r/GUI/ConfigSnapshotDialog.cpp
+++ b/src/slic3r/GUI/ConfigSnapshotDialog.cpp
@@ -95,21 +95,26 @@ static wxString generate_html_page(const Config::SnapshotDB &snapshot_db, const
 }
 
 ConfigSnapshotDialog::ConfigSnapshotDialog(const Config::SnapshotDB &snapshot_db, const wxString &on_snapshot)
-    : wxDialog(NULL, wxID_ANY, _(L("Configuration Snapshots")), wxDefaultPosition, 
+    : DPIDialog(NULL, wxID_ANY, _(L("Configuration Snapshots")), wxDefaultPosition, 
                wxSize(45 * wxGetApp().em_unit(), 40 * wxGetApp().em_unit()), 
                wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER | wxMAXIMIZE_BOX)
 {
+    this->SetFont(wxGetApp().normal_font());
     this->SetBackgroundColour(*wxWHITE);
     
     wxBoxSizer* vsizer = new wxBoxSizer(wxVERTICAL);
     this->SetSizer(vsizer);
 
     // text
-    wxHtmlWindow* html = new wxHtmlWindow(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHW_SCROLLBAR_AUTO);
+    html = new wxHtmlWindow(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHW_SCROLLBAR_AUTO);
     {
-        wxFont font = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT);
+        wxFont font = wxGetApp().normal_font();//wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT);
         #ifdef __WXMSW__
-            int size[] = {8,8,8,8,11,11,11};
+            const int fs = font.GetPointSize();
+            const int fs1 = static_cast<int>(0.8f*fs);
+            const int fs2 = static_cast<int>(1.1f*fs);
+            int size[] = {fs1, fs1, fs1, fs1, fs2, fs2, fs2};
+//             int size[] = {8,8,8,8,11,11,11};
         #else
             int size[] = {11,11,11,11,14,14,14};
         #endif
@@ -127,6 +132,26 @@ ConfigSnapshotDialog::ConfigSnapshotDialog(const Config::SnapshotDB &snapshot_db
     vsizer->Add(buttons, 0, wxEXPAND | wxRIGHT | wxBOTTOM, 3);
 }
 
+void ConfigSnapshotDialog::on_dpi_changed(const wxRect &suggested_rect)
+{
+    wxFont font = GetFont();
+    const int fs = font.GetPointSize();
+    const int fs1 = static_cast<int>(0.8f*fs);
+    const int fs2 = static_cast<int>(1.1f*fs);
+    int font_size[] = { fs1, fs1, fs1, fs1, fs2, fs2, fs2 };
+
+    html->SetFonts(font.GetFaceName(), font.GetFaceName(), font_size);
+    html->Refresh();
+
+    const int& em = em_unit();
+    const wxSize& size = wxSize(45 * em, 40 * em);
+
+    SetMinSize(size);
+    SetSize(size);
+
+    Refresh();
+}
+
 void ConfigSnapshotDialog::onLinkClicked(wxHtmlLinkEvent &event)
 {
     m_snapshot_to_activate = event.GetLinkInfo().GetHref();
diff --git a/src/slic3r/GUI/ConfigSnapshotDialog.hpp b/src/slic3r/GUI/ConfigSnapshotDialog.hpp
index f43fb8ed1..9b8b69ecf 100644
--- a/src/slic3r/GUI/ConfigSnapshotDialog.hpp
+++ b/src/slic3r/GUI/ConfigSnapshotDialog.hpp
@@ -2,6 +2,7 @@
 #define slic3r_GUI_ConfigSnapshotDialog_hpp_
 
 #include "GUI.hpp"
+#include "GUI_Utils.hpp"
 
 #include <wx/wx.h>
 #include <wx/intl.h>
@@ -14,18 +15,23 @@ namespace Config {
 	class SnapshotDB;
 }
 
-class ConfigSnapshotDialog : public wxDialog
+class ConfigSnapshotDialog : public DPIDialog
 {
 public:
     ConfigSnapshotDialog(const Config::SnapshotDB &snapshot_db, const wxString &id);
     const std::string& snapshot_to_activate() const { return m_snapshot_to_activate; }
 
+protected:
+    void on_dpi_changed(const wxRect &suggested_rect) override;
+
 private:
     void onLinkClicked(wxHtmlLinkEvent &event);
     void onCloseDialog(wxEvent &);
 
     // If set, it contains a snapshot ID to be restored after the dialog closes.
     std::string m_snapshot_to_activate;
+
+    wxHtmlWindow* html;
 };
 
 } // namespace GUI
diff --git a/src/slic3r/GUI/ConfigWizard.cpp b/src/slic3r/GUI/ConfigWizard.cpp
index e0bfccf30..571a1dccb 100644
--- a/src/slic3r/GUI/ConfigWizard.cpp
+++ b/src/slic3r/GUI/ConfigWizard.cpp
@@ -642,16 +642,21 @@ void PageTemperatures::apply_custom_config(DynamicPrintConfig &config)
 
 ConfigWizardIndex::ConfigWizardIndex(wxWindow *parent)
     : wxPanel(parent)
-    // XXX: use create_scaled_bitmap:
+    /* #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(PrusaBitmap(parent, "Slic3r_192px_transparent.png", 192))
+    , bullet_black(PrusaBitmap(parent, "bullet_black.png"))
+    , bullet_blue(PrusaBitmap(parent, "bullet_blue.png"))
+    , bullet_white(PrusaBitmap(parent, "bullet_white.png"))
     , item_active(0)
     , item_hover(-1)
     , last_page((size_t)-1)
 {
-    SetMinSize(bg.GetSize());
+    SetMinSize(bg.bmp().GetSize());
 
     const wxSize size = GetTextExtent("m");
     em_w = size.x;
@@ -663,7 +668,10 @@ 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);
     SetSizer(sizer);
@@ -771,8 +779,12 @@ 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;
     const int yoff_text = bullet_h > em_h ? (bullet_h - em_h) / 2 : 0;
     const int yinc = item_height();
@@ -785,10 +797,16 @@ 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); }
+        else if (i > item_active)  { dc.DrawBitmap(bullet_white.bmp(), x, y + yoff_icon, false); }
 
         x += + bullet_w + em_w/2;
         const auto text_size = dc.GetTextExtent(item.label);
@@ -821,6 +839,18 @@ void ConfigWizardIndex::on_mouse_move(wxMouseEvent &evt)
     evt.Skip();
 }
 
+void ConfigWizardIndex::rescale()
+{
+    bg.rescale();
+    SetMinSize(bg.bmp().GetSize());
+    logo->SetBitmap(bg.bmp());
+
+    bullet_black.rescale();
+    bullet_blue.rescale();
+    bullet_white.rescale();
+    Refresh();
+}
+
 
 // priv
 
@@ -995,9 +1025,10 @@ void ConfigWizard::priv::apply_config(AppConfig *app_config, PresetBundle *prese
 // Public
 
 ConfigWizard::ConfigWizard(wxWindow *parent, RunReason reason)
-    : wxDialog(parent, wxID_ANY, _(name().ToStdString()), wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER)
+    : DPIDialog(parent, wxID_ANY, _(name().ToStdString()), wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER)
     , p(new priv(this))
 {
+    this->SetFont(wxGetApp().normal_font());
     p->run_reason = reason;
 
     p->load_vendors();
@@ -1141,5 +1172,11 @@ const wxString& ConfigWizard::name(const bool from_menu/* = false*/)
     return from_menu ? config_wizard_name_menu : config_wizard_name;
 }
 
+void ConfigWizard::on_dpi_changed(const wxRect &suggested_rect)
+{
+    p->index->rescale();
+    Refresh();
+}
+
 }
 }
diff --git a/src/slic3r/GUI/ConfigWizard.hpp b/src/slic3r/GUI/ConfigWizard.hpp
index c9ee05529..b707e525b 100644
--- a/src/slic3r/GUI/ConfigWizard.hpp
+++ b/src/slic3r/GUI/ConfigWizard.hpp
@@ -5,6 +5,8 @@
 
 #include <wx/dialog.h>
 
+#include "GUI_Utils.hpp"
+
 namespace Slic3r {
 
 class PresetBundle;
@@ -13,7 +15,7 @@ class PresetUpdater;
 namespace GUI {
 
 
-class ConfigWizard: public wxDialog
+class ConfigWizard: public DPIDialog
 {
 public:
     // Why is the Wizard run
@@ -35,6 +37,10 @@ public:
     bool run(PresetBundle *preset_bundle, const PresetUpdater *updater);
 
     static const wxString& name(const bool from_menu = false);
+
+protected:
+    void on_dpi_changed(const wxRect &suggested_rect) override ;
+
 private:
     struct priv;
     std::unique_ptr<priv> p;
diff --git a/src/slic3r/GUI/ConfigWizard_private.hpp b/src/slic3r/GUI/ConfigWizard_private.hpp
index 792b92015..06777ba88 100644
--- a/src/slic3r/GUI/ConfigWizard_private.hpp
+++ b/src/slic3r/GUI/ConfigWizard_private.hpp
@@ -210,6 +210,7 @@ public:
     void go_to(ConfigWizardPage *page);
 
     void clear();
+    void rescale();
 
     int em() const { return em_w; }
 private:
@@ -224,18 +225,27 @@ private:
 
     int em_w;
     int em_h;
-
+    /* #ys_FIXME_delete_after_testing by VK 
     const wxBitmap bg;
     const wxBitmap bullet_black;
     const wxBitmap bullet_blue;
     const wxBitmap bullet_white;
+    */
+    PrusaBitmap bg;
+    PrusaBitmap bullet_black;
+    PrusaBitmap bullet_blue;
+    PrusaBitmap bullet_white;
+    wxStaticBitmap* logo;
 
     std::vector<Item> items;
     size_t item_active;
     ssize_t item_hover;
     size_t last_page;
 
+    /* #ys_FIXME_delete_after_testing by VK 
     int item_height() const { return std::max(bullet_black.GetSize().GetHeight(), em_w) + em_w; }
+    */
+    int item_height() const { return std::max(bullet_black.bmp().GetSize().GetHeight(), em_w) + em_w; }
 
     void on_paint(wxPaintEvent &evt);
     void on_mouse_move(wxMouseEvent &evt);
diff --git a/src/slic3r/GUI/Field.cpp b/src/slic3r/GUI/Field.cpp
index 6da0800d9..89310e7c3 100644
--- a/src/slic3r/GUI/Field.cpp
+++ b/src/slic3r/GUI/Field.cpp
@@ -33,21 +33,21 @@ wxString double_to_string(double const value, const int max_precision /*= 4*/)
 void Field::PostInitialize()
 {
 	auto color = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW);
-	m_Undo_btn			= new MyButton(m_parent, wxID_ANY, "", wxDefaultPosition,wxDefaultSize, wxBU_EXACTFIT | wxNO_BORDER);
-	m_Undo_to_sys_btn	= new MyButton(m_parent, wxID_ANY, "", wxDefaultPosition,wxDefaultSize, wxBU_EXACTFIT | wxNO_BORDER);
-	if (wxMSW) {
-		m_Undo_btn->SetBackgroundColour(color);
-		m_Undo_btn->SetBackgroundStyle(wxBG_STYLE_PAINT);
-		m_Undo_to_sys_btn->SetBackgroundColour(color);
-		m_Undo_to_sys_btn->SetBackgroundStyle(wxBG_STYLE_PAINT);
-	}
+	m_Undo_btn			= new RevertButton(m_parent, "bullet_white.png");//(m_parent, wxID_ANY, "", wxDefaultPosition,wxDefaultSize, wxBU_EXACTFIT | wxNO_BORDER);
+	m_Undo_to_sys_btn	= new RevertButton(m_parent, "bullet_white.png");//(m_parent, wxID_ANY, "", wxDefaultPosition,wxDefaultSize, wxBU_EXACTFIT | wxNO_BORDER);
+// 	if (wxMSW) {
+// 		m_Undo_btn->SetBackgroundColour(color);
+// 		m_Undo_btn->SetBackgroundStyle(wxBG_STYLE_PAINT);
+// 		m_Undo_to_sys_btn->SetBackgroundColour(color);
+// 		m_Undo_to_sys_btn->SetBackgroundStyle(wxBG_STYLE_PAINT);
+// 	}
 	m_Undo_btn->Bind(wxEVT_BUTTON, ([this](wxCommandEvent) { on_back_to_initial_value(); }));
 	m_Undo_to_sys_btn->Bind(wxEVT_BUTTON, ([this](wxCommandEvent) { on_back_to_sys_value(); }));
 
 	//set default bitmap
-	wxBitmap bmp = create_scaled_bitmap(m_parent, "bullet_white.png");
-	set_undo_bitmap(&bmp);
-	set_undo_to_sys_bitmap(&bmp);
+// 	wxBitmap bmp = create_scaled_bitmap(m_parent, "bullet_white.png" );
+// 	set_undo_bitmap(&bmp);
+// 	set_undo_to_sys_bitmap(&bmp);
 
 	switch (m_opt.type)
 	{
@@ -65,6 +65,9 @@ void Field::PostInitialize()
 		break;
 	}
 
+    // initialize m_unit_value
+    m_em_unit = em_unit(m_parent);
+
 	BUILD();
 }
 
@@ -212,8 +215,8 @@ bool is_defined_input_value(wxWindow* win, const ConfigOptionType& type)
 
 void TextCtrl::BUILD() {
     auto size = wxSize(wxDefaultSize);
-    if (m_opt.height >= 0) size.SetHeight(m_opt.height);
-    if (m_opt.width >= 0) size.SetWidth(m_opt.width);
+    if (m_opt.height >= 0) size.SetHeight(m_opt.height*m_em_unit);
+    if (m_opt.width >= 0) size.SetWidth(m_opt.width*m_em_unit);
 
 	wxString text_value = wxString(""); 
 
@@ -357,6 +360,21 @@ boost::any& TextCtrl::get_value()
 	return m_value;
 }
 
+void TextCtrl::rescale()
+{
+    Field::rescale();
+    auto size = wxSize(wxDefaultSize);
+    if (m_opt.height >= 0) size.SetHeight(m_opt.height*m_em_unit);
+    if (m_opt.width >= 0) size.SetWidth(m_opt.width*m_em_unit);
+
+    if (size != wxDefaultSize)
+    {
+        wxTextCtrl* field = dynamic_cast<wxTextCtrl*>(window);
+        field->SetMinSize(size);
+    }
+
+}
+
 void TextCtrl::enable() { dynamic_cast<wxTextCtrl*>(window)->Enable(); dynamic_cast<wxTextCtrl*>(window)->SetEditable(true); }
 void TextCtrl::disable() { dynamic_cast<wxTextCtrl*>(window)->Disable(); dynamic_cast<wxTextCtrl*>(window)->SetEditable(false); }
 
@@ -379,7 +397,8 @@ void CheckBox::BUILD() {
 						static_cast<const ConfigOptionBools*>(m_opt.default_value)->get_at(m_opt_idx) : 
     					false;
 
-	auto temp = new wxCheckBox(m_parent, wxID_ANY, wxString(""), wxDefaultPosition, size); 
+	// Set Label as a string of at least one space simbol to correct system scaling of a CheckBox 
+	auto temp = new wxCheckBox(m_parent, wxID_ANY, wxString(" "), wxDefaultPosition, size); 
 	temp->SetFont(Slic3r::GUI::wxGetApp().normal_font());
 	temp->SetBackgroundStyle(wxBG_STYLE_PAINT);
 	temp->SetValue(check_value);
@@ -408,8 +427,8 @@ int undef_spin_val = -9999;		//! Probably, It's not necessary
 
 void SpinCtrl::BUILD() {
 	auto size = wxSize(wxDefaultSize);
-	if (m_opt.height >= 0) size.SetHeight(m_opt.height);
-	if (m_opt.width >= 0) size.SetWidth(m_opt.width);
+    if (m_opt.height >= 0) size.SetHeight(m_opt.height*m_em_unit);
+    if (m_opt.width >= 0) size.SetWidth(m_opt.width*m_em_unit);
 
 	wxString	text_value = wxString("");
 	int			default_value = 0;
@@ -504,10 +523,18 @@ void SpinCtrl::propagate_value()
         on_change_field();
 }
 
+void SpinCtrl::rescale()
+{
+    Field::rescale();
+
+    wxSpinCtrl* field = dynamic_cast<wxSpinCtrl*>(window);
+    field->SetMinSize(wxSize(-1, int(1.9f*field->GetFont().GetPixelSize().y)));
+}
+
 void Choice::BUILD() {
-    wxSize size(15 * wxGetApp().em_unit(), -1);
-	if (m_opt.height >= 0) size.SetHeight(m_opt.height);
-	if (m_opt.width >= 0) size.SetWidth(m_opt.width);
+    wxSize size(m_width * m_em_unit, -1);
+    if (m_opt.height >= 0) size.SetHeight(m_opt.height*m_em_unit);
+    if (m_opt.width >= 0) size.SetWidth(m_opt.width*m_em_unit);
 
 	wxBitmapComboBox* temp;	
     if (!m_opt.gui_type.empty() && m_opt.gui_type.compare("select_open") != 0) {
@@ -816,11 +843,53 @@ boost::any& Choice::get_value()
 	return m_value;
 }
 
+void Choice::rescale()
+{
+    Field::rescale();
+
+    wxBitmapComboBox* field = dynamic_cast<wxBitmapComboBox*>(window);
+
+    const wxString selection = field->GetString(field->GetSelection());
+
+	/* To correct scaling (set new controll size) of a wxBitmapCombobox 
+	 * we need to refill control with new bitmaps. So, in our case : 
+	 * 1. clear conrol
+	 * 2. add content
+	 * 3. add scaled "empty" bitmap to the at least one item
+	 */
+    field->Clear();
+    wxSize size(wxDefaultSize);
+    if (m_opt.height >= 0) size.SetHeight(m_opt.height * m_em_unit);
+    size.SetWidth((m_opt.width > 0 ? m_opt.width : m_width) * m_em_unit);
+    
+    field->SetSize(size);
+
+    size_t idx, counter = idx = 0;
+    if (m_opt.enum_labels.empty() && m_opt.enum_values.empty()) {}
+    else{
+        for (auto el : m_opt.enum_labels.empty() ? m_opt.enum_values : m_opt.enum_labels) {
+            const wxString& str = _(el);
+            field->Append(str);
+            if (el.compare(selection) == 0)
+                idx = counter;
+            ++counter;
+        }
+    }
+
+    wxBitmap empty_bmp(1, field->GetFont().GetPixelSize().y + 2);
+    empty_bmp.SetWidth(0);
+    field->SetItemBitmap(0, empty_bmp);
+
+    idx == m_opt.enum_values.size() ?
+        field->SetValue(selection) :
+        field->SetSelection(idx);
+}
+
 void ColourPicker::BUILD()
 {
 	auto size = wxSize(wxDefaultSize);
-	if (m_opt.height >= 0) size.SetHeight(m_opt.height);
-	if (m_opt.width >= 0) size.SetWidth(m_opt.width);
+    if (m_opt.height >= 0) size.SetHeight(m_opt.height*m_em_unit);
+    if (m_opt.width >= 0) size.SetWidth(m_opt.width*m_em_unit);
 
 	// Validate the color
 	wxString clr_str(static_cast<const ConfigOptionStrings*>(m_opt.default_value)->get_at(m_opt_idx));
@@ -855,7 +924,7 @@ void PointCtrl::BUILD()
 {
 	auto temp = new wxBoxSizer(wxHORIZONTAL);
 
-    const wxSize field_size(4 * wxGetApp().em_unit(), -1);
+    const wxSize field_size(4 * m_em_unit, -1);
 
 	auto default_pt = static_cast<const ConfigOptionPoints*>(m_opt.default_value)->values.at(0);
 	double val = default_pt(0);
@@ -898,6 +967,16 @@ void PointCtrl::BUILD()
 	y_textctrl->SetToolTip(get_tooltip_text(X+", "+Y));
 }
 
+void PointCtrl::rescale()
+{
+    Field::rescale();
+
+    const wxSize field_size(4 * m_em_unit, -1);
+
+    x_textctrl->SetMinSize(field_size);
+    y_textctrl->SetMinSize(field_size);
+}
+
 void PointCtrl::propagate_value(wxTextCtrl* win)
 {
     if (!win->GetValue().empty()) 
@@ -943,8 +1022,8 @@ boost::any& PointCtrl::get_value()
 void StaticText::BUILD()
 {
 	auto size = wxSize(wxDefaultSize);
-	if (m_opt.height >= 0) size.SetHeight(m_opt.height);
-	if (m_opt.width >= 0) size.SetWidth(m_opt.width);
+    if (m_opt.height >= 0) size.SetHeight(m_opt.height*m_em_unit);
+    if (m_opt.width >= 0) size.SetWidth(m_opt.width*m_em_unit);
 
     const wxString legend(static_cast<const ConfigOptionString*>(m_opt.default_value)->value);
     auto temp = new wxStaticText(m_parent, wxID_ANY, legend, wxDefaultPosition, size, wxST_ELLIPSIZE_MIDDLE);
@@ -958,6 +1037,21 @@ void StaticText::BUILD()
 	temp->SetToolTip(get_tooltip_text(legend));
 }
 
+void StaticText::rescale()
+{
+    Field::rescale();
+
+    auto size = wxSize(wxDefaultSize);
+    if (m_opt.height >= 0) size.SetHeight(m_opt.height*m_em_unit);
+    if (m_opt.width >= 0) size.SetWidth(m_opt.width*m_em_unit);
+
+    if (size != wxDefaultSize)
+    {
+        wxStaticText* field = dynamic_cast<wxStaticText*>(window);
+        field->SetSize(size);
+    }
+}
+
 void SliderCtrl::BUILD()
 {
 	auto size = wxSize(wxDefaultSize);
diff --git a/src/slic3r/GUI/Field.hpp b/src/slic3r/GUI/Field.hpp
index 128d60d47..c776cadea 100644
--- a/src/slic3r/GUI/Field.hpp
+++ b/src/slic3r/GUI/Field.hpp
@@ -19,6 +19,7 @@
 #include "libslic3r/Utils.hpp"
 
 #include "GUI.hpp"
+#include "wxExtensions.hpp"
 
 #ifdef __WXMSW__
 #define wxMSW true
@@ -36,19 +37,24 @@ using t_back_to_init = std::function<void(const std::string&)>;
 
 wxString double_to_string(double const value, const int max_precision = 4);
 
-class MyButton : public wxButton
+class RevertButton : public /*wxButton*/PrusaButton
 {
     bool hidden = false; // never show button if it's hidden ones
 public:
-	MyButton() {}
-	MyButton(wxWindow* parent, wxWindowID id, const wxString& label = wxEmptyString,
-		const wxPoint& pos = wxDefaultPosition,
-		const wxSize& size = wxDefaultSize, long style = 0,
-		const wxValidator& validator = wxDefaultValidator,
-		const wxString& name = wxTextCtrlNameStr)
-	{
-		this->Create(parent, id, label, pos, size, style, validator, name);
-	}
+// 	RevertButton() {} 
+// 	RevertButton(wxWindow* parent, wxWindowID id, const wxString& label = wxEmptyString,
+// 		const wxPoint& pos = wxDefaultPosition,
+// 		const wxSize& size = wxDefaultSize, long style = 0,
+// 		const wxValidator& validator = wxDefaultValidator,
+// 		const wxString& name = wxTextCtrlNameStr)
+// 	{
+// 		this->Create(parent, id, label, pos, size, style, validator, name);
+// 	}
+    RevertButton(
+        wxWindow *parent,
+        const std::string& icon_name = ""
+        ) :
+        PrusaButton(parent, wxID_ANY, icon_name) {}
 
 	// overridden from wxWindow base class
 	virtual bool
@@ -154,19 +160,19 @@ public:
 		return std::move(p); //!p;
     }
 
-    bool 	set_undo_bitmap(const wxBitmap *bmp) {
+    bool 	set_undo_bitmap(const /*wxBitmap*/PrusaBitmap *bmp) {
     	if (m_undo_bitmap != bmp) {
     		m_undo_bitmap = bmp;
-    		m_Undo_btn->SetBitmap(*bmp);
+    		m_Undo_btn->SetBitmap_(*bmp);
     		return true;
     	}
     	return false;
     }
 
-    bool 	set_undo_to_sys_bitmap(const wxBitmap *bmp) {
+    bool 	set_undo_to_sys_bitmap(const /*wxBitmap*/PrusaBitmap *bmp) {
     	if (m_undo_to_sys_bitmap != bmp) {
     		m_undo_to_sys_bitmap = bmp;
-    		m_Undo_to_sys_btn->SetBitmap(*bmp);
+    		m_Undo_to_sys_btn->SetBitmap_(*bmp);
     		return true;
     	}
     	return false;
@@ -211,14 +217,22 @@ public:
 		m_side_text = side_text;
     }
 
+    virtual void rescale() {
+        m_Undo_to_sys_btn->rescale();
+        m_Undo_btn->rescale();
+
+        // update em_unit value
+        m_em_unit = em_unit(m_parent);
+    }
+
 protected:
-	MyButton*			m_Undo_btn = nullptr;
+	RevertButton*			m_Undo_btn = nullptr;
 	// Bitmap and Tooltip text for m_Undo_btn. The wxButton will be updated only if the new wxBitmap pointer differs from the currently rendered one.
-	const wxBitmap*		m_undo_bitmap = nullptr;
+	const /*wxBitmap*/PrusaBitmap*		m_undo_bitmap = nullptr;
 	const wxString*		m_undo_tooltip = nullptr;
-	MyButton*			m_Undo_to_sys_btn = nullptr;
+	RevertButton*			m_Undo_to_sys_btn = nullptr;
 	// Bitmap and Tooltip text for m_Undo_to_sys_btn. The wxButton will be updated only if the new wxBitmap pointer differs from the currently rendered one.
-	const wxBitmap*		m_undo_to_sys_bitmap = nullptr;
+    const /*wxBitmap*/PrusaBitmap*		m_undo_to_sys_bitmap = nullptr;
 	const wxString*		m_undo_to_sys_tooltip = nullptr;
 
 	wxStaticText*		m_Label = nullptr;
@@ -230,6 +244,8 @@ protected:
 	// current value
 	boost::any			m_value;
 
+    int                 m_em_unit;
+
     bool    bEnterPressed = false;
     
 	friend class OptionsGroup;
@@ -273,6 +289,8 @@ public:
     }
 
 	boost::any&		get_value() override;
+
+    void            rescale() override;
     
     virtual void	enable();
     virtual void	disable();
@@ -337,6 +355,8 @@ public:
 		return m_value = tmp_value;
 	}
 
+    void            rescale() override;
+
 	void			enable() override { dynamic_cast<wxSpinCtrl*>(window)->Enable(); }
 	void			disable() override { dynamic_cast<wxSpinCtrl*>(window)->Disable(); }
 	wxWindow*		getWindow() override { return window; }
@@ -344,6 +364,7 @@ public:
 
 class Choice : public Field {
 	using Field::Field;
+    int             m_width{ 15 };
 public:
 	Choice(const ConfigOptionDef& opt, const t_config_option_key& id) : Field(opt, id) {}
 	Choice(wxWindow* parent, const ConfigOptionDef& opt, const t_config_option_key& id) : Field(parent, opt, id) {}
@@ -363,6 +384,8 @@ public:
 	void			set_values(const std::vector<std::string> &values);
 	boost::any&		get_value() override;
 
+    void            rescale() override;
+
 	void			enable() override { dynamic_cast<wxBitmapComboBox*>(window)->Enable(); };
 	void			disable() override{ dynamic_cast<wxBitmapComboBox*>(window)->Disable(); };
 	wxWindow*		getWindow() override { return window; }
@@ -414,6 +437,8 @@ public:
 	void			set_value(const boost::any& value, bool change_event = false);
 	boost::any&		get_value() override;
 
+    void            rescale() override;
+
 	void			enable() override {
 		x_textctrl->Enable();
 		y_textctrl->Enable(); }
@@ -446,6 +471,8 @@ public:
 
 	boost::any&		get_value()override { return m_value; }
 
+    void            rescale() override;
+
 	void			enable() override { dynamic_cast<wxStaticText*>(window)->Enable(); };
 	void			disable() override{ dynamic_cast<wxStaticText*>(window)->Disable(); };
 	wxWindow*		getWindow() override { return window; }
diff --git a/src/slic3r/GUI/FirmwareDialog.cpp b/src/slic3r/GUI/FirmwareDialog.cpp
index 8095a3237..4fdc57679 100644
--- a/src/slic3r/GUI/FirmwareDialog.cpp
+++ b/src/slic3r/GUI/FirmwareDialog.cpp
@@ -732,7 +732,7 @@ const char* FirmwareDialog::priv::avr109_dev_name(Avr109Pid usb_pid) {
 // Public
 
 FirmwareDialog::FirmwareDialog(wxWindow *parent) :
-	wxDialog(parent, wxID_ANY, _(L("Firmware flasher")), wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER),
+	GUI::DPIDialog(parent, wxID_ANY, _(L("Firmware flasher")), wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER),
 	p(new priv(this))
 {
 	enum {
@@ -748,7 +748,13 @@ FirmwareDialog::FirmwareDialog(wxWindow *parent) :
 	int min_height = MIN_HEIGHT * em;
 	int min_height_expanded = MIN_HEIGHT_EXPANDED * em;
 
-	wxFont status_font = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT);
+    /* get current font from application, 
+     * because of wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT) function
+     * returns font for primary Display
+     */
+    const wxFont& font = GUI::wxGetApp().normal_font();
+    SetFont(font);
+    wxFont status_font = font;//wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT);
 	status_font.MakeBold();
 	wxFont mono_font(wxFontInfo().Family(wxFONTFAMILY_TELETYPE));
 	mono_font.MakeSmaller();
diff --git a/src/slic3r/GUI/FirmwareDialog.hpp b/src/slic3r/GUI/FirmwareDialog.hpp
index ad048bf5d..a1eac00de 100644
--- a/src/slic3r/GUI/FirmwareDialog.hpp
+++ b/src/slic3r/GUI/FirmwareDialog.hpp
@@ -4,12 +4,13 @@
 #include <memory>
 
 #include <wx/dialog.h>
+#include "GUI_Utils.hpp"
 
 
 namespace Slic3r {
 
 
-class FirmwareDialog: public wxDialog
+class FirmwareDialog: public GUI::DPIDialog
 {
 public:
 	FirmwareDialog(wxWindow *parent);
@@ -20,6 +21,9 @@ public:
 	~FirmwareDialog();
 
 	static void run(wxWindow *parent);
+
+protected:
+    void on_dpi_changed(const wxRect &suggested_rect) override{;}
 private:
 	struct priv;
 	std::unique_ptr<priv> p;
diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp
index 8aa3205a7..cfae43027 100644
--- a/src/slic3r/GUI/GLCanvas3D.cpp
+++ b/src/slic3r/GUI/GLCanvas3D.cpp
@@ -703,6 +703,7 @@ void GLCanvas3D::WarningTexture::activate(WarningTexture::Warning warning, bool
         m_warnings.erase(it);
         if (m_warnings.empty()) { // nothing remains to be shown
             reset();
+            m_msg_text = "";// save information for rescaling
             return;
         }
     }
@@ -723,6 +724,10 @@ void GLCanvas3D::WarningTexture::activate(WarningTexture::Warning warning, bool
     }
 
     _generate(text, canvas, red_colored); // GUI::GLTexture::reset() is called at the beginning of generate(...)
+
+    // save information for rescaling
+    m_msg_text = text;
+    m_is_colored_red = red_colored;
 }
 
 
@@ -791,7 +796,9 @@ bool GLCanvas3D::WarningTexture::_generate(const std::string& msg_utf8, const GL
     wxMemoryDC memDC;
     // select default font
     const float scale = canvas.get_canvas_size().get_scale_factor();
-    wxFont font = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT).Scale(scale);
+//     wxFont font = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT).Scale(scale);
+    wxFont font = wxGetApp().normal_font();//! #ys_FIXME_experiment
+
     font.MakeLarger();
     font.MakeBold();
     memDC.SetFont(font);
@@ -892,6 +899,14 @@ void GLCanvas3D::WarningTexture::render(const GLCanvas3D& canvas) const
     }
 }
 
+void GLCanvas3D::WarningTexture::rescale(const GLCanvas3D& canvas)
+{
+    if (m_msg_text.empty())
+        return;
+
+    _generate(m_msg_text, canvas, m_is_colored_red);
+}
+
 const unsigned char GLCanvas3D::LegendTexture::Squares_Border_Color[3] = { 64, 64, 64 };
 const unsigned char GLCanvas3D::LegendTexture::Default_Background_Color[3] = { (unsigned char)(DEFAULT_BG_LIGHT_COLOR[0] * 255.0f), (unsigned char)(DEFAULT_BG_LIGHT_COLOR[1] * 255.0f), (unsigned char)(DEFAULT_BG_LIGHT_COLOR[2] * 255.0f) };
 const unsigned char GLCanvas3D::LegendTexture::Error_Background_Color[3] = { (unsigned char)(ERROR_BG_LIGHT_COLOR[0] * 255.0f), (unsigned char)(ERROR_BG_LIGHT_COLOR[1] * 255.0f), (unsigned char)(ERROR_BG_LIGHT_COLOR[2] * 255.0f) };
@@ -962,7 +977,8 @@ bool GLCanvas3D::LegendTexture::generate(const GCodePreviewData& preview_data, c
     const int scaled_border = Px_Border * scale;
 
     // select default font
-    wxFont font = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT).Scale(scale_gl);
+//     wxFont font = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT).Scale(scale_gl);
+    wxFont font = wxGetApp().normal_font();//! #ys_FIXME_experiment
 #ifdef __WXMSW__
     // Disabling ClearType works, but the font returned is very different (much thicker) from the default.
 //    msw_disable_cleartype(font);
@@ -3172,6 +3188,11 @@ double GLCanvas3D::get_size_proportional_to_max_bed_size(double factor) const
     return factor * m_bed.get_bounding_box().max_size();
 }
 
+void GLCanvas3D::rescale()
+{
+    m_warning_texture.rescale(*this);
+}
+
 bool GLCanvas3D::_is_shown_on_screen() const
 {
     return (m_canvas != nullptr) ? m_canvas->IsShownOnScreen() : false;
@@ -3816,7 +3837,8 @@ void GLCanvas3D::_render_gizmos_overlay() const
 #if ENABLE_RETINA_GL
     m_gizmos.set_overlay_scale(m_retina_helper->get_scale_factor());
 #else
-    m_gizmos.set_overlay_scale(m_canvas->GetContentScaleFactor());
+//     m_gizmos.set_overlay_scale(m_canvas->GetContentScaleFactor());
+    m_gizmos.set_overlay_scale(wxGetApp().em_unit()*0.1f);//! #ys_FIXME_experiment
 #endif /* __WXMSW__ */
 
     m_gizmos.render_overlay(*this, m_selection);
@@ -3828,7 +3850,8 @@ void GLCanvas3D::_render_toolbar() const
 #if ENABLE_RETINA_GL
     m_toolbar.set_scale(m_retina_helper->get_scale_factor());
 #else
-    m_toolbar.set_scale(m_canvas->GetContentScaleFactor());
+//     m_toolbar.set_scale(m_canvas->GetContentScaleFactor());
+    m_toolbar.set_scale(wxGetApp().em_unit()*0.1f);//! #ys_FIXME_experiment
 #endif // ENABLE_RETINA_GL
 
     Size cnv_size = get_canvas_size();
@@ -3891,7 +3914,8 @@ void GLCanvas3D::_render_view_toolbar() const
 #if ENABLE_RETINA_GL
     m_view_toolbar.set_scale(m_retina_helper->get_scale_factor());
 #else
-    m_view_toolbar.set_scale(m_canvas->GetContentScaleFactor());
+//     m_view_toolbar.set_scale(m_canvas->GetContentScaleFactor());
+    m_view_toolbar.set_scale(wxGetApp().em_unit()*0.1f); //! #ys_FIXME_experiment
 #endif // ENABLE_RETINA_GL
 
     Size cnv_size = get_canvas_size();
diff --git a/src/slic3r/GUI/GLCanvas3D.hpp b/src/slic3r/GUI/GLCanvas3D.hpp
index e81d46f11..32ed94221 100644
--- a/src/slic3r/GUI/GLCanvas3D.hpp
+++ b/src/slic3r/GUI/GLCanvas3D.hpp
@@ -353,6 +353,9 @@ private:
         void activate(WarningTexture::Warning warning, bool state, const GLCanvas3D& canvas);
         void render(const GLCanvas3D& canvas) const;
 
+        // function used to get an information for rescaling of the warning
+        void rescale(const GLCanvas3D& canvas);
+
     private:
         static const unsigned char Background_Color[3];
         static const unsigned char Opacity;
@@ -360,6 +363,10 @@ private:
         int m_original_width;
         int m_original_height;
 
+        // information for rescaling of the warning legend
+        std::string     m_msg_text = "";
+        bool            m_is_colored_red{false};
+
         // Information about which warnings are currently active.
         std::vector<Warning> m_warnings;
 
@@ -587,6 +594,8 @@ public:
 
     double get_size_proportional_to_max_bed_size(double factor) const;
 
+    void rescale();
+
 private:
     bool _is_shown_on_screen() const;
 
diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp
index 62b8581be..154b4475f 100644
--- a/src/slic3r/GUI/GUI_App.cpp
+++ b/src/slic3r/GUI/GUI_App.cpp
@@ -325,6 +325,17 @@ void GUI_App::init_fonts()
 #endif /*__WXMAC__*/
 }
 
+void GUI_App::update_fonts()
+{
+    /* Only normal and bold fonts are used for an application rescale,
+     * because of under MSW small and normal fonts are the same.
+     * To avoid same rescaling twice, just fill this values
+     * from rescaled MainFrame
+     */
+    m_normal_font   = mainframe->normal_font();
+    m_bold_font     = mainframe->normal_font().Bold();
+}
+
 void GUI_App::set_label_clr_modified(const wxColour& clr) {
     m_color_label_modified = clr;
     auto clr_str = wxString::Format(wxT("#%02X%02X%02X"), clr.Red(), clr.Green(), clr.Blue());
@@ -669,6 +680,12 @@ void GUI_App::add_config_menu(wxMenuBar *menu)
             // Take a configuration snapshot.
             if (check_unsaved_changes()) {
                 wxTextEntryDialog dlg(nullptr, _(L("Taking configuration snapshot")), _(L("Snapshot name")));
+                
+                // set current normal font for dialog children, 
+                // because of just dlg.SetFont(normal_font()) has no result;
+                for (auto child : dlg.GetChildren())
+                    child->SetFont(normal_font());
+
                 if (dlg.ShowModal() == wxID_OK)
                     app_config->set("on_snapshot",
                     Slic3r::GUI::Config::SnapshotDB::singleton().take_snapshot(
@@ -718,7 +735,6 @@ void GUI_App::add_config_menu(wxMenuBar *menu)
             get_installed_languages(names, identifiers);
             if (select_language(names, identifiers)) {
                 save_language();
-//                 show_info(mainframe->m_tabpanel, _(L("Application will be restarted")), _(L("Attention!")));
                 _3DScene::remove_all_canvases();// remove all canvas before recreate GUI
                 recreate_GUI();
             }
diff --git a/src/slic3r/GUI/GUI_App.hpp b/src/slic3r/GUI/GUI_App.hpp
index 3537f98e4..d3c9e0afa 100644
--- a/src/slic3r/GUI/GUI_App.hpp
+++ b/src/slic3r/GUI/GUI_App.hpp
@@ -98,6 +98,7 @@ public:
     void            init_label_colours();
     void            update_label_colours_from_appconfig();
     void            init_fonts();
+    void            update_fonts();
     void            set_label_clr_modified(const wxColour& clr);
     void            set_label_clr_sys(const wxColour& clr);
 
diff --git a/src/slic3r/GUI/GUI_ObjectList.cpp b/src/slic3r/GUI/GUI_ObjectList.cpp
index fe8b13fb7..ff6094f70 100644
--- a/src/slic3r/GUI/GUI_ObjectList.cpp
+++ b/src/slic3r/GUI/GUI_ObjectList.cpp
@@ -203,7 +203,7 @@ void ObjectList::set_tooltip_for_item(const wxPoint& pt)
     if (col->GetTitle() == " " && GetSelectedItemsCount()<2)
         GetMainWindow()->SetToolTip(_(L("Right button click the icon to change the object settings")));
     else if (col->GetTitle() == _("Name") &&
-        m_objects_model->GetBitmap(item).GetRefData() == m_bmp_manifold_warning.GetRefData()) {
+        m_objects_model->GetBitmap(item).GetRefData() == m_bmp_manifold_warning.bmp().GetRefData()) {
         int obj_idx = m_objects_model->GetIdByItem(item);
         auto& stats = (*m_objects)[obj_idx]->volumes[0]->mesh.stl.stats;
         int errors = stats.degenerate_facets + stats.edges_fixed + stats.facets_removed +
@@ -395,27 +395,83 @@ void ObjectList::update_name_in_model(const wxDataViewItem& item) const
 
 void ObjectList::init_icons()
 {
-    m_bmp_modifiermesh     = create_scaled_bitmap(nullptr, "add_modifier");
-    m_bmp_solidmesh        = create_scaled_bitmap(nullptr, "add_part");
-    m_bmp_support_enforcer = create_scaled_bitmap(nullptr, "support_enforcer");
-    m_bmp_support_blocker  = create_scaled_bitmap(nullptr, "support_blocker");
+//     m_bmp_modifiermesh      = create_scaled_bitmap(nullptr, "add_modifier");
+//     m_bmp_solidmesh         = create_scaled_bitmap(nullptr, "add_part");
+//     m_bmp_support_enforcer  = create_scaled_bitmap(nullptr, "support_enforcer");
+//     m_bmp_support_blocker   = create_scaled_bitmap(nullptr, "support_blocker");
+// 
+// 
+//     m_bmp_vector.reserve(4); // bitmaps for different types of parts 
+//     m_bmp_vector.push_back(&m_bmp_solidmesh);         
+//     m_bmp_vector.push_back(&m_bmp_modifiermesh);      
+//     m_bmp_vector.push_back(&m_bmp_support_enforcer);  
+//     m_bmp_vector.push_back(&m_bmp_support_blocker);   
 
+    m_bmp_modifiermesh      = PrusaBitmap(nullptr, "add_modifier");    // Add part 
+    m_bmp_solidmesh         = PrusaBitmap(nullptr, "add_part");        // Add modifier 
+    m_bmp_support_enforcer  = PrusaBitmap(nullptr, "support_enforcer");// Add support enforcer 
+    m_bmp_support_blocker   = PrusaBitmap(nullptr, "support_blocker"); // Add support blocker  
 
     m_bmp_vector.reserve(4); // bitmaps for different types of parts 
-    m_bmp_vector.push_back(&m_bmp_solidmesh);         // Add part
-    m_bmp_vector.push_back(&m_bmp_modifiermesh);      // Add modifier
-    m_bmp_vector.push_back(&m_bmp_support_enforcer);  // Add support enforcer
-    m_bmp_vector.push_back(&m_bmp_support_blocker);   // Add support blocker
+    m_bmp_vector.push_back(&m_bmp_solidmesh.bmp());         
+    m_bmp_vector.push_back(&m_bmp_modifiermesh.bmp());      
+    m_bmp_vector.push_back(&m_bmp_support_enforcer.bmp());  
+    m_bmp_vector.push_back(&m_bmp_support_blocker.bmp());   
+
+
+    // Set volumes default bitmaps for the model
     m_objects_model->SetVolumeBitmaps(m_bmp_vector);
 
     // init icon for manifold warning
-    m_bmp_manifold_warning  = create_scaled_bitmap(nullptr, "exclamation");
+    m_bmp_manifold_warning  = /*create_scaled_bitmap*/PrusaBitmap(nullptr, "exclamation");
 
     // init bitmap for "Split to sub-objects" context menu
-    m_bmp_split             = create_scaled_bitmap(nullptr, "split_parts_SMALL");
+    m_bmp_split             = /*create_scaled_bitmap*/PrusaBitmap(nullptr, "split_parts_SMALL");
 
     // init bitmap for "Add Settings" context menu
-    m_bmp_cog               = create_scaled_bitmap(nullptr, "cog");
+    m_bmp_cog               = /*create_scaled_bitmap*/PrusaBitmap(nullptr, "cog");
+}
+
+void ObjectList::rescale_icons()
+{
+    m_bmp_vector.clear();
+    m_bmp_vector.reserve(4); // bitmaps for different types of parts 
+    for (PrusaBitmap* bitmap : std::vector<PrusaBitmap*> {
+                                    &m_bmp_modifiermesh,         // Add part
+                                    &m_bmp_solidmesh,             // Add modifier
+                                    &m_bmp_support_enforcer,     // Add support enforcer
+                                    &m_bmp_support_blocker })    // Add support blocker                                                           
+    {
+        bitmap->rescale();
+        m_bmp_vector.push_back(& bitmap->bmp());
+    }
+    // Set volumes default bitmaps for the model
+    m_objects_model->SetVolumeBitmaps(m_bmp_vector);
+
+    m_bmp_manifold_warning.rescale();
+    m_bmp_split.rescale();
+    m_bmp_cog.rescale();
+
+
+    // Update CATEGORY_ICON according to new scale
+    {
+        // Note: `this` isn't passed to create_scaled_bitmap() here because of bugs in the widget,
+        // see note in PresetBundle::load_compatible_bitmaps()
+
+        // ptFFF
+        CATEGORY_ICON[L("Layers and Perimeters")]    = create_scaled_bitmap(nullptr, "layers");
+        CATEGORY_ICON[L("Infill")]                   = create_scaled_bitmap(nullptr, "infill");
+        CATEGORY_ICON[L("Support material")]         = create_scaled_bitmap(nullptr, "support");
+        CATEGORY_ICON[L("Speed")]                    = create_scaled_bitmap(nullptr, "time");
+        CATEGORY_ICON[L("Extruders")]                = create_scaled_bitmap(nullptr, "funnel");
+        CATEGORY_ICON[L("Extrusion Width")]          = create_scaled_bitmap(nullptr, "funnel");
+//         CATEGORY_ICON[L("Skirt and brim")]          = create_scaled_bitmap(nullptr, "skirt+brim"); 
+//         CATEGORY_ICON[L("Speed > Acceleration")]    = create_scaled_bitmap(nullptr, "time");
+        CATEGORY_ICON[L("Advanced")]                 = create_scaled_bitmap(nullptr, "wrench");
+        // ptSLA
+        CATEGORY_ICON[L("Supports")]                 = create_scaled_bitmap(nullptr, "support"/*"sla_supports"*/);
+        CATEGORY_ICON[L("Pad")]                      = create_scaled_bitmap(nullptr, "pad");
+    }
 }
 
 
@@ -531,7 +587,7 @@ void ObjectList::OnContextMenu(wxDataViewEvent&)
     if (title == " ")
         show_context_menu();
     else if (title == _("Name") && pt.x >15 &&
-             m_objects_model->GetBitmap(item).GetRefData() == m_bmp_manifold_warning.GetRefData())
+             m_objects_model->GetBitmap(item).GetRefData() == m_bmp_manifold_warning.bmp().GetRefData())
     {
         if (is_windows10())
             fix_through_netfabb();
@@ -996,7 +1052,7 @@ void ObjectList::append_menu_items_add_volume(wxMenu* menu)
 wxMenuItem* ObjectList::append_menu_item_split(wxMenu* menu) 
 {
     return append_menu_item(menu, wxID_ANY, _(L("Split to parts")), "",
-        [this](wxCommandEvent&) { split(); }, m_bmp_split, menu);
+        [this](wxCommandEvent&) { split(); }, m_bmp_split.bmp(), menu);
 }
 
 wxMenuItem* ObjectList::append_menu_item_settings(wxMenu* menu_) 
@@ -1061,7 +1117,7 @@ wxMenuItem* ObjectList::append_menu_item_settings(wxMenu* menu_)
 
     // Add full settings list
     auto  menu_item = new wxMenuItem(menu, wxID_ANY, menu_name);
-    menu_item->SetBitmap(m_bmp_cog);
+    menu_item->SetBitmap(m_bmp_cog.bmp());
 
     menu_item->SetSubMenu(create_settings_popupmenu(menu));
 
@@ -1808,7 +1864,7 @@ void ObjectList::add_object_to_list(size_t obj_idx)
         stats.facets_added + stats.facets_reversed + stats.backwards_edges;
     if (errors > 0) {
         wxVariant variant;
-        variant << PrusaDataViewBitmapText(item_name, m_bmp_manifold_warning);
+        variant << PrusaDataViewBitmapText(item_name, m_bmp_manifold_warning.bmp());
         m_objects_model->SetValue(variant, item, 0);
     }
 
@@ -2661,6 +2717,24 @@ void ObjectList::update_item_error_icon(const int obj_idx, const int vol_idx) co
     }
 }
 
+void ObjectList::rescale()
+{
+    // update min size !!! A width of control shouldn't be a wxDefaultCoord
+    SetMinSize(wxSize(1, 15 * wxGetApp().em_unit()));
+
+    GetColumn(0)->SetWidth(19 * wxGetApp().em_unit());
+    GetColumn(1)->SetWidth(8 * wxGetApp().em_unit());
+    GetColumn(2)->SetWidth(int(2 * wxGetApp().em_unit()));
+
+    // rescale all icons, used by ObjectList
+    rescale_icons();
+
+    // rescale/update existingitems with bitmaps
+    m_objects_model->Rescale();
+
+    Layout();
+}
+
 void ObjectList::ItemValueChanged(wxDataViewEvent &event)
 {
     if (event.GetColumn() == 0)
diff --git a/src/slic3r/GUI/GUI_ObjectList.hpp b/src/slic3r/GUI/GUI_ObjectList.hpp
index 7b3b2c744..9421c79c7 100644
--- a/src/slic3r/GUI/GUI_ObjectList.hpp
+++ b/src/slic3r/GUI/GUI_ObjectList.hpp
@@ -108,13 +108,13 @@ class ObjectList : public wxDataViewCtrl
     wxBoxSizer          *m_sizer {nullptr};
     wxWindow            *m_parent {nullptr};
 
-    wxBitmap	m_bmp_modifiermesh;
-    wxBitmap	m_bmp_solidmesh;
-    wxBitmap	m_bmp_support_enforcer;
-    wxBitmap	m_bmp_support_blocker;
-    wxBitmap	m_bmp_manifold_warning;
-    wxBitmap	m_bmp_cog;
-    wxBitmap	m_bmp_split;
+    /*wxBitmap*/PrusaBitmap	m_bmp_modifiermesh;
+    /*wxBitmap*/PrusaBitmap	m_bmp_solidmesh;
+    /*wxBitmap*/PrusaBitmap	m_bmp_support_enforcer;
+    /*wxBitmap*/PrusaBitmap	m_bmp_support_blocker;
+    /*wxBitmap*/PrusaBitmap	m_bmp_manifold_warning;
+    /*wxBitmap*/PrusaBitmap	m_bmp_cog;
+    /*wxBitmap*/PrusaBitmap	m_bmp_split;
 
     PrusaMenu   m_menu_object;
     PrusaMenu   m_menu_part;
@@ -125,7 +125,7 @@ class ObjectList : public wxDataViewCtrl
     wxMenuItem* m_menu_item_settings { nullptr };
     wxMenuItem* m_menu_item_split_instances { nullptr };
 
-    std::vector<wxBitmap*> m_bmp_vector;
+    std::vector<wxBitmap* /*const wxBitmap&*/> m_bmp_vector;
 
     int			m_selected_object_id = -1;
     bool		m_prevent_list_events = false;		// We use this flag to avoid circular event handling Select() 
@@ -176,6 +176,7 @@ public:
     void                update_extruder_values_for_items(const int max_extruder);
 
     void                init_icons();
+    void                rescale_icons();
 
     void                set_tooltip_for_item(const wxPoint& pt);
 
@@ -288,6 +289,8 @@ public:
     void paste_volumes_into_list(int obj_idx, const ModelVolumePtrs& volumes);
     void paste_objects_into_list(const std::vector<size_t>& object_idxs);
 
+    void rescale();
+
 private:
     void OnChar(wxKeyEvent& event);
     void OnContextMenu(wxDataViewEvent &event);
diff --git a/src/slic3r/GUI/GUI_ObjectManipulation.cpp b/src/slic3r/GUI/GUI_ObjectManipulation.cpp
index f9284a19b..526b07578 100644
--- a/src/slic3r/GUI/GUI_ObjectManipulation.cpp
+++ b/src/slic3r/GUI/GUI_ObjectManipulation.cpp
@@ -23,7 +23,7 @@ ObjectManipulation::ObjectManipulation(wxWindow* parent) :
 #endif // __APPLE__
 {
     m_og->set_name(_(L("Object Manipulation")));
-    m_og->label_width = 12 * wxGetApp().em_unit();//125;
+    m_og->label_width = 12;//125;
     m_og->set_grid_vgap(5);
     
     m_og->m_on_change = std::bind(&ObjectManipulation::on_change, this, std::placeholders::_1, std::placeholders::_2);
@@ -45,11 +45,11 @@ ObjectManipulation::ObjectManipulation(wxWindow* parent) :
     def.label = L("Name");
     def.gui_type = "legend";
     def.tooltip = L("Object name");
-    def.width = 21 * wxGetApp().em_unit();
+    def.width = 21;
     def.default_value = new ConfigOptionString{ " " };
     m_og->append_single_option_line(Option(def, "object_name"));
 
-    const int field_width = 5 * wxGetApp().em_unit()/*50*/;
+    const int field_width = 5;
 
     // Legend for object modification
     auto line = Line{ "", "" };
@@ -117,15 +117,13 @@ ObjectManipulation::ObjectManipulation(wxWindow* parent) :
     m_og->append_line(add_og_to_object_settings(L("Scale"), "%"), &m_scale_Label);
     m_og->append_line(add_og_to_object_settings(L("Size"), "mm"));
 
-    /* Unused parameter at this time
-    def.label = L("Place on bed");
-    def.type = coBool;
-    def.tooltip = L("Automatic placing of models on printing bed in Y axis");
-    def.gui_type = "";
-    def.sidetext = "";
-    def.default_value = new ConfigOptionBool{ false };
-    m_og->append_single_option_line(Option(def, "place_on_bed"));
-    */
+    // call back for a rescale of button "Set uniform scale"
+    m_og->rescale_near_label_widget = [this](wxWindow* win) {
+        auto *ctrl = dynamic_cast<PrusaLockButton*>(win);
+        if (ctrl == nullptr)
+            return;
+        ctrl->rescale();
+    };
 }
 
 void ObjectManipulation::Show(const bool show)
diff --git a/src/slic3r/GUI/GUI_ObjectSettings.cpp b/src/slic3r/GUI/GUI_ObjectSettings.cpp
index 1c5ca5a32..b8c0c41ae 100644
--- a/src/slic3r/GUI/GUI_ObjectSettings.cpp
+++ b/src/slic3r/GUI/GUI_ObjectSettings.cpp
@@ -59,6 +59,8 @@ ObjectSettings::ObjectSettings(wxWindow* parent) :
 
     m_settings_list_sizer = new wxBoxSizer(wxVERTICAL);
     m_og->sizer->Add(m_settings_list_sizer, 1, wxEXPAND | wxLEFT, 5);
+
+    m_bmp_delete = PrusaBitmap(parent, "cross");
 }
 
 void ObjectSettings::update_settings_list()
@@ -77,11 +79,12 @@ void ObjectSettings::update_settings_list()
 		{
 			auto opt_key = (line.get_options())[0].opt_id;  //we assume that we have one option per line
 
-			auto btn = new wxBitmapButton(parent, wxID_ANY, create_scaled_bitmap(m_parent, "cross"/*"colorchange_delete_on.png"*/),
-				wxDefaultPosition, wxDefaultSize, wxBORDER_NONE);
-#ifdef __WXMSW__
-            btn->SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW));
-#endif // __WXMSW__
+// 			auto btn = new wxBitmapButton(parent, wxID_ANY, create_scaled_bitmap(m_parent, "cross"/*"colorchange_delete_on.png"*/),
+// 				wxDefaultPosition, wxDefaultSize, wxBORDER_NONE);
+			auto btn = new PrusaButton(parent, wxID_ANY, m_bmp_delete);
+//#ifdef __WXMSW__
+//            btn->SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW));
+//#endif // __WXMSW__
 			btn->Bind(wxEVT_BUTTON, [opt_key, config, this](wxEvent &event) {
 				config->erase(opt_key);
                 wxGetApp().obj_list()->changed_object();
@@ -123,8 +126,8 @@ void ObjectSettings::update_settings_list()
                     continue;
 
                 auto optgroup = std::make_shared<ConfigOptionsGroup>(m_og->ctrl_parent(), cat.first, config, false, extra_column);
-                optgroup->label_width = 15 * wxGetApp().em_unit();
-                optgroup->sidetext_width = 5.5 * wxGetApp().em_unit();
+                optgroup->label_width = 15;
+                optgroup->sidetext_width = 5.5;
 
                 optgroup->m_on_change = [](const t_config_option_key& opt_id, const boost::any& value) {
                                         wxGetApp().obj_list()->changed_object(); };
@@ -134,11 +137,20 @@ void ObjectSettings::update_settings_list()
                     if (opt == "extruder")
                         continue;
                     Option option = optgroup->get_option(opt);
-                    option.opt.width = 12 * wxGetApp().em_unit();
+                    option.opt.width = 12;
                     optgroup->append_single_option_line(option);
                 }
                 optgroup->reload_config();
                 m_settings_list_sizer->Add(optgroup->sizer, 0, wxEXPAND | wxALL, 0);
+
+                // call back for rescaling of the extracolumn control
+                optgroup->rescale_extra_column_item = [this](wxWindow* win) {
+                    auto *ctrl = dynamic_cast<PrusaButton*>(win);
+                    if (ctrl == nullptr)
+                        return;
+                    ctrl->SetBitmap_(m_bmp_delete);
+                };
+
                 m_og_settings.push_back(optgroup);
 
                 categories.push_back(cat.first);
@@ -163,5 +175,13 @@ void ObjectSettings::UpdateAndShow(const bool show)
     OG_Settings::UpdateAndShow(show);
 }
 
+void ObjectSettings::rescale()
+{
+    m_bmp_delete.rescale();
+
+    for (auto group : m_og_settings)
+        group->rescale();
+}
+
 } //namespace GUI
 } //namespace Slic3r 
\ No newline at end of file
diff --git a/src/slic3r/GUI/GUI_ObjectSettings.hpp b/src/slic3r/GUI/GUI_ObjectSettings.hpp
index 12115e208..17accda18 100644
--- a/src/slic3r/GUI/GUI_ObjectSettings.hpp
+++ b/src/slic3r/GUI/GUI_ObjectSettings.hpp
@@ -4,6 +4,7 @@
 #include <memory>
 #include <vector>
 #include <wx/panel.h>
+#include "wxExtensions.hpp"
 
 class wxBoxSizer;
 
@@ -37,12 +38,15 @@ class ObjectSettings : public OG_Settings
     // option groups for settings
     std::vector <std::shared_ptr<ConfigOptionsGroup>> m_og_settings;
 
+    PrusaBitmap m_bmp_delete;
+
 public:
     ObjectSettings(wxWindow* parent);
     ~ObjectSettings() {}
 
     void        update_settings_list();
     void        UpdateAndShow(const bool show) override;
+    void        rescale();
 };
 
 }}
diff --git a/src/slic3r/GUI/GUI_Preview.cpp b/src/slic3r/GUI/GUI_Preview.cpp
index 206253451..e4ba4922e 100644
--- a/src/slic3r/GUI/GUI_Preview.cpp
+++ b/src/slic3r/GUI/GUI_Preview.cpp
@@ -396,6 +396,18 @@ void Preview::refresh_print()
     load_print(true);
 }
 
+void Preview::rescale()
+{
+    // rescale slider
+    if (m_slider) m_slider->rescale();
+
+    // rescale warning legend on the canvas
+    get_canvas3d()->rescale();
+
+    // rescale legend
+    refresh_print();
+}
+
 void Preview::bind_event_handlers()
 {
     this->Bind(wxEVT_SIZE, &Preview::on_size, this);
diff --git a/src/slic3r/GUI/GUI_Preview.hpp b/src/slic3r/GUI/GUI_Preview.hpp
index a2929f2e6..8e5bd2bd1 100644
--- a/src/slic3r/GUI/GUI_Preview.hpp
+++ b/src/slic3r/GUI/GUI_Preview.hpp
@@ -120,6 +120,8 @@ public:
     void reload_print(bool keep_volumes = false);
     void refresh_print();
 
+    void rescale();
+
 private:
     bool init(wxWindow* parent, Bed3D& bed, Camera& camera, GLToolbar& view_toolbar, Model* model);
 
diff --git a/src/slic3r/GUI/GUI_Utils.hpp b/src/slic3r/GUI/GUI_Utils.hpp
index 5418ea430..25cf25b16 100644
--- a/src/slic3r/GUI/GUI_Utils.hpp
+++ b/src/slic3r/GUI/GUI_Utils.hpp
@@ -59,35 +59,119 @@ public:
         : P(parent, id, title, pos, size, style, name)
     {
         m_scale_factor = (float)get_dpi_for_window(this) / (float)DPI_DEFAULT;
+        m_normal_font = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT);
+        // An analog of em_unit value from GUI_App.
+        m_em_unit = std::max<size_t>(10, 10 * m_scale_factor);
+
+        m_prev_scale_factor = m_scale_factor;
+
         recalc_font();
 
         this->Bind(EVT_DPI_CHANGED, [this](const DpiChangedEvent &evt) {
             m_scale_factor = (float)evt.dpi / (float)DPI_DEFAULT;
-            on_dpi_changed(evt.rect);
+
+            if (!m_can_rescale)
+                return;
+
+            if (is_new_scale_factor())
+                rescale(evt.rect);
+        });
+
+        this->Bind(wxEVT_MOVE_START, [this](wxMoveEvent& event)
+        {
+            event.Skip();
+
+            // Suppress application rescaling, when a MainFrame moving is not ended
+            m_can_rescale = false;
+        });
+
+        this->Bind(wxEVT_MOVE_END, [this](wxMoveEvent& event)
+        {
+            event.Skip();
+
+            m_can_rescale = is_new_scale_factor();
+
+            // If scale factor is different after moving of MainFrame ...
+            if (m_can_rescale)
+                // ... rescale application
+                rescale(event.GetRect());
+            else
+            // set value to _true_ in purpose of possibility of a display dpi changing from System Settings
+                m_can_rescale = true;
         });
     }
 
     virtual ~DPIAware() {}
 
-    float scale_factor() const { return m_scale_factor; }
-    int em_unit() const { return m_em_unit; }
-    int font_size() const { return m_font_size; }
+    float   scale_factor() const        { return m_scale_factor; }
+    float   prev_scale_factor() const   { return m_prev_scale_factor; }
+
+    int     em_unit() const             { return m_em_unit; }
+    int     font_size() const           { return m_font_size; }
+    const wxFont& normal_font() const   { return m_normal_font; }
 
 protected:
     virtual void on_dpi_changed(const wxRect &suggested_rect) = 0;
 
 private:
-    int m_scale_factor;
+    float m_scale_factor;
     int m_em_unit;
     int m_font_size;
 
+    wxFont m_normal_font;
+    float m_prev_scale_factor;
+    bool  m_can_rescale{ true };
+
     void recalc_font()
     {
         wxClientDC dc(this);
         const auto metrics = dc.GetFontMetrics();
         m_font_size = metrics.height;
-        m_em_unit = metrics.averageWidth;
+//         m_em_unit = metrics.averageWidth;
     }
+
+    // check if new scale is differ from previous
+    bool    is_new_scale_factor() const { return fabs(m_scale_factor - m_prev_scale_factor) > 0.001; }
+
+    // recursive function for scaling fonts for all controls in Window
+    void    scale_controls_fonts(wxWindow *window, const float scale_f)
+    {
+        auto children = window->GetChildren();
+
+        for (auto child : children) {
+            scale_controls_fonts(child, scale_f);
+            child->SetFont(child->GetFont().Scaled(scale_f));
+        }
+
+        window->Layout();
+    }
+
+    void    rescale(const wxRect &suggested_rect)
+    {
+        this->Freeze();
+        const float relative_scale_factor = m_scale_factor / m_prev_scale_factor;
+
+        // rescale fonts of all controls
+        scale_controls_fonts(this, relative_scale_factor);
+        this->SetFont(this->GetFont().Scaled(relative_scale_factor));
+
+
+        // rescale normal_font value
+        m_normal_font = m_normal_font.Scaled(relative_scale_factor);
+
+        // An analog of em_unit value from GUI_App.
+        m_em_unit = std::max<size_t>(10, 10 * m_scale_factor);
+
+        // rescale missed controls sizes and images
+        on_dpi_changed(suggested_rect);
+
+        this->Layout();
+        this->Thaw();
+
+        // reset previous scale factor from current scale factor value
+        m_prev_scale_factor = m_scale_factor;
+    }
+
 };
 
 typedef DPIAware<wxFrame> DPIFrame;
diff --git a/src/slic3r/GUI/KBShortcutsDialog.cpp b/src/slic3r/GUI/KBShortcutsDialog.cpp
index 65abba319..9a4561f07 100644
--- a/src/slic3r/GUI/KBShortcutsDialog.cpp
+++ b/src/slic3r/GUI/KBShortcutsDialog.cpp
@@ -10,26 +10,28 @@ namespace Slic3r {
 namespace GUI {
 
 KBShortcutsDialog::KBShortcutsDialog()
-    : wxDialog(NULL, wxID_ANY, wxString(SLIC3R_APP_NAME) + " - " + _(L("Keyboard Shortcuts")), wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER)
+    : DPIDialog(NULL, wxID_ANY, wxString(SLIC3R_APP_NAME) + " - " + _(L("Keyboard Shortcuts")), 
+     wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER)
 {
-	SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW));    
+	SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW));
 
-	auto main_sizer = new wxBoxSizer(wxVERTICAL);
+	main_sizer = new wxBoxSizer(wxVERTICAL);
 
     // logo
-	const wxBitmap logo_bmp = create_scaled_bitmap(this, "Slic3r_32px.png", 32);
+    m_logo_bmp = PrusaBitmap(this, "Slic3r_32px.png", 32);
 
     // fonts
-    wxFont head_font = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT).Bold();
+    const wxFont& font = wxGetApp().normal_font();
+    const wxFont& bold_font = wxGetApp().bold_font();   
+    SetFont(font);
+
+    wxFont head_font = bold_font;// wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT).Bold();
 #ifdef __WXOSX__
     head_font.SetPointSize(14);
 #else
-    head_font.SetPointSize(12);
+    head_font.SetPointSize(/*12*/bold_font.GetPointSize() + 2);
 #endif // __WXOSX__
 
-    const wxFont& font = wxGetApp().small_font();
-    const wxFont& bold_font = wxGetApp().bold_font();
-
     fill_shortcuts();
 
     auto panel = new wxPanel(this);
@@ -43,22 +45,25 @@ KBShortcutsDialog::KBShortcutsDialog()
     wxBoxSizer* r_sizer = new wxBoxSizer(wxVERTICAL);
     main_grid_sizer->Add(r_sizer, 0);
 
+    m_head_bitmaps.reserve(m_full_shortcuts.size());
+    const wxSize topic_size = wxSize(10 * wxGetApp().em_unit(), -1);
+
     for (auto& sc : m_full_shortcuts)
     {
-//         auto sizer = sc.first == _(L("Main Shortcuts")) ? l_sizer : r_sizer;
-        auto sizer = sc.second.second == 0 ? l_sizer : r_sizer;
+        auto sizer = sc.second.second == szLeft ? l_sizer : r_sizer;
         wxBoxSizer* hsizer = new wxBoxSizer(wxHORIZONTAL);
         sizer->Add(hsizer, 0, wxEXPAND | wxTOP | wxBOTTOM, 10);
 
         // logo
-        auto *logo = new wxStaticBitmap(panel, wxID_ANY, logo_bmp);
-        hsizer->Add(logo, 0, wxEXPAND | wxLEFT | wxRIGHT, 15);
+        m_head_bitmaps.push_back(new wxStaticBitmap(panel, wxID_ANY, m_logo_bmp.bmp()));
+        hsizer->Add(m_head_bitmaps.back(), 0, wxEXPAND | wxLEFT | wxRIGHT, 15);
 
         // head
-        wxStaticText* head = new wxStaticText(panel, wxID_ANY, sc.first, wxDefaultPosition, wxSize(20 * wxGetApp().em_unit(), -1));
+        wxStaticText* head = new wxStaticText(panel, wxID_ANY, sc.first, wxDefaultPosition, topic_size);
         head->SetFont(head_font);
         hsizer->Add(head, 0, wxALIGN_CENTER_VERTICAL);
 
+
         // Shortcuts list
         auto grid_sizer = new wxFlexGridSizer(2, 5, 15);
         sizer->Add(grid_sizer, 0, wxEXPAND | wxLEFT| wxRIGHT, 15);
@@ -121,7 +126,7 @@ void KBShortcutsDialog::fill_shortcuts()
     main_shortcuts.push_back(Shortcut("?"               ,L("Show keyboard shortcuts list")));
     main_shortcuts.push_back(Shortcut(ctrl+"LeftMouse"  ,L("Select multiple object/Move multiple object")));
 
-    m_full_shortcuts.push_back(std::make_pair( _(L("Main Shortcuts")), std::make_pair(main_shortcuts, 0) ));
+    m_full_shortcuts.push_back(std::make_pair(_(L("Main Shortcuts")), std::make_pair(main_shortcuts, szLeft)));
 
 
     Shortcuts plater_shortcuts;
@@ -148,7 +153,7 @@ void KBShortcutsDialog::fill_shortcuts()
     plater_shortcuts.push_back(Shortcut("O",        L("Zoom out")));
     plater_shortcuts.push_back(Shortcut("ESC",      L("Unselect gizmo, keep object selection")));
 
-    m_full_shortcuts.push_back(std::make_pair(_(L("Plater Shortcuts")), std::make_pair(plater_shortcuts, 1)));
+    m_full_shortcuts.push_back(std::make_pair(_(L("Plater Shortcuts")), std::make_pair(plater_shortcuts, szRight)));
 
 
 //     Shortcuts gizmo_shortcuts;
@@ -168,7 +173,7 @@ void KBShortcutsDialog::fill_shortcuts()
     preview_shortcuts.push_back(Shortcut("U",               L("Upper Layer")));
     preview_shortcuts.push_back(Shortcut("D",               L("Lower Layer")));
 
-    m_full_shortcuts.push_back(std::make_pair( _(L("Preview Shortcuts")), std::make_pair(preview_shortcuts, 0) ));
+    m_full_shortcuts.push_back(std::make_pair(_(L("Preview Shortcuts")), std::make_pair(preview_shortcuts, szLeft)));
 
 
     Shortcuts layers_slider_shortcuts;
@@ -181,7 +186,23 @@ void KBShortcutsDialog::fill_shortcuts()
     layers_slider_shortcuts.push_back(Shortcut("+",             L("Add color change marker for current layer")));
     layers_slider_shortcuts.push_back(Shortcut("-",             L("Delete color change marker for current layer")));
 
-    m_full_shortcuts.push_back(std::make_pair( _(L("Layers Slider Shortcuts")), std::make_pair(layers_slider_shortcuts, 1) ));
+    m_full_shortcuts.push_back(std::make_pair(_(L("Layers Slider Shortcuts")), std::make_pair(layers_slider_shortcuts, szRight)));
+}
+
+void KBShortcutsDialog::on_dpi_changed(const wxRect &suggested_rect)
+{
+    m_logo_bmp.rescale();
+
+    for (wxStaticBitmap* bmp : m_head_bitmaps)
+        bmp->SetBitmap(m_logo_bmp.bmp());
+
+    const int& em = em_unit();
+    const wxSize& size = wxSize(85 * em, 75 * em);
+
+    SetMinSize(size);
+    SetSize(size);
+
+    Refresh();
 }
 
 void KBShortcutsDialog::onCloseDialog(wxEvent &)
diff --git a/src/slic3r/GUI/KBShortcutsDialog.hpp b/src/slic3r/GUI/KBShortcutsDialog.hpp
index d8905e1ce..f18e78682 100644
--- a/src/slic3r/GUI/KBShortcutsDialog.hpp
+++ b/src/slic3r/GUI/KBShortcutsDialog.hpp
@@ -5,24 +5,39 @@
 #include <map>
 #include <vector>
 
+#include "GUI_Utils.hpp"
+#include "wxExtensions.hpp"
+
 namespace Slic3r { 
 namespace GUI {
 
-class KBShortcutsDialog : public wxDialog
+class KBShortcutsDialog : public DPIDialog/*wxDialog*/
 {
+    enum PLACED_SIZER_ID
+    {
+        szLeft = 0,
+        szRight
+    };
+
     typedef std::pair<std::string, std::string> Shortcut;
     typedef std::vector< Shortcut >             Shortcuts;
-    typedef std::vector< std::pair<wxString, std::pair<Shortcuts, int>> >   ShortcutsVec;
+    typedef std::vector< std::pair<wxString, std::pair<Shortcuts, PLACED_SIZER_ID>> >   ShortcutsVec;
 
     wxString text_info {wxEmptyString};
 
-    ShortcutsVec m_full_shortcuts;
+    ShortcutsVec    m_full_shortcuts;
+    wxSizer*        main_sizer;
+    PrusaBitmap     m_logo_bmp;
+    std::vector<wxStaticBitmap*>    m_head_bitmaps;
 
 public:
     KBShortcutsDialog();
     
     void fill_shortcuts();
 
+protected:
+    void on_dpi_changed(const wxRect &suggested_rect) override;
+
 private:
     void onCloseDialog(wxEvent &);
 };
diff --git a/src/slic3r/GUI/MainFrame.cpp b/src/slic3r/GUI/MainFrame.cpp
index 4814a35d9..74cefcb46 100644
--- a/src/slic3r/GUI/MainFrame.cpp
+++ b/src/slic3r/GUI/MainFrame.cpp
@@ -258,7 +258,30 @@ bool MainFrame::can_delete_all() const
 
 void MainFrame::on_dpi_changed(const wxRect &suggested_rect)
 {
-    // TODO
+    wxGetApp().update_fonts();
+
+    // _strange_ workaround for correct em_unit calculation
+    const int new_em_unit = scale_factor() * 10;
+    wxGetApp().set_em_unit(std::max<size_t>(10, new_em_unit));
+
+    /* Load default preset bitmaps before a tabpanel initialization,
+     * but after filling of an em_unit value
+     */
+    wxGetApp().preset_bundle->load_default_preset_bitmaps(this);
+
+    // update Plater
+    wxGetApp().plater()->rescale();
+
+    // update Tabs
+    for (auto tab : wxGetApp().tabs_list)
+        tab->rescale();
+
+    /* To correct window rendering (especially redraw of a status bar)
+     * we should imitate window resizing.
+     */
+    const wxSize& sz = this->GetSize();
+    this->SetSize(sz.x + 1, sz.y + 1);
+    this->SetSize(sz);
 }
 
 void MainFrame::init_menubar()
diff --git a/src/slic3r/GUI/MsgDialog.cpp b/src/slic3r/GUI/MsgDialog.cpp
index 771599b8e..1de0baff7 100644
--- a/src/slic3r/GUI/MsgDialog.cpp
+++ b/src/slic3r/GUI/MsgDialog.cpp
@@ -25,12 +25,14 @@ namespace GUI {
 
 MsgDialog::MsgDialog(wxWindow *parent, const wxString &title, const wxString &headline, wxWindowID button_id, wxBitmap bitmap)
 	: wxDialog(parent, wxID_ANY, title, wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER)
-	, boldfont(wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT))
+	, boldfont(wxGetApp().normal_font()/*wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT)*/)
 	, content_sizer(new wxBoxSizer(wxVERTICAL))
 	, btn_sizer(new wxBoxSizer(wxHORIZONTAL))
 {
 	boldfont.SetWeight(wxFONTWEIGHT_BOLD);
 
+    this->SetFont(wxGetApp().normal_font());
+
 	auto *topsizer = new wxBoxSizer(wxHORIZONTAL);
 	auto *rightsizer = new wxBoxSizer(wxVERTICAL);
 
diff --git a/src/slic3r/GUI/OptionsGroup.cpp b/src/slic3r/GUI/OptionsGroup.cpp
index df2f7b582..a951d9847 100644
--- a/src/slic3r/GUI/OptionsGroup.cpp
+++ b/src/slic3r/GUI/OptionsGroup.cpp
@@ -166,8 +166,11 @@ void OptionsGroup::append_line(const Line& line, wxStaticText**	full_Label/* = n
 #endif /* __WXGTK__ */
 
 	// if we have an extra column, build it
-	if (extra_column)
-		grid_sizer->Add(extra_column(this->ctrl_parent(), line), 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 3);
+        if (extra_column)
+        {
+            m_extra_column_item_ptrs.push_back(extra_column(this->ctrl_parent(), line));
+            grid_sizer->Add(m_extra_column_item_ptrs.back(), 0, wxALIGN_CENTER_VERTICAL | wxRIGHT, 3);
+        }
 
     // Build a label if we have it
 	wxStaticText* label=nullptr;
@@ -180,21 +183,25 @@ void OptionsGroup::append_line(const Line& line, wxStaticText**	full_Label/* = n
 		label_style |= staticbox ? 0 : wxST_ELLIPSIZE_END;
 #endif /* __WXGTK__ */
 		label = new wxStaticText(this->ctrl_parent(), wxID_ANY, line.label + (line.label.IsEmpty() ? "" : ": "), 
-							wxDefaultPosition, wxSize(label_width, -1), label_style);
+							wxDefaultPosition, wxSize(label_width*wxGetApp().em_unit(), -1), label_style);
 		label->SetBackgroundStyle(wxBG_STYLE_PAINT);
-        label->SetFont(label_font);
-        label->Wrap(label_width); // avoid a Linux/GTK bug
+        label->SetFont(wxGetApp().normal_font());
+        label->Wrap(label_width*wxGetApp().em_unit()); // avoid a Linux/GTK bug
         if (!line.near_label_widget)
             grid_sizer->Add(label, 0, (staticbox ? 0 : wxALIGN_RIGHT | wxRIGHT) | wxALIGN_CENTER_VERTICAL, line.label.IsEmpty() ? 0 : 5);
-        else if (line.near_label_widget && line.label.IsEmpty())
-            grid_sizer->Add(line.near_label_widget(this->ctrl_parent()), 0, wxRIGHT | wxALIGN_CENTER_VERTICAL, 7);
         else {
-            // If we're here, we have some widget near the label
-            // so we need a horizontal sizer to arrange these things
-            auto sizer = new wxBoxSizer(wxHORIZONTAL);
-            grid_sizer->Add(sizer, 0, wxEXPAND | (staticbox ? wxALL : wxBOTTOM | wxTOP | wxLEFT), staticbox ? 0 : 1);
-            sizer->Add(line.near_label_widget(this->ctrl_parent()), 0, wxRIGHT, 7);
-            sizer->Add(label, 0, (staticbox ? 0 : wxALIGN_RIGHT | wxRIGHT) | wxALIGN_CENTER_VERTICAL, 5);
+            m_near_label_widget_ptrs.push_back(line.near_label_widget(this->ctrl_parent()));
+
+            if (line.label.IsEmpty())
+                grid_sizer->Add(m_near_label_widget_ptrs.back(), 0, wxRIGHT | wxALIGN_CENTER_VERTICAL, 7);
+            else {
+                // If we're here, we have some widget near the label
+                // so we need a horizontal sizer to arrange these things
+                auto sizer = new wxBoxSizer(wxHORIZONTAL);
+                grid_sizer->Add(sizer, 0, wxEXPAND | (staticbox ? wxALL : wxBOTTOM | wxTOP | wxLEFT), staticbox ? 0 : 1);
+                sizer->Add(m_near_label_widget_ptrs.back(), 0, wxRIGHT, 7);
+                sizer->Add(label, 0, (staticbox ? 0 : wxALIGN_RIGHT | wxRIGHT) | wxALIGN_CENTER_VERTICAL, 5);
+            }
         }
 		if (line.label_tooltip.compare("") != 0)
 			label->SetToolTip(line.label_tooltip);
@@ -235,14 +242,13 @@ void OptionsGroup::append_line(const Line& line, wxStaticText**	full_Label/* = n
 		wxSizer* sizer_tmp = sizer;
 		// add label if any
 		if (option.label != "") {
-// 			wxString str_label = _(option.label);
 //!			To correct translation by context have to use wxGETTEXT_IN_CONTEXT macro from wxWidget 3.1.1
 			wxString str_label = (option.label == "Top" || option.label == "Bottom") ?
 								_CTX(option.label, "Layers") :
 								_(option.label);
 			label = new wxStaticText(this->ctrl_parent(), wxID_ANY, str_label + ": ", wxDefaultPosition, wxDefaultSize);
 			label->SetBackgroundStyle(wxBG_STYLE_PAINT);
-			label->SetFont(label_font);
+            label->SetFont(wxGetApp().normal_font());
 			sizer_tmp->Add(label, 0, /*wxALIGN_RIGHT |*/ wxALIGN_CENTER_VERTICAL, 0);
 		}
 
@@ -267,9 +273,9 @@ void OptionsGroup::append_line(const Line& line, wxStaticText**	full_Label/* = n
 		// add sidetext if any
 		if (option.sidetext != "") {
 			auto sidetext = new wxStaticText(	this->ctrl_parent(), wxID_ANY, _(option.sidetext), wxDefaultPosition, 
-												wxSize(sidetext_width, -1)/*wxDefaultSize*/, wxALIGN_LEFT);
+												/*wxSize(sidetext_width*wxGetApp().em_unit(), -1)*/wxDefaultSize, wxALIGN_LEFT);
 			sidetext->SetBackgroundStyle(wxBG_STYLE_PAINT);
-			sidetext->SetFont(sidetext_font);
+            sidetext->SetFont(wxGetApp().normal_font());
 			sizer_tmp->Add(sidetext, 0, wxLEFT | wxALIGN_CENTER_VERTICAL, 4);
 			field->set_side_text_ptr(sidetext);
 		}
@@ -478,6 +484,57 @@ bool ConfigOptionsGroup::update_visibility(ConfigOptionMode mode) {
     return true;
 }
 
+void ConfigOptionsGroup::rescale()
+{
+    // update bitmaps for extra column items (like "mode markers" or buttons on settings panel)
+    if (rescale_extra_column_item)
+        for (auto extra_col : m_extra_column_item_ptrs)
+            rescale_extra_column_item(extra_col);
+
+    // update bitmaps for near label widgets (like "Set uniform scale" button on settings panel)
+    if (rescale_near_label_widget)
+        for (auto near_label_widget : m_near_label_widget_ptrs)
+            rescale_near_label_widget(near_label_widget);
+
+    // update undo buttons : rescale bitmaps
+    for (const auto& field : m_fields)
+        field.second->rescale();
+
+    const int em = em_unit(parent());
+
+    // rescale width of label column
+    if (!m_options_mode.empty() && label_width > 1)
+    {
+        const int cols = m_grid_sizer->GetCols();
+        const int rows = m_grid_sizer->GetEffectiveRowsCount();
+        const int label_col = extra_column == nullptr ? 0 : 1;
+
+        for (int i = 0; i < rows; i++)
+        {
+            const wxSizerItem* label_item = m_grid_sizer->GetItem(i*cols+label_col);
+            if (label_item->IsWindow())
+            {
+                auto label = dynamic_cast<wxStaticText*>(label_item->GetWindow());
+                if (label != nullptr) {
+                    label->SetMinSize(wxSize(label_width*em, -1));
+                }
+            }
+            else if (label_item->IsSizer()) // case when we nave near_label_widget
+            {
+                const wxSizerItem* l_item = label_item->GetSizer()->GetItem(1);
+                if (l_item->IsWindow())
+                {
+                    auto label = dynamic_cast<wxStaticText*>(l_item->GetWindow());
+                    if (label != nullptr) {
+                        label->SetMinSize(wxSize(label_width*em, -1));
+                    }
+                }
+            }
+        }
+        m_grid_sizer->Layout();
+    }
+}
+
 boost::any ConfigOptionsGroup::config_value(const std::string& opt_key, int opt_index, bool deserialize) {
 
 	if (deserialize) {
diff --git a/src/slic3r/GUI/OptionsGroup.hpp b/src/slic3r/GUI/OptionsGroup.hpp
index e4ada3692..868a4b8f7 100644
--- a/src/slic3r/GUI/OptionsGroup.hpp
+++ b/src/slic3r/GUI/OptionsGroup.hpp
@@ -72,7 +72,7 @@ private:
     std::vector<widget_t>	m_extra_widgets;//! {std::vector<widget_t>()};
 };
 
-using column_t = std::function<wxWindow*(wxWindow* parent, const Line&)>;//std::function<wxSizer*(const Line&)>;
+using column_t = std::function<wxWindow*(wxWindow* parent, const Line&)>;
 
 using t_optionfield_map = std::map<t_config_option_key, t_field>;
 using t_opt_map = std::map< std::string, std::pair<std::string, int> >;
@@ -82,7 +82,7 @@ class OptionsGroup {
 public:
     const bool		staticbox {true};
     const wxString	title {wxString("")};
-    size_t			label_width = 20 * wxGetApp().em_unit();// {200};
+    size_t			label_width = 20 ;// {200};
     wxSizer*		sizer {nullptr};
     column_t		extra_column {nullptr};
     t_change		m_on_change { nullptr };
@@ -94,6 +94,9 @@ public:
 	std::function<DynamicPrintConfig()>	m_get_sys_config{ nullptr };
 	std::function<bool()>	have_sys_config{ nullptr };
 
+    std::function<void(wxWindow* win)> rescale_extra_column_item { nullptr };
+    std::function<void(wxWindow* win)> rescale_near_label_widget { nullptr };
+    
     wxFont			sidetext_font {wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT) };
     wxFont			label_font {wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT) };
 	int				sidetext_width{ -1 };
@@ -193,6 +196,8 @@ protected:
 	std::map<t_config_option_key, Option>	m_options;
     wxWindow*				m_parent {nullptr};
     std::vector<ConfigOptionMode>           m_options_mode;
+    std::vector<wxWindow*>                  m_extra_column_item_ptrs;
+    std::vector<wxWindow*>                  m_near_label_widget_ptrs;
 
     /// Field list, contains unique_ptrs of the derived type.
     /// using types that need to know what it is beyond the public interface 
@@ -261,6 +266,7 @@ public:
     void        Hide();
     void        Show(const bool show);
     bool        update_visibility(ConfigOptionMode mode);
+    void        rescale();
 	boost::any	config_value(const std::string& opt_key, int opt_index, bool deserialize);
 	// return option value from config 
 	boost::any	get_config_value(const DynamicPrintConfig& config, const std::string& opt_key, int opt_index = -1);
diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp
index 5bba6ce72..71e121c58 100644
--- a/src/slic3r/GUI/Plater.cpp
+++ b/src/slic3r/GUI/Plater.cpp
@@ -111,6 +111,7 @@ public:
 
     bool        showing_manifold_warning_icon;
     void        show_sizer(bool show);
+    void        rescale();
 };
 
 ObjectInfo::ObjectInfo(wxWindow *parent) :
@@ -118,10 +119,10 @@ ObjectInfo::ObjectInfo(wxWindow *parent) :
 {
     GetStaticBox()->SetFont(wxGetApp().bold_font());
 
-    auto *grid_sizer = new wxFlexGridSizer(4, 5, 5);
+    auto *grid_sizer = new wxFlexGridSizer(4, 5, 15);
     grid_sizer->SetFlexibleDirection(wxHORIZONTAL);
-    grid_sizer->AddGrowableCol(1, 1);
-    grid_sizer->AddGrowableCol(3, 1);
+//     grid_sizer->AddGrowableCol(1, 1);
+//     grid_sizer->AddGrowableCol(3, 1);
 
     auto init_info_label = [parent, grid_sizer](wxStaticText **info_label, wxString text_label) {
         auto *text = new wxStaticText(parent, wxID_ANY, text_label+":");
@@ -160,6 +161,11 @@ void ObjectInfo::show_sizer(bool show)
         manifold_warning_icon->Show(showing_manifold_warning_icon && show);
 }
 
+void ObjectInfo::rescale()
+{
+    manifold_warning_icon->SetBitmap(create_scaled_bitmap(nullptr, "exclamation"));
+}
+
 enum SlisedInfoIdx
 {
     siFilament_m,
@@ -229,7 +235,8 @@ void SlicedInfo::SetTextAndShow(SlisedInfoIdx idx, const wxString& text, const w
 PresetComboBox::PresetComboBox(wxWindow *parent, Preset::Type preset_type) :
 wxBitmapComboBox(parent, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize(15 * wxGetApp().em_unit(), -1), 0, nullptr, wxCB_READONLY),
     preset_type(preset_type),
-    last_selected(wxNOT_FOUND)
+    last_selected(wxNOT_FOUND),
+    m_em_unit(wxGetApp().em_unit())
 {
     Bind(wxEVT_COMBOBOX, [this](wxCommandEvent &evt) {
         auto selected_item = this->GetSelection();
@@ -274,18 +281,19 @@ wxBitmapComboBox(parent, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize(15 *
                 cfg.set_key_value("extruder_colour", colors);
 
                 wxGetApp().get_tab(Preset::TYPE_PRINTER)->load_config(cfg);
-                wxGetApp().preset_bundle->update_platter_filament_ui(extruder_idx, this, wxGetApp().em_unit());
+                wxGetApp().preset_bundle->update_platter_filament_ui(extruder_idx, this);
                 wxGetApp().plater()->on_config_change(cfg);
             }
             dialog->Destroy();
         });
     }
 
-    edit_btn = new wxButton(parent, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT | wxNO_BORDER);
-#ifdef __WINDOWS__
-    edit_btn->SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW));
-#endif
-    edit_btn->SetBitmap(create_scaled_bitmap(this, "cog"));
+//     edit_btn = new wxButton(parent, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT | wxNO_BORDER);
+// #ifdef __WINDOWS__
+//     edit_btn->SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW));
+// #endif
+//     edit_btn->SetBitmap(create_scaled_bitmap(this, "cog"));
+    edit_btn = new PrusaButton(parent, wxID_ANY, "cog");
     edit_btn->SetToolTip(_(L("Click to edit preset")));
 
     edit_btn->Bind(wxEVT_BUTTON, ([preset_type, this](wxCommandEvent)
@@ -331,6 +339,12 @@ void PresetComboBox::check_selection()
     this->last_selected = GetSelection();
 }
 
+void PresetComboBox::rescale()
+{
+    m_em_unit = wxGetApp().em_unit();
+    edit_btn->rescale();
+}
+
 // Frequently changed parameters
 
 class FreqChangedParams : public OG_Settings
@@ -428,7 +442,7 @@ FreqChangedParams::FreqChangedParams(wxWindow* parent, const int label_width) :
 
     option = m_og->get_option("fill_density");
     option.opt.label = L("Infill");
-    option.opt.width = 6 * wxGetApp().em_unit();
+    option.opt.width = 6;
     option.opt.sidetext = "     ";
     line.append_option(option);
 
@@ -614,9 +628,9 @@ void Sidebar::priv::show_preset_comboboxes()
 // Sidebar / public
 
 Sidebar::Sidebar(Plater *parent)
-    : wxPanel(parent), p(new priv(parent))
+    : wxPanel(parent, wxID_ANY, wxDefaultPosition, wxSize(40 * wxGetApp().em_unit(), -1)), p(new priv(parent))
 {
-    p->scrolled = new wxScrolledWindow(this, wxID_ANY, wxDefaultPosition, wxSize(40 * wxGetApp().em_unit(), -1));
+    p->scrolled = new wxScrolledWindow(this, wxID_ANY/*, wxDefaultPosition, wxSize(40 * wxGetApp().em_unit(), -1)*/);
     p->scrolled->SetScrollbars(0, 20, 1, 2);
 
 
@@ -675,13 +689,8 @@ Sidebar::Sidebar(Plater *parent)
     init_combo(&p->combo_sla_material,  _(L("SLA material")),   Preset::TYPE_SLA_MATERIAL,  false);
     init_combo(&p->combo_printer,       _(L("Printer")),        Preset::TYPE_PRINTER,       false);
 
-    // calculate width of the preset labels 
-//     p->sizer_presets->Layout();
-//     const wxArrayInt& ar = p->sizer_presets->GetColWidths();
-//     const int label_width = ar.IsEmpty() ? 10*wxGetApp().em_unit() : ar.front()-4;
-
     const int margin_5  = int(0.5*wxGetApp().em_unit());// 5;
-    const int margin_10 = int(1.5*wxGetApp().em_unit());// 15;
+    const int margin_10 = 10;//int(1.5*wxGetApp().em_unit());// 15;
 
     p->sizer_params = new wxBoxSizer(wxVERTICAL);
 
@@ -703,10 +712,6 @@ Sidebar::Sidebar(Plater *parent)
     p->object_settings->Hide();
     p->sizer_params->Add(p->object_settings->get_sizer(), 0, wxEXPAND | wxTOP, margin_5);
 
-    p->btn_send_gcode = new wxButton(this, wxID_ANY, _(L("Send to printer")));
-    p->btn_send_gcode->SetFont(wxGetApp().bold_font());
-    p->btn_send_gcode->Hide();
-
     // Info boxes
     p->object_info = new ObjectInfo(p->scrolled);
     p->sliced_info = new SlicedInfo(p->scrolled);
@@ -721,10 +726,17 @@ Sidebar::Sidebar(Plater *parent)
     scrolled_sizer->Add(p->sliced_info, 0, wxEXPAND | wxTOP | wxLEFT, margin_5);
 
     // Buttons underneath the scrolled area
-    p->btn_export_gcode = new wxButton(this, wxID_ANY, _(L("Export G-code")) + dots);
-    p->btn_export_gcode->SetFont(wxGetApp().bold_font());
-    p->btn_reslice = new wxButton(this, wxID_ANY, _(L("Slice now")));
-    p->btn_reslice->SetFont(wxGetApp().bold_font());
+
+    auto init_btn = [this](wxButton **btn, wxString label) {
+        *btn = new wxButton(this, wxID_ANY, label, wxDefaultPosition, 
+                            wxDefaultSize, wxBU_EXACTFIT | wxNO_BORDER);
+        (*btn)->SetFont(wxGetApp().bold_font());
+    };
+
+    init_btn(&p->btn_send_gcode,   _(L("Send to printer")));
+    p->btn_send_gcode->Hide();
+    init_btn(&p->btn_export_gcode, _(L("Export G-code")) + dots);
+    init_btn(&p->btn_reslice,      _(L("Slice now")));
     enable_buttons(false);
 
     auto *btns_sizer = new wxBoxSizer(wxVERTICAL);
@@ -781,6 +793,28 @@ void Sidebar::remove_unused_filament_combos(const int current_extruder_count)
     }
 }
 
+void Sidebar::update_all_preset_comboboxes()
+{
+    PresetBundle &preset_bundle = *wxGetApp().preset_bundle;
+    const auto print_tech = preset_bundle.printers.get_edited_preset().printer_technology();
+
+    // Update the print choosers to only contain the compatible presets, update the dirty flags.
+    if (print_tech == ptFFF)
+        preset_bundle.prints.update_platter_ui(p->combo_print);
+    else {
+        preset_bundle.sla_prints.update_platter_ui(p->combo_sla_print);
+        preset_bundle.sla_materials.update_platter_ui(p->combo_sla_material);
+    }
+    // Update the printer choosers, update the dirty flags.
+    preset_bundle.printers.update_platter_ui(p->combo_printer);
+    // Update the filament choosers to only contain the compatible presets, update the color preview,
+    // update the dirty flags.
+    if (print_tech == ptFFF) {
+        for (size_t i = 0; i < p->combos_filament.size(); ++i)
+            preset_bundle.update_platter_filament_ui(i, p->combos_filament[i]);
+    }
+}
+
 void Sidebar::update_presets(Preset::Type preset_type)
 {
 	PresetBundle &preset_bundle = *wxGetApp().preset_bundle;
@@ -800,7 +834,7 @@ void Sidebar::update_presets(Preset::Type preset_type)
         }
 
         for (size_t i = 0; i < filament_cnt; i++) {
-            preset_bundle.update_platter_filament_ui(i, p->combos_filament[i], wxGetApp().em_unit());
+            preset_bundle.update_platter_filament_ui(i, p->combos_filament[i]);
         }
 
         break;
@@ -822,21 +856,22 @@ void Sidebar::update_presets(Preset::Type preset_type)
 	{
 //         wxWindowUpdateLocker noUpdates_scrolled(p->scrolled);
 
-		// Update the print choosers to only contain the compatible presets, update the dirty flags.
-        if (print_tech == ptFFF)
-			preset_bundle.prints.update_platter_ui(p->combo_print);
-        else {
-            preset_bundle.sla_prints.update_platter_ui(p->combo_sla_print);
-            preset_bundle.sla_materials.update_platter_ui(p->combo_sla_material);
-        }
-		// Update the printer choosers, update the dirty flags.
-		preset_bundle.printers.update_platter_ui(p->combo_printer);
-		// Update the filament choosers to only contain the compatible presets, update the color preview,
-		// update the dirty flags.
-        if (print_tech == ptFFF) {
-            for (size_t i = 0; i < p->combos_filament.size(); ++ i)
-                preset_bundle.update_platter_filament_ui(i, p->combos_filament[i], wxGetApp().em_unit());
-		}
+// 		// Update the print choosers to only contain the compatible presets, update the dirty flags.
+//         if (print_tech == ptFFF)
+// 			preset_bundle.prints.update_platter_ui(p->combo_print);
+//         else {
+//             preset_bundle.sla_prints.update_platter_ui(p->combo_sla_print);
+//             preset_bundle.sla_materials.update_platter_ui(p->combo_sla_material);
+//         }
+// 		// Update the printer choosers, update the dirty flags.
+// 		preset_bundle.printers.update_platter_ui(p->combo_printer);
+// 		// Update the filament choosers to only contain the compatible presets, update the color preview,
+// 		// update the dirty flags.
+//         if (print_tech == ptFFF) {
+//             for (size_t i = 0; i < p->combos_filament.size(); ++ i)
+//                 preset_bundle.update_platter_filament_ui(i, p->combos_filament[i], wxGetApp().em_unit());
+// 		}
+        update_all_preset_comboboxes();
 		p->show_preset_comboboxes();
 		break;
 	}
@@ -861,6 +896,37 @@ void Sidebar::update_reslice_btn_tooltip() const
     p->btn_reslice->SetToolTip(tooltip);
 }
 
+void Sidebar::rescale() 
+{
+    SetMinSize(wxSize(40 * wxGetApp().em_unit(), -1));
+
+    p->mode_sizer->rescale();
+
+    // Rescale preset comboboxes in respect to the current  em_unit ...
+    for (PresetComboBox* combo : std::vector<PresetComboBox*> { p->combo_print,
+                                                                p->combo_sla_print,
+                                                                p->combo_sla_material,
+                                                                p->combo_printer } )
+        combo->rescale();
+    for (PresetComboBox* combo : p->combos_filament)
+        combo->rescale();
+
+    // ... then refill them and set min size to correct layout of the sidebar
+    update_all_preset_comboboxes();
+
+    p->frequently_changed_parameters->get_og(true)->rescale();
+    p->frequently_changed_parameters->get_og(false)->rescale();
+
+    p->object_list->rescale();
+
+    p->object_manipulation->get_og()->rescale();
+    p->object_settings->rescale();
+
+    p->object_info->rescale();
+
+    p->scrolled->Layout();
+}
+
 ObjectManipulation* Sidebar::obj_manipul()
 {
     return p->object_manipulation;
@@ -2599,7 +2665,7 @@ void Plater::priv::on_select_preset(wxCommandEvent &evt)
     // TODO: ?
     if (preset_type == Preset::TYPE_FILAMENT && sidebar->is_multifilament()) {
         // Only update the platter UI for the 2nd and other filaments.
-        wxGetApp().preset_bundle->update_platter_filament_ui(idx, combo, wxGetApp().em_unit());
+        wxGetApp().preset_bundle->update_platter_filament_ui(idx, combo);
     } 
     else {
         wxWindowUpdateLocker noUpdates(sidebar->presets_panel());
@@ -3580,7 +3646,7 @@ void Plater::on_extruders_change(int num_extruders)
         choices.push_back(choice);
 
         // initialize selection
-        wxGetApp().preset_bundle->update_platter_filament_ui(i, choice, wxGetApp().em_unit());
+        wxGetApp().preset_bundle->update_platter_filament_ui(i, choice);
         ++i;
     }
 
@@ -3784,6 +3850,18 @@ bool Plater::can_paste_from_clipboard() const
     return true;
 }
 
+void Plater::rescale()
+{
+    p->preview->rescale();
+
+    p->view3D->get_canvas3d()->rescale();
+
+    p->sidebar->rescale();
+
+    Layout();
+    GetParent()->Layout();
+}
+
 bool Plater::can_delete() const { return p->can_delete(); }
 bool Plater::can_delete_all() const { return p->can_delete_all(); }
 bool Plater::can_increase_instances() const { return p->can_increase_instances(); }
diff --git a/src/slic3r/GUI/Plater.hpp b/src/slic3r/GUI/Plater.hpp
index 5319e3b43..c39256f50 100644
--- a/src/slic3r/GUI/Plater.hpp
+++ b/src/slic3r/GUI/Plater.hpp
@@ -14,6 +14,7 @@
 #include "GLTexture.hpp"
 
 class wxButton;
+class PrusaButton;
 class wxBoxSizer;
 class wxGLCanvas;
 class wxScrolledWindow;
@@ -46,7 +47,7 @@ public:
     PresetComboBox(wxWindow *parent, Preset::Type preset_type);
     ~PresetComboBox();
 
-    wxButton* edit_btn { nullptr };
+    /*wxButton*/PrusaButton* edit_btn { nullptr };
 
 	enum LabelItemType {
 		LABEL_ITEM_MARKER = 0x4d,
@@ -56,14 +57,18 @@ public:
     void set_label_marker(int item, LabelItemType label_item_type = LABEL_ITEM_MARKER);
     void set_extruder_idx(const int extr_idx)   { extruder_idx = extr_idx; }
     int  get_extruder_idx() const               { return extruder_idx; }
+    int  em_unit() const                        { return m_em_unit; }
     void check_selection();
 
+    void rescale();
+
 private:
     typedef std::size_t Marker;
 
     Preset::Type preset_type;
     int last_selected;
     int extruder_idx = -1;
+    int m_em_unit;
 };
 
 class Sidebar : public wxPanel
@@ -79,9 +84,11 @@ public:
 
     void init_filament_combo(PresetComboBox **combo, const int extr_idx);
     void remove_unused_filament_combos(const int current_extruder_count);
+    void update_all_preset_comboboxes();
     void update_presets(Slic3r::Preset::Type preset_type);
     void update_mode_sizer() const;
     void update_reslice_btn_tooltip() const;
+    void rescale();
 
     ObjectManipulation*     obj_manipul();
     ObjectList*             obj_list();
@@ -199,6 +206,8 @@ public:
     bool can_copy() const;
     bool can_paste() const;
 
+    void rescale();
+
 private:
     struct priv;
     std::unique_ptr<priv> p;
diff --git a/src/slic3r/GUI/Preferences.cpp b/src/slic3r/GUI/Preferences.cpp
index 8bc747db5..12d96624c 100644
--- a/src/slic3r/GUI/Preferences.cpp
+++ b/src/slic3r/GUI/Preferences.cpp
@@ -7,7 +7,9 @@ namespace Slic3r {
 namespace GUI {
 
 PreferencesDialog::PreferencesDialog(wxWindow* parent) : 
-	wxDialog(parent, wxID_ANY, _(L("Preferences")), wxDefaultPosition, wxDefaultSize) {
+    DPIDialog(parent, wxID_ANY, _(L("Preferences")), wxDefaultPosition, 
+              wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER)
+{
 	build();
 }
 
@@ -15,7 +17,7 @@ void PreferencesDialog::build()
 {
 	auto app_config = get_app_config();
 	m_optgroup = std::make_shared<ConfigOptionsGroup>(this, _(L("General")));
-    m_optgroup->label_width = 40 * wxGetApp().em_unit(); //400;
+    m_optgroup->label_width = 40;
 	m_optgroup->m_on_change = [this](t_config_option_key opt_key, boost::any value){
 		m_values[opt_key] = boost::any_cast<bool>(value) ? "1" : "0";
 	};
@@ -110,6 +112,8 @@ void PreferencesDialog::build()
 	auto sizer = new wxBoxSizer(wxVERTICAL);
 	sizer->Add(m_optgroup->sizer, 0, wxEXPAND | wxBOTTOM | wxLEFT | wxRIGHT, 10);
 
+    SetFont(wxGetApp().normal_font());
+
 	auto buttons = CreateStdDialogButtonSizer(wxOK | wxCANCEL);
 	wxButton* btn = static_cast<wxButton*>(FindWindowById(wxID_OK, this));
 	btn->Bind(wxEVT_BUTTON, [this](wxCommandEvent&) { accept(); });
@@ -138,5 +142,18 @@ void PreferencesDialog::accept()
     wxGetApp().update_ui_from_settings();
 }
 
+void PreferencesDialog::on_dpi_changed(const wxRect &suggested_rect)
+{
+    m_optgroup->rescale();
+
+    const int& em = em_unit();
+    const wxSize& size = wxSize(50 * em, 29 * em);
+
+    SetMinSize(size);
+    SetSize(size);
+
+    Refresh();
+}
+
 } // GUI
 } // Slic3r
\ No newline at end of file
diff --git a/src/slic3r/GUI/Preferences.hpp b/src/slic3r/GUI/Preferences.hpp
index 363daebbc..096a2c906 100644
--- a/src/slic3r/GUI/Preferences.hpp
+++ b/src/slic3r/GUI/Preferences.hpp
@@ -2,6 +2,7 @@
 #define slic3r_Preferences_hpp_
 
 #include "GUI.hpp"
+#include "GUI_Utils.hpp"
 
 #include <wx/dialog.h>
 #include <map>
@@ -11,7 +12,7 @@ namespace GUI {
 
 class ConfigOptionsGroup;
 
-class PreferencesDialog : public wxDialog
+class PreferencesDialog : public DPIDialog
 {
 	std::map<std::string, std::string>	m_values;
 	std::shared_ptr<ConfigOptionsGroup>	m_optgroup;
@@ -21,6 +22,9 @@ public:
 
 	void	build();
 	void	accept();
+
+protected:
+    void on_dpi_changed(const wxRect &suggested_rect) override;
 };
 
 } // GUI
diff --git a/src/slic3r/GUI/Preset.cpp b/src/slic3r/GUI/Preset.cpp
index bed960a62..9875586ed 100644
--- a/src/slic3r/GUI/Preset.cpp
+++ b/src/slic3r/GUI/Preset.cpp
@@ -914,6 +914,16 @@ void PresetCollection::update_platter_ui(GUI::PresetComboBox *ui)
 	// and draw a red flag in front of the selected preset.
 	bool wide_icons = ! selected_preset.is_compatible && m_bitmap_incompatible != nullptr;
 
+    /* It's supposed that standard size of an icon is 16px*16px for 100% scaled display.
+    * So set sizes for solid_colored icons used for filament preset
+    * and scale them in respect to em_unit value
+    */
+    const float scale_f = ui->em_unit() * 0.1f;
+    const int icon_height           = 16 * scale_f + 0.5f;
+    const int icon_width            = 16 * scale_f + 0.5f;
+    const int thin_space_icon_width = 4 * scale_f + 0.5f;
+    const int wide_space_icon_width = 6 * scale_f + 0.5f;
+
 	std::map<wxString, wxBitmap*> nonsys_presets;
 	wxString selected = "";
 	if (!this->m_presets.front().is_visible)
@@ -934,13 +944,13 @@ void PresetCollection::update_platter_ui(GUI::PresetComboBox *ui)
 			std::vector<wxBitmap> bmps;
 			if (wide_icons)
 				// Paint a red flag for incompatible presets.
-				bmps.emplace_back(preset.is_compatible ? m_bitmap_cache->mkclear(16, 16) : *m_bitmap_incompatible);
+				bmps.emplace_back(preset.is_compatible ? m_bitmap_cache->mkclear(icon_width, icon_height) : *m_bitmap_incompatible);
 			// Paint the color bars.
-			bmps.emplace_back(m_bitmap_cache->mkclear(4, 16));
+			bmps.emplace_back(m_bitmap_cache->mkclear(thin_space_icon_width, icon_height));
 			bmps.emplace_back(*m_bitmap_main_frame);
 			// Paint a lock at the system presets.
- 			bmps.emplace_back(m_bitmap_cache->mkclear(6, 16));
-			bmps.emplace_back((preset.is_system || preset.is_default) ? *m_bitmap_lock : m_bitmap_cache->mkclear(16, 16));
+			bmps.emplace_back(m_bitmap_cache->mkclear(wide_space_icon_width, icon_height));
+			bmps.emplace_back((preset.is_system || preset.is_default) ? *m_bitmap_lock : m_bitmap_cache->mkclear(icon_width, icon_height));
 			bmp = m_bitmap_cache->insert(bitmap_key, bmps);
 		}
 
@@ -981,12 +991,12 @@ void PresetCollection::update_platter_ui(GUI::PresetComboBox *ui)
 			std::vector<wxBitmap> bmps;
 			if (wide_icons)
 				// Paint a red flag for incompatible presets.
-				bmps.emplace_back(m_bitmap_cache->mkclear(16, 16));
+				bmps.emplace_back(m_bitmap_cache->mkclear(icon_width, icon_height));
 			// Paint the color bars.
-			bmps.emplace_back(m_bitmap_cache->mkclear(4, 16));
+			bmps.emplace_back(m_bitmap_cache->mkclear(thin_space_icon_width, icon_height));
 			bmps.emplace_back(*m_bitmap_main_frame);
 			// Paint a lock at the system presets.
-			bmps.emplace_back(m_bitmap_cache->mkclear(6, 16));
+			bmps.emplace_back(m_bitmap_cache->mkclear(wide_space_icon_width, icon_height));
 			bmps.emplace_back(m_bitmap_add ? *m_bitmap_add : wxNullBitmap);
 			bmp = m_bitmap_cache->insert(bitmap_key, bmps);
 		}
@@ -996,10 +1006,14 @@ void PresetCollection::update_platter_ui(GUI::PresetComboBox *ui)
 	ui->SetSelection(selected_preset_item);
 	ui->SetToolTip(ui->GetString(selected_preset_item));
     ui->check_selection();
-	ui->Thaw();
+    ui->Thaw();
+
+    // Update control min size after rescale (changed Display DPI under MSW)
+    if (ui->GetMinWidth() != 20 * ui->em_unit())
+        ui->SetMinSize(wxSize(20 * ui->em_unit(), ui->GetSize().GetHeight()));
 }
 
-size_t PresetCollection::update_tab_ui(wxBitmapComboBox *ui, bool show_incompatible)
+size_t PresetCollection::update_tab_ui(wxBitmapComboBox *ui, bool show_incompatible, const int em/* = 10*/)
 {
     if (ui == nullptr)
         return 0;
@@ -1007,6 +1021,14 @@ size_t PresetCollection::update_tab_ui(wxBitmapComboBox *ui, bool show_incompati
     ui->Clear();
 	size_t selected_preset_item = 0;
 
+    /* It's supposed that standard size of an icon is 16px*16px for 100% scaled display.
+    * So set sizes for solid_colored(empty) icons used for preset
+    * and scale them in respect to em_unit value
+    */
+    const float scale_f = em * 0.1f;
+    const int icon_height = 16 * scale_f + 0.5f;
+    const int icon_width  = 16 * scale_f + 0.5f;
+
 	std::map<wxString, wxBitmap*> nonsys_presets;
 	wxString selected = "";
 	if (!this->m_presets.front().is_visible)
@@ -1025,7 +1047,7 @@ size_t PresetCollection::update_tab_ui(wxBitmapComboBox *ui, bool show_incompati
 			const wxBitmap* tmp_bmp = preset.is_compatible ? m_bitmap_compatible : m_bitmap_incompatible;
 			bmps.emplace_back((tmp_bmp == 0) ? (m_bitmap_main_frame ? *m_bitmap_main_frame : wxNullBitmap) : *tmp_bmp);
 			// Paint a lock at the system presets.
-			bmps.emplace_back((preset.is_system || preset.is_default) ? *m_bitmap_lock : m_bitmap_cache->mkclear(16, 16));
+			bmps.emplace_back((preset.is_system || preset.is_default) ? *m_bitmap_lock : m_bitmap_cache->mkclear(icon_width, icon_height));
 			bmp = m_bitmap_cache->insert(bitmap_key, bmps);
 		}
 
@@ -1292,6 +1314,11 @@ std::string PresetCollection::path_from_name(const std::string &new_name) const
     return (boost::filesystem::path(m_dir_path) / file_name).make_preferred().string();
 }
 
+void PresetCollection::clear_bitmap_cache()
+{
+    m_bitmap_cache->clear();
+}
+
 wxString PresetCollection::separator(const std::string &label)
 {
 	return wxString::FromUTF8(PresetCollection::separator_head()) + _(label) + wxString::FromUTF8(PresetCollection::separator_tail());
diff --git a/src/slic3r/GUI/Preset.hpp b/src/slic3r/GUI/Preset.hpp
index 41c9ff72b..051a55f66 100644
--- a/src/slic3r/GUI/Preset.hpp
+++ b/src/slic3r/GUI/Preset.hpp
@@ -394,7 +394,7 @@ public:
     // Update the choice UI from the list of presets.
     // If show_incompatible, all presets are shown, otherwise only the compatible presets are shown.
     // If an incompatible preset is selected, it is shown as well.
-    size_t          update_tab_ui(wxBitmapComboBox *ui, bool show_incompatible);
+    size_t          update_tab_ui(wxBitmapComboBox *ui, bool show_incompatible, const int em = 10);
     // Update the choice UI from the list of presets.
     // Only the compatible presets are shown.
     // If an incompatible preset is selected, it is shown as well.
@@ -412,6 +412,8 @@ public:
     // Generate a file path from a profile name. Add the ".ini" suffix if it is missing.
     std::string     path_from_name(const std::string &new_name) const;
 
+    void            clear_bitmap_cache();
+
 #ifdef __linux__
 	static const char* separator_head() { return "------- "; }
 	static const char* separator_tail() { return " -------"; }
diff --git a/src/slic3r/GUI/PresetBundle.cpp b/src/slic3r/GUI/PresetBundle.cpp
index 5fdd38936..b2fa0a857 100644
--- a/src/slic3r/GUI/PresetBundle.cpp
+++ b/src/slic3r/GUI/PresetBundle.cpp
@@ -1434,6 +1434,14 @@ bool PresetBundle::parse_color(const std::string &scolor, unsigned char *rgb_out
 
 void PresetBundle::load_default_preset_bitmaps(wxWindow *window)
 {
+    // Clear bitmap cache, before load new scaled default preset bitmaps 
+    m_bitmapCache->clear();
+    this->prints.clear_bitmap_cache();
+    this->sla_prints.clear_bitmap_cache();
+    this->filaments.clear_bitmap_cache();
+    this->sla_materials.clear_bitmap_cache();
+    this->printers.clear_bitmap_cache();
+
     this->prints.load_bitmap_default(window, "cog");
     this->sla_prints.load_bitmap_default(window, "cog");
     this->filaments.load_bitmap_default(window, "spool.png");
@@ -1443,7 +1451,7 @@ void PresetBundle::load_default_preset_bitmaps(wxWindow *window)
     this->load_compatible_bitmaps(window);
 }
 
-void PresetBundle::update_platter_filament_ui(unsigned int idx_extruder, GUI::PresetComboBox *ui, const int em/* = 10*/)
+void PresetBundle::update_platter_filament_ui(unsigned int idx_extruder, GUI::PresetComboBox *ui)
 {
     if (ui == nullptr || this->printers.get_edited_preset().printer_technology() == ptSLA ||
         this->filament_presets.size() <= idx_extruder )
@@ -1471,9 +1479,9 @@ void PresetBundle::update_platter_filament_ui(unsigned int idx_extruder, GUI::Pr
 
     /* It's supposed that standard size of an icon is 16px*16px for 100% scaled display.
      * So set sizes for solid_colored icons used for filament preset 
-     * and scale then in respect to em_unit value
+     * and scale them in respect to em_unit value
      */
-    const float scale_f = em * 0.1f;
+    const float scale_f = ui->em_unit() * 0.1f;
     const int icon_height       = 16 * scale_f + 0.5f;
     const int normal_icon_width = 16 * scale_f + 0.5f;
     const int space_icon_width  = 2  * scale_f + 0.5f;
@@ -1548,6 +1556,10 @@ void PresetBundle::update_platter_filament_ui(unsigned int idx_extruder, GUI::Pr
 	ui->SetToolTip(ui->GetString(selected_preset_item));
     ui->check_selection();
     ui->Thaw();
+
+    // Update control min size after rescale (changed Display DPI under MSW)
+    if (ui->GetMinWidth() != 20 * ui->em_unit())
+        ui->SetMinSize(wxSize(20 * ui->em_unit(), ui->GetSize().GetHeight()));
 }
 
 void PresetBundle::set_default_suppressed(bool default_suppressed)
diff --git a/src/slic3r/GUI/PresetBundle.hpp b/src/slic3r/GUI/PresetBundle.hpp
index 2309ceecd..069ebd784 100644
--- a/src/slic3r/GUI/PresetBundle.hpp
+++ b/src/slic3r/GUI/PresetBundle.hpp
@@ -107,7 +107,7 @@ public:
     void                        export_configbundle(const std::string &path, bool export_system_settings = false);
 
     // Update a filament selection combo box on the platter for an idx_extruder.
-    void                        update_platter_filament_ui(unsigned int idx_extruder, GUI::PresetComboBox *ui, const int em = 10);
+    void                        update_platter_filament_ui(unsigned int idx_extruder, GUI::PresetComboBox *ui);
 
     // Enable / disable the "- default -" preset.
     void                        set_default_suppressed(bool default_suppressed);
diff --git a/src/slic3r/GUI/PrintHostDialogs.cpp b/src/slic3r/GUI/PrintHostDialogs.cpp
index 76185b1ba..4fb03594b 100644
--- a/src/slic3r/GUI/PrintHostDialogs.cpp
+++ b/src/slic3r/GUI/PrintHostDialogs.cpp
@@ -131,7 +131,7 @@ wxEvent *PrintHostQueueDialog::Event::Clone() const
 }
 
 PrintHostQueueDialog::PrintHostQueueDialog(wxWindow *parent)
-    : wxDialog(parent, wxID_ANY, _(L("Print host upload queue")), wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER)
+    : DPIDialog(parent, wxID_ANY, _(L("Print host upload queue")), wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER)
     , on_progress_evt(this, EVT_PRINTHOST_PROGRESS, &PrintHostQueueDialog::on_progress, this)
     , on_error_evt(this, EVT_PRINTHOST_ERROR, &PrintHostQueueDialog::on_error, this)
     , on_cancel_evt(this, EVT_PRINTHOST_CANCEL, &PrintHostQueueDialog::on_cancel, this)
diff --git a/src/slic3r/GUI/PrintHostDialogs.hpp b/src/slic3r/GUI/PrintHostDialogs.hpp
index 105899cf0..e6c46aae6 100644
--- a/src/slic3r/GUI/PrintHostDialogs.hpp
+++ b/src/slic3r/GUI/PrintHostDialogs.hpp
@@ -41,7 +41,7 @@ private:
 };
 
 
-class PrintHostQueueDialog : public wxDialog
+class PrintHostQueueDialog : public DPIDialog
 {
 public:
     class Event : public wxEvent
@@ -62,6 +62,10 @@ public:
     PrintHostQueueDialog(wxWindow *parent);
 
     void append_job(const PrintHostJob &job);
+
+protected:
+    void on_dpi_changed(const wxRect &suggested_rect) override { Refresh(); }
+
 private:
     enum Column {
         COL_ID,
diff --git a/src/slic3r/GUI/SysInfoDialog.cpp b/src/slic3r/GUI/SysInfoDialog.cpp
index 2746c643e..471ba5486 100644
--- a/src/slic3r/GUI/SysInfoDialog.cpp
+++ b/src/slic3r/GUI/SysInfoDialog.cpp
@@ -41,10 +41,12 @@ std::string get_main_info(bool format_as_html)
 }
 
 SysInfoDialog::SysInfoDialog()
-    : wxDialog(NULL, wxID_ANY, wxString(SLIC3R_APP_NAME) + " - " + _(L("System Information")), wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER)
+    : DPIDialog(NULL, wxID_ANY, wxString(SLIC3R_APP_NAME) + " - " + _(L("System Information")), wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER)
 {
 	wxColour bgr_clr = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW);
 	SetBackgroundColour(bgr_clr);
+    SetFont(wxGetApp().normal_font());
+
     wxBoxSizer* hsizer = new wxBoxSizer(wxHORIZONTAL);
     hsizer->SetMinSize(wxSize(50 * wxGetApp().em_unit(), -1));
 
@@ -52,8 +54,10 @@ SysInfoDialog::SysInfoDialog()
 	main_sizer->Add(hsizer, 1, wxEXPAND | wxALL, 10);
 
     // logo
-    auto *logo = new wxStaticBitmap(this, wxID_ANY, create_scaled_bitmap(this, "Slic3r_192px.png", 192));
-	hsizer->Add(logo, 0, wxALIGN_CENTER_VERTICAL);
+    m_logo_bmp = PrusaBitmap(this, "Slic3r_192px.png", 192);
+//     auto *logo = new wxStaticBitmap(this, wxID_ANY, create_scaled_bitmap(this, "Slic3r_192px.png", 192));
+    m_logo = new wxStaticBitmap(this, wxID_ANY, m_logo_bmp.bmp());
+	hsizer->Add(m_logo, 0, wxALIGN_CENTER_VERTICAL);
     
     wxBoxSizer* vsizer = new wxBoxSizer(wxVERTICAL);
     hsizer->Add(vsizer, 1, wxEXPAND|wxLEFT, 20);
@@ -61,8 +65,8 @@ SysInfoDialog::SysInfoDialog()
     // title
     {
         wxStaticText* title = new wxStaticText(this, wxID_ANY, SLIC3R_APP_NAME, wxDefaultPosition, wxDefaultSize);
-        wxFont title_font = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT);
-        title_font.SetWeight(wxFONTWEIGHT_BOLD);
+        wxFont title_font = wxGetApp().bold_font();//wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT);
+//         title_font.SetWeight(wxFONTWEIGHT_BOLD);
         title_font.SetFamily(wxFONTFAMILY_ROMAN);
         title_font.SetPointSize(22);
         title->SetFont(title_font);
@@ -70,7 +74,7 @@ SysInfoDialog::SysInfoDialog()
     }
 
     // main_info_text
-    wxFont font = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT);
+    wxFont font = wxGetApp().normal_font();//wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT);
     const auto text_clr = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT);
     auto text_clr_str = wxString::Format(wxT("#%02X%02X%02X"), text_clr.Red(), text_clr.Green(), text_clr.Blue());
     auto bgr_clr_str = wxString::Format(wxT("#%02X%02X%02X"), bgr_clr.Red(), bgr_clr.Green(), bgr_clr.Blue());
@@ -78,10 +82,10 @@ SysInfoDialog::SysInfoDialog()
     const int fs = font.GetPointSize() - 1;
     int size[] = { static_cast<int>(fs*1.5), static_cast<int>(fs*1.4), static_cast<int>(fs*1.3), fs, fs, fs, fs };
 
-    wxHtmlWindow* html = new wxHtmlWindow(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHW_SCROLLBAR_NEVER);
+    m_html = new wxHtmlWindow(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHW_SCROLLBAR_NEVER);
     {
-        html->SetFonts(font.GetFaceName(), font.GetFaceName(), size);
-        html->SetBorders(2);
+        m_html->SetFonts(font.GetFaceName(), font.GetFaceName(), size);
+        m_html->SetBorders(2);
 		const auto text = wxString::Format(
             "<html>"
             "<body bgcolor= %s link= %s>"
@@ -91,16 +95,16 @@ SysInfoDialog::SysInfoDialog()
             "</body>"
             "</html>", bgr_clr_str, text_clr_str, text_clr_str,
             get_main_info(true));
-        html->SetPage(text);
-        vsizer->Add(html, 1, wxEXPAND | wxBOTTOM, wxGetApp().em_unit());
+        m_html->SetPage(text);
+        vsizer->Add(m_html, 1, wxEXPAND | wxBOTTOM, wxGetApp().em_unit());
     }
 
     // opengl_info
-    wxHtmlWindow* opengl_info_html = new wxHtmlWindow(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHW_SCROLLBAR_AUTO);
+    m_opengl_info_html = new wxHtmlWindow(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHW_SCROLLBAR_AUTO);
     {
-        opengl_info_html->SetMinSize(wxSize(-1, 16 * wxGetApp().em_unit()));
-        opengl_info_html->SetFonts(font.GetFaceName(), font.GetFaceName(), size);
-        opengl_info_html->SetBorders(10);
+        m_opengl_info_html->SetMinSize(wxSize(-1, 16 * wxGetApp().em_unit()));
+        m_opengl_info_html->SetFonts(font.GetFaceName(), font.GetFaceName(), size);
+        m_opengl_info_html->SetBorders(10);
         const auto text = wxString::Format(
             "<html>"
             "<body bgcolor= %s link= %s>"
@@ -110,8 +114,8 @@ SysInfoDialog::SysInfoDialog()
             "</body>"
             "</html>", bgr_clr_str, text_clr_str, text_clr_str,
             _3DScene::get_gl_info(true, true));
-        opengl_info_html->SetPage(text);
-        main_sizer->Add(opengl_info_html, 1, wxEXPAND | wxBOTTOM, 15);
+        m_opengl_info_html->SetPage(text);
+        main_sizer->Add(m_opengl_info_html, 1, wxEXPAND | wxBOTTOM, 15);
     }
     
     wxStdDialogButtonSizer* buttons = this->CreateStdDialogButtonSizer(wxOK);
@@ -130,6 +134,32 @@ SysInfoDialog::SysInfoDialog()
 	main_sizer->SetSizeHints(this);
 }
 
+void SysInfoDialog::on_dpi_changed(const wxRect &suggested_rect)
+{
+    m_logo_bmp.rescale();
+    m_logo->SetBitmap(m_logo_bmp.bmp());
+
+    wxFont font = GetFont();
+    const int fs = font.GetPointSize() - 1;
+    int font_size[] = { static_cast<int>(fs*1.5), static_cast<int>(fs*1.4), static_cast<int>(fs*1.3), fs, fs, fs, fs };
+
+    m_html->SetFonts(font.GetFaceName(), font.GetFaceName(), font_size);
+    m_html->Refresh();
+
+    const int& em = em_unit();
+
+    m_opengl_info_html->SetMinSize(wxSize(-1, 16 * em));
+    m_opengl_info_html->SetFonts(font.GetFaceName(), font.GetFaceName(), font_size);
+    m_opengl_info_html->Refresh();
+
+    const wxSize& size = wxSize(65 * em, 55 * em);
+
+    SetMinSize(size);
+    SetSize(size);
+
+    Refresh();
+}
+
 void SysInfoDialog::onCopyToClipboard(wxEvent &)
 {
     wxTheClipboard->Open();
diff --git a/src/slic3r/GUI/SysInfoDialog.hpp b/src/slic3r/GUI/SysInfoDialog.hpp
index ee1b85ce6..6215d90ca 100644
--- a/src/slic3r/GUI/SysInfoDialog.hpp
+++ b/src/slic3r/GUI/SysInfoDialog.hpp
@@ -4,14 +4,25 @@
 #include <wx/wx.h>
 #include <wx/html/htmlwin.h>
 
+#include "GUI_Utils.hpp"
+#include "wxExtensions.hpp"
+
 namespace Slic3r { 
 namespace GUI {
 
-class SysInfoDialog : public wxDialog
+class SysInfoDialog : public DPIDialog
 {
     wxString text_info {wxEmptyString};
+    PrusaBitmap     m_logo_bmp;
+    wxStaticBitmap* m_logo;
+    wxHtmlWindow* m_opengl_info_html;
+    wxHtmlWindow* m_html;
+
 public:
     SysInfoDialog();
+
+protected:
+    void on_dpi_changed(const wxRect &suggested_rect) override;
     
 private:
     void onCopyToClipboard(wxEvent &);
diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp
index d1347d9e5..69b1e7832 100644
--- a/src/slic3r/GUI/Tab.cpp
+++ b/src/slic3r/GUI/Tab.cpp
@@ -110,37 +110,48 @@ void Tab::create_preset_tab()
 #endif //__WXOSX__
 
 	// preset chooser
-    m_presets_choice = new wxBitmapComboBox(panel, wxID_ANY, "", wxDefaultPosition, wxSize(25 * m_em_unit, -1), 0, 0, wxCB_READONLY);
+    m_presets_choice = new wxBitmapComboBox(panel, wxID_ANY, "", wxDefaultPosition, wxSize(35 * m_em_unit, -1), 0, 0, wxCB_READONLY);
 
 	auto color = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW);
 
 	//buttons
-	wxBitmap bmpMenu;
-    bmpMenu = create_scaled_bitmap(this, "save");
-	m_btn_save_preset = new wxBitmapButton(panel, wxID_ANY, bmpMenu, wxDefaultPosition, wxDefaultSize, wxBORDER_NONE);
-	if (wxMSW) m_btn_save_preset->SetBackgroundColour(color);
-    bmpMenu = create_scaled_bitmap(this, "cross"/*"delete.png"*/);
-	m_btn_delete_preset = new wxBitmapButton(panel, wxID_ANY, bmpMenu, wxDefaultPosition, wxDefaultSize, wxBORDER_NONE);
-	if (wxMSW) m_btn_delete_preset->SetBackgroundColour(color);
+    m_scaled_buttons.reserve(6);
+    m_scaled_buttons.reserve(2);
+// 	wxBitmap bmpMenu;
+//     bmpMenu = create_scaled_bitmap(this, "save");
+// 	m_btn_save_preset = new wxBitmapButton(panel, wxID_ANY, bmpMenu, wxDefaultPosition, wxDefaultSize, wxBORDER_NONE);
+// 	if (wxMSW) m_btn_save_preset->SetBackgroundColour(color);
+//     bmpMenu = create_scaled_bitmap(this, "cross"/*"delete.png"*/);
+// 	m_btn_delete_preset = new wxBitmapButton(panel, wxID_ANY, bmpMenu, wxDefaultPosition, wxDefaultSize, wxBORDER_NONE);
+// 	if (wxMSW) m_btn_delete_preset->SetBackgroundColour(color);
+
+    add_scaled_button(panel, &m_btn_save_preset, "save");
+    add_scaled_button(panel, &m_btn_delete_preset, "cross");
 
 	m_show_incompatible_presets = false;
-	m_bmp_show_incompatible_presets = create_scaled_bitmap(this, "flag_red");
-	m_bmp_hide_incompatible_presets = create_scaled_bitmap(this, "flag_green");
-	m_btn_hide_incompatible_presets = new wxBitmapButton(panel, wxID_ANY, m_bmp_hide_incompatible_presets, wxDefaultPosition, wxDefaultSize, wxBORDER_NONE);
-	if (wxMSW) m_btn_hide_incompatible_presets->SetBackgroundColour(color);
+// 	m_bmp_show_incompatible_presets = create_scaled_bitmap(this, "flag_red");
+// 	m_bmp_hide_incompatible_presets = create_scaled_bitmap(this, "flag_green");
+	add_scaled_bitmap(this, m_bmp_show_incompatible_presets, "flag_red");
+	add_scaled_bitmap(this, m_bmp_hide_incompatible_presets, "flag_green");
+// 	m_btn_hide_incompatible_presets = new wxBitmapButton(panel, wxID_ANY, m_bmp_hide_incompatible_presets, wxDefaultPosition, wxDefaultSize, wxBORDER_NONE);
+// 	if (wxMSW) m_btn_hide_incompatible_presets->SetBackgroundColour(color);
+    add_scaled_button(panel, &m_btn_hide_incompatible_presets, m_bmp_hide_incompatible_presets.name());
 
 	m_btn_save_preset->SetToolTip(_(L("Save current ")) + m_title);
 	m_btn_delete_preset->SetToolTip(_(L("Delete this preset")));
 	m_btn_delete_preset->Disable();
 
-	m_undo_btn = new wxButton(panel, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT | wxNO_BORDER);
-	m_undo_to_sys_btn = new wxButton(panel, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT | wxNO_BORDER);
-	m_question_btn = new wxButton(panel, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT | wxNO_BORDER);
-	if (wxMSW) {
-		m_undo_btn->SetBackgroundColour(color);
-		m_undo_to_sys_btn->SetBackgroundColour(color);
-		m_question_btn->SetBackgroundColour(color);
-	}
+// 	m_undo_btn = new wxButton(panel, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT | wxNO_BORDER);
+// 	m_undo_to_sys_btn = new wxButton(panel, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT | wxNO_BORDER);
+//     m_question_btn = new wxButton(panel, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT | wxNO_BORDER);
+
+    add_scaled_button(panel, &m_question_btn, "question");
+
+// 	if (wxMSW) {
+// 		m_undo_btn->SetBackgroundColour(color);
+// 		m_undo_to_sys_btn->SetBackgroundColour(color);
+// 		m_question_btn->SetBackgroundColour(color);
+// 	}
 
 	m_question_btn->SetToolTip(_(L("Hover the cursor over buttons to find more information \n"
 								   "or click this button.")));
@@ -148,22 +159,31 @@ void Tab::create_preset_tab()
 	// Determine the theme color of OS (dark or light)
     auto luma = wxGetApp().get_colour_approx_luma(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW));
 	// Bitmaps to be shown on the "Revert to system" aka "Lock to system" button next to each input field.
-	m_bmp_value_lock  	   = create_scaled_bitmap(this, luma >= 128 ? "lock_closed" : "lock_closed_white");
-	m_bmp_value_unlock     = create_scaled_bitmap(this, "lock_open");
+// 	m_bmp_value_lock  	   = create_scaled_bitmap(this, luma >= 128 ? "lock_closed" : "lock_closed_white");
+// 	m_bmp_value_unlock     = create_scaled_bitmap(this, "lock_open");
+	add_scaled_bitmap(this, m_bmp_value_lock  , luma >= 128 ? "lock_closed" : "lock_closed_white");
+	add_scaled_bitmap(this, m_bmp_value_unlock, "lock_open");
 	m_bmp_non_system = &m_bmp_white_bullet;
 	// Bitmaps to be shown on the "Undo user changes" button next to each input field.
-	m_bmp_value_revert    = create_scaled_bitmap(this, "undo");
-	m_bmp_white_bullet    = create_scaled_bitmap(this, luma >= 128 ? "dot" : "dot_white"/*"bullet_white.png"*/);
-	m_bmp_question        = create_scaled_bitmap(this, "question");
+//	m_bmp_value_revert    = create_scaled_bitmap(this, "undo");
+//	m_bmp_white_bullet    = create_scaled_bitmap(this, luma >= 128 ? "dot" : "dot_white"/*"bullet_white.png"*/);
+//	m_bmp_question        = create_scaled_bitmap(this, "question");
+// 	m_bmp_value_revert    = create_scaled_bitmap(this, "undo");
+// 	m_bmp_white_bullet    = create_scaled_bitmap(this, "bullet_white.png");
+	add_scaled_bitmap(this, m_bmp_value_revert, "undo");
+	add_scaled_bitmap(this, m_bmp_white_bullet, luma >= 128 ? "dot" : "dot_white"/*"bullet_white.png"*/);
 
 	fill_icon_descriptions();
 	set_tooltips_text();
 
-	m_undo_btn->SetBitmap(m_bmp_white_bullet);
+    add_scaled_button(panel, &m_undo_btn,        m_bmp_white_bullet.name());
+    add_scaled_button(panel, &m_undo_to_sys_btn, m_bmp_white_bullet.name());
+
+// 	m_undo_btn->SetBitmap(m_bmp_white_bullet);
 	m_undo_btn->Bind(wxEVT_BUTTON, ([this](wxCommandEvent) { on_roll_back_value(); }));
-	m_undo_to_sys_btn->SetBitmap(m_bmp_white_bullet);
+// 	m_undo_to_sys_btn->SetBitmap(m_bmp_white_bullet);
 	m_undo_to_sys_btn->Bind(wxEVT_BUTTON, ([this](wxCommandEvent) { on_roll_back_value(true); }));
-	m_question_btn->SetBitmap(m_bmp_question);
+// 	m_question_btn->SetBitmap(m_bmp_question);
 	m_question_btn->Bind(wxEVT_BUTTON, ([this](wxCommandEvent)
 	{
 		auto dlg = new ButtonsDescription(this, &m_icon_descriptions);
@@ -259,12 +279,32 @@ void Tab::create_preset_tab()
 		toggle_show_hide_incompatible();
 	}));
 
+    // Fill cache for mode bitmaps
+    m_mode_bitmap_cache.reserve(3);
+    m_mode_bitmap_cache.push_back(PrusaBitmap(this, "mode_simple_.png"));
+    m_mode_bitmap_cache.push_back(PrusaBitmap(this, "mode_middle_.png"));
+    m_mode_bitmap_cache.push_back(PrusaBitmap(this, "mode_expert_.png"));
+
 	// Initialize the DynamicPrintConfig by default keys/values.
 	build();
 	rebuild_page_tree();
     m_complited = true;
 }
 
+void Tab::add_scaled_button(wxWindow* parent, PrusaButton** btn, const std::string& icon_name, 
+                            const wxString& label/* = wxEmptyString*/, 
+                            long style /*= wxBU_EXACTFIT | wxNO_BORDER*/)
+{
+    *btn = new PrusaButton(parent, wxID_ANY, icon_name, label, wxDefaultSize, wxDefaultPosition, style);
+    m_scaled_buttons.push_back(*btn);
+}
+
+void Tab::add_scaled_bitmap(wxWindow* parent, PrusaBitmap& bmp, const std::string& icon_name)
+{
+    bmp = PrusaBitmap(parent, icon_name);
+    m_scaled_bitmaps.push_back(&bmp);
+}
+
 void Tab::load_initial_data()
 {
 	m_config = &m_presets->get_edited_preset().config;
@@ -281,9 +321,9 @@ Slic3r::GUI::PageShp Tab::add_options_page(const wxString& title, const std::str
 		icon_idx = (m_icon_index.find(icon) == m_icon_index.end()) ? -1 : m_icon_index.at(icon);
 		if (icon_idx == -1) {
 			// Add a new icon to the icon list.
-//             wxIcon img_icon(from_u8(Slic3r::var(icon)), wxBITMAP_TYPE_PNG);
-//             m_icons->Add(img_icon);
-            m_icons->Add(create_scaled_bitmap(this, icon));
+//             m_icons->Add(create_scaled_bitmap(this, icon));
+            m_scaled_icons_list.push_back(PrusaBitmap(this, icon));
+            m_icons->Add(m_scaled_icons_list.back().bmp());
             icon_idx = ++m_icon_count;
 			m_icon_index[icon] = icon_idx;
 		}
@@ -294,7 +334,7 @@ Slic3r::GUI::PageShp Tab::add_options_page(const wxString& title, const std::str
 #else
 	auto panel = this;
 #endif
-	PageShp page(new Page(panel, title, icon_idx));
+	PageShp page(new Page(panel, title, icon_idx, m_mode_bitmap_cache));
 //	page->SetBackgroundStyle(wxBG_STYLE_SYSTEM);
 #ifdef __WINDOWS__
 //	page->SetDoubleBuffered(true);
@@ -402,8 +442,8 @@ void Tab::update_changed_ui()
 	{
 		bool is_nonsys_value = false;
 		bool is_modified_value = true;
-		const wxBitmap *sys_icon =	&m_bmp_value_lock;
-		const wxBitmap *icon =		&m_bmp_value_revert;
+		const /*wxBitmap*/PrusaBitmap *sys_icon =	&m_bmp_value_lock;
+		const /*wxBitmap*/PrusaBitmap *icon =		&m_bmp_value_revert;
 
 		const wxColour *color =		&m_sys_label_clr;
 
@@ -595,8 +635,8 @@ void Tab::update_changed_tree_ui()
 
 void Tab::update_undo_buttons()
 {
-	m_undo_btn->SetBitmap(m_is_modified_values ? m_bmp_value_revert : m_bmp_white_bullet);
-	m_undo_to_sys_btn->SetBitmap(m_is_nonsys_values ? *m_bmp_non_system : m_bmp_value_lock);
+	m_undo_btn->        SetBitmap_(m_is_modified_values ? m_bmp_value_revert: m_bmp_white_bullet);
+	m_undo_to_sys_btn-> SetBitmap_(m_is_nonsys_values   ? *m_bmp_non_system : m_bmp_value_lock);
 
 	m_undo_btn->SetToolTip(m_is_modified_values ? m_ttg_value_revert : m_ttg_white_bullet);
 	m_undo_to_sys_btn->SetToolTip(m_is_nonsys_values ? *m_ttg_non_system : m_ttg_value_lock);
@@ -673,7 +713,7 @@ void Tab::update_dirty()
 
 void Tab::update_tab_ui()
 {
-	m_selected_preset_item = m_presets->update_tab_ui(m_presets_choice, m_show_incompatible_presets);
+	m_selected_preset_item = m_presets->update_tab_ui(m_presets_choice, m_show_incompatible_presets, m_em_unit);
 }
 
 // Load a provied DynamicConfig into the tab, modifying the active preset.
@@ -726,6 +766,42 @@ void Tab::update_visibility()
     update_changed_tree_ui();
 }
 
+void Tab::rescale()
+{
+    m_em_unit = wxGetApp().em_unit();
+
+    m_mode_sizer->rescale();
+
+    m_presets_choice->SetSize(35 * m_em_unit, -1);
+    m_treectrl->SetMinSize(wxSize(20 * m_em_unit, -1));
+
+    update_tab_ui();
+
+    // rescale buttons and cached bitmaps
+    for (const auto btn : m_scaled_buttons)
+        btn->rescale();
+    for (const auto bmp : m_scaled_bitmaps)
+        bmp->rescale();
+    for (PrusaBitmap& bmp : m_mode_bitmap_cache)
+        bmp.rescale();
+
+    // rescale icons for tree_ctrl
+    for (PrusaBitmap& bmp : m_scaled_icons_list)
+        bmp.rescale();
+    // recreate and set new ImageList for tree_ctrl
+    m_icons->RemoveAll();
+    m_icons = new wxImageList(m_scaled_icons_list.front().bmp().GetWidth(), m_scaled_icons_list.front().bmp().GetHeight());
+    for (PrusaBitmap& bmp : m_scaled_icons_list)
+        m_icons->Add(bmp.bmp());
+    m_treectrl->AssignImageList(m_icons);
+
+    // rescale options_groups
+    for (auto page : m_pages)
+        page->rescale();
+
+    Layout();
+}
+
 Field* Tab::get_field(const t_config_option_key& opt_key, int opt_index/* = -1*/) const
 {
 	Field* field = nullptr;
@@ -1121,10 +1197,10 @@ void TabPrint::build()
 		optgroup->append_single_option_line("complete_objects");
 		line = { _(L("Extruder clearance (mm)")), "" };
 		Option option = optgroup->get_option("extruder_clearance_radius");
-		option.opt.width = 60;
+		option.opt.width = 6;
 		line.append_option(option);
 		option = optgroup->get_option("extruder_clearance_height");
-		option.opt.width = 60;
+		option.opt.width = 6;
 		line.append_option(option);
 		optgroup->append_line(line);
 
@@ -1138,14 +1214,14 @@ void TabPrint::build()
 		optgroup = page->new_optgroup(_(L("Post-processing scripts")), 0);	
 		option = optgroup->get_option("post_process");
 		option.opt.full_width = true;
-        option.opt.height = 5 * m_em_unit;//50;
+        option.opt.height = 5;//50;
 		optgroup->append_single_option_line(option);
 
 	page = add_options_page(_(L("Notes")), "note.png");
 		optgroup = page->new_optgroup(_(L("Notes")), 0);						
 		option = optgroup->get_option("notes");
 		option.opt.full_width = true;
-        option.opt.height = 25 * m_em_unit;//250;
+        option.opt.height = 25;//250;
 		optgroup->append_single_option_line(option);
 
 	page = add_options_page(_(L("Dependencies")), "wrench.png");
@@ -1458,7 +1534,7 @@ void TabFilament::build()
 		optgroup->append_single_option_line("bridge_fan_speed");
 		optgroup->append_single_option_line("disable_fan_first_layers");
 
-		optgroup = page->new_optgroup(_(L("Cooling thresholds")), 250);
+		optgroup = page->new_optgroup(_(L("Cooling thresholds")), 25);
 		optgroup->append_single_option_line("fan_below_layer_time");
 		optgroup->append_single_option_line("slowdown_below_layer_time");
 		optgroup->append_single_option_line("min_print_speed");
@@ -1508,8 +1584,8 @@ void TabFilament::build()
 		};
 		optgroup->append_line(line);
 
-        const int gcode_field_height = 15 * m_em_unit; // 150
-        const int notes_field_height = 25 * m_em_unit; // 250
+        const int gcode_field_height = 15; // 150
+        const int notes_field_height = 25; // 250
 
         page = add_options_page(_(L("Custom G-code")), "cog");
 		optgroup = page->new_optgroup(_(L("Start G-code")), 0);
@@ -1606,8 +1682,8 @@ wxSizer* Tab::description_line_widget(wxWindow* parent, ogStaticText* *StaticTex
 {
 	*StaticText = new ogStaticText(parent, "");
 
-	auto font = (new wxSystemSettings)->GetFont(wxSYS_DEFAULT_GUI_FONT);
-	(*StaticText)->SetFont(font);
+//	auto font = (new wxSystemSettings)->GetFont(wxSYS_DEFAULT_GUI_FONT);
+	(*StaticText)->SetFont(wxGetApp().normal_font());
 
 	auto sizer = new wxBoxSizer(wxHORIZONTAL);
 	sizer->Add(*StaticText, 1, wxEXPAND|wxALL, 0);
@@ -1629,10 +1705,14 @@ void TabPrinter::build_printhost(ConfigOptionsGroup *optgroup)
 	}
 
 	auto printhost_browse = [=](wxWindow* parent) {
-        auto btn = m_printhost_browse_btn = new wxButton(parent, wxID_ANY, _(L(" Browse ")) + dots, 
-            wxDefaultPosition, wxDefaultSize, wxBU_LEFT | wxBU_EXACTFIT);
+//        auto btn = m_printhost_browse_btn = new wxButton(parent, wxID_ANY, _(L(" Browse ")) + dots, 
+//            wxDefaultPosition, wxDefaultSize, wxBU_LEFT | wxBU_EXACTFIT);
+//		btn->SetFont(Slic3r::GUI::wxGetApp().normal_font());
+//        btn->SetBitmap(create_scaled_bitmap(this, "browse"));
+        add_scaled_button(parent, &m_printhost_browse_btn, "browse", _(L(" Browse ")) + dots, wxBU_LEFT | wxBU_EXACTFIT);
+        PrusaButton* btn = m_printhost_browse_btn;
 		btn->SetFont(Slic3r::GUI::wxGetApp().normal_font());
-        btn->SetBitmap(create_scaled_bitmap(this, "browse"));
+
 		auto sizer = new wxBoxSizer(wxHORIZONTAL);
 		sizer->Add(btn);
 
@@ -1648,10 +1728,13 @@ void TabPrinter::build_printhost(ConfigOptionsGroup *optgroup)
 	};
 
 	auto print_host_test = [this](wxWindow* parent) {
-		auto btn = m_print_host_test_btn = new wxButton(parent, wxID_ANY, _(L("Test")), 
-			wxDefaultPosition, wxDefaultSize, wxBU_LEFT | wxBU_EXACTFIT);
-		btn->SetFont(Slic3r::GUI::wxGetApp().normal_font());
-        btn->SetBitmap(create_scaled_bitmap(this, "test"));
+// 		auto btn = m_print_host_test_btn = new wxButton(parent, wxID_ANY, _(L("Test")), 
+// 			wxDefaultPosition, wxDefaultSize, wxBU_LEFT | wxBU_EXACTFIT);
+// 		btn->SetFont(Slic3r::GUI::wxGetApp().normal_font());
+//         btn->SetBitmap(create_scaled_bitmap(this, "test"));
+        add_scaled_button(parent, &m_print_host_test_btn, "test", _(L("Test")), wxBU_LEFT | wxBU_EXACTFIT);
+        PrusaButton* btn = m_print_host_test_btn;
+        btn->SetFont(Slic3r::GUI::wxGetApp().normal_font());
 		auto sizer = new wxBoxSizer(wxHORIZONTAL);
 		sizer->Add(btn);
 
@@ -1766,9 +1849,13 @@ void TabPrinter::build_fff()
 
         Line line = optgroup->create_single_option_line("bed_shape");//{ _(L("Bed shape")), "" };
 		line.widget = [this](wxWindow* parent) {
-			auto btn = new wxButton(parent, wxID_ANY, _(L(" Set "))+dots, wxDefaultPosition, wxDefaultSize, wxBU_LEFT | wxBU_EXACTFIT);
-            btn->SetFont(wxGetApp().small_font());
-            btn->SetBitmap(create_scaled_bitmap(this, "printer_white"));
+//			auto btn = new wxButton(parent, wxID_ANY, _(L(" Set "))+dots, wxDefaultPosition, wxDefaultSize, wxBU_LEFT | wxBU_EXACTFIT);
+//            btn->SetFont(wxGetApp().small_font());
+//            btn->SetBitmap(create_scaled_bitmap(this, "printer"));
+
+            PrusaButton* btn;
+            add_scaled_button(parent, &btn, "printer_white", _(L(" Set ")) + dots, wxBU_LEFT | wxBU_EXACTFIT);
+            btn->SetFont(wxGetApp().normal_font());
 
 			auto sizer = new wxBoxSizer(wxHORIZONTAL);
 			sizer->Add(btn);
@@ -1895,8 +1982,8 @@ void TabPrinter::build_fff()
 		optgroup->append_single_option_line("use_volumetric_e");
 		optgroup->append_single_option_line("variable_layer_height");
 
-    const int gcode_field_height = 15 * m_em_unit; // 150
-    const int notes_field_height = 25 * m_em_unit; // 250
+    const int gcode_field_height = 15; // 150
+    const int notes_field_height = 25; // 250
 	page = add_options_page(_(L("Custom G-code")), "cog");
 		optgroup = page->new_optgroup(_(L("Start G-code")), 0);
 		option = optgroup->get_option("start_gcode");
@@ -1967,9 +2054,14 @@ void TabPrinter::build_sla()
 
     Line line = optgroup->create_single_option_line("bed_shape");//{ _(L("Bed shape")), "" };
     line.widget = [this](wxWindow* parent) {
-        auto btn = new wxButton(parent, wxID_ANY, _(L(" Set ")) + dots, wxDefaultPosition, wxDefaultSize, wxBU_LEFT | wxBU_EXACTFIT);
-        btn->SetFont(wxGetApp().small_font());
-        btn->SetBitmap(create_scaled_bitmap(this, "printer_white"));
+//        auto btn = new wxButton(parent, wxID_ANY, _(L(" Set ")) + dots, wxDefaultPosition, wxDefaultSize, wxBU_LEFT | wxBU_EXACTFIT);
+//        btn->SetFont(wxGetApp().small_font());
+//        btn->SetBitmap(create_scaled_bitmap(this, "printer"));
+
+        PrusaButton* btn;
+        add_scaled_button(parent, &btn, "printer_white", _(L(" Set ")) + dots, wxBU_LEFT | wxBU_EXACTFIT);
+        btn->SetFont(wxGetApp().normal_font());
+
 
         auto sizer = new wxBoxSizer(wxHORIZONTAL);
         sizer->Add(btn);
@@ -2025,7 +2117,7 @@ void TabPrinter::build_sla()
     optgroup = page->new_optgroup(_(L("Print Host upload")));
     build_printhost(optgroup.get());
 
-    const int notes_field_height = 25 * m_em_unit; // 250
+    const int notes_field_height = 25; // 250
 
     page = add_options_page(_(L("Notes")), "note.png");
     optgroup = page->new_optgroup(_(L("Notes")), 0);
@@ -2091,12 +2183,12 @@ PageShp TabPrinter::build_kinematics_page()
 		// Legend for OptionsGroups
 		auto optgroup = page->new_optgroup("");
 		optgroup->set_show_modified_btns_val(false);
-        optgroup->label_width = 23 * m_em_unit;// 230;
+        optgroup->label_width = 23;// 230;
 		auto line = Line{ "", "" };
 
 		ConfigOptionDef def;
 		def.type = coString;
-		def.width = 150;
+		def.width = 15;
 		def.gui_type = "legend";
         def.mode = comAdvanced;
 		def.tooltip = L("Values in this column are for Full Power mode");
@@ -2905,7 +2997,7 @@ void Tab::toggle_show_hide_incompatible()
 
 void Tab::update_show_hide_incompatible_button()
 {
-	m_btn_hide_incompatible_presets->SetBitmap(m_show_incompatible_presets ?
+	m_btn_hide_incompatible_presets->SetBitmap_(m_show_incompatible_presets ?
 		m_bmp_show_incompatible_presets : m_bmp_hide_incompatible_presets);
 	m_btn_hide_incompatible_presets->SetToolTip(m_show_incompatible_presets ?
 		"Both compatible an incompatible presets are shown. Click to hide presets not compatible with the current printer." :
@@ -2937,10 +3029,11 @@ wxSizer* Tab::compatible_widget_create(wxWindow* parent, PresetDependencies &dep
 {
 	deps.checkbox = new wxCheckBox(parent, wxID_ANY, _(L("All")));
 	deps.checkbox->SetFont(Slic3r::GUI::wxGetApp().normal_font());
-	deps.btn = new wxButton(parent, wxID_ANY, _(L(" Set "))+dots, wxDefaultPosition, wxDefaultSize, wxBU_LEFT | wxBU_EXACTFIT);
-	deps.btn->SetFont(Slic3r::GUI::wxGetApp().normal_font());
+//	deps.btn = new wxButton(parent, wxID_ANY, _(L(" Set "))+dots, wxDefaultPosition, wxDefaultSize, wxBU_LEFT | wxBU_EXACTFIT);
+    add_scaled_button(parent, &deps.btn, "printer_white", _(L(" Set ")) + dots, wxBU_LEFT | wxBU_EXACTFIT);
+    deps.btn->SetFont(Slic3r::GUI::wxGetApp().normal_font());
 
-    deps.btn->SetBitmap(create_scaled_bitmap(this, "printer_white"));
+//    deps.btn->SetBitmap(create_scaled_bitmap(this, "printer"));
 
 	auto sizer = new wxBoxSizer(wxHORIZONTAL);
 	sizer->Add((deps.checkbox), 0, wxALIGN_CENTER_VERTICAL);
@@ -3097,6 +3190,12 @@ void Page::update_visibility(ConfigOptionMode mode)
     m_show = ret_val;
 }
 
+void Page::rescale()
+{
+    for (auto group : m_optgroups)
+        group->rescale();
+}
+
 Field* Page::get_field(const t_config_option_key& opt_key, int opt_index /*= -1*/) const
 {
 	Field* field = nullptr;
@@ -3120,18 +3219,24 @@ bool Page::set_value(const t_config_option_key& opt_key, const boost::any& value
 // package Slic3r::GUI::Tab::Page;
 ConfigOptionsGroupShp Page::new_optgroup(const wxString& title, int noncommon_label_width /*= -1*/)
 {
-    auto extra_column = [](wxWindow* parent, const Line& line)
+    auto extra_column = [this](wxWindow* parent, const Line& line)
     {
         std::string bmp_name;
         const std::vector<Option>& options = line.get_options();
-        if (options.size() == 0 || options[0].opt.gui_type == "legend")
-            bmp_name = "";// "error.png";
-        else {
-            auto mode = options[0].opt.mode;  //we assume that we have one option per line
-            bmp_name = mode == comExpert   ? "mode_expert_.png" :
-                       mode == comAdvanced ? "mode_middle_.png" : "mode_simple_.png";
-        }                               
-        auto bmp = new wxStaticBitmap(parent, wxID_ANY, bmp_name.empty() ? wxNullBitmap : create_scaled_bitmap(parent, bmp_name));
+//         if (options.size() == 0 || options[0].opt.gui_type == "legend")
+//             bmp_name = "";
+//         else {
+//             auto mode = options[0].opt.mode;  //we assume that we have one option per line
+//             bmp_name = mode == comExpert   ? "mode_expert_.png" :
+//                        mode == comAdvanced ? "mode_middle_.png" : "mode_simple_.png";
+//         }                               
+//         auto bmp = new wxStaticBitmap(parent, wxID_ANY, bmp_name.empty() ? wxNullBitmap : create_scaled_bitmap(parent, bmp_name));
+        int mode_id = int(options[0].opt.mode);
+        const wxBitmap& bitmap = options.size() == 0 || options[0].opt.gui_type == "legend" ? wxNullBitmap :
+                                 m_mode_bitmap_cache[mode_id].bmp();
+        auto bmp = new wxStaticBitmap(parent, wxID_ANY, bitmap);
+        bmp->SetClientData((void*)&m_mode_bitmap_cache[mode_id]);
+
         bmp->SetBackgroundStyle(wxBG_STYLE_PAINT);
         return bmp;
     };
@@ -3170,6 +3275,14 @@ ConfigOptionsGroupShp Page::new_optgroup(const wxString& title, int noncommon_la
 		return static_cast<Tab*>(tab)->m_presets->get_selected_preset_parent() != nullptr;
 	};
 
+    optgroup->rescale_extra_column_item = [this](wxWindow* win) {
+        auto *ctrl = dynamic_cast<wxStaticBitmap*>(win);
+        if (ctrl == nullptr)
+            return;
+
+        ctrl->SetBitmap(reinterpret_cast<PrusaBitmap*>(ctrl->GetClientData())->bmp());
+    };
+
 	vsizer()->Add(optgroup->sizer, 0, wxEXPAND | wxALL, 10);
 	m_optgroups.push_back(optgroup);
 
@@ -3250,7 +3363,7 @@ void TabSLAMaterial::build()
     optgroup->append_single_option_line("initial_exposure_time");
 
     optgroup = page->new_optgroup(_(L("Corrections")));
-    optgroup->label_width = 19 * m_em_unit;//190;
+    optgroup->label_width = 19;//190;
     std::vector<std::string> corrections = {"material_correction"};
 //    std::vector<std::string> axes{ "X", "Y", "Z" };
     std::vector<std::string> axes{ "XY", "Z" };
@@ -3260,7 +3373,7 @@ void TabSLAMaterial::build()
         for (auto& axis : axes) {
             auto opt = optgroup->get_option(opt_key, id);
             opt.opt.label = axis;
-            opt.opt.width = 60;
+            opt.opt.width = 6;
             line.append_option(opt);
             ++id;
         }
@@ -3272,7 +3385,7 @@ void TabSLAMaterial::build()
     optgroup->label_width = 0;
     Option option = optgroup->get_option("material_notes");
     option.opt.full_width = true;
-    option.opt.height = 25 * m_em_unit;//250;
+    option.opt.height = 25;//250;
     optgroup->append_single_option_line(option);
 
     page = add_options_page(_(L("Dependencies")), "wrench.png");
diff --git a/src/slic3r/GUI/Tab.hpp b/src/slic3r/GUI/Tab.hpp
index 69cf76043..0e0e0ad5e 100644
--- a/src/slic3r/GUI/Tab.hpp
+++ b/src/slic3r/GUI/Tab.hpp
@@ -30,14 +30,14 @@
 
 #include "BedShapeDialog.hpp"
 #include "Event.hpp"
-
-class PrusaModeSizer;
+#include "wxExtensions.hpp"
 
 namespace Slic3r {
 namespace GUI {
 
-typedef std::pair<wxBitmap*, std::string>				t_icon_description;
-typedef std::vector<std::pair<wxBitmap*, std::string>>	t_icon_descriptions;
+
+typedef std::pair</*wxBitmap*/PrusaBitmap*, std::string>				t_icon_description;
+typedef std::vector<std::pair</*wxBitmap*/PrusaBitmap*, std::string>>	t_icon_descriptions;
 
 // Single Tab page containing a{ vsizer } of{ optgroups }
 // package Slic3r::GUI::Tab::Page;
@@ -50,10 +50,11 @@ class Page : public wxScrolledWindow
 	wxBoxSizer*		m_vsizer;
     bool            m_show = true;
 public:
-	Page(wxWindow* parent, const wxString title, const int iconID) :
+    Page(wxWindow* parent, const wxString title, const int iconID, const std::vector<PrusaBitmap>& mode_bmp_cache) :
 			m_parent(parent),
 			m_title(title),
-			m_iconID(iconID)
+			m_iconID(iconID),
+            m_mode_bitmap_cache(mode_bmp_cache)
 	{
 		Create(m_parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL);
 		m_vsizer = new wxBoxSizer(wxVERTICAL);
@@ -67,6 +68,7 @@ public:
 
     // Delayed layout after resizing the main window.
     bool 				layout_valid = false;
+    const std::vector<PrusaBitmap>&   m_mode_bitmap_cache;
 
 public:
 	std::vector <ConfigOptionsGroupShp> m_optgroups;
@@ -79,6 +81,7 @@ public:
 	void		set_config(DynamicPrintConfig* config_in) { m_config = config_in; }
 	void		reload_config();
     void        update_visibility(ConfigOptionMode mode);
+    void        rescale();
 	Field*		get_field(const t_config_option_key& opt_key, int opt_index = -1) const;
 	bool		set_value(const t_config_option_key& opt_key, const boost::any& value);
 	ConfigOptionsGroupShp	new_optgroup(const wxString& title, int noncommon_label_width = -1);
@@ -119,9 +122,9 @@ protected:
 	std::string			m_name;
 	const wxString		m_title;
 	wxBitmapComboBox*	m_presets_choice;
-	wxBitmapButton*		m_btn_save_preset;
-	wxBitmapButton*		m_btn_delete_preset;
-	wxBitmapButton*		m_btn_hide_incompatible_presets;
+	/*wxBitmap*/PrusaButton*		m_btn_save_preset;
+	/*wxBitmap*/PrusaButton*		m_btn_delete_preset;
+	/*wxBitmap*/PrusaButton*		m_btn_hide_incompatible_presets;
 	wxBoxSizer*			m_hsizer;
 	wxBoxSizer*			m_left_sizer;
 	wxTreeCtrl*			m_treectrl;
@@ -132,7 +135,7 @@ protected:
    	struct PresetDependencies {
 		Preset::Type type	  = Preset::TYPE_INVALID;
 		wxCheckBox 	*checkbox = nullptr;
-		wxButton 	*btn   	  = nullptr;
+		/*wxButton*/PrusaButton 	*btn   	  = nullptr;
 		std::string  key_list; // "compatible_printers"
 		std::string  key_condition;
 		std::string  dialog_title;
@@ -141,25 +144,27 @@ protected:
 	PresetDependencies 	m_compatible_printers;
 	PresetDependencies 	m_compatible_prints;
 
-	wxButton*			m_undo_btn;
-	wxButton*			m_undo_to_sys_btn;
-	wxButton*			m_question_btn;
-	wxImageList*		m_preset_icons;
+	/*wxButton*/PrusaButton*			m_undo_btn;
+	/*wxButton*/PrusaButton*			m_undo_to_sys_btn;
+	/*wxButton*/PrusaButton*			m_question_btn;
 
 	// Cached bitmaps.
 	// A "flag" icon to be displayned next to the preset name in the Tab's combo box.
-	wxBitmap			m_bmp_show_incompatible_presets;
-	wxBitmap			m_bmp_hide_incompatible_presets;
+	/*wxBitmap*/PrusaBitmap			m_bmp_show_incompatible_presets;
+	/*wxBitmap*/PrusaBitmap			m_bmp_hide_incompatible_presets;
 	// Bitmaps to be shown on the "Revert to system" aka "Lock to system" button next to each input field.
-	wxBitmap 			m_bmp_value_lock;
-	wxBitmap 			m_bmp_value_unlock;
-	wxBitmap 			m_bmp_white_bullet;
+	/*wxBitmap*/PrusaBitmap 			m_bmp_value_lock;
+	/*wxBitmap*/PrusaBitmap 			m_bmp_value_unlock;
+	/*wxBitmap*/PrusaBitmap 			m_bmp_white_bullet;
 	// The following bitmap points to either m_bmp_value_unlock or m_bmp_white_bullet, depending on whether the current preset has a parent preset.
-	wxBitmap 		   *m_bmp_non_system;
+	/*wxBitmap*/PrusaBitmap 		   *m_bmp_non_system;
 	// Bitmaps to be shown on the "Undo user changes" button next to each input field.
-	wxBitmap 			m_bmp_value_revert;
-// 	wxBitmap 			m_bmp_value_unmodified;
-	wxBitmap			m_bmp_question;
+	/*wxBitmap*/PrusaBitmap 			m_bmp_value_revert;
+    
+    std::vector<PrusaButton*>	m_scaled_buttons = {};    
+    std::vector<PrusaBitmap*>	m_scaled_bitmaps = {};    
+    std::vector<PrusaBitmap>	m_scaled_icons_list = {};
+    std::vector<PrusaBitmap>	m_mode_bitmap_cache = {};
 
 	// Colors for ui "decoration"
 	wxColour			m_sys_label_clr;
@@ -236,7 +241,11 @@ public:
     virtual bool supports_printer_technology(const PrinterTechnology tech) = 0;
 
 	void		create_preset_tab();
-	void		load_current_preset();
+    void        add_scaled_button(wxWindow* parent, PrusaButton** btn, const std::string& icon_name, 
+                                  const wxString& label = wxEmptyString, 
+                                  long style = wxBU_EXACTFIT | wxNO_BORDER);
+    void        add_scaled_bitmap(wxWindow* parent, PrusaBitmap& btn, const std::string& icon_name);
+    void		load_current_preset();
 	void        rebuild_page_tree();
 	void        update_page_tree_visibility();
 	// Select a new preset, possibly delete the current one.
@@ -274,6 +283,7 @@ public:
 	virtual void	reload_config();
     void            update_mode();
     void            update_visibility();
+    void            rescale();
 	Field*			get_field(const t_config_option_key& opt_key, int opt_index = -1) const;
 	bool			set_value(const t_config_option_key& opt_key, const boost::any& value);
 	wxSizer*		description_line_widget(wxWindow* parent, ogStaticText** StaticText);
@@ -345,8 +355,8 @@ class TabPrinter : public Tab
     void build_printhost(ConfigOptionsGroup *optgroup);
 public:
 	wxButton*	m_serial_test_btn = nullptr;
-	wxButton*	m_print_host_test_btn = nullptr;
-	wxButton*	m_printhost_browse_btn = nullptr;
+	/*wxButton*/PrusaButton*	m_print_host_test_btn = nullptr;
+	/*wxButton*/PrusaButton*	m_printhost_browse_btn = nullptr;
 
 	size_t		m_extruders_count;
 	size_t		m_extruders_count_old = 0;
diff --git a/src/slic3r/GUI/wxExtensions.cpp b/src/slic3r/GUI/wxExtensions.cpp
index c0390d1a2..4dc6b6e2a 100644
--- a/src/slic3r/GUI/wxExtensions.cpp
+++ b/src/slic3r/GUI/wxExtensions.cpp
@@ -18,6 +18,7 @@
 #include "GUI_ObjectList.hpp"
 #include "libslic3r/GCode/PreviewData.hpp"
 #include "I18N.hpp"
+#include "GUI_Utils.hpp"
 
 using Slic3r::GUI::from_u8;
 
@@ -420,6 +421,22 @@ void PrusaCollapsiblePaneMSW::Collapse(bool collapse)
 }
 #endif //__WXMSW__
 
+/* Function for getting of em_unit value from correct parent.
+ * In most of cases it is m_em_unit value from GUI_App,
+ * but for DPIDialogs it's its own value. 
+ * This value will be used to correct rescale after moving between 
+ * Displays with different HDPI */
+int em_unit(wxWindow* win)
+{
+    if (win)
+    {
+        Slic3r::GUI::DPIDialog* dlg = dynamic_cast<Slic3r::GUI::DPIDialog*>(Slic3r::GUI::find_toplevel_parent(win));
+        if (dlg)
+            return dlg->em_unit();
+    }
+    
+    return Slic3r::GUI::wxGetApp().em_unit();
+}
 
 // If an icon has horizontal orientation (width > height) call this function with is_horizontal = true
 wxBitmap create_scaled_bitmap(wxWindow *win, const std::string& bmp_name_in, const int px_cnt/* = 16*/, const bool is_horizontal /* = false*/)
@@ -436,7 +453,7 @@ wxBitmap create_scaled_bitmap(wxWindow *win, const std::string& bmp_name_in, con
     unsigned int height, width = height = 0;
     unsigned int& scale_base = is_horizontal ? width : height;
 
-    scale_base = (unsigned int)(Slic3r::GUI::wxGetApp().em_unit() * px_cnt * 0.1f + 0.5f);
+    scale_base = (unsigned int)(em_unit(win) * px_cnt * 0.1f + 0.5f);
 
     std::string bmp_name = bmp_name_in;
     boost::replace_last(bmp_name, ".png", "");
@@ -459,15 +476,43 @@ wxBitmap create_scaled_bitmap(wxWindow *win, const std::string& bmp_name_in, con
 // ----------------------------------------------------------------------------
 // PrusaObjectDataViewModelNode
 // ----------------------------------------------------------------------------
-
+/*
 void PrusaObjectDataViewModelNode::set_object_action_icon() {
     m_action_icon = create_scaled_bitmap(nullptr, "advanced_plus");    // FIXME: pass window ptr
 }
 void  PrusaObjectDataViewModelNode::set_part_action_icon() {
     m_action_icon = create_scaled_bitmap(nullptr, m_type == itVolume ? "cog" : "set_separate_obj");    // FIXME: pass window ptr
 }
+*/
+void PrusaObjectDataViewModelNode::set_action_icon()
+{
+    m_action_icon_name = m_type == itObject ? "advanced_plus" : 
+                         m_type == itVolume ? "cog"           : "set_separate_obj";
+    m_action_icon = create_scaled_bitmap(nullptr, m_action_icon_name);    // FIXME: pass window ptr
+}
 
 Slic3r::GUI::BitmapCache *m_bitmap_cache = nullptr;
+void PrusaObjectDataViewModelNode::update_settings_digest_bitmaps()
+{
+    m_bmp = m_empty_bmp;
+
+    std::map<std::string, wxBitmap>& categories_icon = Slic3r::GUI::wxGetApp().obj_list()->CATEGORY_ICON;
+
+    std::string scaled_bitmap_name = m_name.ToUTF8().data();
+    scaled_bitmap_name += "-em" + std::to_string(Slic3r::GUI::wxGetApp().em_unit());
+
+    wxBitmap *bmp = m_bitmap_cache->find(scaled_bitmap_name);
+    if (bmp == nullptr) {
+        std::vector<wxBitmap> bmps;
+        for (auto& cat : m_opt_categories)
+            bmps.emplace_back(  categories_icon.find(cat) == categories_icon.end() ?
+                                wxNullBitmap : categories_icon.at(cat));
+        bmp = m_bitmap_cache->insert(scaled_bitmap_name, bmps);
+    }
+
+    m_bmp = *bmp;
+}
+
 bool PrusaObjectDataViewModelNode::update_settings_digest(const std::vector<std::string>& categories)
 {
     if (m_type != itSettings || m_opt_categories == categories)
@@ -475,15 +520,15 @@ bool PrusaObjectDataViewModelNode::update_settings_digest(const std::vector<std:
 
     m_opt_categories = categories;
     m_name = wxEmptyString;
-    m_bmp = m_empty_bmp;
+//     m_bmp = m_empty_bmp;
 
-    std::map<std::string, wxBitmap>& categories_icon = Slic3r::GUI::wxGetApp().obj_list()->CATEGORY_ICON;
+//     std::map<std::string, wxBitmap>& categories_icon = Slic3r::GUI::wxGetApp().obj_list()->CATEGORY_ICON;
 
     for (auto& cat : m_opt_categories)
         m_name += cat + "; ";
     if (!m_name.IsEmpty())
         m_name.erase(m_name.Length()-2, 2); // Delete last "; "
-
+    /*
     wxBitmap *bmp = m_bitmap_cache->find(m_name.ToUTF8().data());
     if (bmp == nullptr) {
         std::vector<wxBitmap> bmps;
@@ -494,10 +539,22 @@ bool PrusaObjectDataViewModelNode::update_settings_digest(const std::vector<std:
     }
 
     m_bmp = *bmp;
+    */
+
+    update_settings_digest_bitmaps();
 
     return true;
 }
 
+void PrusaObjectDataViewModelNode::rescale()
+{
+    if (!m_action_icon_name.empty())
+        m_action_icon = create_scaled_bitmap(nullptr, m_action_icon_name);
+
+    if (!m_opt_categories.empty())
+        update_settings_digest_bitmaps();
+}
+
 // *****************************************************************************
 // ----------------------------------------------------------------------------
 // PrusaObjectDataViewModel
@@ -554,6 +611,8 @@ wxDataViewItem PrusaObjectDataViewModel::AddVolumeChild(const wxDataViewItem &pa
 
         root->m_volumes_cnt++;
         if (insert_position > 0) insert_position++;
+
+        node->m_volume_type = volume_type;
 	}
 
     const auto node = new PrusaObjectDataViewModelNode(root, name, *m_volume_bmps[int(volume_type)], extruder_str, root->m_volumes_cnt);
@@ -563,6 +622,8 @@ wxDataViewItem PrusaObjectDataViewModel::AddVolumeChild(const wxDataViewItem &pa
     ItemAdded(parent_item, child);
     root->m_volumes_cnt++;
 
+    node->m_volume_type = volume_type;
+
 	return child;
 }
 
@@ -1332,8 +1393,6 @@ bool PrusaObjectDataViewModel::IsSettingsItem(const wxDataViewItem &item) const
     return node->m_type == itSettings;
 }
 
-
-
 void PrusaObjectDataViewModel::UpdateSettingsDigest(const wxDataViewItem &item, 
                                                     const std::vector<std::string>& categories)
 {
@@ -1354,6 +1413,29 @@ void PrusaObjectDataViewModel::SetVolumeType(const wxDataViewItem &item, const S
     ItemChanged(item);
 }
 
+void PrusaObjectDataViewModel::Rescale()
+{
+    wxDataViewItemArray all_items;
+    GetAllChildren(wxDataViewItem(0), all_items);
+
+    for (wxDataViewItem item : all_items)
+    {
+        if (!item.IsOk())
+            continue;
+
+        PrusaObjectDataViewModelNode *node = (PrusaObjectDataViewModelNode*)item.GetID();
+        node->rescale();
+
+        if (node->m_type & itVolume)
+            node->m_bmp = *m_volume_bmps[node->volume_type()];
+
+        if (node->m_type & itObject && node->m_bmp.IsOk())
+            node->m_bmp = create_scaled_bitmap(nullptr, "exclamation");
+
+        ItemChanged(item);
+    }
+}
+
 //-----------------------------------------------------------------------------
 // PrusaDataViewBitmapText
 //-----------------------------------------------------------------------------
@@ -1506,21 +1588,21 @@ PrusaDoubleSlider::PrusaDoubleSlider(wxWindow *parent,
     if (!is_osx)
         SetDoubleBuffered(true);// SetDoubleBuffered exists on Win and Linux/GTK, but is missing on OSX
 
-    m_bmp_thumb_higher = wxBitmap(style == wxSL_HORIZONTAL ? create_scaled_bitmap(this, "right_half_circle.png") : create_scaled_bitmap(this, "up_half_circle.png",   16, true));
-    m_bmp_thumb_lower  = wxBitmap(style == wxSL_HORIZONTAL ? create_scaled_bitmap(this, "left_half_circle.png" ) : create_scaled_bitmap(this, "down_half_circle.png", 16, true));
-    m_thumb_size = m_bmp_thumb_lower.GetSize();
+    m_bmp_thumb_higher = /*wxBitmap*/(style == wxSL_HORIZONTAL ? /*create_scaled_bitmap*/PrusaBitmap(this, "right_half_circle.png") : /*create_scaled_bitmap*/PrusaBitmap(this, "up_half_circle.png",   16, true));
+    m_bmp_thumb_lower  = /*wxBitmap*/(style == wxSL_HORIZONTAL ? /*create_scaled_bitmap*/PrusaBitmap(this, "left_half_circle.png" ) : /*create_scaled_bitmap*/PrusaBitmap(this, "down_half_circle.png", 16, true));
+    m_thumb_size = m_bmp_thumb_lower.bmp().GetSize();
 
-    m_bmp_add_tick_on  = create_scaled_bitmap(this, "colorchange_add_on.png");
-    m_bmp_add_tick_off = create_scaled_bitmap(this, "colorchange_add_off.png");
-    m_bmp_del_tick_on  = create_scaled_bitmap(this, "colorchange_delete_on.png");
-    m_bmp_del_tick_off = create_scaled_bitmap(this, "colorchange_delete_off.png");
-    m_tick_icon_dim = m_bmp_add_tick_on.GetSize().x;
+    m_bmp_add_tick_on  = /*create_scaled_bitmap*/PrusaBitmap(this, "colorchange_add_on.png");
+    m_bmp_add_tick_off = /*create_scaled_bitmap*/PrusaBitmap(this, "colorchange_add_off.png");
+    m_bmp_del_tick_on  = /*create_scaled_bitmap*/PrusaBitmap(this, "colorchange_delete_on.png");
+    m_bmp_del_tick_off = /*create_scaled_bitmap*/PrusaBitmap(this, "colorchange_delete_off.png");
+    m_tick_icon_dim = m_bmp_add_tick_on.bmp().GetSize().x;
 
-    m_bmp_one_layer_lock_on    = create_scaled_bitmap(this, "one_layer_lock_on.png");
-    m_bmp_one_layer_lock_off   = create_scaled_bitmap(this, "one_layer_lock_off.png");
-    m_bmp_one_layer_unlock_on  = create_scaled_bitmap(this, "one_layer_unlock_on.png");
-    m_bmp_one_layer_unlock_off = create_scaled_bitmap(this, "one_layer_unlock_off.png");
-    m_lock_icon_dim = m_bmp_one_layer_lock_on.GetSize().x;
+    m_bmp_one_layer_lock_on    = /*create_scaled_bitmap*/PrusaBitmap(this, "one_layer_lock_on.png");
+    m_bmp_one_layer_lock_off   = /*create_scaled_bitmap*/PrusaBitmap(this, "one_layer_lock_off.png");
+    m_bmp_one_layer_unlock_on  = /*create_scaled_bitmap*/PrusaBitmap(this, "one_layer_unlock_on.png");
+    m_bmp_one_layer_unlock_off = /*create_scaled_bitmap*/PrusaBitmap(this, "one_layer_unlock_off.png");
+    m_lock_icon_dim = m_bmp_one_layer_lock_on.bmp().GetSize().x;
 
     m_selection = ssUndef;
 
@@ -1538,7 +1620,7 @@ PrusaDoubleSlider::PrusaDoubleSlider(wxWindow *parent,
     Bind(wxEVT_RIGHT_UP,    &PrusaDoubleSlider::OnRightUp,  this);
 
     // control's view variables
-    SLIDER_MARGIN     = 4 + Slic3r::GUI::wxGetApp().em_unit();//(style == wxSL_HORIZONTAL ? m_bmp_thumb_higher.GetWidth() : m_bmp_thumb_higher.GetHeight());
+    SLIDER_MARGIN     = 4 + Slic3r::GUI::wxGetApp().em_unit();
 
     DARK_ORANGE_PEN   = wxPen(wxColour(253, 84, 2));
     ORANGE_PEN        = wxPen(wxColour(253, 126, 66));
@@ -1555,6 +1637,33 @@ PrusaDoubleSlider::PrusaDoubleSlider(wxWindow *parent,
     m_font = is_osx ? font.Smaller().Smaller() : font.Smaller();
 }
 
+void PrusaDoubleSlider::rescale()
+{
+    const wxFont& font = Slic3r::GUI::wxGetApp().normal_font();
+    m_font = is_osx ? font.Smaller().Smaller() : font.Smaller();
+
+    m_bmp_thumb_higher.rescale();
+    m_bmp_thumb_lower .rescale();
+    m_thumb_size = m_bmp_thumb_lower.bmp().GetSize();
+
+    m_bmp_add_tick_on .rescale();
+    m_bmp_add_tick_off.rescale();
+    m_bmp_del_tick_on .rescale();
+    m_bmp_del_tick_off.rescale();
+    m_tick_icon_dim = m_bmp_add_tick_on.bmp().GetSize().x;
+
+    m_bmp_one_layer_lock_on   .rescale();
+    m_bmp_one_layer_lock_off  .rescale();
+    m_bmp_one_layer_unlock_on .rescale();
+    m_bmp_one_layer_unlock_off.rescale();
+    m_lock_icon_dim = m_bmp_one_layer_lock_on.bmp().GetSize().x;
+
+    SLIDER_MARGIN = 4 + Slic3r::GUI::wxGetApp().em_unit();
+
+    SetMinSize(get_min_size());
+    GetParent()->Layout();
+}
+
 int PrusaDoubleSlider::GetActiveValue() const
 {
     return m_selection == ssLower ?
@@ -1562,15 +1671,21 @@ int PrusaDoubleSlider::GetActiveValue() const
                 m_higher_value : -1;
 }
 
+wxSize PrusaDoubleSlider::get_min_size() const 
+{
+    const int min_side = is_horizontal() ?
+        (is_osx ? 8 : 6) * Slic3r::GUI::wxGetApp().em_unit() :
+        /*(is_osx ? 10 : 8)*/10 * Slic3r::GUI::wxGetApp().em_unit();
+
+    return wxSize(min_side, min_side);
+}
+
 wxSize PrusaDoubleSlider::DoGetBestSize() const
 {
     const wxSize size = wxControl::DoGetBestSize();
     if (size.x > 1 && size.y > 1)
         return size;
-    const int new_size = is_horizontal() ? 
-                         (is_osx ? 8 : 6) * Slic3r::GUI::wxGetApp().em_unit() :
-                         (is_osx ? 10 : 8) * Slic3r::GUI::wxGetApp().em_unit();
-    return wxSize(new_size, new_size);
+    return get_min_size();
 }
 
 void PrusaDoubleSlider::SetLowerValue(const int lower_val)
@@ -1786,9 +1901,12 @@ void PrusaDoubleSlider::render()
 void PrusaDoubleSlider::draw_action_icon(wxDC& dc, const wxPoint pt_beg, const wxPoint pt_end)
 {
     const int tick = m_selection == ssLower ? m_lower_value : m_higher_value;
-    wxBitmap* icon = m_is_action_icon_focesed ? &m_bmp_add_tick_off : &m_bmp_add_tick_on;
+//     wxBitmap* icon = m_is_action_icon_focesed ? &m_bmp_add_tick_off : &m_bmp_add_tick_on;
+//     if (m_ticks.find(tick) != m_ticks.end())
+//         icon = m_is_action_icon_focesed ? &m_bmp_del_tick_off : &m_bmp_del_tick_on;
+    wxBitmap& icon = m_is_action_icon_focesed ? m_bmp_add_tick_off.bmp() : m_bmp_add_tick_on.bmp();
     if (m_ticks.find(tick) != m_ticks.end())
-        icon = m_is_action_icon_focesed ? &m_bmp_del_tick_off : &m_bmp_del_tick_on;
+        icon = m_is_action_icon_focesed ? m_bmp_del_tick_off.bmp() : m_bmp_del_tick_on.bmp();
 
     wxCoord x_draw, y_draw;
     is_horizontal() ? x_draw = pt_beg.x - 0.5*m_tick_icon_dim : y_draw = pt_beg.y - 0.5*m_tick_icon_dim;
@@ -1797,7 +1915,7 @@ void PrusaDoubleSlider::draw_action_icon(wxDC& dc, const wxPoint pt_beg, const w
     else
         is_horizontal() ? y_draw = pt_beg.y - m_tick_icon_dim-2 : x_draw = pt_end.x + 3;
 
-    dc.DrawBitmap(*icon, x_draw, y_draw);
+    dc.DrawBitmap(/***/icon, x_draw, y_draw);
 
     //update rect of the tick action icon
     m_rect_tick_action = wxRect(x_draw, y_draw, m_tick_icon_dim, m_tick_icon_dim);
@@ -1873,7 +1991,7 @@ void PrusaDoubleSlider::draw_thumb_item(wxDC& dc, const wxPoint& pos, const Sele
             y_draw = pos.y - m_thumb_size.y;
         }
     }
-    dc.DrawBitmap(selection == ssLower ? m_bmp_thumb_lower : m_bmp_thumb_higher, x_draw, y_draw);
+    dc.DrawBitmap(selection == ssLower ? m_bmp_thumb_lower.bmp() : m_bmp_thumb_higher.bmp(), x_draw, y_draw);
 
     // Update thumb rect
     update_thumb_rect(x_draw, y_draw, selection);
@@ -1989,9 +2107,12 @@ void PrusaDoubleSlider::draw_colored_band(wxDC& dc)
 
 void PrusaDoubleSlider::draw_one_layer_icon(wxDC& dc)
 {
-    wxBitmap* icon = m_is_one_layer ?
-                     m_is_one_layer_icon_focesed ? &m_bmp_one_layer_lock_off : &m_bmp_one_layer_lock_on :
-                     m_is_one_layer_icon_focesed ? &m_bmp_one_layer_unlock_off : &m_bmp_one_layer_unlock_on;
+//     wxBitmap* icon = m_is_one_layer ?
+//                      m_is_one_layer_icon_focesed ? &m_bmp_one_layer_lock_off : &m_bmp_one_layer_lock_on :
+//                      m_is_one_layer_icon_focesed ? &m_bmp_one_layer_unlock_off : &m_bmp_one_layer_unlock_on;
+    const wxBitmap& icon = m_is_one_layer ?
+                     m_is_one_layer_icon_focesed ? m_bmp_one_layer_lock_off.bmp()   : m_bmp_one_layer_lock_on.bmp() :
+                     m_is_one_layer_icon_focesed ? m_bmp_one_layer_unlock_off.bmp() : m_bmp_one_layer_unlock_on.bmp();
 
     int width, height;
     get_size(&width, &height);
@@ -2000,7 +2121,7 @@ void PrusaDoubleSlider::draw_one_layer_icon(wxDC& dc)
     is_horizontal() ? x_draw = width-2 : x_draw = 0.5*width - 0.5*m_lock_icon_dim;
     is_horizontal() ? y_draw = 0.5*height - 0.5*m_lock_icon_dim : y_draw = height-2;
 
-    dc.DrawBitmap(*icon, x_draw, y_draw);
+    dc.DrawBitmap(/***/icon, x_draw, y_draw);
 
     //update rect of the lock/unlock icon
     m_rect_one_layer_icon = wxRect(x_draw, y_draw, m_lock_icon_dim, m_lock_icon_dim);
@@ -2343,17 +2464,17 @@ PrusaLockButton::PrusaLockButton(   wxWindow *parent,
                                     const wxSize& size /*= wxDefaultSize*/):
                                     wxButton(parent, id, wxEmptyString, pos, size, wxBU_EXACTFIT | wxNO_BORDER)
 {
-    m_bmp_lock_on      = create_scaled_bitmap(this, "one_layer_lock_on.png");
-    m_bmp_lock_off     = create_scaled_bitmap(this, "one_layer_lock_off.png");
-    m_bmp_unlock_on    = create_scaled_bitmap(this, "one_layer_unlock_on.png");
-    m_bmp_unlock_off   = create_scaled_bitmap(this, "one_layer_unlock_off.png");
+    m_bmp_lock_on      = /*create_scaled_bitmap*/PrusaBitmap(this, "one_layer_lock_on.png");
+    m_bmp_lock_off     = /*create_scaled_bitmap*/PrusaBitmap(this, "one_layer_lock_off.png");
+    m_bmp_unlock_on    = /*create_scaled_bitmap*/PrusaBitmap(this, "one_layer_unlock_on.png");
+    m_bmp_unlock_off   = /*create_scaled_bitmap*/PrusaBitmap(this, "one_layer_unlock_off.png");
 
 
 #ifdef __WXMSW__
     SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW));
 #endif // __WXMSW__
-    SetBitmap(m_bmp_unlock_on);
-    SetBitmapDisabled(m_bmp_lock_on);
+    SetBitmap(m_bmp_unlock_on.bmp());
+    SetBitmapDisabled(m_bmp_lock_on.bmp());
 
     //button events
     Bind(wxEVT_BUTTON,          &PrusaLockButton::OnButton, this);
@@ -2375,12 +2496,25 @@ void PrusaLockButton::SetLock(bool lock)
     enter_button(true);
 }
 
+void PrusaLockButton::rescale()
+{
+    m_bmp_lock_on   .rescale();
+    m_bmp_lock_off  .rescale();
+    m_bmp_unlock_on .rescale();
+    m_bmp_unlock_off.rescale();
+}
+
 void PrusaLockButton::enter_button(const bool enter)
 {
-    wxBitmap* icon = m_is_pushed ?
-        enter ? &m_bmp_lock_off     : &m_bmp_lock_on :
-        enter ? &m_bmp_unlock_off   : &m_bmp_unlock_on;
-    SetBitmap(*icon);
+//     wxBitmap* icon = m_is_pushed ?
+//         enter ? &m_bmp_lock_off     : &m_bmp_lock_on :
+//         enter ? &m_bmp_unlock_off   : &m_bmp_unlock_on;
+//     SetBitmap(*icon);
+
+    const wxBitmap& icon = m_is_pushed ?
+        enter ? m_bmp_lock_off.bmp() : m_bmp_lock_on.bmp() :
+        enter ? m_bmp_unlock_off.bmp() : m_bmp_unlock_on.bmp();
+    SetBitmap(icon);
 
     Refresh();
     Update();
@@ -2394,22 +2528,23 @@ void PrusaLockButton::enter_button(const bool enter)
 
 PrusaModeButton::PrusaModeButton(   wxWindow *parent,
                                     wxWindowID id,
+                                    const std::string& icon_name/* = ""*/,
                                     const wxString& mode/* = wxEmptyString*/,
-                                    const wxBitmap& bmp_on/* = wxNullBitmap*/,
                                     const wxSize& size/* = wxDefaultSize*/,
                                     const wxPoint& pos/* = wxDefaultPosition*/) :
-    wxButton(parent, id, mode, pos, size, /*wxBU_EXACTFIT | */wxNO_BORDER),
-    m_bmp_on(bmp_on)
+//     wxButton(parent, id, mode, pos, wxDefaultSize/*size*/, wxBU_EXACTFIT | wxNO_BORDER),
+    PrusaButton(parent, id, icon_name, mode, size, pos)
+//     m_bmp_on(bmp_on)
 {
-#ifdef __WXMSW__
-    SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW));
-#endif // __WXMSW__
-    m_bmp_off = create_scaled_bitmap(this, "mode_off_sq.png");
+// #ifdef __WXMSW__
+//     SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW));
+// #endif // __WXMSW__
+//     m_bmp_off = create_scaled_bitmap(this, "mode_off_sq.png");
 
     m_tt_focused = wxString::Format(_(L("Switch to the %s mode")), mode);
     m_tt_selected = wxString::Format(_(L("Current mode is %s")), mode);
 
-    SetBitmap(m_bmp_on);
+//     SetBitmap(m_bmp_on);
 
     //button events
     Bind(wxEVT_BUTTON,          &PrusaModeButton::OnButton, this);
@@ -2434,9 +2569,9 @@ void PrusaModeButton::SetState(const bool state)
 
 void PrusaModeButton::focus_button(const bool focus)
 {
-//     const wxBitmap& bmp = focus ? m_bmp_on : m_bmp_off;
-//     SetBitmap(bmp);
-    const wxFont& new_font = focus ? Slic3r::GUI::wxGetApp().bold_font() : Slic3r::GUI::wxGetApp().small_font();
+    wxFont font = GetFont();
+    const wxFont& new_font = focus ? font.Bold() : font.GetBaseFont();
+
     SetFont(new_font);
 
     Refresh();
@@ -2453,19 +2588,19 @@ PrusaModeSizer::PrusaModeSizer(wxWindow *parent, int hgap/* = 10*/) :
 {
     SetFlexibleDirection(wxHORIZONTAL);
 
-    std::vector<std::pair<wxString, wxBitmap>> buttons = {
-        {_(L("Simple")),    create_scaled_bitmap(parent, "mode_simple_sq.png")},
-        {_(L("Advanced")),  create_scaled_bitmap(parent, "mode_middle_sq.png")},
-        {_(L("Expert")),    create_scaled_bitmap(parent, "mode_expert_sq.png")}
+    std::vector < std::pair < wxString, std::string >> buttons = {
+        {_(L("Simple")),    /*create_scaled_bitmap(parent, */"mode_simple_sq.png"/*)*/},
+        {_(L("Advanced")),  /*create_scaled_bitmap(parent, */"mode_middle_sq.png"/*)*/},
+        {_(L("Expert")),    /*create_scaled_bitmap(parent, */"mode_expert_sq.png"/*)*/}
     };
 
     mode_btns.reserve(3);
     for (const auto& button : buttons) {
-        int x, y;
-        parent->GetTextExtent(button.first, &x, &y, nullptr, nullptr, &Slic3r::GUI::wxGetApp().bold_font());
-        const wxSize size = wxSize(x + button.second.GetWidth() + Slic3r::GUI::wxGetApp().em_unit(), 
-                                   y + Slic3r::GUI::wxGetApp().em_unit());
-        mode_btns.push_back(new PrusaModeButton(parent, wxID_ANY, button.first, button.second, size));
+//         int x, y;
+//         parent->GetTextExtent(button.first, &x, &y, nullptr, nullptr, &Slic3r::GUI::wxGetApp().bold_font());
+//         const wxSize size = wxSize(x + button.second.GetWidth() + Slic3r::GUI::wxGetApp().em_unit(), 
+//                                    y + Slic3r::GUI::wxGetApp().em_unit());
+        mode_btns.push_back(new PrusaModeButton(parent, wxID_ANY, button.second, button.first/*, size*/));
     }
 
     for (auto btn : mode_btns)
@@ -2494,6 +2629,12 @@ void PrusaModeSizer::SetMode(const int mode)
 }
 
 
+void PrusaModeSizer::rescale()
+{
+    for (int m = 0; m < mode_btns.size(); m++)
+        mode_btns[m]->rescale();
+}
+
 // ----------------------------------------------------------------------------
 // PrusaMenu
 // ----------------------------------------------------------------------------
@@ -2512,9 +2653,79 @@ void PrusaMenu::DestroySeparators()
 }
 
 
-// ************************************** EXPERIMENTS ***************************************
+// ----------------------------------------------------------------------------
+// PrusaBitmap
+// ----------------------------------------------------------------------------
+PrusaBitmap::PrusaBitmap(wxWindow *parent, 
+                        const std::string& icon_name/* = ""*/,
+                        const int px_cnt/* = 16*/, 
+                        const bool is_horizontal/*  = false*/):
+                        m_parent(parent), m_icon_name(icon_name),
+                        m_px_cnt(px_cnt), m_is_horizontal(is_horizontal)
+{
+    m_bmp = create_scaled_bitmap(parent, icon_name, px_cnt, is_horizontal);
+}
+
+
+void PrusaBitmap::rescale()
+{
+    m_bmp = create_scaled_bitmap(m_parent, m_icon_name, m_px_cnt, m_is_horizontal);
+}
+
+// ----------------------------------------------------------------------------
+// PrusaButton
+// ----------------------------------------------------------------------------
+
+PrusaButton::PrusaButton(wxWindow *parent,
+    wxWindowID id,
+    const std::string& icon_name/*= ""*/,
+    const wxString& label       /* = wxEmptyString*/,
+    const wxSize& size          /* = wxDefaultSize*/,
+    const wxPoint& pos          /* = wxDefaultPosition*/,
+    long style                  /*= wxBU_EXACTFIT | wxNO_BORDER*/) :
+    m_current_icon_name(icon_name),
+    m_parent(parent)
+{
+    Create(parent, id, label, pos, size, style);
+#ifdef __WXMSW__
+    if (style & wxNO_BORDER)
+        SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW));
+#endif // __WXMSW__
+ 
+    SetBitmap(create_scaled_bitmap(parent, icon_name));
+}
+
+
+PrusaButton::PrusaButton(wxWindow *parent, 
+                        wxWindowID id,
+                        const PrusaBitmap& bitmap,
+                        const wxString& label   /*= wxEmptyString*/, 
+                        long style              /*= wxBU_EXACTFIT | wxNO_BORDER*/) :
+    m_current_icon_name(bitmap.name()),
+    m_parent(parent)
+{
+    Create(parent, id, label, wxDefaultPosition, wxDefaultSize, style);
+#ifdef __WXMSW__
+    if (style & wxNO_BORDER)
+        SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW));
+#endif // __WXMSW__
+
+    SetBitmap(bitmap.bmp());
+}
+
+void PrusaButton::SetBitmap_(const PrusaBitmap& bmp)
+{
+    SetBitmap(bmp.bmp());
+    m_current_icon_name = bmp.name();
+}
+
+void PrusaButton::rescale()
+{
+    const wxBitmap bmp = create_scaled_bitmap(m_parent, m_current_icon_name);
+
+    SetBitmap(bmp);
+}
 
-// *****************************************************************************
 
 
 
diff --git a/src/slic3r/GUI/wxExtensions.hpp b/src/slic3r/GUI/wxExtensions.hpp
index b935448d9..574712849 100644
--- a/src/slic3r/GUI/wxExtensions.hpp
+++ b/src/slic3r/GUI/wxExtensions.hpp
@@ -31,7 +31,9 @@ wxMenuItem* append_submenu(wxMenu* menu, wxMenu* sub_menu, int id, const wxStrin
 wxMenuItem* append_menu_radio_item(wxMenu* menu, int id, const wxString& string, const wxString& description, 
     std::function<void(wxCommandEvent& event)> cb, wxEvtHandler* event_handler);
 
-wxBitmap create_scaled_bitmap(wxWindow *win, const std::string& bmp_name, const int px_cnt=16, const bool is_horizontal = false);
+int em_unit(wxWindow* win);
+
+wxBitmap create_scaled_bitmap(wxWindow *win, const std::string& bmp_name, const int px_cnt = 16, const bool is_horizontal = false);
 
 class wxCheckListBoxComboPopup : public wxCheckListBox, public wxComboPopup
 {
@@ -233,6 +235,10 @@ class PrusaObjectDataViewModelNode
     wxBitmap                        m_empty_bmp;
     size_t                          m_volumes_cnt = 0;
     std::vector< std::string >      m_opt_categories;
+
+    std::string                     m_action_icon_name = "";
+    Slic3r::ModelVolumeType         m_volume_type;
+
 public:
     PrusaObjectDataViewModelNode(const wxString &name, 
                                  const wxString& extruder) {
@@ -246,7 +252,9 @@ public:
         m_container = true;
 #endif  //__WXGTK__
         m_extruder = extruder;
-		set_object_action_icon();
+
+// 		set_object_action_icon();
+        set_action_icon();
 	}
 
 	PrusaObjectDataViewModelNode(	PrusaObjectDataViewModelNode* parent,
@@ -266,7 +274,9 @@ public:
         // it will be produce "segmentation fault"
         m_container = true;
 #endif  //__WXGTK__
-		set_part_action_icon();
+
+// 		set_part_action_icon();
+        set_action_icon();
     }
 
     PrusaObjectDataViewModelNode(   PrusaObjectDataViewModelNode* parent, const ItemType type) :
@@ -286,7 +296,8 @@ public:
         else if (type == itInstance) {
             m_idx = parent->GetChildCount();
             m_name = wxString::Format("Instance_%d", m_idx+1);
-            set_part_action_icon();
+//             set_part_action_icon();
+            set_action_icon();
         }
 	}
 
@@ -428,9 +439,14 @@ public:
 	}
 
 	// Set action icons for node
-	void set_object_action_icon();
-	void set_part_action_icon();
-    bool update_settings_digest(const std::vector<std::string>& categories);
+// 	void set_object_action_icon();
+// 	void set_part_action_icon();
+    void set_action_icon();
+
+    void    update_settings_digest_bitmaps();
+	bool    update_settings_digest(const std::vector<std::string>& categories);
+    int     volume_type() const { return int(m_volume_type); }
+    void    rescale();
 private:
     friend class PrusaObjectDataViewModel;
 };
@@ -527,6 +543,8 @@ public:
     void    SetVolumeType(const wxDataViewItem &item, const Slic3r::ModelVolumeType type);
 
     void    SetAssociatedControl(wxDataViewCtrl* ctrl) { m_ctrl = ctrl; }
+    // Rescale bitmaps for existing Items
+    void    Rescale();
 };
 
 // ----------------------------------------------------------------------------
@@ -675,6 +693,36 @@ private:
 };
 
 
+// ----------------------------------------------------------------------------
+// PrusaBitmap
+// ----------------------------------------------------------------------------
+
+class PrusaBitmap
+{
+public:
+    PrusaBitmap() {};
+    PrusaBitmap(wxWindow *parent, 
+                const std::string& icon_name = "",
+                const int px_cnt = 16, 
+                const bool is_horizontal  = false);
+
+    ~PrusaBitmap() {}
+
+    void                rescale();
+
+    const wxBitmap&     bmp() const { return m_bmp; }
+    wxBitmap&           bmp()       { return m_bmp; }
+    const std::string&  name() const{ return m_icon_name; }
+
+private:
+    wxWindow*       m_parent{ nullptr };
+    wxBitmap        m_bmp = wxBitmap();
+    std::string     m_icon_name = "";
+    int             m_px_cnt {16};
+    bool            m_is_horizontal {false};
+};
+
+
 // ----------------------------------------------------------------------------
 // PrusaDoubleSlider
 // ----------------------------------------------------------------------------
@@ -710,6 +758,8 @@ public:
         const wxString& name = wxEmptyString);
     ~PrusaDoubleSlider() {}
 
+    void    rescale();
+
     int GetMinValue() const { return m_min_value; }
     int GetMaxValue() const { return m_max_value; }
     double GetMinValueD()  { return m_values.empty() ? 0. : m_values[m_min_value].second; }
@@ -717,6 +767,7 @@ public:
     int GetLowerValue() const { return m_lower_value; }
     int GetHigherValue() const { return m_higher_value; }
     int GetActiveValue() const;
+    wxSize get_min_size() const ;
     double GetLowerValueD()  { return get_double_value(ssLower); }
     double GetHigherValueD() { return get_double_value(ssHigher); }
     wxSize DoGetBestSize() const override;
@@ -801,16 +852,16 @@ private:
     int         m_max_value;
     int         m_lower_value;
     int         m_higher_value;
-    wxBitmap    m_bmp_thumb_higher;
-    wxBitmap    m_bmp_thumb_lower;
-    wxBitmap    m_bmp_add_tick_on;
-    wxBitmap    m_bmp_add_tick_off;
-    wxBitmap    m_bmp_del_tick_on;
-    wxBitmap    m_bmp_del_tick_off;
-    wxBitmap    m_bmp_one_layer_lock_on;
-    wxBitmap    m_bmp_one_layer_lock_off;
-    wxBitmap    m_bmp_one_layer_unlock_on;
-    wxBitmap    m_bmp_one_layer_unlock_off;
+    /*wxBitmap*/PrusaBitmap    m_bmp_thumb_higher;
+    /*wxBitmap*/PrusaBitmap    m_bmp_thumb_lower;
+    /*wxBitmap*/PrusaBitmap    m_bmp_add_tick_on;
+    /*wxBitmap*/PrusaBitmap    m_bmp_add_tick_off;
+    /*wxBitmap*/PrusaBitmap    m_bmp_del_tick_on;
+    /*wxBitmap*/PrusaBitmap    m_bmp_del_tick_off;
+    /*wxBitmap*/PrusaBitmap    m_bmp_one_layer_lock_on;
+    /*wxBitmap*/PrusaBitmap    m_bmp_one_layer_lock_off;
+    /*wxBitmap*/PrusaBitmap    m_bmp_one_layer_unlock_on;
+    /*wxBitmap*/PrusaBitmap    m_bmp_one_layer_unlock_off;
     SelectedSlider  m_selection;
     bool        m_is_left_down = false;
     bool        m_is_right_down = false;
@@ -869,16 +920,54 @@ public:
     bool    IsLocked() const { return m_is_pushed; }
     void    SetLock(bool lock);
 
+    void    rescale();
+
 protected:
     void    enter_button(const bool enter);
 
 private:
     bool        m_is_pushed = false;
 
-    wxBitmap    m_bmp_lock_on;
-    wxBitmap    m_bmp_lock_off;
-    wxBitmap    m_bmp_unlock_on;
-    wxBitmap    m_bmp_unlock_off;
+    /*wxBitmap*/PrusaBitmap    m_bmp_lock_on;
+    /*wxBitmap*/PrusaBitmap    m_bmp_lock_off;
+    /*wxBitmap*/PrusaBitmap    m_bmp_unlock_on;
+    /*wxBitmap*/PrusaBitmap    m_bmp_unlock_off;
+};
+
+
+// ----------------------------------------------------------------------------
+// PrusaButton
+// ----------------------------------------------------------------------------
+
+class PrusaButton : public wxButton
+{
+public:
+    PrusaButton(){}
+    PrusaButton(
+        wxWindow *parent,
+        wxWindowID id,
+        const std::string& icon_name = "",
+        const wxString& label = wxEmptyString,
+        const wxSize& size = wxDefaultSize,
+        const wxPoint& pos = wxDefaultPosition,
+        long style = wxBU_EXACTFIT | wxNO_BORDER);
+
+    PrusaButton(
+        wxWindow *parent,
+        wxWindowID id,
+        const PrusaBitmap& bitmap,
+        const wxString& label = wxEmptyString,
+        long style = wxBU_EXACTFIT | wxNO_BORDER);
+
+    ~PrusaButton() {}
+
+    void SetBitmap_(const PrusaBitmap& bmp);
+
+    void    rescale();
+
+private:
+    wxWindow*       m_parent;
+    std::string     m_current_icon_name = "";
 };
 
 
@@ -886,14 +975,14 @@ private:
 // PrusaModeButton
 // ----------------------------------------------------------------------------
 
-class PrusaModeButton : public wxButton
+class PrusaModeButton : public PrusaButton/*wxButton*/
 {
 public:
     PrusaModeButton(
         wxWindow *parent,
         wxWindowID id,
+        const std::string& icon_name = "",
         const wxString& mode = wxEmptyString,
-        const wxBitmap& bmp_on = wxNullBitmap,
         const wxSize& size = wxDefaultSize,
         const wxPoint& pos = wxDefaultPosition);
     ~PrusaModeButton() {}
@@ -910,8 +999,8 @@ protected:
 private:
     bool        m_is_selected = false;
 
-    wxBitmap    m_bmp_on;
-    wxBitmap    m_bmp_off;
+//     wxBitmap    m_bmp_on;
+//     wxBitmap    m_bmp_off;
     wxString    m_tt_selected;
     wxString    m_tt_focused;
 };
@@ -930,6 +1019,8 @@ public:
 
     void SetMode(const /*ConfigOptionMode*/int mode);
 
+    void rescale();
+
 private:
     std::vector<PrusaModeButton*> mode_btns;
 };
@@ -958,8 +1049,5 @@ public:
 };
 
 
-// ******************************* EXPERIMENTS **********************************************
-// ******************************************************************************************
-
 
 #endif // slic3r_GUI_wxExtensions_hpp_