diff --git a/bitmaps_png/CMakeLists.txt b/bitmaps_png/CMakeLists.txt
index 64f4d86279..9311a9b552 100644
--- a/bitmaps_png/CMakeLists.txt
+++ b/bitmaps_png/CMakeLists.txt
@@ -502,6 +502,7 @@ set( BMAPS_MID
     update_pcb_from_sch
     use_3D_copper_thickness
     via
+    via_annulus
     via_buried
     via_microvia
     via_sketch
diff --git a/bitmaps_png/include/bitmaps_png/bitmaps_list.h b/bitmaps_png/include/bitmaps_png/bitmaps_list.h
index b8133efe14..4db62f9e7e 100644
--- a/bitmaps_png/include/bitmaps_png/bitmaps_list.h
+++ b/bitmaps_png/include/bitmaps_png/bitmaps_list.h
@@ -477,6 +477,7 @@ EXTERN_BITMAP( via_xpm )
 EXTERN_BITMAP( via_microvia_xpm )
 EXTERN_BITMAP( via_buried_xpm )
 EXTERN_BITMAP( via_sketch_xpm )
+EXTERN_BITMAP( via_annulus_xpm )
 EXTERN_BITMAP( via_diameter_xpm )
 EXTERN_BITMAP( via_hole_diameter_xpm )
 EXTERN_BITMAP( viewlibs_icon_xpm )
diff --git a/common/pcb.keywords b/common/pcb.keywords
index 0a97df2d48..033e8d8986 100644
--- a/common/pcb.keywords
+++ b/common/pcb.keywords
@@ -255,6 +255,7 @@ via
 vias
 via_dia
 via_drill
+via_min_annulus
 via_min_drill
 via_min_size
 via_size
diff --git a/include/board_design_settings.h b/include/board_design_settings.h
index 14acfe85a0..ddf19606ff 100644
--- a/include/board_design_settings.h
+++ b/include/board_design_settings.h
@@ -216,8 +216,9 @@ public:
     bool       m_UseConnectedTrackWidth;    // use width of existing track when creating a new,
                                             // connected track
     int        m_MinClearance;              // overall min clearance
-    int        m_TrackMinWidth;             // track min value for width ((min copper size value
-    int        m_ViasMinSize;               // vias (not micro vias) min diameter
+    int        m_TrackMinWidth;             // overall min track width
+    int        m_ViasMinAnnulus;            // overall minimum width of the via copper ring
+    int        m_ViasMinSize;               // overall vias (not micro vias) min diameter
     int        m_MinThroughDrill;           // through hole (not micro vias) min drill diameter
     int        m_MicroViasMinSize;          // micro vias min diameter
     int        m_MicroViasMinDrill;         // micro vias min drill diameter
diff --git a/pcbnew/board_design_settings.cpp b/pcbnew/board_design_settings.cpp
index 91485be8ca..0ddcc4166f 100644
--- a/pcbnew/board_design_settings.cpp
+++ b/pcbnew/board_design_settings.cpp
@@ -617,6 +617,7 @@ BOARD_DESIGN_SETTINGS::BOARD_DESIGN_SETTINGS() :
 
     m_MinClearance        = Millimeter2iu( DEFAULT_MINCLEARANCE );
     m_TrackMinWidth       = Millimeter2iu( DEFAULT_TRACKMINWIDTH );
+    m_ViasMinAnnulus      = Millimeter2iu( DEFAULT_VIASMINSIZE - DEFAULT_MINTHROUGHDRILL ) / 2;
     m_ViasMinSize         = Millimeter2iu( DEFAULT_VIASMINSIZE );
     m_MinThroughDrill     = Millimeter2iu( DEFAULT_MINTHROUGHDRILL );
     m_MicroViasMinSize    = Millimeter2iu( DEFAULT_MICROVIASMINSIZE );
@@ -673,6 +674,11 @@ void BOARD_DESIGN_SETTINGS::AppendConfigs( BOARD* aBoard, std::vector<PARAM_CFG*
           Millimeter2iu( DEFAULT_TRACKMINWIDTH ), Millimeter2iu( 0.01 ), Millimeter2iu( 25.0 ),
           nullptr, MM_PER_IU ) );
 
