diff --git a/xs/src/slic3r/GUI/GLCanvas3D.cpp b/xs/src/slic3r/GUI/GLCanvas3D.cpp
index b71f1ae91..07020bdb7 100644
--- a/xs/src/slic3r/GUI/GLCanvas3D.cpp
+++ b/xs/src/slic3r/GUI/GLCanvas3D.cpp
@@ -3438,6 +3438,14 @@ void GLCanvas3D::reset_legend_texture()
     m_legend_texture.reset();
 }
 
+//###################################################################################################################################
+void GLCanvas3D::set_tooltip(const std::string& tooltip)
+{
+    if (m_canvas != nullptr)
+        m_canvas->SetToolTip(tooltip);
+}
+//###################################################################################################################################
+
 bool GLCanvas3D::_is_shown_on_screen() const
 {
     return (m_canvas != nullptr) ? m_canvas->IsShownOnScreen() : false;
@@ -3518,7 +3526,7 @@ bool GLCanvas3D::_init_toolbar()
         return false;
 
     item.name = "ccw45";
-    item.tooltip = GUI::L_str("Rotate CCW 45�");
+    item.tooltip = GUI::L_str("Rotate CCW 45 degrees");
     item.textures[GLToolbarItem::Normal] = "arrow_rotate_anticlockwise_normal_36.png";
     item.textures[GLToolbarItem::Hover] = "arrow_rotate_anticlockwise_hover_36.png";
     item.textures[GLToolbarItem::Pressed] = "arrow_rotate_anticlockwise_pressed_36.png";
@@ -3527,7 +3535,7 @@ bool GLCanvas3D::_init_toolbar()
         return false;
 
     item.name = "cw45";
-    item.tooltip = GUI::L_str("Rotate CW 45�");
+    item.tooltip = GUI::L_str("Rotate CW 45 degrees");
     item.textures[GLToolbarItem::Normal] = "arrow_rotate_clockwise_normal_36.png";
     item.textures[GLToolbarItem::Hover] = "arrow_rotate_clockwise_hover_36.png";
     item.textures[GLToolbarItem::Pressed] = "arrow_rotate_clockwise_pressed_36.png";
@@ -3886,7 +3894,7 @@ void GLCanvas3D::_picking_pass() const
             m_gizmos.reset_all_states();
 
 //###################################################################################################################################
-        m_toolbar.update_hover_state(*this, pos);
+        m_toolbar.update_hover_state(const_cast<GLCanvas3D&>(*this), pos);
 //###################################################################################################################################
     }
 }
diff --git a/xs/src/slic3r/GUI/GLCanvas3D.hpp b/xs/src/slic3r/GUI/GLCanvas3D.hpp
index 9bca50dad..24b848d6c 100644
--- a/xs/src/slic3r/GUI/GLCanvas3D.hpp
+++ b/xs/src/slic3r/GUI/GLCanvas3D.hpp
@@ -619,6 +619,10 @@ public:
 
     void reset_legend_texture();
 
+//###################################################################################################################################
+    void set_tooltip(const std::string& tooltip);
+//###################################################################################################################################
+
 private:
     bool _is_shown_on_screen() const;
     void _force_zoom_to_bed();
