diff --git a/Configuration.cpp b/Configuration.cpp
index 83531fdd6..76be13ffe 100644
--- a/Configuration.cpp
+++ b/Configuration.cpp
@@ -148,6 +148,23 @@ private:
   QLineEdit description_;
 };
 
+class RearrangableMacrosModel
+  : public QStringListModel
+{
+public:
+  Qt::ItemFlags flags (QModelIndex const& index) const override
+  {
+    auto flags = QStringListModel::flags (index);
+    if (index.isValid ())
+      {
+        // disallow drop onto existing items
+        flags &= ~Qt::ItemIsDropEnabled;
+      }
+    return flags;
+  }
+};
+
+
 // Fields that are transceiver related.
 //
 // These are aggregated in a structure to enable a non-equivalence to
@@ -268,6 +285,7 @@ private:
 
   Q_SLOT void on_add_macro_line_edit_editingFinished ();
   Q_SLOT void delete_macro ();
+  void delete_selected_macros (QModelIndexList);
 
   Q_SLOT void on_save_path_select_push_button_clicked (bool);
 
@@ -318,7 +336,7 @@ private:
   float jt9w_max_dt_;
 
   QStringListModel macros_;
-  QStringListModel next_macros_;
+  RearrangableMacrosModel next_macros_;
   QAction * macro_delete_action_;
   
   Bands bands_;
