diff --git a/eeschema/dialogs/panel_sym_editing_options.cpp b/eeschema/dialogs/panel_sym_editing_options.cpp
index 2ae18ff696..e3123d1d28 100644
--- a/eeschema/dialogs/panel_sym_editing_options.cpp
+++ b/eeschema/dialogs/panel_sym_editing_options.cpp
@@ -56,6 +56,7 @@ void PANEL_SYM_EDITING_OPTIONS::loadSymEditorSettings( SYMBOL_EDITOR_SETTINGS* a
     m_pinPitch.SetValue( schIUScale.MilsToIU( aCfg->m_Repeat.pin_step ) );
     m_spinRepeatLabel->SetValue( aCfg->m_Repeat.label_delta );
     m_cbShowPinElectricalType->SetValue( aCfg->m_ShowPinElectricalType );
+    m_dragPinsWithEdges->SetValue( aCfg->m_dragPinsAlongWithEdges );
 }
 
 
@@ -83,6 +84,7 @@ bool PANEL_SYM_EDITING_OPTIONS::TransferDataFromWindow()
     settings->m_Repeat.label_delta = m_spinRepeatLabel->GetValue();
     settings->m_Repeat.pin_step = schIUScale.IUToMils( m_pinPitch.GetIntValue() );
     settings->m_ShowPinElectricalType = m_cbShowPinElectricalType->GetValue();
+    settings->m_dragPinsAlongWithEdges = m_dragPinsWithEdges->GetValue();
 
     // Force pin_step to a grid multiple
     settings->m_Repeat.pin_step = KiROUND( double( settings->m_Repeat.pin_step ) / MIN_GRID ) * MIN_GRID;
diff --git a/eeschema/dialogs/panel_sym_editing_options_base.cpp b/eeschema/dialogs/panel_sym_editing_options_base.cpp
index 32f88ab53e..469a5d9d3e 100644
--- a/eeschema/dialogs/panel_sym_editing_options_base.cpp
+++ b/eeschema/dialogs/panel_sym_editing_options_base.cpp
@@ -1,5 +1,5 @@
 ///////////////////////////////////////////////////////////////////////////
-// C++ code generated with wxFormBuilder (version 4.0.0-0-g0efcecf)
+// C++ code generated with wxFormBuilder (version 4.2.1-0-g80c4cb6)
 // http://www.wxformbuilder.org/
 //
 // PLEASE DO *NOT* EDIT THIS FILE!