diff --git a/xs/src/slic3r/GUI/GLToolbar.cpp b/xs/src/slic3r/GUI/GLToolbar.cpp
index 70f7ef79c..fe861a45d 100644
--- a/xs/src/slic3r/GUI/GLToolbar.cpp
+++ b/xs/src/slic3r/GUI/GLToolbar.cpp
@@ -12,85 +12,11 @@
 namespace Slic3r {
 namespace GUI {
 
-const unsigned char GLToolbarItem::TooltipTexture::Border_Color[3] = { 0, 0, 0 };
-const int GLToolbarItem::TooltipTexture::Border_Offset = 5;
-
-bool GLToolbarItem::TooltipTexture::generate(const std::string& text)
-{
-    reset();
-
-    if (text.empty())
-        return false;
-
-    wxMemoryDC memDC;
-    // select default font
-    memDC.SetFont(wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT));
-
-    // calculates texture size
-    wxCoord w, h;
-    memDC.GetTextExtent(text, &w, &h);
-    m_width = (int)w + 2 * Border_Offset;
-    m_height = (int)h + 2 * Border_Offset;
-
-    // generates bitmap
-    wxBitmap bitmap(m_width, m_height);
-
-    memDC.SelectObject(bitmap);
-    memDC.SetBackground(wxSystemSettings::GetColour(wxSYS_COLOUR_INFOBK));
-    memDC.Clear();
-
-    // draw message
-    memDC.SetTextForeground(wxSystemSettings::GetColour(wxSYS_COLOUR_INFOTEXT));
-    memDC.DrawText(text, (wxCoord)Border_Offset, (wxCoord)Border_Offset);
-
-    wxPen pen(wxSystemSettings::GetColour(wxSYS_COLOUR_ACTIVEBORDER));
-    memDC.SetPen(pen);
-    wxCoord ww = (wxCoord)m_width - 1;
-    wxCoord hh = (wxCoord)m_height - 1;
-    memDC.DrawLine(0, 0, ww, 0);
-    memDC.DrawLine(ww, 0, ww, hh);
-    memDC.DrawLine(ww, hh, 0, hh);
-    memDC.DrawLine(0, hh, 0, 0);
-
-    memDC.SelectObject(wxNullBitmap);
-
-    // Convert the bitmap into a linear data ready to be loaded into the GPU.
-    wxImage image = bitmap.ConvertToImage();
-
-    // prepare buffer
-    std::vector<unsigned char> data(4 * m_width * m_height, 0);
-    for (int h = 0; h < m_height; ++h)
-    {
-        int hh = h * m_width;
-        unsigned char* px_ptr = data.data() + 4 * hh;
-        for (int w = 0; w < m_width; ++w)
-        {
-            *px_ptr++ = image.GetRed(w, h);
-            *px_ptr++ = image.GetGreen(w, h);
-            *px_ptr++ = image.GetBlue(w, h);
-            *px_ptr++ = 255;
-        }
-    }
-
-    // sends buffer to gpu
-    ::glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
-    ::glGenTextures(1, &m_id);
-    ::glBindTexture(GL_TEXTURE_2D, (GLuint)m_id);
-    ::glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (GLsizei)m_width, (GLsizei)m_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, (const void*)data.data());
-    ::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-    ::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-    ::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 1);
-    ::glBindTexture(GL_TEXTURE_2D, 0);
-
-    return true;
-}
-
 GLToolbarItem::GLToolbarItem(EType type, const std::string& name, const std::string& tooltip)
     : m_type(type)
     , m_state(Disabled)
     , m_name(name)
     , m_tooltip(tooltip)
-    , m_tooltip_shown(false)
 {
 }
 
@@ -108,12 +34,6 @@ bool GLToolbarItem::load_textures(const std::string* filenames)
             return false;
     }
 
-    if ((m_type == Action) && !m_tooltip.empty())
-    {
-        if (!m_tooltip_texture.generate(m_tooltip))
-            return false;
-    }
-
     return true;
 }
 
@@ -132,19 +52,9 @@ const std::string& GLToolbarItem::get_name() const
     return m_name;
 }
 
-void GLToolbarItem::show_tooltip()
+const std::string& GLToolbarItem::get_tooltip() const
 {
-    m_tooltip_shown = true;
-}
-
-void GLToolbarItem::hide_tooltip()
-{
-    m_tooltip_shown = false;
-}
-
-bool GLToolbarItem::is_tooltip_shown() const
-{
-    return m_tooltip_shown && (m_tooltip_texture.get_id() > 0);
+    return m_tooltip;
 }
 
 unsigned int GLToolbarItem::get_icon_texture_id() const
@@ -157,21 +67,6 @@ int GLToolbarItem::get_icon_textures_size() const
     return m_icon_textures[Normal].get_width();
 }
 
-unsigned int GLToolbarItem::get_tooltip_texture_id() const
-{
-    return m_tooltip_texture.get_id();
-}
-
-int GLToolbarItem::get_tooltip_texture_width() const
-{
-    return m_tooltip_texture.get_width();
-}
-
-int GLToolbarItem::get_tooltip_texture_height() const
-{
-    return m_tooltip_texture.get_height();
-}
-
 bool GLToolbarItem::is_separator() const
 {
     return m_type == Separator;
@@ -224,9 +119,6 @@ bool GLToolbar::add_item(const GLToolbar::ItemCreationData& data)
 
     m_items.push_back(item);
 
-    if (data.name == "add")
-        item->show_tooltip();
-
     return true;
 }
 
