diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp
index 3c720d5df..c40e131bc 100644
--- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp
+++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp
@@ -429,19 +429,60 @@ bool GLGizmoHollow::on_mouse(const wxMouseEvent &mouse_event)
     Selection & selection        = m_parent.get_selection();
     static bool pending_right_up = false;
 
-    if (mouse_event.RightDown() && selection.get_object_idx() != -1 &&
-        gizmo_event(SLAGizmoEventType::RightDown, mouse_pos, false, false, false)) {
-        // we need to set the following right up as processed to avoid showing
-        // the context menu if the user release the mouse over the object
-        pending_right_up = true;
-        // event was taken care of by the SlaSupports gizmo
-        return true;
+    // when control is down we allow scene pan and rotation even when clicking
+    // over some object
+    bool control_down           = mouse_event.CmdDown();
+    bool grabber_contains_mouse = (get_hover_id() != -1);
+    int  selected_object_idx = selection.get_object_idx();
+    if (mouse_event.LeftDown()) {
+        if ((!control_down || grabber_contains_mouse) &&
+            gizmo_event(SLAGizmoEventType::LeftDown, mouse_pos, mouse_event.ShiftDown(), mouse_event.AltDown(), false))
+            // the gizmo got the event and took some action, there is no need
+            // to do anything more
+            return true;
+    } else if (mouse_event.Dragging()) {
+        if (m_parent.get_move_volume_id() != -1)
+            // don't allow dragging objects with the Sla gizmo on
+            return true;
+        if (control_down) {
+            if ((mouse_event.LeftIsDown() || mouse_event.RightIsDown())) {
+                // CTRL has been pressed while already dragging -> stop current action
+                if (mouse_event.LeftIsDown())
+                    gizmo_event(SLAGizmoEventType::LeftUp, mouse_pos, mouse_event.ShiftDown(), mouse_event.AltDown(), true);
+                else if (mouse_event.RightIsDown())
+                    gizmo_event(SLAGizmoEventType::RightUp, mouse_pos, mouse_event.ShiftDown(), mouse_event.AltDown(), true);
+            }    
+        } else if(gizmo_event(SLAGizmoEventType::Dragging, mouse_pos, mouse_event.ShiftDown(), mouse_event.AltDown(), false)) {
+            // the gizmo got the event and took some action, no need to do
+            // anything more here
+            m_parent.set_as_dirty();
+            return true;
+        }
+    } else if (mouse_event.LeftUp()) {    
+        if (!m_parent.is_mouse_dragging()) {
+            // in case gizmo is selected, we just pass the LeftUp event
+            // and stop processing - neither object moving or selecting is
+            // suppressed in that case
+            gizmo_event(SLAGizmoEventType::LeftUp, mouse_pos,
+                        mouse_event.ShiftDown(), mouse_event.AltDown(),
+                        control_down);
+            return true;
+        }
+    } else if (mouse_event.RightDown()) {
+        if (selection.get_object_idx() != -1 &&
+            gizmo_event(SLAGizmoEventType::RightDown, mouse_pos, false, false, false)) {
+            // we need to set the following right up as processed to avoid showing
+            // the context menu if the user release the mouse over the object
+            pending_right_up = true;
+            // event was taken care of by the SlaSupports gizmo
+            return true;
+        }
+    } else if (mouse_event.RightUp()) {
+        if (pending_right_up) {
+            pending_right_up = false;
+            return true;
+        }
     }
-    if (pending_right_up && mouse_event.RightUp()) {
-        pending_right_up = false;
-        return true;
-    }
-
     return false;
 }
 
