diff --git a/src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp b/src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp
index 3ea3eeda8..70793ce82 100644
--- a/src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp
+++ b/src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp
@@ -1100,9 +1100,29 @@ bool GLGizmoEmboss::set_volume(ModelVolume *volume)
     m_unmodified_volume = {*volume->get_mesh_shared_ptr(), // copy
                            tc, volume->get_matrix(), volume->name};
 
+    // calculate scale for height and depth inside of scaled object instance
+    calculate_scale();
     return true;
 }
 
+void GLGizmoEmboss::calculate_scale() {
+    Transform3d to_world = priv::world_matrix(m_parent.get_selection());
+    auto to_world_linear = to_world.linear();
+    Vec3d up_world = to_world_linear * Vec3d::UnitY();
+    double norm_sq = up_world.squaredNorm();
+    if (is_approx(norm_sq, 1.))
+        m_scale_height.reset();
+    else 
+        m_scale_height = sqrt(norm_sq);
+
+    Vec3d depth_world = to_world_linear * Vec3d::UnitZ();
+    double depth_sq = depth_world.squaredNorm();
+    if (is_approx(depth_sq, 1.))
+        m_scale_depth.reset();
+    else
+        m_scale_depth = sqrt(depth_sq);
+}
+
 ModelVolume *priv::get_model_volume(const GLVolume *gl_volume, const ModelObject *object)
 {
     int volume_id = gl_volume->volume_idx();
@@ -1455,10 +1475,11 @@ void GLGizmoEmboss::draw_text_input()
         return create_range_text(text, *ff.font_file, font_index, &exist_unknown);
     };
     
+    double scale = m_scale_height.has_value() ? *m_scale_height : 1.;
     ImFont *imgui_font = m_style_manager.get_imgui_font();
     if (imgui_font == nullptr) {
         // try create new imgui font
-        m_style_manager.create_imgui_font(create_range_text_prep());
+        m_style_manager.create_imgui_font(create_range_text_prep(), scale);
         imgui_font = m_style_manager.get_imgui_font();
     }
     bool exist_font = 
@@ -1498,7 +1519,7 @@ void GLGizmoEmboss::draw_text_input()
         if (prop.line_gap.has_value())
             append_warning(_u8L("Line gap"), _u8L("Unsupported visualization of gap between lines inside text input."));
         auto &ff         = m_style_manager.get_font_file_with_cache();
-        float imgui_size = StyleManager::get_imgui_font_size(prop, *ff.font_file);
+        float imgui_size = StyleManager::get_imgui_font_size(prop, *ff.font_file, scale);
         if (imgui_size > StyleManager::max_imgui_font_size)
             append_warning(_u8L("To tall"), _u8L("Diminished font height inside text input."));
         if (imgui_size < StyleManager::min_imgui_font_size)
@@ -1552,7 +1573,7 @@ void GLGizmoEmboss::draw_text_input()
     if (!range_text.empty() &&
         !m_imgui->contain_all_glyphs(imgui_font, range_text) ) { 
         m_style_manager.clear_imgui_font(); 
-        m_style_manager.create_imgui_font(range_text);
+        m_style_manager.create_imgui_font(range_text, scale);
     }
 }
 