@@ -264,7 +156,7 @@ void GLToolbar::disable_item(const std::string& name)
     }
 }
 
-void GLToolbar::update_hover_state(const GLCanvas3D& canvas, const Pointf& mouse_pos)
+void GLToolbar::update_hover_state(GLCanvas3D& canvas, const Pointf& mouse_pos)
 {
     if (!m_enabled)
         return;
@@ -274,6 +166,8 @@ void GLToolbar::update_hover_state(const GLCanvas3D& canvas, const Pointf& mouse
     float left = 0.5f * (cnv_w - width);
     float top = m_offset_y;
 
+    std::string tooltip = "";
+
     for (GLToolbarItem* item : m_items)
     {
         if (item->is_separator())
@@ -297,6 +191,14 @@ void GLToolbar::update_hover_state(const GLCanvas3D& canvas, const Pointf& mouse
                 break;
             }
             case GLToolbarItem::Hover:
+            {
+                if (inside)
+                    tooltip = item->get_tooltip();
+                else
+                    item->set_state(GLToolbarItem::Normal);
+
+                break;
+            }
             case GLToolbarItem::Pressed:
             {
                 if (!inside)
@@ -313,6 +215,8 @@ void GLToolbar::update_hover_state(const GLCanvas3D& canvas, const Pointf& mouse
             left += (tex_size + m_gap_x);
         }
     }
+
+    canvas.set_tooltip(tooltip);
 }
 
 void GLToolbar::render(const GLCanvas3D& canvas, const Pointf& mouse_pos) const
@@ -349,20 +253,6 @@ void GLToolbar::render(const GLCanvas3D& canvas, const Pointf& mouse_pos) const
         }
     }
 
-    // renders tooltip
-    for (const GLToolbarItem* item : m_items)
-    {
-        if (!item->is_separator() && item->is_tooltip_shown())
-        {
-            float l = (-0.5f * cnv_w + (float)mouse_pos.x) * inv_zoom;
-            float r = l + (float)item->get_tooltip_texture_width() * inv_zoom;
-            float t = (0.5f * cnv_h - (float)mouse_pos.y) * inv_zoom;
-            float b = t - (float)item->get_tooltip_texture_height() * inv_zoom;
-            GLTexture::render_texture(item->get_tooltip_texture_id(), l, r, b, t);
-            break;
-        }
-    }
-
     ::glPopMatrix();
 }
 
diff --git a/xs/src/slic3r/GUI/GLToolbar.hpp b/xs/src/slic3r/GUI/GLToolbar.hpp
index 09429677c..5a1af5b37 100644
--- a/xs/src/slic3r/GUI/GLToolbar.hpp
+++ b/xs/src/slic3r/GUI/GLToolbar.hpp
@@ -33,19 +33,9 @@ public:
         Num_States
     };
 
-    class TooltipTexture : public GLTexture
-    {
-        static const unsigned char Border_Color[3];
-        static const int Border_Offset;
-
-    public:
-        bool generate(const std::string& text);
-    };
-
 private:
     // icon textures are assumed to be square and all with the same size in pixels, no internal check is done
     GLTexture m_icon_textures[Num_States];
-    TooltipTexture m_tooltip_texture;
 
     EType m_type;
     EState m_state;
@@ -53,8 +43,6 @@ private:
     std::string m_name;
     std::string m_tooltip;
 
-    bool m_tooltip_shown;
-
 public:
     GLToolbarItem(EType type, const std::string& name, const std::string& tooltip);
 
@@ -65,18 +53,11 @@ public:
 
     const std::string& get_name() const;
 
-    void show_tooltip();
-    void hide_tooltip();
-
-    bool is_tooltip_shown() const;
+    const std::string& get_tooltip() const;
 
     unsigned int get_icon_texture_id() const;
     int get_icon_textures_size() const;
 
-    unsigned int get_tooltip_texture_id() const;
-    int get_tooltip_texture_width() const;
-    int get_tooltip_texture_height() const;
-
     bool is_separator() const;
 };
 
@@ -118,7 +99,7 @@ public:
     void enable_item(const std::string& name);
     void disable_item(const std::string& name);
 
-    void update_hover_state(const GLCanvas3D& canvas, const Pointf& mouse_pos);
+    void update_hover_state(GLCanvas3D& canvas, const Pointf& mouse_pos);
 
     void render(const GLCanvas3D& canvas, const Pointf& mouse_pos) const;