diff --git a/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp b/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp
index a5009b210..4f806b711 100644
--- a/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp
+++ b/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp
@@ -643,21 +643,13 @@ bool GLGizmoPainterBase::gizmo_event(SLAGizmoEventType action, const Vec2d& mous
 
 bool GLGizmoPainterBase::on_mouse(const wxMouseEvent &mouse_event)
 {
-    // TODO: distribute implementation into gizmos itself
-
-    GLGizmosManager &      mng          = m_parent.get_gizmos_manager();
-    GLGizmosManager::EType current_type = mng.get_current_type();
-
     // wxCoord == int --> wx/types.h
     Vec2i mouse_coord(mouse_event.GetX(), mouse_event.GetY());
     Vec2d mouse_pos = mouse_coord.cast<double>();
 
     if (mouse_event.Moving()) {
-        if (current_type == GLGizmosManager::MmuSegmentation ||
-            current_type == GLGizmosManager::FdmSupports)
-            gizmo_event(SLAGizmoEventType::Moving, mouse_pos,
-                        mouse_event.ShiftDown(), mouse_event.AltDown(),
-                        false);
+        gizmo_event(SLAGizmoEventType::Moving, mouse_pos, mouse_event.ShiftDown(), mouse_event.AltDown(), false);
+        return false;
     }
 
     // when control is down we allow scene pan and rotation even when clicking
@@ -667,79 +659,51 @@ bool GLGizmoPainterBase::on_mouse(const wxMouseEvent &mouse_event)
 
     const Selection &selection = m_parent.get_selection();
     int selected_object_idx = selection.get_object_idx();
-    if (mouse_event.LeftDown() && (!control_down || grabber_contains_mouse)) {
-        if ((current_type == GLGizmosManager::SlaSupports ||
-             current_type == GLGizmosManager::Hollow ||
-             current_type == GLGizmosManager::FdmSupports ||
-             current_type == GLGizmosManager::Seam ||
-             current_type == GLGizmosManager::MmuSegmentation) &&
-            gizmo_event(SLAGizmoEventType::LeftDown, mouse_pos,
-                        mouse_event.ShiftDown(), mouse_event.AltDown(), false))
+    if (mouse_event.LeftDown()) {
+        if ((!control_down || grabber_contains_mouse) &&            
+            gizmo_event(SLAGizmoEventType::LeftDown, mouse_pos, mouse_event.ShiftDown(), mouse_event.AltDown(), false))
             // the gizmo got the event and took some action, there is no need
             // to do anything more
             return true;
-    } else if (mouse_event.RightDown() && !control_down && selected_object_idx != -1 &&
-               (current_type == GLGizmosManager::FdmSupports ||
-                current_type == GLGizmosManager::Seam ||
-                current_type == GLGizmosManager::MmuSegmentation) &&
-               gizmo_event(SLAGizmoEventType::RightDown, mouse_pos, false, false, false)) {
-        // event was taken care of by the FdmSupports / Seam / MMUPainting gizmo
-        return true;
-    } else if (mouse_event.Dragging() &&
-               m_parent.get_move_volume_id() != -1 &&
-               (current_type == GLGizmosManager::SlaSupports ||
-                current_type == GLGizmosManager::Hollow ||
-                current_type == GLGizmosManager::FdmSupports ||
-                current_type == GLGizmosManager::Seam ||
-                current_type == GLGizmosManager::MmuSegmentation))
-        // don't allow dragging objects with the Sla gizmo on
-        return true;
-    else if (mouse_event.Dragging() && !control_down &&
-             (current_type == GLGizmosManager::SlaSupports ||
-              current_type == GLGizmosManager::Hollow ||
-              current_type == GLGizmosManager::FdmSupports ||
-              current_type == GLGizmosManager::Seam ||
-              current_type == GLGizmosManager::MmuSegmentation) &&
-             gizmo_event(SLAGizmoEventType::Dragging, mouse_pos,
-                         mouse_event.ShiftDown(), mouse_event.AltDown(), false)) {
-        // the gizmo got the event and took some action, no need to do
-        // anything more here
-        m_parent.set_as_dirty();
-        return true;
-    } else if (mouse_event.Dragging() && control_down &&
-               (mouse_event.LeftIsDown() || mouse_event.RightIsDown())) {
-        // CTRL has been pressed while already dragging -> stop current action
-        if (mouse_event.LeftIsDown())
-            gizmo_event(SLAGizmoEventType::LeftUp, mouse_pos,
-                        mouse_event.ShiftDown(), mouse_event.AltDown(), true);
-        else if (mouse_event.RightIsDown())
-            gizmo_event(SLAGizmoEventType::RightUp, mouse_pos,
-                        mouse_event.ShiftDown(), mouse_event.AltDown(), true);
-
-    } else if (mouse_event.LeftUp() &&
-               (current_type == GLGizmosManager::SlaSupports ||
-                current_type == GLGizmosManager::Hollow ||
-                current_type == GLGizmosManager::FdmSupports ||
-                current_type == GLGizmosManager::Seam ||
-                current_type == GLGizmosManager::MmuSegmentation) &&
-               !m_parent.is_mouse_dragging()) {
-        // in case SLA/FDM gizmo is selected, we just pass the LeftUp event
-        // and stop processing - neither object moving or selecting is
-        // suppressed in that case
-        gizmo_event(SLAGizmoEventType::LeftUp, mouse_pos,
-                    mouse_event.ShiftDown(), mouse_event.AltDown(),
-                    control_down);
-        return true;
-    } else if (mouse_event.RightUp() &&
-               (current_type == GLGizmosManager::FdmSupports ||
-                current_type == GLGizmosManager::Seam ||
-                current_type == GLGizmosManager::MmuSegmentation) &&
-               !m_parent.is_mouse_dragging()) {
-        gizmo_event(SLAGizmoEventType::RightUp, mouse_pos,
-                    mouse_event.ShiftDown(), mouse_event.AltDown(),
-                    control_down);
-
-        return true;
+    } else if (mouse_event.RightDown()){
+        if (!control_down && selected_object_idx != -1 &&
+            gizmo_event(SLAGizmoEventType::RightDown, mouse_pos, false, false, false)) 
+            // event was taken care of
+            return true;
+    } else if (mouse_event.Dragging()) {
+        if (m_parent.get_move_volume_id() != -1)
+            // don't allow dragging objects with the Sla gizmo on
+            return true;
+        if (!control_down && gizmo_event(SLAGizmoEventType::Dragging,
+                                         mouse_pos, mouse_event.ShiftDown(),
+                                         mouse_event.AltDown(), false)) {
+            // the gizmo got the event and took some action, no need to do
+            // anything more here
+            m_parent.set_as_dirty();
+            return true;
+        }
+        if(control_down && (mouse_event.LeftIsDown() || mouse_event.RightIsDown()))
+        {
+            // CTRL has been pressed while already dragging -> stop current action
+            if (mouse_event.LeftIsDown())
+                gizmo_event(SLAGizmoEventType::LeftUp, mouse_pos, mouse_event.ShiftDown(), mouse_event.AltDown(), true);
+            else if (mouse_event.RightIsDown())
+                gizmo_event(SLAGizmoEventType::RightUp, mouse_pos, mouse_event.ShiftDown(), mouse_event.AltDown(), true);
+            return false;
+        }
+    } else if (mouse_event.LeftUp()) {
+        if (!m_parent.is_mouse_dragging()) {
+            // in case SLA/FDM gizmo is selected, we just pass the LeftUp
+            // event and stop processing - neither object moving or selecting
+            // is suppressed in that case
+            gizmo_event(SLAGizmoEventType::LeftUp, mouse_pos, mouse_event.ShiftDown(), mouse_event.AltDown(), control_down);
+            return true;
+        }
+    } else if (mouse_event.RightUp()) {
+        if (!m_parent.is_mouse_dragging()) {
+            gizmo_event(SLAGizmoEventType::RightUp, mouse_pos, mouse_event.ShiftDown(), mouse_event.AltDown(), control_down);
+            return true;
+        }
     }
     return false;
 }