From 37a3e55bd32e0222d5994108d9f78d8254983291 Mon Sep 17 00:00:00 2001
From: JamesJCode <13408010-JamesJCode@users.noreply.gitlab.com>
Date: Wed, 9 Oct 2024 22:43:40 +0100
Subject: [PATCH] Allow pcb rule areas to handle keepout and placement
 concurrently

- Implements component classes for placement rule areas and multichannel tool
- Implements property inspector properties for rule areas
- Fixes some zone member default initialisation issues
- Gates all multichannel-related imlpementation with existing adv config flag
- Removes rule area type enum, replaces with inference from keepout and
  placement settings
---
 pcbnew/CMakeLists.txt                         |   2 +
 pcbnew/component_class_manager.h              |   6 +
 .../dialogs/dialog_rule_area_properties.cpp   | 279 +++++--
 .../dialog_rule_area_properties_base.cpp      | 106 +--
 .../dialog_rule_area_properties_base.fbp      | 687 +++---------------
 .../dialog_rule_area_properties_base.h        |  17 +-
 ...anel_rule_area_properties_keepout_base.cpp |  51 ++
 ...anel_rule_area_properties_keepout_base.fbp | 398 ++++++++++
 .../panel_rule_area_properties_keepout_base.h |  46 ++
 ...el_rule_area_properties_placement_base.cpp |  53 ++
 ...el_rule_area_properties_placement_base.fbp | 367 ++++++++++
 ...anel_rule_area_properties_placement_base.h |  48 ++
 pcbnew/drc/drc_engine.cpp                     |   2 +-
 .../drc_interactive_courtyard_clearance.cpp   |   5 +-
 pcbnew/drc/drc_test_provider_disallow.cpp     |   9 +-
 pcbnew/edit_zone_helpers.cpp                  |   2 +-
 .../pcb_io/kicad_sexpr/pcb_io_kicad_sexpr.cpp |  37 +-
 .../kicad_sexpr/pcb_io_kicad_sexpr_parser.cpp |   2 -
 pcbnew/router/pns_kicad_iface.cpp             |   4 +-
 pcbnew/router/pns_router.cpp                  |   2 +-
 pcbnew/tools/board_editor_control.cpp         |   2 +-
 pcbnew/tools/convert_tool.cpp                 |   2 +-
 pcbnew/tools/multichannel_tool.cpp            |  19 +-
 pcbnew/tools/zone_create_helper.cpp           |   2 +-
 pcbnew/zone.cpp                               | 133 +++-
 pcbnew/zone.h                                 |  20 +-
 pcbnew/zone_filler.cpp                        |   4 +-
 pcbnew/zone_settings.cpp                      |  11 +-
 pcbnew/zone_settings.h                        |  22 +-
 pcbnew/zones.h                                |   3 +-
 pcbnew/zones_functions_for_undo_redo.cpp      |  36 +-
 31 files changed, 1518 insertions(+), 859 deletions(-)
 create mode 100644 pcbnew/dialogs/panel_rule_area_properties_keepout_base.cpp
 create mode 100644 pcbnew/dialogs/panel_rule_area_properties_keepout_base.fbp
 create mode 100644 pcbnew/dialogs/panel_rule_area_properties_keepout_base.h
 create mode 100644 pcbnew/dialogs/panel_rule_area_properties_placement_base.cpp
 create mode 100644 pcbnew/dialogs/panel_rule_area_properties_placement_base.fbp
 create mode 100644 pcbnew/dialogs/panel_rule_area_properties_placement_base.h

diff --git a/pcbnew/CMakeLists.txt b/pcbnew/CMakeLists.txt
index c1e0d18618..318f590240 100644
--- a/pcbnew/CMakeLists.txt
+++ b/pcbnew/CMakeLists.txt
@@ -174,6 +174,8 @@ set( PCBNEW_DIALOGS
     dialogs/panel_pcbnew_color_settings.cpp
     dialogs/panel_pcbnew_display_origin.cpp
     dialogs/panel_pcbnew_display_origin_base.cpp
+    dialogs/panel_rule_area_properties_keepout_base.cpp
+    dialogs/panel_rule_area_properties_placement_base.cpp
     dialogs/panel_setup_constraints.cpp
     dialogs/panel_setup_constraints_base.cpp
     dialogs/panel_setup_formatting.cpp
diff --git a/pcbnew/component_class_manager.h b/pcbnew/component_class_manager.h
index f29c695fc6..860d613580 100644
--- a/pcbnew/component_class_manager.h
+++ b/pcbnew/component_class_manager.h
@@ -113,6 +113,12 @@ public:
     // All pointers to COMPONENT_CLASS objects will being invalid
     void Reset();
 
+    /// @brief Fetches a read-only map of the fundamental component classes
+    const std::unordered_map<wxString, std::unique_ptr<COMPONENT_CLASS>>& GetClasses() const
+    {
+        return m_classes;
+    }
+
 protected:
     /// All individual component classes
     std::unordered_map<wxString, std::unique_ptr<COMPONENT_CLASS>> m_classes;
diff --git a/pcbnew/dialogs/dialog_rule_area_properties.cpp b/pcbnew/dialogs/dialog_rule_area_properties.cpp
index 8cde92a9bd..e55f53b35a 100644
--- a/pcbnew/dialogs/dialog_rule_area_properties.cpp
+++ b/pcbnew/dialogs/dialog_rule_area_properties.cpp
@@ -23,13 +23,17 @@
  * 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
  */
 
+#include <advanced_config.h>
 #include <kiface_base.h>
 #include <confirm.h>
 #include <board.h>
+#include <footprint.h>
 #include <pcb_edit_frame.h>
 #include <pcbnew_settings.h>
 #include <zone_settings.h>
 #include <dialog_rule_area_properties_base.h>
+#include <panel_rule_area_properties_keepout_base.h>
+#include <panel_rule_area_properties_placement_base.h>
 #include <widgets/unit_binder.h>
 #include <wx/statbox.h>
 #include <wx/statline.h>
@@ -45,16 +49,21 @@ class DIALOG_RULE_AREA_PROPERTIES : public DIALOG_RULE_AREA_PROPERTIES_BASE
 {
 public:
     DIALOG_RULE_AREA_PROPERTIES( PCB_BASE_FRAME* aParent, ZONE_SETTINGS* aSettings,
-                                 CONVERT_SETTINGS* aConvertSettings );
+                                 CONVERT_SETTINGS* aConvertSettings, BOARD* aBoard );
+    ~DIALOG_RULE_AREA_PROPERTIES();
 
 private:
     bool TransferDataToWindow() override;
     bool TransferDataFromWindow() override;
 
+    void PopulatePlacementSourceList( RULE_AREA_PLACEMENT_SOURCE_TYPE placementType );
+
     void OnLayerSelection( wxDataViewEvent& event ) override;
-    void OnRuleTypeSelect( wxCommandEvent& event ) override;
+    void OnSheetNameRbClicked( wxCommandEvent& event );
+    void OnComponentClassRbClicked( wxCommandEvent& event );
 
 private:
+    BOARD*            m_board;
     UNIT_BINDER       m_outlineHatchPitch;
     PCB_BASE_FRAME*   m_parent;
     ZONE_SETTINGS     m_zonesettings;    ///< the working copy of zone settings
@@ -69,34 +78,62 @@ private:
     wxStaticText*     m_gapUnits;
     UNIT_BINDER*      m_gap;
     wxCheckBox*       m_cbDeleteOriginals;
+
+    // The name of a rule area source that is not now found on the board (e.g. after a netlist
+    // update). This is used to re-populate the zone settings if the selection is not changed.
+    wxString m_notFoundPlacementSourceName;
+
+    PANEL_RULE_AREA_PROPERTIES_KEEPOUT_BASE*   m_keepoutProperties;
+    PANEL_RULE_AREA_PROPERTIES_PLACEMENT_BASE* m_placementProperties;
+    RULE_AREA_PLACEMENT_SOURCE_TYPE            m_currentKeepoutSource;
+
+    std::set<wxString> m_sheetNames;
+    std::set<wxString> m_componentClasses;
 };
 
 