+    aResult->push_back( new PARAM_CFG_INT_WITH_SCALE( wxT( "MinViaAnnulus" ),
+          &m_ViasMinAnnulus,
+          Millimeter2iu( DEFAULT_VIASMINSIZE ), Millimeter2iu( 0.01 ), Millimeter2iu( 25.0 ),
+          nullptr, MM_PER_IU ) );
+
     aResult->push_back( new PARAM_CFG_INT_WITH_SCALE( wxT( "MinViaDiameter" ),
           &m_ViasMinSize,
           Millimeter2iu( DEFAULT_VIASMINSIZE ), Millimeter2iu( 0.01 ), Millimeter2iu( 25.0 ),
diff --git a/pcbnew/dialogs/panel_setup_feature_constraints.cpp b/pcbnew/dialogs/panel_setup_feature_constraints.cpp
index 309fb564e3..b7f3d4f542 100644
--- a/pcbnew/dialogs/panel_setup_feature_constraints.cpp
+++ b/pcbnew/dialogs/panel_setup_feature_constraints.cpp
@@ -38,6 +38,7 @@ PANEL_SETUP_FEATURE_CONSTRAINTS::PANEL_SETUP_FEATURE_CONSTRAINTS( PAGED_DIALOG*
         PANEL_SETUP_FEATURE_CONSTRAINTS_BASE( aParent->GetTreebook() ),
         m_minClearance( aFrame, m_clearanceTitle, m_clearanceCtrl, m_clearanceUnits, true ),
         m_trackMinWidth( aFrame, m_TrackMinWidthTitle, m_TrackMinWidthCtrl, m_TrackMinWidthUnits, true ),
+        m_viaMinAnnulus( aFrame, m_ViaMinAnnulusTitle, m_ViaMinAnnulusCtrl, m_ViaMinAnnulusUnits, true ),
         m_viaMinSize( aFrame, m_ViaMinTitle, m_SetViasMinSizeCtrl, m_ViaMinUnits, true ),
         m_throughHoleMin( aFrame, m_MinDrillTitle, m_MinDrillCtrl, m_MinDrillUnits, true ),
         m_uviaMinSize( aFrame, m_uviaMinSizeLabel, m_uviaMinSizeCtrl, m_uviaMinSizeUnits, true ),
@@ -63,6 +64,7 @@ bool PANEL_SETUP_FEATURE_CONSTRAINTS::TransferDataToWindow()
 
     m_minClearance.SetValue( m_BrdSettings->m_MinClearance );
     m_trackMinWidth.SetValue( m_BrdSettings->m_TrackMinWidth );
+    m_viaMinAnnulus.SetValue( m_BrdSettings->m_ViasMinAnnulus );
     m_viaMinSize.SetValue(m_BrdSettings->m_ViasMinSize );
     m_edgeClearance.SetValue( m_BrdSettings->m_CopperEdgeClearance );
 
@@ -84,6 +86,9 @@ bool PANEL_SETUP_FEATURE_CONSTRAINTS::TransferDataFromWindow()
     if( !m_trackMinWidth.Validate( 0, Mils2iu( 10000 ) ) )   // 0 to 10 inches
         return false;
 
+    if( !m_viaMinAnnulus.Validate( 0, Mils2iu( 10000 ) ) )   // 0 to 10 inches
+        return false;
+
     if( !m_viaMinSize.Validate( 0, Mils2iu( 10000 ) ) )   // 0 to 10 inches
         return false;
 
@@ -106,6 +111,7 @@ bool PANEL_SETUP_FEATURE_CONSTRAINTS::TransferDataFromWindow()
 
     m_BrdSettings->m_MinClearance = m_minClearance.GetValue();
     m_BrdSettings->m_TrackMinWidth = m_trackMinWidth.GetValue();
+    m_BrdSettings->m_ViasMinAnnulus = m_viaMinAnnulus.GetValue();
     m_BrdSettings->m_ViasMinSize = m_viaMinSize.GetValue();
     m_BrdSettings->SetCopperEdgeClearance( m_edgeClearance.GetValue() );
 
@@ -131,6 +137,7 @@ bool PANEL_SETUP_FEATURE_CONSTRAINTS::Show( bool aShow )
         m_bitmapZoneFillOpt->SetBitmap( KiBitmap( show_zone_xpm ) );
         m_bitmapClearance->SetBitmap( KiBitmap( ps_diff_pair_gap_xpm ) );
         m_bitmapMinTrackWidth->SetBitmap( KiBitmap( width_track_xpm ) );
+        m_bitmapMinViaAnnulus->SetBitmap( KiBitmap( via_annulus_xpm ) );
         m_bitmapMinViaDiameter->SetBitmap( KiBitmap( via_diameter_xpm ) );
         m_bitmapMinViaDrill->SetBitmap( KiBitmap( via_hole_diameter_xpm ) );
         m_bitmapMinuViaDiameter->SetBitmap( KiBitmap( via_diameter_xpm ) );
diff --git a/pcbnew/dialogs/panel_setup_feature_constraints.h b/pcbnew/dialogs/panel_setup_feature_constraints.h
index 68a7929e7b..c3dccbdc57 100644
--- a/pcbnew/dialogs/panel_setup_feature_constraints.h
+++ b/pcbnew/dialogs/panel_setup_feature_constraints.h
@@ -44,6 +44,7 @@ private:
 public:
     UNIT_BINDER             m_minClearance;
     UNIT_BINDER             m_trackMinWidth;
+    UNIT_BINDER             m_viaMinAnnulus;
     UNIT_BINDER             m_viaMinSize;
     UNIT_BINDER             m_throughHoleMin;
     UNIT_BINDER             m_uviaMinSize;
diff --git a/pcbnew/dialogs/panel_setup_feature_constraints_base.cpp b/pcbnew/dialogs/panel_setup_feature_constraints_base.cpp
index cd1b92359b..234c18717d 100644
--- a/pcbnew/dialogs/panel_setup_feature_constraints_base.cpp
+++ b/pcbnew/dialogs/panel_setup_feature_constraints_base.cpp
@@ -177,6 +177,20 @@ PANEL_SETUP_FEATURE_CONSTRAINTS_BASE::PANEL_SETUP_FEATURE_CONSTRAINTS_BASE( wxWi
 	m_TrackMinWidthUnits->Wrap( -1 );
 	fgFeatureConstraints->Add( m_TrackMinWidthUnits, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_LEFT, 5 );
 
+	m_bitmapMinViaAnnulus = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
+	fgFeatureConstraints->Add( m_bitmapMinViaAnnulus, 0, wxALL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+	m_ViaMinAnnulusTitle = new wxStaticText( this, wxID_ANY, _("Minimum via annulus:"), wxDefaultPosition, wxDefaultSize, 0 );
+	m_ViaMinAnnulusTitle->Wrap( -1 );
+	fgFeatureConstraints->Add( m_ViaMinAnnulusTitle, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+	m_ViaMinAnnulusCtrl = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
+	fgFeatureConstraints->Add( m_ViaMinAnnulusCtrl, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
+
+	m_ViaMinAnnulusUnits = new wxStaticText( this, wxID_ANY, _("mm"), wxDefaultPosition, wxDefaultSize, 0 );
+	m_ViaMinAnnulusUnits->Wrap( -1 );
+	fgFeatureConstraints->Add( m_ViaMinAnnulusUnits, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
 	m_bitmapMinViaDiameter = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
 	fgFeatureConstraints->Add( m_bitmapMinViaDiameter, 0, wxALL|wxALIGN_CENTER_HORIZONTAL, 5 );
 
diff --git a/pcbnew/dialogs/panel_setup_feature_constraints_base.fbp b/pcbnew/dialogs/panel_setup_feature_constraints_base.fbp
index 236fac7114..9f21d69a00 100644
--- a/pcbnew/dialogs/panel_setup_feature_constraints_base.fbp
+++ b/pcbnew/dialogs/panel_setup_feature_constraints_base.fbp
@@ -1696,6 +1696,250 @@
                                         <property name="wrap">-1</property>
                                     </object>
                                 </object>
+                                <object class="sizeritem" expanded="1">
+                                    <property name="border">5</property>
+                                    <property name="flag">wxALL|wxALIGN_CENTER_HORIZONTAL</property>
+                                    <property name="proportion">0</property>
+                                    <object class="wxStaticBitmap" 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="bitmap"></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="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_bitmapMinViaAnnulus</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="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="1">
+                                    <property name="border">5</property>
+                                    <property name="flag">wxALIGN_CENTER_VERTICAL</property>
+                                    <property name="proportion">0</property>
+                                    <object class="wxStaticText" 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="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_ANY</property>
+                                        <property name="label">Minimum via annulus:</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_ViaMinAnnulusTitle</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="1">
+                                    <property name="border">5</property>
+                                    <property name="flag">wxALL|wxALIGN_CENTER_VERTICAL|wxEXPAND</property>
+                                    <property name="proportion">0</property>
+                                    <object class="wxTextCtrl" 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="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_ANY</property>
+                                        <property name="max_size"></property>
+                                        <property name="maximize_button">0</property>
+                                        <property name="maximum_size"></property>
+                                        <property name="maxlength"></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_ViaMinAnnulusCtrl</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="value"></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">wxALIGN_CENTER_VERTICAL</property>
+                                    <property name="proportion">0</property>
+                                    <object class="wxStaticText" 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="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_ANY</property>
+                                        <property name="label">mm</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_ViaMinAnnulusUnits</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="1">
                                     <property name="border">5</property>
                                     <property name="flag">wxALL|wxALIGN_CENTER_HORIZONTAL</property>
diff --git a/pcbnew/dialogs/panel_setup_feature_constraints_base.h b/pcbnew/dialogs/panel_setup_feature_constraints_base.h
index 4d6714e253..777d339849 100644
--- a/pcbnew/dialogs/panel_setup_feature_constraints_base.h
+++ b/pcbnew/dialogs/panel_setup_feature_constraints_base.h
@@ -62,6 +62,10 @@ class PANEL_SETUP_FEATURE_CONSTRAINTS_BASE : public wxPanel
 		wxStaticText* m_TrackMinWidthTitle;
 		wxTextCtrl* m_TrackMinWidthCtrl;
 		wxStaticText* m_TrackMinWidthUnits;
+		wxStaticBitmap* m_bitmapMinViaAnnulus;
+		wxStaticText* m_ViaMinAnnulusTitle;
+		wxTextCtrl* m_ViaMinAnnulusCtrl;
+		wxStaticText* m_ViaMinAnnulusUnits;
 		wxStaticBitmap* m_bitmapMinViaDiameter;
 		wxStaticText* m_ViaMinTitle;
 		wxTextCtrl* m_SetViasMinSizeCtrl;
diff --git a/pcbnew/dialogs/panel_setup_netclasses.cpp b/pcbnew/dialogs/panel_setup_netclasses.cpp
index 6d8e983890..fe6c014fbd 100644
--- a/pcbnew/dialogs/panel_setup_netclasses.cpp
+++ b/pcbnew/dialogs/panel_setup_netclasses.cpp
@@ -515,6 +515,7 @@ bool PANEL_SETUP_NETCLASSES::validateData()
         return false;
 
     wxString msg;
+    int minViaAnnulus = m_ConstraintsPanel->m_viaMinAnnulus.GetValue();
     int minViaDia = m_ConstraintsPanel->m_viaMinSize.GetValue();
     int minThroughHole = m_ConstraintsPanel->m_throughHoleMin.GetValue();
     int minUViaDia = m_ConstraintsPanel->m_uviaMinSize.GetValue();
@@ -572,6 +573,15 @@ bool PANEL_SETUP_NETCLASSES::validateData()
             return false;
         }
 
+        if( ( getNetclassValue( row, GRID_VIASIZE )
+                - getNetclassValue( row, GRID_VIADRILL ) ) / 2 < minViaAnnulus )
+        {
+            msg.Printf( _( "Via diameter and drill leave via annulus less than minimum (%s)." ),
+                        StringFromValue( m_Frame->GetUserUnits(), minViaAnnulus, true, true ) );
+            m_Parent->SetError( msg, this, m_netclassGrid, row, GRID_VIASIZE );
+            return false;
+        }
+
         if( getNetclassValue( row, GRID_VIADRILL ) < minThroughHole )
         {
             msg.Printf( _( "Via drill less than minimum via drill (%s)." ),
@@ -603,6 +613,8 @@ bool PANEL_SETUP_NETCLASSES::validateData()
             m_Parent->SetError( msg, this, m_netclassGrid, row, GRID_uVIADRILL );
             return false;
         }
+
+        // JEY TODO: test microvias agains via min annulus?
     }
 
     return true;
diff --git a/pcbnew/dialogs/panel_setup_tracks_and_vias.cpp b/pcbnew/dialogs/panel_setup_tracks_and_vias.cpp
index 991e772a76..6be4c09126 100644
--- a/pcbnew/dialogs/panel_setup_tracks_and_vias.cpp
+++ b/pcbnew/dialogs/panel_setup_tracks_and_vias.cpp
@@ -221,6 +221,7 @@ bool PANEL_SETUP_TRACKS_AND_VIAS::validateData()
     }
 
     wxString msg;
+    int minViaAnnulus = m_ConstraintsPanel->m_viaMinAnnulus.GetValue();
     int minViaDia = m_ConstraintsPanel->m_viaMinSize.GetValue();
     int minThroughHole = m_ConstraintsPanel->m_throughHoleMin.GetValue();
     int minTrackWidth = m_ConstraintsPanel->m_trackMinWidth.GetValue();
@@ -283,6 +284,15 @@ bool PANEL_SETUP_TRACKS_AND_VIAS::validateData()
             m_Parent->SetError( msg, this, m_viaSizesGrid, row, VIA_DRILL_COL );
             return false;
         }
+
+        if( ( ValueFromString( m_Frame->GetUserUnits(), viaDia )
+                - ValueFromString( m_Frame->GetUserUnits(), viaDrill ) ) / 2 < minViaAnnulus )
+        {
+            msg.Printf( _( "Diameter and drill leave via annulus less than minimum (%s)." ),
+                        StringFromValue( m_Frame->GetUserUnits(), minViaAnnulus, true, true ) );
+            m_Parent->SetError( msg, this, m_viaSizesGrid, row, VIA_SIZE_COL );
+            return false;
+        }
     }
 
     // Test diff pairs
diff --git a/pcbnew/drc/drc.cpp b/pcbnew/drc/drc.cpp
index cebb5172b0..4aa379ed0a 100644
--- a/pcbnew/drc/drc.cpp
+++ b/pcbnew/drc/drc.cpp
@@ -620,6 +620,22 @@ bool DRC::doNetClass( const NETCLASSPTR& nc, wxString& msg )
         ret = false;
     }
 
+    int ncViaAnnulus = ( nc->GetViaDiameter() - nc->GetViaDrill() ) / 2;
+
+    if( ncViaAnnulus < g.m_ViasMinAnnulus )
+    {
+        DRC_ITEM* drcItem = new DRC_ITEM( DRCE_NETCLASS_VIAANNULUS );
+
+        msg.Printf( drcItem->GetErrorText() + _( " (board minimum %s; %s netclass %s)" ),
+                    MessageTextFromValue( userUnits(), g.m_ViasMinAnnulus, true ),
+                    nc->GetName(),
+                    MessageTextFromValue( userUnits(), ncViaAnnulus, true ) );
+
+        drcItem->SetErrorMessage( msg );
+        addMarkerToPcb( new MARKER_PCB( drcItem, wxPoint() ) );
+        ret = false;
+    }
+
     if( nc->GetuViaDiameter() < g.m_MicroViasMinSize )
     {
         DRC_ITEM* drcItem = new DRC_ITEM( DRCE_NETCLASS_uVIASIZE );
diff --git a/pcbnew/drc/drc.h b/pcbnew/drc/drc.h
index 963424934d..dd2a88c15c 100644
--- a/pcbnew/drc/drc.h
+++ b/pcbnew/drc/drc.h
@@ -61,6 +61,7 @@ enum PCB_DRC_CODE {
     DRCE_DRILLED_HOLES_TOO_CLOSE,           ///< overlapping drilled holes break drill bits
     DRCE_TOO_SMALL_TRACK_WIDTH,             ///< Too small track width
     DRCE_TOO_SMALL_VIA,                     ///< Too small via size
+    DRCE_TOO_SMALL_VIA_ANNULUS,             ///< Via size and drill leave annulus too small
     DRCE_TOO_SMALL_VIA_DRILL,               ///< Too small via drill
     DRCE_TOO_SMALL_PAD_DRILL,               ///< Too small via drill
     DRCE_VIA_HOLE_BIGGER,                   ///< via's hole is bigger than its diameter
@@ -71,6 +72,7 @@ enum PCB_DRC_CODE {
     DRCE_BURIED_VIA_NOT_ALLOWED,            ///< buried vias are not allowed
     DRCE_NETCLASS_TRACKWIDTH,               ///< netclass has TrackWidth < board.m_designSettings->m_TrackMinWidth
     DRCE_NETCLASS_CLEARANCE,                ///< netclass has Clearance < board.m_designSettings->m_TrackClearance
+    DRCE_NETCLASS_VIAANNULUS,               ///< netclass ViaSize & ViaDrill leave annulus < board.m_designSettings->m_ViasMinAnnulus
     DRCE_NETCLASS_VIASIZE,                  ///< netclass has ViaSize < board.m_designSettings->m_ViasMinSize
     DRCE_NETCLASS_VIADRILLSIZE,             ///< netclass has ViaDrillSize < board.m_designSettings->m_MinThroughDrill
     DRCE_NETCLASS_uVIASIZE,                 ///< netclass has ViaSize < board.m_designSettings->m_MicroViasMinSize
diff --git a/pcbnew/drc/drc_clearance_test_functions.cpp b/pcbnew/drc/drc_clearance_test_functions.cpp
index 70b922a907..fff413b768 100644
--- a/pcbnew/drc/drc_clearance_test_functions.cpp
+++ b/pcbnew/drc/drc_clearance_test_functions.cpp
@@ -176,6 +176,23 @@ void DRC::doTrackDrc( TRACK* aRefSeg, TRACKS::iterator aStartIt, TRACKS::iterato
         }
         else
         {
+            int viaAnnulus = ( refvia->GetWidth() - refvia->GetDrill() ) / 2;
+
+            if( viaAnnulus < dsnSettings.m_ViasMinAnnulus )
+            {
+                DRC_ITEM* drcItem = new DRC_ITEM( DRCE_TOO_SMALL_VIA_ANNULUS );
+
+                msg.Printf( drcItem->GetErrorText() + _( " (board minimum %s; actual %s)" ),
+                            MessageTextFromValue( userUnits(), dsnSettings.m_ViasMinSize, true ),
+                            MessageTextFromValue( userUnits(), viaAnnulus, true ) );
+
+                drcItem->SetErrorMessage( msg );
+                drcItem->SetItems( refvia );
+
+                MARKER_PCB* marker = new MARKER_PCB( drcItem, refvia->GetPosition() );
+                addMarkerToPcb( marker );
+            }
+
             if( refvia->GetWidth() < dsnSettings.m_ViasMinSize )
             {
                 DRC_ITEM* drcItem = new DRC_ITEM( DRCE_TOO_SMALL_VIA );
diff --git a/pcbnew/drc/drc_item.cpp b/pcbnew/drc/drc_item.cpp
index 5ea665bbde..11572857ed 100644
--- a/pcbnew/drc/drc_item.cpp
+++ b/pcbnew/drc/drc_item.cpp
@@ -85,6 +85,7 @@ wxString DRC_ITEM::GetErrorText( int aCode, bool aTranslate ) const
     case DRCE_HOLE_NEAR_TRACK:          msg = _HKI( "Hole too close to track" );            break;
     case DRCE_TOO_SMALL_TRACK_WIDTH:    msg = _HKI( "Track width too small" );              break;
     case DRCE_TOO_SMALL_VIA:            msg = _HKI( "Via size too small" );                 break;
+    case DRCE_TOO_SMALL_VIA_ANNULUS:    msg = _HKI( "Via annulus too small" );              break;
     case DRCE_TOO_SMALL_MICROVIA:       msg = _HKI( "Micro via size too small" );           break;
     case DRCE_TOO_SMALL_VIA_DRILL:      msg = _HKI( "Via drill too small" );                break;
     case DRCE_TOO_SMALL_PAD_DRILL:      msg = _HKI( "Pad drill too small" );                break;
@@ -96,6 +97,7 @@ wxString DRC_ITEM::GetErrorText( int aCode, bool aTranslate ) const
     // use &lt; since this is text ultimately embedded in HTML
     case DRCE_NETCLASS_TRACKWIDTH:      msg = _HKI( "NetClass Track Width too small" );     break;
     case DRCE_NETCLASS_CLEARANCE:       msg = _HKI( "NetClass Clearance too small" );       break;
+    case DRCE_NETCLASS_VIAANNULUS:      msg = _HKI( "NetClass via annulus too small" );     break;
     case DRCE_NETCLASS_VIASIZE:         msg = _HKI( "NetClass Via Dia too small" );         break;
     case DRCE_NETCLASS_VIADRILLSIZE:    msg = _HKI( "NetClass Via Drill too small" );       break;
     case DRCE_NETCLASS_uVIASIZE:        msg = _HKI( "NetClass uVia Dia too small" );        break;
diff --git a/pcbnew/eagle_plugin.cpp b/pcbnew/eagle_plugin.cpp
index d8002b18a7..debab64530 100644
--- a/pcbnew/eagle_plugin.cpp
+++ b/pcbnew/eagle_plugin.cpp
@@ -249,6 +249,7 @@ BOARD* EAGLE_PLUGIN::Load( const wxString& aFileName, BOARD* aAppendToMe,  const
         m_min_trace    = INT_MAX;
         m_min_hole     = INT_MAX;
         m_min_via      = INT_MAX;
+        m_min_annulus  = INT_MAX;
 
         loadAllSections( doc );
 
@@ -263,6 +264,9 @@ BOARD* EAGLE_PLUGIN::Load( const wxString& aFileName, BOARD* aAppendToMe,  const
         if( m_min_hole < designSettings.m_MinThroughDrill )
             designSettings.m_MinThroughDrill = m_min_hole;
 
+        if( m_min_annulus < designSettings.m_ViasMinAnnulus )
+            designSettings.m_ViasMinAnnulus = m_min_annulus;
+
         if( m_rules->mdWireWire )
         {
             NETCLASSPTR defaultNetclass = designSettings.GetDefault();
@@ -308,10 +312,11 @@ BOARD* EAGLE_PLUGIN::Load( const wxString& aFileName, BOARD* aAppendToMe,  const
 
 void EAGLE_PLUGIN::init( const PROPERTIES* aProperties )
 {
-    m_hole_count = 0;
-    m_min_trace  = 0;
-    m_min_hole   = 0;
-    m_min_via    = 0;
+    m_hole_count  = 0;
+    m_min_trace   = 0;
+    m_min_hole    = 0;
+    m_min_via     = 0;
+    m_min_annulus = 0;
     m_xpath->clear();
     m_pads_to_nets.clear();
 
@@ -2182,6 +2187,9 @@ void EAGLE_PLUGIN::loadSignals( wxXmlNode* aSignals )
                     if( drillz < m_min_hole )
                         m_min_hole = drillz;
 
+                    if( ( kidiam - drillz ) / 2 < m_min_annulus )
+                        m_min_annulus = ( kidiam - drillz ) / 2;
+
                     if( layer_front_most == F_Cu && layer_back_most == B_Cu )
                         via->SetViaType( VIATYPE::THROUGH );
                     else if( layer_front_most == F_Cu || layer_back_most == B_Cu )
diff --git a/pcbnew/eagle_plugin.h b/pcbnew/eagle_plugin.h
index b20000f42b..6a8790dd39 100644
--- a/pcbnew/eagle_plugin.h
+++ b/pcbnew/eagle_plugin.h
@@ -190,6 +190,7 @@ private:
     int         m_min_trace;        ///< smallest trace we find on Load(), in BIU.
     int         m_min_hole;         ///< smallest diameter hole we find on Load(), in BIU.
     int         m_min_via;          ///< smallest via we find on Load(), in BIU.
+    int         m_min_annulus;      ///< smallest via annulus we find on Load(), in BIU.
 
     wxString    m_lib_path;
     wxDateTime  m_mod_time;
diff --git a/pcbnew/kicad_plugin.cpp b/pcbnew/kicad_plugin.cpp
index adf9ce77c5..c6d6892a23 100644
--- a/pcbnew/kicad_plugin.cpp
+++ b/pcbnew/kicad_plugin.cpp
@@ -509,6 +509,8 @@ void PCB_IO::formatSetup( BOARD* aBoard, int aNestLevel ) const
                   FormatInternalUnits( dsnSettings.m_TrackMinWidth ).c_str() );
     m_out->Print( aNestLevel+1, "(clearance_min %s)\n",
                   FormatInternalUnits( dsnSettings.m_MinClearance ).c_str() );
+    m_out->Print( aNestLevel+1, "(via_min_annulus %s)\n",
+                  FormatInternalUnits( dsnSettings.m_ViasMinAnnulus ).c_str() );
     m_out->Print( aNestLevel+1, "(via_min_size %s)\n",
                   FormatInternalUnits( dsnSettings.m_ViasMinSize ).c_str() );
     m_out->Print( aNestLevel+1, "(through_hole_min %s)\n",
diff --git a/pcbnew/pcb_parser.cpp b/pcbnew/pcb_parser.cpp
index 22fe21b0e7..67099029d1 100644
--- a/pcbnew/pcb_parser.cpp
+++ b/pcbnew/pcb_parser.cpp
@@ -1495,6 +1495,11 @@ void PCB_PARSER::parseSetup()
             NeedRIGHT();
             break;
 
+        case T_via_min_annulus:
+            designSettings.m_ViasMinAnnulus = parseBoardUnits( T_via_min_annulus );
+            NeedRIGHT();
+            break;
+
         case T_via_min_size:
             designSettings.m_ViasMinSize = parseBoardUnits( T_via_min_size );
             NeedRIGHT();