@@ -140,6 +140,25 @@ PANEL_SYM_EDITING_OPTIONS_BASE::PANEL_SYM_EDITING_OPTIONS_BASE( wxWindow* parent
 
 	p1mainSizer->Add( leftColumn, 0, wxEXPAND, 5 );
 
+	wxBoxSizer* rightColumn;
+	rightColumn = new wxBoxSizer( wxVERTICAL );
+
+	m_generalOption = new wxStaticText( this, wxID_ANY, _("General editing"), wxDefaultPosition, wxDefaultSize, 0 );
+	m_generalOption->Wrap( -1 );
+	rightColumn->Add( m_generalOption, 0, wxLEFT|wxTOP, 13 );
+
+	m_staticline3 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
+	rightColumn->Add( m_staticline3, 0, wxEXPAND | wxALL, 5 );
+
+	m_dragPinsWithEdges = new wxCheckBox( this, wxID_ANY, _("Keep pins attached when dragging edges"), wxDefaultPosition, wxDefaultSize, 0 );
+	rightColumn->Add( m_dragPinsWithEdges, 0, wxBOTTOM|wxLEFT, 10 );
+
+
+	rightColumn->Add( 0, 15, 1, wxEXPAND, 5 );
+
+
+	p1mainSizer->Add( rightColumn, 1, wxEXPAND, 5 );
+
 
 	this->SetSizer( p1mainSizer );
 	this->Layout();
diff --git a/eeschema/dialogs/panel_sym_editing_options_base.fbp b/eeschema/dialogs/panel_sym_editing_options_base.fbp
index c0f0d0c5f0..fca927c371 100644
--- a/eeschema/dialogs/panel_sym_editing_options_base.fbp
+++ b/eeschema/dialogs/panel_sym_editing_options_base.fbp
@@ -1,34 +1,36 @@
 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
 <wxFormBuilder_Project>
-  <FileVersion major="1" minor="17"/>
+  <FileVersion major="1" minor="18"/>
   <object class="Project" expanded="true">
-    <property name="class_decoration"></property>
     <property name="code_generation">C++</property>
-    <property name="disconnect_events">1</property>
-    <property name="disconnect_mode">source_name</property>
-    <property name="disconnect_php_events">0</property>
-    <property name="disconnect_python_events">0</property>
+    <property name="cpp_class_decoration"></property>
+    <property name="cpp_disconnect_events">1</property>
+    <property name="cpp_event_generation">connect</property>
+    <property name="cpp_help_provider">none</property>
+    <property name="cpp_namespace"></property>
+    <property name="cpp_precompiled_header"></property>
+    <property name="cpp_use_array_enum">0</property>
+    <property name="cpp_use_enum">0</property>
     <property name="embedded_files_path">res</property>
     <property name="encoding">UTF-8</property>
-    <property name="event_generation">connect</property>
     <property name="file">panel_sym_editing_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="lua_skip_events">1</property>
+    <property name="lua_ui_table">UI</property>
     <property name="name">PanelSymEditingOptionsBase</property>
-    <property name="namespace"></property>
     <property name="path">.</property>
-    <property name="precompiled_header"></property>
+    <property name="php_disconnect_events">0</property>
+    <property name="php_disconnect_mode">source_name</property>
+    <property name="php_skip_events">1</property>
+    <property name="python_disconnect_events">0</property>
+    <property name="python_disconnect_mode">source_name</property>
+    <property name="python_image_path_wrapper_function_name"></property>
+    <property name="python_indent_with_spaces"></property>
+    <property name="python_skip_events">1</property>
     <property name="relative_path">1</property>
-    <property name="skip_lua_events">1</property>
-    <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">0</property>
     <property name="use_microsoft_bom">0</property>
+    <property name="use_native_eol">0</property>
     <object class="Panel" expanded="true">
       <property name="aui_managed">0</property>
       <property name="aui_manager_style">wxAUI_MGR_DEFAULT</property>
@@ -76,10 +78,10 @@
                 <property name="LeftDockable">1</property>
                 <property name="RightDockable">1</property>
                 <property name="TopDockable">1</property>
-                <property name="aui_layer"></property>
+                <property name="aui_layer">0</property>
                 <property name="aui_name"></property>
-                <property name="aui_position"></property>
-                <property name="aui_row"></property>
+                <property name="aui_position">0</property>
+                <property name="aui_row">0</property>
                 <property name="best_size"></property>
                 <property name="bg"></property>
                 <property name="caption"></property>
@@ -148,10 +150,10 @@
                 <property name="LeftDockable">1</property>
                 <property name="RightDockable">1</property>
                 <property name="TopDockable">1</property>
-                <property name="aui_layer"></property>
+                <property name="aui_layer">0</property>
                 <property name="aui_name"></property>
-                <property name="aui_position"></property>
-                <property name="aui_row"></property>
+                <property name="aui_position">0</property>
+                <property name="aui_row">0</property>
                 <property name="best_size"></property>
                 <property name="bg"></property>
                 <property name="caption"></property>
@@ -225,10 +227,10 @@
                     <property name="LeftDockable">1</property>
                     <property name="RightDockable">1</property>
                     <property name="TopDockable">1</property>
-                    <property name="aui_layer"></property>
+                    <property name="aui_layer">0</property>
                     <property name="aui_name"></property>
-                    <property name="aui_position"></property>
-                    <property name="aui_row"></property>
+                    <property name="aui_position">0</property>
+                    <property name="aui_row">0</property>
                     <property name="best_size"></property>
                     <property name="bg"></property>
                     <property name="caption"></property>
@@ -290,10 +292,10 @@
                     <property name="LeftDockable">1</property>
                     <property name="RightDockable">1</property>
                     <property name="TopDockable">1</property>
-                    <property name="aui_layer"></property>
+                    <property name="aui_layer">0</property>
                     <property name="aui_name"></property>
-                    <property name="aui_position"></property>
-                    <property name="aui_row"></property>
+                    <property name="aui_position">0</property>
+                    <property name="aui_row">0</property>
                     <property name="best_size"></property>
                     <property name="bg"></property>
                     <property name="caption"></property>
@@ -317,7 +319,7 @@
                     <property name="max_size"></property>
                     <property name="maximize_button">0</property>
                     <property name="maximum_size"></property>
-                    <property name="maxlength"></property>
+                    <property name="maxlength">0</property>
                     <property name="min_size"></property>
                     <property name="minimize_button">0</property>
                     <property name="minimum_size"></property>
@@ -358,10 +360,10 @@
                     <property name="LeftDockable">1</property>
                     <property name="RightDockable">1</property>
                     <property name="TopDockable">1</property>
-                    <property name="aui_layer"></property>
+                    <property name="aui_layer">0</property>
                     <property name="aui_name"></property>
-                    <property name="aui_position"></property>
-                    <property name="aui_row"></property>
+                    <property name="aui_position">0</property>
+                    <property name="aui_row">0</property>
                     <property name="best_size"></property>
                     <property name="bg"></property>
                     <property name="caption"></property>
@@ -423,10 +425,10 @@
                     <property name="LeftDockable">1</property>
                     <property name="RightDockable">1</property>
                     <property name="TopDockable">1</property>
-                    <property name="aui_layer"></property>
+                    <property name="aui_layer">0</property>
                     <property name="aui_name"></property>
-                    <property name="aui_position"></property>
-                    <property name="aui_row"></property>
+                    <property name="aui_position">0</property>
+                    <property name="aui_row">0</property>
                     <property name="best_size"></property>
                     <property name="bg"></property>
                     <property name="caption"></property>
@@ -488,10 +490,10 @@
                     <property name="LeftDockable">1</property>
                     <property name="RightDockable">1</property>
                     <property name="TopDockable">1</property>
-                    <property name="aui_layer"></property>
+                    <property name="aui_layer">0</property>
                     <property name="aui_name"></property>
-                    <property name="aui_position"></property>
-                    <property name="aui_row"></property>
+                    <property name="aui_position">0</property>
+                    <property name="aui_row">0</property>
                     <property name="best_size"></property>
                     <property name="bg"></property>
                     <property name="caption"></property>
@@ -553,10 +555,10 @@
                     <property name="LeftDockable">1</property>
                     <property name="RightDockable">1</property>
                     <property name="TopDockable">1</property>
-                    <property name="aui_layer"></property>
+                    <property name="aui_layer">0</property>
                     <property name="aui_name"></property>
-                    <property name="aui_position"></property>
-                    <property name="aui_row"></property>
+                    <property name="aui_position">0</property>
+                    <property name="aui_row">0</property>
                     <property name="best_size"></property>
                     <property name="bg"></property>
                     <property name="caption"></property>
@@ -580,7 +582,7 @@
                     <property name="max_size"></property>
                     <property name="maximize_button">0</property>
                     <property name="maximum_size"></property>
-                    <property name="maxlength"></property>
+                    <property name="maxlength">0</property>
                     <property name="min_size"></property>
                     <property name="minimize_button">0</property>
                     <property name="minimum_size"></property>
@@ -621,10 +623,10 @@
                     <property name="LeftDockable">1</property>
                     <property name="RightDockable">1</property>
                     <property name="TopDockable">1</property>
-                    <property name="aui_layer"></property>
+                    <property name="aui_layer">0</property>
                     <property name="aui_name"></property>
-                    <property name="aui_position"></property>
-                    <property name="aui_row"></property>
+                    <property name="aui_position">0</property>
+                    <property name="aui_row">0</property>
                     <property name="best_size"></property>
                     <property name="bg"></property>
                     <property name="caption"></property>
@@ -686,10 +688,10 @@
                     <property name="LeftDockable">1</property>
                     <property name="RightDockable">1</property>
                     <property name="TopDockable">1</property>
-                    <property name="aui_layer"></property>
+                    <property name="aui_layer">0</property>
                     <property name="aui_name"></property>
-                    <property name="aui_position"></property>
-                    <property name="aui_row"></property>
+                    <property name="aui_position">0</property>
+                    <property name="aui_row">0</property>
                     <property name="best_size"></property>
                     <property name="bg"></property>
                     <property name="caption"></property>
@@ -751,10 +753,10 @@
                     <property name="LeftDockable">1</property>
                     <property name="RightDockable">1</property>
                     <property name="TopDockable">1</property>
-                    <property name="aui_layer"></property>
+                    <property name="aui_layer">0</property>
                     <property name="aui_name"></property>
-                    <property name="aui_position"></property>
-                    <property name="aui_row"></property>
+                    <property name="aui_position">0</property>
+                    <property name="aui_row">0</property>
                     <property name="best_size"></property>
                     <property name="bg"></property>
                     <property name="caption"></property>
@@ -778,7 +780,7 @@
                     <property name="max_size"></property>
                     <property name="maximize_button">0</property>
                     <property name="maximum_size"></property>
-                    <property name="maxlength"></property>
+                    <property name="maxlength">0</property>
                     <property name="min_size"></property>
                     <property name="minimize_button">0</property>
                     <property name="minimum_size"></property>
@@ -819,10 +821,10 @@
                     <property name="LeftDockable">1</property>
                     <property name="RightDockable">1</property>
                     <property name="TopDockable">1</property>
-                    <property name="aui_layer"></property>
+                    <property name="aui_layer">0</property>
                     <property name="aui_name"></property>
-                    <property name="aui_position"></property>
-                    <property name="aui_row"></property>
+                    <property name="aui_position">0</property>
+                    <property name="aui_row">0</property>
                     <property name="best_size"></property>
                     <property name="bg"></property>
                     <property name="caption"></property>
@@ -884,10 +886,10 @@
                     <property name="LeftDockable">1</property>
                     <property name="RightDockable">1</property>
                     <property name="TopDockable">1</property>
-                    <property name="aui_layer"></property>
+                    <property name="aui_layer">0</property>
                     <property name="aui_name"></property>
-                    <property name="aui_position"></property>
-                    <property name="aui_row"></property>
+                    <property name="aui_position">0</property>
+                    <property name="aui_row">0</property>
                     <property name="best_size"></property>
                     <property name="bg"></property>
                     <property name="caption"></property>
@@ -949,10 +951,10 @@
                     <property name="LeftDockable">1</property>
                     <property name="RightDockable">1</property>
                     <property name="TopDockable">1</property>
-                    <property name="aui_layer"></property>
+                    <property name="aui_layer">0</property>
                     <property name="aui_name"></property>
-                    <property name="aui_position"></property>
-                    <property name="aui_row"></property>
+                    <property name="aui_position">0</property>
+                    <property name="aui_row">0</property>
                     <property name="best_size"></property>
                     <property name="bg"></property>
                     <property name="caption"></property>
@@ -976,7 +978,7 @@
                     <property name="max_size"></property>
                     <property name="maximize_button">0</property>
                     <property name="maximum_size"></property>
-                    <property name="maxlength"></property>
+                    <property name="maxlength">0</property>
                     <property name="min_size"></property>
                     <property name="minimize_button">0</property>
                     <property name="minimum_size"></property>
@@ -1017,10 +1019,10 @@
                     <property name="LeftDockable">1</property>
                     <property name="RightDockable">1</property>
                     <property name="TopDockable">1</property>
-                    <property name="aui_layer"></property>
+                    <property name="aui_layer">0</property>
                     <property name="aui_name"></property>
-                    <property name="aui_position"></property>
-                    <property name="aui_row"></property>
+                    <property name="aui_position">0</property>
+                    <property name="aui_row">0</property>
                     <property name="best_size"></property>
                     <property name="bg"></property>
                     <property name="caption"></property>
@@ -1082,10 +1084,10 @@
                     <property name="LeftDockable">1</property>
                     <property name="RightDockable">1</property>
                     <property name="TopDockable">1</property>
-                    <property name="aui_layer"></property>
+                    <property name="aui_layer">0</property>
                     <property name="aui_name"></property>
-                    <property name="aui_position"></property>
-                    <property name="aui_row"></property>
+                    <property name="aui_position">0</property>
+                    <property name="aui_row">0</property>
                     <property name="best_size"></property>
                     <property name="bg"></property>
                     <property name="caption"></property>
@@ -1147,10 +1149,10 @@
                     <property name="LeftDockable">1</property>
                     <property name="RightDockable">1</property>
                     <property name="TopDockable">1</property>
-                    <property name="aui_layer"></property>
+                    <property name="aui_layer">0</property>
                     <property name="aui_name"></property>
-                    <property name="aui_position"></property>
-                    <property name="aui_row"></property>
+                    <property name="aui_position">0</property>
+                    <property name="aui_row">0</property>
                     <property name="best_size"></property>
                     <property name="bg"></property>
                     <property name="caption"></property>
@@ -1174,7 +1176,7 @@
                     <property name="max_size"></property>
                     <property name="maximize_button">0</property>
                     <property name="maximum_size"></property>
-                    <property name="maxlength"></property>
+                    <property name="maxlength">0</property>
                     <property name="min_size"></property>
                     <property name="minimize_button">0</property>
                     <property name="minimum_size"></property>
@@ -1215,10 +1217,10 @@
                     <property name="LeftDockable">1</property>
                     <property name="RightDockable">1</property>
                     <property name="TopDockable">1</property>
-                    <property name="aui_layer"></property>
+                    <property name="aui_layer">0</property>
                     <property name="aui_name"></property>
-                    <property name="aui_position"></property>
-                    <property name="aui_row"></property>
+                    <property name="aui_position">0</property>
+                    <property name="aui_row">0</property>
                     <property name="best_size"></property>
                     <property name="bg"></property>
                     <property name="caption"></property>
@@ -1279,10 +1281,10 @@
                 <property name="LeftDockable">1</property>
                 <property name="RightDockable">1</property>
                 <property name="TopDockable">1</property>
-                <property name="aui_layer"></property>
+                <property name="aui_layer">0</property>
                 <property name="aui_name"></property>
-                <property name="aui_position"></property>
-                <property name="aui_row"></property>
+                <property name="aui_position">0</property>
+                <property name="aui_row">0</property>
                 <property name="best_size"></property>
                 <property name="bg"></property>
                 <property name="caption"></property>
@@ -1354,10 +1356,10 @@
                 <property name="LeftDockable">1</property>
                 <property name="RightDockable">1</property>
                 <property name="TopDockable">1</property>
-                <property name="aui_layer"></property>
+                <property name="aui_layer">0</property>
                 <property name="aui_name"></property>
-                <property name="aui_position"></property>
-                <property name="aui_row"></property>
+                <property name="aui_position">0</property>
+                <property name="aui_row">0</property>
                 <property name="best_size"></property>
                 <property name="bg"></property>
                 <property name="caption"></property>
@@ -1426,10 +1428,10 @@
                 <property name="LeftDockable">1</property>
                 <property name="RightDockable">1</property>
                 <property name="TopDockable">1</property>
-                <property name="aui_layer"></property>
+                <property name="aui_layer">0</property>
                 <property name="aui_name"></property>
-                <property name="aui_position"></property>
-                <property name="aui_row"></property>
+                <property name="aui_position">0</property>
+                <property name="aui_row">0</property>
                 <property name="best_size"></property>
                 <property name="bg"></property>
                 <property name="caption"></property>
@@ -1503,10 +1505,10 @@
                     <property name="LeftDockable">1</property>
                     <property name="RightDockable">1</property>
                     <property name="TopDockable">1</property>
-                    <property name="aui_layer"></property>
+                    <property name="aui_layer">0</property>
                     <property name="aui_name"></property>
-                    <property name="aui_position"></property>
-                    <property name="aui_row"></property>
+                    <property name="aui_position">0</property>
+                    <property name="aui_row">0</property>
                     <property name="best_size"></property>
                     <property name="bg"></property>
                     <property name="caption"></property>
@@ -1568,10 +1570,10 @@
                     <property name="LeftDockable">1</property>
                     <property name="RightDockable">1</property>
                     <property name="TopDockable">1</property>
-                    <property name="aui_layer"></property>
+                    <property name="aui_layer">0</property>
                     <property name="aui_name"></property>
-                    <property name="aui_position"></property>
-                    <property name="aui_row"></property>
+                    <property name="aui_position">0</property>
+                    <property name="aui_row">0</property>
                     <property name="best_size"></property>
                     <property name="bg"></property>
                     <property name="caption"></property>
@@ -1595,7 +1597,7 @@
                     <property name="max_size"></property>
                     <property name="maximize_button">0</property>
                     <property name="maximum_size"></property>
-                    <property name="maxlength"></property>
+                    <property name="maxlength">0</property>
                     <property name="min_size"></property>
                     <property name="minimize_button">0</property>
                     <property name="minimum_size"></property>
@@ -1637,10 +1639,10 @@
                     <property name="LeftDockable">1</property>
                     <property name="RightDockable">1</property>
                     <property name="TopDockable">1</property>
-                    <property name="aui_layer"></property>
+                    <property name="aui_layer">0</property>
                     <property name="aui_name"></property>
-                    <property name="aui_position"></property>
-                    <property name="aui_row"></property>
+                    <property name="aui_position">0</property>
+                    <property name="aui_row">0</property>
                     <property name="best_size"></property>
                     <property name="bg"></property>
                     <property name="caption"></property>
@@ -1702,10 +1704,10 @@
                     <property name="LeftDockable">1</property>
                     <property name="RightDockable">1</property>
                     <property name="TopDockable">1</property>
-                    <property name="aui_layer"></property>
+                    <property name="aui_layer">0</property>
                     <property name="aui_name"></property>
-                    <property name="aui_position"></property>
-                    <property name="aui_row"></property>
+                    <property name="aui_position">0</property>
+                    <property name="aui_row">0</property>
                     <property name="best_size"></property>
                     <property name="bg"></property>
                     <property name="caption"></property>
@@ -1767,10 +1769,10 @@
                     <property name="LeftDockable">1</property>
                     <property name="RightDockable">1</property>
                     <property name="TopDockable">1</property>
-                    <property name="aui_layer"></property>
+                    <property name="aui_layer">0</property>
                     <property name="aui_name"></property>
-                    <property name="aui_position"></property>
-                    <property name="aui_row"></property>
+                    <property name="aui_position">0</property>
+                    <property name="aui_row">0</property>
                     <property name="best_size"></property>
                     <property name="bg"></property>
                     <property name="caption"></property>
@@ -1825,6 +1827,213 @@
             </object>
           </object>
         </object>
+        <object class="sizeritem" expanded="true">
+          <property name="border">5</property>
+          <property name="flag">wxEXPAND</property>
+          <property name="proportion">1</property>
+          <object class="wxBoxSizer" expanded="true">
+            <property name="minimum_size"></property>
+            <property name="name">rightColumn</property>
+            <property name="orient">wxVERTICAL</property>
+            <property name="permission">none</property>
+            <object class="sizeritem" expanded="true">
+              <property name="border">13</property>
+              <property name="flag">wxLEFT|wxTOP</property>
+              <property name="proportion">0</property>
+              <object class="wxStaticText" expanded="true">
+                <property name="BottomDockable">1</property>
+                <property name="LeftDockable">1</property>
+                <property name="RightDockable">1</property>
+                <property name="TopDockable">1</property>
+                <property name="aui_layer">0</property>
+                <property name="aui_name"></property>
+                <property name="aui_position">0</property>
+                <property name="aui_row">0</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="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="drag_accept_files">0</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_ANY</property>
+                <property name="label">General editing</property>
+                <property name="markup">0</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_generalOption</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">; ; forward_declare</property>
+                <property name="toolbar_pane">0</property>
+                <property name="tooltip"></property>
+                <property name="window_extra_style"></property>
+                <property name="window_name"></property>
+                <property name="window_style"></property>
+                <property name="wrap">-1</property>
+              </object>
+            </object>
+            <object class="sizeritem" expanded="true">
+              <property name="border">5</property>
+              <property name="flag">wxEXPAND | wxALL</property>
+              <property name="proportion">0</property>
+              <object class="wxStaticLine" expanded="true">
+                <property name="BottomDockable">1</property>
+                <property name="LeftDockable">1</property>
+                <property name="RightDockable">1</property>
+                <property name="TopDockable">1</property>
+                <property name="aui_layer">0</property>
+                <property name="aui_name"></property>
+                <property name="aui_position">0</property>
+                <property name="aui_row">0</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="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="drag_accept_files">0</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_ANY</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_staticline3</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">wxLI_HORIZONTAL</property>
+                <property name="subclass">; ; forward_declare</property>
+                <property name="toolbar_pane">0</property>
+                <property name="tooltip"></property>
+                <property name="window_extra_style"></property>
+                <property name="window_name"></property>
+                <property name="window_style"></property>
+              </object>
+            </object>
+            <object class="sizeritem" expanded="true">
+              <property name="border">10</property>
+              <property name="flag">wxBOTTOM|wxLEFT</property>
+              <property name="proportion">0</property>
+              <object class="wxCheckBox" expanded="true">
+                <property name="BottomDockable">1</property>
+                <property name="LeftDockable">1</property>
+                <property name="RightDockable">1</property>
+                <property name="TopDockable">1</property>
+                <property name="aui_layer">0</property>
+                <property name="aui_name"></property>
+                <property name="aui_position">0</property>
+                <property name="aui_row">0</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="drag_accept_files">0</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_ANY</property>
+                <property name="label">Keep pins attached when dragging edges</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_dragPinsWithEdges</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">; ; forward_declare</property>
+                <property name="toolbar_pane">0</property>
+                <property name="tooltip"></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="true">
+              <property name="border">5</property>
+              <property name="flag">wxEXPAND</property>
+              <property name="proportion">1</property>
+              <object class="spacer" expanded="true">
+                <property name="height">15</property>
+                <property name="permission">protected</property>
+                <property name="width">0</property>
+              </object>
+            </object>
+          </object>
+        </object>
       </object>
     </object>
   </object>
diff --git a/eeschema/dialogs/panel_sym_editing_options_base.h b/eeschema/dialogs/panel_sym_editing_options_base.h
index 65d69f8477..80fb0a3141 100644
--- a/eeschema/dialogs/panel_sym_editing_options_base.h
+++ b/eeschema/dialogs/panel_sym_editing_options_base.h
@@ -1,5 +1,5 @@
 ///////////////////////////////////////////////////////////////////////////
-// C++ code generated with wxFormBuilder (version 4.0.0-0-g0efcecf)
+// C++ code generated with wxFormBuilder (version 4.2.1-0-g80c4cb6)
 // http://www.wxformbuilder.org/
 //
 // PLEASE DO *NOT* EDIT THIS FILE!
@@ -27,7 +27,6 @@
 
 ///////////////////////////////////////////////////////////////////////////
 
-
 ///////////////////////////////////////////////////////////////////////////////
 /// Class PANEL_SYM_EDITING_OPTIONS_BASE
 ///////////////////////////////////////////////////////////////////////////////
@@ -62,6 +61,9 @@ class PANEL_SYM_EDITING_OPTIONS_BASE : public RESETTABLE_PANEL
 		wxStaticText* m_pinPitchUnits;
 		wxStaticText* m_labelIncrementLabel1;
 		wxSpinCtrl* m_spinRepeatLabel;
+		wxStaticText* m_generalOption;
+		wxStaticLine* m_staticline3;
+		wxCheckBox* m_dragPinsWithEdges;
 
 		// Virtual event handlers, override them in your derived class
 		virtual void onKillFocusPinPitch( wxFocusEvent& event ) { event.Skip(); }
diff --git a/eeschema/symbol_editor/symbol_editor_settings.cpp b/eeschema/symbol_editor/symbol_editor_settings.cpp
index fb0bcf929a..ee831d3ce5 100644
--- a/eeschema/symbol_editor/symbol_editor_settings.cpp
+++ b/eeschema/symbol_editor/symbol_editor_settings.cpp
@@ -109,6 +109,9 @@ SYMBOL_EDITOR_SETTINGS::SYMBOL_EDITOR_SETTINGS() :
     m_params.emplace_back( new PARAM<bool>( "show_hidden_lib_pins",
                                             &m_ShowHiddenPins, true ) );
 
+    m_params.emplace_back( new PARAM<bool>( "drag_pins_along_with_edges",
+                                            &m_dragPinsAlongWithEdges, true ) );
+
     m_params.emplace_back( new PARAM<int>( "lib_table_width",
                                            &m_LibWidth, 250 ) );
 
diff --git a/eeschema/symbol_editor/symbol_editor_settings.h b/eeschema/symbol_editor/symbol_editor_settings.h
index 1a377dcf65..a74c1afae2 100644
--- a/eeschema/symbol_editor/symbol_editor_settings.h
+++ b/eeschema/symbol_editor/symbol_editor_settings.h
@@ -21,8 +21,7 @@
 * 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
 */
 
-#ifndef SYMBOL_EDITOR_SETTINGS_H
-#define SYMBOL_EDITOR_SETTINGS_H
+#pragma once
 
 #include <settings/app_settings.h>
 #include <project/sch_project_settings.h>
@@ -84,6 +83,9 @@ public:
     bool m_ShowHiddenPins;
     bool m_ShowHiddenFields;
 
+    ///< When true, dragging an outline edge will drag pins rooted on it
+    bool m_dragPinsAlongWithEdges;
+
     int m_LibWidth;
 
     int m_LibrarySortMode;
@@ -100,5 +102,3 @@ protected:
 
     virtual std::string getLegacyFrameName() const override { return "LibeditFrame"; }
 };