-int InvokeRuleAreaEditor( PCB_BASE_FRAME* aCaller, ZONE_SETTINGS* aZoneSettings,
+int InvokeRuleAreaEditor( PCB_BASE_FRAME* aCaller, ZONE_SETTINGS* aZoneSettings, BOARD* aBoard,
                           CONVERT_SETTINGS* aConvertSettings )
 {
-    DIALOG_RULE_AREA_PROPERTIES dlg( aCaller, aZoneSettings, aConvertSettings );
+    DIALOG_RULE_AREA_PROPERTIES dlg( aCaller, aZoneSettings, aConvertSettings, aBoard );
 
     return dlg.ShowModal();
 }
 
 
-DIALOG_RULE_AREA_PROPERTIES::DIALOG_RULE_AREA_PROPERTIES( PCB_BASE_FRAME* aParent,
-                                                          ZONE_SETTINGS* aSettings,
-                                                          CONVERT_SETTINGS* aConvertSettings ) :
+DIALOG_RULE_AREA_PROPERTIES::DIALOG_RULE_AREA_PROPERTIES( PCB_BASE_FRAME*   aParent,
+                                                          ZONE_SETTINGS*    aSettings,
+                                                          CONVERT_SETTINGS* aConvertSettings,
+                                                          BOARD*            aBoard ) :
         DIALOG_RULE_AREA_PROPERTIES_BASE( aParent ),
-        m_outlineHatchPitch( aParent, m_stBorderHatchPitchText,
-                             m_outlineHatchPitchCtrl, m_outlineHatchUnits ),
-        m_convertSettings( aConvertSettings ),
-        m_rbCenterline( nullptr ),
-        m_rbBoundingHull( nullptr ),
-        m_cbDeleteOriginals( nullptr )
+        m_board( aBoard ), m_outlineHatchPitch( aParent, m_stBorderHatchPitchText,
+                                                m_outlineHatchPitchCtrl, m_outlineHatchUnits ),
+        m_convertSettings( aConvertSettings ), m_rbCenterline( nullptr ),
+        m_rbBoundingHull( nullptr ), m_cbDeleteOriginals( nullptr )
 {
     m_parent = aParent;
 
     m_ptr = aSettings;
     m_zonesettings = *aSettings;
 
+    m_keepoutProperties = new PANEL_RULE_AREA_PROPERTIES_KEEPOUT_BASE( m_areaPropertiesNb );
+    m_areaPropertiesNb->AddPage( m_keepoutProperties, _( "Keepout" ), true );
+
+    if( ADVANCED_CFG::GetCfg().m_EnableMultichannelTool )
+    {
+        m_placementProperties = new PANEL_RULE_AREA_PROPERTIES_PLACEMENT_BASE( m_areaPropertiesNb );
+        m_areaPropertiesNb->AddPage( m_placementProperties, _( "Placement" ) );
+
+        m_placementProperties->m_sourceSheetnameRb->Connect(
+                wxEVT_RADIOBUTTON,
+                wxCommandEventHandler( DIALOG_RULE_AREA_PROPERTIES::OnSheetNameRbClicked ), NULL,
+                this );
+        m_placementProperties->m_sourceComponentClassRb->Connect(
+                wxEVT_RADIOBUTTON,
+                wxCommandEventHandler( DIALOG_RULE_AREA_PROPERTIES::OnComponentClassRbClicked ),
+                NULL, this );
+    }
+
     if( aConvertSettings )
     {
         wxStaticBox*      bConvertBox = new wxStaticBox( this, wxID_ANY,
@@ -150,6 +187,89 @@ DIALOG_RULE_AREA_PROPERTIES::DIALOG_RULE_AREA_PROPERTIES( PCB_BASE_FRAME* aParen
 }
 
 
+DIALOG_RULE_AREA_PROPERTIES::~DIALOG_RULE_AREA_PROPERTIES()
+{
+    if( ADVANCED_CFG::GetCfg().m_EnableMultichannelTool )
+    {
+        m_placementProperties->m_sourceSheetnameRb->Disconnect(
+                wxEVT_RADIOBUTTON,
+                wxCommandEventHandler( DIALOG_RULE_AREA_PROPERTIES::OnSheetNameRbClicked ), NULL,
+                this );
+        m_placementProperties->m_sourceComponentClassRb->Disconnect(
+                wxEVT_RADIOBUTTON,
+                wxCommandEventHandler( DIALOG_RULE_AREA_PROPERTIES::OnComponentClassRbClicked ),
+                NULL, this );
+    }
+}
+
+
+void DIALOG_RULE_AREA_PROPERTIES::OnSheetNameRbClicked( wxCommandEvent& event )
+{
+    if( m_currentKeepoutSource == RULE_AREA_PLACEMENT_SOURCE_TYPE::SHEETNAME )
+        return;
+
+    m_zonesettings.SetRuleAreaPlacementSource( wxEmptyString );
+    m_zonesettings.SetRuleAreaPlacementSourceType( RULE_AREA_PLACEMENT_SOURCE_TYPE::SHEETNAME );
+    PopulatePlacementSourceList( RULE_AREA_PLACEMENT_SOURCE_TYPE::SHEETNAME );
+    m_currentKeepoutSource = RULE_AREA_PLACEMENT_SOURCE_TYPE::SHEETNAME;
+}
+
+
+void DIALOG_RULE_AREA_PROPERTIES::OnComponentClassRbClicked( wxCommandEvent& event )
+{
+    if( m_currentKeepoutSource == RULE_AREA_PLACEMENT_SOURCE_TYPE::COMPONENT_CLASS )
+        return;
+
+    m_zonesettings.SetRuleAreaPlacementSource( wxEmptyString );
+    m_zonesettings.SetRuleAreaPlacementSourceType(
+            RULE_AREA_PLACEMENT_SOURCE_TYPE::COMPONENT_CLASS );
+    PopulatePlacementSourceList( RULE_AREA_PLACEMENT_SOURCE_TYPE::COMPONENT_CLASS );
+    m_currentKeepoutSource = RULE_AREA_PLACEMENT_SOURCE_TYPE::COMPONENT_CLASS;
+}
+
+
+void DIALOG_RULE_AREA_PROPERTIES::PopulatePlacementSourceList(
+        RULE_AREA_PLACEMENT_SOURCE_TYPE placementType )
+{
+    m_placementProperties->m_sourceObjectNameCb->Clear();
+
+    std::set<wxString>* sourceStrings;
+
+    switch( placementType )
+    {
+    case RULE_AREA_PLACEMENT_SOURCE_TYPE::SHEETNAME:
+        sourceStrings = &m_sheetNames;
+        break;
+    case RULE_AREA_PLACEMENT_SOURCE_TYPE::COMPONENT_CLASS:
+        sourceStrings = &m_componentClasses;
+        break;
+    }
+
+    int             curSourceIdx = -1;
+    const wxString& curSourceName = m_zonesettings.GetRuleAreaPlacementSource();
+
+    for( const wxString& sourceName : *sourceStrings )
+    {
+        if( curSourceName == sourceName )
+            curSourceIdx = m_placementProperties->m_sourceObjectNameCb->GetCount();
+
+        m_placementProperties->m_sourceObjectNameCb->Append( sourceName );
+    }
+
+    if( curSourceIdx != -1 )
+    {
+        m_placementProperties->m_sourceObjectNameCb->Select( curSourceIdx );
+    }
+    else if( curSourceName != wxEmptyString )
+    {
+        m_notFoundPlacementSourceName = curSourceName;
+        wxString notFoundDisplayName = _( "Not found on board: " ) + curSourceName;
+        m_placementProperties->m_sourceObjectNameCb->Insert( notFoundDisplayName, 0 );
+        m_placementProperties->m_sourceObjectNameCb->Select( 0 );
+    }
+}
+
+
 bool DIALOG_RULE_AREA_PROPERTIES::TransferDataToWindow()
 {
     if( m_convertSettings )
@@ -163,26 +283,56 @@ bool DIALOG_RULE_AREA_PROPERTIES::TransferDataToWindow()
     }
 
     // Init keepout parameters:
-    m_cbTracksCtrl->SetValue( m_zonesettings.GetDoNotAllowTracks() );
-    m_cbViasCtrl->SetValue( m_zonesettings.GetDoNotAllowVias() );
-    m_cbPadsCtrl->SetValue( m_zonesettings.GetDoNotAllowPads() );
-    m_cbFootprintsCtrl->SetValue( m_zonesettings.GetDoNotAllowFootprints() );
-    m_cbCopperPourCtrl->SetValue( m_zonesettings.GetDoNotAllowCopperPour() );
+    m_keepoutProperties->m_cbTracksCtrl->SetValue( m_zonesettings.GetDoNotAllowTracks() );
+    m_keepoutProperties->m_cbViasCtrl->SetValue( m_zonesettings.GetDoNotAllowVias() );
+    m_keepoutProperties->m_cbPadsCtrl->SetValue( m_zonesettings.GetDoNotAllowPads() );
+    m_keepoutProperties->m_cbFootprintsCtrl->SetValue( m_zonesettings.GetDoNotAllowFootprints() );
+    m_keepoutProperties->m_cbCopperPourCtrl->SetValue( m_zonesettings.GetDoNotAllowCopperPour() );
 
     // Init placement parameters:
-    m_ruleText->SetText( m_zonesettings.GetRuleAreaPlacementSource() );
+    if( ADVANCED_CFG::GetCfg().m_EnableMultichannelTool )
+    {
+        m_placementProperties->m_enabled->SetValue( m_zonesettings.GetRuleAreaPlacementEnabled() );
 
-    if( m_zonesettings.GetRuleAreaType() == RULE_AREA_TYPE::KEEPOUT )
-    {
-        m_rbRuleType->Select( 0 );
-        m_placementRuleSizer->Show( false );
-        m_keepoutRuleSizer->Show( true );
-    }
-    else
-    {
-        m_rbRuleType->Select( 1 );
-        m_placementRuleSizer->Show( true );
-        m_keepoutRuleSizer->Show( false );
+        // Load schematic sheet and component class lists
+        if( m_board )
+        {
+            // Fetch component classes
+            const std::unordered_map<wxString, std::unique_ptr<COMPONENT_CLASS>>& classes =
+                    m_board->GetComponentClassManager().GetClasses();
+
+            for( const auto& [k, v] : classes )
+                m_componentClasses.insert( k );
+
+            // Fetch sheet names
+            for( FOOTPRINT* fp : m_board->Footprints() )
+                m_sheetNames.insert( fp->GetSheetname() );
+            
+            if( m_zonesettings.GetRuleAreaPlacementSourceType()
+                == RULE_AREA_PLACEMENT_SOURCE_TYPE::SHEETNAME )
+            {
+                m_placementProperties->m_sourceComponentClassRb->SetValue( false );
+                m_placementProperties->m_sourceSheetnameRb->SetValue( true );
+                PopulatePlacementSourceList( RULE_AREA_PLACEMENT_SOURCE_TYPE::SHEETNAME );
+                m_currentKeepoutSource = RULE_AREA_PLACEMENT_SOURCE_TYPE::SHEETNAME;
+            }
+            else
+            {
+                m_placementProperties->m_sourceSheetnameRb->SetValue( false );
+                m_placementProperties->m_sourceComponentClassRb->SetValue( true );
+                PopulatePlacementSourceList( RULE_AREA_PLACEMENT_SOURCE_TYPE::COMPONENT_CLASS );
+                m_currentKeepoutSource = RULE_AREA_PLACEMENT_SOURCE_TYPE::COMPONENT_CLASS;
+            }
+        }
+
+        // Handle most-useful notebook page selection
+        m_areaPropertiesNb->SetSelection( 0 );
+
+        if( !m_zonesettings.HasKeepoutParametersSet()
+            && m_zonesettings.GetRuleAreaPlacementEnabled() )
+        {
+            m_areaPropertiesNb->SetSelection( 1 );
+        }
     }
 
     m_cbLocked->SetValue( m_zonesettings.m_Locked );
@@ -205,25 +355,6 @@ bool DIALOG_RULE_AREA_PROPERTIES::TransferDataToWindow()
 }
 
 
-void DIALOG_RULE_AREA_PROPERTIES::OnRuleTypeSelect( wxCommandEvent& event )
-{
-    if( m_rbRuleType->GetSelection() == 0 )
-    {
-        m_zonesettings.SetRuleAreaType( RULE_AREA_TYPE::KEEPOUT );
-        m_placementRuleSizer->Show( false );
-        m_keepoutRuleSizer->Show( true );
-        Layout();
-    }
-    else
-    {
-        m_zonesettings.SetRuleAreaType( RULE_AREA_TYPE::PLACEMENT );
-        m_placementRuleSizer->Show( true );
-        m_keepoutRuleSizer->Show( false );
-        Layout();
-    }
-}
-
-
 void DIALOG_RULE_AREA_PROPERTIES::OnLayerSelection( wxDataViewEvent& event )
 {
     if( event.GetColumn() != 0 )
@@ -269,15 +400,49 @@ bool DIALOG_RULE_AREA_PROPERTIES::TransferDataFromWindow()
     }
 
     // Init keepout parameters:
-    m_zonesettings.SetRuleAreaType( m_rbRuleType->GetSelection() == 0 ? RULE_AREA_TYPE::KEEPOUT : RULE_AREA_TYPE::PLACEMENT );
-    m_zonesettings.SetRuleAreaPlacementSourceType( RULE_AREA_PLACEMENT_SOURCE_TYPE::SHEETNAME );
-    m_zonesettings.SetRuleAreaPlacementSource( m_ruleText->GetText() );
     m_zonesettings.SetIsRuleArea( true );
-    m_zonesettings.SetDoNotAllowTracks( m_cbTracksCtrl->GetValue() );
-    m_zonesettings.SetDoNotAllowVias( m_cbViasCtrl->GetValue() );
-    m_zonesettings.SetDoNotAllowCopperPour( m_cbCopperPourCtrl->GetValue() );
-    m_zonesettings.SetDoNotAllowPads( m_cbPadsCtrl->GetValue() );
-    m_zonesettings.SetDoNotAllowFootprints( m_cbFootprintsCtrl->GetValue() );
+    m_zonesettings.SetDoNotAllowTracks( m_keepoutProperties->m_cbTracksCtrl->GetValue() );
+    m_zonesettings.SetDoNotAllowVias( m_keepoutProperties->m_cbViasCtrl->GetValue() );
+    m_zonesettings.SetDoNotAllowCopperPour( m_keepoutProperties->m_cbCopperPourCtrl->GetValue() );
+    m_zonesettings.SetDoNotAllowPads( m_keepoutProperties->m_cbPadsCtrl->GetValue() );
+    m_zonesettings.SetDoNotAllowFootprints( m_keepoutProperties->m_cbFootprintsCtrl->GetValue() );
+
+    // Init placement parameters
+    if( ADVANCED_CFG::GetCfg().m_EnableMultichannelTool )
+    {
+        m_zonesettings.SetRuleAreaPlacementEnabled( m_placementProperties->m_enabled->GetValue() );
+
+        if( m_placementProperties->m_sourceSheetnameRb->GetValue() )
+        {
+            m_zonesettings.SetRuleAreaPlacementSourceType(
+                    RULE_AREA_PLACEMENT_SOURCE_TYPE::SHEETNAME );
+        }
+        else
+        {
+            m_zonesettings.SetRuleAreaPlacementSourceType(
+                    RULE_AREA_PLACEMENT_SOURCE_TYPE::COMPONENT_CLASS );
+        }
+
+        int selectedSourceIdx = m_placementProperties->m_sourceObjectNameCb->GetSelection();
+
+        if( selectedSourceIdx != wxNOT_FOUND )
+        {
+            if( selectedSourceIdx == 0 && m_notFoundPlacementSourceName != wxEmptyString )
+            {
+                m_zonesettings.SetRuleAreaPlacementSource( m_notFoundPlacementSourceName );
+            }
+            else
+            {
+                m_zonesettings.SetRuleAreaPlacementSource(
+                        m_placementProperties->m_sourceObjectNameCb->GetString(
+                                selectedSourceIdx ) );
+            }
+        }
+        else
+        {
+            m_zonesettings.SetRuleAreaPlacementSource( wxEmptyString );
+        }
+    }
 
     if( m_zonesettings.m_Layers.count() == 0 )
     {
diff --git a/pcbnew/dialogs/dialog_rule_area_properties_base.cpp b/pcbnew/dialogs/dialog_rule_area_properties_base.cpp
index 11f4fc26ef..e0c6e87f2a 100644
--- a/pcbnew/dialogs/dialog_rule_area_properties_base.cpp
+++ b/pcbnew/dialogs/dialog_rule_area_properties_base.cpp
@@ -13,7 +13,6 @@ DIALOG_RULE_AREA_PROPERTIES_BASE::DIALOG_RULE_AREA_PROPERTIES_BASE( wxWindow* pa
 {
 	this->SetSizeHints( wxSize( -1,-1 ), wxDefaultSize );
 
-	wxBoxSizer* bMainSizer;
 	bMainSizer = new wxBoxSizer( wxVERTICAL );
 
 	wxBoxSizer* bUpperSizer;
@@ -62,103 +61,13 @@ DIALOG_RULE_AREA_PROPERTIES_BASE::DIALOG_RULE_AREA_PROPERTIES_BASE( wxWindow* pa
 
 	bSizerRight->Add( bSizer6, 0, wxBOTTOM|wxEXPAND, 5 );
 
-	wxFlexGridSizer* fgSizer2;
-	fgSizer2 = new wxFlexGridSizer( 0, 1, 3, 0 );
-	fgSizer2->SetFlexibleDirection( wxBOTH );
-	fgSizer2->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
+	m_staticText7 = new wxStaticText( this, wxID_ANY, _("Area properties:"), wxDefaultPosition, wxDefaultSize, 0 );
+	m_staticText7->Wrap( -1 );
+	bSizerRight->Add( m_staticText7, 0, wxALL, 5 );
 
-	wxString m_rbRuleTypeChoices[] = { _("Keepout"), _("Placement") };
-	int m_rbRuleTypeNChoices = sizeof( m_rbRuleTypeChoices ) / sizeof( wxString );
-	m_rbRuleType = new wxRadioBox( this, wxID_ANY, _("Rule type"), wxDefaultPosition, wxDefaultSize, m_rbRuleTypeNChoices, m_rbRuleTypeChoices, 2, wxRA_SPECIFY_COLS );
-	m_rbRuleType->SetSelection( 0 );
-	fgSizer2->Add( m_rbRuleType, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
+	m_areaPropertiesNb = new wxNotebook( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 );
 
-	m_keepoutRuleSizer = new wxFlexGridSizer( 0, 1, 3, 0 );
-	m_keepoutRuleSizer->SetFlexibleDirection( wxBOTH );
-	m_keepoutRuleSizer->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
-
-	m_cbTracksCtrl = new wxCheckBox( this, wxID_ANY, _("Keep out tracks"), wxDefaultPosition, wxDefaultSize, 0 );
-	m_cbTracksCtrl->SetToolTip( _("Prevent tracks from routing into this area") );
-
-	m_keepoutRuleSizer->Add( m_cbTracksCtrl, 0, wxEXPAND|wxRIGHT|wxLEFT, 5 );
-
-	m_cbViasCtrl = new wxCheckBox( this, wxID_ANY, _("Keep out vias"), wxDefaultPosition, wxDefaultSize, 0 );
-	m_cbViasCtrl->SetToolTip( _("Prevent vias from being placed in this area") );
-
-	m_keepoutRuleSizer->Add( m_cbViasCtrl, 0, wxEXPAND|wxRIGHT|wxLEFT, 5 );
-
-	m_cbPadsCtrl = new wxCheckBox( this, wxID_ANY, _("Keep out pads"), wxDefaultPosition, wxDefaultSize, 0 );
-	m_cbPadsCtrl->SetToolTip( _("Raise a DRC error if a pad overlaps this area") );
-
-	m_keepoutRuleSizer->Add( m_cbPadsCtrl, 0, wxRIGHT|wxLEFT, 5 );
-
-	m_cbCopperPourCtrl = new wxCheckBox( this, wxID_ANY, _("Keep out zone fills"), wxDefaultPosition, wxDefaultSize, 0 );
-	m_cbCopperPourCtrl->SetToolTip( _("Zones will not fill copper into this area") );
-
-	m_keepoutRuleSizer->Add( m_cbCopperPourCtrl, 0, wxEXPAND|wxRIGHT|wxLEFT, 5 );
-
-	m_cbFootprintsCtrl = new wxCheckBox( this, wxID_ANY, _("Keep out footprints"), wxDefaultPosition, wxDefaultSize, 0 );
-	m_cbFootprintsCtrl->SetToolTip( _("Raise a DRC error if a footprint courtyard overlaps this area") );
-
-	m_keepoutRuleSizer->Add( m_cbFootprintsCtrl, 0, wxRIGHT|wxLEFT, 5 );
-
-
-	fgSizer2->Add( m_keepoutRuleSizer, 1, wxEXPAND, 5 );
-
-
-	bSizerRight->Add( fgSizer2, 0, wxEXPAND, 5 );
-
-	m_placementRuleSizer = new wxFlexGridSizer( 0, 1, 3, 0 );
-	m_placementRuleSizer->AddGrowableCol( 0 );
-	m_placementRuleSizer->SetFlexibleDirection( wxBOTH );
-	m_placementRuleSizer->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
-
-	m_staticText31 = new wxStaticText( this, wxID_ANY, _("Schematic Sheetname:"), wxDefaultPosition, wxDefaultSize, 0 );
-	m_staticText31->Wrap( -1 );
-	m_staticText31->SetToolTip( _("A unique name for this rule area for use in DRC rules") );
-
-	m_placementRuleSizer->Add( m_staticText31, 0, wxALL|wxEXPAND, 5 );
-
-	m_ruleText = new wxStyledTextCtrl( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0, wxEmptyString );
-	m_ruleText->SetUseTabs( true );
-	m_ruleText->SetTabWidth( 4 );
-	m_ruleText->SetIndent( 4 );
-	m_ruleText->SetTabIndents( true );
-	m_ruleText->SetBackSpaceUnIndents( true );
-	m_ruleText->SetViewEOL( false );
-	m_ruleText->SetViewWhiteSpace( false );
-	m_ruleText->SetMarginWidth( 2, 0 );
-	m_ruleText->SetIndentationGuides( true );
-	m_ruleText->SetReadOnly( false );
-	m_ruleText->SetMarginType( 1, wxSTC_MARGIN_SYMBOL );
-	m_ruleText->SetMarginMask( 1, wxSTC_MASK_FOLDERS );
-	m_ruleText->SetMarginWidth( 1, 16);
-	m_ruleText->SetMarginSensitive( 1, true );
-	m_ruleText->SetProperty( wxT("fold"), wxT("1") );
-	m_ruleText->SetFoldFlags( wxSTC_FOLDFLAG_LINEBEFORE_CONTRACTED | wxSTC_FOLDFLAG_LINEAFTER_CONTRACTED );
-	m_ruleText->SetMarginType( 0, wxSTC_MARGIN_NUMBER );
-	m_ruleText->SetMarginWidth( 0, m_ruleText->TextWidth( wxSTC_STYLE_LINENUMBER, wxT("_99999") ) );
-	m_ruleText->MarkerDefine( wxSTC_MARKNUM_FOLDER, wxSTC_MARK_BOXPLUS );
-	m_ruleText->MarkerSetBackground( wxSTC_MARKNUM_FOLDER, wxColour( wxT("BLACK") ) );
-	m_ruleText->MarkerSetForeground( wxSTC_MARKNUM_FOLDER, wxColour( wxT("WHITE") ) );
-	m_ruleText->MarkerDefine( wxSTC_MARKNUM_FOLDEROPEN, wxSTC_MARK_BOXMINUS );
-	m_ruleText->MarkerSetBackground( wxSTC_MARKNUM_FOLDEROPEN, wxColour( wxT("BLACK") ) );
-	m_ruleText->MarkerSetForeground( wxSTC_MARKNUM_FOLDEROPEN, wxColour( wxT("WHITE") ) );
-	m_ruleText->MarkerDefine( wxSTC_MARKNUM_FOLDERSUB, wxSTC_MARK_EMPTY );
-	m_ruleText->MarkerDefine( wxSTC_MARKNUM_FOLDEREND, wxSTC_MARK_BOXPLUS );
-	m_ruleText->MarkerSetBackground( wxSTC_MARKNUM_FOLDEREND, wxColour( wxT("BLACK") ) );
-	m_ruleText->MarkerSetForeground( wxSTC_MARKNUM_FOLDEREND, wxColour( wxT("WHITE") ) );
-	m_ruleText->MarkerDefine( wxSTC_MARKNUM_FOLDEROPENMID, wxSTC_MARK_BOXMINUS );
-	m_ruleText->MarkerSetBackground( wxSTC_MARKNUM_FOLDEROPENMID, wxColour( wxT("BLACK") ) );
-	m_ruleText->MarkerSetForeground( wxSTC_MARKNUM_FOLDEROPENMID, wxColour( wxT("WHITE") ) );
-	m_ruleText->MarkerDefine( wxSTC_MARKNUM_FOLDERMIDTAIL, wxSTC_MARK_EMPTY );
-	m_ruleText->MarkerDefine( wxSTC_MARKNUM_FOLDERTAIL, wxSTC_MARK_EMPTY );
-	m_ruleText->SetSelBackground( true, wxSystemSettings::GetColour( wxSYS_COLOUR_HIGHLIGHT ) );
-	m_ruleText->SetSelForeground( true, wxSystemSettings::GetColour( wxSYS_COLOUR_HIGHLIGHTTEXT ) );
-	m_placementRuleSizer->Add( m_ruleText, 0, wxALL|wxEXPAND, 5 );
-
-
-	bSizerRight->Add( m_placementRuleSizer, 0, wxEXPAND, 5 );
+	bSizerRight->Add( m_areaPropertiesNb, 1, wxEXPAND | wxALL, 5 );
 
 	wxGridBagSizer* gbSizer1;
 	gbSizer1 = new wxGridBagSizer( 3, 3 );
@@ -193,6 +102,9 @@ DIALOG_RULE_AREA_PROPERTIES_BASE::DIALOG_RULE_AREA_PROPERTIES_BASE( wxWindow* pa
 	bSizerRight->Add( gbSizer1, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
 
 
+	bSizerRight->Add( 0, 0, 1, wxEXPAND, 5 );
+
+
 	bUpperSizer->Add( bSizerRight, 1, wxEXPAND|wxALL, 5 );
 
 
@@ -217,7 +129,6 @@ DIALOG_RULE_AREA_PROPERTIES_BASE::DIALOG_RULE_AREA_PROPERTIES_BASE( wxWindow* pa
 	m_layers->Connect( wxEVT_COMMAND_DATAVIEW_ITEM_VALUE_CHANGED, wxDataViewEventHandler( DIALOG_RULE_AREA_PROPERTIES_BASE::OnLayerSelection ), NULL, this );
 	m_layers->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( DIALOG_RULE_AREA_PROPERTIES_BASE::onLayerListRightDown ), NULL, this );
 	m_layers->Connect( wxEVT_SIZE, wxSizeEventHandler( DIALOG_RULE_AREA_PROPERTIES_BASE::OnSizeLayersList ), NULL, this );
-	m_rbRuleType->Connect( wxEVT_COMMAND_RADIOBOX_SELECTED, wxCommandEventHandler( DIALOG_RULE_AREA_PROPERTIES_BASE::OnRuleTypeSelect ), NULL, this );
 }
 
 DIALOG_RULE_AREA_PROPERTIES_BASE::~DIALOG_RULE_AREA_PROPERTIES_BASE()
@@ -226,6 +137,5 @@ DIALOG_RULE_AREA_PROPERTIES_BASE::~DIALOG_RULE_AREA_PROPERTIES_BASE()
 	m_layers->Disconnect( wxEVT_COMMAND_DATAVIEW_ITEM_VALUE_CHANGED, wxDataViewEventHandler( DIALOG_RULE_AREA_PROPERTIES_BASE::OnLayerSelection ), NULL, this );
 	m_layers->Disconnect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( DIALOG_RULE_AREA_PROPERTIES_BASE::onLayerListRightDown ), NULL, this );
 	m_layers->Disconnect( wxEVT_SIZE, wxSizeEventHandler( DIALOG_RULE_AREA_PROPERTIES_BASE::OnSizeLayersList ), NULL, this );
-	m_rbRuleType->Disconnect( wxEVT_COMMAND_RADIOBOX_SELECTED, wxCommandEventHandler( DIALOG_RULE_AREA_PROPERTIES_BASE::OnRuleTypeSelect ), NULL, this );
 
 }
diff --git a/pcbnew/dialogs/dialog_rule_area_properties_base.fbp b/pcbnew/dialogs/dialog_rule_area_properties_base.fbp
index c6f2249d62..059d6e78d3 100644
--- a/pcbnew/dialogs/dialog_rule_area_properties_base.fbp
+++ b/pcbnew/dialogs/dialog_rule_area_properties_base.fbp
@@ -63,7 +63,7 @@
         <property name="minimum_size"></property>
         <property name="name">bMainSizer</property>
         <property name="orient">wxVERTICAL</property>
-        <property name="permission">none</property>
+        <property name="permission">private</property>
         <object class="sizeritem" expanded="true">
           <property name="border">5</property>
           <property name="flag">wxEXPAND|wxLEFT|wxRIGHT|wxTOP</property>
@@ -411,579 +411,124 @@
                 </object>
                 <object class="sizeritem" expanded="true">
                   <property name="border">5</property>
-                  <property name="flag">wxEXPAND</property>
+                  <property name="flag">wxALL</property>
                   <property name="proportion">0</property>
-                  <object class="wxFlexGridSizer" expanded="true">
-                    <property name="cols">1</property>
-                    <property name="flexible_direction">wxBOTH</property>
-                    <property name="growablecols"></property>
-                    <property name="growablerows"></property>
-                    <property name="hgap">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">Area properties:</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="name">fgSizer2</property>
-                    <property name="non_flexible_grow_mode">wxFLEX_GROWMODE_SPECIFIED</property>
-                    <property name="permission">none</property>
-                    <property name="rows">0</property>
-                    <property name="vgap">3</property>
-                    <object class="sizeritem" expanded="true">
-                      <property name="border">5</property>
-                      <property name="flag">wxALL|wxALIGN_CENTER_VERTICAL|wxEXPAND</property>
-                      <property name="proportion">0</property>
-                      <object class="wxRadioBox" 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="choices">&quot;Keepout&quot; &quot;Placement&quot;</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">Rule type</property>
-                        <property name="majorDimension">2</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_rbRuleType</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="selection">0</property>
-                        <property name="show">1</property>
-                        <property name="size"></property>
-                        <property name="style">wxRA_SPECIFY_COLS</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>
-                        <event name="OnRadioBox">OnRuleTypeSelect</event>
-                      </object>
-                    </object>
-                    <object class="sizeritem" expanded="true">
-                      <property name="border">5</property>
-                      <property name="flag">wxEXPAND</property>
-                      <property name="proportion">1</property>
-                      <object class="wxFlexGridSizer" expanded="true">
-                        <property name="cols">1</property>
-                        <property name="flexible_direction">wxBOTH</property>
-                        <property name="growablecols"></property>
-                        <property name="growablerows"></property>
-                        <property name="hgap">0</property>
-                        <property name="minimum_size"></property>
-                        <property name="name">m_keepoutRuleSizer</property>
-                        <property name="non_flexible_grow_mode">wxFLEX_GROWMODE_SPECIFIED</property>
-                        <property name="permission">protected</property>
-                        <property name="rows">0</property>
-                        <property name="vgap">3</property>
-                        <object class="sizeritem" expanded="true">
-                          <property name="border">5</property>
-                          <property name="flag">wxEXPAND|wxRIGHT|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 out tracks</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_cbTracksCtrl</property>
-                            <property name="pane_border">1</property>
-                            <property name="pane_position"></property>
-                            <property name="pane_size"></property>
-                            <property name="permission">protected</property>
-                            <property name="pin_button">1</property>
-                            <property name="pos"></property>
-                            <property name="resize">Resizable</property>
-                            <property name="show">1</property>
-                            <property name="size"></property>
-                            <property name="style"></property>
-                            <property name="subclass"></property>
-                            <property name="toolbar_pane">0</property>
-                            <property name="tooltip">Prevent tracks from routing into this area</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|wxRIGHT|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 out vias</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_cbViasCtrl</property>
-                            <property name="pane_border">1</property>
-                            <property name="pane_position"></property>
-                            <property name="pane_size"></property>
-                            <property name="permission">protected</property>
-                            <property name="pin_button">1</property>
-                            <property name="pos"></property>
-                            <property name="resize">Resizable</property>
-                            <property name="show">1</property>
-                            <property name="size"></property>
-                            <property name="style"></property>
-                            <property name="subclass"></property>
-                            <property name="toolbar_pane">0</property>
-                            <property name="tooltip">Prevent vias from being placed in this area</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">wxRIGHT|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 out pads</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_cbPadsCtrl</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">Raise a DRC error if a pad overlaps this area</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|wxRIGHT|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 out zone fills</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_cbCopperPourCtrl</property>
-                            <property name="pane_border">1</property>
-                            <property name="pane_position"></property>
-                            <property name="pane_size"></property>
-                            <property name="permission">protected</property>
-                            <property name="pin_button">1</property>
-                            <property name="pos"></property>
-                            <property name="resize">Resizable</property>
-                            <property name="show">1</property>
-                            <property name="size"></property>
-                            <property name="style"></property>
-                            <property name="subclass"></property>
-                            <property name="toolbar_pane">0</property>
-                            <property name="tooltip">Zones will not fill copper into this area</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">wxRIGHT|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 out footprints</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_cbFootprintsCtrl</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">Raise a DRC error if a footprint courtyard overlaps this area</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>
-                    </object>
+                    <property name="moveable">1</property>
+                    <property name="name">m_staticText7</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</property>
-                  <property name="proportion">0</property>
-                  <object class="wxFlexGridSizer" expanded="true">
-                    <property name="cols">1</property>
-                    <property name="flexible_direction">wxBOTH</property>
-                    <property name="growablecols">0</property>
-                    <property name="growablerows"></property>
-                    <property name="hgap">0</property>
+                  <property name="flag">wxEXPAND | wxALL</property>
+                  <property name="proportion">1</property>
+                  <object class="wxNotebook" 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="bitmapsize"></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="name">m_placementRuleSizer</property>
-                    <property name="non_flexible_grow_mode">wxFLEX_GROWMODE_SPECIFIED</property>
+                    <property name="moveable">1</property>
+                    <property name="name">m_areaPropertiesNb</property>
+                    <property name="pane_border">1</property>
+                    <property name="pane_position"></property>
+                    <property name="pane_size"></property>
                     <property name="permission">protected</property>
-                    <property name="rows">0</property>
-                    <property name="vgap">3</property>
-                    <object class="sizeritem" expanded="true">
-                      <property name="border">5</property>
-                      <property name="flag">wxALL|wxEXPAND</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">Schematic Sheetname:</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_staticText31</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">A unique name for this rule area for use in DRC rules</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">wxALL|wxEXPAND</property>
-                      <property name="proportion">0</property>
-                      <object class="wxStyledTextCtrl" 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="backspace_unindents">1</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="folding">1</property>
-                        <property name="font"></property>
-                        <property name="gripper">0</property>
-                        <property name="hidden">0</property>
-                        <property name="id">wxID_ANY</property>
-                        <property name="indentation_guides">1</property>
-                        <property name="line_numbers">1</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_ruleText</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="read_only">0</property>
-                        <property name="resize">Resizable</property>
-                        <property name="show">1</property>
-                        <property name="size"></property>
-                        <property name="subclass">; ; forward_declare</property>
-                        <property name="tab_indents">1</property>
-                        <property name="tab_width">4</property>
-                        <property name="toolbar_pane">0</property>
-                        <property name="tooltip"></property>
-                        <property name="use_tabs">1</property>
-                        <property name="view_eol">0</property>
-                        <property name="view_whitespace">0</property>
-                        <property name="window_extra_style"></property>
-                        <property name="window_name"></property>
-                        <property name="window_style"></property>
-                      </object>
-                    </object>
+                    <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>
                   </object>
                 </object>
                 <object class="sizeritem" expanded="true">
@@ -1334,6 +879,16 @@
                     </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="spacer" expanded="true">
+                    <property name="height">0</property>
+                    <property name="permission">protected</property>
+                    <property name="width">0</property>
+                  </object>
+                </object>
               </object>
             </object>
           </object>
diff --git a/pcbnew/dialogs/dialog_rule_area_properties_base.h b/pcbnew/dialogs/dialog_rule_area_properties_base.h
index c61c301483..6bbe5d2300 100644
--- a/pcbnew/dialogs/dialog_rule_area_properties_base.h
+++ b/pcbnew/dialogs/dialog_rule_area_properties_base.h
@@ -21,8 +21,7 @@
 #include <wx/sizer.h>
 #include <wx/textctrl.h>
 #include <wx/checkbox.h>
-#include <wx/radiobox.h>
-#include <wx/stc/stc.h>
+#include <wx/notebook.h>
 #include <wx/choice.h>
 #include <wx/gbsizer.h>
 #include <wx/button.h>
@@ -36,6 +35,7 @@
 class DIALOG_RULE_AREA_PROPERTIES_BASE : public DIALOG_SHIM
 {
 	private:
+		wxBoxSizer* bMainSizer;
 
 	protected:
 		wxStaticText* m_staticTextLayerSelection;
@@ -43,16 +43,8 @@ class DIALOG_RULE_AREA_PROPERTIES_BASE : public DIALOG_SHIM
 		wxStaticText* m_staticText3;
 		wxTextCtrl* m_tcName;
 		wxCheckBox* m_cbLocked;
-		wxRadioBox* m_rbRuleType;
-		wxFlexGridSizer* m_keepoutRuleSizer;
-		wxCheckBox* m_cbTracksCtrl;
-		wxCheckBox* m_cbViasCtrl;
-		wxCheckBox* m_cbPadsCtrl;
-		wxCheckBox* m_cbCopperPourCtrl;
-		wxCheckBox* m_cbFootprintsCtrl;
-		wxFlexGridSizer* m_placementRuleSizer;
-		wxStaticText* m_staticText31;
-		wxStyledTextCtrl* m_ruleText;
+		wxStaticText* m_staticText7;
+		wxNotebook* m_areaPropertiesNb;
 		wxStaticText* m_staticTextStyle;
 		wxChoice* m_OutlineDisplayCtrl;
 		wxStaticText* m_stBorderHatchPitchText;
@@ -66,7 +58,6 @@ class DIALOG_RULE_AREA_PROPERTIES_BASE : public DIALOG_SHIM
 		virtual void OnLayerSelection( wxDataViewEvent& event ) { event.Skip(); }
 		virtual void onLayerListRightDown( wxMouseEvent& event ) { event.Skip(); }
 		virtual void OnSizeLayersList( wxSizeEvent& event ) { event.Skip(); }
-		virtual void OnRuleTypeSelect( wxCommandEvent& event ) { event.Skip(); }
 
 
 	public:
diff --git a/pcbnew/dialogs/panel_rule_area_properties_keepout_base.cpp b/pcbnew/dialogs/panel_rule_area_properties_keepout_base.cpp
new file mode 100644
index 0000000000..6d2c40fbfe
--- /dev/null
+++ b/pcbnew/dialogs/panel_rule_area_properties_keepout_base.cpp
@@ -0,0 +1,51 @@
+///////////////////////////////////////////////////////////////////////////
+// C++ code generated with wxFormBuilder (version 4.2.1-0-g80c4cb6)
+// http://www.wxformbuilder.org/
+//
+// PLEASE DO *NOT* EDIT THIS FILE!
+///////////////////////////////////////////////////////////////////////////
+
+#include "panel_rule_area_properties_keepout_base.h"
+
+///////////////////////////////////////////////////////////////////////////
+
+PANEL_RULE_AREA_PROPERTIES_KEEPOUT_BASE::PANEL_RULE_AREA_PROPERTIES_KEEPOUT_BASE( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style, const wxString& name ) : wxPanel( parent, id, pos, size, style, name )
+{
+	m_keepoutRuleSizer = new wxFlexGridSizer( 0, 1, 3, 0 );
+	m_keepoutRuleSizer->SetFlexibleDirection( wxBOTH );
+	m_keepoutRuleSizer->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
+
+	m_cbTracksCtrl = new wxCheckBox( this, wxID_ANY, _("Keep out tracks"), wxDefaultPosition, wxDefaultSize, 0 );
+	m_cbTracksCtrl->SetToolTip( _("Prevent tracks from routing into this area") );
+
+	m_keepoutRuleSizer->Add( m_cbTracksCtrl, 0, wxEXPAND|wxRIGHT|wxLEFT, 5 );
+
+	m_cbViasCtrl = new wxCheckBox( this, wxID_ANY, _("Keep out vias"), wxDefaultPosition, wxDefaultSize, 0 );
+	m_cbViasCtrl->SetToolTip( _("Prevent vias from being placed in this area") );
+
+	m_keepoutRuleSizer->Add( m_cbViasCtrl, 0, wxEXPAND|wxRIGHT|wxLEFT, 5 );
+
+	m_cbPadsCtrl = new wxCheckBox( this, wxID_ANY, _("Keep out pads"), wxDefaultPosition, wxDefaultSize, 0 );
+	m_cbPadsCtrl->SetToolTip( _("Raise a DRC error if a pad overlaps this area") );
+
+	m_keepoutRuleSizer->Add( m_cbPadsCtrl, 0, wxRIGHT|wxLEFT, 5 );
+
+	m_cbCopperPourCtrl = new wxCheckBox( this, wxID_ANY, _("Keep out zone fills"), wxDefaultPosition, wxDefaultSize, 0 );
+	m_cbCopperPourCtrl->SetToolTip( _("Zones will not fill copper into this area") );
+
+	m_keepoutRuleSizer->Add( m_cbCopperPourCtrl, 0, wxEXPAND|wxRIGHT|wxLEFT, 5 );
+
+	m_cbFootprintsCtrl = new wxCheckBox( this, wxID_ANY, _("Keep out footprints"), wxDefaultPosition, wxDefaultSize, 0 );
+	m_cbFootprintsCtrl->SetToolTip( _("Raise a DRC error if a footprint courtyard overlaps this area") );
+
+	m_keepoutRuleSizer->Add( m_cbFootprintsCtrl, 0, wxRIGHT|wxLEFT, 5 );
+
+
+	this->SetSizer( m_keepoutRuleSizer );
+	this->Layout();
+	m_keepoutRuleSizer->Fit( this );
+}
+
+PANEL_RULE_AREA_PROPERTIES_KEEPOUT_BASE::~PANEL_RULE_AREA_PROPERTIES_KEEPOUT_BASE()
+{
+}
diff --git a/pcbnew/dialogs/panel_rule_area_properties_keepout_base.fbp b/pcbnew/dialogs/panel_rule_area_properties_keepout_base.fbp
new file mode 100644
index 0000000000..37f03314cd
--- /dev/null
+++ b/pcbnew/dialogs/panel_rule_area_properties_keepout_base.fbp
@@ -0,0 +1,398 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<wxFormBuilder_Project>
+  <FileVersion major="1" minor="18"/>
+  <object class="Project" expanded="true">
+    <property name="code_generation">C++</property>
+    <property name="cpp_class_decoration">; </property>
+    <property name="cpp_disconnect_events">0</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">1</property>
+    <property name="embedded_files_path">res</property>
+    <property name="encoding">UTF-8</property>
+    <property name="file">panel_rule_area_properties_keepout_base</property>
+    <property name="first_id">6000</property>
+    <property name="internationalize">1</property>
+    <property name="lua_skip_events">1</property>
+    <property name="lua_ui_table">UI</property>
+    <property name="name">PANEL_RULE_AREA_PROPERTIES_KEEPOUT_BASE</property>
+    <property name="path">.</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">1</property>
+    <property name="python_skip_events">1</property>
+    <property name="relative_path">1</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>
+      <property name="bg"></property>
+      <property name="context_help"></property>
+      <property name="context_menu">1</property>
+      <property name="drag_accept_files">0</property>
+      <property name="enabled">1</property>
+      <property name="event_handler">impl_virtual</property>
+      <property name="fg"></property>
+      <property name="font"></property>
+      <property name="hidden">0</property>
+      <property name="id">wxID_ANY</property>
+      <property name="maximum_size"></property>
+      <property name="minimum_size"></property>
+      <property name="name">PANEL_RULE_AREA_PROPERTIES_KEEPOUT_BASE</property>
+      <property name="pos"></property>
+      <property name="size">-1,-1</property>
+      <property name="subclass">; ; forward_declare</property>
+      <property name="tooltip"></property>
+      <property name="two_step_creation">0</property>
+      <property name="window_extra_style"></property>
+      <property name="window_name"></property>
+      <property name="window_style">wxTAB_TRAVERSAL</property>
+      <object class="wxFlexGridSizer" expanded="true">
+        <property name="cols">1</property>
+        <property name="flexible_direction">wxBOTH</property>
+        <property name="growablecols"></property>
+        <property name="growablerows"></property>
+        <property name="hgap">0</property>
+        <property name="minimum_size"></property>
+        <property name="name">m_keepoutRuleSizer</property>
+        <property name="non_flexible_grow_mode">wxFLEX_GROWMODE_SPECIFIED</property>
+        <property name="permission">protected</property>
+        <property name="rows">0</property>
+        <property name="vgap">3</property>
+        <object class="sizeritem" expanded="true">
+          <property name="border">5</property>
+          <property name="flag">wxEXPAND|wxRIGHT|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 out tracks</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_cbTracksCtrl</property>
+            <property name="pane_border">1</property>
+            <property name="pane_position"></property>
+            <property name="pane_size"></property>
+            <property name="permission">public</property>
+            <property name="pin_button">1</property>
+            <property name="pos"></property>
+            <property name="resize">Resizable</property>
+            <property name="show">1</property>
+            <property name="size"></property>
+            <property name="style"></property>
+            <property name="subclass"></property>
+            <property name="toolbar_pane">0</property>
+            <property name="tooltip">Prevent tracks from routing into this area</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|wxRIGHT|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 out vias</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_cbViasCtrl</property>
+            <property name="pane_border">1</property>
+            <property name="pane_position"></property>
+            <property name="pane_size"></property>
+            <property name="permission">public</property>
+            <property name="pin_button">1</property>
+            <property name="pos"></property>
+            <property name="resize">Resizable</property>
+            <property name="show">1</property>
+            <property name="size"></property>
+            <property name="style"></property>
+            <property name="subclass"></property>
+            <property name="toolbar_pane">0</property>
+            <property name="tooltip">Prevent vias from being placed in this area</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">wxRIGHT|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 out pads</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_cbPadsCtrl</property>
+            <property name="pane_border">1</property>
+            <property name="pane_position"></property>
+            <property name="pane_size"></property>
+            <property name="permission">public</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">Raise a DRC error if a pad overlaps this area</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|wxRIGHT|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 out zone fills</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_cbCopperPourCtrl</property>
+            <property name="pane_border">1</property>
+            <property name="pane_position"></property>
+            <property name="pane_size"></property>
+            <property name="permission">public</property>
+            <property name="pin_button">1</property>
+            <property name="pos"></property>
+            <property name="resize">Resizable</property>
+            <property name="show">1</property>
+            <property name="size"></property>
+            <property name="style"></property>
+            <property name="subclass"></property>
+            <property name="toolbar_pane">0</property>
+            <property name="tooltip">Zones will not fill copper into this area</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">wxRIGHT|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 out footprints</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_cbFootprintsCtrl</property>
+            <property name="pane_border">1</property>
+            <property name="pane_position"></property>
+            <property name="pane_size"></property>
+            <property name="permission">public</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">Raise a DRC error if a footprint courtyard overlaps this area</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>
+    </object>
+  </object>
+</wxFormBuilder_Project>
diff --git a/pcbnew/dialogs/panel_rule_area_properties_keepout_base.h b/pcbnew/dialogs/panel_rule_area_properties_keepout_base.h
new file mode 100644
index 0000000000..366f2104df
--- /dev/null
+++ b/pcbnew/dialogs/panel_rule_area_properties_keepout_base.h
@@ -0,0 +1,46 @@
+///////////////////////////////////////////////////////////////////////////
+// C++ code generated with wxFormBuilder (version 4.2.1-0-g80c4cb6)
+// http://www.wxformbuilder.org/
+//
+// PLEASE DO *NOT* EDIT THIS FILE!
+///////////////////////////////////////////////////////////////////////////
+
+#pragma once
+
+#include <wx/artprov.h>
+#include <wx/xrc/xmlres.h>
+#include <wx/intl.h>
+#include <wx/string.h>
+#include <wx/checkbox.h>
+#include <wx/gdicmn.h>
+#include <wx/font.h>
+#include <wx/colour.h>
+#include <wx/settings.h>
+#include <wx/sizer.h>
+#include <wx/panel.h>
+
+///////////////////////////////////////////////////////////////////////////
+
+///////////////////////////////////////////////////////////////////////////////
+/// Class PANEL_RULE_AREA_PROPERTIES_KEEPOUT_BASE
+///////////////////////////////////////////////////////////////////////////////
+class PANEL_RULE_AREA_PROPERTIES_KEEPOUT_BASE : public wxPanel
+{
+	private:
+
+	protected:
+		wxFlexGridSizer* m_keepoutRuleSizer;
+
+	public:
+		wxCheckBox* m_cbTracksCtrl;
+		wxCheckBox* m_cbViasCtrl;
+		wxCheckBox* m_cbPadsCtrl;
+		wxCheckBox* m_cbCopperPourCtrl;
+		wxCheckBox* m_cbFootprintsCtrl;
+
+		PANEL_RULE_AREA_PROPERTIES_KEEPOUT_BASE( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxTAB_TRAVERSAL, const wxString& name = wxEmptyString );
+
+		~PANEL_RULE_AREA_PROPERTIES_KEEPOUT_BASE();
+
+};
+
diff --git a/pcbnew/dialogs/panel_rule_area_properties_placement_base.cpp b/pcbnew/dialogs/panel_rule_area_properties_placement_base.cpp
new file mode 100644
index 0000000000..2dcac82abe
--- /dev/null
+++ b/pcbnew/dialogs/panel_rule_area_properties_placement_base.cpp
@@ -0,0 +1,53 @@
+///////////////////////////////////////////////////////////////////////////
+// C++ code generated with wxFormBuilder (version 4.2.1-0-g80c4cb6)
+// http://www.wxformbuilder.org/
+//
+// PLEASE DO *NOT* EDIT THIS FILE!
+///////////////////////////////////////////////////////////////////////////
+
+#include "panel_rule_area_properties_placement_base.h"
+
+///////////////////////////////////////////////////////////////////////////
+
+PANEL_RULE_AREA_PROPERTIES_PLACEMENT_BASE::PANEL_RULE_AREA_PROPERTIES_PLACEMENT_BASE( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style, const wxString& name ) : wxPanel( parent, id, pos, size, style, name )
+{
+	wxBoxSizer* bSizer2;
+	bSizer2 = new wxBoxSizer( wxVERTICAL );
+
+	m_enabled = new wxCheckBox( this, wxID_ANY, _("Enabled"), wxDefaultPosition, wxDefaultSize, 0 );
+	bSizer2->Add( m_enabled, 0, wxALL, 5 );
+
+	wxStaticBoxSizer* sbSizer2;
+	sbSizer2 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Placement Source") ), wxVERTICAL );
+
+	wxGridBagSizer* gbSizer2;
+	gbSizer2 = new wxGridBagSizer( 0, 0 );
+	gbSizer2->SetFlexibleDirection( wxBOTH );
+	gbSizer2->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
+
+	m_sourceSheetnameRb = new wxRadioButton( sbSizer2->GetStaticBox(), wxID_ANY, _("Sheet"), wxDefaultPosition, wxDefaultSize, 0 );
+	gbSizer2->Add( m_sourceSheetnameRb, wxGBPosition( 0, 0 ), wxGBSpan( 1, 1 ), wxALL, 5 );
+
+	m_sourceComponentClassRb = new wxRadioButton( sbSizer2->GetStaticBox(), wxID_ANY, _("Component Class"), wxDefaultPosition, wxDefaultSize, 0 );
+	gbSizer2->Add( m_sourceComponentClassRb, wxGBPosition( 0, 1 ), wxGBSpan( 1, 1 ), wxALL, 5 );
+
+	m_sourceObjectNameCb = new wxComboBox( sbSizer2->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, wxCB_READONLY );
+	gbSizer2->Add( m_sourceObjectNameCb, wxGBPosition( 1, 0 ), wxGBSpan( 1, 3 ), wxALL|wxEXPAND, 5 );
+
+
+	gbSizer2->AddGrowableCol( 2 );
+
+	sbSizer2->Add( gbSizer2, 1, wxEXPAND, 5 );
+
+
+	bSizer2->Add( sbSizer2, 1, wxEXPAND, 5 );
+
+
+	this->SetSizer( bSizer2 );
+	this->Layout();
+	bSizer2->Fit( this );
+}
+
+PANEL_RULE_AREA_PROPERTIES_PLACEMENT_BASE::~PANEL_RULE_AREA_PROPERTIES_PLACEMENT_BASE()
+{
+}
diff --git a/pcbnew/dialogs/panel_rule_area_properties_placement_base.fbp b/pcbnew/dialogs/panel_rule_area_properties_placement_base.fbp
new file mode 100644
index 0000000000..3cdb485a6f
--- /dev/null
+++ b/pcbnew/dialogs/panel_rule_area_properties_placement_base.fbp
@@ -0,0 +1,367 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<wxFormBuilder_Project>
+  <FileVersion major="1" minor="18"/>
+  <object class="Project" expanded="true">
+    <property name="code_generation">C++</property>
+    <property name="cpp_class_decoration">; </property>
+    <property name="cpp_disconnect_events">0</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">1</property>
+    <property name="embedded_files_path">res</property>
+    <property name="encoding">UTF-8</property>
+    <property name="file">panel_rule_area_properties_placement_base</property>
+    <property name="first_id">6000</property>
+    <property name="internationalize">1</property>
+    <property name="lua_skip_events">1</property>
+    <property name="lua_ui_table">UI</property>
+    <property name="name">PANEL_RULE_AREA_PROPERTIES_PLACEMENT_BASE</property>
+    <property name="path">.</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">1</property>
+    <property name="python_skip_events">1</property>
+    <property name="relative_path">1</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>
+      <property name="bg"></property>
+      <property name="context_help"></property>
+      <property name="context_menu">1</property>
+      <property name="drag_accept_files">0</property>
+      <property name="enabled">1</property>
+      <property name="event_handler">impl_virtual</property>
+      <property name="fg"></property>
+      <property name="font"></property>
+      <property name="hidden">0</property>
+      <property name="id">wxID_ANY</property>
+      <property name="maximum_size"></property>
+      <property name="minimum_size"></property>
+      <property name="name">PANEL_RULE_AREA_PROPERTIES_PLACEMENT_BASE</property>
+      <property name="pos"></property>
+      <property name="size">-1,-1</property>
+      <property name="subclass">; ; forward_declare</property>
+      <property name="tooltip"></property>
+      <property name="two_step_creation">0</property>
+      <property name="window_extra_style"></property>
+      <property name="window_name"></property>
+      <property name="window_style">wxTAB_TRAVERSAL</property>
+      <object class="wxBoxSizer" expanded="true">
+        <property name="minimum_size"></property>
+        <property name="name">bSizer2</property>
+        <property name="orient">wxVERTICAL</property>
+        <property name="permission">none</property>
+        <object class="sizeritem" expanded="true">
+          <property name="border">5</property>
+          <property name="flag">wxALL</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">Enabled</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_enabled</property>
+            <property name="pane_border">1</property>
+            <property name="pane_position"></property>
+            <property name="pane_size"></property>
+            <property name="permission">public</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="wxStaticBoxSizer" expanded="true">
+            <property name="id">wxID_ANY</property>
+            <property name="label">Placement Source</property>
+            <property name="minimum_size"></property>
+            <property name="name">sbSizer2</property>
+            <property name="orient">wxVERTICAL</property>
+            <property name="parent">1</property>
+            <property name="permission">none</property>
+            <object class="sizeritem" expanded="true">
+              <property name="border">5</property>
+              <property name="flag">wxEXPAND</property>
+              <property name="proportion">1</property>
+              <object class="wxGridBagSizer" expanded="true">
+                <property name="empty_cell_size"></property>
+                <property name="flexible_direction">wxBOTH</property>
+                <property name="growablecols">2</property>
+                <property name="growablerows"></property>
+                <property name="hgap">0</property>
+                <property name="minimum_size"></property>
+                <property name="name">gbSizer2</property>
+                <property name="non_flexible_grow_mode">wxFLEX_GROWMODE_SPECIFIED</property>
+                <property name="permission">none</property>
+                <property name="vgap">0</property>
+                <object class="gbsizeritem" expanded="true">
+                  <property name="border">5</property>
+                  <property name="colspan">1</property>
+                  <property name="column">0</property>
+                  <property name="flag">wxALL</property>
+                  <property name="row">0</property>
+                  <property name="rowspan">1</property>
+                  <object class="wxRadioButton" 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">Sheet</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_sourceSheetnameRb</property>
+                    <property name="pane_border">1</property>
+                    <property name="pane_position"></property>
+                    <property name="pane_size"></property>
+                    <property name="permission">public</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">0</property>
+                    <property name="window_extra_style"></property>
+                    <property name="window_name"></property>
+                    <property name="window_style"></property>
+                  </object>
+                </object>
+                <object class="gbsizeritem" expanded="true">
+                  <property name="border">5</property>
+                  <property name="colspan">1</property>
+                  <property name="column">1</property>
+                  <property name="flag">wxALL</property>
+                  <property name="row">0</property>
+                  <property name="rowspan">1</property>
+                  <object class="wxRadioButton" 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">Component Class</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_sourceComponentClassRb</property>
+                    <property name="pane_border">1</property>
+                    <property name="pane_position"></property>
+                    <property name="pane_size"></property>
+                    <property name="permission">public</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">0</property>
+                    <property name="window_extra_style"></property>
+                    <property name="window_name"></property>
+                    <property name="window_style"></property>
+                  </object>
+                </object>
+                <object class="gbsizeritem" expanded="true">
+                  <property name="border">5</property>
+                  <property name="colspan">3</property>
+                  <property name="column">0</property>
+                  <property name="flag">wxALL|wxEXPAND</property>
+                  <property name="row">1</property>
+                  <property name="rowspan">1</property>
+                  <object class="wxComboBox" 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="choices"></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_sourceObjectNameCb</property>
+                    <property name="pane_border">1</property>
+                    <property name="pane_position"></property>
+                    <property name="pane_size"></property>
+                    <property name="permission">public</property>
+                    <property name="pin_button">1</property>
+                    <property name="pos"></property>
+                    <property name="resize">Resizable</property>
+                    <property name="selection">-1</property>
+                    <property name="show">1</property>
+                    <property name="size"></property>
+                    <property name="style">wxCB_READONLY</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>
+            </object>
+          </object>
+        </object>
+      </object>
+    </object>
+  </object>
+</wxFormBuilder_Project>
diff --git a/pcbnew/dialogs/panel_rule_area_properties_placement_base.h b/pcbnew/dialogs/panel_rule_area_properties_placement_base.h
new file mode 100644
index 0000000000..122d14ff9d
--- /dev/null
+++ b/pcbnew/dialogs/panel_rule_area_properties_placement_base.h
@@ -0,0 +1,48 @@
+///////////////////////////////////////////////////////////////////////////
+// C++ code generated with wxFormBuilder (version 4.2.1-0-g80c4cb6)
+// http://www.wxformbuilder.org/
+//
+// PLEASE DO *NOT* EDIT THIS FILE!
+///////////////////////////////////////////////////////////////////////////
+
+#pragma once
+
+#include <wx/artprov.h>
+#include <wx/xrc/xmlres.h>
+#include <wx/intl.h>
+#include <wx/string.h>
+#include <wx/checkbox.h>
+#include <wx/gdicmn.h>
+#include <wx/font.h>
+#include <wx/colour.h>
+#include <wx/settings.h>
+#include <wx/radiobut.h>
+#include <wx/combobox.h>
+#include <wx/gbsizer.h>
+#include <wx/sizer.h>
+#include <wx/statbox.h>
+#include <wx/panel.h>
+
+///////////////////////////////////////////////////////////////////////////
+
+///////////////////////////////////////////////////////////////////////////////
+/// Class PANEL_RULE_AREA_PROPERTIES_PLACEMENT_BASE
+///////////////////////////////////////////////////////////////////////////////
+class PANEL_RULE_AREA_PROPERTIES_PLACEMENT_BASE : public wxPanel
+{
+	private:
+
+	protected:
+
+	public:
+		wxCheckBox* m_enabled;
+		wxRadioButton* m_sourceSheetnameRb;
+		wxRadioButton* m_sourceComponentClassRb;
+		wxComboBox* m_sourceObjectNameCb;
+
+		PANEL_RULE_AREA_PROPERTIES_PLACEMENT_BASE( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxTAB_TRAVERSAL, const wxString& name = wxEmptyString );
+
+		~PANEL_RULE_AREA_PROPERTIES_PLACEMENT_BASE();
+
+};
+
diff --git a/pcbnew/drc/drc_engine.cpp b/pcbnew/drc/drc_engine.cpp
index a9652a5564..1f5252d7d3 100644
--- a/pcbnew/drc/drc_engine.cpp
+++ b/pcbnew/drc/drc_engine.cpp
@@ -106,7 +106,7 @@ static bool isKeepoutZone( const BOARD_ITEM* aItem, bool aCheckFlags )
     if( !zone->GetIsRuleArea() )
         return false;
 
-    if( zone->GetRuleAreaType() != RULE_AREA_TYPE::KEEPOUT )
+    if( !zone->HasKeepoutParametersSet() )
         return false;
 
     if( aCheckFlags )
diff --git a/pcbnew/drc/drc_interactive_courtyard_clearance.cpp b/pcbnew/drc/drc_interactive_courtyard_clearance.cpp
index 0feb31fdad..f96e3c393e 100644
--- a/pcbnew/drc/drc_interactive_courtyard_clearance.cpp
+++ b/pcbnew/drc/drc_interactive_courtyard_clearance.cpp
@@ -171,8 +171,11 @@ void DRC_INTERACTIVE_COURTYARD_CLEARANCE::testCourtyardClearances()
 
     for( ZONE* zone : m_board->Zones() )
     {
-        if( !zone->GetIsRuleArea() || zone->GetRuleAreaType() != RULE_AREA_TYPE::KEEPOUT || !zone->GetDoNotAllowFootprints() )
+        if( !zone->GetIsRuleArea() || !zone->HasKeepoutParametersSet()
+            || !zone->GetDoNotAllowFootprints() )
+        {
             continue;
+        }
 
         bool disallowFront = ( zone->GetLayerSet() & LSET::FrontMask() ).any();
         bool disallowBack = ( zone->GetLayerSet() & LSET::BackMask() ).any();
diff --git a/pcbnew/drc/drc_test_provider_disallow.cpp b/pcbnew/drc/drc_test_provider_disallow.cpp
index f96311f570..e21b881f7a 100644
--- a/pcbnew/drc/drc_test_provider_disallow.cpp
+++ b/pcbnew/drc/drc_test_provider_disallow.cpp
@@ -90,12 +90,15 @@ bool DRC_TEST_PROVIDER_DISALLOW::Run()
             {
                 ZONE* zone = dynamic_cast<ZONE*>( item );
 
-                if( zone && zone->GetIsRuleArea()
-                    && zone->GetRuleAreaType() == RULE_AREA_TYPE::KEEPOUT
+                if( zone && zone->GetIsRuleArea() && zone->HasKeepoutParametersSet()
                     && zone->GetDoNotAllowCopperPour() )
+                {
                     antiCopperKeepouts.push_back( zone );
+                }
                 else if( zone && zone->IsOnCopperLayer() )
+                {
                     copperZones.push_back( zone );
+                }
 
                 totalCount++;
 
@@ -262,7 +265,7 @@ bool DRC_TEST_PROVIDER_DISALLOW::Run()
                 {
                     ZONE* zone = dynamic_cast<ZONE*>( item );
 
-                    if( zone && zone->GetIsRuleArea() && zone->GetRuleAreaType() == RULE_AREA_TYPE::KEEPOUT )
+                    if( zone && zone->GetIsRuleArea() && zone->HasKeepoutParametersSet() )
                         return true;
 
                     item->ClearFlags( HOLE_PROXY );     // Just in case
diff --git a/pcbnew/edit_zone_helpers.cpp b/pcbnew/edit_zone_helpers.cpp
index c8d703595c..a13afbee09 100644
--- a/pcbnew/edit_zone_helpers.cpp
+++ b/pcbnew/edit_zone_helpers.cpp
@@ -48,7 +48,7 @@ void PCB_EDIT_FRAME::Edit_Zone_Params( ZONE* aZone )
     {
         // edit a rule area on a copper layer
         zoneInfo << *aZone;
-        dialogResult = InvokeRuleAreaEditor( this, &zoneInfo );
+        dialogResult = InvokeRuleAreaEditor( this, &zoneInfo, GetBoard() );
     }
     else if( IsCopperLayer( aZone->GetFirstLayer() ) )
     {
diff --git a/pcbnew/pcb_io/kicad_sexpr/pcb_io_kicad_sexpr.cpp b/pcbnew/pcb_io/kicad_sexpr/pcb_io_kicad_sexpr.cpp
index c2840d303e..b9879d36fd 100644
--- a/pcbnew/pcb_io/kicad_sexpr/pcb_io_kicad_sexpr.cpp
+++ b/pcbnew/pcb_io/kicad_sexpr/pcb_io_kicad_sexpr.cpp
@@ -2590,12 +2590,6 @@ void PCB_IO_KICAD_SEXPR::format( const PCB_TRACK* aTrack, int aNestLevel ) const
 
 void PCB_IO_KICAD_SEXPR::format( const ZONE* aZone, int aNestLevel ) const
 {
-    // temporary safeguard for the multichannel tool (and placement area/room support). When the tool is off
-    // (default), KiCad will not write any placement info in the RAs (and won't break file format compatibility)
-
-    if( ! ADVANCED_CFG::GetCfg().m_EnableMultichannelTool && aZone->GetIsRuleArea() && aZone->GetRuleAreaType() == RULE_AREA_TYPE::PLACEMENT )
-        return;
-
     // Save the NET info.
     // For keepout and non copper zones, net code and net name are irrelevant
     // so be sure a dummy value is stored, just for ZONE compatibility
@@ -2703,21 +2697,18 @@ void PCB_IO_KICAD_SEXPR::format( const ZONE* aZone, int aNestLevel ) const
 
     if( aZone->GetIsRuleArea() )
     {
-        switch( aZone->GetRuleAreaType() )
-        {
-        case RULE_AREA_TYPE::KEEPOUT:
-        {
-            m_out->Print( aNestLevel + 1,
-                          "(keepout (tracks %s) (vias %s) (pads %s) (copperpour %s) "
-                          "(footprints %s))\n",
-                          aZone->GetDoNotAllowTracks() ? "not_allowed" : "allowed",
-                          aZone->GetDoNotAllowVias() ? "not_allowed" : "allowed",
-                          aZone->GetDoNotAllowPads() ? "not_allowed" : "allowed",
-                          aZone->GetDoNotAllowCopperPour() ? "not_allowed" : "allowed",
-                          aZone->GetDoNotAllowFootprints() ? "not_allowed" : "allowed" );
-            break;
-        }
-        case RULE_AREA_TYPE::PLACEMENT:
+        // Keepout settings
+        m_out->Print( aNestLevel + 1,
+                      "(keepout (tracks %s) (vias %s) (pads %s) (copperpour %s) "
+                      "(footprints %s))\n",
+                      aZone->GetDoNotAllowTracks() ? "not_allowed" : "allowed",
+                      aZone->GetDoNotAllowVias() ? "not_allowed" : "allowed",
+                      aZone->GetDoNotAllowPads() ? "not_allowed" : "allowed",
+                      aZone->GetDoNotAllowCopperPour() ? "not_allowed" : "allowed",
+                      aZone->GetDoNotAllowFootprints() ? "not_allowed" : "allowed" );
+
+        // Multichannel settings
+        if( ADVANCED_CFG::GetCfg().m_EnableMultichannelTool )
         {
             m_out->Print( aNestLevel + 1, "(placement" );
             m_out->Print( aNestLevel + 2, "(enabled " );
@@ -2740,10 +2731,6 @@ void PCB_IO_KICAD_SEXPR::format( const ZONE* aZone, int aNestLevel ) const
             }
 
             m_out->Print( aNestLevel + 1, ")" );
-            break;
-        }
-        default:
-            break;
         }
     }
 
diff --git a/pcbnew/pcb_io/kicad_sexpr/pcb_io_kicad_sexpr_parser.cpp b/pcbnew/pcb_io/kicad_sexpr/pcb_io_kicad_sexpr_parser.cpp
index 7197dfea27..9da8069501 100644
--- a/pcbnew/pcb_io/kicad_sexpr/pcb_io_kicad_sexpr_parser.cpp
+++ b/pcbnew/pcb_io/kicad_sexpr/pcb_io_kicad_sexpr_parser.cpp
@@ -6857,7 +6857,6 @@ ZONE* PCB_IO_KICAD_SEXPR_PARSER::parseZONE( BOARD_ITEM_CONTAINER* aParent )
 
         case T_placement:
             zone->SetIsRuleArea( true );
-            zone->SetRuleAreaType( RULE_AREA_TYPE::PLACEMENT );
 
             for( token = NextTok();  token != T_RIGHT;  token = NextTok() )
             {
@@ -6910,7 +6909,6 @@ ZONE* PCB_IO_KICAD_SEXPR_PARSER::parseZONE( BOARD_ITEM_CONTAINER* aParent )
         case T_keepout:
             // "keepout" now means rule area, but the file token stays the same
             zone->SetIsRuleArea( true );
-            zone->SetRuleAreaType( RULE_AREA_TYPE::KEEPOUT );
 
             // Initialize these two because their tokens won't appear in older files:
             zone->SetDoNotAllowPads( false );
diff --git a/pcbnew/router/pns_kicad_iface.cpp b/pcbnew/router/pns_kicad_iface.cpp
index 036b93b67d..6b3422626c 100644
--- a/pcbnew/router/pns_kicad_iface.cpp
+++ b/pcbnew/router/pns_kicad_iface.cpp
@@ -258,7 +258,7 @@ bool PNS_PCBNEW_RULE_RESOLVER::IsKeepout( const PNS::ITEM* aObstacle, const PNS:
     {
         const ZONE* zone = static_cast<ZONE*>( aObstacle->Parent() );
 
-        if( zone->GetIsRuleArea() && zone->GetRuleAreaType() == RULE_AREA_TYPE::KEEPOUT )
+        if( zone->GetIsRuleArea() && zone->HasKeepoutParametersSet() )
         {
             *aEnforce = checkKeepout( zone,
                                       getBoardItem( aItem, m_routerIface->GetBoardLayerFromPNSLayer(
@@ -1321,7 +1321,7 @@ bool PNS_KICAD_IFACE_BASE::syncZone( PNS::NODE* aWorld, ZONE* aZone, SHAPE_POLY_
     static wxString msg;
     SHAPE_POLY_SET* poly;
 
-    if( !aZone->GetIsRuleArea() || aZone->GetRuleAreaType() != RULE_AREA_TYPE::KEEPOUT )
+    if( !aZone->GetIsRuleArea() || !aZone->HasKeepoutParametersSet() )
         return false;
 
     LSET layers = aZone->GetLayerSet();
diff --git a/pcbnew/router/pns_router.cpp b/pcbnew/router/pns_router.cpp
index 475edb879a..78a57b717a 100644
--- a/pcbnew/router/pns_router.cpp
+++ b/pcbnew/router/pns_router.cpp
@@ -251,7 +251,7 @@ bool ROUTER::isStartingPointRoutable( const VECTOR2I& aWhere, ITEM* aStartItem,
             {
                 ZONE* zone = static_cast<ZONE*>( parent );
 
-                if( zone->GetRuleAreaType() != RULE_AREA_TYPE::KEEPOUT )
+                if( !zone->HasKeepoutParametersSet() )
                     break;
 
                 if( !zone->GetZoneName().IsEmpty() )
diff --git a/pcbnew/tools/board_editor_control.cpp b/pcbnew/tools/board_editor_control.cpp
index bf491df2f4..747680643a 100644
--- a/pcbnew/tools/board_editor_control.cpp
+++ b/pcbnew/tools/board_editor_control.cpp
@@ -1460,7 +1460,7 @@ int BOARD_EDITOR_CONTROL::ZoneDuplicate( const TOOL_EVENT& aEvent )
     int dialogResult;
 
     if( oldZone->GetIsRuleArea() )
-        dialogResult = InvokeRuleAreaEditor( m_frame, &zoneSettings );
+        dialogResult = InvokeRuleAreaEditor( m_frame, &zoneSettings, board() );
     else if( oldZone->IsOnCopperLayer() )
         dialogResult = InvokeCopperZonesEditor( m_frame, &zoneSettings );
     else
diff --git a/pcbnew/tools/convert_tool.cpp b/pcbnew/tools/convert_tool.cpp
index 7636c10162..9d1a67d143 100644
--- a/pcbnew/tools/convert_tool.cpp
+++ b/pcbnew/tools/convert_tool.cpp
@@ -522,7 +522,7 @@ int CONVERT_TOOL::CreatePolys( const TOOL_EVENT& aEvent )
         if( aEvent.IsAction( &PCB_ACTIONS::convertToKeepout ) )
         {
             zoneInfo.SetIsRuleArea( true );
-            ret = InvokeRuleAreaEditor( frame, &zoneInfo, &m_userSettings );
+            ret = InvokeRuleAreaEditor( frame, &zoneInfo, board(), &m_userSettings );
         }
         else if( nonCopper )
         {
diff --git a/pcbnew/tools/multichannel_tool.cpp b/pcbnew/tools/multichannel_tool.cpp
index 35410ccac2..556172806f 100644
--- a/pcbnew/tools/multichannel_tool.cpp
+++ b/pcbnew/tools/multichannel_tool.cpp
@@ -97,8 +97,10 @@ bool MULTICHANNEL_TOOL::identifyComponentsInRuleArea( ZONE*                 aRul
                 wxT( "A.memberOfSheet('" ) + aRuleArea->GetRuleAreaPlacementSource() + wxT( "')" );
         break;
     }
-    default:
-        wxFAIL_MSG( "RULE_AREA_PLACEMENT_SOURCE_TYPE not yet implemented" );
+    case RULE_AREA_PLACEMENT_SOURCE_TYPE::COMPONENT_CLASS:
+        ruleText = wxT( "A.hasComponentClass('" ) + aRuleArea->GetRuleAreaPlacementSource()
+                   + wxT( "')" );
+        break;
     }
 
     auto ok = compiler.Compile( ruleText, &ucode, &preflightCtx );
@@ -226,7 +228,7 @@ void MULTICHANNEL_TOOL::FindExistingRuleAreas()
     {
         if( !zone->GetIsRuleArea() )
             continue;
-        if( zone->GetRuleAreaType() != RULE_AREA_TYPE::PLACEMENT )
+        if( !zone->GetRuleAreaPlacementEnabled() )
             continue;
 
         RULE_AREA area;
@@ -270,7 +272,7 @@ int MULTICHANNEL_TOOL::repeatLayout( const TOOL_EVENT& aEvent )
           ZONE* zone = static_cast<ZONE*>( aItem );
             if( !zone->GetIsRuleArea() )
                 return nullptr;
-            if( zone->GetRuleAreaType() != RULE_AREA_TYPE::PLACEMENT )
+            if( !zone->GetRuleAreaPlacementEnabled() )
                 return nullptr;
         return zone;
     };
@@ -714,7 +716,7 @@ int MULTICHANNEL_TOOL::AutogenerateRuleAreas( const TOOL_EVENT& aEvent )
     {
         if( !zone->GetIsRuleArea() )
             continue;
-        if( zone->GetRuleAreaType() != RULE_AREA_TYPE::PLACEMENT )
+        if( !zone->GetRuleAreaPlacementEnabled() )
             continue;
 
         std::set<FOOTPRINT*> components;
@@ -762,7 +764,12 @@ int MULTICHANNEL_TOOL::AutogenerateRuleAreas( const TOOL_EVENT& aEvent )
 
         newZone->SetIsRuleArea( true );
         newZone->SetLayerSet( LSET::AllCuMask() );
-        newZone->SetRuleAreaType( RULE_AREA_TYPE::PLACEMENT );
+        newZone->SetRuleAreaPlacementEnabled( true );
+        newZone->SetDoNotAllowCopperPour( false );
+        newZone->SetDoNotAllowVias( false );
+        newZone->SetDoNotAllowTracks( false );
+        newZone->SetDoNotAllowPads( false );
+        newZone->SetDoNotAllowFootprints( false );
         newZone->SetRuleAreaPlacementSourceType( RULE_AREA_PLACEMENT_SOURCE_TYPE::SHEETNAME );
         newZone->SetRuleAreaPlacementSource( ra.m_sheetPath );
         newZone->AddPolygon( raOutline );
diff --git a/pcbnew/tools/zone_create_helper.cpp b/pcbnew/tools/zone_create_helper.cpp
index c0dfb9798a..7f08e11314 100644
--- a/pcbnew/tools/zone_create_helper.cpp
+++ b/pcbnew/tools/zone_create_helper.cpp
@@ -122,7 +122,7 @@ std::unique_ptr<ZONE> ZONE_CREATE_HELPER::createNewZone( bool aKeepout )
         int dialogResult;
 
         if( m_params.m_keepout )
-            dialogResult = InvokeRuleAreaEditor( frame, &zoneInfo );
+            dialogResult = InvokeRuleAreaEditor( frame, &zoneInfo, m_tool.board() );
         else if( ( zoneInfo.m_Layers & LSET::AllCuMask() ).any() )
             dialogResult = InvokeCopperZonesEditor( frame, &zoneInfo );
         else
diff --git a/pcbnew/zone.cpp b/pcbnew/zone.cpp
index 45f15e3083..526e27d1cf 100644
--- a/pcbnew/zone.cpp
+++ b/pcbnew/zone.cpp
@@ -23,6 +23,7 @@
  * 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
  */
 
+#include <advanced_config.h>
 #include <bitmaps.h>
 #include <geometry/geometry_utils.h>
 #include <geometry/shape_null.h>
@@ -51,6 +52,7 @@ ZONE::ZONE( BOARD_ITEM_CONTAINER* aParent ) :
         m_priority( 0 ),
         m_isRuleArea( false ),
         m_ruleAreaPlacementEnabled( false ),
+        m_ruleAreaPlacementSourceType( RULE_AREA_PLACEMENT_SOURCE_TYPE::SHEETNAME ),
         m_teardropType( TEARDROP_TYPE::TD_NONE ),
         m_PadConnection( ZONE_CONNECTION::NONE ),
         m_ZoneClearance( 0 ),
@@ -132,7 +134,7 @@ void ZONE::InitDataFromSrcInCopyCtor( const ZONE& aZone )
     m_zoneName                = aZone.m_zoneName;
     m_priority                = aZone.m_priority;
     m_isRuleArea              = aZone.m_isRuleArea;
-    m_ruleAreaType = aZone.m_ruleAreaType;
+    m_ruleAreaPlacementEnabled = aZone.m_ruleAreaPlacementEnabled;
     m_ruleAreaPlacementSourceType = aZone.m_ruleAreaPlacementSourceType;
     m_ruleAreaPlacementSource = aZone.m_ruleAreaPlacementSource;
     SetLayerSet( aZone.GetLayerSet() );
@@ -583,7 +585,6 @@ void ZONE::GetMsgPanelInfo( EDA_DRAW_FRAME* aFrame, std::vector<MSG_PANEL_ITEM>&
     {
         msg.Empty();
 
-// fixme placement
         if( GetDoNotAllowVias() )
             AccumulateDescription( msg, _( "No vias" ) );
 
@@ -601,6 +602,12 @@ void ZONE::GetMsgPanelInfo( EDA_DRAW_FRAME* aFrame, std::vector<MSG_PANEL_ITEM>&
 
         if( !msg.IsEmpty() )
             aList.emplace_back( _( "Restrictions" ), msg );
+
+        if( GetRuleAreaPlacementEnabled() )
+        {
+            aList.emplace_back( _( "Placement source" ),
+                                UnescapeString( GetRuleAreaPlacementSource() ) );
+        }
     }
     else if( IsOnCopperLayer() )
     {
@@ -1447,30 +1454,29 @@ bool ZONE::operator==( const ZONE& aOther ) const
 
      if( GetIsRuleArea() )
      {
-        if( GetRuleAreaType() != other.GetRuleAreaType() )
-            return false;
+         if( GetDoNotAllowCopperPour() != other.GetDoNotAllowCopperPour() )
+             return false;
 
-        if( GetRuleAreaType() == RULE_AREA_TYPE::KEEPOUT )
-        {
-            if( GetDoNotAllowCopperPour() != other.GetDoNotAllowCopperPour() )
-                return false;
-            if( GetDoNotAllowTracks() != other.GetDoNotAllowTracks() )
-                return false;
-            if( GetDoNotAllowVias() != other.GetDoNotAllowVias() )
-                return false;
-            if( GetDoNotAllowFootprints() != other.GetDoNotAllowFootprints() )
-                return false;
-            if( GetDoNotAllowPads() != other.GetDoNotAllowPads() )
-                return false;
-        }
-        else if ( GetRuleAreaType() == RULE_AREA_TYPE::PLACEMENT )
-        {
-            if( GetRuleAreaPlacementSourceType() != other.GetRuleAreaPlacementSourceType() )
-                return false;
+         if( GetDoNotAllowTracks() != other.GetDoNotAllowTracks() )
+             return false;
 
-            if( GetRuleAreaPlacementSource() != other.GetRuleAreaPlacementSource() )
-                return false;
-        }
+         if( GetDoNotAllowVias() != other.GetDoNotAllowVias() )
+             return false;
+
+         if( GetDoNotAllowFootprints() != other.GetDoNotAllowFootprints() )
+             return false;
+
+         if( GetDoNotAllowPads() != other.GetDoNotAllowPads() )
+             return false;
+
+         if( GetRuleAreaPlacementEnabled() != other.GetRuleAreaPlacementEnabled() )
+             return false;
+
+         if( GetRuleAreaPlacementSourceType() != other.GetRuleAreaPlacementSourceType() )
+             return false;
+
+         if( GetRuleAreaPlacementSource() != other.GetRuleAreaPlacementSource() )
+             return false;
     }
     else
     {
@@ -1612,15 +1618,6 @@ static struct ZONE_DESC
                   .Map( ZONE_FILL_MODE::HATCH_PATTERN, _HKI( "Hatch pattern" ) );
         }
 
-        ENUM_MAP<RULE_AREA_TYPE>& raTypeMap = ENUM_MAP<RULE_AREA_TYPE>::Instance();
-
-        if( raTypeMap.Choices().GetCount() == 0 )
-        {
-            raTypeMap.Undefined( RULE_AREA_TYPE::KEEPOUT );
-            raTypeMap.Map( RULE_AREA_TYPE::KEEPOUT, _HKI( "Keepout" ) )
-                  .Map( RULE_AREA_TYPE::PLACEMENT, _HKI( "Placement" ) );
-        }
-
         ENUM_MAP<ISLAND_REMOVAL_MODE>& irmMap = ENUM_MAP<ISLAND_REMOVAL_MODE>::Instance();
 
         if( irmMap.Choices().GetCount() == 0 )
@@ -1631,6 +1628,17 @@ static struct ZONE_DESC
                   .Map( ISLAND_REMOVAL_MODE::AREA,   _HKI( "Below area limit" ) );
         }
 
+        ENUM_MAP<RULE_AREA_PLACEMENT_SOURCE_TYPE>& rapstMap =
+                ENUM_MAP<RULE_AREA_PLACEMENT_SOURCE_TYPE>::Instance();
+
+        if( rapstMap.Choices().GetCount() == 0 )
+        {
+            rapstMap.Undefined( RULE_AREA_PLACEMENT_SOURCE_TYPE::SHEETNAME );
+            rapstMap.Map( RULE_AREA_PLACEMENT_SOURCE_TYPE::SHEETNAME, _HKI( "Sheet Name" ) )
+                    .Map( RULE_AREA_PLACEMENT_SOURCE_TYPE::COMPONENT_CLASS,
+                          _HKI( "Component Class" ) );
+        }
+
         PROPERTY_MANAGER& propMgr = PROPERTY_MANAGER::Instance();
         REGISTER_TYPE( ZONE );
         propMgr.InheritsAfter( TYPE_HASH( ZONE ), TYPE_HASH( BOARD_CONNECTED_ITEM ) );
@@ -1707,11 +1715,62 @@ static struct ZONE_DESC
         propMgr.AddProperty( new PROPERTY<ZONE, wxString>( _HKI( "Name" ),
                     &ZONE::SetZoneName, &ZONE::GetZoneName ) );
 
-        propMgr.AddProperty( new PROPERTY_ENUM<ZONE, RULE_AREA_TYPE>( _HKI( "Rule Area Type" ),
-                                                           &ZONE::SetRuleAreaType,
-                                                           &ZONE::GetRuleAreaType ) )
+        const wxString groupKeepout = _HKI( "Keepout" );
+
+        propMgr.AddProperty( new PROPERTY<ZONE, bool>( _HKI( "Keep Out Tracks" ),
+                                                       &ZONE::SetDoNotAllowTracks,
+                                                       &ZONE::GetDoNotAllowTracks ),
+                             groupKeepout )
                 .SetAvailableFunc( isRuleArea );
 
+        propMgr.AddProperty( new PROPERTY<ZONE, bool>( _HKI( "Keep Out Vias" ),
+                                                       &ZONE::SetDoNotAllowVias,
+                                                       &ZONE::GetDoNotAllowVias ),
+                             groupKeepout )
+                .SetAvailableFunc( isRuleArea );
+
+        propMgr.AddProperty( new PROPERTY<ZONE, bool>( _HKI( "Keep Out Pads" ),
+                                                       &ZONE::SetDoNotAllowPads,
+                                                       &ZONE::GetDoNotAllowPads ),
+                             groupKeepout )
+                .SetAvailableFunc( isRuleArea );
+
+        propMgr.AddProperty( new PROPERTY<ZONE, bool>( _HKI( "Keep Out Copper Pours" ),
+                                                       &ZONE::SetDoNotAllowCopperPour,
+                                                       &ZONE::GetDoNotAllowCopperPour ),
+                             groupKeepout )
+                .SetAvailableFunc( isRuleArea );
+
+        propMgr.AddProperty( new PROPERTY<ZONE, bool>( _HKI( "Keep Out Footprints" ),
+                                                       &ZONE::SetDoNotAllowFootprints,
+                                                       &ZONE::GetDoNotAllowFootprints ),
+                             groupKeepout )
+                .SetAvailableFunc( isRuleArea );
+
+        if( ADVANCED_CFG::GetCfg().m_EnableMultichannelTool )
+        {
+            const wxString groupPlacement = _HKI( "Placement" );
+
+            propMgr.AddProperty( new PROPERTY<ZONE, bool>( _HKI( "Enable" ),
+                                                           &ZONE::SetRuleAreaPlacementEnabled,
+                                                           &ZONE::GetRuleAreaPlacementEnabled ),
+                                 groupPlacement )
+                    .SetAvailableFunc( isRuleArea );
+
+            propMgr.AddProperty( new PROPERTY_ENUM<ZONE, RULE_AREA_PLACEMENT_SOURCE_TYPE>(
+                                         _HKI( "Source Type" ),
+                                         &ZONE::SetRuleAreaPlacementSourceType,
+                                         &ZONE::GetRuleAreaPlacementSourceType ),
+                                 groupPlacement )
+                    .SetAvailableFunc( isRuleArea );
+
+            propMgr.AddProperty( new PROPERTY<ZONE, wxString>( _HKI( "Source Name" ),
+                                                               &ZONE::SetRuleAreaPlacementSource,
+                                                               &ZONE::GetRuleAreaPlacementSource ),
+                                 groupPlacement )
+                    .SetAvailableFunc( isRuleArea );
+        }
+
         const wxString groupFill = _HKI( "Fill Style" );
 
         propMgr.AddProperty( new PROPERTY_ENUM<ZONE, ZONE_FILL_MODE>( _HKI( "Fill Mode" ),
@@ -1829,7 +1888,7 @@ static struct ZONE_DESC
     }
 } _ZONE_DESC;
 
+IMPLEMENT_ENUM_TO_WXANY( RULE_AREA_PLACEMENT_SOURCE_TYPE )
 IMPLEMENT_ENUM_TO_WXANY( ZONE_CONNECTION )
 IMPLEMENT_ENUM_TO_WXANY( ZONE_FILL_MODE )
 IMPLEMENT_ENUM_TO_WXANY( ISLAND_REMOVAL_MODE )
-IMPLEMENT_ENUM_TO_WXANY( RULE_AREA_TYPE )
diff --git a/pcbnew/zone.h b/pcbnew/zone.h
index a1afea7a2e..87eb36db87 100644
--- a/pcbnew/zone.h
+++ b/pcbnew/zone.h
@@ -706,11 +706,19 @@ public:
      */
     TEARDROP_TYPE GetTeardropAreaType() const { return m_teardropType; }
 
+    /**
+     * Accessor to determine if any keepout parameters are set
+     */
+    bool HasKeepoutParametersSet() const
+    {
+        return m_doNotAllowTracks || m_doNotAllowVias || m_doNotAllowPads || m_doNotAllowFootprints
+               || m_doNotAllowCopperPour;
+    }
+
     /**
      * Accessors to parameters used in Rule Area zones:
      */
-    bool GetIsRuleArea() const           { return m_isRuleArea; }
-    RULE_AREA_TYPE GetRuleAreaType() const { return m_ruleAreaType; }
+    bool GetIsRuleArea() const { return m_isRuleArea; }
     bool GetRuleAreaPlacementEnabled() const { return m_ruleAreaPlacementEnabled ; }
     RULE_AREA_PLACEMENT_SOURCE_TYPE GetRuleAreaPlacementSourceType() const
     {
@@ -723,8 +731,7 @@ public:
     bool GetDoNotAllowPads() const       { return m_doNotAllowPads; }
     bool GetDoNotAllowFootprints() const { return m_doNotAllowFootprints; }
 
-    void SetIsRuleArea( bool aEnable )           { m_isRuleArea = aEnable; }
-    void SetRuleAreaType( RULE_AREA_TYPE aType ) { m_ruleAreaType = aType; }
+    void SetIsRuleArea( bool aEnable ) { m_isRuleArea = aEnable; }
     void SetRuleAreaPlacementEnabled( bool aEnabled ) { m_ruleAreaPlacementEnabled = aEnabled; }
     void SetRuleAreaPlacementSourceType( RULE_AREA_PLACEMENT_SOURCE_TYPE aType )
     {
@@ -841,8 +848,7 @@ protected:
     /* A zone outline can be a keepout zone.
      * It will be never filled, and DRC should test for pads, tracks and vias
      */
-    bool           m_isRuleArea;
-    RULE_AREA_TYPE m_ruleAreaType;
+    bool m_isRuleArea;
 
     /**
      * Placement rule area data
@@ -952,7 +958,7 @@ protected:
 DECLARE_ENUM_TO_WXANY( ZONE_CONNECTION )
 DECLARE_ENUM_TO_WXANY( ZONE_FILL_MODE )
 DECLARE_ENUM_TO_WXANY( ISLAND_REMOVAL_MODE )
-DECLARE_ENUM_TO_WXANY( RULE_AREA_TYPE )
+DECLARE_ENUM_TO_WXANY( RULE_AREA_PLACEMENT_SOURCE_TYPE )
 #endif
 
 #endif  // ZONE_H
diff --git a/pcbnew/zone_filler.cpp b/pcbnew/zone_filler.cpp
index 0b80f2ad6b..694df65cda 100644
--- a/pcbnew/zone_filler.cpp
+++ b/pcbnew/zone_filler.cpp
@@ -329,7 +329,7 @@ bool ZONE_FILLER::Fill( const std::vector<ZONE*>& aZones, bool aCheck, wxWindow*
             if( !zone->GetIsRuleArea() )
                 continue;
 
-            if( zone->GetRuleAreaType() != RULE_AREA_TYPE::KEEPOUT )
+            if( !zone->HasKeepoutParametersSet() )
                 continue;
 
             if( !zone->GetDoNotAllowCopperPour() )
@@ -1919,7 +1919,7 @@ bool ZONE_FILLER::fillNonCopperZone( const ZONE* aZone, PCB_LAYER_ID aLayer,
         if( !keepout->GetIsRuleArea() )
             continue;
 
-        if( keepout->GetRuleAreaType() != RULE_AREA_TYPE::KEEPOUT )
+        if( !keepout->HasKeepoutParametersSet() )
             continue;
 
         if( keepout->GetDoNotAllowCopperPour() && keepout->IsOnLayer( aLayer ) )
diff --git a/pcbnew/zone_settings.cpp b/pcbnew/zone_settings.cpp
index 7ff65dd3d6..ec9e48b027 100644
--- a/pcbnew/zone_settings.cpp
+++ b/pcbnew/zone_settings.cpp
@@ -76,7 +76,7 @@ ZONE_SETTINGS::ZONE_SETTINGS()
     m_minIslandArea = 10 * pcbIUScale.IU_PER_MM * pcbIUScale.IU_PER_MM;
 
     SetIsRuleArea( false );
-    SetRuleAreaPlacementSourceType( RULE_AREA_PLACEMENT_SOURCE_TYPE::COMPONENT_CLASS );
+    SetRuleAreaPlacementSourceType( RULE_AREA_PLACEMENT_SOURCE_TYPE::SHEETNAME );
     SetDoNotAllowCopperPour( false );
     SetDoNotAllowVias( true );
     SetDoNotAllowTracks( true );
@@ -84,7 +84,7 @@ ZONE_SETTINGS::ZONE_SETTINGS()
     SetDoNotAllowFootprints( false );
 
     m_TeardropType = TEARDROP_TYPE::TD_NONE;
-    m_ruleAreaType = RULE_AREA_TYPE::KEEPOUT; // for backwards compatibility
+    m_ruleAreaPlacementEnabled = false;
 }
 
 
@@ -111,7 +111,8 @@ bool ZONE_SETTINGS::operator==( const ZONE_SETTINGS& aOther ) const
     if( m_cornerSmoothingType         != aOther.m_cornerSmoothingType ) return false;
     if( m_cornerRadius                != aOther.m_cornerRadius ) return false;
     if( m_isRuleArea                  != aOther.m_isRuleArea ) return false;
-    if( m_ruleAreaType                != aOther.m_ruleAreaType ) return false;
+    if( m_ruleAreaPlacementEnabled != aOther.m_ruleAreaPlacementEnabled )
+        return false;
     if( m_ruleAreaPlacementSourceType != aOther.m_ruleAreaPlacementSourceType ) return false;
     if( m_ruleAreaPlacementSource     != aOther.m_ruleAreaPlacementSource ) return false;
     if( m_keepoutDoNotAllowCopperPour != aOther.m_keepoutDoNotAllowCopperPour ) return false;
@@ -157,7 +158,7 @@ ZONE_SETTINGS& ZONE_SETTINGS::operator << ( const ZONE& aSource )
     m_cornerSmoothingType         = aSource.GetCornerSmoothingType();
     m_cornerRadius                = aSource.GetCornerRadius();
     m_isRuleArea                  = aSource.GetIsRuleArea();
-    m_ruleAreaType                = aSource.GetRuleAreaType();
+    m_ruleAreaPlacementEnabled = aSource.GetRuleAreaPlacementEnabled();
     m_ruleAreaPlacementSourceType = aSource.GetRuleAreaPlacementSourceType();
     m_ruleAreaPlacementSource     = aSource.GetRuleAreaPlacementSource();
     m_keepoutDoNotAllowCopperPour = aSource.GetDoNotAllowCopperPour();
@@ -198,7 +199,7 @@ void ZONE_SETTINGS::ExportSetting( ZONE& aTarget, bool aFullExport ) const
     aTarget.SetCornerSmoothingType( m_cornerSmoothingType );
     aTarget.SetCornerRadius( m_cornerRadius );
     aTarget.SetIsRuleArea( GetIsRuleArea() );
-    aTarget.SetRuleAreaType( GetRuleAreaType() );
+    aTarget.SetRuleAreaPlacementEnabled( GetRuleAreaPlacementEnabled() );
     aTarget.SetRuleAreaPlacementSourceType( GetRuleAreaPlacementSourceType() );
     aTarget.SetRuleAreaPlacementSource( GetRuleAreaPlacementSource() );
     aTarget.SetDoNotAllowCopperPour( GetDoNotAllowCopperPour() );
diff --git a/pcbnew/zone_settings.h b/pcbnew/zone_settings.h
index 44837de99c..7ce665981e 100644
--- a/pcbnew/zone_settings.h
+++ b/pcbnew/zone_settings.h
@@ -62,12 +62,6 @@ enum class ISLAND_REMOVAL_MODE
     AREA
 };
 
-enum class RULE_AREA_TYPE
-{
-    KEEPOUT = 0,
-    PLACEMENT
-};
-
 enum class RULE_AREA_PLACEMENT_SOURCE_TYPE
 {
     SHEETNAME = 0,
@@ -137,11 +131,10 @@ private:
      */
     bool m_isRuleArea;
 
-    RULE_AREA_TYPE m_ruleAreaType;
-
     /**
      * Placement rule area data
      */
+    bool                            m_ruleAreaPlacementEnabled;
     RULE_AREA_PLACEMENT_SOURCE_TYPE m_ruleAreaPlacementSourceType;
     wxString                        m_ruleAreaPlacementSource;
 
@@ -203,11 +196,20 @@ public:
     ZONE_CONNECTION GetPadConnection() const { return m_padConnection; }
     void SetPadConnection( ZONE_CONNECTION aPadConnection ) { m_padConnection = aPadConnection; }
 
+    /**
+     * Accessor to determine if any keepout parameters are set
+     */
+    bool HasKeepoutParametersSet() const
+    {
+        return m_keepoutDoNotAllowTracks || m_keepoutDoNotAllowVias || m_keepoutDoNotAllowPads
+               || m_keepoutDoNotAllowFootprints || m_keepoutDoNotAllowCopperPour;
+    }
+
     /**
      * Accessors to parameters used in Rule Area zones:
      */
     bool GetIsRuleArea() const { return m_isRuleArea; }
-    RULE_AREA_TYPE GetRuleAreaType() const { return m_ruleAreaType; }
+    bool GetRuleAreaPlacementEnabled() const { return m_ruleAreaPlacementEnabled; }
     RULE_AREA_PLACEMENT_SOURCE_TYPE GetRuleAreaPlacementSourceType() const
     {
         return m_ruleAreaPlacementSourceType;
@@ -220,7 +222,7 @@ public:
     bool GetDoNotAllowFootprints() const { return m_keepoutDoNotAllowFootprints; }
 
     void SetIsRuleArea( bool aEnable ) { m_isRuleArea = aEnable; }
-    void SetRuleAreaType( RULE_AREA_TYPE aType ) { m_ruleAreaType = aType; }
+    void SetRuleAreaPlacementEnabled( bool aEnabled ) { m_ruleAreaPlacementEnabled = aEnabled; }
     void SetRuleAreaPlacementSourceType( RULE_AREA_PLACEMENT_SOURCE_TYPE aType )
     {
         m_ruleAreaPlacementSourceType = aType;
diff --git a/pcbnew/zones.h b/pcbnew/zones.h
index 9bee79e44d..cab6617c4a 100644
--- a/pcbnew/zones.h
+++ b/pcbnew/zones.h
@@ -70,6 +70,7 @@ inline wxString PrintZoneConnection( ZONE_CONNECTION aConnection )
 class ZONE;
 class ZONE_SETTINGS;
 class PCB_BASE_FRAME;
+class BOARD;
 
 /**
  * Function InvokeNonCopperZonesEditor
@@ -105,6 +106,6 @@ int InvokeCopperZonesEditor( PCB_BASE_FRAME* aCaller, ZONE_SETTINGS* aSettings,
  * @return int - tells if user aborted, changed only one zone, or all of them.
  */
 int InvokeRuleAreaEditor( PCB_BASE_FRAME* aCaller, ZONE_SETTINGS* aSettings,
-                          CONVERT_SETTINGS* aConvertSettings = nullptr );
+                          BOARD* aBoard = nullptr, CONVERT_SETTINGS* aConvertSettings = nullptr );
 
 #endif  // ZONES_H_
diff --git a/pcbnew/zones_functions_for_undo_redo.cpp b/pcbnew/zones_functions_for_undo_redo.cpp
index bc75f51191..aacf599188 100644
--- a/pcbnew/zones_functions_for_undo_redo.cpp
+++ b/pcbnew/zones_functions_for_undo_redo.cpp
@@ -67,29 +67,29 @@ bool ZONE::IsSame( const ZONE& aZoneToCompare )
     if( GetIsRuleArea() != aZoneToCompare.GetIsRuleArea() )
         return false;
 
-    if( GetIsRuleArea() && GetRuleAreaType() == RULE_AREA_TYPE::KEEPOUT )
-    {
-        if(  GetDoNotAllowCopperPour() != aZoneToCompare.GetDoNotAllowCopperPour() )
-            return false;
+    if( GetDoNotAllowCopperPour() != aZoneToCompare.GetDoNotAllowCopperPour() )
+        return false;
 
-        if(  GetDoNotAllowVias() != aZoneToCompare.GetDoNotAllowVias() )
-            return false;
+    if( GetDoNotAllowVias() != aZoneToCompare.GetDoNotAllowVias() )
+        return false;
 
-        if(  GetDoNotAllowTracks() != aZoneToCompare.GetDoNotAllowTracks() )
-            return false;
+    if( GetDoNotAllowTracks() != aZoneToCompare.GetDoNotAllowTracks() )
+        return false;
 
-        if(  GetDoNotAllowPads() != aZoneToCompare.GetDoNotAllowPads() )
-            return false;
+    if( GetDoNotAllowPads() != aZoneToCompare.GetDoNotAllowPads() )
+        return false;
 
-        if(  GetDoNotAllowFootprints() != aZoneToCompare.GetDoNotAllowFootprints() )
-            return false;
-    }
+    if( GetDoNotAllowFootprints() != aZoneToCompare.GetDoNotAllowFootprints() )
+        return false;
 
-    if( GetIsRuleArea() && GetRuleAreaType() == RULE_AREA_TYPE::PLACEMENT )
-    {
-        if( GetRuleAreaExpression() != aZoneToCompare.GetRuleAreaExpression() )
-            return false;
-    }
+    if( GetRuleAreaPlacementEnabled() != aZoneToCompare.GetRuleAreaPlacementEnabled() )
+        return false;
+
+    if( GetRuleAreaPlacementSourceType() != aZoneToCompare.GetRuleAreaPlacementSourceType() )
+        return false;
+
+    if( GetRuleAreaPlacementSource() != aZoneToCompare.GetRuleAreaPlacementSource() )
+        return false;
 
     if( m_ZoneClearance != aZoneToCompare.m_ZoneClearance )
         return false;