@@ -1222,6 +1240,9 @@ bool Configuration::impl::validate ()
 
 int Configuration::impl::exec ()
 {
+  // macros can be modified in the main window
+  next_macros_.setStringList (macros_.stringList ());
+
   ptt_state_ = false;
   have_rig_ = rig_active_;	// record that we started with a rig open
 
@@ -1596,17 +1617,44 @@ void Configuration::impl::on_add_macro_line_edit_editingFinished ()
 
 void Configuration::impl::on_delete_macro_push_button_clicked (bool /* checked */)
 {
-  auto index = ui_->macros_list_view->selectionModel ()->currentIndex ();
-  if (index.isValid ())
+  auto selection_model = ui_->macros_list_view->selectionModel ();
+  if (selection_model->hasSelection ())
     {
-      next_macros_.removeRow (index.row ());
+      // delete all selected items
+      delete_selected_macros (selection_model->selectedRows ());
     }
 }
 
 void Configuration::impl::delete_macro ()
 {
-  auto index = ui_->macros_list_view->currentIndex ();
-  if (index.isValid ())
+  auto selection_model = ui_->macros_list_view->selectionModel ();
+  if (!selection_model->hasSelection ())
+    {
+      // delete item under cursor if any
+      auto index = selection_model->currentIndex ();
+      if (index.isValid ())
+        {
+          next_macros_.removeRow (index.row ());
+        }
+    }
+  else
+    {
+      // delete the whole selection
+      delete_selected_macros (selection_model->selectedRows ());
+    }
+}
+
+void Configuration::impl::delete_selected_macros (QModelIndexList selected_rows)
+{
+  // sort in reverse row order so that we can delete without changing
+  // indices underneath us
+  qSort (selected_rows.begin (), selected_rows.end (), [] (QModelIndex const& lhs, QModelIndex const& rhs)
+         {
+           return rhs.row () < lhs.row (); // reverse row ordering
+         });
+
+  // now delete them
+  Q_FOREACH (auto index, selected_rows)
     {
       next_macros_.removeRow (index.row ());
     }
diff --git a/Configuration.ui b/Configuration.ui
index 5c3883a13..6b315acf1 100644
--- a/Configuration.ui
+++ b/Configuration.ui
@@ -6,8 +6,8 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>508</width>
-    <height>471</height>
+    <width>586</width>
+    <height>550</height>
    </rect>
   </property>
   <property name="windowTitle">
@@ -1390,6 +1390,11 @@ both here.</string>
          <property name="contextMenuPolicy">
           <enum>Qt::ActionsContextMenu</enum>
          </property>
+         <property name="toolTip">
+          <string>Drag and drop items to rearrange order
+Right click for item specific actions
+Click, SHIFT+Click and, CRTL+Click to select items</string>
+         </property>
          <property name="styleSheet">
           <string notr="true">QListView {
     show-decoration-selected: 1; /* make the selection span the entire width of the view */
@@ -1418,8 +1423,17 @@ QListView::item:hover {
                                 stop: 0 #FAFBFE, stop: 1 #DCDEF1);
 }</string>
          </property>
+         <property name="dragDropMode">
+          <enum>QAbstractItemView::InternalMove</enum>
+         </property>
+         <property name="defaultDropAction">
+          <enum>Qt::MoveAction</enum>
+         </property>
+         <property name="alternatingRowColors">
+          <bool>true</bool>
+         </property>
          <property name="selectionMode">
-          <enum>QAbstractItemView::SingleSelection</enum>
+          <enum>QAbstractItemView::ExtendedSelection</enum>
          </property>
          <property name="uniformItemSizes">
           <bool>true</bool>
@@ -1801,12 +1815,12 @@ soundcard changes</string>
   </connection>
  </connections>
  <buttongroups>
+  <buttongroup name="TX_audio_source_button_group"/>
   <buttongroup name="TX_mode_button_group"/>
+  <buttongroup name="split_mode_button_group"/>
   <buttongroup name="CAT_stop_bits_button_group"/>
+  <buttongroup name="PTT_method_button_group"/>
   <buttongroup name="CAT_data_bits_button_group"/>
   <buttongroup name="CAT_handshake_button_group"/>
-  <buttongroup name="TX_audio_source_button_group"/>
-  <buttongroup name="split_mode_button_group"/>
-  <buttongroup name="PTT_method_button_group"/>
  </buttongroups>
 </ui>
diff --git a/mainwindow.ui b/mainwindow.ui
index 87cc35fe0..9a216ad6d 100644
--- a/mainwindow.ui
+++ b/mainwindow.ui
@@ -591,6 +591,46 @@ p, li { white-space: pre-wrap; }
     </item>
     <item>
      <layout class="QGridLayout" name="gridLayout_3">
+      <item row="2" column="6">
+       <widget class="QSpinBox" name="TxFreqSpinBox">
+        <property name="sizePolicy">
+         <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+          <horstretch>0</horstretch>
+          <verstretch>0</verstretch>
+         </sizepolicy>
+        </property>
+        <property name="minimumSize">
+         <size>
+          <width>113</width>
+          <height>0</height>
+         </size>
+        </property>
+        <property name="maximumSize">
+         <size>
+          <width>105</width>
+          <height>16777215</height>
+         </size>
+        </property>
+        <property name="toolTip">
+         <string>Audio Tx frequency</string>
+        </property>
+        <property name="suffix">
+         <string>  Hz</string>
+        </property>
+        <property name="prefix">
+         <string>Tx  </string>
+        </property>
+        <property name="minimum">
+         <number>200</number>
+        </property>
+        <property name="maximum">
+         <number>5000</number>
+        </property>
+        <property name="value">
+         <number>1500</number>
+        </property>
+       </widget>
+      </item>
       <item row="3" column="3">
        <widget class="QLabel" name="labAz">
         <property name="sizePolicy">
@@ -876,46 +916,6 @@ p, li { white-space: pre-wrap; }
         </property>
        </widget>
       </item>
-      <item row="2" column="6">
-       <widget class="QSpinBox" name="TxFreqSpinBox">
-        <property name="sizePolicy">
-         <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
-          <horstretch>0</horstretch>
-          <verstretch>0</verstretch>
-         </sizepolicy>
-        </property>
-        <property name="minimumSize">
-         <size>
-          <width>113</width>
-          <height>0</height>
-         </size>
-        </property>
-        <property name="maximumSize">
-         <size>
-          <width>105</width>
-          <height>16777215</height>
-         </size>
-        </property>
-        <property name="toolTip">
-         <string>Audio Tx frequency</string>
-        </property>
-        <property name="suffix">
-         <string>  Hz</string>
-        </property>
-        <property name="prefix">
-         <string>Tx  </string>
-        </property>
-        <property name="minimum">
-         <number>200</number>
-        </property>
-        <property name="maximum">
-         <number>5000</number>
-        </property>
-        <property name="value">
-         <number>1500</number>
-        </property>
-       </widget>
-      </item>
       <item row="0" column="3" colspan="2">
        <widget class="QLabel" name="labDialFreq">
         <property name="sizePolicy">
@@ -985,6 +985,28 @@ p, li { white-space: pre-wrap; }
         </property>
        </widget>
       </item>
+      <item row="0" column="6">
+       <widget class="QCheckBox" name="txFirstCheckBox">
+        <property name="minimumSize">
+         <size>
+          <width>105</width>
+          <height>23</height>
+         </size>
+        </property>
+        <property name="maximumSize">
+         <size>
+          <width>105</width>
+          <height>16777215</height>
+         </size>
+        </property>
+        <property name="toolTip">
+         <string>Check to Tx in even minutes, uncheck for odd minutes</string>
+        </property>
+        <property name="text">
+         <string>Tx even</string>
+        </property>
+       </widget>
+      </item>
       <item row="1" column="3">
        <widget class="QLabel" name="label_3">
         <property name="sizePolicy">
@@ -1077,74 +1099,6 @@ p, li { white-space: pre-wrap; }
         </property>
        </widget>
       </item>
-      <item row="2" column="1" rowspan="5">
-       <widget class="QSlider" name="inGain">
-        <property name="sizePolicy">
-         <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
-          <horstretch>0</horstretch>
-          <verstretch>0</verstretch>
-         </sizepolicy>
-        </property>
-        <property name="minimumSize">
-         <size>
-          <width>0</width>
-          <height>160</height>
-         </size>
-        </property>
-        <property name="maximumSize">
-         <size>
-          <width>20</width>
-          <height>160</height>
-         </size>
-        </property>
-        <property name="toolTip">
-         <string>Digital gain for audio input</string>
-        </property>
-        <property name="minimum">
-         <number>-50</number>
-        </property>
-        <property name="maximum">
-         <number>50</number>
-        </property>
-        <property name="value">
-         <number>20</number>
-        </property>
-        <property name="orientation">
-         <enum>Qt::Vertical</enum>
-        </property>
-        <property name="invertedAppearance">
-         <bool>false</bool>
-        </property>
-        <property name="invertedControls">
-         <bool>false</bool>
-        </property>
-        <property name="tickPosition">
-         <enum>QSlider::TicksBelow</enum>
-        </property>
-       </widget>
-      </item>
-      <item row="0" column="6">
-       <widget class="QCheckBox" name="txFirstCheckBox">
-        <property name="minimumSize">
-         <size>
-          <width>105</width>
-          <height>23</height>
-         </size>
-        </property>
-        <property name="maximumSize">
-         <size>
-          <width>105</width>
-          <height>16777215</height>
-         </size>
-        </property>
-        <property name="toolTip">
-         <string>Check to Tx in even minutes, uncheck for odd minutes</string>
-        </property>
-        <property name="text">
-         <string>Tx even</string>
-        </property>
-       </widget>
-      </item>
       <item row="1" column="6">
        <widget class="QPushButton" name="pbTxMode">
         <property name="enabled">
@@ -1158,6 +1112,16 @@ p, li { white-space: pre-wrap; }
         </property>
        </widget>
       </item>
+      <item row="1" column="0" colspan="2">
+       <widget class="QCheckBox" name="cbPlus2kHz">
+        <property name="toolTip">
+         <string>Add 2 kHz to requested dial frequency</string>
+        </property>
+        <property name="text">
+         <string>+2 kHz</string>
+        </property>
+       </widget>
+      </item>
       <item row="5" column="3" rowspan="2" colspan="2">
        <widget class="QLabel" name="labUTC">
         <property name="sizePolicy">
@@ -1203,13 +1167,19 @@ p, li { white-space: pre-wrap; }
         </property>
        </widget>
       </item>
-      <item row="1" column="0" colspan="2">
-       <widget class="QCheckBox" name="cbPlus2kHz">
+      <item row="1" column="2">
+       <widget class="QPushButton" name="readFreq">
+        <property name="maximumSize">
+         <size>
+          <width>15</width>
+          <height>15</height>
+         </size>
+        </property>
         <property name="toolTip">
-         <string>Add 2 kHz to requested dial frequency</string>
+         <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;If orange, click to read dial frequency&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
         </property>
         <property name="text">
-         <string>+2 kHz</string>
+         <string/>
         </property>
        </widget>
       </item>
@@ -1273,7 +1243,7 @@ p, li { white-space: pre-wrap; }
             <enum>QTabWidget::Triangular</enum>
            </property>
            <property name="currentIndex">
-            <number>0</number>
+            <number>1</number>
            </property>
            <widget class="QWidget" name="tab">
             <attribute name="title">
@@ -1778,11 +1748,17 @@ p, li { white-space: pre-wrap; }
                    <height>16777215</height>
                   </size>
                  </property>
+                 <property name="toolTip">
+                  <string>Enter a free text message (maximum 13 characters)
+or select a predefined macro from the dropdown list.
+Press ENTER to add the current text to the predefined
+list. The list can be maintained in Settings (F2).</string>
+                 </property>
                  <property name="editable">
                   <bool>true</bool>
                  </property>
                  <property name="insertPolicy">
-                  <enum>QComboBox::NoInsert</enum>
+                  <enum>QComboBox::InsertAtBottom</enum>
                  </property>
                 </widget>
                </item>
@@ -1990,11 +1966,17 @@ p, li { white-space: pre-wrap; }
                      <height>0</height>
                     </size>
                    </property>
+                   <property name="toolTip">
+                    <string>Enter a free text message (maximum 13 characters)
+or select a predefined macro from the dropdown list.
+Press ENTER to add the current text to the predefined
+list. The list can be maintained in Settings (F2).</string>
+                   </property>
                    <property name="editable">
                     <bool>true</bool>
                    </property>
                    <property name="insertPolicy">
-                    <enum>QComboBox::NoInsert</enum>
+                    <enum>QComboBox::InsertAtBottom</enum>
                    </property>
                   </widget>
                  </item>
@@ -2031,19 +2013,10 @@ p, li { white-space: pre-wrap; }
         </layout>
        </widget>
       </item>
-      <item row="1" column="2">
-       <widget class="QPushButton" name="readFreq">
-        <property name="maximumSize">
-         <size>
-          <width>15</width>
-          <height>15</height>
-         </size>
-        </property>
-        <property name="toolTip">
-         <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;If orange, click to read dial frequency&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
-        </property>
+      <item row="0" column="9">
+       <widget class="QLabel" name="label">
         <property name="text">
-         <string/>
+         <string>Pwr</string>
         </property>
        </widget>
       </item>
@@ -2063,6 +2036,34 @@ p, li { white-space: pre-wrap; }
         </property>
        </spacer>
       </item>
+      <item row="1" column="9" rowspan="6">
+       <widget class="QSlider" name="outAttenuation">
+        <property name="toolTip">
+         <string>Adjust Tx audio level</string>
+        </property>
+        <property name="maximum">
+         <number>300</number>
+        </property>
+        <property name="value">
+         <number>0</number>
+        </property>
+        <property name="orientation">
+         <enum>Qt::Vertical</enum>
+        </property>
+        <property name="invertedAppearance">
+         <bool>true</bool>
+        </property>
+        <property name="invertedControls">
+         <bool>true</bool>
+        </property>
+        <property name="tickPosition">
+         <enum>QSlider::TicksBelow</enum>
+        </property>
+        <property name="tickInterval">
+         <number>10</number>
+        </property>
+       </widget>
+      </item>
       <item row="0" column="0" colspan="3">
        <widget class="QComboBox" name="bandComboBox">
         <property name="sizePolicy">
@@ -2094,41 +2095,6 @@ p, li { white-space: pre-wrap; }
         </property>
        </widget>
       </item>
-      <item row="0" column="9">
-       <widget class="QLabel" name="label">
-        <property name="text">
-         <string>Pwr</string>
-        </property>
-       </widget>
-      </item>
-      <item row="1" column="9" rowspan="6">
-       <widget class="QSlider" name="outAttenuation">
-        <property name="toolTip">
-         <string>Adjust Tx audio level</string>
-        </property>
-        <property name="maximum">
-         <number>300</number>
-        </property>
-        <property name="value">
-         <number>0</number>
-        </property>
-        <property name="orientation">
-         <enum>Qt::Vertical</enum>
-        </property>
-        <property name="invertedAppearance">
-         <bool>true</bool>
-        </property>
-        <property name="invertedControls">
-         <bool>true</bool>
-        </property>
-        <property name="tickPosition">
-         <enum>QSlider::TicksBelow</enum>
-        </property>
-        <property name="tickInterval">
-         <number>10</number>
-        </property>
-       </widget>
-      </item>
       <item row="3" column="7">
        <widget class="QPushButton" name="pbT2R">
         <property name="sizePolicy">
@@ -2237,6 +2203,52 @@ p, li { white-space: pre-wrap; }
         </item>
        </layout>
       </item>
+      <item row="2" column="1" rowspan="5">
+       <widget class="QSlider" name="inGain">
+        <property name="sizePolicy">
+         <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+          <horstretch>0</horstretch>
+          <verstretch>0</verstretch>
+         </sizepolicy>
+        </property>
+        <property name="minimumSize">
+         <size>
+          <width>0</width>
+          <height>160</height>
+         </size>
+        </property>
+        <property name="maximumSize">
+         <size>
+          <width>20</width>
+          <height>160</height>
+         </size>
+        </property>
+        <property name="toolTip">
+         <string>Digital gain for audio input</string>
+        </property>
+        <property name="minimum">
+         <number>-50</number>
+        </property>
+        <property name="maximum">
+         <number>50</number>
+        </property>
+        <property name="value">
+         <number>20</number>
+        </property>
+        <property name="orientation">
+         <enum>Qt::Vertical</enum>
+        </property>
+        <property name="invertedAppearance">
+         <bool>false</bool>
+        </property>
+        <property name="invertedControls">
+         <bool>false</bool>
+        </property>
+        <property name="tickPosition">
+         <enum>QSlider::TicksBelow</enum>
+        </property>
+       </widget>
+      </item>
      </layout>
     </item>
    </layout>
@@ -2247,7 +2259,7 @@ p, li { white-space: pre-wrap; }
      <x>0</x>
      <y>0</y>
      <width>780</width>
-     <height>21</height>
+     <height>20</height>
     </rect>
    </property>
    <widget class="QMenu" name="menuFile">