diff --git a/include/footprint_editor_settings.h b/include/footprint_editor_settings.h
index 1fefab4b1f..3c232adf4f 100644
--- a/include/footprint_editor_settings.h
+++ b/include/footprint_editor_settings.h
@@ -56,8 +56,7 @@ public:
 
     bool m_PolarCoords;
 
-    bool m_Use45DegreeGraphicSegments;   // True to constraint graphic lines to horizontal,
-    // vertical and 45º
+    bool m_Use45Limit;
 
     int m_LibWidth;
 
diff --git a/pcbnew/dialogs/panel_edit_options.cpp b/pcbnew/dialogs/panel_edit_options.cpp
index 9f0ffaf0d3..acbb15239f 100644
--- a/pcbnew/dialogs/panel_edit_options.cpp
+++ b/pcbnew/dialogs/panel_edit_options.cpp
@@ -59,8 +59,6 @@ bool PANEL_EDIT_OPTIONS::TransferDataToWindow()
     const PCB_DISPLAY_OPTIONS& displ_opts = m_frame->GetDisplayOptions();
     const PCBNEW_SETTINGS&     general_opts = m_frame->Settings();
 
-    m_segments45OnlyCtrl->SetValue( general_opts.m_Use45DegreeGraphicSegments );
-
     wxString rotationAngle;
     rotationAngle = AngleToStringDegrees( (double) m_frame->GetRotationAngle() );
     m_rotationAngle->SetValue( rotationAngle );
@@ -108,8 +106,6 @@ bool PANEL_EDIT_OPTIONS::TransferDataFromWindow()
 
     m_frame->SetRotationAngle( wxRound( 10.0 * wxAtof( m_rotationAngle->GetValue() ) ) );
 