@@ -2628,7 +2649,7 @@ bool GLGizmoEmboss::rev_input_mm(const std::string   &name,
                                  float                step_fast,
                                  const char          *format,
                                  bool                 use_inch,
-                                 std::optional<float> scale)
+                                 const std::optional<float>& scale)
 {
     // _variable which temporary keep value
     float  value_ = value;
@@ -2758,16 +2779,8 @@ void GLGizmoEmboss::draw_style_edit() {
     }
 
     bool use_inch = wxGetApp().app_config->get("use_inches") == "1";
-
-    // IMPROVE: calc scale only when neccessary not each frame
-    Transform3d to_world = priv::world_matrix(m_parent.get_selection());
-    Vec3d up_world = to_world.linear() * Vec3d(0., 1., 0.);
-    double norm_sq = up_world.squaredNorm();
-    std::optional<float> height_scale;
-    if (!is_approx(norm_sq, 1.))
-        height_scale = sqrt(norm_sq);
-
-    draw_height(height_scale, use_inch);
+    draw_height(use_inch);
+    draw_depth(use_inch);
 
 #ifdef SHOW_WX_WEIGHT_INPUT
     if (wx_font.has_value()) {
@@ -2793,16 +2806,10 @@ void GLGizmoEmboss::draw_style_edit() {
         if (ImGui::IsItemHovered())
             ImGui::SetTooltip("%s", _u8L("wx Make bold").c_str());
     }
-#endif // SHOW_WX_WEIGHT_INPUT
-
-    Vec3d depth_world = to_world.linear() * Vec3d(0., 0., 1.);
-    double depth_sq = depth_world.squaredNorm();
-    std::optional<float> depth_scale;
-    if (!is_approx(depth_sq, 1.)) depth_scale = sqrt(depth_sq);   
-    draw_depth(depth_scale, use_inch);
+#endif // SHOW_WX_WEIGHT_INPUT 
 }
 
-void GLGizmoEmboss::draw_height(std::optional<float> scale, bool use_inch)
+void GLGizmoEmboss::draw_height(bool use_inch)
 {
     float &value = m_style_manager.get_style().prop.size_in_mm;
     const EmbossStyle* stored_style = m_style_manager.get_stored_style();
@@ -2810,7 +2817,7 @@ void GLGizmoEmboss::draw_height(std::optional<float> scale, bool use_inch)
     const char *size_format = ((use_inch) ? "%.2f in" : "%.1f mm");
     const std::string revert_text_size = _u8L("Revert text size.");
     const std::string& name = m_gui_cfg->translations.size;
-    if(rev_input_mm(name, value, stored, revert_text_size, 0.1f, 1.f, size_format, use_inch, scale)){
+    if (rev_input_mm(name, value, stored, revert_text_size, 0.1f, 1.f, size_format, use_inch, m_scale_height)) {
         // size can't be zero or negative
         priv::Limits::apply(value, priv::limits.size_in_mm);
         // only different value need process
@@ -2830,7 +2837,7 @@ void GLGizmoEmboss::draw_height(std::optional<float> scale, bool use_inch)
     }
 }
 
-void GLGizmoEmboss::draw_depth(std::optional<float> scale, bool use_inch)
+void GLGizmoEmboss::draw_depth(bool use_inch)
 {
     float &value = m_style_manager.get_style().prop.emboss;
     const EmbossStyle* stored_style = m_style_manager.get_stored_style();
@@ -2838,7 +2845,7 @@ void GLGizmoEmboss::draw_depth(std::optional<float> scale, bool use_inch)
     const std::string  revert_emboss_depth = _u8L("Revert embossed depth.");
     const char *size_format = ((use_inch) ? "%.3f in" : "%.2f mm");
     const std::string  name = m_gui_cfg->translations.depth;
-    if (rev_input_mm(name, value, stored, revert_emboss_depth, 0.1f, 1.f, size_format, use_inch, scale)) {
+    if (rev_input_mm(name, value, stored, revert_emboss_depth, 0.1f, 1.f, size_format, use_inch, m_scale_depth)) {
         // size can't be zero or negative
         priv::Limits::apply(value, priv::limits.emboss);
         process();
diff --git a/src/slic3r/GUI/Gizmos/GLGizmoEmboss.hpp b/src/slic3r/GUI/Gizmos/GLGizmoEmboss.hpp
index 54dace52b..7b0548fb5 100644
--- a/src/slic3r/GUI/Gizmos/GLGizmoEmboss.hpp
+++ b/src/slic3r/GUI/Gizmos/GLGizmoEmboss.hpp
@@ -111,8 +111,8 @@ private:
     void draw_font_preview(FaceName &face, bool is_visible);
     void draw_font_list();
     void draw_style_edit();
-    void draw_height(std::optional<float> scale, bool use_inch);
-    void draw_depth(std::optional<float> scale, bool use_inch);
+    void draw_height(bool use_inch);
+    void draw_depth(bool use_inch);
 
     bool draw_italic_button();
     bool draw_bold_button();
@@ -126,7 +126,7 @@ private:
 
     bool rev_input_mm(const std::string &name, float &value, const float *default_value,
         const std::string &undo_tooltip, float step, float step_fast, const char *format,
-        bool use_inch = false, std::optional<float> scale = {});
+        bool use_inch, const std::optional<float>& scale);
 
     /// <summary>
     /// Reversible input float with option to restor default value
@@ -309,6 +309,11 @@ private:
     // Only when drag text object it stores world position
     std::optional<Transform3d> m_temp_transformation;
 
+    // For text on scaled objects
+    std::optional<float> m_scale_height;
+    std::optional<float> m_scale_depth;
+    void calculate_scale();
+
     // drawing icons
     GLTexture m_icons_texture;
     void init_icons();
diff --git a/src/slic3r/Utils/EmbossStyleManager.cpp b/src/slic3r/Utils/EmbossStyleManager.cpp
index 22ad0827e..ff7795fdd 100644
--- a/src/slic3r/Utils/EmbossStyleManager.cpp
+++ b/src/slic3r/Utils/EmbossStyleManager.cpp
@@ -244,13 +244,6 @@ ImFont *StyleManager::get_imgui_font()
 
 const std::vector<StyleManager::Item> &StyleManager::get_styles() const{ return m_style_items; }
 
-ImFont* StyleManager::extend_imgui_font_range(size_t index, const std::string& text)
-{
-    // TODO: start using merge mode
-    // ImFontConfig::MergeMode = true;
-    return create_imgui_font(text);
-}
-
 void StyleManager::make_unique_name(std::string &name)
 {
     auto is_unique = [&](const std::string &name) -> bool {
@@ -369,8 +362,7 @@ void StyleManager::free_style_images() {
 
 float StyleManager::min_imgui_font_size = 18.f;
 float StyleManager::max_imgui_font_size = 60.f;
-float StyleManager::get_imgui_font_size(const FontProp         &prop,
-                                              const FontFile &file)
+float StyleManager::get_imgui_font_size(const FontProp &prop, const FontFile &file, double scale)
 {
     const auto  &cn = prop.collection_number;
     unsigned int font_index = (cn.has_value()) ? *cn : 0;
@@ -381,10 +373,10 @@ float StyleManager::get_imgui_font_size(const FontProp         &prop,
 
     // The point size is defined as 1/72 of the Anglo-Saxon inch (25.4 mm):
     // It is approximately 0.0139 inch or 352.8 um.
-    return c1 * std::abs(prop.size_in_mm) / 0.3528f;
+    return c1 * std::abs(prop.size_in_mm) / 0.3528f * scale;
 }
 
-ImFont *StyleManager::create_imgui_font(const std::string &text)
+ImFont *StyleManager::create_imgui_font(const std::string &text, double scale)
 {
     // inspiration inside of ImGuiWrapper::init_font
     auto& ff = m_style_cache.font_file;
@@ -404,7 +396,7 @@ ImFont *StyleManager::create_imgui_font(const std::string &text)
                                 ImFontAtlasFlags_NoPowerOfTwoHeight;
 
     const FontProp &font_prop = m_style_cache.style.prop;
-    float font_size = get_imgui_font_size(font_prop, font_file);
+    float font_size = get_imgui_font_size(font_prop, font_file, scale);
     if (font_size < min_imgui_font_size)
         font_size = min_imgui_font_size;
     if (font_size > max_imgui_font_size)
diff --git a/src/slic3r/Utils/EmbossStyleManager.hpp b/src/slic3r/Utils/EmbossStyleManager.hpp
index 3851a1051..858de89ac 100644
--- a/src/slic3r/Utils/EmbossStyleManager.hpp
+++ b/src/slic3r/Utils/EmbossStyleManager.hpp
@@ -139,7 +139,7 @@ public:
     // Extend font atlas when not in glyph range
     ImFont *get_imgui_font();
     // initialize font range by unique symbols in text
-    ImFont *create_imgui_font(const std::string& text);
+    ImFont *create_imgui_font(const std::string& text, double scale);
     
     // init truncated names of styles
     void init_trunc_names(float max_width);
@@ -191,7 +191,7 @@ public:
     // Value out of limits is crop
     static float min_imgui_font_size;
     static float max_imgui_font_size;
-    static float get_imgui_font_size(const FontProp &prop, const Slic3r::Emboss::FontFile &file);
+    static float get_imgui_font_size(const FontProp &prop, const Slic3r::Emboss::FontFile &file, double scale);
 
 private:
     // erase font when not possible to load
@@ -231,11 +231,6 @@ private:
         size_t style_index = std::numeric_limits<size_t>::max();
 
     } m_style_cache;
-            
-    // extend actual imgui font when exist unknown char in text
-    // NOTE: imgui_font has to be unused
-    // return true when extend range otherwise FALSE
-    ImFont *extend_imgui_font_range(size_t font_index, const std::string &text);
 
     void make_unique_name(std::string &name);