-
-#endif
diff --git a/eeschema/tools/ee_point_editor.cpp b/eeschema/tools/ee_point_editor.cpp
index 3ab120815d..f0848afa72 100644
--- a/eeschema/tools/ee_point_editor.cpp
+++ b/eeschema/tools/ee_point_editor.cpp
@@ -32,6 +32,7 @@ using namespace std::placeholders;
 #include <view/view_controls.h>
 #include <gal/graphics_abstraction_layer.h>
 #include <geometry/seg.h>
+#include <geometry/shape_utils.h>
 #include <tools/ee_actions.h>
 #include <tools/ee_selection_tool.h>
 #include <sch_edit_frame.h>
@@ -40,6 +41,7 @@ using namespace std::placeholders;
 #include <sch_sheet.h>
 #include <sch_textbox.h>
 #include <sch_table.h>
+#include <symbol_editor/symbol_editor_settings.h>
 
 
 static const std::vector<KICAD_T> pointEditorTypes = { SCH_SHAPE_T,
@@ -489,7 +491,7 @@ int EE_POINT_EDITOR::Main( const TOOL_EVENT& aEvent )
 
             m_editedPoint->SetPosition( controls->GetCursorPosition( snap ) );
 
-            updateParentItem( snap );
+            updateParentItem( snap, commit );
             updatePoints();
         }
         else if( inDrag && evt->IsMouseUp( BUT_LEFT ) )