-    m_frame->Settings().m_Use45DegreeGraphicSegments = m_segments45OnlyCtrl->GetValue();
-
     if( dynamic_cast<PCB_EDIT_FRAME*>( m_frame ) )
     {
         PCBNEW_SETTINGS&   pcbnewSettings = m_frame->Settings();
diff --git a/pcbnew/dialogs/panel_edit_options_base.cpp b/pcbnew/dialogs/panel_edit_options_base.cpp
index 178c83fb5c..f0cab42ce6 100644
--- a/pcbnew/dialogs/panel_edit_options_base.cpp
+++ b/pcbnew/dialogs/panel_edit_options_base.cpp
@@ -1,5 +1,5 @@
 ///////////////////////////////////////////////////////////////////////////
-// C++ code generated with wxFormBuilder (version Oct 26 2018)
+// C++ code generated with wxFormBuilder (version 3.9.0 Apr 22 2021)
 // http://www.wxformbuilder.org/
 //
 // PLEASE DO *NOT* EDIT THIS FILE!
@@ -47,11 +47,6 @@ PANEL_EDIT_OPTIONS_BASE::PANEL_EDIT_OPTIONS_BASE( wxWindow* parent, wxWindowID i
 	wxBoxSizer* bSizerUniversal;
 	bSizerUniversal = new wxBoxSizer( wxVERTICAL );
 
-	m_segments45OnlyCtrl = new wxCheckBox( bOptionsSizer->GetStaticBox(), wxID_SEGMENTS45, _("L&imit graphic lines to H, V and 45 degrees"), wxDefaultPosition, wxDefaultSize, 0 );
-	m_segments45OnlyCtrl->SetToolTip( _("When drawing graphic lines force to horizontal, vertical, or 45 degrees.") );
-
-	bSizerUniversal->Add( m_segments45OnlyCtrl, 0, wxBOTTOM, 3 );
-
 	wxBoxSizer* bSizerRotationStep;
 	bSizerRotationStep = new wxBoxSizer( wxHORIZONTAL );
 
diff --git a/pcbnew/dialogs/panel_edit_options_base.fbp b/pcbnew/dialogs/panel_edit_options_base.fbp
index 50101c3954..2ef726dda9 100644
--- a/pcbnew/dialogs/panel_edit_options_base.fbp
+++ b/pcbnew/dialogs/panel_edit_options_base.fbp
@@ -14,6 +14,7 @@
         <property name="file">panel_edit_options_base</property>
         <property name="first_id">1000</property>
         <property name="help_provider">none</property>
+        <property name="image_path_wrapper_function_name"></property>
         <property name="indent_with_spaces"></property>
         <property name="internationalize">1</property>
         <property name="name">PanelEditOptions</property>
@@ -25,6 +26,7 @@
         <property name="skip_php_events">1</property>
         <property name="skip_python_events">1</property>
         <property name="ui_table">UI</property>
+        <property name="use_array_enum">0</property>
         <property name="use_enum">1</property>
         <property name="use_microsoft_bom">0</property>
         <object class="Panel" expanded="1">
@@ -307,70 +309,6 @@
                                                 <property name="name">bSizerUniversal</property>
                                                 <property name="orient">wxVERTICAL</property>
                                                 <property name="permission">none</property>
-                                                <object class="sizeritem" expanded="1">
-                                                    <property name="border">3</property>
-                                                    <property name="flag">wxBOTTOM</property>
-                                                    <property name="proportion">0</property>
-                                                    <object class="wxCheckBox" expanded="1">
-                                                        <property name="BottomDockable">1</property>
-                                                        <property name="LeftDockable">1</property>
-                                                        <property name="RightDockable">1</property>
-                                                        <property name="TopDockable">1</property>
-                                                        <property name="aui_layer"></property>
-                                                        <property name="aui_name"></property>
-                                                        <property name="aui_position"></property>
-                                                        <property name="aui_row"></property>
-                                                        <property name="best_size"></property>
-                                                        <property name="bg"></property>
-                                                        <property name="caption"></property>
-                                                        <property name="caption_visible">1</property>
-                                                        <property name="center_pane">0</property>
-                                                        <property name="checked">0</property>
-                                                        <property name="close_button">1</property>
-                                                        <property name="context_help"></property>
-                                                        <property name="context_menu">1</property>
-                                                        <property name="default_pane">0</property>
-                                                        <property name="dock">Dock</property>
-                                                        <property name="dock_fixed">0</property>
-                                                        <property name="docking">Left</property>
-                                                        <property name="enabled">1</property>
-                                                        <property name="fg"></property>
-                                                        <property name="floatable">1</property>
-                                                        <property name="font"></property>
-                                                        <property name="gripper">0</property>
-                                                        <property name="hidden">0</property>
-                                                        <property name="id">wxID_SEGMENTS45</property>
-                                                        <property name="label">L&amp;imit graphic lines to H, V and 45 degrees</property>
-                                                        <property name="max_size"></property>
-                                                        <property name="maximize_button">0</property>
-                                                        <property name="maximum_size"></property>
-                                                        <property name="min_size"></property>
-                                                        <property name="minimize_button">0</property>
-                                                        <property name="minimum_size"></property>
-                                                        <property name="moveable">1</property>
-                                                        <property name="name">m_segments45OnlyCtrl</property>
-                                                        <property name="pane_border">1</property>
-                                                        <property name="pane_position"></property>
-                                                        <property name="pane_size"></property>
-                                                        <property name="permission">protected</property>
-                                                        <property name="pin_button">1</property>
-                                                        <property name="pos"></property>
-                                                        <property name="resize">Resizable</property>
-                                                        <property name="show">1</property>
-                                                        <property name="size"></property>
-                                                        <property name="style"></property>
-                                                        <property name="subclass"></property>
-                                                        <property name="toolbar_pane">0</property>
-                                                        <property name="tooltip">When drawing graphic lines force to horizontal, vertical, or 45 degrees.</property>
-                                                        <property name="validator_data_type"></property>
-                                                        <property name="validator_style">wxFILTER_NONE</property>
-                                                        <property name="validator_type">wxDefaultValidator</property>
-                                                        <property name="validator_variable"></property>
-                                                        <property name="window_extra_style"></property>
-                                                        <property name="window_name"></property>
-                                                        <property name="window_style"></property>
-                                                    </object>
-                                                </object>
                                                 <object class="sizeritem" expanded="1">
                                                     <property name="border">5</property>
                                                     <property name="flag">wxEXPAND</property>
@@ -380,11 +318,11 @@
                                                         <property name="name">bSizerRotationStep</property>
                                                         <property name="orient">wxHORIZONTAL</property>
                                                         <property name="permission">none</property>
-                                                        <object class="sizeritem" expanded="1">
+                                                        <object class="sizeritem" expanded="0">
                                                             <property name="border">5</property>
                                                             <property name="flag">wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT</property>
                                                             <property name="proportion">0</property>
-                                                            <object class="wxStaticText" expanded="1">
+                                                            <object class="wxStaticText" expanded="0">
                                                                 <property name="BottomDockable">1</property>
                                                                 <property name="LeftDockable">1</property>
                                                                 <property name="RightDockable">1</property>
@@ -441,11 +379,11 @@
                                                                 <property name="wrap">-1</property>
                                                             </object>
                                                         </object>
-                                                        <object class="sizeritem" expanded="1">
+                                                        <object class="sizeritem" expanded="0">
                                                             <property name="border">5</property>
                                                             <property name="flag">wxALIGN_CENTER_VERTICAL|wxALL</property>
                                                             <property name="proportion">0</property>
-                                                            <object class="wxTextCtrl" expanded="1">
+                                                            <object class="wxTextCtrl" expanded="0">
                                                                 <property name="BottomDockable">1</property>
                                                                 <property name="LeftDockable">1</property>
                                                                 <property name="RightDockable">1</property>
@@ -505,11 +443,11 @@
                                                                 <property name="window_style"></property>
                                                             </object>
                                                         </object>
-                                                        <object class="sizeritem" expanded="1">
+                                                        <object class="sizeritem" expanded="0">
                                                             <property name="border">5</property>
                                                             <property name="flag">wxTOP|wxBOTTOM|wxRIGHT|wxALIGN_CENTER_VERTICAL</property>
                                                             <property name="proportion">0</property>
-                                                            <object class="wxStaticText" expanded="1">
+                                                            <object class="wxStaticText" expanded="0">
                                                                 <property name="BottomDockable">1</property>
                                                                 <property name="LeftDockable">1</property>
                                                                 <property name="RightDockable">1</property>
diff --git a/pcbnew/dialogs/panel_edit_options_base.h b/pcbnew/dialogs/panel_edit_options_base.h
index efd28ff434..1aa36a5f36 100644
--- a/pcbnew/dialogs/panel_edit_options_base.h
+++ b/pcbnew/dialogs/panel_edit_options_base.h
@@ -1,5 +1,5 @@
 ///////////////////////////////////////////////////////////////////////////
-// C++ code generated with wxFormBuilder (version Oct 26 2018)
+// C++ code generated with wxFormBuilder (version 3.9.0 Apr 22 2021)
 // http://www.wxformbuilder.org/
 //
 // PLEASE DO *NOT* EDIT THIS FILE!
@@ -36,15 +36,9 @@ class PANEL_EDIT_OPTIONS_BASE : public wxPanel
 	private:
 
 	protected:
-		enum
-		{
-			wxID_SEGMENTS45 = 1000
-		};
-
 		wxCheckBox* m_magneticPads;
 		wxCheckBox* m_magneticGraphics;
 		wxCheckBox* m_flipLeftRight;
-		wxCheckBox* m_segments45OnlyCtrl;
 		wxStaticText* m_staticTextRotationAngle;
 		wxTextCtrl* m_rotationAngle;
 		wxStaticText* m_staticText32;
diff --git a/pcbnew/footprint_editor_settings.cpp b/pcbnew/footprint_editor_settings.cpp
index cff28419cb..29bd848621 100644
--- a/pcbnew/footprint_editor_settings.cpp
+++ b/pcbnew/footprint_editor_settings.cpp
@@ -44,7 +44,7 @@ FOOTPRINT_EDITOR_SETTINGS::FOOTPRINT_EDITOR_SETTINGS() :
         m_Display(),
         m_UserGrid(),
         m_PolarCoords( false ),
-        m_Use45DegreeGraphicSegments( true ),
+        m_Use45Limit( true ),
         m_LibWidth( 250 ),
         m_LastImportExportPath(),
         m_FootprintTextShownColumns()
@@ -71,8 +71,8 @@ FOOTPRINT_EDITOR_SETTINGS::FOOTPRINT_EDITOR_SETTINGS() :
 
     m_params.emplace_back( new PARAM<bool>( "editing.polar_coords", &m_PolarCoords, false ) );
 
-    m_params.emplace_back( new PARAM<bool>( "editing.use_45_degree_graphic_segments",
-            &m_Use45DegreeGraphicSegments, false ) );
+    m_params.emplace_back( new PARAM<bool>( "editing.use_45_degree_limit",
+            &m_Use45Limit, false ) );
 
     m_params.emplace_back( new PARAM<bool>( "pcb_display.text_fill",
             &m_Display.m_DisplayTextFill, true ) );
diff --git a/pcbnew/microwave/microwave_tool.cpp b/pcbnew/microwave/microwave_tool.cpp
index 62d32e1b42..6f1e0f6655 100644
--- a/pcbnew/microwave/microwave_tool.cpp
+++ b/pcbnew/microwave/microwave_tool.cpp
@@ -214,7 +214,7 @@ int MICROWAVE_TOOL::drawMicrowaveInductor( const TOOL_EVENT& aEvent )
         // the end point
         else if( originSet && ( evt->IsMotion() || evt->IsDrag( BUT_LEFT ) ) )
         {
-            tpGeomMgr.SetAngleSnap( evt->Modifier( MD_SHIFT ) );
+            tpGeomMgr.SetAngleSnap( Is45Limited() );
             tpGeomMgr.SetEnd( cursorPos );
 
             view.SetVisible( &previewRect, true );
diff --git a/pcbnew/pcb_edit_frame.cpp b/pcbnew/pcb_edit_frame.cpp
index 1faddb7324..524b0ea3ba 100644
--- a/pcbnew/pcb_edit_frame.cpp
+++ b/pcbnew/pcb_edit_frame.cpp
@@ -691,7 +691,7 @@ void PCB_EDIT_FRAME::setupUIConditions()
     mgr->SetConditions( PCB_ACTIONS::zoneFill, ENABLE( SELECTION_CONDITIONS::MoreThan( 0 ) ) );
     mgr->SetConditions( PCB_ACTIONS::zoneUnfill, ENABLE( SELECTION_CONDITIONS::MoreThan( 0 ) ) );
 
-    mgr->SetConditions( PCB_ACTIONS::toggleLine45degMode, CHECK( cond.Line45degMode() ) );
+    mgr->SetConditions( PCB_ACTIONS::toggle45, CHECK( cond.Get45degMode() ) );
 
 #define CURRENT_TOOL( action ) mgr->SetConditions( action, CHECK( cond.CurrentTool( action ) ) )
 
diff --git a/pcbnew/pcbnew_settings.cpp b/pcbnew/pcbnew_settings.cpp
index a23667d742..85a5efef2d 100644
--- a/pcbnew/pcbnew_settings.cpp
+++ b/pcbnew/pcbnew_settings.cpp
@@ -67,7 +67,7 @@ PCBNEW_SETTINGS::PCBNEW_SETTINGS()
           m_FootprintWizard(),
           m_Display(),
           m_TrackDragAction( TRACK_DRAG_ACTION::DRAG ),
-          m_Use45DegreeGraphicSegments( false ),
+          m_Use45DegreeLimit( false ),
           m_FlipLeftRight( false ),
           m_PolarCoords( false ),
           m_RotationAngle( 900 ),
@@ -124,8 +124,8 @@ PCBNEW_SETTINGS::PCBNEW_SETTINGS()
             reinterpret_cast<int*>( &m_TrackDragAction ),
             static_cast<int>( TRACK_DRAG_ACTION::DRAG ) ) );
 
-    m_params.emplace_back( new PARAM<bool>( "editing.use_45_degree_graphic_segments",
-            &m_Use45DegreeGraphicSegments, false ) );
+    m_params.emplace_back( new PARAM<bool>( "editing.use_45_degree_limit",
+            &m_Use45DegreeLimit, false ) );
 
     m_params.emplace_back( new PARAM<bool>( "editing.auto_fill_zones",
             &m_AutoRefillZones, true ) );
diff --git a/pcbnew/pcbnew_settings.h b/pcbnew/pcbnew_settings.h
index 2abe65d089..d152ef0247 100644
--- a/pcbnew/pcbnew_settings.h
+++ b/pcbnew/pcbnew_settings.h
@@ -275,8 +275,8 @@ public:
 
     TRACK_DRAG_ACTION m_TrackDragAction;
 
-    bool m_Use45DegreeGraphicSegments;   // True to constraint graphic lines to horizontal,
-    // vertical and 45º
+    bool m_Use45DegreeLimit;             // True to constrain tool actions to horizontal,
+                                         // vertical and 45º
     bool m_FlipLeftRight;                // True: Flip footprints across Y axis
     // False: Flip footprints across X axis
 
diff --git a/pcbnew/router/router_tool.cpp b/pcbnew/router/router_tool.cpp
index 68c43f8a8e..4cb3ce3a03 100644
--- a/pcbnew/router/router_tool.cpp
+++ b/pcbnew/router/router_tool.cpp
@@ -1098,7 +1098,6 @@ void ROUTER_TOOL::performRouting()
 
         if( evt->IsMotion() )
         {
-            m_router->SetOrthoMode( evt->Modifier( MD_SHIFT ) );
             updateEndItem( *evt );
             m_router->Move( m_endSnapPoint, m_endItem );
         }
diff --git a/pcbnew/toolbars_pcb_editor.cpp b/pcbnew/toolbars_pcb_editor.cpp
index d6f75dfebb..b54ab790e2 100644
--- a/pcbnew/toolbars_pcb_editor.cpp
+++ b/pcbnew/toolbars_pcb_editor.cpp
@@ -499,7 +499,6 @@ void PCB_EDIT_FRAME::ReCreateVToolbar()
     m_drawToolBar->AddToolContextMenu( PCB_ACTIONS::drawZone, std::move( zoneMenu ) );
 
     std::unique_ptr<ACTION_MENU> lineMenu = std::make_unique<ACTION_MENU>( false, selTool );
-    lineMenu->Add( PCB_ACTIONS::toggleLine45degMode, ACTION_MENU::CHECK );
     m_drawToolBar->AddToolContextMenu( PCB_ACTIONS::drawLine, std::move( lineMenu ) );
 
     m_drawToolBar->KiRealize();
diff --git a/pcbnew/tools/drawing_tool.cpp b/pcbnew/tools/drawing_tool.cpp
index 733815a7d1..d497e9e733 100644
--- a/pcbnew/tools/drawing_tool.cpp
+++ b/pcbnew/tools/drawing_tool.cpp
@@ -24,43 +24,48 @@
  */
 
 #include "drawing_tool.h"
-#include "pcb_actions.h"
-#include <pcb_edit_frame.h>
-#include <confirm.h>
+
+
+#include <dialogs/dialog_text_properties.h>
+#include <dialogs/dialog_track_via_size.h>
+#include <geometry/geometry_utils.h>
+#include <geometry/shape_segment.h>
 #include <import_gfx/dialog_import_gfx.h>
-#include <view/view.h>
+#include <preview_items/two_point_assistant.h>
+#include <preview_items/two_point_geom_manager.h>
+#include <ratsnest/ratsnest_data.h>
+#include <router/router_tool.h>
 #include <tool/tool_manager.h>
+#include <tools/pcb_actions.h>
+#include <tools/pcb_editor_conditions.h>
 #include <tools/pcb_grid_helper.h>
 #include <tools/pcb_selection_tool.h>
 #include <tools/tool_event_utils.h>
 #include <tools/zone_create_helper.h>
+#include <view/view.h>
 #include <widgets/appearance_controls.h>
-#include <router/router_tool.h>
-#include <geometry/geometry_utils.h>
-#include <geometry/shape_segment.h>
-#include <board_commit.h>
-#include <scoped_set_reset.h>
+#include <widgets/infobar.h>
+
 #include <bitmaps.h>
-#include <painter.h>
-#include <status_popup.h>
-#include <dialogs/dialog_text_properties.h>
-#include <preview_items/arc_assistant.h>
 #include <board.h>
+#include <board_commit.h>
+#include <board_design_settings.h>
+#include <confirm.h>
+#include <footprint.h>
 #include <fp_shape.h>
+#include <macros.h>
+#include <painter.h>
+#include <pcb_edit_frame.h>
 #include <pcb_group.h>
 #include <pcb_text.h>
 #include <pcb_dimension.h>
-#include <zone.h>
-#include <footprint.h>
-#include <preview_items/two_point_assistant.h>
-#include <preview_items/two_point_geom_manager.h>
-#include <ratsnest/ratsnest_data.h>
 #include <pcbnew_id.h>
-#include <dialogs/dialog_track_via_size.h>
+#include <preview_items/arc_assistant.h>
+#include <scoped_set_reset.h>
+#include <status_popup.h>
 #include <string_utils.h>
-#include <macros.h>
-#include <widgets/infobar.h>
-#include <board_design_settings.h>
+#include <zone.h>
+
 
 using SCOPED_DRAW_MODE = SCOPED_SET_RESET<DRAWING_TOOL::MODE>;
 
@@ -207,6 +212,7 @@ bool DRAWING_TOOL::Init()
     ctxMenu.AddItem( PCB_ACTIONS::closeOutline,    canCloseOutline, 200 );
     ctxMenu.AddItem( PCB_ACTIONS::deleteLastPoint, canUndoPoint, 200 );
 
+    ctxMenu.AddCheckItem( PCB_ACTIONS::toggle45, SELECTION_CONDITIONS::ShowAlways, 250 );
     ctxMenu.AddSeparator( 500 );
 
     std::shared_ptr<VIA_SIZE_MENU> viaSizeMenu = std::make_shared<VIA_SIZE_MENU>();
@@ -897,7 +903,7 @@ int DRAWING_TOOL::DrawDimension( const TOOL_EVENT& aEvent )
                 dimension->SetEnd( (wxPoint) cursorPos );
                 dimension->Update();
 
-                if( !!evt->Modifier( MD_SHIFT ) || dimension->Type() == PCB_DIM_CENTER_T )
+                if( Is45Limited() || dimension->Type() == PCB_DIM_CENTER_T )
                     constrainDimension( dimension );
 
                 // Dimensions that have origin and end in the same spot are not valid
@@ -978,7 +984,7 @@ int DRAWING_TOOL::DrawDimension( const TOOL_EVENT& aEvent )
 
                 dimension->Update();
 
-                if( !!evt->Modifier( MD_SHIFT ) || dimension->Type() == PCB_DIM_CENTER_T )
+                if( Is45Limited() || dimension->Type() == PCB_DIM_CENTER_T )
                     constrainDimension( dimension );
 
                 break;
@@ -1367,8 +1373,8 @@ int DRAWING_TOOL::SetAnchor( const TOOL_EVENT& aEvent )
 
 int DRAWING_TOOL::ToggleLine45degMode( const TOOL_EVENT& toolEvent )
 {
-    m_frame->Settings().m_Use45DegreeGraphicSegments =
-            !m_frame->Settings().m_Use45DegreeGraphicSegments;
+    m_frame->Settings().m_Use45DegreeLimit =
+            !m_frame->Settings().m_Use45DegreeLimit;
 
     return 0;
 }
@@ -1463,12 +1469,6 @@ bool DRAWING_TOOL::drawSegment( const std::string& aTool, PCB_SHAPE** aGraphic,
         cursorPos = grid.BestSnapAnchor( m_controls->GetMousePosition(), drawingLayer );
         m_controls->ForceCursorPosition( true, cursorPos );
 
-        // 45 degree angle constraint enabled with an option and toggled with Ctrl
-        bool limit45 = frame()->Settings().m_Use45DegreeGraphicSegments;
-
-        if( evt->Modifier( MD_SHIFT ) )
-            limit45 = !limit45;
-
         if( evt->IsCancelInteractive() )
         {
             cleanup();
@@ -1633,9 +1633,7 @@ bool DRAWING_TOOL::drawSegment( const std::string& aTool, PCB_SHAPE** aGraphic,
         else if( evt->IsMotion() )
         {
             // 45 degree lines
-            if( started
-                && ( ( limit45 && shape == SHAPE_T::SEGMENT )
-                     || ( evt->Modifier( MD_SHIFT ) && shape == SHAPE_T::RECT ) ) )
+            if( started && Is45Limited() )
             {
                 const VECTOR2I lineVector( cursorPos - VECTOR2I( twoPointManager.GetOrigin() ) );
 
@@ -1860,7 +1858,7 @@ bool DRAWING_TOOL::drawArc( const std::string& aTool, PCB_SHAPE** aGraphic, bool
         else if( evt->IsMotion() )
         {
             // set angle snap
-            arcManager.SetAngleSnap( evt->Modifier( MD_SHIFT ) );
+            arcManager.SetAngleSnap( Is45Limited() );
 
             // update, but don't step the manager state
             arcManager.AddPoint( cursorPos, false );
@@ -2102,7 +2100,7 @@ int DRAWING_TOOL::DrawZone( const TOOL_EVENT& aEvent )
 
         m_controls->ForceCursorPosition( true, cursorPos );
 
-        if( ( sourceZone && sourceZone->GetHV45() ) || constrainAngle || evt->Modifier( MD_SHIFT ) )
+        if( ( sourceZone && sourceZone->GetHV45() ) || constrainAngle || Is45Limited() )
             polyGeomMgr.SetLeaderMode( POLYGON_GEOM_MANAGER::LEADER_MODE::DEG45 );
         else
             polyGeomMgr.SetLeaderMode( POLYGON_GEOM_MANAGER::LEADER_MODE::DIRECT );
@@ -2701,5 +2699,5 @@ void DRAWING_TOOL::setTransitions()
     Go( &DRAWING_TOOL::PlaceText,             PCB_ACTIONS::placeText.MakeEvent() );
     Go( &DRAWING_TOOL::PlaceImportedGraphics, PCB_ACTIONS::placeImportedGraphics.MakeEvent() );
     Go( &DRAWING_TOOL::SetAnchor,             PCB_ACTIONS::setAnchor.MakeEvent() );
-    Go( &DRAWING_TOOL::ToggleLine45degMode,   PCB_ACTIONS::toggleLine45degMode.MakeEvent() );
+    Go( &DRAWING_TOOL::ToggleLine45degMode,   PCB_ACTIONS::toggle45.MakeEvent() );
 }
diff --git a/pcbnew/tools/pcb_actions.cpp b/pcbnew/tools/pcb_actions.cpp
index 1ac3d829d4..e09c5f1e3e 100644
--- a/pcbnew/tools/pcb_actions.cpp
+++ b/pcbnew/tools/pcb_actions.cpp
@@ -217,11 +217,6 @@ TOOL_ACTION PCB_ACTIONS::closeOutline( "pcbnew.InteractiveDrawing.closeOutline",
         _( "Close Outline" ), _( "Close the in progress outline" ),
         BITMAPS::checked_ok );
 
-TOOL_ACTION PCB_ACTIONS::toggleLine45degMode( "pcbnew.InteractiveDrawing.line45degMode",
-        AS_GLOBAL, 0, "",
-        _( "Limit Lines to 45 deg" ), _( "Limit graphic lines to H, V and 45 degrees" ),
-        BITMAPS::INVALID_BITMAP, AF_NONE );
-
 // DRC
 //
 TOOL_ACTION PCB_ACTIONS::runDRC( "pcbnew.DRCTool.runDRC",
@@ -667,6 +662,11 @@ TOOL_ACTION PCB_ACTIONS::toggleLock( "pcbnew.EditorControl.toggleLock",
         _( "Toggle Lock" ), _( "Lock or unlock selected items" ),
         BITMAPS::lock_unlock );
 
+TOOL_ACTION PCB_ACTIONS::toggle45( "pcbnew.EditorControl.toggle45",
+        AS_GLOBAL, WXK_TAB, "",
+        _( "Toggle 45 Limit" ), _( "Limit actions to 45 degrees from the starting point" ),
+        BITMAPS::INVALID_BITMAP );
+
 TOOL_ACTION PCB_ACTIONS::lock( "pcbnew.EditorControl.lock",
         AS_GLOBAL, 0, "",
         _( "Lock" ), _( "Prevent items from being moved and/or resized on the canvas" ),
diff --git a/pcbnew/tools/pcb_actions.h b/pcbnew/tools/pcb_actions.h
index 13348946b1..6d24a189fb 100644
--- a/pcbnew/tools/pcb_actions.h
+++ b/pcbnew/tools/pcb_actions.h
@@ -163,9 +163,6 @@ public:
     static TOOL_ACTION deleteLastPoint;
     static TOOL_ACTION closeOutline;
 
-    /// Toggle 45 degree line drawing mode
-    static TOOL_ACTION toggleLine45degMode;
-
     /// Increase width of currently drawn line
     static TOOL_ACTION incWidth;
 
@@ -419,6 +416,8 @@ public:
 
     static TOOL_ACTION microwaveCreateLine;
 
+    static TOOL_ACTION toggle45;
+
     // Locking
     static TOOL_ACTION toggleLock;
     static TOOL_ACTION lock;
diff --git a/pcbnew/tools/pcb_editor_conditions.cpp b/pcbnew/tools/pcb_editor_conditions.cpp
index 8b56a302ef..7b882095e5 100644
--- a/pcbnew/tools/pcb_editor_conditions.cpp
+++ b/pcbnew/tools/pcb_editor_conditions.cpp
@@ -123,13 +123,13 @@ SELECTION_CONDITION PCB_EDITOR_CONDITIONS::ZoneDisplayMode( ZONE_DISPLAY_MODE aM
 }
 
 
-SELECTION_CONDITION PCB_EDITOR_CONDITIONS::Line45degMode()
+SELECTION_CONDITION PCB_EDITOR_CONDITIONS::Get45degMode()
 {
     PCB_BASE_FRAME* drwFrame = dynamic_cast<PCB_BASE_FRAME*>( m_frame );
 
     wxASSERT( drwFrame );
 
-    return std::bind( &PCB_EDITOR_CONDITIONS::line45degModeFunc, _1, drwFrame );
+    return std::bind( &PCB_EDITOR_CONDITIONS::get45degModeFunc, _1, drwFrame );
 }
 
 
@@ -183,7 +183,7 @@ bool PCB_EDITOR_CONDITIONS::zoneDisplayModeFunc( const SELECTION& aSelection, PC
     return aFrame->GetDisplayOptions().m_ZoneDisplayMode == aMode;
 }
 
-bool PCB_EDITOR_CONDITIONS::line45degModeFunc( const SELECTION& aSelection, PCB_BASE_FRAME* aFrame )
+bool PCB_EDITOR_CONDITIONS::get45degModeFunc( const SELECTION& aSelection, PCB_BASE_FRAME* aFrame )
 {
-    return aFrame->Settings().m_Use45DegreeGraphicSegments;
+    return aFrame->Settings().m_Use45DegreeLimit;
 }
diff --git a/pcbnew/tools/pcb_editor_conditions.h b/pcbnew/tools/pcb_editor_conditions.h
index 6c7f896058..8287d974d5 100644
--- a/pcbnew/tools/pcb_editor_conditions.h
+++ b/pcbnew/tools/pcb_editor_conditions.h
@@ -103,11 +103,11 @@ public:
     SELECTION_CONDITION ZoneDisplayMode( ZONE_DISPLAY_MODE aMode );
 
     /**
-     * Create a functor that tests whether only 45 degree graphic lines should be drawn
+     * Create a functor that tests whether only 45 degree lines should be allowed
      *
-     * @return Functor returning true if only 45 degree graphic lines should be drawn
+     * @return Functor returning true if only 45 degree lines should be allowed
      */
-    SELECTION_CONDITION Line45degMode();
+    SELECTION_CONDITION Get45degMode();
 
 protected:
     ///< Helper function used by HasItems()
@@ -136,7 +136,7 @@ protected:
                                      ZONE_DISPLAY_MODE aMode );
 
     ///< Helper function used by Line45degMode()
-    static bool line45degModeFunc( const SELECTION& aSelection, PCB_BASE_FRAME* aFrame );
+    static bool get45degModeFunc( const SELECTION& aSelection, PCB_BASE_FRAME* aFrame );
 };
 
 #endif /* PCB_EDITOR_CONDITIONS_H_ */
diff --git a/pcbnew/tools/pcb_point_editor.cpp b/pcbnew/tools/pcb_point_editor.cpp
index 09e900f3e5..a3581123b6 100644
--- a/pcbnew/tools/pcb_point_editor.cpp
+++ b/pcbnew/tools/pcb_point_editor.cpp
@@ -516,9 +516,7 @@ int PCB_POINT_EDITOR::OnSelectionChange( const TOOL_EVENT& aEvent )
             }
 
             // The alternative constraint limits to 45 degrees
-            bool enableAltConstraint = !!evt->Modifier( MD_SHIFT );
-
-            if( enableAltConstraint )
+            if( Is45Limited() )
                 m_altConstraint->Apply();
             else
                 m_editedPoint->ApplyConstraint();
diff --git a/pcbnew/tools/pcb_tool_base.cpp b/pcbnew/tools/pcb_tool_base.cpp
index f6b488a72e..d54b3c5197 100644
--- a/pcbnew/tools/pcb_tool_base.cpp
+++ b/pcbnew/tools/pcb_tool_base.cpp
@@ -318,6 +318,12 @@ PCB_SELECTION& PCB_TOOL_BASE::selection()
 }
 
 
+bool PCB_TOOL_BASE::Is45Limited() const
+{
+    return frame()->Settings().m_Use45DegreeLimit;
+}
+
+
 void INTERACTIVE_PLACER_BASE::SnapItem( BOARD_ITEM *aItem )
 {
     // Base implementation performs no snapping
@@ -329,3 +335,4 @@ bool INTERACTIVE_PLACER_BASE::PlaceItem( BOARD_ITEM *aItem, BOARD_COMMIT& aCommi
     aCommit.Add( aItem );
     return true;
 }
+
diff --git a/pcbnew/tools/pcb_tool_base.h b/pcbnew/tools/pcb_tool_base.h
index 4fc587b214..2d3fb064a2 100644
--- a/pcbnew/tools/pcb_tool_base.h
+++ b/pcbnew/tools/pcb_tool_base.h
@@ -103,6 +103,12 @@ public:
     void SetIsFootprintEditor( bool aEnabled ) { m_isFootprintEditor = aEnabled; }
     bool IsFootprintEditor() const { return m_isFootprintEditor; }
 
+    /**
+     * Should the tool use its 45° mode option?
+     * @return True if set to use 45°
+     */
+    bool Is45Limited() const;
+
 protected:
     /**
      * Options for placing items interactively.
@@ -173,6 +179,7 @@ protected:
 
 protected:
     bool m_isFootprintEditor;
+
 };
 
 #endif
diff --git a/pcbnew/tools/pcb_viewer_tools.cpp b/pcbnew/tools/pcb_viewer_tools.cpp
index 15ea42d556..8285a81e1e 100644
--- a/pcbnew/tools/pcb_viewer_tools.cpp
+++ b/pcbnew/tools/pcb_viewer_tools.cpp
@@ -301,7 +301,7 @@ int PCB_VIEWER_TOOLS::MeasureTool( const TOOL_EVENT& aEvent )
         // move or drag when origin set updates rules
         else if( originSet && ( evt->IsMotion() || evt->IsDrag( BUT_LEFT ) ) )
         {
-            twoPtMgr.SetAngleSnap( evt->Modifier( MD_SHIFT ) );
+            twoPtMgr.SetAngleSnap( frame()->Settings().m_Use45DegreeLimit );
             twoPtMgr.SetEnd( cursorPos );
 
             view.SetVisible( &ruler, true );