@@ -650,7 +652,76 @@ void EE_POINT_EDITOR::pinEditedCorner( int minWidth, int minHeight, VECTOR2I& to
 }
 
 
-void EE_POINT_EDITOR::updateParentItem( bool aSnapToGrid ) const
+void EE_POINT_EDITOR::dragPinsOnEdge( const std::vector<SEG>&      aOldEdges,
+                                      const std::vector<VECTOR2I>& aMoveVecs, int aEdgeUnit,
+                                      SCH_COMMIT& aCommit ) const
+{
+    wxCHECK( aOldEdges.size() == aMoveVecs.size(), /* void */ );
+
+    // This only make sense in the symbol editor
+    if( !m_frame->IsType( FRAME_SCH_SYMBOL_EDITOR ) )
+        return;
+
+    SYMBOL_EDIT_FRAME& editor = static_cast<SYMBOL_EDIT_FRAME&>( *m_frame );
+
+    // And only if the setting is enabled
+    if( !editor.GetSettings()->m_dragPinsAlongWithEdges )
+        return;
+
+    // Adjuting pins on a different unit to a unit-limited shape
+    // seems suspect.
+    wxCHECK( aEdgeUnit == 0 || aEdgeUnit == editor.GetUnit(), /* void */ );
+
+    /*
+     * Get a list of pins on a line segment
+     */
+    const auto getPinsOnSeg = []( LIB_SYMBOL& aSymbol, int aUnit, const SEG& aSeg,
+                                  bool aIncludeEnds ) -> std::vector<SCH_PIN*>
+    {
+        // const BOX2I     segBox = BOX2I::ByCorners( aSeg.A, aSeg.B ).GetInflated( 1 );
+        // const EE_RTREE& rtree = m_frame->GetScreen()->Items().Overlapping( SCH_PIN_T, segBox );
+
+        std::vector<SCH_PIN*> pins;
+
+        for( SCH_PIN* pin : aSymbol.GetPins( aUnit ) )
+        {
+            // Figure out if the pin "connects" to the line
+            const VECTOR2I pinRootPos = pin->GetPinRoot();
+
+            if( aSeg.Contains( pinRootPos ) )
+            {
+                if( aIncludeEnds || ( pinRootPos != aSeg.A && pinRootPos != aSeg.B ) )
+                {
+                    pins.push_back( pin );
+                }
+            }
+        }
+
+        return pins;
+    };
+
+    LIB_SYMBOL* const symbol = editor.GetCurSymbol();
+
+    for( std::size_t i = 0; i < aOldEdges.size(); ++i )
+    {
+        if( aMoveVecs[i] == VECTOR2I( 0, 0 ) || !symbol )
+            continue;
+
+        const std::vector<SCH_PIN*> pins = getPinsOnSeg( *symbol, aEdgeUnit, aOldEdges[i], false );
+
+        for( SCH_PIN* pin : pins )
+        {
+            // Move the pin
+            aCommit.Modify( pin, m_frame->GetScreen() );
+            pin->Move( aMoveVecs[i] );
+
+            updateItem( pin, true );
+        }
+    }
+}
+
+
+void EE_POINT_EDITOR::updateParentItem( bool aSnapToGrid, SCH_COMMIT& aCommit ) const
 {
     EDA_ITEM* item = m_editPoints->GetParent();
 
@@ -714,31 +785,49 @@ void EE_POINT_EDITOR::updateParentItem( bool aSnapToGrid ) const
             pinEditedCorner( schIUScale.MilsToIU( 1 ), schIUScale.MilsToIU( 1 ), topLeft, topRight,
                              botLeft, botRight, &gridHelper );
 
+            const BOX2I           oldBox = BOX2I::ByCorners( shape->GetStart(), shape->GetEnd() );
+            std::vector<SEG>      oldSegs;
+            std::vector<VECTOR2I> moveVecs;
+
             if( isModified( m_editPoints->Point( RECT_TOPLEFT ) )
                     || isModified( m_editPoints->Point( RECT_TOPRIGHT ) )
                     || isModified( m_editPoints->Point( RECT_BOTRIGHT ) )
                     || isModified( m_editPoints->Point( RECT_BOTLEFT ) ) )
             {
+                // Corner drags don't update pins. Not only is it an escape hatch to avoid
+                // moving pins, it also avoids tricky problems when the pins "fall off"
+                // the ends of one of the two segments and get either left behind or
+                // "swept up" into the corner.
                 shape->SetPosition( topLeft );
                 shape->SetEnd( botRight );
             }
             else if( isModified( m_editPoints->Line( RECT_TOP ) ) )
             {
+                oldSegs = KIGEOM::GetSegsInDirection( oldBox, DIRECTION_45::Directions::N );
+                moveVecs.emplace_back( 0, topLeft.y - oldBox.GetTop() );
                 shape->SetStartY( topLeft.y );
             }
             else if( isModified( m_editPoints->Line( RECT_LEFT ) ) )
             {
+                oldSegs = KIGEOM::GetSegsInDirection( oldBox, DIRECTION_45::Directions::W );
+                moveVecs.emplace_back( topLeft.x - oldBox.GetLeft(), 0 );
                 shape->SetStartX( topLeft.x );
             }
             else if( isModified( m_editPoints->Line( RECT_BOT ) ) )
             {
+                oldSegs = KIGEOM::GetSegsInDirection( oldBox, DIRECTION_45::Directions::S );
+                moveVecs.emplace_back( 0, botRight.y - oldBox.GetBottom() );
                 shape->SetEndY( botRight.y );
             }
             else if( isModified( m_editPoints->Line( RECT_RIGHT ) ) )
             {
+                oldSegs = KIGEOM::GetSegsInDirection( oldBox, DIRECTION_45::Directions::E );
+                moveVecs.emplace_back( botRight.x - oldBox.GetRight(), 0 );
                 shape->SetEndX( botRight.x );
             }
 
+            dragPinsOnEdge( oldSegs, moveVecs, shape->GetUnit(), aCommit );
+
             for( unsigned i = 0; i < m_editPoints->LinesSize(); ++i )
             {
                 if( !isModified( m_editPoints->Line( i ) ) )
diff --git a/eeschema/tools/ee_point_editor.h b/eeschema/tools/ee_point_editor.h
index b74367f7c0..2decd28400 100644
--- a/eeschema/tools/ee_point_editor.h
+++ b/eeschema/tools/ee_point_editor.h
@@ -31,6 +31,7 @@
 
 class EE_SELECTION_TOOL;
 class SCH_BASE_FRAME;
+class SCH_COMMIT;
 
 /**
  * Tool that displays edit points allowing to modify items by dragging the points.
@@ -59,7 +60,11 @@ public:
 
 private:
     ///< Update item's points with edit points.
-    void updateParentItem( bool aSnapToGrid ) const;
+    void updateParentItem( bool aSnapToGrid, SCH_COMMIT& aCommit ) const;
+
+    ///< When dragging a graphics edge, update pins too.
+    void dragPinsOnEdge( const std::vector<SEG>& aOldEdges, const std::vector<VECTOR2I>& aMoveVecs,
+                         int aUnit, SCH_COMMIT& aCommit ) const;
 
     ///< Update edit points with item's points.
     void updatePoints();
diff --git a/libs/kimath/include/geometry/shape_utils.h b/libs/kimath/include/geometry/shape_utils.h
index 6055dd8716..2a333fcdae 100644
--- a/libs/kimath/include/geometry/shape_utils.h
+++ b/libs/kimath/include/geometry/shape_utils.h
@@ -75,6 +75,15 @@ OPT_VECTOR2I GetSharedEndpoint( const SEG& aSegA, const SEG& aSegB );
  */
 std::array<SEG, 4> BoxToSegs( const BOX2I& aBox );
 
+/**
+ * Get the segments of a box that are in the given direction.
+ *
+ * N,E,S,W are the sides of the box.
+ * NE,SE,SW,NW are the corners of the box, which return the two segments that meet at the corner,
+ * in the order of the direction (e.g. NW = N, then W).
+ */
+std::vector<SEG> GetSegsInDirection( const BOX2I& aBox, DIRECTION_45::Directions aDir );
+
 /**
  * Get the segment of a half-line that is inside a box, if any.
  */
diff --git a/libs/kimath/src/geometry/shape_utils.cpp b/libs/kimath/src/geometry/shape_utils.cpp
index 3dbff90e48..a872d29857 100644
--- a/libs/kimath/src/geometry/shape_utils.cpp
+++ b/libs/kimath/src/geometry/shape_utils.cpp
@@ -80,6 +80,53 @@ std::array<SEG, 4> KIGEOM::BoxToSegs( const BOX2I& aBox )
 }
 
 
+std::vector<SEG> KIGEOM::GetSegsInDirection( const BOX2I& aBox, DIRECTION_45::Directions aDir )
+{
+    // clang-format off
+    switch( aDir )
+    {
+    case DIRECTION_45::Directions::N:
+        return { SEG{ { aBox.GetLeft(), aBox.GetTop() },
+                      { aBox.GetRight(), aBox.GetTop() } } };
+    case DIRECTION_45::Directions::E:
+        return { SEG{ { aBox.GetRight(), aBox.GetTop() },
+                      { aBox.GetRight(), aBox.GetBottom() } } };
+    case DIRECTION_45::Directions::S:
+        return { SEG{ { aBox.GetLeft(), aBox.GetBottom() },
+                      { aBox.GetRight(), aBox.GetBottom() } } };
+    case DIRECTION_45::Directions::W:
+        return { SEG{ { aBox.GetLeft(), aBox.GetTop() },
+                      { aBox.GetLeft(), aBox.GetBottom() } } };
+    case DIRECTION_45::Directions::NE:
+        return { SEG{ { aBox.GetLeft(), aBox.GetTop() },
+                      { aBox.GetRight(), aBox.GetTop() } },
+                 SEG{ { aBox.GetRight(), aBox.GetTop() },
+                      { aBox.GetRight(), aBox.GetBottom() } } };
+    case DIRECTION_45::Directions::SE:
+        return { SEG{ { aBox.GetLeft(), aBox.GetBottom() },
+                      { aBox.GetRight(), aBox.GetBottom() } },
+                 SEG{ { aBox.GetRight(), aBox.GetTop() },
+                      { aBox.GetRight(), aBox.GetBottom() } } };
+    case DIRECTION_45::Directions::SW:
+        return { SEG{ { aBox.GetLeft(), aBox.GetBottom() },
+                      { aBox.GetRight(), aBox.GetBottom() } },
+                 SEG{ { aBox.GetLeft(), aBox.GetTop() },
+                      { aBox.GetLeft(), aBox.GetBottom() } } };
+    case DIRECTION_45::Directions::NW:
+        return { SEG{ { aBox.GetLeft(), aBox.GetTop() },
+                      { aBox.GetRight(), aBox.GetTop() } },
+                 SEG{ { aBox.GetLeft(), aBox.GetTop() },
+                      { aBox.GetLeft(), aBox.GetBottom() } } };
+    case DIRECTION_45::Directions::LAST:
+    case DIRECTION_45::Directions::UNDEFINED: break;
+    }
+    // clang-format on
+
+    wxASSERT( false );
+    return {};
+};
+
+
 std::optional<SEG> KIGEOM::ClipHalfLineToBox( const HALF_LINE& aRay, const BOX2I& aBox )
 {
     // Do the naive implementation - if this really is done in a tight loop,