From ede5faee72e473160e8503f337fcbc2f2c018220 Mon Sep 17 00:00:00 2001
From: JamesJCode <13408010-JamesJCode@users.noreply.gitlab.com>
Date: Sun, 9 Mar 2025 20:46:34 +0000
Subject: [PATCH] Implement dynamic assignment of component classes

---
 common/CMakeLists.txt                         |    6 +-
 common/drc_rules.keywords                     |    1 +
 common/project/component_class_settings.cpp   |  393 ++
 common/project/project_file.cpp               |   14 +-
 .../dialogs/panel_assign_component_classes.h  |  434 ++
 .../panel_generate_component_classes.h        |   56 +
 include/project/component_class_settings.h    |  160 +
 include/project/project_file.h                |   10 +
 pcbnew/CMakeLists.txt                         |    8 +-
 pcbnew/board.cpp                              |   29 +-
 pcbnew/board.h                                |   11 +-
 pcbnew/board_commit.cpp                       |   36 +-
 pcbnew/component_class_manager.cpp            |  210 -
 pcbnew/component_class_manager.h              |  140 -
 pcbnew/component_classes/component_class.cpp  |  100 +
 pcbnew/component_classes/component_class.h    |  106 +
 .../component_class_assignment_rule.cpp       |   38 +
 .../component_class_assignment_rule.h         |   60 +
 .../component_class_cache_proxy.cpp           |   48 +
 .../component_class_cache_proxy.h             |   70 +
 .../component_class_manager.cpp               |  507 +++
 .../component_class_manager.h                 |  153 +
 pcbnew/dialogs/dialog_board_setup.cpp         |   22 +
 pcbnew/dialogs/dialog_board_setup.h           |    1 +
 pcbnew/dialogs/dialog_import_settings.cpp     |    3 +-
 .../dialogs/dialog_import_settings_base.cpp   |    7 +-
 .../dialogs/dialog_import_settings_base.fbp   | 2425 ++++++-----
 pcbnew/dialogs/dialog_import_settings_base.h  |    3 +-
 .../dialogs/dialog_rule_area_properties.cpp   |    4 +-
 .../panel_assign_component_classes.cpp        |  788 ++++
 .../panel_assign_component_classes_base.cpp   |  471 ++
 .../panel_assign_component_classes_base.fbp   | 3121 +++++++++++++
 .../panel_assign_component_classes_base.h     |  269 ++
 pcbnew/drc/drc_engine.cpp                     |    3 +
 pcbnew/drc/drc_rule_parser.cpp                |  150 +
 pcbnew/drc/drc_rule_parser.h                  |    6 +
 pcbnew/files.cpp                              |   11 +
 pcbnew/footprint.cpp                          |   67 +-
 pcbnew/footprint.h                            |   29 +-
 .../netlist_reader/board_netlist_updater.cpp  |   20 +-
 pcbnew/netlist_reader/netlist.cpp             |    7 +-
 pcbnew/pcb_edit_frame.cpp                     |   11 +-
 .../pcb_io/kicad_sexpr/pcb_io_kicad_sexpr.cpp |    4 +-
 .../pcb_io/kicad_sexpr/pcb_io_kicad_sexpr.h   |    8 +-
 .../kicad_sexpr/pcb_io_kicad_sexpr_parser.cpp |    3 +-
 pcbnew/pcbexpr_evaluator.cpp                  |   15 +-
 pcbnew/pcbexpr_functions.cpp                  |    1 +
 pcbnew/tools/edit_tool.cpp                    |    6 +
 pcbnew/tools/multichannel_tool.cpp            |    1 +
 pcbnew/undo_redo.cpp                          |    9 +
 qa/data/pcbnew/component_classes.kicad_pcb    | 3875 +++++++++++++++++
 qa/data/pcbnew/component_classes.kicad_pro    |  761 ++++
 qa/data/pcbnew/component_classes.kicad_sch    |  784 ++++
 qa/pcbnew_utils/board_test_utils.cpp          |   11 +
 qa/tests/pcbnew/CMakeLists.txt                |    1 +
 qa/tests/pcbnew/test_component_classes.cpp    |  159 +
 56 files changed, 14041 insertions(+), 1605 deletions(-)
 create mode 100644 common/project/component_class_settings.cpp
 create mode 100644 include/dialogs/panel_assign_component_classes.h
 create mode 100644 include/dialogs/panel_generate_component_classes.h
 create mode 100644 include/project/component_class_settings.h
 delete mode 100644 pcbnew/component_class_manager.cpp
 delete mode 100644 pcbnew/component_class_manager.h
 create mode 100644 pcbnew/component_classes/component_class.cpp
 create mode 100644 pcbnew/component_classes/component_class.h
 create mode 100644 pcbnew/component_classes/component_class_assignment_rule.cpp
 create mode 100644 pcbnew/component_classes/component_class_assignment_rule.h
 create mode 100644 pcbnew/component_classes/component_class_cache_proxy.cpp
 create mode 100644 pcbnew/component_classes/component_class_cache_proxy.h
 create mode 100644 pcbnew/component_classes/component_class_manager.cpp
 create mode 100644 pcbnew/component_classes/component_class_manager.h
 create mode 100644 pcbnew/dialogs/panel_assign_component_classes.cpp
 create mode 100644 pcbnew/dialogs/panel_assign_component_classes_base.cpp
 create mode 100644 pcbnew/dialogs/panel_assign_component_classes_base.fbp
 create mode 100644 pcbnew/dialogs/panel_assign_component_classes_base.h
 create mode 100644 qa/data/pcbnew/component_classes.kicad_pcb
 create mode 100644 qa/data/pcbnew/component_classes.kicad_pro
 create mode 100644 qa/data/pcbnew/component_classes.kicad_sch
 create mode 100644 qa/tests/pcbnew/test_component_classes.cpp

diff --git a/common/CMakeLists.txt b/common/CMakeLists.txt
index a3483eaab6..763b42f138 100644
--- a/common/CMakeLists.txt
+++ b/common/CMakeLists.txt
@@ -113,6 +113,7 @@ set( KICOMMON_SRCS
     settings/settings_manager.cpp
 
     project/board_project_settings.cpp
+    project/component_class_settings.cpp
     project/net_settings.cpp
     project/project_archiver.cpp
     project/project_file.cpp
@@ -775,7 +776,10 @@ set( PCB_COMMON_SRCS
     ${CMAKE_SOURCE_DIR}/pcbnew/teardrop/teardrop_parameters.cpp     #needed by board_design_settings.cpp
     ${CMAKE_SOURCE_DIR}/pcbnew/router/pns_meander.cpp               #needed by board_design_settings.cpp
     ${CMAKE_SOURCE_DIR}/pcbnew/board.cpp
-    ${CMAKE_SOURCE_DIR}/pcbnew/component_class_manager.cpp          #needed by board.cpp
+    ${CMAKE_SOURCE_DIR}/pcbnew/component_classes/component_class.cpp
+    ${CMAKE_SOURCE_DIR}/pcbnew/component_classes/component_class_assignment_rule.cpp
+    ${CMAKE_SOURCE_DIR}/pcbnew/component_classes/component_class_cache_proxy.cpp
+    ${CMAKE_SOURCE_DIR}/pcbnew/component_classes/component_class_manager.cpp
     ${CMAKE_SOURCE_DIR}/pcbnew/board_item.cpp
     ${CMAKE_SOURCE_DIR}/pcbnew/pcb_dimension.cpp
     ${CMAKE_SOURCE_DIR}/pcbnew/pcb_shape.cpp
diff --git a/common/drc_rules.keywords b/common/drc_rules.keywords
index a976e6e4db..884d21fd19 100644
--- a/common/drc_rules.keywords
+++ b/common/drc_rules.keywords
@@ -1,5 +1,6 @@
 annular_width
 assertion
+assign_component_class
 board_edge
 buried_via
 clearance
diff --git a/common/project/component_class_settings.cpp b/common/project/component_class_settings.cpp
new file mode 100644
index 0000000000..53f7ad0a8a
--- /dev/null
+++ b/common/project/component_class_settings.cpp
@@ -0,0 +1,393 @@
+/*
+ * This program source code file is part of KiCad, a free EDA CAD application.
+ *
+ * Copyright The KiCad Developers, see AUTHORS.txt for contributors.
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <nlohmann/json.hpp>
+
+#include <project/component_class_settings.h>
+#include <settings/parameters.h>
+
+constexpr int componentClassSettingsSchemaVersion = 0;
+
+
+COMPONENT_CLASS_SETTINGS::COMPONENT_CLASS_SETTINGS( JSON_SETTINGS*     aParent,
+                                                    const std::string& aPath ) :
+        NESTED_SETTINGS( "component_class_settings", componentClassSettingsSchemaVersion, aParent,
+                         aPath, false ),
+        m_enableSheetComponentClasses( false )
+{
+    m_params.emplace_back( new PARAM_LAMBDA<nlohmann::json>(
+            "sheet_component_classes",
+            [&]() -> nlohmann::json
+            {
+                nlohmann::json ret = {};
+
+                ret["enabled"] = m_enableSheetComponentClasses;
+
+                return ret;
+            },
+            [&]( const nlohmann::json& aJson )
+            {
+                if( !aJson.is_object() )
+                    return;
+
+                if( !aJson.contains( "enabled" ) )
+                    return;
+
+                m_enableSheetComponentClasses = aJson["enabled"].get<bool>();
+            },
+            {} ) );
+
+    m_params.emplace_back( new PARAM_LAMBDA<nlohmann::json>(
+            "assignments",
+            [&]() -> nlohmann::json
+            {
+                nlohmann::json ret = nlohmann::json::array();
+
+                for( const COMPONENT_CLASS_ASSIGNMENT_DATA& assignment :
+                     m_componentClassAssignments )
+                {
+                    ret.push_back( saveAssignment( assignment ) );
+                }
+
+                return ret;
+            },
+            [&]( const nlohmann::json& aJson )
+            {
+                if( !aJson.is_array() )
+                    return;
+
+                ClearComponentClassAssignments();
+
+                for( const auto& assignmentJson : aJson )
+                {
+                    COMPONENT_CLASS_ASSIGNMENT_DATA assignment = loadAssignment( assignmentJson );
+                    m_componentClassAssignments.push_back( assignment );
+                }
+            },
+            {} ) );
+}
+
+
+COMPONENT_CLASS_SETTINGS::~COMPONENT_CLASS_SETTINGS()
+{
+    // Release early before destroying members
+    if( m_parent )
+    {
+        m_parent->ReleaseNestedSettings( this );
+        m_parent = nullptr;
+    }
+}
+
+
+nlohmann::json
+COMPONENT_CLASS_SETTINGS::saveAssignment( const COMPONENT_CLASS_ASSIGNMENT_DATA& aAssignment )
+{
+    nlohmann::json ret;
+
+    const wxString matchOperator =
+            aAssignment.GetConditionsOperator()
+                            == COMPONENT_CLASS_ASSIGNMENT_DATA::CONDITIONS_OPERATOR::ALL
+                    ? wxT( "ALL" )
+                    : wxT( "ANY" );
+
+    ret["component_class"] = aAssignment.GetComponentClass().ToUTF8();
+    ret["conditions_operator"] = matchOperator.ToUTF8();
+
+    nlohmann::json conditionsJson;
+
+    for( const auto& [conditionType, conditionData] : aAssignment.GetConditions() )
+    {
+        nlohmann::json conditionJson;
+
+        if( !conditionData.first.empty() )
+            conditionJson["primary"] = conditionData.first;
+
+        if( !conditionData.second.empty() )
+            conditionJson["secondary"] = conditionData.second;
+
+        const wxString conditionName =
+                COMPONENT_CLASS_ASSIGNMENT_DATA::GetConditionName( conditionType );
+        conditionsJson[conditionName] = conditionJson;
+    }
+
+    ret["conditions"] = conditionsJson;
+
+    return ret;
+}
+
+
+COMPONENT_CLASS_ASSIGNMENT_DATA
+COMPONENT_CLASS_SETTINGS::loadAssignment( const nlohmann::json& aJson )
+{
+    COMPONENT_CLASS_ASSIGNMENT_DATA assignment;
+
+    assignment.SetComponentClass(
+            wxString( aJson["component_class"].get<std::string>().c_str(), wxConvUTF8 ) );
+
+    const wxString matchOperator( aJson["conditions_operator"].get<std::string>().c_str(),
+                                  wxConvUTF8 );
+
+    if( matchOperator == wxT( "ALL" ) )
+    {
+        assignment.SetConditionsOperation(
+                COMPONENT_CLASS_ASSIGNMENT_DATA::CONDITIONS_OPERATOR::ALL );
+    }
+    else
+    {
+        assignment.SetConditionsOperation(
+                COMPONENT_CLASS_ASSIGNMENT_DATA::CONDITIONS_OPERATOR::ANY );
+    }
+
+    for( const auto& [conditionTypeStr, conditionData] : aJson["conditions"].items() )
+    {
+        wxString                                        primary, secondary;
+        COMPONENT_CLASS_ASSIGNMENT_DATA::CONDITION_TYPE conditionType =
+                COMPONENT_CLASS_ASSIGNMENT_DATA::GetConditionType( conditionTypeStr );
+
+        if( conditionData.contains( "primary" ) )
+            primary = wxString( conditionData["primary"].get<std::string>().c_str(), wxConvUTF8 );
+
+        if( conditionData.contains( "secondary" ) )
+            secondary =
+                    wxString( conditionData["secondary"].get<std::string>().c_str(), wxConvUTF8 );
+
+        assignment.SetCondition( conditionType, primary, secondary );
+    }
+
+    return assignment;
+}
+
+
+bool COMPONENT_CLASS_SETTINGS::operator==( const COMPONENT_CLASS_SETTINGS& aOther ) const
+{
+    // TODO: Implement this
+    throw;
+    //return true;
+}
+
+
+/**************************************************************************************************
+ *
+ * COMPONENT_CLASS_ASSIGNMENT_DATA implementation
+ *
+ *************************************************************************************************/
+
+wxString COMPONENT_CLASS_ASSIGNMENT_DATA::GetConditionName( const CONDITION_TYPE aCondition )
+{
+    switch( aCondition )
+    {
+    case CONDITION_TYPE::REFERENCE: return wxT( "REFERENCE" );
+    case CONDITION_TYPE::FOOTPRINT: return wxT( "FOOTPRINT" );
+    case CONDITION_TYPE::SIDE: return wxT( "SIDE" );
+    case CONDITION_TYPE::ROTATION: return wxT( "ROTATION" );
+    case CONDITION_TYPE::FOOTPRINT_FIELD: return wxT( "FOOTPRINT_FIELD" );
+    case CONDITION_TYPE::CUSTOM: return wxT( "CUSTOM" );
+    case CONDITION_TYPE::SHEET_NAME: return wxT( "SHEET_NAME" );
+    }
+
+    wxASSERT_MSG( false, "Invalid condition type" );
+
+    return wxEmptyString;
+}
+
+
+COMPONENT_CLASS_ASSIGNMENT_DATA::CONDITION_TYPE
+COMPONENT_CLASS_ASSIGNMENT_DATA::GetConditionType( const wxString& aCondition )
+{
+    if( aCondition == wxT( "REFERENCE" ) )
+        return CONDITION_TYPE::REFERENCE;
+    if( aCondition == wxT( "FOOTPRINT" ) )
+        return CONDITION_TYPE::FOOTPRINT;
+    if( aCondition == wxT( "SIDE" ) )
+        return CONDITION_TYPE::SIDE;
+    if( aCondition == wxT( "ROTATION" ) )
+        return CONDITION_TYPE::ROTATION;
+    if( aCondition == wxT( "FOOTPRINT_FIELD" ) )
+        return CONDITION_TYPE::FOOTPRINT_FIELD;
+    if( aCondition == wxT( "CUSTOM" ) )
+        return CONDITION_TYPE::CUSTOM;
+    if( aCondition == wxT( "SHEET_NAME" ) )
+        return CONDITION_TYPE::SHEET_NAME;
+
+    wxASSERT_MSG( false, "Invalid condition type" );
+
+    return CONDITION_TYPE::REFERENCE;
+}
+
+
+wxString COMPONENT_CLASS_ASSIGNMENT_DATA::GetAssignmentInDRCLanguage() const
+{
+    if( m_componentClass.empty() )
+        return wxEmptyString;
+
+    if( m_conditions.empty() )
+    {
+        // A condition which always applies the netclass
+        return wxString::Format( wxT( "(version 1) (assign_component_class \"%s\")" ),
+                                 m_componentClass );
+    }
+
+    // Lambda to format a comma-separated list of references in to a DRC expression
+    auto getRefExpr = []( wxString aRefs ) -> wxString
+    {
+        aRefs.Trim( true ).Trim( false );
+
+        wxArrayString refs = wxSplit( aRefs, ',' );
+
+        if( refs.empty() )
+            return wxEmptyString;
+
+        std::ranges::transform( refs, refs.begin(),
+                                []( const wxString& aRef )
+                                {
+                                    return wxString::Format( wxT( "A.Reference == '%s'" ), aRef );
+                                } );
+
+        wxString refsExpr = refs[0];
+
+        if( refs.size() > 1 )
+        {
+            for( auto itr = refs.begin() + 1; itr != refs.end(); ++itr )
+                refsExpr = refsExpr + wxT( " || " ) + *itr;
+        }
+
+        return wxString::Format( wxT( "( %s )" ), refsExpr );
+    };
+
+    // Lambda to format a footprint match DRC expression
+    auto getFootprintExpr = []( wxString aFootprint ) -> wxString
+    {
+        aFootprint.Trim( true ).Trim( false );
+
+        if( aFootprint.empty() )
+            return wxEmptyString;
+
+        return wxString::Format( wxT( "( A.Library_Link == '%s' )" ), aFootprint );
+    };
+
+    // Lambda to format a layer side DRC expression
+    auto getSideExpr = []( const wxString& aSide ) -> wxString
+    {
+        if( aSide == wxT( "Any" ) )
+            return wxEmptyString;
+
+        return wxString::Format( wxT( "( A.Layer == '%s' )" ),
+                                 aSide == wxT( "Front" ) ? wxT( "F.Cu" ) : wxT( "B.Cu" ) );
+    };
+
+    // Lambda to format a rotation DRC expression
+    auto getRotationExpr = []( wxString aRotation ) -> wxString
+    {
+        aRotation.Trim( true ).Trim( false );
+
+        int dummy;
+
+        if( aRotation.empty() || aRotation == wxT( "Any" ) || !aRotation.ToInt( &dummy ) )
+            return wxEmptyString;
+
+        return wxString::Format( wxT( "( A.Orientation == %s deg )" ), aRotation );
+    };
+
+
+    // Lambda to format a footprint field DRC expression
+    auto getFootprintFieldExpr = []( wxString aFieldName, wxString aFieldMatch ) -> wxString
+    {
+        aFieldName.Trim( true ).Trim( false );
+        aFieldMatch.Trim( true ).Trim( false );
+
+        if( aFieldName.empty() || aFieldMatch.empty() )
+            return wxEmptyString;
+
+        return wxString::Format( wxT( "( A.getField('%s') == '%s' )" ), aFieldName, aFieldMatch );
+    };
+
+    // Lambda to format a custom DRC expression
+    auto getCustomFieldExpr = []( wxString aExpr ) -> wxString
+    {
+        aExpr.Trim( true ).Trim( false );
+
+        if( aExpr.empty() )
+            return wxEmptyString;
+
+        return wxString::Format( wxT( "( %s )" ), aExpr );
+    };
+
+    // Lambda to format a sheet name expression
+    auto getSheetNameExpr = []( wxString aSheetName ) -> wxString
+    {
+        aSheetName.Trim( true ).Trim( false );
+
+        if( aSheetName.empty() )
+            return wxEmptyString;
+
+        return wxString::Format( wxT( "( A.memberOfSheet('%s') )" ), aSheetName );
+    };
+
+    std::vector<wxString> conditionsExprs;
+
+    for( auto& [conditionType, conditionData] : m_conditions )
+    {
+        wxString conditionExpr;
+
+        switch( conditionType )
+        {
+        case CONDITION_TYPE::REFERENCE: conditionExpr = getRefExpr( conditionData.first ); break;
+        case CONDITION_TYPE::FOOTPRINT:
+            conditionExpr = getFootprintExpr( conditionData.first );
+            break;
+        case CONDITION_TYPE::SIDE: conditionExpr = getSideExpr( conditionData.first ); break;
+        case CONDITION_TYPE::ROTATION:
+            conditionExpr = getRotationExpr( conditionData.first );
+            break;
+        case CONDITION_TYPE::FOOTPRINT_FIELD:
+            conditionExpr = getFootprintFieldExpr( conditionData.first, conditionData.second );
+            break;
+        case CONDITION_TYPE::CUSTOM:
+            conditionExpr = getCustomFieldExpr( conditionData.first );
+            break;
+        case CONDITION_TYPE::SHEET_NAME:
+            conditionExpr = getSheetNameExpr( conditionData.first );
+            break;
+        }
+
+        if( !conditionExpr.empty() )
+            conditionsExprs.push_back( conditionExpr );
+    }
+
+    if( conditionsExprs.empty() )
+        return wxString::Format( wxT( "(version 1) (assign_component_class \"%s\")" ),
+                                 m_componentClass );
+
+    wxString allConditionsExpr = conditionsExprs[0];
+
+    if( conditionsExprs.size() > 1 )
+    {
+        wxString operatorExpr =
+                m_conditionsOperator == CONDITIONS_OPERATOR::ALL ? wxT( " && " ) : wxT( " || " );
+
+        for( auto itr = conditionsExprs.begin() + 1; itr != conditionsExprs.end(); ++itr )
+        {
+            allConditionsExpr = allConditionsExpr + operatorExpr + *itr;
+        }
+    }
+
+    return wxString::Format(
+            wxT( "(version 1) (assign_component_class \"%s\" (condition \"%s\" ) )" ),
+            m_componentClass, allConditionsExpr );
+}
diff --git a/common/project/project_file.cpp b/common/project/project_file.cpp
index 766448ab77..2a4d85adee 100644
--- a/common/project/project_file.cpp
+++ b/common/project/project_file.cpp
@@ -20,10 +20,10 @@
  */
 
 #include <project.h>
+#include <project/component_class_settings.h>
 #include <project/net_settings.h>
 #include <settings/json_settings_internals.h>
 #include <project/project_file.h>
-#include <settings/common_settings.h>
 #include <settings/parameters.h>
 #include <wildcards_and_files_ext.h>
 #include <wx/config.h>
@@ -36,13 +36,8 @@ const int projectFileSchemaVersion = 3;
 
 PROJECT_FILE::PROJECT_FILE( const wxString& aFullPath ) :
         JSON_SETTINGS( aFullPath, SETTINGS_LOC::PROJECT, projectFileSchemaVersion ),
-        m_ErcSettings( nullptr ),
-        m_SchematicSettings( nullptr ),
-        m_BoardSettings(),
-        m_sheets(),
-        m_boards(),
-        m_project( nullptr ),
-        m_wasMigrated( false )
+        m_ErcSettings( nullptr ), m_SchematicSettings( nullptr ), m_BoardSettings(),
+        m_project( nullptr ), m_wasMigrated( false )
 {
     // Keep old files around
     m_deleteLegacyAfterMigration = false;
@@ -119,6 +114,9 @@ PROJECT_FILE::PROJECT_FILE( const wxString& aFullPath ) :
 
     m_NetSettings = std::make_shared<NET_SETTINGS>( this, "net_settings" );
 
+    m_ComponentClassSettings =
+            std::make_shared<COMPONENT_CLASS_SETTINGS>( this, "component_class_settings" );
+
     m_params.emplace_back( new PARAM_LAYER_PRESET( "board.layer_presets", &m_LayerPresets ) );
 
     m_params.emplace_back( new PARAM_VIEWPORT( "board.viewports", &m_Viewports ) );
diff --git a/include/dialogs/panel_assign_component_classes.h b/include/dialogs/panel_assign_component_classes.h
new file mode 100644
index 0000000000..0fc7ff95fb
--- /dev/null
+++ b/include/dialogs/panel_assign_component_classes.h
@@ -0,0 +1,434 @@
+/*
+ * This program source code file is part of KiCad, a free EDA CAD application.
+ *
+ * Copyright The KiCad Developers, see AUTHORS.txt for contributors.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, you may find one here:
+ * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
+ * or you may search the http://www.gnu.org website for the version 2 license,
+ * or you may write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+ */
+
+
+#ifndef PANEL_ASSIGN_COMPONENT_CLASSES_H
+#define PANEL_ASSIGN_COMPONENT_CLASSES_H
+
+
+#include <panel_assign_component_classes_base.h>
+
+#include <unordered_set>
+#include <vector>
+
+#include <dialog_shim.h>
+#include <pcb_edit_frame.h>
+#include <project/component_class_settings.h>
+
+
+/**************************************************************************************************
+ *
+ * PANEL_ASSIGN_COMPONENT_CLASSES
+ *
+ *************************************************************************************************/
+
+/**
+ * Top-level panel for dynamic component class assignment configuration. Nests a
+ * PANEL_COMPONENT_CLASS_ASSIGNMENT panel for each set of component class assignment conditions
+ */
+class PANEL_COMPONENT_CLASS_ASSIGNMENT;
+
+class PANEL_ASSIGN_COMPONENT_CLASSES : public PANEL_ASSIGN_COMPONENT_CLASSES_BASE
+{
+public:
+    PANEL_ASSIGN_COMPONENT_CLASSES( wxWindow* aParentWindow, PCB_EDIT_FRAME* aFrame,
+                                    std::shared_ptr<COMPONENT_CLASS_SETTINGS> aSettings,
+                                    DIALOG_SHIM*                              aDlg );
+
+    ~PANEL_ASSIGN_COMPONENT_CLASSES() override;
+
+    /// Loads current component class assignments from the board settings
+    bool TransferDataToWindow() override;
+
+    /// Saves the component class assignments to the board settings
+    bool TransferDataFromWindow() override;
+
+    /// Loads component class assignments from the given settings object
+    void ImportSettingsFrom( const std::shared_ptr<COMPONENT_CLASS_SETTINGS>& aOtherSettings );
+
+    /// Adds a new component class assignment rule
+    void OnAddAssignmentClick( wxCommandEvent& event ) override;
+
+    /// Removes a given component class assignment rule
+    void RemoveAssignment( PANEL_COMPONENT_CLASS_ASSIGNMENT* aPanel );
+
+    /// Returns references for all currently selected footprints
+    const std::vector<wxString>& GetSelectionRefs() const { return m_selectionRefs; }
+
+    /// Returns names of all fields present in footprints
+    const std::vector<wxString>& GetFieldNames() const { return m_fieldNames; }
+
+    /// Returns names of all sheets present in footprints
+    const std::vector<wxString>& GetSheetNames() const { return m_sheetNames; }
+
+    /// Gets the active edit frame
+    PCB_EDIT_FRAME* GetFrame() const { return m_frame; }
+
+    /// Validates that all assignment rules can compile successfully
+    bool Validate() override;
+
+private:
+    /// Adds a new component class assignment rule
+    PANEL_COMPONENT_CLASS_ASSIGNMENT* addAssignment();
+
+    /// Scrolls the panel to specified assignment rule
+    void scrollToAssignment( const PANEL_COMPONENT_CLASS_ASSIGNMENT* aAssignment ) const;
+
+    /// The parent dialog
+    DIALOG_SHIM* m_dlg;
+
+    /// The active edit frame
+    PCB_EDIT_FRAME* m_frame;
+
+    /// Vector of all currently displayed assignment rules
+    std::vector<PANEL_COMPONENT_CLASS_ASSIGNMENT*> m_assignments;
+
+    /// The active settings object
+    std::shared_ptr<COMPONENT_CLASS_SETTINGS> m_componentClassSettings;
+
+    /// All currently selected footprint references
+    std::vector<wxString> m_selectionRefs;
+
+    /// All footprint fields names present on the board
+    std::vector<wxString> m_fieldNames;
+
+    /// All sheet names present on the board
+    std::vector<wxString> m_sheetNames;
+
+    /// The list of all currently present component class assignments
+    wxBoxSizer* m_assignmentsList;
+};
+
+
+/**************************************************************************************************
+ *
+ * CONDITION_DATA
+ *
+ *************************************************************************************************/
+
+/**
+ * Class used to provide a unified interface from condition panels
+ * Handles determining the type of condition in use, and getting and settings the field data
+ */
+class CONDITION_DATA
+{
+public:
+    CONDITION_DATA( const COMPONENT_CLASS_ASSIGNMENT_DATA::CONDITION_TYPE aCondition,
+                    wxTextEntry* aPrimary, wxTextEntry* aSecondary = nullptr ) :
+            m_conditionType( aCondition ), m_primaryCtrl( aPrimary ), m_secondaryCtrl( aSecondary )
+    {
+    }
+
+    virtual ~CONDITION_DATA() {};
+
+    /// Gets the type of condition (e.g. Reference, Side) this data represents
+    virtual COMPONENT_CLASS_ASSIGNMENT_DATA::CONDITION_TYPE GetConditionType() const
+    {
+        return m_conditionType;
+    }
+
+    /// Gets the primary data member for the condition (e.g. Reference, Side)
+    virtual wxString GetPrimaryField() const;
+
+    /// Sets the primary data member for the condition (e.g. Reference, Side)
+    virtual void SetPrimaryField( const wxString& aVal );
+
+    /// Gets the primary data member for the condition (e.g. FOOTPRITNT field  value)
+    virtual wxString GetSecondaryField() const;
+
+    /// Sets the primary data member for the condition (e.g. FOOTPRITNT field
+    /// value)
+    virtual void SetSecondaryField( const wxString& aVal );
+
+private:
+    /// The type of condition being referenced
+    COMPONENT_CLASS_ASSIGNMENT_DATA::CONDITION_TYPE m_conditionType;
+
+    /// The primary data field in the condition panel
+    wxTextEntry* m_primaryCtrl;
+
+    /// The Secondary data field in the condition panel
+    wxTextEntry* m_secondaryCtrl;
+};
+
+
+/**************************************************************************************************
+ *
+ * PANEL_COMPONENT_CLASS_ASSIGNMENT
+ *
+ *************************************************************************************************/
+
+/**
+* Panel which configures a set of conditions for a component class assignment rule
+*/
+class PANEL_COMPONENT_CLASS_ASSIGNMENT : public PANEL_COMPONENT_CLASS_ASSIGNMENT_BASE
+{
+public:
+    /// IDs for match type popup menu
+    enum ADD_MATCH_POPUP
+    {
+        ID_REFERENCE = wxID_HIGHEST + 1,
+        ID_FOOTPRINT,
+        ID_SIDE,
+        ID_ROTATION,
+        ID_FOOTPRINT_FIELD,
+        ID_SHEET_NAME,
+        ID_CUSTOM
+    };
+
+    PANEL_COMPONENT_CLASS_ASSIGNMENT( wxWindow*                       aParent,
+                                      PANEL_ASSIGN_COMPONENT_CLASSES* aPanelParent,
+                                      DIALOG_SHIM*                    aDlg );
+    ~PANEL_COMPONENT_CLASS_ASSIGNMENT();
+
+    /// Deletes this component class assignment rule
+    void OnDeleteAssignmentClick( wxCommandEvent& event ) override;
+
+    /// Adds a match condition to this component class assignment rule
+    void OnAddConditionClick( wxCommandEvent& event ) override;
+
+    /// Highlights footprints matching this set of conditions
+    void OnHighlightItemsClick( wxCommandEvent& event ) override;
+
+    /// Adds a condition to this component class assignment rule
+    CONDITION_DATA* AddCondition( COMPONENT_CLASS_ASSIGNMENT_DATA::CONDITION_TYPE aCondition );
+
+    /// Removes a given condition from this component class assignment rule (note: called from the child
+    /// condition panel)
+    void RemoveCondition( wxPanel* aMatch );
+
+    const std::vector<CONDITION_DATA*>& GetConditions() const { return m_matches; }
+
+    /// Sets the resulting component class for this assignment
+    void SetComponentClass( const wxString& aComponentClass ) const;
+
+    /// Gets the resulting component class for this assignment
+    const wxString GetComponentClass() const;
+
+    /// Sets the boolean operator applied to all assignment conditions
+    void
+    SetConditionsOperator( COMPONENT_CLASS_ASSIGNMENT_DATA::CONDITIONS_OPERATOR aCondition ) const;
+
+    /// Gets the boolean operator applied to all assignment conditions
+    COMPONENT_CLASS_ASSIGNMENT_DATA::CONDITIONS_OPERATOR GetConditionsOperator() const;
+
+    /// Converts the UI representation in to the internal assignment data representation
+    COMPONENT_CLASS_ASSIGNMENT_DATA GenerateAssignmentData() const;
+
+protected:
+    /// Handles add match condition popup menu selections
+    void onMenu( wxCommandEvent& aEvent );
+
+    /// The top-level configuration panel which owns this assignment rule
+    PANEL_ASSIGN_COMPONENT_CLASSES* m_parentPanel;
+
+    /// The sizer containing match condition panels
+    wxStaticBoxSizer* m_matchesList;
+
+    /// Set containing all currently configured match condition types
+    std::unordered_set<COMPONENT_CLASS_ASSIGNMENT_DATA::CONDITION_TYPE> m_conditionTypes;
+
+    /// The parent configuration dialog
+    DIALOG_SHIM* m_dlg;
+
+    /// All match conditions for this component class assignment rule
+    std::vector<CONDITION_DATA*> m_matches;
+};
+
+
+/**************************************************************************************************
+ *
+ * PANEL_COMPONENT_CLASS_CONDITION_REFERENCE
+ *
+ *************************************************************************************************/
+
+/**
+ * Configures matching based on footprint reference
+ */
+class PANEL_COMPONENT_CLASS_CONDITION_REFERENCE
+        : public PANEL_COMPONENT_CLASS_CONDITION_REFERENCE_BASE,
+          public CONDITION_DATA
+{
+public:
+    /// IDs for match type popup menu
+    enum IMPORT_POPUP_IDS
+    {
+        ID_IMPORT_REFS = wxID_HIGHEST + 1
+    };
+
+    explicit PANEL_COMPONENT_CLASS_CONDITION_REFERENCE( wxWindow* aParent );
+
+    void OnDeleteConditionClick( wxCommandEvent& event ) override;
+
+    void OnImportRefsClick( wxCommandEvent& event ) override;
+    void SetSelectionRefs( const std::vector<wxString>& aRefs ) { m_selectionRefs = aRefs; }
+
+protected:
+    /// Handles import references popup menu selections
+    void onMenu( wxCommandEvent& aEvent );
+
+    PANEL_COMPONENT_CLASS_ASSIGNMENT* m_panelParent;
+    std::vector<wxString>             m_selectionRefs;
+};
+
+
+/**************************************************************************************************
+ *
+ * PANEL_COMPONENT_CLASS_CONDITION_FOOTPRINT
+ *
+ *************************************************************************************************/
+
+/**
+ * Configures matching based on footprint library identifier
+ */
+class PANEL_COMPONENT_CLASS_CONDITION_FOOTPRINT
+        : public PANEL_COMPONENT_CLASS_CONDITION_FOOTPRINT_BASE,
+          public CONDITION_DATA
+{
+public:
+    explicit PANEL_COMPONENT_CLASS_CONDITION_FOOTPRINT( wxWindow* aParent, DIALOG_SHIM* aDlg );
+
+    void OnDeleteConditionClick( wxCommandEvent& event ) override;
+    void OnShowLibraryClick( wxCommandEvent& event ) override;
+
+protected:
+    PANEL_COMPONENT_CLASS_ASSIGNMENT* m_panelParent;
+    DIALOG_SHIM* m_dlg;
+};
+
+
+/**************************************************************************************************
+ *
+ * PANEL_COMPONENT_CLASS_CONDITION_SIDE
+ *
+ *************************************************************************************************/
+
+/**
+ * Configures matching based on which side of the board a footprint is on
+ */
+class PANEL_COMPONENT_CLASS_CONDITION_SIDE : public PANEL_COMPONENT_CLASS_CONDITION_SIDE_BASE,
+                                             public CONDITION_DATA
+{
+public:
+    explicit PANEL_COMPONENT_CLASS_CONDITION_SIDE( wxWindow* aParent );
+
+    void OnDeleteConditionClick( wxCommandEvent& event ) override;
+
+protected:
+    PANEL_COMPONENT_CLASS_ASSIGNMENT* m_panelParent;
+};
+
+
+/**************************************************************************************************
+ *
+ * PANEL_COMPONENT_CLASS_CONDITION_ROTATION
+ *
+ *************************************************************************************************/
+
+/**
+ * Configures matching based on footprint rotation
+ */
+class PANEL_COMPONENT_CLASS_CONDITION_ROTATION
+        : public PANEL_COMPONENT_CLASS_CONDITION_ROTATION_BASE,
+          public CONDITION_DATA
+{
+public:
+    explicit PANEL_COMPONENT_CLASS_CONDITION_ROTATION( wxWindow* aParent );
+
+    void OnDeleteConditionClick( wxCommandEvent& event ) override;
+
+protected:
+    PANEL_COMPONENT_CLASS_ASSIGNMENT* m_panelParent;
+};
+
+
+/**************************************************************************************************
+ *
+ * PANEL_COMPONENT_CLASS_CONDITION_FIELD
+ *
+ *************************************************************************************************/
+
+/**
+ * Configures matching based on footprint field contents
+ */
+class PANEL_COMPONENT_CLASS_CONDITION_FIELD : public PANEL_COMPONENT_CLASS_CONDITION_FIELD_BASE,
+                                              public CONDITION_DATA
+{
+public:
+    explicit PANEL_COMPONENT_CLASS_CONDITION_FIELD( wxWindow* aParent );
+
+    void OnDeleteConditionClick( wxCommandEvent& event ) override;
+
+    void SetFieldsList( const std::vector<wxString>& aFields );
+
+protected:
+    PANEL_COMPONENT_CLASS_ASSIGNMENT* m_panelParent;
+};
+
+
+/**************************************************************************************************
+ *
+ * PANEL_COMPONENT_CLASS_CONDITION_CUSTOM
+ *
+ *************************************************************************************************/
+
+/**
+ * Configures matching based on a custom DRC expression
+ */
+class PANEL_COMPONENT_CLASS_CONDITION_CUSTOM : public PANEL_COMPONENT_CLASS_CONDITION_CUSTOM_BASE,
+                                               public CONDITION_DATA
+{
+public:
+    explicit PANEL_COMPONENT_CLASS_CONDITION_CUSTOM( wxWindow* aParent );
+
+    void OnDeleteConditionClick( wxCommandEvent& event ) override;
+
+protected:
+    PANEL_COMPONENT_CLASS_ASSIGNMENT* m_panelParent;
+};
+
+
+/**************************************************************************************************
+ *
+ * PANEL_COMPONENT_CLASS_SHEET
+ *
+ *************************************************************************************************/
+
+/**
+ * Configures matching based on a custom DRC expression
+ */
+class PANEL_COMPONENT_CLASS_CONDITION_SHEET : public PANEL_COMPONENT_CLASS_CONDITION_SHEET_BASE,
+                                              public CONDITION_DATA
+{
+public:
+    explicit PANEL_COMPONENT_CLASS_CONDITION_SHEET( wxWindow* aParent );
+
+    void OnDeleteConditionClick( wxCommandEvent& event ) override;
+
+    void SetSheetsList( const std::vector<wxString>& aSheets );
+
+protected:
+    PANEL_COMPONENT_CLASS_ASSIGNMENT* m_panelParent;
+};
+
+#endif //PANEL_ASSIGN_COMPONENT_CLASSES_H
diff --git a/include/dialogs/panel_generate_component_classes.h b/include/dialogs/panel_generate_component_classes.h
new file mode 100644
index 0000000000..57e876f629
--- /dev/null
+++ b/include/dialogs/panel_generate_component_classes.h
@@ -0,0 +1,56 @@
+/*
+ * This program source code file is part of KiCad, a free EDA CAD application.
+ *
+ * Copyright The KiCad Developers, see AUTHORS.txt for contributors.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, you may find one here:
+ * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
+ * or you may search the http://www.gnu.org website for the version 2 license,
+ * or you may write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+ */
+
+
+#ifndef PANEL_GENERATE_COMPONENT_CLASSES_H
+#define PANEL_GENERATE_COMPONENT_CLASSES_H
+
+#include <panel_generate_component_classes_base.h>
+
+#include <eda_draw_frame.h>
+#include <project/component_class_settings.h>
+#include <vector>
+
+
+class PANEL_GENERATE_COMPONENT_CLASSES : public PANEL_GENERATE_COMPONENT_CLASSES_BASE
+{
+public:
+    PANEL_GENERATE_COMPONENT_CLASSES( wxWindow* aParentWindow, EDA_DRAW_FRAME* aFrame,
+                                      std::shared_ptr<COMPONENT_CLASS_SETTINGS> aSettings,
+                                      std::vector<wxString>&                    aSelectionRefs );
+
+    bool TransferDataToWindow() override;
+    bool TransferDataFromWindow() override;
+
+    bool Validate() override;
+
+    //void ImportSettingsFrom( const std::shared_ptr<NET_SETTINGS>& aNetSettings );
+
+protected:
+    EDA_DRAW_FRAME*                           m_frame;
+    std::shared_ptr<COMPONENT_CLASS_SETTINGS> m_componentClassSettings;
+
+    std::vector<wxString> m_selectionRefs;
+};
+
+#endif //PANEL_GENERATE_COMPONENT_CLASSES
diff --git a/include/project/component_class_settings.h b/include/project/component_class_settings.h
new file mode 100644
index 0000000000..88d265a97d
--- /dev/null
+++ b/include/project/component_class_settings.h
@@ -0,0 +1,160 @@
+/*
+ * This program source code file is part of KiCad, a free EDA CAD application.
+ *
+ * Copyright The KiCad Developers, see AUTHORS.txt for contributors.
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef PROJECT_COMPONENT_CLASS_SETTINGS_H
+#define PROJECT_COMPONENT_CLASS_SETTINGS_H
+
+#include <vector>
+#include <unordered_map>
+
+#include <settings/nested_settings.h>
+
+
+class KICOMMON_API COMPONENT_CLASS_ASSIGNMENT_DATA
+{
+public:
+    /// A condition match type
+    enum class CONDITION_TYPE
+    {
+        REFERENCE,
+        FOOTPRINT,
+        SIDE,
+        ROTATION,
+        FOOTPRINT_FIELD,
+        CUSTOM,
+        SHEET_NAME
+    };
+
+    /// Whether conditions are applied with OR or AND logic
+    enum class CONDITIONS_OPERATOR
+    {
+        ALL,
+        ANY
+    };
+
+    /// Sets the given condition type with the assocated match data
+    void SetCondition( const CONDITION_TYPE aCondition, const wxString& aPrimaryData,
+                       const wxString& aSecondaryData )
+    {
+        m_conditions[aCondition] = { aPrimaryData, aSecondaryData };
+    }
+
+    /// Gets all conditions
+    const std::unordered_map<CONDITION_TYPE, std::pair<wxString, wxString>>& GetConditions() const
+    {
+        return m_conditions;
+    }
+
+    /// Sets the resulting component class for matching footprints
+    void SetComponentClass( const wxString& aComponentClass )
+    {
+        m_componentClass = aComponentClass;
+    }
+
+    /// Gets the resulting component class for matching footprints
+    const wxString& GetComponentClass() const { return m_componentClass; }
+
+    /// Sets the boolean operation in use for all conditions
+    void SetConditionsOperation( const CONDITIONS_OPERATOR aOperator )
+    {
+        m_conditionsOperator = aOperator;
+    }
+
+    /// Gets the boolean operation in use for all conditions
+    CONDITIONS_OPERATOR GetConditionsOperator() const { return m_conditionsOperator; }
+
+    /// Maps a CONDITION_TYPE to a descriptive string
+    static wxString GetConditionName( const CONDITION_TYPE aCondition );
+
+    /// Maps a descriptive string to a CONDITION_TYPE
+    static CONDITION_TYPE GetConditionType( const wxString& aCondition );
+
+    /// Returns the DRC rules language for this component class assignment
+    wxString GetAssignmentInDRCLanguage() const;
+
+protected:
+    /// The name of the component class for this assignment rule
+    wxString m_componentClass;
+
+    /// Map of condition types to primary and secondary data fields for the condition
+    std::unordered_map<CONDITION_TYPE, std::pair<wxString, wxString>> m_conditions;
+
+    /// Whether conditions are applied with AND or OR logic
+    /// Defaults to ALL
+    CONDITIONS_OPERATOR m_conditionsOperator{ CONDITIONS_OPERATOR::ALL };
+};
+
+
+/**
+ * COMPONENT_CLASS_SETTINGS stores data for component classes, including rules for automatic
+ * generation of component classes.
+ */
+class KICOMMON_API COMPONENT_CLASS_SETTINGS : public NESTED_SETTINGS
+{
+public:
+    COMPONENT_CLASS_SETTINGS( JSON_SETTINGS* aParent, const std::string& aPath );
+
+    virtual ~COMPONENT_CLASS_SETTINGS();
+
+    /// Sets whether component classes should be generated for components in hierarchical sheets
+    void SetEnableSheetComponentClasses( bool aEnabled )
+    {
+        m_enableSheetComponentClasses = aEnabled;
+    }
+
+    /// Gets whether component classes should be generated for components in hierarchical sheets
+    bool GetEnableSheetComponentClasses() const { return m_enableSheetComponentClasses; }
+
+    /// Clear all dynamic component class assignments
+    void ClearComponentClassAssignments() { m_componentClassAssignments.clear(); }
+
+    /// Gets all dynamic component class assignments
+    const std::vector<COMPONENT_CLASS_ASSIGNMENT_DATA>& GetComponentClassAssignments() const
+    {
+        return m_componentClassAssignments;
+    }
+
+    // Adds a dynamic component class assignment
+    void AddComponentClassAssignment( const COMPONENT_CLASS_ASSIGNMENT_DATA& aAssignment )
+    {
+        m_componentClassAssignments.push_back( aAssignment );
+    }
+
+    bool operator==( const COMPONENT_CLASS_SETTINGS& aOther ) const;
+
+    bool operator!=( const COMPONENT_CLASS_SETTINGS& aOther ) const
+    {
+        return !operator==( aOther );
+    }
+
+private:
+    /// Toggle generation of component classes for hierarchical sheets
+    bool m_enableSheetComponentClasses;
+
+    /// All dynamic component class assignment rules
+    std::vector<COMPONENT_CLASS_ASSIGNMENT_DATA> m_componentClassAssignments;
+
+    /// Saves a dynamic component class assignment to JSON
+    static nlohmann::json saveAssignment( const COMPONENT_CLASS_ASSIGNMENT_DATA& aAssignment );
+
+    /// Loads a dynamic component class assignment from JSON
+    static COMPONENT_CLASS_ASSIGNMENT_DATA loadAssignment( const nlohmann::json& aJson );
+};
+
+#endif // PROJECT_COMPONENT_CLASS_SETTINGS_H
diff --git a/include/project/project_file.h b/include/project/project_file.h
index ba55a34292..9ea2303ed0 100644
--- a/include/project/project_file.h
+++ b/include/project/project_file.h
@@ -31,6 +31,7 @@
 class BOARD_DESIGN_SETTINGS;
 class ERC_SETTINGS;
 class NET_SETTINGS;
+class COMPONENT_CLASS_SETTINGS;
 class LAYER_PAIR_SETTINGS;
 class SCHEMATIC_SETTINGS;
 class TEMPLATES;
@@ -105,6 +106,11 @@ public:
         return m_NetSettings;
     }
 
+    std::shared_ptr<COMPONENT_CLASS_SETTINGS>& ComponentClassSettings()
+    {
+        return m_ComponentClassSettings;
+    }
+
     /**
      * @return true if it should be safe to auto-save this file without user action
      */
@@ -182,6 +188,10 @@ public:
      */
     std::shared_ptr<NET_SETTINGS> m_NetSettings;
 
+    /**
+     * Component class settings for the project (owned here)
+     */
+    std::shared_ptr<COMPONENT_CLASS_SETTINGS> m_ComponentClassSettings;
 
     std::vector<LAYER_PRESET>     m_LayerPresets;   /// List of stored layer presets
     std::vector<VIEWPORT>         m_Viewports;      /// List of stored viewports (pos + zoom)
diff --git a/pcbnew/CMakeLists.txt b/pcbnew/CMakeLists.txt
index bbc6f67a0e..fd553b4bf8 100644
--- a/pcbnew/CMakeLists.txt
+++ b/pcbnew/CMakeLists.txt
@@ -181,6 +181,8 @@ set( PCBNEW_DIALOGS
     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_assign_component_classes.cpp
+    dialogs/panel_assign_component_classes_base.cpp
     dialogs/panel_setup_constraints.cpp
     dialogs/panel_setup_constraints_base.cpp
     dialogs/panel_setup_dimensions.cpp
@@ -329,7 +331,6 @@ set( PCBNEW_CLASS_SRCS
     array_pad_number_provider.cpp
     build_BOM_from_board.cpp
     cleanup_item.cpp
-    component_class_manager.cpp
     convert_shape_list_to_polygon.cpp
     cross-probing.cpp
     edit.cpp
@@ -428,6 +429,11 @@ set( PCBNEW_CLASS_SRCS
     widgets/net_inspector_panel.cpp
     widgets/pcb_net_inspector_panel.cpp
 
+    component_classes/component_class.cpp
+    component_classes/component_class_cache_proxy.cpp
+    component_classes/component_class_assignment_rule.cpp
+    component_classes/component_class_manager.cpp
+
     )
 
 set( PCBNEW_GIT_SRCS
diff --git a/pcbnew/board.cpp b/pcbnew/board.cpp
index bfb94e281f..9a92f535a7 100644
--- a/pcbnew/board.cpp
+++ b/pcbnew/board.cpp
@@ -55,6 +55,7 @@
 #include <pcbnew_settings.h>
 #include <progress_reporter.h>
 #include <project.h>
+#include <project/component_class_settings.h>
 #include <project/net_settings.h>
 #include <project/project_file.h>
 #include <project/project_local_settings.h>
@@ -73,18 +74,13 @@ VECTOR2I BOARD_ITEM::ZeroOffset( 0, 0 );
 
 
 BOARD::BOARD() :
-        BOARD_ITEM_CONTAINER( (BOARD_ITEM*) nullptr, PCB_T ),
-        m_LegacyDesignSettingsLoaded( false ),
-        m_LegacyCopperEdgeClearanceLoaded( false ),
-        m_LegacyNetclassesLoaded( false ),
-        m_boardUse( BOARD_USE::NORMAL ),
-        m_timeStamp( 1 ),
-        m_paper( PAGE_INFO::A4 ),
-        m_project( nullptr ),
-        m_userUnits( EDA_UNITS::MM ),
+        BOARD_ITEM_CONTAINER( (BOARD_ITEM*) nullptr, PCB_T ), m_LegacyDesignSettingsLoaded( false ),
+        m_LegacyCopperEdgeClearanceLoaded( false ), m_LegacyNetclassesLoaded( false ),
+        m_boardUse( BOARD_USE::NORMAL ), m_timeStamp( 1 ), m_paper( PAGE_INFO::A4 ),
+        m_project( nullptr ), m_userUnits( EDA_UNITS::MM ),
         m_designSettings( new BOARD_DESIGN_SETTINGS( nullptr, "board.design_settings" ) ),
-        m_NetInfo( this ),
-        m_embedFonts( false )
+        m_NetInfo( this ), m_embedFonts( false ),
+        m_componentClassManager( std::make_unique<COMPONENT_CLASS_MANAGER>( this ) )
 {
     // A too small value do not allow connecting 2 shapes (i.e. segments) not exactly connected
     // A too large value do not allow safely connecting 2 shapes like very short segments.
@@ -2162,6 +2158,17 @@ void BOARD::SynchronizeNetsAndNetClasses( bool aResetTrackAndViaSizes )
 }
 
 
+bool BOARD::SynchronizeComponentClasses( const std::unordered_set<wxString>& aNewSheetPaths ) const
+{
+    std::shared_ptr<COMPONENT_CLASS_SETTINGS> settings =
+            GetProject()->GetProjectFile().ComponentClassSettings();
+
+    return m_componentClassManager->SyncDynamicComponentClassAssignments(
+            settings->GetComponentClassAssignments(), settings->GetEnableSheetComponentClasses(),
+            aNewSheetPaths );
+}
+
+
 int BOARD::SetAreasNetCodesFromNetNames()
 {
     int error_count = 0;
diff --git a/pcbnew/board.h b/pcbnew/board.h
index 2ca3ef930d..b910fa5326 100644
--- a/pcbnew/board.h
+++ b/pcbnew/board.h
@@ -27,7 +27,7 @@
 
 #include <board_item_container.h>
 #include <board_stackup_manager/board_stackup.h>
-#include <component_class_manager.h>
+#include <component_classes/component_class_manager.h>
 #include <embedded_files.h>
 #include <common.h> // Needed for stl hash extensions
 #include <convert_shape_list_to_polygon.h> // for OUTLINE_ERROR_HANDLER
@@ -1004,6 +1004,11 @@ public:
      */
     void SynchronizeNetsAndNetClasses( bool aResetTrackAndViaSizes );
 
+    /**
+     * Copy component class / component class generator information from the project settings
+     */
+    bool SynchronizeComponentClasses( const std::unordered_set<wxString>& aNewSheetPaths ) const;
+
     /**
      * Copy the current project's text variables into the boards property cache.
      */
@@ -1302,7 +1307,7 @@ public:
     /**
      * Gets the component class manager
      */
-    COMPONENT_CLASS_MANAGER& GetComponentClassManager() { return m_componentClassManager; }
+    COMPONENT_CLASS_MANAGER& GetComponentClassManager() { return *m_componentClassManager; }
 
     PROJECT::ELEM ProjectElementType() override { return PROJECT::ELEM::BOARD; }
 
@@ -1422,7 +1427,7 @@ private:
 
     bool                         m_embedFonts;
 
-    COMPONENT_CLASS_MANAGER m_componentClassManager;
+    std::unique_ptr<COMPONENT_CLASS_MANAGER> m_componentClassManager;
 };
 
 
diff --git a/pcbnew/board_commit.cpp b/pcbnew/board_commit.cpp
index 17e6ee95c7..ac09ebde17 100644
--- a/pcbnew/board_commit.cpp
+++ b/pcbnew/board_commit.cpp
@@ -42,6 +42,7 @@
 #include <teardrop/teardrop.h>
 
 #include <functional>
+#include <project/project_file.h>
 using namespace std::placeholders;
 
 
@@ -317,6 +318,15 @@ void BOARD_COMMIT::Push( const wxString& aMessage, int aCommitFlags )
     if( !staleTeardropPadsAndVias.empty() || !staleTeardropTracks.empty() )
         teardropMgr.RemoveTeardrops( *this, &staleTeardropPadsAndVias, &staleTeardropTracks );
 
+    auto updateComponentClasses = [this]( BOARD_ITEM* boardItem )
+    {
+        if( boardItem->Type() != PCB_FOOTPRINT_T )
+            return;
+
+        FOOTPRINT* footprint = static_cast<FOOTPRINT*>( boardItem );
+        GetBoard()->GetComponentClassManager().RebuildRequiredCaches( footprint );
+    };
+
     for( COMMIT_LINE& ent : m_changes )
     {
         if( !ent.m_item || !ent.m_item->IsBOARD_ITEM() )
@@ -367,6 +377,8 @@ void BOARD_COMMIT::Push( const wxString& aMessage, int aCommitFlags )
             if( view && boardItem->Type() != PCB_NETINFO_T )
                 view->Add( boardItem );
 
+            updateComponentClasses( boardItem );
+
             break;
 
         case CHT_REMOVE:
@@ -510,6 +522,8 @@ void BOARD_COMMIT::Push( const wxString& aMessage, int aCommitFlags )
                 propagateDamage( boardItem, staleZones, &staleHatchedShapes );       // after
             }
 
+            updateComponentClasses( boardItem );
+
             if( view )
                 view->Update( boardItem );
 
@@ -533,7 +547,10 @@ void BOARD_COMMIT::Push( const wxString& aMessage, int aCommitFlags )
                 {
                     item->ClearEditFlags();
                 } );
-    }
+    } // ... and regenerate them.
+
+    // Invalidate component classes
+    board->GetComponentClassManager().InvalidateComponentClasses();
 
     if( m_isBoardEditor )
     {
@@ -703,6 +720,15 @@ void BOARD_COMMIT::Revert()
 
     board->IncrementTimeStamp();   // clear caches
 
+    auto updateComponentClasses = [this]( BOARD_ITEM* boardItem )
+    {
+        if( boardItem->Type() != PCB_FOOTPRINT_T )
+            return;
+
+        FOOTPRINT* footprint = static_cast<FOOTPRINT*>( boardItem );
+        GetBoard()->GetComponentClassManager().RebuildRequiredCaches( footprint );
+    };
+
     std::vector<BOARD_ITEM*> bulkAddedItems;
     std::vector<BOARD_ITEM*> bulkRemovedItems;
     std::vector<BOARD_ITEM*> itemsChanged;
@@ -767,6 +793,8 @@ void BOARD_COMMIT::Revert()
                 bulkAddedItems.push_back( boardItem );
             }
 
+            updateComponentClasses( boardItem );
+
             break;
         }
 
@@ -792,6 +820,8 @@ void BOARD_COMMIT::Revert()
             connectivity->Add( boardItem );
             itemsChanged.push_back( boardItem );
 
+            updateComponentClasses( boardItem );
+
             delete entry.m_copy;
             break;
         }
@@ -804,6 +834,9 @@ void BOARD_COMMIT::Revert()
         boardItem->ClearEditFlags();
     }
 
+    // Invalidate component classes
+    board->GetComponentClassManager().InvalidateComponentClasses();
+
     if( bulkAddedItems.size() > 0 || bulkRemovedItems.size() > 0 || itemsChanged.size() > 0 )
         board->OnItemsCompositeUpdate( bulkAddedItems, bulkRemovedItems, itemsChanged );
 
@@ -822,4 +855,3 @@ void BOARD_COMMIT::Revert()
 
     clear();
 }
-
diff --git a/pcbnew/component_class_manager.cpp b/pcbnew/component_class_manager.cpp
deleted file mode 100644
index b902970712..0000000000
--- a/pcbnew/component_class_manager.cpp
+++ /dev/null
@@ -1,210 +0,0 @@
-/*
- * This program source code file is part of KiCad, a free EDA CAD application.
- *
- * Copyright The KiCad Developers, see AUTHORS.txt for contributors.
- *
- * This program is free software: you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation, either version 3 of the License, or (at your
- * option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include <utility>
-
-#include <component_class_manager.h>
-
-
-void COMPONENT_CLASS::AddConstituentClass( COMPONENT_CLASS* componentClass )
-{
-    m_constituentClasses.push_back( componentClass );
-}
-
-
-bool COMPONENT_CLASS::ContainsClassName( const wxString& className ) const
-{
-    if( m_constituentClasses.size() == 0 )
-        return false;
-
-    if( m_constituentClasses.size() == 1 )
-        return m_name == className;
-
-    return std::any_of( m_constituentClasses.begin(), m_constituentClasses.end(),
-                        [&className]( const COMPONENT_CLASS* testClass )
-                        {
-                            return testClass->GetFullName() == className;
-                        } );
-}
-
-
-wxString COMPONENT_CLASS::GetName() const
-{
-    if( m_constituentClasses.size() == 0 )
-        return wxT( "<None>" );
-
-    if( m_constituentClasses.size() == 1 )
-        return m_name;
-
-    wxASSERT( m_constituentClasses.size() >= 2 );
-
-    wxString name;
-
-    if( m_constituentClasses.size() == 2 )
-    {
-        name.Printf( _( "%s and %s" ), m_constituentClasses[0]->GetName(),
-                     m_constituentClasses[1]->GetName() );
-    }
-    else if( m_constituentClasses.size() == 3 )
-    {
-        name.Printf( _( "%s, %s and %s" ), m_constituentClasses[0]->GetName(),
-                     m_constituentClasses[1]->GetName(), m_constituentClasses[2]->GetName() );
-    }
-    else if( m_constituentClasses.size() > 3 )
-    {
-        name.Printf( _( "%s, %s and %d more" ), m_constituentClasses[0]->GetName(),
-                     m_constituentClasses[1]->GetName(),
-                     static_cast<int>( m_constituentClasses.size() - 2 ) );
-    }
-
-    return name;
-}
-
-
-bool COMPONENT_CLASS::IsEmpty() const
-{
-    return m_constituentClasses.size() == 0;
-}
-
-
-COMPONENT_CLASS_MANAGER::COMPONENT_CLASS_MANAGER()
-{
-    m_noneClass = std::make_unique<COMPONENT_CLASS>( wxEmptyString );
-}
-
-
-COMPONENT_CLASS* COMPONENT_CLASS_MANAGER::GetEffectiveComponentClass(
-        const std::unordered_set<wxString>& classNames )
-{
-    if( classNames.size() == 0 )
-        return m_noneClass.get();
-
-    // Lambda to handle finding constituent component classes. This first checks the cache,
-    // and if found moves the class to the primary classes map. If not found, it either returns
-    // an existing class in the primary list or creates a new class.
-    auto getOrCreateClass = [this]( const wxString& className )
-    {
-        if( m_classesCache.count( className ) )
-        {
-            auto existingClass = m_classesCache.extract( className );
-            m_classes.insert( std::move( existingClass ) );
-        }
-        else if( !m_classes.count( className ) )
-        {
-            std::unique_ptr<COMPONENT_CLASS> newClass =
-                    std::make_unique<COMPONENT_CLASS>( className );
-            newClass->AddConstituentClass( newClass.get() );
-            m_classes[className] = std::move( newClass );
-        }
-
-        return m_classes[className].get();
-    };
-
-    // Handle single-assignment component classes
-    if( classNames.size() == 1 )
-        return getOrCreateClass( *classNames.begin() );
-
-    // Handle composite component classes
-    std::vector<wxString> sortedClassNames( classNames.begin(), classNames.end() );
-
-    std::sort( sortedClassNames.begin(), sortedClassNames.end(),
-               []( const wxString& str1, const wxString& str2 )
-               {
-                   return str1.Cmp( str2 ) < 0;
-               } );
-
-    wxString fullName = GetFullClassNameForConstituents( sortedClassNames );
-
-    if( m_effectiveClassesCache.count( fullName ) )
-    {
-        // The effective class was previously constructed - copy it across to the new live map
-        auto             existingClass = m_effectiveClassesCache.extract( fullName );
-        COMPONENT_CLASS* effClass = existingClass.mapped().get();
-        m_effectiveClasses.insert( std::move( existingClass ) );
-
-        // Ensure that all constituent component classes are copied to the live map
-        for( COMPONENT_CLASS* constClass : effClass->GetConstituentClasses() )
-        {
-            if( m_classesCache.count( constClass->GetFullName() ) )
-            {
-                auto constClassNode = m_classesCache.extract( constClass->GetFullName() );
-                m_classes.insert( std::move( constClassNode ) );
-            }
-        }
-    }
-    else if( !m_effectiveClasses.count( fullName ) )
-    {
-        // The effective class was not previously constructed
-        std::unique_ptr<COMPONENT_CLASS> effClass = std::make_unique<COMPONENT_CLASS>( fullName );
-
-        for( const wxString& className : sortedClassNames )
-            effClass->AddConstituentClass( getOrCreateClass( className ) );
-
-        m_effectiveClasses[fullName] = std::move( effClass );
-    }
-
-    return m_effectiveClasses[fullName].get();
-}
-
-
-void COMPONENT_CLASS_MANAGER::InitNetlistUpdate()
-{
-    m_classesCache = std::move( m_classes );
-    m_effectiveClassesCache = std::move( m_effectiveClasses );
-}
-
-
-void COMPONENT_CLASS_MANAGER::FinishNetlistUpdate()
-{
-    m_classesCache.clear();
-    m_effectiveClassesCache.clear();
-}
-
-
-wxString COMPONENT_CLASS_MANAGER::GetFullClassNameForConstituents(
-        const std::unordered_set<wxString>& classNames )
-{
-    std::vector<wxString> sortedClassNames( classNames.begin(), classNames.end() );
-
-    std::sort( sortedClassNames.begin(), sortedClassNames.end(),
-               []( const wxString& str1, const wxString& str2 )
-               {
-                   return str1.Cmp( str2 ) < 0;
-               } );
-
-    return GetFullClassNameForConstituents( sortedClassNames );
-}
-
-
-wxString
-COMPONENT_CLASS_MANAGER::GetFullClassNameForConstituents( const std::vector<wxString>& classNames )
-{
-    if( classNames.size() == 0 )
-        return wxEmptyString;
-
-    wxString fullName = classNames[0];
-
-    for( std::size_t i = 1; i < classNames.size(); ++i )
-    {
-        fullName += ",";
-        fullName += classNames[i];
-    }
-
-    return fullName;
-}
diff --git a/pcbnew/component_class_manager.h b/pcbnew/component_class_manager.h
deleted file mode 100644
index 327c0528c3..0000000000
--- a/pcbnew/component_class_manager.h
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- * This program source code file is part of KiCad, a free EDA CAD application.
- *
- * Copyright The KiCad Developers, see AUTHORS.txt for contributors.
- *
- * This program is free software: you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation, either version 3 of the License, or (at your
- * option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-#ifndef PCBNEW_COMPONENT_CLASS_MANAGER_H
-#define PCBNEW_COMPONENT_CLASS_MANAGER_H
-
-#include <memory>
-#include <unordered_map>
-#include <unordered_set>
-#include <wx/string.h>
-
-#include <board_item.h>
-
-/*
- * A lightweight representation of a component class. The membership within
- * m_consituentClasses allows determination of the type of class this is:
- *
- * m_constituentClasses.size() == 0: This is a null class (no assigment).
- *     m_name is empty.
- * m_constituentClasses.size() == 1: This is an atomic class. The constituent class
- *     pointer refers to itself. m_name contains the name of the atomic class
- * m_constituentClasses.size() > 1: This is a composite class. The constituent class
- *     pointers refer to all atomic members. m_name contains a comma-delimited list of
- *     all atomic member class names.
- */
-class COMPONENT_CLASS
-{
-public:
-    COMPONENT_CLASS( const wxString& name ) : m_name( name ) {}
-
-    /// Fetches the display name of this component class
-    wxString GetName() const;
-
-    /// Fetches the full name of this component class
-    const wxString& GetFullName() const { return m_name; }
-
-    /// Adds a constituent component class to an effective component class
-    void AddConstituentClass( COMPONENT_CLASS* componentClass );
-
-    /// Determines if this (effective) component class contains a specific sub-class
-    bool ContainsClassName( const wxString& className ) const;
-
-    /// Determines if this (effective) component class is empty (i.e. no classes defined)
-    bool IsEmpty() const;
-
-    /// Fetches a vector of the constituent classes for this (effective) class
-    const std::vector<COMPONENT_CLASS*>& GetConstituentClasses() const
-    {
-        return m_constituentClasses;
-    }
-
-private:
-    /// The full name of the component class
-    wxString m_name;
-
-    /// The COMPONENT_CLASS objects contributing to this complete component class
-    std::vector<COMPONENT_CLASS*> m_constituentClasses;
-};
-
-/*
- * A class to manage Component Classes in a board context
- *
- * This manager owns generated COMPONENT_CLASS objects, and guarantees that pointers to managed
- * objects are valid for the duration of the board lifetime. Note that, in order to maintain this
- * guarantee, there are two methods that must be called when updating the board from the netlist
- * (InitNetlistUpdate and FinishNetlistUpdate).
- */
-class COMPONENT_CLASS_MANAGER
-{
-public:
-    COMPONENT_CLASS_MANAGER();
-
-    /// @brief Gets the full effective class name for the given set of constituent classes
-    static wxString
-    GetFullClassNameForConstituents( const std::unordered_set<wxString>& classNames );
-
-    /// @brief Gets the full effective class name for the given set of constituent classes
-    /// @param classNames a sorted vector of consituent class names
-    static wxString GetFullClassNameForConstituents( const std::vector<wxString>& classNames );
-
-    /// @brief Gets an effective component class for the given constituent class names
-    /// @param classes The names of the constituent component classes
-    /// @return Effective COMPONENT_CLASS object
-    COMPONENT_CLASS* GetEffectiveComponentClass( const std::unordered_set<wxString>& classNames );
-
-    /// Returns the unassigned component class
-    const COMPONENT_CLASS* GetNoneComponentClass() const { return m_noneClass.get(); }
-
-    /// Prepare the manager for a board update
-    /// Must be called prior to updating the PCB from the netlist
-    void InitNetlistUpdate();
-
-    /// Cleans up the manager after a board update
-    /// Must be called after updating the PCB from the netlist
-    void FinishNetlistUpdate();
-
-    /// Resets the contents of the manager
-    // 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;
-
-    /// Generated effective component classes
-    std::unordered_map<wxString, std::unique_ptr<COMPONENT_CLASS>> m_effectiveClasses;
-
-    /// Cache of all individual component classes (for netlist updating)
-    std::unordered_map<wxString, std::unique_ptr<COMPONENT_CLASS>> m_classesCache;
-
-    /// Cache of all generated effective component classes (for netlist updating)
-    std::unordered_map<wxString, std::unique_ptr<COMPONENT_CLASS>> m_effectiveClassesCache;
-
-    /// The class to represent an unassigned component class
-    std::unique_ptr<COMPONENT_CLASS> m_noneClass;
-};
-
-#endif
diff --git a/pcbnew/component_classes/component_class.cpp b/pcbnew/component_classes/component_class.cpp
new file mode 100644
index 0000000000..5c21052c95
--- /dev/null
+++ b/pcbnew/component_classes/component_class.cpp
@@ -0,0 +1,100 @@
+/*
+* This program source code file is part of KiCad, a free EDA CAD application.
+ *
+ * Copyright The KiCad Developers, see AUTHORS.txt for contributors.
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#include <component_classes/component_class.h>
+#include <wx/intl.h>
+
+
+void COMPONENT_CLASS::AddConstituentClass( COMPONENT_CLASS* componentClass )
+{
+    m_constituentClasses.push_back( componentClass );
+}
+
+
+const COMPONENT_CLASS* COMPONENT_CLASS::GetConstituentClass( const wxString& className ) const
+{
+    const auto itr = std::ranges::find_if( m_constituentClasses,
+                                           [&className]( const COMPONENT_CLASS* testClass )
+                                           {
+                                               return testClass->GetName() == className;
+                                           } );
+
+    if( itr != m_constituentClasses.end() )
+        return *itr;
+
+    return nullptr;
+}
+
+
+bool COMPONENT_CLASS::ContainsClassName( const wxString& className ) const
+{
+    return GetConstituentClass( className ) != nullptr;
+}
+
+
+wxString COMPONENT_CLASS::GetHumanReadableName() const
+{
+    if( m_constituentClasses.size() == 0 )
+        return wxT( "<None>" );
+
+    if( m_constituentClasses.size() == 1 )
+        return m_name;
+
+    wxASSERT( m_constituentClasses.size() >= 2 );
+
+    wxString name;
+
+    if( m_constituentClasses.size() == 2 )
+    {
+        name.Printf( _( "%s and %s" ), m_constituentClasses[0]->GetName(),
+                     m_constituentClasses[1]->GetName() );
+    }
+    else if( m_constituentClasses.size() == 3 )
+    {
+        name.Printf( _( "%s, %s and %s" ), m_constituentClasses[0]->GetName(),
+                     m_constituentClasses[1]->GetName(), m_constituentClasses[2]->GetName() );
+    }
+    else if( m_constituentClasses.size() > 3 )
+    {
+        name.Printf( _( "%s, %s and %d more" ), m_constituentClasses[0]->GetName(),
+                     m_constituentClasses[1]->GetName(),
+                     static_cast<int>( m_constituentClasses.size() - 2 ) );
+    }
+
+    return name;
+}
+
+
+bool COMPONENT_CLASS::IsEmpty() const
+{
+    return m_constituentClasses.empty();
+}
+
+
+bool COMPONENT_CLASS::operator==( const COMPONENT_CLASS& aComponent ) const
+{
+    return GetName() == aComponent.GetName();
+}
+
+
+bool COMPONENT_CLASS::operator!=( const COMPONENT_CLASS& aComponent ) const
+{
+    return !( *this == aComponent );
+}
\ No newline at end of file
diff --git a/pcbnew/component_classes/component_class.h b/pcbnew/component_classes/component_class.h
new file mode 100644
index 0000000000..13d3ba6bd6
--- /dev/null
+++ b/pcbnew/component_classes/component_class.h
@@ -0,0 +1,106 @@
+/*
+* This program source code file is part of KiCad, a free EDA CAD application.
+ *
+ * Copyright The KiCad Developers, see AUTHORS.txt for contributors.
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#ifndef PCBNEW_COMPONENT_CLASS_H
+#define PCBNEW_COMPONENT_CLASS_H
+
+#include <wx/string.h>
+#include <vector>
+
+/**
+ * A lightweight representation of a component class. The membership within
+ * m_consituentClasses allows determination of the type of class this is:
+ *
+ * m_constituentClasses.size() == 0: This is a null class (no assigment).
+ *     m_name is empty.
+ * m_constituentClasses.size() == 1: This is an atomic class. The constituent class
+ *     pointer refers to itself. m_name contains the name of the atomic class
+ * m_constituentClasses.size() > 1: This is a composite class. The constituent class
+ *     pointers refer to all atomic members. m_name contains a comma-delimited list of
+ *     all atomic member class names.
+ */
+class COMPONENT_CLASS
+{
+public:
+    /// The assignment context in which this component class is used
+    enum class USAGE
+    {
+        STATIC,
+        DYNAMIC,
+        STATIC_AND_DYNAMIC,
+        EFFECTIVE
+    };
+
+    /// Construct a new component class
+    explicit COMPONENT_CLASS( const wxString& name, const USAGE aUsageContext ) :
+            m_name( name ), m_usageContext( aUsageContext )
+    {
+    }
+
+    /// @brief Gets the consolidated name of this component class (which may be an aggregate). This is
+    /// intended for display to users (e.g. in infobars or messages). WARNING: Do not use this
+    /// to compare equivalence, or to export to other tools)
+    wxString GetHumanReadableName() const;
+
+    /// Fetches the full name of this component class
+    const wxString& GetName() const { return m_name; }
+
+    /// Adds a constituent component class to an effective component class
+    void AddConstituentClass( COMPONENT_CLASS* componentClass );
+
+    /// Returns a named constituent class of this component class, or nullptr if not found
+    const COMPONENT_CLASS* GetConstituentClass( const wxString& className ) const;
+
+    /// Determines if this (effective) component class contains a specific constituent class
+    bool ContainsClassName( const wxString& className ) const;
+
+    /// Determines if this (effective) component class is empty (i.e. no classes defined)
+    bool IsEmpty() const;
+
+    /// Fetches a vector of the constituent classes for this (effective) class
+    const std::vector<COMPONENT_CLASS*>& GetConstituentClasses() const
+    {
+        return m_constituentClasses;
+    }
+
+    /// Gets the assignment context in which this component class is being used
+    USAGE GetUsageContext() const { return m_usageContext; }
+
+    /// Sets the assignment context in which this component class is being used
+    void SetUsageContext( const USAGE aUsageContext ) { m_usageContext = aUsageContext; }
+
+    /// Tests two component classes for equality based on full class name
+    bool operator==( const COMPONENT_CLASS& aComponent ) const;
+
+    /// Tests two component classes for inequality based on full class name
+    bool operator!=( const COMPONENT_CLASS& aComponent ) const;
+
+private:
+    /// The full name of the component class
+    wxString m_name;
+
+    /// The COMPONENT_CLASS objects contributing to this complete component class
+    std::vector<COMPONENT_CLASS*> m_constituentClasses;
+
+    /// The assignment context in which this component class is being used
+    USAGE m_usageContext;
+};
+
+#endif //PCBNEW_COMPONENT_CLASS_H
diff --git a/pcbnew/component_classes/component_class_assignment_rule.cpp b/pcbnew/component_classes/component_class_assignment_rule.cpp
new file mode 100644
index 0000000000..14c44c082a
--- /dev/null
+++ b/pcbnew/component_classes/component_class_assignment_rule.cpp
@@ -0,0 +1,38 @@
+/*
+ * This program source code file is part of KiCad, a free EDA CAD application.
+ *
+ * Copyright The KiCad Developers, see AUTHORS.txt for contributors.
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#include <component_classes/component_class_assignment_rule.h>
+#include <footprint.h>
+
+
+COMPONENT_CLASS_ASSIGNMENT_RULE::COMPONENT_CLASS_ASSIGNMENT_RULE(
+        const wxString& aComponentClass, std::shared_ptr<DRC_RULE_CONDITION>&& aCondition ) :
+        m_componentClass( aComponentClass ), m_condition( std::move( aCondition ) )
+{
+}
+
+
+bool COMPONENT_CLASS_ASSIGNMENT_RULE::Matches( const FOOTPRINT* aFootprint ) const
+{
+    if( !m_condition )
+        return true;
+
+    return m_condition->EvaluateFor( aFootprint, nullptr, 0, aFootprint->GetSide(), nullptr );
+}
diff --git a/pcbnew/component_classes/component_class_assignment_rule.h b/pcbnew/component_classes/component_class_assignment_rule.h
new file mode 100644
index 0000000000..3f18373559
--- /dev/null
+++ b/pcbnew/component_classes/component_class_assignment_rule.h
@@ -0,0 +1,60 @@
+/*
+ * This program source code file is part of KiCad, a free EDA CAD application.
+ *
+ * Copyright The KiCad Developers, see AUTHORS.txt for contributors.
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef COMPONENT_CLASS_ASSIGNMENT_RULE_H
+#define COMPONENT_CLASS_ASSIGNMENT_RULE_H
+
+#include <memory>
+#include <vector>
+#include <wx/string.h>
+
+#include <drc/drc_rule_condition.h>
+
+class FOOTPRINT;
+
+/**
+ * Class which represents a component class assignment rule. These are used to dynamically assign component classes
+ * based on FOOTPRINT parameters which are exposed through the DRC language.
+ */
+class COMPONENT_CLASS_ASSIGNMENT_RULE
+{
+public:
+    /// Construct a component class assignment rule
+    explicit COMPONENT_CLASS_ASSIGNMENT_RULE( const wxString&                       aComponentClass,
+                                              std::shared_ptr<DRC_RULE_CONDITION>&& aCondition );
+
+    /// The component class to assign to matching footprints
+    wxString GetComponentClass() const { return m_componentClass; }
+    void     SetComponentClass( const wxString& aComponentClass )
+    {
+        m_componentClass = aComponentClass;
+    }
+
+    /// Tests whether this rules matches the given footprint
+    bool Matches( const FOOTPRINT* aFootprint ) const;
+
+protected:
+    /// The component class to assign to matching footprints
+    wxString m_componentClass;
+
+    /// The DRC condition which specifies footprint matches for this component class
+    std::shared_ptr<DRC_RULE_CONDITION> m_condition;
+};
+
+#endif // COMPONENT_CLASS_ASSIGNMENT_RULE_H
diff --git a/pcbnew/component_classes/component_class_cache_proxy.cpp b/pcbnew/component_classes/component_class_cache_proxy.cpp
new file mode 100644
index 0000000000..e445b01c0f
--- /dev/null
+++ b/pcbnew/component_classes/component_class_cache_proxy.cpp
@@ -0,0 +1,48 @@
+/*
+* This program source code file is part of KiCad, a free EDA CAD application.
+ *
+ * Copyright The KiCad Developers, see AUTHORS.txt for contributors.
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#include <component_classes/component_class_cache_proxy.h>
+
+#include <board.h>
+#include <footprint.h>
+
+const COMPONENT_CLASS* COMPONENT_CLASS_CACHE_PROXY::GetComponentClass() const
+{
+    COMPONENT_CLASS_MANAGER& mgr = m_footprint->GetBoard()->GetComponentClassManager();
+
+    if( mgr.GetTicker() > m_lastTickerValue )
+    {
+        RecomputeComponentClass( &mgr );
+    }
+
+    return m_finalComponentClass;
+}
+
+
+void COMPONENT_CLASS_CACHE_PROXY::RecomputeComponentClass( COMPONENT_CLASS_MANAGER* manager ) const
+{
+    if( !manager )
+        manager = &m_footprint->GetBoard()->GetComponentClassManager();
+
+    m_dynamicComponentClass = manager->GetDynamicComponentClassesForFootprint( m_footprint );
+    m_finalComponentClass =
+            manager->GetCombinedComponentClass( m_staticComponentClass, m_dynamicComponentClass );
+    m_lastTickerValue = manager->GetTicker();
+}
diff --git a/pcbnew/component_classes/component_class_cache_proxy.h b/pcbnew/component_classes/component_class_cache_proxy.h
new file mode 100644
index 0000000000..fd330892af
--- /dev/null
+++ b/pcbnew/component_classes/component_class_cache_proxy.h
@@ -0,0 +1,70 @@
+/*
+* This program source code file is part of KiCad, a free EDA CAD application.
+ *
+ * Copyright The KiCad Developers, see AUTHORS.txt for contributors.
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#ifndef PCBNEW_COMPONENT_CLASS_CACHE_PROXY_H
+#define PCBNEW_COMPONENT_CLASS_CACHE_PROXY_H
+
+#include <component_classes/component_class.h>
+#include <footprint.h>
+
+/*
+ * A class which acts as a cache-aware proxy for a FOOTPRINT's component class.
+ * Creating dynamic component classes (from component class generators) is an
+ * expensive operation, so we want to cache the results. This class is a cache
+ * proxy which tracks the validity of the cached component class with respect
+ * to loaded static and dynamic component class rules
+ */
+class COMPONENT_CLASS_CACHE_PROXY
+{
+public:
+    explicit COMPONENT_CLASS_CACHE_PROXY( FOOTPRINT* footprint ) : m_footprint( footprint ) {}
+
+    /// Sets the static component class
+    /// Static component classes are assigned in the schematic, and are transferred through the
+    /// netlist
+    void SetStaticComponentClass( const COMPONENT_CLASS* compClass )
+    {
+        m_staticComponentClass = compClass;
+    }
+
+    /// Gets the static component class
+    const COMPONENT_CLASS* GetStaticComponentClass() const { return m_staticComponentClass; }
+
+    /// Gets the full component class (static + dynamic resultant component class)
+    const COMPONENT_CLASS* GetComponentClass() const;
+
+    /// Forces recomputation of the component class
+    void RecomputeComponentClass( COMPONENT_CLASS_MANAGER* manager = nullptr ) const;
+
+    /// Invalidates the cache
+    /// The component class will be recalculated on the next access
+    void InvalidateCache() { m_lastTickerValue = -1; }
+
+protected:
+    FOOTPRINT* m_footprint;
+
+    const COMPONENT_CLASS*         m_staticComponentClass{ nullptr };
+    mutable const COMPONENT_CLASS* m_dynamicComponentClass{ nullptr };
+    mutable const COMPONENT_CLASS* m_finalComponentClass{ nullptr };
+
+    mutable long long int m_lastTickerValue{ -1 };
+};
+
+#endif //PCBNEW_COMPONENT_CLASS_CACHE_PROXY_H
diff --git a/pcbnew/component_classes/component_class_manager.cpp b/pcbnew/component_classes/component_class_manager.cpp
new file mode 100644
index 0000000000..b30cabba8b
--- /dev/null
+++ b/pcbnew/component_classes/component_class_manager.cpp
@@ -0,0 +1,507 @@
+/*
+ * This program source code file is part of KiCad, a free EDA CAD application.
+ *
+ * Copyright The KiCad Developers, see AUTHORS.txt for contributors.
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#include <component_classes/component_class_manager.h>
+
+#include <board.h>
+#include <component_classes/component_class.h>
+#include <component_classes/component_class_assignment_rule.h>
+#include <drc/drc_cache_generator.h>
+#include <drc/drc_rule_parser.h>
+#include <footprint.h>
+#include <project/component_class_settings.h>
+#include <tools/drc_tool.h>
+
+
+COMPONENT_CLASS_MANAGER::COMPONENT_CLASS_MANAGER( BOARD* board ) :
+        m_board( board ), m_hasCustomAssignmentConditions( false )
+{
+    m_noneClass =
+            std::make_shared<COMPONENT_CLASS>( wxEmptyString, COMPONENT_CLASS::USAGE::STATIC );
+}
+
+
+/**
+ * Computes and returns an effective component class for a (possibly empty) set of constituent
+ * class names. This is called by the netlist updater to set static component classes on footprints.
+ *
+ * Where constituent or effective component classes already exist, they are re-used. This allows
+ * efficient comparison of (effective) component classes by pointer in DRC checks.
+ *
+ * Preconditions: InitNetlistUpdate() must be called before invoking this method.
+ * @param classNames The constitent component class names
+ * @return A pointer to an effective COMPONENT_CLASS representing all constituent component classes
+ */
+COMPONENT_CLASS* COMPONENT_CLASS_MANAGER::GetEffectiveStaticComponentClass(
+        const std::unordered_set<wxString>& classNames )
+{
+    // Handle no component class condition
+    if( classNames.size() == 0 )
+        return m_noneClass.get();
+
+    // Handle single-assignment component classes
+    if( classNames.size() == 1 )
+    {
+        const wxString& className = *classNames.begin();
+        m_staticClassNamesCache.erase( className );
+        return getOrCreateConstituentClass( className, COMPONENT_CLASS::USAGE::STATIC );
+    }
+
+    // Handle composite component classes
+    const std::vector<wxString> sortedClassNames = sortClassNames( classNames );
+    wxString fullName = GetFullClassNameForConstituents( sortedClassNames );
+
+    COMPONENT_CLASS* effectiveClass =
+            getOrCreateEffectiveClass( sortedClassNames, COMPONENT_CLASS::USAGE::STATIC );
+
+    for( const COMPONENT_CLASS* constituentClass : effectiveClass->GetConstituentClasses() )
+        m_staticClassNamesCache.erase( constituentClass->GetName() );
+
+    return effectiveClass;
+}
+
+
+void COMPONENT_CLASS_MANAGER::InitNetlistUpdate()
+{
+    for( const auto& [className, classPtr] : m_constituentClasses )
+    {
+        if( classPtr->GetUsageContext() == COMPONENT_CLASS::USAGE::STATIC
+            || classPtr->GetUsageContext() == COMPONENT_CLASS::USAGE::STATIC_AND_DYNAMIC )
+        {
+            m_staticClassNamesCache.insert( className );
+        }
+    }
+
+    ++m_ticker;
+}
+
+
+void COMPONENT_CLASS_MANAGER::FinishNetlistUpdate()
+{
+    // m_staticClassesCache now contains any static component classes that are unused from the
+    // netlist update. Delete any effective component classes which refer to them in a static-only
+    // context, or update their usage context.
+    for( const wxString& className : m_staticClassNamesCache )
+    {
+        COMPONENT_CLASS* staticClass = m_constituentClasses[className].get();
+
+        if( staticClass->GetUsageContext() == COMPONENT_CLASS::USAGE::STATIC )
+        {
+            // Any static-only classes can be deleted, along with effective classes which refer to them
+            std::unordered_set<wxString> classesToDelete;
+
+            for( const auto& [combinedFullName, combinedCompClass] : m_effectiveClasses )
+            {
+                if( combinedCompClass->ContainsClassName( className ) )
+                    classesToDelete.insert( combinedFullName );
+            }
+
+            for( const wxString& classNameToDelete : classesToDelete )
+                m_effectiveClasses.erase( classNameToDelete );
+
+            m_constituentClasses.erase( className );
+        }
+        else
+        {
+            // Set the component class to dynamic-only scope
+            wxASSERT( staticClass->GetUsageContext()
+                      == COMPONENT_CLASS::USAGE::STATIC_AND_DYNAMIC );
+            staticClass->SetUsageContext( COMPONENT_CLASS::USAGE::DYNAMIC );
+        }
+    }
+
+    // Clear the caches
+    m_staticClassNamesCache.clear();
+}
+
+
+wxString COMPONENT_CLASS_MANAGER::GetFullClassNameForConstituents(
+        const std::unordered_set<wxString>& classNames )
+{
+    const std::vector<wxString> sortedClassNames = sortClassNames( classNames );
+
+    return GetFullClassNameForConstituents( sortedClassNames );
+}
+
+
+wxString
+COMPONENT_CLASS_MANAGER::GetFullClassNameForConstituents( const std::vector<wxString>& classNames )
+{
+    if( classNames.size() == 0 )
+        return wxEmptyString;
+
+    wxString fullName = classNames[0];
+
+    for( std::size_t i = 1; i < classNames.size(); ++i )
+    {
+        fullName += ",";
+        fullName += classNames[i];
+    }
+
+    return fullName;
+}
+
+
+bool COMPONENT_CLASS_MANAGER::SyncDynamicComponentClassAssignments(
+        const std::vector<COMPONENT_CLASS_ASSIGNMENT_DATA>& aAssignments,
+        bool aGenerateSheetClasses, const std::unordered_set<wxString>& aNewSheetPaths )
+{
+    m_hasCustomAssignmentConditions = false;
+    bool success = true;
+
+    // Invalidate component class cache entries
+    ++m_ticker;
+
+    // Save previous dynamically assigned component class names
+    std::unordered_set<wxString> prevClassNames;
+
+    for( const auto& rule : m_assignmentRules )
+        prevClassNames.insert( rule->GetComponentClass() );
+
+    m_assignmentRules.clear();
+
+    // Parse all assignment rules
+    std::vector<std::shared_ptr<COMPONENT_CLASS_ASSIGNMENT_RULE>> rules;
+
+    for( const COMPONENT_CLASS_ASSIGNMENT_DATA& assignment : aAssignments )
+    {
+        if( assignment.GetConditions().contains(
+                    COMPONENT_CLASS_ASSIGNMENT_DATA::CONDITION_TYPE::CUSTOM ) )
+        {
+            m_hasCustomAssignmentConditions = true;
+        }
+
+        std::shared_ptr<COMPONENT_CLASS_ASSIGNMENT_RULE> rule = CompileAssignmentRule( assignment );
+
+        if( rule )
+            rules.emplace_back( std::move( rule ) );
+        else
+            success = false;
+    }
+
+    // Generate sheet classes if required
+    if( aGenerateSheetClasses )
+    {
+        std::unordered_set<wxString> sheetNames = aNewSheetPaths;
+
+        for( const FOOTPRINT* footprint : m_board->Footprints() )
+            sheetNames.insert( footprint->GetSheetname() );
+
+        for( wxString sheetName : sheetNames )
+        {
+            // Don't generate a class for empty sheets (e.g. manually placed footprints) or the root
+            // sheet
+            if( sheetName.empty() || sheetName == wxT( "/" ) )
+                continue;
+
+            sheetName.Replace( wxT( "\"" ), wxT( "" ) );
+            sheetName.Replace( wxT( "'" ), wxT( "" ) );
+
+            COMPONENT_CLASS_ASSIGNMENT_DATA assignment;
+            assignment.SetComponentClass( sheetName );
+            assignment.SetCondition( COMPONENT_CLASS_ASSIGNMENT_DATA::CONDITION_TYPE::SHEET_NAME,
+                                     sheetName, wxEmptyString );
+
+            std::shared_ptr<COMPONENT_CLASS_ASSIGNMENT_RULE> rule =
+                    CompileAssignmentRule( assignment );
+
+            if( rule )
+                rules.emplace_back( std::move( rule ) );
+            else
+                success = false;
+        }
+    }
+
+    // Set the assignment rules
+    if( success )
+        m_assignmentRules = std::move( rules );
+
+    // Re-use or create component classes which may be output by assignment rules
+    for( const auto& rule : m_assignmentRules )
+    {
+        wxString className = rule->GetComponentClass();
+        prevClassNames.erase( className );
+        getOrCreateConstituentClass( className, COMPONENT_CLASS::USAGE::DYNAMIC );
+    }
+
+    // prevClassNames now contains all dynamic component class names no longer in use. Remove any
+    // effective component classes no longer in use.
+    for( const wxString& className : prevClassNames )
+    {
+        COMPONENT_CLASS* dynamicClass = m_constituentClasses[className].get();
+
+        if( dynamicClass->GetUsageContext() == COMPONENT_CLASS::USAGE::DYNAMIC )
+        {
+            // Any dynamic-only classes can be deleted, along with effective classes which refer to them
+            std::unordered_set<wxString> classesToDelete;
+
+            for( const auto& [combinedFullName, combinedCompClass] : m_effectiveClasses )
+            {
+                if( combinedCompClass->ContainsClassName( className ) )
+                    classesToDelete.insert( combinedFullName );
+            }
+
+            for( const wxString& classNameToDelete : classesToDelete )
+                m_effectiveClasses.erase( classNameToDelete );
+
+            m_constituentClasses.erase( className );
+        }
+        else
+        {
+            // Set the component class to dynamic-only scope
+            wxASSERT( dynamicClass->GetUsageContext()
+                      == COMPONENT_CLASS::USAGE::STATIC_AND_DYNAMIC );
+            dynamicClass->SetUsageContext( COMPONENT_CLASS::USAGE::STATIC );
+        }
+    }
+
+    return success;
+}
+
+
+std::shared_ptr<COMPONENT_CLASS_ASSIGNMENT_RULE>
+COMPONENT_CLASS_MANAGER::CompileAssignmentRule( const COMPONENT_CLASS_ASSIGNMENT_DATA& aAssignment )
+{
+    const wxString ruleSource = aAssignment.GetAssignmentInDRCLanguage();
+
+    // Ignore incomplete rules (e.g. no component class name specified)
+    if( ruleSource.empty() )
+        return nullptr;
+
+    DRC_RULES_PARSER parser( ruleSource, wxT( "Component class assignment rule" ) );
+
+    try
+    {
+        std::vector<std::shared_ptr<COMPONENT_CLASS_ASSIGNMENT_RULE>> parsed;
+
+        WX_STRING_REPORTER reporter;
+        parser.ParseComponentClassAssignmentRules( parsed, &reporter );
+
+        if( reporter.HasMessageOfSeverity( RPT_SEVERITY_ERROR ) )
+            return nullptr;
+
+        if( parsed.size() != 1 )
+            return nullptr;
+
+        return parsed[0];
+    }
+    catch( PARSE_ERROR& )
+    {
+        return nullptr;
+    }
+}
+
+
+const COMPONENT_CLASS*
+COMPONENT_CLASS_MANAGER::GetCombinedComponentClass( const COMPONENT_CLASS* staticClass,
+                                                    const COMPONENT_CLASS* dynamicClass )
+{
+    std::unordered_set<wxString> classNames;
+
+    if( staticClass )
+    {
+        for( const COMPONENT_CLASS* compClass : staticClass->GetConstituentClasses() )
+            classNames.insert( compClass->GetName() );
+    }
+
+    if( dynamicClass )
+    {
+        for( const COMPONENT_CLASS* compClass : dynamicClass->GetConstituentClasses() )
+            classNames.insert( compClass->GetName() );
+    }
+
+    if( classNames.empty() )
+        return GetNoneComponentClass();
+
+    if( classNames.size() == 1 )
+    {
+        wxASSERT( m_constituentClasses.contains( *classNames.begin() ) );
+        return m_constituentClasses[*classNames.begin()].get();
+    }
+
+    const std::vector<wxString> sortedClassNames = sortClassNames( classNames );
+
+    wxString fullCombinedName = GetFullClassNameForConstituents( sortedClassNames );
+
+    if( !m_effectiveClasses.contains( fullCombinedName ) )
+    {
+        std::unique_ptr<COMPONENT_CLASS> combinedClass = std::make_unique<COMPONENT_CLASS>(
+                fullCombinedName, COMPONENT_CLASS::USAGE::EFFECTIVE );
+
+        for( const wxString& className : sortedClassNames )
+        {
+            wxASSERT( m_constituentClasses.contains( className ) );
+            combinedClass->AddConstituentClass( m_constituentClasses[className].get() );
+        }
+
+        m_effectiveClasses[fullCombinedName] = std::move( combinedClass );
+    }
+
+    return m_effectiveClasses[fullCombinedName].get();
+}
+
+
+void COMPONENT_CLASS_MANAGER::InvalidateComponentClasses()
+{
+    ++m_ticker;
+}
+
+
+void COMPONENT_CLASS_MANAGER::ForceComponentClassRecalculation() const
+{
+    for( const auto& footprint : m_board->Footprints() )
+    {
+        footprint->RecomputeComponentClass();
+    }
+}
+
+
+const COMPONENT_CLASS*
+COMPONENT_CLASS_MANAGER::GetDynamicComponentClassesForFootprint( const FOOTPRINT* footprint )
+{
+    std::unordered_set<wxString> classNames;
+
+    // Assemble matching component class names
+    for( const auto& rule : m_assignmentRules )
+    {
+        if( rule->Matches( footprint ) )
+            classNames.insert( rule->GetComponentClass() );
+    }
+
+    // Handle composite component classes
+    const std::vector<wxString> sortedClassNames = sortClassNames( classNames );
+    const wxString fullName = GetFullClassNameForConstituents( sortedClassNames );
+
+    // No matching component classes
+    if( classNames.empty() )
+        return nullptr;
+
+    // One matching component class
+    if( classNames.size() == 1 )
+        return getOrCreateConstituentClass( *classNames.begin(), COMPONENT_CLASS::USAGE::DYNAMIC );
+
+    // Multiple matching component classes
+    return getOrCreateEffectiveClass( sortedClassNames, COMPONENT_CLASS::USAGE::DYNAMIC );
+}
+
+
+std::vector<wxString>
+COMPONENT_CLASS_MANAGER::sortClassNames( const std::unordered_set<wxString>& classNames )
+{
+    std::vector<wxString> sortedClassNames( classNames.begin(), classNames.end() );
+
+    std::ranges::sort( sortedClassNames,
+                       []( const wxString& str1, const wxString& str2 )
+                       {
+                           return str1.Cmp( str2 ) < 0;
+                       } );
+
+    return sortedClassNames;
+}
+
+
+COMPONENT_CLASS*
+COMPONENT_CLASS_MANAGER::getOrCreateConstituentClass( const wxString&        aClassName,
+                                                      COMPONENT_CLASS::USAGE aContext )
+{
+    if( aContext == COMPONENT_CLASS::USAGE::STATIC_AND_DYNAMIC
+        || aContext == COMPONENT_CLASS::USAGE::EFFECTIVE )
+    {
+        wxFAIL_MSG( "Can't create a STATIC_AND_DYNAMIC or EFFECTIVE constituent component class" );
+        return m_noneClass.get();
+    }
+
+    if( m_constituentClasses.contains( aClassName ) )
+    {
+        COMPONENT_CLASS* compClass = m_constituentClasses[aClassName].get();
+
+        if( aContext != compClass->GetUsageContext() )
+            compClass->SetUsageContext( COMPONENT_CLASS::USAGE::STATIC_AND_DYNAMIC );
+
+        return compClass;
+    }
+
+    std::unique_ptr<COMPONENT_CLASS> newClass =
+            std::make_unique<COMPONENT_CLASS>( aClassName, aContext );
+    newClass->AddConstituentClass( newClass.get() );
+
+    m_constituentClasses[aClassName] = std::move( newClass );
+
+    return m_constituentClasses[aClassName].get();
+}
+
+
+COMPONENT_CLASS*
+COMPONENT_CLASS_MANAGER::getOrCreateEffectiveClass( const std::vector<wxString>& aClassNames,
+                                                    COMPONENT_CLASS::USAGE       aContext )
+{
+    wxString fullClassName = GetFullClassNameForConstituents( aClassNames );
+
+    if( m_effectiveClasses.contains( fullClassName ) )
+    {
+        COMPONENT_CLASS* compClass = m_effectiveClasses[fullClassName].get();
+
+        for( COMPONENT_CLASS* constituentClass : compClass->GetConstituentClasses() )
+        {
+            if( constituentClass->GetUsageContext() != aContext )
+                constituentClass->SetUsageContext( COMPONENT_CLASS::USAGE::STATIC_AND_DYNAMIC );
+        }
+    }
+    else
+    {
+        std::unique_ptr<COMPONENT_CLASS> effectiveClass = std::make_unique<COMPONENT_CLASS>(
+                fullClassName, COMPONENT_CLASS::USAGE::EFFECTIVE );
+
+        for( const wxString& className : aClassNames )
+        {
+            COMPONENT_CLASS* constituentClass = getOrCreateConstituentClass( className, aContext );
+            effectiveClass->AddConstituentClass( constituentClass );
+        }
+
+        m_effectiveClasses[fullClassName] = std::move( effectiveClass );
+    }
+
+    return m_effectiveClasses[fullClassName].get();
+}
+
+
+std::unordered_set<wxString> COMPONENT_CLASS_MANAGER::GetClassNames() const
+{
+    std::unordered_set<wxString> classNames;
+
+    for( const auto& className : m_constituentClasses | std::views::keys )
+        classNames.insert( className );
+
+    return classNames;
+}
+
+
+void COMPONENT_CLASS_MANAGER::RebuildRequiredCaches( FOOTPRINT* aFootprint ) const
+{
+    if( aFootprint )
+    {
+        aFootprint->BuildCourtyardCaches();
+    }
+    else
+    {
+        for( FOOTPRINT* fp : m_board->Footprints() )
+            fp->BuildCourtyardCaches();
+    }
+}
diff --git a/pcbnew/component_classes/component_class_manager.h b/pcbnew/component_classes/component_class_manager.h
new file mode 100644
index 0000000000..cf2eeb6cab
--- /dev/null
+++ b/pcbnew/component_classes/component_class_manager.h
@@ -0,0 +1,153 @@
+/*
+ * This program source code file is part of KiCad, a free EDA CAD application.
+ *
+ * Copyright The KiCad Developers, see AUTHORS.txt for contributors.
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef PCBNEW_COMPONENT_CLASS_MANAGER_H
+#define PCBNEW_COMPONENT_CLASS_MANAGER_H
+
+#include <unordered_map>
+#include <unordered_set>
+#include <wx/string.h>
+
+#include <component_classes/component_class.h>
+#include <project/component_class_settings.h>
+
+
+class BOARD;
+class COMPONENT_CLASS_ASSIGNMENT_RULE;
+class DRC_TOOL;
+class FOOTPRINT;
+
+/**
+ * A class to manage Component Classes in a board context
+ *
+ * This manager owns generated COMPONENT_CLASS objects, and guarantees that pointers to managed
+ * objects are valid for the duration of the board lifetime. Note that, in order to maintain this
+ * guarantee, there are two methods that must be called when updating the board from the netlist
+ * (InitNetlistUpdate and FinishNetlistUpdate).
+ */
+class COMPONENT_CLASS_MANAGER
+{
+public:
+    explicit COMPONENT_CLASS_MANAGER( BOARD* board );
+
+    /// @brief Gets the full effective class name for the given set of constituent classes
+    static wxString
+    GetFullClassNameForConstituents( const std::unordered_set<wxString>& classNames );
+
+    /// @brief Gets the full effective class name for the given set of constituent classes
+    /// @param classNames a sorted vector of consituent class names
+    static wxString GetFullClassNameForConstituents( const std::vector<wxString>& classNames );
+
+    /// @brief Gets an effective component class for the given constituent class names
+    /// @param classNames The names of the constituent component classes
+    /// @return Effective COMPONENT_CLASS object
+    COMPONENT_CLASS*
+    GetEffectiveStaticComponentClass( const std::unordered_set<wxString>& classNames );
+
+    /// Returns the unassigned component class
+    const COMPONENT_CLASS* GetNoneComponentClass() const { return m_noneClass.get(); }
+
+    /// Prepare the manager for a board update
+    /// Must be called prior to updating the PCB from the netlist
+    void InitNetlistUpdate();
+
+    /// Cleans up the manager after a board update
+    /// Must be called after updating the PCB from the netlist
+    void FinishNetlistUpdate();
+
+    /// Fetches a read-only map of the fundamental component classes
+    std::unordered_set<wxString> GetClassNames() const;
+
+    /// Synchronises all dynamic component class assignment rules
+    /// @returns false if rules fail to parse, true if successful
+    bool SyncDynamicComponentClassAssignments(
+            const std::vector<COMPONENT_CLASS_ASSIGNMENT_DATA>& aAssignments,
+            bool aGenerateSheetClasses, const std::unordered_set<wxString>& aNewSheetPaths );
+
+    /// Gets the dynamic component classes which match the given footprint
+    const COMPONENT_CLASS* GetDynamicComponentClassesForFootprint( const FOOTPRINT* footprint );
+
+    /// Gets the combined component class with the given static and dynamic constituent component classes
+    const COMPONENT_CLASS* GetCombinedComponentClass( const COMPONENT_CLASS* staticClass,
+                                                      const COMPONENT_CLASS* dynamicClass );
+
+    /// Forces the component class for all footprints to be recalculated. This should be called before running DRC as
+    /// checking for valid component class cache entries is threadsafe, but computing them is not. Blocking during this
+    /// check would be a negative performance impact for DRC computation, so we force recalculation instead.
+    void ForceComponentClassRecalculation() const;
+
+    /// Gets the component class validity ticker
+    /// Used to check validity of cached component classes
+    long long int GetTicker() const { return m_ticker; }
+
+    /// Invalidates any caches component classes and recomputes caches if required. This will force
+    /// recomputation of component classes on next access
+    void InvalidateComponentClasses();
+
+    /// Rebuilds any caches that may be required by custom assignment rules
+    /// @param fp the footprint to rebuild. If null, rebuilds all footprint caches
+    void RebuildRequiredCaches( FOOTPRINT* aFootprint = nullptr ) const;
+
+    /// Determines whether any custom dynamic rules have a custom assignment condition
+    bool HasCustomAssignmentConditions() const { return m_hasCustomAssignmentConditions; }
+
+    static std::shared_ptr<COMPONENT_CLASS_ASSIGNMENT_RULE>
+    CompileAssignmentRule( const COMPONENT_CLASS_ASSIGNMENT_DATA& aAssignment );
+
+protected:
+    /// Sorts the given class names in to canonical order
+    static std::vector<wxString> sortClassNames( const std::unordered_set<wxString>& classNames );
+
+    /// Returns a constituent component class, re-using an existing instantiation where possible
+    COMPONENT_CLASS* getOrCreateConstituentClass( const wxString&        aClassName,
+                                                  COMPONENT_CLASS::USAGE aContext );
+
+    /// Returns an effective component class for the given set of constituent class names
+    /// Precondition: aClassNames is sorted by sortClassNames
+    COMPONENT_CLASS* getOrCreateEffectiveClass( const std::vector<wxString>& aClassNames,
+                                                COMPONENT_CLASS::USAGE       aContext );
+
+    /// The board these component classes are assigned to / from
+    BOARD* m_board;
+
+    /// The class to represent an unassigned component class
+    std::shared_ptr<COMPONENT_CLASS> m_noneClass;
+
+    /// All individual component classes from static assignments
+    std::unordered_map<wxString, std::unique_ptr<COMPONENT_CLASS>> m_constituentClasses;
+
+    /// Generated effective (composite) static component classes
+    std::unordered_map<wxString, std::unique_ptr<COMPONENT_CLASS>> m_effectiveClasses;
+
+    /// Cache of in-use static component class names
+    /// Used for cleanup following netlist updates
+    std::unordered_set<wxString> m_staticClassNamesCache;
+
+
+    /// Active component class assignment rules
+    std::vector<std::shared_ptr<COMPONENT_CLASS_ASSIGNMENT_RULE>> m_assignmentRules;
+
+    /// Quick lookup of presence of custom dynamic assignment conditions
+    bool m_hasCustomAssignmentConditions;
+
+    /// Monotonically increasing ticker to test cached component class validity
+    long long int m_ticker{ 0 };
+};
+
+#endif
diff --git a/pcbnew/dialogs/dialog_board_setup.cpp b/pcbnew/dialogs/dialog_board_setup.cpp
index 7849576e0c..5e41a12b7a 100644
--- a/pcbnew/dialogs/dialog_board_setup.cpp
+++ b/pcbnew/dialogs/dialog_board_setup.cpp
@@ -37,6 +37,7 @@
 #include <dialogs/panel_setup_teardrops.h>
 #include <dialogs/panel_setup_tuning_patterns.h>
 #include <dialogs/panel_setup_netclasses.h>
+#include <dialogs/panel_assign_component_classes.h>
 #include <panel_text_variables.h>
 #include <project.h>
 #include <project/project_file.h>
@@ -47,6 +48,8 @@
 
 #include "dialog_board_setup.h"
 
+#include <footprint.h>
+
 
 #define RESOLVE_PAGE( T, pageIndex ) static_cast<T*>( m_treebook->ResolvePage( pageIndex ) )
 
@@ -185,6 +188,17 @@ DIALOG_BOARD_SETUP::DIALOG_BOARD_SETUP( PCB_EDIT_FRAME* aFrame ) :
                                                    false );
             }, _( "Net Classes" ) );
 
+    m_componentClassesPage = m_treebook->GetPageCount();
+    m_treebook->AddLazySubPage(
+            [this]( wxWindow* aParent ) -> wxWindow*
+            {
+                // Construct the panel
+                return new PANEL_ASSIGN_COMPONENT_CLASSES(
+                        aParent, m_frame, m_frame->Prj().GetProjectFile().ComponentClassSettings(),
+                        this );
+            },
+            _( "Component Classes" ) );
+
     m_customRulesPage = m_treebook->GetPageCount();
     m_treebook->AddLazySubPage(
             [this]( wxWindow* aParent ) -> wxWindow*
@@ -377,6 +391,14 @@ void DIALOG_BOARD_SETUP::onAuxiliaryAction( wxCommandEvent& aEvent )
                           m_netclassesPage )->ImportSettingsFrom( otherProjectFile.m_NetSettings );
         }
 
+        if( importDlg.m_ComponentClassesOpt->GetValue() )
+        {
+            PROJECT_FILE& otherProjectFile = otherPrj->GetProjectFile();
+
+            RESOLVE_PAGE( PANEL_ASSIGN_COMPONENT_CLASSES, m_componentClassesPage )
+                    ->ImportSettingsFrom( otherProjectFile.m_ComponentClassSettings );
+        }
+
         if( importDlg.m_TracksAndViasOpt->GetValue() )
         {
             RESOLVE_PAGE( PANEL_SETUP_TRACKS_AND_VIAS,
diff --git a/pcbnew/dialogs/dialog_board_setup.h b/pcbnew/dialogs/dialog_board_setup.h
index 8a5ea3d027..182634f45d 100644
--- a/pcbnew/dialogs/dialog_board_setup.h
+++ b/pcbnew/dialogs/dialog_board_setup.h
@@ -67,6 +67,7 @@ private:
     size_t m_teardropsPage;
     size_t m_tuningPatternsPage;
     size_t m_netclassesPage;
+    size_t m_componentClassesPage;
     size_t m_customRulesPage;
     size_t m_severitiesPage;
     size_t m_embeddedFilesPage;
diff --git a/pcbnew/dialogs/dialog_import_settings.cpp b/pcbnew/dialogs/dialog_import_settings.cpp
index 10e8343d16..6e5b9a323a 100644
--- a/pcbnew/dialogs/dialog_import_settings.cpp
+++ b/pcbnew/dialogs/dialog_import_settings.cpp
@@ -83,7 +83,8 @@ bool DIALOG_IMPORT_SETTINGS::UpdateImportSettingsButton()
                                || m_ConstraintsOpt->IsChecked() || m_NetclassesOpt->IsChecked()
                                || m_SeveritiesOpt->IsChecked() || m_TextAndGraphicsOpt->IsChecked()
                                || m_FormattingOpt->IsChecked() || m_TracksAndViasOpt->IsChecked()
-                               || m_TuningPatternsOpt->IsChecked() || m_CustomRulesOpt->IsChecked() );
+                               || m_TuningPatternsOpt->IsChecked() || m_CustomRulesOpt->IsChecked()
+                               || m_ComponentClassesOpt->IsChecked() );
 
     m_sdbSizer1OK->Enable( buttonEnableState );
 
diff --git a/pcbnew/dialogs/dialog_import_settings_base.cpp b/pcbnew/dialogs/dialog_import_settings_base.cpp
index 6f9bbcb0f8..b35ec938c8 100644
--- a/pcbnew/dialogs/dialog_import_settings_base.cpp
+++ b/pcbnew/dialogs/dialog_import_settings_base.cpp
@@ -1,5 +1,5 @@
 ///////////////////////////////////////////////////////////////////////////
-// C++ code generated with wxFormBuilder (version 3.10.1-0-g8feb16b)
+// C++ code generated with wxFormBuilder (version 4.2.1-0-g80c4cb6)
 // http://www.wxformbuilder.org/
 //
 // PLEASE DO *NOT* EDIT THIS FILE!
@@ -75,6 +75,9 @@ DIALOG_IMPORT_SETTINGS_BASE::DIALOG_IMPORT_SETTINGS_BASE( wxWindow* parent, wxWi
 	m_NetclassesOpt = new wxCheckBox( this, wxID_ANY, _("Net classes"), wxDefaultPosition, wxDefaultSize, 0 );
 	bLeftCol->Add( m_NetclassesOpt, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 );
 
+	m_ComponentClassesOpt = new wxCheckBox( this, wxID_ANY, _("Component classes"), wxDefaultPosition, wxDefaultSize, 0 );
+	bLeftCol->Add( m_ComponentClassesOpt, 0, wxBOTTOM|wxLEFT|wxRIGHT, 5 );
+
 	m_CustomRulesOpt = new wxCheckBox( this, wxID_ANY, _("Custom rules"), wxDefaultPosition, wxDefaultSize, 0 );
 	bLeftCol->Add( m_CustomRulesOpt, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 );
 
@@ -120,6 +123,7 @@ DIALOG_IMPORT_SETTINGS_BASE::DIALOG_IMPORT_SETTINGS_BASE( wxWindow* parent, wxWi
 	m_TracksAndViasOpt->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_IMPORT_SETTINGS_BASE::OnCheckboxClicked ), NULL, this );
 	m_TuningPatternsOpt->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_IMPORT_SETTINGS_BASE::OnCheckboxClicked ), NULL, this );
 	m_NetclassesOpt->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_IMPORT_SETTINGS_BASE::OnCheckboxClicked ), NULL, this );
+	m_ComponentClassesOpt->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_IMPORT_SETTINGS_BASE::OnCheckboxClicked ), NULL, this );
 	m_CustomRulesOpt->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_IMPORT_SETTINGS_BASE::OnCheckboxClicked ), NULL, this );
 	m_SeveritiesOpt->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_IMPORT_SETTINGS_BASE::OnCheckboxClicked ), NULL, this );
 	m_selectAllButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_IMPORT_SETTINGS_BASE::OnSelectAll ), NULL, this );
@@ -136,6 +140,7 @@ DIALOG_IMPORT_SETTINGS_BASE::~DIALOG_IMPORT_SETTINGS_BASE()
 	m_TracksAndViasOpt->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_IMPORT_SETTINGS_BASE::OnCheckboxClicked ), NULL, this );
 	m_TuningPatternsOpt->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_IMPORT_SETTINGS_BASE::OnCheckboxClicked ), NULL, this );
 	m_NetclassesOpt->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_IMPORT_SETTINGS_BASE::OnCheckboxClicked ), NULL, this );
+	m_ComponentClassesOpt->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_IMPORT_SETTINGS_BASE::OnCheckboxClicked ), NULL, this );
 	m_CustomRulesOpt->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_IMPORT_SETTINGS_BASE::OnCheckboxClicked ), NULL, this );
 	m_SeveritiesOpt->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_IMPORT_SETTINGS_BASE::OnCheckboxClicked ), NULL, this );
 	m_selectAllButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_IMPORT_SETTINGS_BASE::OnSelectAll ), NULL, this );
diff --git a/pcbnew/dialogs/dialog_import_settings_base.fbp b/pcbnew/dialogs/dialog_import_settings_base.fbp
index 3d4a758985..3e5eb8efa7 100644
--- a/pcbnew/dialogs/dialog_import_settings_base.fbp
+++ b/pcbnew/dialogs/dialog_import_settings_base.fbp
@@ -1,1176 +1,1261 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
 <wxFormBuilder_Project>
-    <FileVersion major="1" minor="16" />
-    <object class="Project" expanded="1">
-        <property name="class_decoration"></property>
-        <property name="code_generation">C++</property>
-        <property name="disconnect_events">1</property>
-        <property name="disconnect_mode">source_name</property>
-        <property name="disconnect_php_events">0</property>
-        <property name="disconnect_python_events">0</property>
-        <property name="embedded_files_path">res</property>
-        <property name="encoding">UTF-8</property>
-        <property name="event_generation">connect</property>
-        <property name="file">dialog_import_settings_base</property>
-        <property name="first_id">1000</property>
-        <property name="help_provider">none</property>
-        <property name="image_path_wrapper_function_name"></property>
-        <property name="indent_with_spaces"></property>
-        <property name="internationalize">1</property>
-        <property name="name">dialog_import_settings_base</property>
-        <property name="namespace"></property>
-        <property name="path">.</property>
-        <property name="precompiled_header"></property>
-        <property name="relative_path">1</property>
-        <property name="skip_lua_events">1</property>
-        <property name="skip_php_events">1</property>
-        <property name="skip_python_events">1</property>
-        <property name="ui_table">UI</property>
-        <property name="use_array_enum">0</property>
-        <property name="use_enum">1</property>
-        <property name="use_microsoft_bom">0</property>
-        <object class="Dialog" expanded="1">
-            <property name="aui_managed">0</property>
-            <property name="aui_manager_style">wxAUI_MGR_DEFAULT</property>
-            <property name="bg"></property>
-            <property name="center">wxBOTH</property>
-            <property name="context_help"></property>
-            <property name="context_menu">1</property>
-            <property name="enabled">1</property>
-            <property name="event_handler">impl_virtual</property>
-            <property name="extra_style"></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">-1,-1</property>
-            <property name="name">DIALOG_IMPORT_SETTINGS_BASE</property>
-            <property name="pos"></property>
-            <property name="size">-1,-1</property>
-            <property name="style">wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER</property>
-            <property name="subclass">DIALOG_SHIM; dialog_shim.h</property>
-            <property name="title">Import Settings</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"></property>
-            <object class="wxBoxSizer" expanded="1">
+  <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">1</property>
+    <property name="cpp_event_generation">connect</property>
+    <property name="cpp_help_provider">none</property>
+    <property name="cpp_namespace"></property>
+    <property name="cpp_precompiled_header"></property>
+    <property name="cpp_use_array_enum">0</property>
+    <property name="cpp_use_enum">1</property>
+    <property name="embedded_files_path">res</property>
+    <property name="encoding">UTF-8</property>
+    <property name="file">dialog_import_settings_base</property>
+    <property name="first_id">1000</property>
+    <property name="internationalize">1</property>
+    <property name="lua_skip_events">1</property>
+    <property name="lua_ui_table">UI</property>
+    <property name="name">dialog_import_settings_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"></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="Dialog" expanded="true">
+      <property name="aui_managed">0</property>
+      <property name="aui_manager_style">wxAUI_MGR_DEFAULT</property>
+      <property name="bg"></property>
+      <property name="center">wxBOTH</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="extra_style"></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">-1,-1</property>
+      <property name="name">DIALOG_IMPORT_SETTINGS_BASE</property>
+      <property name="pos"></property>
+      <property name="size">-1,-1</property>
+      <property name="style">wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER</property>
+      <property name="subclass">DIALOG_SHIM; dialog_shim.h</property>
+      <property name="title">Import Settings</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"></property>
+      <object class="wxBoxSizer" expanded="true">
+        <property name="minimum_size"></property>
+        <property name="name">m_MainSizer</property>
+        <property name="orient">wxVERTICAL</property>
+        <property name="permission">protected</property>
+        <object class="sizeritem" expanded="true">
+          <property name="border">5</property>
+          <property name="flag">wxEXPAND|wxTOP|wxRIGHT|wxLEFT</property>
+          <property name="proportion">0</property>
+          <object class="wxBoxSizer" expanded="true">
+            <property name="minimum_size"></property>
+            <property name="name">bUpperSizer</property>
+            <property name="orient">wxHORIZONTAL</property>
+            <property name="permission">none</property>
+            <object class="sizeritem" expanded="false">
+              <property name="border">5</property>
+              <property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property>
+              <property name="proportion">0</property>
+              <object class="wxStaticText" expanded="false">
+                <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">Import from:</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">m_MainSizer</property>
-                <property name="orient">wxVERTICAL</property>
-                <property name="permission">protected</property>
-                <object class="sizeritem" expanded="1">
-                    <property name="border">5</property>
-                    <property name="flag">wxEXPAND|wxTOP|wxRIGHT|wxLEFT</property>
-                    <property name="proportion">0</property>
-                    <object class="wxBoxSizer" expanded="1">
-                        <property name="minimum_size"></property>
-                        <property name="name">bUpperSizer</property>
-                        <property name="orient">wxHORIZONTAL</property>
-                        <property name="permission">none</property>
-                        <object class="sizeritem" expanded="0">
-                            <property name="border">5</property>
-                            <property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property>
-                            <property name="proportion">0</property>
-                            <object class="wxStaticText" expanded="0">
-                                <property name="BottomDockable">1</property>
-                                <property name="LeftDockable">1</property>
-                                <property name="RightDockable">1</property>
-                                <property name="TopDockable">1</property>
-                                <property name="aui_layer"></property>
-                                <property name="aui_name"></property>
-                                <property name="aui_position"></property>
-                                <property name="aui_row"></property>
-                                <property name="best_size"></property>
-                                <property name="bg"></property>
-                                <property name="caption"></property>
-                                <property name="caption_visible">1</property>
-                                <property name="center_pane">0</property>
-                                <property name="close_button">1</property>
-                                <property name="context_help"></property>
-                                <property name="context_menu">1</property>
-                                <property name="default_pane">0</property>
-                                <property name="dock">Dock</property>
-                                <property name="dock_fixed">0</property>
-                                <property name="docking">Left</property>
-                                <property name="enabled">1</property>
-                                <property name="fg"></property>
-                                <property name="floatable">1</property>
-                                <property name="font"></property>
-                                <property name="gripper">0</property>
-                                <property name="hidden">0</property>
-                                <property name="id">wxID_ANY</property>
-                                <property name="label">Import from:</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">importFromLabel</property>
-                                <property name="pane_border">1</property>
-                                <property name="pane_position"></property>
-                                <property name="pane_size"></property>
-                                <property name="permission">none</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"></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="0">
-                            <property name="border">5</property>
-                            <property name="flag">wxEXPAND|wxTOP|wxBOTTOM</property>
-                            <property name="proportion">1</property>
-                            <object class="wxTextCtrl" expanded="0">
-                                <property name="BottomDockable">1</property>
-                                <property name="LeftDockable">1</property>
-                                <property name="RightDockable">1</property>
-                                <property name="TopDockable">1</property>
-                                <property name="aui_layer"></property>
-                                <property name="aui_name"></property>
-                                <property name="aui_position"></property>
-                                <property name="aui_row"></property>
-                                <property name="best_size"></property>
-                                <property name="bg"></property>
-                                <property name="caption"></property>
-                                <property name="caption_visible">1</property>
-                                <property name="center_pane">0</property>
-                                <property name="close_button">1</property>
-                                <property name="context_help"></property>
-                                <property name="context_menu">1</property>
-                                <property name="default_pane">0</property>
-                                <property name="dock">Dock</property>
-                                <property name="dock_fixed">0</property>
-                                <property name="docking">Left</property>
-                                <property name="enabled">1</property>
-                                <property name="fg"></property>
-                                <property name="floatable">1</property>
-                                <property name="font"></property>
-                                <property name="gripper">0</property>
-                                <property name="hidden">0</property>
-                                <property name="id">wxID_ANY</property>
-                                <property name="max_size"></property>
-                                <property name="maximize_button">0</property>
-                                <property name="maximum_size"></property>
-                                <property name="maxlength">0</property>
-                                <property name="min_size"></property>
-                                <property name="minimize_button">0</property>
-                                <property name="minimum_size">300,-1</property>
-                                <property name="moveable">1</property>
-                                <property name="name">m_filePathCtrl</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">Target directory for plot files. Can be absolute or relative to the board file location.</property>
-                                <property name="validator_data_type"></property>
-                                <property name="validator_style">wxFILTER_NONE</property>
-                                <property name="validator_type">wxDefaultValidator</property>
-                                <property name="validator_variable"></property>
-                                <property name="value"></property>
-                                <property name="window_extra_style"></property>
-                                <property name="window_name"></property>
-                                <property name="window_style"></property>
-                            </object>
-                        </object>
-                        <object class="sizeritem" expanded="0">
-                            <property name="border">5</property>
-                            <property name="flag">wxALIGN_CENTER_VERTICAL|wxRIGHT</property>
-                            <property name="proportion">0</property>
-                            <object class="wxBitmapButton" expanded="0">
-                                <property name="BottomDockable">1</property>
-                                <property name="LeftDockable">1</property>
-                                <property name="RightDockable">1</property>
-                                <property name="TopDockable">1</property>
-                                <property name="aui_layer"></property>
-                                <property name="aui_name"></property>
-                                <property name="aui_position"></property>
-                                <property name="aui_row"></property>
-                                <property name="auth_needed">0</property>
-                                <property name="best_size"></property>
-                                <property name="bg"></property>
-                                <property name="bitmap"></property>
-                                <property name="caption"></property>
-                                <property name="caption_visible">1</property>
-                                <property name="center_pane">0</property>
-                                <property name="close_button">1</property>
-                                <property name="context_help"></property>
-                                <property name="context_menu">1</property>
-                                <property name="current"></property>
-                                <property name="default">0</property>
-                                <property name="default_pane">0</property>
-                                <property name="disabled"></property>
-                                <property name="dock">Dock</property>
-                                <property name="dock_fixed">0</property>
-                                <property name="docking">Left</property>
-                                <property name="enabled">1</property>
-                                <property name="fg"></property>
-                                <property name="floatable">1</property>
-                                <property name="focus"></property>
-                                <property name="font"></property>
-                                <property name="gripper">0</property>
-                                <property name="hidden">0</property>
-                                <property name="id">wxID_ANY</property>
-                                <property name="label">Browse</property>
-                                <property name="margins"></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">-1,-1</property>
-                                <property name="moveable">1</property>
-                                <property name="name">m_browseButton</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="position"></property>
-                                <property name="pressed"></property>
-                                <property name="resize">Resizable</property>
-                                <property name="show">1</property>
-                                <property name="size">-1,-1</property>
-                                <property name="style"></property>
-                                <property name="subclass">STD_BITMAP_BUTTON; widgets/std_bitmap_button.h; 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="OnButtonClick">OnBrowseClicked</event>
-                            </object>
-                        </object>
-                    </object>
-                </object>
-                <object class="sizeritem" expanded="1">
-                    <property name="border">5</property>
-                    <property name="flag">wxEXPAND|wxBOTTOM</property>
-                    <property name="proportion">1</property>
-                    <object class="wxBoxSizer" expanded="1">
-                        <property name="minimum_size"></property>
-                        <property name="name">bMiddleSizer</property>
-                        <property name="orient">wxHORIZONTAL</property>
-                        <property name="permission">none</property>
-                        <object class="sizeritem" expanded="1">
-                            <property name="border">10</property>
-                            <property name="flag">wxEXPAND|wxRIGHT|wxLEFT</property>
-                            <property name="proportion">0</property>
-                            <object class="wxBoxSizer" expanded="1">
-                                <property name="minimum_size"></property>
-                                <property name="name">bLeftCol</property>
-                                <property name="orient">wxVERTICAL</property>
-                                <property name="permission">none</property>
-                                <object class="sizeritem" expanded="0">
-                                    <property name="border">5</property>
-                                    <property name="flag">wxTOP|wxBOTTOM|wxRIGHT</property>
-                                    <property name="proportion">0</property>
-                                    <object class="wxStaticText" expanded="0">
-                                        <property name="BottomDockable">1</property>
-                                        <property name="LeftDockable">1</property>
-                                        <property name="RightDockable">1</property>
-                                        <property name="TopDockable">1</property>
-                                        <property name="aui_layer"></property>
-                                        <property name="aui_name"></property>
-                                        <property name="aui_position"></property>
-                                        <property name="aui_row"></property>
-                                        <property name="best_size"></property>
-                                        <property name="bg"></property>
-                                        <property name="caption"></property>
-                                        <property name="caption_visible">1</property>
-                                        <property name="center_pane">0</property>
-                                        <property name="close_button">1</property>
-                                        <property name="context_help"></property>
-                                        <property name="context_menu">1</property>
-                                        <property name="default_pane">0</property>
-                                        <property name="dock">Dock</property>
-                                        <property name="dock_fixed">0</property>
-                                        <property name="docking">Left</property>
-                                        <property name="enabled">1</property>
-                                        <property name="fg"></property>
-                                        <property name="floatable">1</property>
-                                        <property name="font"></property>
-                                        <property name="gripper">0</property>
-                                        <property name="hidden">0</property>
-                                        <property name="id">wxID_ANY</property>
-                                        <property name="label">Import:</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">importLabel</property>
-                                        <property name="pane_border">1</property>
-                                        <property name="pane_position"></property>
-                                        <property name="pane_size"></property>
-                                        <property name="permission">none</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="0">
-                                    <property name="border">5</property>
-                                    <property name="flag">wxBOTTOM|wxRIGHT|wxLEFT</property>
-                                    <property name="proportion">0</property>
-                                    <object class="wxCheckBox" expanded="0">
-                                        <property name="BottomDockable">1</property>
-                                        <property name="LeftDockable">1</property>
-                                        <property name="RightDockable">1</property>
-                                        <property name="TopDockable">1</property>
-                                        <property name="aui_layer"></property>
-                                        <property name="aui_name"></property>
-                                        <property name="aui_position"></property>
-                                        <property name="aui_row"></property>
-                                        <property name="best_size"></property>
-                                        <property name="bg"></property>
-                                        <property name="caption"></property>
-                                        <property name="caption_visible">1</property>
-                                        <property name="center_pane">0</property>
-                                        <property name="checked">0</property>
-                                        <property name="close_button">1</property>
-                                        <property name="context_help"></property>
-                                        <property name="context_menu">1</property>
-                                        <property name="default_pane">0</property>
-                                        <property name="dock">Dock</property>
-                                        <property name="dock_fixed">0</property>
-                                        <property name="docking">Left</property>
-                                        <property name="enabled">1</property>
-                                        <property name="fg"></property>
-                                        <property name="floatable">1</property>
-                                        <property name="font"></property>
-                                        <property name="gripper">0</property>
-                                        <property name="hidden">0</property>
-                                        <property name="id">wxID_ANY</property>
-                                        <property name="label">Board layers and physical stackup</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_LayersOpt</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>
-                                        <event name="OnCheckBox">OnCheckboxClicked</event>
-                                    </object>
-                                </object>
-                                <object class="sizeritem" expanded="0">
-                                    <property name="border">5</property>
-                                    <property name="flag">wxBOTTOM|wxRIGHT|wxLEFT</property>
-                                    <property name="proportion">0</property>
-                                    <object class="wxCheckBox" expanded="0">
-                                        <property name="BottomDockable">1</property>
-                                        <property name="LeftDockable">1</property>
-                                        <property name="RightDockable">1</property>
-                                        <property name="TopDockable">1</property>
-                                        <property name="aui_layer"></property>
-                                        <property name="aui_name"></property>
-                                        <property name="aui_position"></property>
-                                        <property name="aui_row"></property>
-                                        <property name="best_size"></property>
-                                        <property name="bg"></property>
-                                        <property name="caption"></property>
-                                        <property name="caption_visible">1</property>
-                                        <property name="center_pane">0</property>
-                                        <property name="checked">0</property>
-                                        <property name="close_button">1</property>
-                                        <property name="context_help"></property>
-                                        <property name="context_menu">1</property>
-                                        <property name="default_pane">0</property>
-                                        <property name="dock">Dock</property>
-                                        <property name="dock_fixed">0</property>
-                                        <property name="docking">Left</property>
-                                        <property name="enabled">1</property>
-                                        <property name="fg"></property>
-                                        <property name="floatable">1</property>
-                                        <property name="font"></property>
-                                        <property name="gripper">0</property>
-                                        <property name="hidden">0</property>
-                                        <property name="id">wxID_ANY</property>
-                                        <property name="label">Solder mask/paste defaults</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_MaskAndPasteOpt</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>
-                                        <event name="OnCheckBox">OnCheckboxClicked</event>
-                                    </object>
-                                </object>
-                                <object class="sizeritem" expanded="0">
-                                    <property name="border">5</property>
-                                    <property name="flag">wxBOTTOM|wxRIGHT|wxLEFT</property>
-                                    <property name="proportion">0</property>
-                                    <object class="wxCheckBox" expanded="0">
-                                        <property name="BottomDockable">1</property>
-                                        <property name="LeftDockable">1</property>
-                                        <property name="RightDockable">1</property>
-                                        <property name="TopDockable">1</property>
-                                        <property name="aui_layer"></property>
-                                        <property name="aui_name"></property>
-                                        <property name="aui_position"></property>
-                                        <property name="aui_row"></property>
-                                        <property name="best_size"></property>
-                                        <property name="bg"></property>
-                                        <property name="caption"></property>
-                                        <property name="caption_visible">1</property>
-                                        <property name="center_pane">0</property>
-                                        <property name="checked">0</property>
-                                        <property name="close_button">1</property>
-                                        <property name="context_help"></property>
-                                        <property name="context_menu">1</property>
-                                        <property name="default_pane">0</property>
-                                        <property name="dock">Dock</property>
-                                        <property name="dock_fixed">0</property>
-                                        <property name="docking">Left</property>
-                                        <property name="enabled">1</property>
-                                        <property name="fg"></property>
-                                        <property name="floatable">1</property>
-                                        <property name="font"></property>
-                                        <property name="gripper">0</property>
-                                        <property name="hidden">0</property>
-                                        <property name="id">wxID_ANY</property>
-                                        <property name="label">Text &amp;&amp; graphics default properties</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_TextAndGraphicsOpt</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>
-                                        <event name="OnCheckBox">OnCheckboxClicked</event>
-                                    </object>
-                                </object>
-                                <object class="sizeritem" expanded="1">
-                                    <property name="border">5</property>
-                                    <property name="flag">wxBOTTOM|wxRIGHT|wxLEFT</property>
-                                    <property name="proportion">0</property>
-                                    <object class="wxCheckBox" expanded="1">
-                                        <property name="BottomDockable">1</property>
-                                        <property name="LeftDockable">1</property>
-                                        <property name="RightDockable">1</property>
-                                        <property name="TopDockable">1</property>
-                                        <property name="aui_layer"></property>
-                                        <property name="aui_name"></property>
-                                        <property name="aui_position"></property>
-                                        <property name="aui_row"></property>
-                                        <property name="best_size"></property>
-                                        <property name="bg"></property>
-                                        <property name="caption"></property>
-                                        <property name="caption_visible">1</property>
-                                        <property name="center_pane">0</property>
-                                        <property name="checked">0</property>
-                                        <property name="close_button">1</property>
-                                        <property name="context_help"></property>
-                                        <property name="context_menu">1</property>
-                                        <property name="default_pane">0</property>
-                                        <property name="dock">Dock</property>
-                                        <property name="dock_fixed">0</property>
-                                        <property name="docking">Left</property>
-                                        <property name="enabled">1</property>
-                                        <property name="fg"></property>
-                                        <property name="floatable">1</property>
-                                        <property name="font"></property>
-                                        <property name="gripper">0</property>
-                                        <property name="hidden">0</property>
-                                        <property name="id">wxID_ANY</property>
-                                        <property name="label">Text &amp;&amp; graphics formatting</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_FormattingOpt</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="0">
-                                    <property name="border">5</property>
-                                    <property name="flag">wxBOTTOM|wxRIGHT|wxLEFT</property>
-                                    <property name="proportion">0</property>
-                                    <object class="wxCheckBox" expanded="0">
-                                        <property name="BottomDockable">1</property>
-                                        <property name="LeftDockable">1</property>
-                                        <property name="RightDockable">1</property>
-                                        <property name="TopDockable">1</property>
-                                        <property name="aui_layer"></property>
-                                        <property name="aui_name"></property>
-                                        <property name="aui_position"></property>
-                                        <property name="aui_row"></property>
-                                        <property name="best_size"></property>
-                                        <property name="bg"></property>
-                                        <property name="caption"></property>
-                                        <property name="caption_visible">1</property>
-                                        <property name="center_pane">0</property>
-                                        <property name="checked">0</property>
-                                        <property name="close_button">1</property>
-                                        <property name="context_help"></property>
-                                        <property name="context_menu">1</property>
-                                        <property name="default_pane">0</property>
-                                        <property name="dock">Dock</property>
-                                        <property name="dock_fixed">0</property>
-                                        <property name="docking">Left</property>
-                                        <property name="enabled">1</property>
-                                        <property name="fg"></property>
-                                        <property name="floatable">1</property>
-                                        <property name="font"></property>
-                                        <property name="gripper">0</property>
-                                        <property name="hidden">0</property>
-                                        <property name="id">wxID_ANY</property>
-                                        <property name="label">Design rule constraints</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_ConstraintsOpt</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>
-                                        <event name="OnCheckBox">OnCheckboxClicked</event>
-                                    </object>
-                                </object>
-                                <object class="sizeritem" expanded="0">
-                                    <property name="border">5</property>
-                                    <property name="flag">wxBOTTOM|wxRIGHT|wxLEFT</property>
-                                    <property name="proportion">0</property>
-                                    <object class="wxCheckBox" expanded="0">
-                                        <property name="BottomDockable">1</property>
-                                        <property name="LeftDockable">1</property>
-                                        <property name="RightDockable">1</property>
-                                        <property name="TopDockable">1</property>
-                                        <property name="aui_layer"></property>
-                                        <property name="aui_name"></property>
-                                        <property name="aui_position"></property>
-                                        <property name="aui_row"></property>
-                                        <property name="best_size"></property>
-                                        <property name="bg"></property>
-                                        <property name="caption"></property>
-                                        <property name="caption_visible">1</property>
-                                        <property name="center_pane">0</property>
-                                        <property name="checked">0</property>
-                                        <property name="close_button">1</property>
-                                        <property name="context_help"></property>
-                                        <property name="context_menu">1</property>
-                                        <property name="default_pane">0</property>
-                                        <property name="dock">Dock</property>
-                                        <property name="dock_fixed">0</property>
-                                        <property name="docking">Left</property>
-                                        <property name="enabled">1</property>
-                                        <property name="fg"></property>
-                                        <property name="floatable">1</property>
-                                        <property name="font"></property>
-                                        <property name="gripper">0</property>
-                                        <property name="hidden">0</property>
-                                        <property name="id">wxID_ANY</property>
-                                        <property name="label">Predefined track &amp;&amp; via dimensions</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_TracksAndViasOpt</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>
-                                        <event name="OnCheckBox">OnCheckboxClicked</event>
-                                    </object>
-                                </object>
-                                <object class="sizeritem" expanded="1">
-                                    <property name="border">5</property>
-                                    <property name="flag">wxBOTTOM|wxRIGHT|wxLEFT</property>
-                                    <property name="proportion">0</property>
-                                    <object class="wxCheckBox" expanded="1">
-                                        <property name="BottomDockable">1</property>
-                                        <property name="LeftDockable">1</property>
-                                        <property name="RightDockable">1</property>
-                                        <property name="TopDockable">1</property>
-                                        <property name="aui_layer"></property>
-                                        <property name="aui_name"></property>
-                                        <property name="aui_position"></property>
-                                        <property name="aui_row"></property>
-                                        <property name="best_size"></property>
-                                        <property name="bg"></property>
-                                        <property name="caption"></property>
-                                        <property name="caption_visible">1</property>
-                                        <property name="center_pane">0</property>
-                                        <property name="checked">0</property>
-                                        <property name="close_button">1</property>
-                                        <property name="context_help"></property>
-                                        <property name="context_menu">1</property>
-                                        <property name="default_pane">0</property>
-                                        <property name="dock">Dock</property>
-                                        <property name="dock_fixed">0</property>
-                                        <property name="docking">Left</property>
-                                        <property name="enabled">1</property>
-                                        <property name="fg"></property>
-                                        <property name="floatable">1</property>
-                                        <property name="font"></property>
-                                        <property name="gripper">0</property>
-                                        <property name="hidden">0</property>
-                                        <property name="id">wxID_ANY</property>
-                                        <property name="label">Teardrop defaults</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_TeardropsOpt</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="1">
-                                    <property name="border">5</property>
-                                    <property name="flag">wxBOTTOM|wxRIGHT|wxLEFT</property>
-                                    <property name="proportion">0</property>
-                                    <object class="wxCheckBox" expanded="1">
-                                        <property name="BottomDockable">1</property>
-                                        <property name="LeftDockable">1</property>
-                                        <property name="RightDockable">1</property>
-                                        <property name="TopDockable">1</property>
-                                        <property name="aui_layer"></property>
-                                        <property name="aui_name"></property>
-                                        <property name="aui_position"></property>
-                                        <property name="aui_row"></property>
-                                        <property name="best_size"></property>
-                                        <property name="bg"></property>
-                                        <property name="caption"></property>
-                                        <property name="caption_visible">1</property>
-                                        <property name="center_pane">0</property>
-                                        <property name="checked">0</property>
-                                        <property name="close_button">1</property>
-                                        <property name="context_help"></property>
-                                        <property name="context_menu">1</property>
-                                        <property name="default_pane">0</property>
-                                        <property name="dock">Dock</property>
-                                        <property name="dock_fixed">0</property>
-                                        <property name="docking">Left</property>
-                                        <property name="enabled">1</property>
-                                        <property name="fg"></property>
-                                        <property name="floatable">1</property>
-                                        <property name="font"></property>
-                                        <property name="gripper">0</property>
-                                        <property name="hidden">0</property>
-                                        <property name="id">wxID_ANY</property>
-                                        <property name="label">Length-tuning pattern defaults</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_TuningPatternsOpt</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>
-                                        <event name="OnCheckBox">OnCheckboxClicked</event>
-                                    </object>
-                                </object>
-                                <object class="sizeritem" expanded="0">
-                                    <property name="border">5</property>
-                                    <property name="flag">wxBOTTOM|wxRIGHT|wxLEFT</property>
-                                    <property name="proportion">0</property>
-                                    <object class="wxCheckBox" expanded="0">
-                                        <property name="BottomDockable">1</property>
-                                        <property name="LeftDockable">1</property>
-                                        <property name="RightDockable">1</property>
-                                        <property name="TopDockable">1</property>
-                                        <property name="aui_layer"></property>
-                                        <property name="aui_name"></property>
-                                        <property name="aui_position"></property>
-                                        <property name="aui_row"></property>
-                                        <property name="best_size"></property>
-                                        <property name="bg"></property>
-                                        <property name="caption"></property>
-                                        <property name="caption_visible">1</property>
-                                        <property name="center_pane">0</property>
-                                        <property name="checked">0</property>
-                                        <property name="close_button">1</property>
-                                        <property name="context_help"></property>
-                                        <property name="context_menu">1</property>
-                                        <property name="default_pane">0</property>
-                                        <property name="dock">Dock</property>
-                                        <property name="dock_fixed">0</property>
-                                        <property name="docking">Left</property>
-                                        <property name="enabled">1</property>
-                                        <property name="fg"></property>
-                                        <property name="floatable">1</property>
-                                        <property name="font"></property>
-                                        <property name="gripper">0</property>
-                                        <property name="hidden">0</property>
-                                        <property name="id">wxID_ANY</property>
-                                        <property name="label">Net classes</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_NetclassesOpt</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>
-                                        <event name="OnCheckBox">OnCheckboxClicked</event>
-                                    </object>
-                                </object>
-                                <object class="sizeritem" expanded="1">
-                                    <property name="border">5</property>
-                                    <property name="flag">wxBOTTOM|wxRIGHT|wxLEFT</property>
-                                    <property name="proportion">0</property>
-                                    <object class="wxCheckBox" expanded="1">
-                                        <property name="BottomDockable">1</property>
-                                        <property name="LeftDockable">1</property>
-                                        <property name="RightDockable">1</property>
-                                        <property name="TopDockable">1</property>
-                                        <property name="aui_layer"></property>
-                                        <property name="aui_name"></property>
-                                        <property name="aui_position"></property>
-                                        <property name="aui_row"></property>
-                                        <property name="best_size"></property>
-                                        <property name="bg"></property>
-                                        <property name="caption"></property>
-                                        <property name="caption_visible">1</property>
-                                        <property name="center_pane">0</property>
-                                        <property name="checked">0</property>
-                                        <property name="close_button">1</property>
-                                        <property name="context_help"></property>
-                                        <property name="context_menu">1</property>
-                                        <property name="default_pane">0</property>
-                                        <property name="dock">Dock</property>
-                                        <property name="dock_fixed">0</property>
-                                        <property name="docking">Left</property>
-                                        <property name="enabled">1</property>
-                                        <property name="fg"></property>
-                                        <property name="floatable">1</property>
-                                        <property name="font"></property>
-                                        <property name="gripper">0</property>
-                                        <property name="hidden">0</property>
-                                        <property name="id">wxID_ANY</property>
-                                        <property name="label">Custom rules</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_CustomRulesOpt</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>
-                                        <event name="OnCheckBox">OnCheckboxClicked</event>
-                                    </object>
-                                </object>
-                                <object class="sizeritem" expanded="0">
-                                    <property name="border">5</property>
-                                    <property name="flag">wxRIGHT|wxLEFT</property>
-                                    <property name="proportion">0</property>
-                                    <object class="wxCheckBox" expanded="0">
-                                        <property name="BottomDockable">1</property>
-                                        <property name="LeftDockable">1</property>
-                                        <property name="RightDockable">1</property>
-                                        <property name="TopDockable">1</property>
-                                        <property name="aui_layer"></property>
-                                        <property name="aui_name"></property>
-                                        <property name="aui_position"></property>
-                                        <property name="aui_row"></property>
-                                        <property name="best_size"></property>
-                                        <property name="bg"></property>
-                                        <property name="caption"></property>
-                                        <property name="caption_visible">1</property>
-                                        <property name="center_pane">0</property>
-                                        <property name="checked">0</property>
-                                        <property name="close_button">1</property>
-                                        <property name="context_help"></property>
-                                        <property name="context_menu">1</property>
-                                        <property name="default_pane">0</property>
-                                        <property name="dock">Dock</property>
-                                        <property name="dock_fixed">0</property>
-                                        <property name="docking">Left</property>
-                                        <property name="enabled">1</property>
-                                        <property name="fg"></property>
-                                        <property name="floatable">1</property>
-                                        <property name="font"></property>
-                                        <property name="gripper">0</property>
-                                        <property name="hidden">0</property>
-                                        <property name="id">wxID_ANY</property>
-                                        <property name="label">Violation severities</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_SeveritiesOpt</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>
-                                        <event name="OnCheckBox">OnCheckboxClicked</event>
-                                    </object>
-                                </object>
-                            </object>
-                        </object>
-                    </object>
-                </object>
-                <object class="sizeritem" expanded="1">
-                    <property name="border">5</property>
-                    <property name="flag">wxEXPAND</property>
-                    <property name="proportion">0</property>
-                    <object class="wxBoxSizer" expanded="1">
-                        <property name="minimum_size"></property>
-                        <property name="name">m_buttonsSizer</property>
-                        <property name="orient">wxHORIZONTAL</property>
-                        <property name="permission">protected</property>
-                        <object class="sizeritem" expanded="0">
-                            <property name="border">10</property>
-                            <property name="flag">wxALIGN_CENTER|wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL</property>
-                            <property name="proportion">0</property>
-                            <object class="wxButton" expanded="0">
-                                <property name="BottomDockable">1</property>
-                                <property name="LeftDockable">1</property>
-                                <property name="RightDockable">1</property>
-                                <property name="TopDockable">1</property>
-                                <property name="aui_layer"></property>
-                                <property name="aui_name"></property>
-                                <property name="aui_position"></property>
-                                <property name="aui_row"></property>
-                                <property name="auth_needed">0</property>
-                                <property name="best_size"></property>
-                                <property name="bg"></property>
-                                <property name="bitmap"></property>
-                                <property name="caption"></property>
-                                <property name="caption_visible">1</property>
-                                <property name="center_pane">0</property>
-                                <property name="close_button">1</property>
-                                <property name="context_help"></property>
-                                <property name="context_menu">1</property>
-                                <property name="current"></property>
-                                <property name="default">0</property>
-                                <property name="default_pane">0</property>
-                                <property name="disabled"></property>
-                                <property name="dock">Dock</property>
-                                <property name="dock_fixed">0</property>
-                                <property name="docking">Left</property>
-                                <property name="enabled">1</property>
-                                <property name="fg"></property>
-                                <property name="floatable">1</property>
-                                <property name="focus"></property>
-                                <property name="font"></property>
-                                <property name="gripper">0</property>
-                                <property name="hidden">0</property>
-                                <property name="id">wxID_ANY</property>
-                                <property name="label">Select All</property>
-                                <property name="margins"></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_selectAllButton</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="position"></property>
-                                <property name="pressed"></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>
-                                <event name="OnButtonClick">OnSelectAll</event>
-                            </object>
-                        </object>
-                        <object class="sizeritem" expanded="0">
-                            <property name="border">5</property>
-                            <property name="flag">wxALL|wxEXPAND</property>
-                            <property name="proportion">1</property>
-                            <object class="wxStdDialogButtonSizer" expanded="0">
-                                <property name="Apply">0</property>
-                                <property name="Cancel">1</property>
-                                <property name="ContextHelp">0</property>
-                                <property name="Help">0</property>
-                                <property name="No">0</property>
-                                <property name="OK">1</property>
-                                <property name="Save">0</property>
-                                <property name="Yes">0</property>
-                                <property name="minimum_size"></property>
-                                <property name="name">m_sdbSizer1</property>
-                                <property name="permission">protected</property>
-                            </object>
-                        </object>
-                    </object>
-                </object>
+                <property name="moveable">1</property>
+                <property name="name">importFromLabel</property>
+                <property name="pane_border">1</property>
+                <property name="pane_position"></property>
+                <property name="pane_size"></property>
+                <property name="permission">none</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"></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="false">
+              <property name="border">5</property>
+              <property name="flag">wxEXPAND|wxTOP|wxBOTTOM</property>
+              <property name="proportion">1</property>
+              <object class="wxTextCtrl" expanded="false">
+                <property name="BottomDockable">1</property>
+                <property name="LeftDockable">1</property>
+                <property name="RightDockable">1</property>
+                <property name="TopDockable">1</property>
+                <property name="aui_layer">0</property>
+                <property name="aui_name"></property>
+                <property name="aui_position">0</property>
+                <property name="aui_row">0</property>
+                <property name="best_size"></property>
+                <property name="bg"></property>
+                <property name="caption"></property>
+                <property name="caption_visible">1</property>
+                <property name="center_pane">0</property>
+                <property name="close_button">1</property>
+                <property name="context_help"></property>
+                <property name="context_menu">1</property>
+                <property name="default_pane">0</property>
+                <property name="dock">Dock</property>
+                <property name="dock_fixed">0</property>
+                <property name="docking">Left</property>
+                <property name="drag_accept_files">0</property>
+                <property name="enabled">1</property>
+                <property name="fg"></property>
+                <property name="floatable">1</property>
+                <property name="font"></property>
+                <property name="gripper">0</property>
+                <property name="hidden">0</property>
+                <property name="id">wxID_ANY</property>
+                <property name="max_size"></property>
+                <property name="maximize_button">0</property>
+                <property name="maximum_size"></property>
+                <property name="maxlength">0</property>
+                <property name="min_size"></property>
+                <property name="minimize_button">0</property>
+                <property name="minimum_size">300,-1</property>
+                <property name="moveable">1</property>
+                <property name="name">m_filePathCtrl</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">Target directory for plot files. Can be absolute or relative to the board file location.</property>
+                <property name="validator_data_type"></property>
+                <property name="validator_style">wxFILTER_NONE</property>
+                <property name="validator_type">wxDefaultValidator</property>
+                <property name="validator_variable"></property>
+                <property name="value"></property>
+                <property name="window_extra_style"></property>
+                <property name="window_name"></property>
+                <property name="window_style"></property>
+              </object>
+            </object>
+            <object class="sizeritem" expanded="false">
+              <property name="border">5</property>
+              <property name="flag">wxALIGN_CENTER_VERTICAL|wxRIGHT</property>
+              <property name="proportion">0</property>
+              <object class="wxBitmapButton" expanded="false">
+                <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="auth_needed">0</property>
+                <property name="best_size"></property>
+                <property name="bg"></property>
+                <property name="bitmap"></property>
+                <property name="caption"></property>
+                <property name="caption_visible">1</property>
+                <property name="center_pane">0</property>
+                <property name="close_button">1</property>
+                <property name="context_help"></property>
+                <property name="context_menu">1</property>
+                <property name="current"></property>
+                <property name="default">0</property>
+                <property name="default_pane">0</property>
+                <property name="disabled"></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="focus"></property>
+                <property name="font"></property>
+                <property name="gripper">0</property>
+                <property name="hidden">0</property>
+                <property name="id">wxID_ANY</property>
+                <property name="label">Browse</property>
+                <property name="margins"></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">-1,-1</property>
+                <property name="moveable">1</property>
+                <property name="name">m_browseButton</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="position"></property>
+                <property name="pressed"></property>
+                <property name="resize">Resizable</property>
+                <property name="show">1</property>
+                <property name="size">-1,-1</property>
+                <property name="style"></property>
+                <property name="subclass">STD_BITMAP_BUTTON; widgets/std_bitmap_button.h; 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="OnButtonClick">OnBrowseClicked</event>
+              </object>
+            </object>
+          </object>
         </object>
+        <object class="sizeritem" expanded="true">
+          <property name="border">5</property>
+          <property name="flag">wxEXPAND|wxBOTTOM</property>
+          <property name="proportion">1</property>
+          <object class="wxBoxSizer" expanded="true">
+            <property name="minimum_size"></property>
+            <property name="name">bMiddleSizer</property>
+            <property name="orient">wxHORIZONTAL</property>
+            <property name="permission">none</property>
+            <object class="sizeritem" expanded="true">
+              <property name="border">10</property>
+              <property name="flag">wxEXPAND|wxRIGHT|wxLEFT</property>
+              <property name="proportion">0</property>
+              <object class="wxBoxSizer" expanded="true">
+                <property name="minimum_size"></property>
+                <property name="name">bLeftCol</property>
+                <property name="orient">wxVERTICAL</property>
+                <property name="permission">none</property>
+                <object class="sizeritem" expanded="false">
+                  <property name="border">5</property>
+                  <property name="flag">wxTOP|wxBOTTOM|wxRIGHT</property>
+                  <property name="proportion">0</property>
+                  <object class="wxStaticText" expanded="false">
+                    <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">Import:</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">importLabel</property>
+                    <property name="pane_border">1</property>
+                    <property name="pane_position"></property>
+                    <property name="pane_size"></property>
+                    <property name="permission">none</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="false">
+                  <property name="border">5</property>
+                  <property name="flag">wxBOTTOM|wxRIGHT|wxLEFT</property>
+                  <property name="proportion">0</property>
+                  <object class="wxCheckBox" expanded="false">
+                    <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">Board layers and physical stackup</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_LayersOpt</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>
+                    <event name="OnCheckBox">OnCheckboxClicked</event>
+                  </object>
+                </object>
+                <object class="sizeritem" expanded="false">
+                  <property name="border">5</property>
+                  <property name="flag">wxBOTTOM|wxRIGHT|wxLEFT</property>
+                  <property name="proportion">0</property>
+                  <object class="wxCheckBox" expanded="false">
+                    <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">Solder mask/paste defaults</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_MaskAndPasteOpt</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>
+                    <event name="OnCheckBox">OnCheckboxClicked</event>
+                  </object>
+                </object>
+                <object class="sizeritem" expanded="false">
+                  <property name="border">5</property>
+                  <property name="flag">wxBOTTOM|wxRIGHT|wxLEFT</property>
+                  <property name="proportion">0</property>
+                  <object class="wxCheckBox" expanded="false">
+                    <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">Text &amp;&amp; graphics default properties</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_TextAndGraphicsOpt</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>
+                    <event name="OnCheckBox">OnCheckboxClicked</event>
+                  </object>
+                </object>
+                <object class="sizeritem" expanded="true">
+                  <property name="border">5</property>
+                  <property name="flag">wxBOTTOM|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">Text &amp;&amp; graphics formatting</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_FormattingOpt</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="false">
+                  <property name="border">5</property>
+                  <property name="flag">wxBOTTOM|wxRIGHT|wxLEFT</property>
+                  <property name="proportion">0</property>
+                  <object class="wxCheckBox" expanded="false">
+                    <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">Design rule constraints</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_ConstraintsOpt</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>
+                    <event name="OnCheckBox">OnCheckboxClicked</event>
+                  </object>
+                </object>
+                <object class="sizeritem" expanded="false">
+                  <property name="border">5</property>
+                  <property name="flag">wxBOTTOM|wxRIGHT|wxLEFT</property>
+                  <property name="proportion">0</property>
+                  <object class="wxCheckBox" expanded="false">
+                    <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">Predefined track &amp;&amp; via dimensions</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_TracksAndViasOpt</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>
+                    <event name="OnCheckBox">OnCheckboxClicked</event>
+                  </object>
+                </object>
+                <object class="sizeritem" expanded="true">
+                  <property name="border">5</property>
+                  <property name="flag">wxBOTTOM|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">Teardrop defaults</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_TeardropsOpt</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">wxBOTTOM|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">Length-tuning pattern defaults</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_TuningPatternsOpt</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>
+                    <event name="OnCheckBox">OnCheckboxClicked</event>
+                  </object>
+                </object>
+                <object class="sizeritem" expanded="false">
+                  <property name="border">5</property>
+                  <property name="flag">wxBOTTOM|wxRIGHT|wxLEFT</property>
+                  <property name="proportion">0</property>
+                  <object class="wxCheckBox" expanded="false">
+                    <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">Net classes</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_NetclassesOpt</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>
+                    <event name="OnCheckBox">OnCheckboxClicked</event>
+                  </object>
+                </object>
+                <object class="sizeritem" expanded="true">
+                  <property name="border">5</property>
+                  <property name="flag">wxBOTTOM|wxLEFT|wxRIGHT</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">Component classes</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_ComponentClassesOpt</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>
+                    <event name="OnCheckBox">OnCheckboxClicked</event>
+                  </object>
+                </object>
+                <object class="sizeritem" expanded="true">
+                  <property name="border">5</property>
+                  <property name="flag">wxBOTTOM|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">Custom rules</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_CustomRulesOpt</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>
+                    <event name="OnCheckBox">OnCheckboxClicked</event>
+                  </object>
+                </object>
+                <object class="sizeritem" expanded="false">
+                  <property name="border">5</property>
+                  <property name="flag">wxRIGHT|wxLEFT</property>
+                  <property name="proportion">0</property>
+                  <object class="wxCheckBox" expanded="false">
+                    <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">Violation severities</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_SeveritiesOpt</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>
+                    <event name="OnCheckBox">OnCheckboxClicked</event>
+                  </object>
+                </object>
+              </object>
+            </object>
+          </object>
+        </object>
+        <object class="sizeritem" expanded="true">
+          <property name="border">5</property>
+          <property name="flag">wxEXPAND</property>
+          <property name="proportion">0</property>
+          <object class="wxBoxSizer" expanded="true">
+            <property name="minimum_size"></property>
+            <property name="name">m_buttonsSizer</property>
+            <property name="orient">wxHORIZONTAL</property>
+            <property name="permission">protected</property>
+            <object class="sizeritem" expanded="false">
+              <property name="border">10</property>
+              <property name="flag">wxALIGN_CENTER|wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL</property>
+              <property name="proportion">0</property>
+              <object class="wxButton" expanded="false">
+                <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="auth_needed">0</property>
+                <property name="best_size"></property>
+                <property name="bg"></property>
+                <property name="bitmap"></property>
+                <property name="caption"></property>
+                <property name="caption_visible">1</property>
+                <property name="center_pane">0</property>
+                <property name="close_button">1</property>
+                <property name="context_help"></property>
+                <property name="context_menu">1</property>
+                <property name="current"></property>
+                <property name="default">0</property>
+                <property name="default_pane">0</property>
+                <property name="disabled"></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="focus"></property>
+                <property name="font"></property>
+                <property name="gripper">0</property>
+                <property name="hidden">0</property>
+                <property name="id">wxID_ANY</property>
+                <property name="label">Select All</property>
+                <property name="margins"></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_selectAllButton</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="position"></property>
+                <property name="pressed"></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>
+                <event name="OnButtonClick">OnSelectAll</event>
+              </object>
+            </object>
+            <object class="sizeritem" expanded="false">
+              <property name="border">5</property>
+              <property name="flag">wxALL|wxEXPAND</property>
+              <property name="proportion">1</property>
+              <object class="wxStdDialogButtonSizer" expanded="false">
+                <property name="Apply">0</property>
+                <property name="Cancel">1</property>
+                <property name="ContextHelp">0</property>
+                <property name="Help">0</property>
+                <property name="No">0</property>
+                <property name="OK">1</property>
+                <property name="Save">0</property>
+                <property name="Yes">0</property>
+                <property name="minimum_size"></property>
+                <property name="name">m_sdbSizer1</property>
+                <property name="permission">protected</property>
+              </object>
+            </object>
+          </object>
+        </object>
+      </object>
     </object>
+  </object>
 </wxFormBuilder_Project>
diff --git a/pcbnew/dialogs/dialog_import_settings_base.h b/pcbnew/dialogs/dialog_import_settings_base.h
index 30d539d9de..0ca977ed7a 100644
--- a/pcbnew/dialogs/dialog_import_settings_base.h
+++ b/pcbnew/dialogs/dialog_import_settings_base.h
@@ -1,5 +1,5 @@
 ///////////////////////////////////////////////////////////////////////////
-// C++ code generated with wxFormBuilder (version 3.10.1-0-g8feb16b)
+// C++ code generated with wxFormBuilder (version 4.2.1-0-g80c4cb6)
 // http://www.wxformbuilder.org/
 //
 // PLEASE DO *NOT* EDIT THIS FILE!
@@ -64,6 +64,7 @@ class DIALOG_IMPORT_SETTINGS_BASE : public DIALOG_SHIM
 		wxCheckBox* m_TeardropsOpt;
 		wxCheckBox* m_TuningPatternsOpt;
 		wxCheckBox* m_NetclassesOpt;
+		wxCheckBox* m_ComponentClassesOpt;
 		wxCheckBox* m_CustomRulesOpt;
 		wxCheckBox* m_SeveritiesOpt;
 
diff --git a/pcbnew/dialogs/dialog_rule_area_properties.cpp b/pcbnew/dialogs/dialog_rule_area_properties.cpp
index 90d5f22483..51694451ab 100644
--- a/pcbnew/dialogs/dialog_rule_area_properties.cpp
+++ b/pcbnew/dialogs/dialog_rule_area_properties.cpp
@@ -250,8 +250,8 @@ bool DIALOG_RULE_AREA_PROPERTIES::TransferDataToWindow()
         // Fetch component classes
         std::set<wxString> classNames;
 
-        for( const auto& [k, v] : m_board->GetComponentClassManager().GetClasses() )
-            classNames.insert( k );
+        for( const wxString& className : m_board->GetComponentClassManager().GetClassNames() )
+            classNames.insert( className );
 
         for( const wxString& sourceName : classNames )
             m_placementProperties->m_componentClassCombo->Append( sourceName );
diff --git a/pcbnew/dialogs/panel_assign_component_classes.cpp b/pcbnew/dialogs/panel_assign_component_classes.cpp
new file mode 100644
index 0000000000..38521f2b46
--- /dev/null
+++ b/pcbnew/dialogs/panel_assign_component_classes.cpp
@@ -0,0 +1,788 @@
+/*
+ * This program source code file is part of KiCad, a free EDA CAD application.
+ *
+ * Copyright The KiCad Developers, see AUTHORS.txt for contributors.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, you may find one here:
+ * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
+ * or you may search the http://www.gnu.org website for the version 2 license,
+ * or you may write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+ */
+
+
+#include <dialogs/panel_assign_component_classes.h>
+
+#include <bitmaps.h>
+#include <board.h>
+#include <component_classes/component_class_assignment_rule.h>
+#include <component_classes/component_class_manager.h>
+#include <footprint.h>
+#include <kiway.h>
+#include <pcb_edit_frame.h>
+#include <project/project_file.h>
+#include <tool/selection_tool.h>
+#include <tool/tool_manager.h>
+#include <tools/pcb_selection_tool.h>
+#include <widgets/paged_dialog.h>
+#include <widgets/std_bitmap_button.h>
+
+
+/**************************************************************************************************
+ *
+ * PANEL_ASSIGN_COMPONENT_CLASSES implementation
+ * This is the top-level panel for component class configuration
+ *
+ *************************************************************************************************/
+
+PANEL_ASSIGN_COMPONENT_CLASSES::PANEL_ASSIGN_COMPONENT_CLASSES(
+        wxWindow* aParentWindow, PCB_EDIT_FRAME* aFrame,
+        std::shared_ptr<COMPONENT_CLASS_SETTINGS> aSettings, DIALOG_SHIM* aDlg ) :
+        PANEL_ASSIGN_COMPONENT_CLASSES_BASE( aParentWindow ), m_dlg( aDlg ), m_frame( aFrame ),
+        m_componentClassSettings( std::move( aSettings ) ),
+        m_assignmentsList( static_cast<wxBoxSizer*>( m_assignmentsScrollWindow->GetSizer() ) )
+{
+    // Load footprint fields and sheet names
+    const BOARD*       board = dynamic_cast<BOARD*>( m_frame->GetModel() );
+    std::set<wxString> fieldsSet;
+    std::set<wxString> sheetsSet;
+
+    for( const FOOTPRINT* fp : board->Footprints() )
+    {
+        wxString sheetName = fp->GetSheetname();
+
+        if( !sheetName.empty() )
+        {
+            sheetName.Replace( wxT( "\"" ), wxT( "" ) );
+            sheetName.Replace( wxT( "'" ), wxT( "" ) );
+            sheetsSet.insert( fp->GetSheetname() );
+        }
+
+        for( const PCB_FIELD* field : fp->GetFields() )
+            fieldsSet.insert( field->GetName() );
+    }
+
+    // Sort field names
+    std::vector<wxString> fieldNames( fieldsSet.begin(), fieldsSet.end() );
+    std::ranges::sort( fieldNames,
+                       []( const wxString& a, const wxString& b )
+                       {
+                           return a.Cmp( b ) < 0;
+                       } );
+
+    m_fieldNames = std::move( fieldNames );
+
+    // Sort sheet names
+    std::vector<wxString> sheetNames( sheetsSet.begin(), sheetsSet.end() );
+    std::ranges::sort( sheetNames,
+                       []( const wxString& a, const wxString& b )
+                       {
+                           return a.Cmp( b ) < 0;
+                       } );
+
+    m_sheetNames = std::move( sheetNames );
+
+    // Get references of currently selected items
+    std::set<wxString> refsSet;
+
+    for( const EDA_ITEM* item : m_frame->GetCurrentSelection() )
+    {
+        if( item->Type() != PCB_FOOTPRINT_T )
+            continue;
+
+        const FOOTPRINT* fp = static_cast<const FOOTPRINT*>( item );
+        wxString         ref = fp->GetReferenceAsString();
+        refsSet.insert( ref );
+    }
+
+    std::vector<wxString> refs( refsSet.begin(), refsSet.end() );
+    std::ranges::sort( refs,
+                       []( const wxString& a, const wxString& b )
+                       {
+                           return a.Cmp( b ) < 0;
+                       } );
+
+    m_selectionRefs = std::move( refs );
+}
+
+
+PANEL_ASSIGN_COMPONENT_CLASSES::~PANEL_ASSIGN_COMPONENT_CLASSES()
+{
+    BOARD*              board = dynamic_cast<BOARD*>( m_frame->GetModel() );
+    PCB_SELECTION_TOOL* selTool = m_frame->GetToolManager()->GetTool<PCB_SELECTION_TOOL>();
+
+    for( FOOTPRINT* fp : board->Footprints() )
+        selTool->UnbrightenItem( fp );
+
+    m_frame->GetCanvas()->Refresh();
+}
+
+
+bool PANEL_ASSIGN_COMPONENT_CLASSES::TransferDataToWindow()
+{
+    // Load sheet-level settings
+    m_assignSheetClasses->SetValue( m_componentClassSettings->GetEnableSheetComponentClasses() );
+
+    // Load dynamic component class assignments
+    for( const COMPONENT_CLASS_ASSIGNMENT_DATA& assignmentData :
+         m_componentClassSettings->GetComponentClassAssignments() )
+    {
+        PANEL_COMPONENT_CLASS_ASSIGNMENT* assignment = addAssignment();
+        assignment->SetComponentClass( assignmentData.GetComponentClass() );
+        assignment->SetConditionsOperator( assignmentData.GetConditionsOperator() );
+
+        for( const auto& [conditionType, conditionData] : assignmentData.GetConditions() )
+        {
+            CONDITION_DATA* match = assignment->AddCondition( conditionType );
+            match->SetPrimaryField( conditionData.first );
+            match->SetSecondaryField( conditionData.second );
+        }
+    }
+
+    return true;
+}
+
+
+bool PANEL_ASSIGN_COMPONENT_CLASSES::TransferDataFromWindow()
+{
+    if( !Validate() )
+        return false;
+
+    // Save sheet-level settings
+    m_componentClassSettings->SetEnableSheetComponentClasses( m_assignSheetClasses->GetValue() );
+
+    // Save dynamic component class assignments
+    m_componentClassSettings->ClearComponentClassAssignments();
+
+    for( const auto assignment : m_assignments )
+    {
+        COMPONENT_CLASS_ASSIGNMENT_DATA assignmentData = assignment->GenerateAssignmentData();
+        m_componentClassSettings->AddComponentClassAssignment( assignmentData );
+    }
+
+    return true;
+}
+
+
+bool PANEL_ASSIGN_COMPONENT_CLASSES::Validate()
+{
+    PCB_EDIT_FRAME* frame = GetFrame();
+    BOARD*          board = dynamic_cast<BOARD*>( frame->GetModel() );
+
+    frame->GetCanvas()->Refresh();
+
+    for( PANEL_COMPONENT_CLASS_ASSIGNMENT* assignment : m_assignments )
+    {
+        const COMPONENT_CLASS_ASSIGNMENT_DATA assignmentData = assignment->GenerateAssignmentData();
+        const std::shared_ptr<COMPONENT_CLASS_ASSIGNMENT_RULE> rule =
+                board->GetComponentClassManager().CompileAssignmentRule( assignmentData );
+
+        if( !rule )
+        {
+            const wxString msg = wxString::Format(
+                    _( "Error with conditions for component class assignment %s" ),
+                    assignment->GetComponentClass() );
+            PAGED_DIALOG::GetDialog( this )->SetError( msg, this, assignment );
+            scrollToAssignment( assignment );
+            assignment->SetFocus();
+            return false;
+        }
+    }
+
+    return true;
+}
+
+
+void PANEL_ASSIGN_COMPONENT_CLASSES::OnAddAssignmentClick( wxCommandEvent& event )
+{
+    PANEL_COMPONENT_CLASS_ASSIGNMENT* assignment = addAssignment();
+    scrollToAssignment( assignment );
+}
+
+
+PANEL_COMPONENT_CLASS_ASSIGNMENT* PANEL_ASSIGN_COMPONENT_CLASSES::addAssignment()
+{
+    PANEL_COMPONENT_CLASS_ASSIGNMENT* assignmentPanel =
+            new PANEL_COMPONENT_CLASS_ASSIGNMENT( m_assignmentsScrollWindow, this, m_dlg );
+
+#if __OSX__
+    m_assignmentsList->Add( assignmentPanel, 0, wxEXPAND, 5 );
+#else
+    m_assignmentsList->Add( assignmentPanel, 0, wxEXPAND | wxLEFT | wxRIGHT | wxBOTTOM, 5 );
+#endif
+
+    Layout();
+
+    m_assignments.push_back( assignmentPanel );
+
+    return assignmentPanel;
+}
+
+
+void PANEL_ASSIGN_COMPONENT_CLASSES::scrollToAssignment(
+        const PANEL_COMPONENT_CLASS_ASSIGNMENT* aAssignment ) const
+{
+    const wxPoint viewStart = m_assignmentsScrollWindow->GetViewStart();
+    const wxPoint panelPosition = aAssignment->GetPosition();
+    const wxSize  panelSize = aAssignment->GetClientSize();
+
+    m_assignmentsScrollWindow->Scroll( viewStart.x, panelPosition.y + panelSize.y );
+}
+
+
+void PANEL_ASSIGN_COMPONENT_CLASSES::RemoveAssignment( PANEL_COMPONENT_CLASS_ASSIGNMENT* aPanel )
+{
+    m_assignments.erase( std::ranges::find( m_assignments, aPanel ) );
+    m_assignmentsList->Detach( aPanel );
+    aPanel->Destroy();
+    Layout();
+}
+
+
+void PANEL_ASSIGN_COMPONENT_CLASSES::ImportSettingsFrom(
+        const std::shared_ptr<COMPONENT_CLASS_SETTINGS>& aOtherSettings )
+{
+    std::shared_ptr<COMPONENT_CLASS_SETTINGS> savedSettings = m_componentClassSettings;
+
+    m_componentClassSettings = aOtherSettings;
+    TransferDataToWindow();
+
+    m_componentClassSettings = std::move( savedSettings );
+}
+
+
+/**************************************************************************************************
+ *
+ * CONDITION_DATA implementation
+ * Provides a common interface for all condition panel types
+ *
+ *************************************************************************************************/
+
+wxString CONDITION_DATA::GetPrimaryField() const
+{
+    wxString data = m_primaryCtrl->GetValue();
+    data.Trim( true );
+    data.Trim( false );
+
+    if( m_conditionType != COMPONENT_CLASS_ASSIGNMENT_DATA::CONDITION_TYPE::CUSTOM )
+    {
+        data.Replace( wxT( "\"" ), wxT( "" ) );
+        data.Replace( wxT( "'" ), wxT( "" ) );
+    }
+
+    return data;
+}
+
+
+void CONDITION_DATA::SetPrimaryField( const wxString& aVal )
+{
+    m_primaryCtrl->SetValue( aVal );
+}
+
+
+wxString CONDITION_DATA::GetSecondaryField() const
+{
+    if( !m_secondaryCtrl )
+        return wxEmptyString;
+
+    wxString data = m_secondaryCtrl->GetValue();
+    data.Trim( true );
+    data.Trim( false );
+
+    if( m_conditionType != COMPONENT_CLASS_ASSIGNMENT_DATA::CONDITION_TYPE::CUSTOM )
+    {
+        data.Replace( wxT( "\"" ), wxT( "" ) );
+        data.Replace( wxT( "'" ), wxT( "" ) );
+    }
+
+    return data;
+}
+
+
+void CONDITION_DATA::SetSecondaryField( const wxString& aVal )
+{
+    if( m_secondaryCtrl )
+        m_secondaryCtrl->SetValue( aVal );
+};
+
+/**************************************************************************************************
+ *
+ * PANEL_COMPONENT_CLASS_ASSIGNMENT implementation
+ * This is the dynamically-added panel for each component class assignment rule set
+ *
+ *************************************************************************************************/
+
+PANEL_COMPONENT_CLASS_ASSIGNMENT::PANEL_COMPONENT_CLASS_ASSIGNMENT(
+        wxWindow* aParent, PANEL_ASSIGN_COMPONENT_CLASSES* aPanelParent, DIALOG_SHIM* aDlg ) :
+        PANEL_COMPONENT_CLASS_ASSIGNMENT_BASE( aParent ), m_parentPanel( aPanelParent ),
+        m_matchesList( static_cast<wxStaticBoxSizer*>( GetSizer() ) ), m_dlg( aDlg )
+{
+    m_buttonAddCondition->SetBitmap( KiBitmapBundle( BITMAPS::small_plus ) );
+    m_buttonDeleteAssignment->SetBitmap( KiBitmapBundle( BITMAPS::small_trash ) );
+    m_buttonHighlightItems->SetBitmap( KiBitmapBundle( BITMAPS::net_highlight ) );
+
+    Connect( wxEVT_MENU, wxCommandEventHandler( PANEL_COMPONENT_CLASS_ASSIGNMENT::onMenu ), nullptr,
+             this );
+}
+
+
+PANEL_COMPONENT_CLASS_ASSIGNMENT::~PANEL_COMPONENT_CLASS_ASSIGNMENT()
+{
+    Disconnect( wxEVT_MENU, wxCommandEventHandler( PANEL_COMPONENT_CLASS_ASSIGNMENT::onMenu ),
+                nullptr, this );
+}
+
+
+COMPONENT_CLASS_ASSIGNMENT_DATA PANEL_COMPONENT_CLASS_ASSIGNMENT::GenerateAssignmentData() const
+{
+    COMPONENT_CLASS_ASSIGNMENT_DATA assignmentData;
+    assignmentData.SetComponentClass( GetComponentClass() );
+    assignmentData.SetConditionsOperation( GetConditionsOperator() );
+
+    for( const auto& condition : GetConditions() )
+    {
+        assignmentData.SetCondition( condition->GetConditionType(), condition->GetPrimaryField(),
+                                     condition->GetSecondaryField() );
+    }
+
+    return assignmentData;
+}
+
+
+void PANEL_COMPONENT_CLASS_ASSIGNMENT::OnAddConditionClick( wxCommandEvent& event )
+{
+    auto hasCondition = [this]( const COMPONENT_CLASS_ASSIGNMENT_DATA::CONDITION_TYPE aCondition )
+    {
+        return m_conditionTypes.contains( aCondition );
+    };
+
+    wxMenu menu;
+    menu.Append( ID_REFERENCE, _( "Reference..." ) );
+    menu.Append( ID_FOOTPRINT, _( "Footprint..." ) );
+    menu.Append( ID_SIDE, _( "Side..." ) );
+    menu.Append( ID_ROTATION, _( "Rotation..." ) );
+    menu.Append( ID_FOOTPRINT_FIELD, _( "Footprint Field..." ) );
+    menu.Append( ID_SHEET_NAME, _( "Sheet Name..." ) );
+    menu.Append( ID_CUSTOM, _( "Custom..." ) );
+    menu.Enable( ID_REFERENCE,
+                 !hasCondition( COMPONENT_CLASS_ASSIGNMENT_DATA::CONDITION_TYPE::REFERENCE ) );
+    menu.Enable( ID_FOOTPRINT,
+                 !hasCondition( COMPONENT_CLASS_ASSIGNMENT_DATA::CONDITION_TYPE::FOOTPRINT ) );
+    menu.Enable( ID_SIDE, !hasCondition( COMPONENT_CLASS_ASSIGNMENT_DATA::CONDITION_TYPE::SIDE ) );
+    menu.Enable( ID_ROTATION,
+                 !hasCondition( COMPONENT_CLASS_ASSIGNMENT_DATA::CONDITION_TYPE::ROTATION ) );
+    menu.Enable(
+            ID_FOOTPRINT_FIELD,
+            !hasCondition( COMPONENT_CLASS_ASSIGNMENT_DATA::CONDITION_TYPE::FOOTPRINT_FIELD ) );
+    menu.Enable( ID_CUSTOM,
+                 !hasCondition( COMPONENT_CLASS_ASSIGNMENT_DATA::CONDITION_TYPE::CUSTOM ) );
+    menu.Enable( ID_SHEET_NAME,
+                 !hasCondition( COMPONENT_CLASS_ASSIGNMENT_DATA::CONDITION_TYPE::SHEET_NAME ) );
+    PopupMenu( &menu );
+}
+
+
+void PANEL_COMPONENT_CLASS_ASSIGNMENT::OnDeleteAssignmentClick( wxCommandEvent& event )
+{
+    m_parentPanel->RemoveAssignment( this );
+}
+
+
+void PANEL_COMPONENT_CLASS_ASSIGNMENT::SetComponentClass( const wxString& aComponentClass ) const
+{
+    m_componentClass->SetValue( aComponentClass );
+}
+
+
+const wxString PANEL_COMPONENT_CLASS_ASSIGNMENT::GetComponentClass() const
+{
+    return m_componentClass->GetValue();
+}
+
+
+void PANEL_COMPONENT_CLASS_ASSIGNMENT::onMenu( wxCommandEvent& aEvent )
+{
+    switch( aEvent.GetId() )
+    {
+    case ID_REFERENCE:
+        AddCondition( COMPONENT_CLASS_ASSIGNMENT_DATA::CONDITION_TYPE::REFERENCE );
+        break;
+    case ID_FOOTPRINT:
+        AddCondition( COMPONENT_CLASS_ASSIGNMENT_DATA::CONDITION_TYPE::FOOTPRINT );
+        break;
+    case ID_SIDE: AddCondition( COMPONENT_CLASS_ASSIGNMENT_DATA::CONDITION_TYPE::SIDE ); break;
+    case ID_ROTATION:
+        AddCondition( COMPONENT_CLASS_ASSIGNMENT_DATA::CONDITION_TYPE::ROTATION );
+        break;
+    case ID_FOOTPRINT_FIELD:
+        AddCondition( COMPONENT_CLASS_ASSIGNMENT_DATA::CONDITION_TYPE::FOOTPRINT_FIELD );
+        break;
+    case ID_CUSTOM: AddCondition( COMPONENT_CLASS_ASSIGNMENT_DATA::CONDITION_TYPE::CUSTOM ); break;
+    case ID_SHEET_NAME:
+        AddCondition( COMPONENT_CLASS_ASSIGNMENT_DATA::CONDITION_TYPE::SHEET_NAME );
+        break;
+
+    default: wxFAIL_MSG( wxT( "Unknown ID in context menu event" ) );
+    }
+}
+
+
+CONDITION_DATA* PANEL_COMPONENT_CLASS_ASSIGNMENT::AddCondition(
+        const COMPONENT_CLASS_ASSIGNMENT_DATA::CONDITION_TYPE aCondition )
+{
+    wxASSERT_MSG( !m_conditionTypes.contains( aCondition ), "Condition type already exists" );
+
+    wxPanel* panelToAdd = nullptr;
+
+    switch( aCondition )
+    {
+    case COMPONENT_CLASS_ASSIGNMENT_DATA::CONDITION_TYPE::REFERENCE:
+    {
+        PANEL_COMPONENT_CLASS_CONDITION_REFERENCE* refsPanel =
+                new PANEL_COMPONENT_CLASS_CONDITION_REFERENCE( this );
+        refsPanel->SetSelectionRefs( m_parentPanel->GetSelectionRefs() );
+        panelToAdd = refsPanel;
+        m_conditionTypes.insert( COMPONENT_CLASS_ASSIGNMENT_DATA::CONDITION_TYPE::REFERENCE );
+        break;
+    }
+    case COMPONENT_CLASS_ASSIGNMENT_DATA::CONDITION_TYPE::FOOTPRINT:
+    {
+        panelToAdd = new PANEL_COMPONENT_CLASS_CONDITION_FOOTPRINT( this, m_dlg );
+        m_conditionTypes.insert( COMPONENT_CLASS_ASSIGNMENT_DATA::CONDITION_TYPE::FOOTPRINT );
+        break;
+    }
+    case COMPONENT_CLASS_ASSIGNMENT_DATA::CONDITION_TYPE::SIDE:
+    {
+        panelToAdd = new PANEL_COMPONENT_CLASS_CONDITION_SIDE( this );
+        m_conditionTypes.insert( COMPONENT_CLASS_ASSIGNMENT_DATA::CONDITION_TYPE::SIDE );
+        break;
+    }
+    case COMPONENT_CLASS_ASSIGNMENT_DATA::CONDITION_TYPE::ROTATION:
+    {
+        panelToAdd = new PANEL_COMPONENT_CLASS_CONDITION_ROTATION( this );
+        m_conditionTypes.insert( COMPONENT_CLASS_ASSIGNMENT_DATA::CONDITION_TYPE::ROTATION );
+        break;
+    }
+    case COMPONENT_CLASS_ASSIGNMENT_DATA::CONDITION_TYPE::FOOTPRINT_FIELD:
+    {
+        PANEL_COMPONENT_CLASS_CONDITION_FIELD* fieldPanel =
+                new PANEL_COMPONENT_CLASS_CONDITION_FIELD( this );
+        fieldPanel->SetFieldsList( m_parentPanel->GetFieldNames() );
+        panelToAdd = fieldPanel;
+        m_conditionTypes.insert( COMPONENT_CLASS_ASSIGNMENT_DATA::CONDITION_TYPE::FOOTPRINT_FIELD );
+        break;
+    }
+    case COMPONENT_CLASS_ASSIGNMENT_DATA::CONDITION_TYPE::CUSTOM:
+    {
+        panelToAdd = new PANEL_COMPONENT_CLASS_CONDITION_CUSTOM( this );
+        m_conditionTypes.insert( COMPONENT_CLASS_ASSIGNMENT_DATA::CONDITION_TYPE::CUSTOM );
+        break;
+    }
+    case COMPONENT_CLASS_ASSIGNMENT_DATA::CONDITION_TYPE::SHEET_NAME:
+    {
+        PANEL_COMPONENT_CLASS_CONDITION_SHEET* sheetPanel =
+                new PANEL_COMPONENT_CLASS_CONDITION_SHEET( this );
+        sheetPanel->SetSheetsList( m_parentPanel->GetSheetNames() );
+        panelToAdd = sheetPanel;
+        m_conditionTypes.insert( COMPONENT_CLASS_ASSIGNMENT_DATA::CONDITION_TYPE::SHEET_NAME );
+        break;
+    }
+    }
+
+    const size_t numItems = m_matchesList->GetItemCount();
+    m_matchesList->Insert( numItems - 1, panelToAdd, 0, wxEXPAND | wxTOP, 5 );
+    Layout();
+    GetParent()->Layout();
+    m_parentPanel->Layout();
+
+    CONDITION_DATA* conditionIface = dynamic_cast<CONDITION_DATA*>( panelToAdd );
+    m_matches.push_back( conditionIface );
+
+    return conditionIface;
+}
+
+
+void PANEL_COMPONENT_CLASS_ASSIGNMENT::RemoveCondition( wxPanel* aMatch )
+{
+    if( CONDITION_DATA* matchData = dynamic_cast<CONDITION_DATA*>( aMatch ) )
+    {
+        m_conditionTypes.erase( matchData->GetConditionType() );
+        m_matches.erase( std::ranges::find( m_matches, matchData ) );
+    }
+
+    m_matchesList->Detach( aMatch );
+    aMatch->Destroy();
+    Layout();
+    m_parentPanel->Layout();
+}
+
+
+void PANEL_COMPONENT_CLASS_ASSIGNMENT::SetConditionsOperator(
+        const COMPONENT_CLASS_ASSIGNMENT_DATA::CONDITIONS_OPERATOR aCondition ) const
+{
+    if( aCondition == COMPONENT_CLASS_ASSIGNMENT_DATA::CONDITIONS_OPERATOR::ALL )
+    {
+        m_radioAll->SetValue( true );
+        m_radioAny->SetValue( false );
+    }
+    else
+    {
+        m_radioAll->SetValue( false );
+        m_radioAny->SetValue( true );
+    }
+}
+
+
+COMPONENT_CLASS_ASSIGNMENT_DATA::CONDITIONS_OPERATOR
+PANEL_COMPONENT_CLASS_ASSIGNMENT::GetConditionsOperator() const
+{
+    if( m_radioAll->GetValue() == true )
+        return COMPONENT_CLASS_ASSIGNMENT_DATA::CONDITIONS_OPERATOR::ALL;
+
+    return COMPONENT_CLASS_ASSIGNMENT_DATA::CONDITIONS_OPERATOR::ANY;
+}
+
+
+void PANEL_COMPONENT_CLASS_ASSIGNMENT::OnHighlightItemsClick( wxCommandEvent& event )
+{
+    PCB_EDIT_FRAME*     frame = m_parentPanel->GetFrame();
+    BOARD*              board = dynamic_cast<BOARD*>( frame->GetModel() );
+    PCB_SELECTION_TOOL* selTool = frame->GetToolManager()->GetTool<PCB_SELECTION_TOOL>();
+
+    const COMPONENT_CLASS_ASSIGNMENT_DATA                  assignment = GenerateAssignmentData();
+    const std::shared_ptr<COMPONENT_CLASS_ASSIGNMENT_RULE> rule =
+            board->GetComponentClassManager().CompileAssignmentRule( assignment );
+
+    if( !rule )
+        return;
+
+    for( FOOTPRINT* fp : board->Footprints() )
+    {
+        if( rule->Matches( fp ) )
+            selTool->BrightenItem( fp );
+        else
+            selTool->UnbrightenItem( fp );
+    }
+
+    frame->GetCanvas()->Refresh();
+}
+
+
+/**************************************************************************************************
+ *
+ * PANEL_COMPONENT_CLASS_CONDITION_* implementations
+ * These are the dynamically-added panels for each condition / match type
+ *
+ *************************************************************************************************/
+
+PANEL_COMPONENT_CLASS_CONDITION_REFERENCE::PANEL_COMPONENT_CLASS_CONDITION_REFERENCE(
+        wxWindow* aParent ) :
+        PANEL_COMPONENT_CLASS_CONDITION_REFERENCE_BASE( aParent ),
+        CONDITION_DATA( COMPONENT_CLASS_ASSIGNMENT_DATA::CONDITION_TYPE::REFERENCE, m_refs ),
+        m_panelParent( static_cast<PANEL_COMPONENT_CLASS_ASSIGNMENT*>( aParent ) )
+{
+    m_title->SetMinSize( { GetTextExtent( _( "Footprint Field:" ) ).x, -1 } );
+
+    m_buttonImportRefs->SetBitmap( KiBitmapBundle( BITMAPS::config ) );
+    m_buttonDeleteMatch->SetBitmap( KiBitmapBundle( BITMAPS::small_trash ) );
+
+    Connect( wxEVT_MENU, wxCommandEventHandler( PANEL_COMPONENT_CLASS_CONDITION_REFERENCE::onMenu ),
+             nullptr, this );
+}
+
+
+void PANEL_COMPONENT_CLASS_CONDITION_REFERENCE::OnDeleteConditionClick( wxCommandEvent& event )
+{
+    m_panelParent->RemoveCondition( this );
+
+    Disconnect( wxEVT_MENU,
+                wxCommandEventHandler( PANEL_COMPONENT_CLASS_CONDITION_REFERENCE::onMenu ), nullptr,
+                this );
+}
+
+
+void PANEL_COMPONENT_CLASS_CONDITION_REFERENCE::OnImportRefsClick( wxCommandEvent& event )
+{
+    wxMenu menu;
+    menu.Append( ID_IMPORT_REFS, _( "Import references from selection" ) );
+    menu.Enable( ID_IMPORT_REFS, !m_selectionRefs.empty() );
+    PopupMenu( &menu );
+}
+
+
+void PANEL_COMPONENT_CLASS_CONDITION_REFERENCE::onMenu( wxCommandEvent& aEvent )
+{
+    if( aEvent.GetId() != ID_IMPORT_REFS )
+        wxFAIL_MSG( wxT( "Unknown ID in context menu event" ) );
+
+    if( m_selectionRefs.empty() )
+        return;
+
+    wxString refs = m_selectionRefs[0];
+
+    for( size_t i = 1; i < m_selectionRefs.size(); i++ )
+    {
+        refs += wxT( "," );
+        refs += m_selectionRefs[i];
+    }
+
+    m_refs->SetValue( refs );
+}
+
+
+PANEL_COMPONENT_CLASS_CONDITION_FOOTPRINT::PANEL_COMPONENT_CLASS_CONDITION_FOOTPRINT(
+        wxWindow* aParent, DIALOG_SHIM* aDlg ) :
+        PANEL_COMPONENT_CLASS_CONDITION_FOOTPRINT_BASE( aParent ),
+        CONDITION_DATA( COMPONENT_CLASS_ASSIGNMENT_DATA::CONDITION_TYPE::FOOTPRINT, m_footprint ),
+        m_panelParent( static_cast<PANEL_COMPONENT_CLASS_ASSIGNMENT*>( aParent ) ), m_dlg( aDlg )
+{
+    m_title->SetMinSize( { GetTextExtent( _( "Footprint Field:" ) ).x, -1 } );
+
+    m_buttonDeleteMatch->SetBitmap( KiBitmapBundle( BITMAPS::small_trash ) );
+    m_buttonShowLibrary->SetBitmap( KiBitmapBundle( BITMAPS::small_library ) );
+}
+
+
+void PANEL_COMPONENT_CLASS_CONDITION_FOOTPRINT::OnDeleteConditionClick( wxCommandEvent& event )
+{
+    m_panelParent->RemoveCondition( this );
+}
+
+
+void PANEL_COMPONENT_CLASS_CONDITION_FOOTPRINT::OnShowLibraryClick( wxCommandEvent& event )
+{
+    wxString fpId = m_footprint->GetValue();
+
+    if( KIWAY_PLAYER* frame = m_dlg->Kiway().Player( FRAME_FOOTPRINT_CHOOSER, true, m_dlg ) )
+    {
+        if( frame->ShowModal( &fpId, this ) )
+        {
+            m_footprint->SetValue( fpId );
+        }
+
+        frame->Destroy();
+    }
+}
+
+
+PANEL_COMPONENT_CLASS_CONDITION_SIDE::PANEL_COMPONENT_CLASS_CONDITION_SIDE( wxWindow* aParent ) :
+        PANEL_COMPONENT_CLASS_CONDITION_SIDE_BASE( aParent ),
+        CONDITION_DATA( COMPONENT_CLASS_ASSIGNMENT_DATA::CONDITION_TYPE::SIDE, m_side ),
+        m_panelParent( static_cast<PANEL_COMPONENT_CLASS_ASSIGNMENT*>( aParent ) )
+{
+    m_title->SetMinSize( { GetTextExtent( _( "Footprint Field:" ) ).x, -1 } );
+
+    m_buttonDeleteMatch->SetBitmap( KiBitmapBundle( BITMAPS::small_trash ) );
+    m_side->Append( wxT( "Any" ) );
+    m_side->Append( wxT( "Front" ) );
+    m_side->Append( wxT( "Back" ) );
+    m_side->SetValue( wxT( "Any" ) );
+}
+
+
+void PANEL_COMPONENT_CLASS_CONDITION_SIDE::OnDeleteConditionClick( wxCommandEvent& event )
+{
+    m_panelParent->RemoveCondition( this );
+}
+
+
+PANEL_COMPONENT_CLASS_CONDITION_ROTATION::PANEL_COMPONENT_CLASS_CONDITION_ROTATION(
+        wxWindow* aParent ) :
+        PANEL_COMPONENT_CLASS_CONDITION_ROTATION_BASE( aParent ),
+        CONDITION_DATA( COMPONENT_CLASS_ASSIGNMENT_DATA::CONDITION_TYPE::ROTATION, m_rotation ),
+        m_panelParent( static_cast<PANEL_COMPONENT_CLASS_ASSIGNMENT*>( aParent ) )
+{
+    m_title->SetMinSize( { GetTextExtent( _( "Footprint Field:" ) ).x, -1 } );
+    m_rotUnit->SetLabel( wxT( "°" ) );
+
+    m_buttonDeleteMatch->SetBitmap( KiBitmapBundle( BITMAPS::small_trash ) );
+    m_rotation->Append( wxT( "Any" ) );
+    m_rotation->Append( wxT( "0" ) );
+    m_rotation->Append( wxT( "90" ) );
+    m_rotation->Append( wxT( "180" ) );
+    m_rotation->Append( wxT( "-90" ) );
+    m_rotation->SetValue( wxT( "Any" ) );
+}
+
+
+void PANEL_COMPONENT_CLASS_CONDITION_ROTATION::OnDeleteConditionClick( wxCommandEvent& event )
+{
+    m_panelParent->RemoveCondition( this );
+}
+
+
+PANEL_COMPONENT_CLASS_CONDITION_FIELD::PANEL_COMPONENT_CLASS_CONDITION_FIELD( wxWindow* aParent ) :
+        PANEL_COMPONENT_CLASS_CONDITION_FIELD_BASE( aParent ),
+        CONDITION_DATA( COMPONENT_CLASS_ASSIGNMENT_DATA::CONDITION_TYPE::FOOTPRINT_FIELD,
+                        m_fieldName, m_fieldValue ),
+        m_panelParent( static_cast<PANEL_COMPONENT_CLASS_ASSIGNMENT*>( aParent ) )
+{
+    m_title->SetMinSize( { GetTextExtent( _( "Footprint Field:" ) ).x, -1 } );
+
+    m_buttonDeleteMatch->SetBitmap( KiBitmapBundle( BITMAPS::small_trash ) );
+}
+
+
+void PANEL_COMPONENT_CLASS_CONDITION_FIELD::OnDeleteConditionClick( wxCommandEvent& event )
+{
+    m_panelParent->RemoveCondition( this );
+}
+
+
+void PANEL_COMPONENT_CLASS_CONDITION_FIELD::SetFieldsList( const std::vector<wxString>& aFields )
+{
+    m_fieldName->Append( aFields );
+}
+
+
+PANEL_COMPONENT_CLASS_CONDITION_CUSTOM::PANEL_COMPONENT_CLASS_CONDITION_CUSTOM(
+        wxWindow* aParent ) :
+        PANEL_COMPONENT_CLASS_CONDITION_CUSTOM_BASE( aParent ),
+        CONDITION_DATA( COMPONENT_CLASS_ASSIGNMENT_DATA::CONDITION_TYPE::CUSTOM,
+                        m_customCondition ),
+        m_panelParent( static_cast<PANEL_COMPONENT_CLASS_ASSIGNMENT*>( aParent ) )
+{
+    m_title->SetMinSize( { GetTextExtent( _( "Footprint Field:" ) ).x, -1 } );
+
+    m_buttonDeleteMatch->SetBitmap( KiBitmapBundle( BITMAPS::small_trash ) );
+}
+
+
+void PANEL_COMPONENT_CLASS_CONDITION_CUSTOM::OnDeleteConditionClick( wxCommandEvent& event )
+{
+    m_panelParent->RemoveCondition( this );
+}
+
+
+PANEL_COMPONENT_CLASS_CONDITION_SHEET::PANEL_COMPONENT_CLASS_CONDITION_SHEET( wxWindow* aParent ) :
+        PANEL_COMPONENT_CLASS_CONDITION_SHEET_BASE( aParent ),
+        CONDITION_DATA( COMPONENT_CLASS_ASSIGNMENT_DATA::CONDITION_TYPE::SHEET_NAME, m_sheetName ),
+        m_panelParent( static_cast<PANEL_COMPONENT_CLASS_ASSIGNMENT*>( aParent ) )
+{
+    m_title->SetMinSize( { GetTextExtent( _( "Footprint Field:" ) ).x, -1 } );
+
+    m_buttonDeleteMatch->SetBitmap( KiBitmapBundle( BITMAPS::small_trash ) );
+}
+
+
+void PANEL_COMPONENT_CLASS_CONDITION_SHEET::OnDeleteConditionClick( wxCommandEvent& event )
+{
+    m_panelParent->RemoveCondition( this );
+}
+
+
+void PANEL_COMPONENT_CLASS_CONDITION_SHEET::SetSheetsList( const std::vector<wxString>& aSheets )
+{
+    m_sheetName->Append( aSheets );
+}
diff --git a/pcbnew/dialogs/panel_assign_component_classes_base.cpp b/pcbnew/dialogs/panel_assign_component_classes_base.cpp
new file mode 100644
index 0000000000..0e450bd5cf
--- /dev/null
+++ b/pcbnew/dialogs/panel_assign_component_classes_base.cpp
@@ -0,0 +1,471 @@
+///////////////////////////////////////////////////////////////////////////
+// C++ code generated with wxFormBuilder (version 4.2.1-0-g80c4cb6)
+// http://www.wxformbuilder.org/
+//
+// PLEASE DO *NOT* EDIT THIS FILE!
+///////////////////////////////////////////////////////////////////////////
+
+#include "widgets/std_bitmap_button.h"
+
+#include "panel_assign_component_classes_base.h"
+
+///////////////////////////////////////////////////////////////////////////
+
+PANEL_ASSIGN_COMPONENT_CLASSES_BASE::PANEL_ASSIGN_COMPONENT_CLASSES_BASE( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style, const wxString& name ) : wxPanel( parent, id, pos, size, style, name )
+{
+	wxBoxSizer* bSizerMain;
+	bSizerMain = new wxBoxSizer( wxVERTICAL );
+
+	m_assignSheetClasses = new wxCheckBox( this, wxID_ANY, _("Assign component class per sheet"), wxDefaultPosition, wxDefaultSize, 0 );
+	bSizerMain->Add( m_assignSheetClasses, 0, wxALL, 5 );
+
+	m_staticline1 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
+	bSizerMain->Add( m_staticline1, 0, wxEXPAND | wxALL, 5 );
+
+	wxFlexGridSizer* fgSizer8;
+	fgSizer8 = new wxFlexGridSizer( 0, 3, 0, 0 );
+	fgSizer8->AddGrowableCol( 1 );
+	fgSizer8->SetFlexibleDirection( wxHORIZONTAL );
+	fgSizer8->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
+
+	m_staticText3 = new wxStaticText( this, wxID_ANY, _("Custom Assignments:"), wxDefaultPosition, wxDefaultSize, 0 );
+	m_staticText3->Wrap( -1 );
+	fgSizer8->Add( m_staticText3, 0, wxALL, 5 );
+
+
+	fgSizer8->Add( 0, 0, 1, wxEXPAND, 5 );
+
+	m_btnAddAssignment = new wxButton( this, wxID_ANY, _("Add Custom Assignment"), wxDefaultPosition, wxDefaultSize, 0 );
+	fgSizer8->Add( m_btnAddAssignment, 0, wxALL, 5 );
+
+
+	bSizerMain->Add( fgSizer8, 0, wxEXPAND, 5 );
+
+	m_assignmentsScrollWindow = new wxScrolledWindow( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHSCROLL|wxVSCROLL );
+	m_assignmentsScrollWindow->SetScrollRate( 5, 5 );
+	wxBoxSizer* m_assignmentsList;
+	m_assignmentsList = new wxBoxSizer( wxVERTICAL );
+
+
+	m_assignmentsScrollWindow->SetSizer( m_assignmentsList );
+	m_assignmentsScrollWindow->Layout();
+	m_assignmentsList->Fit( m_assignmentsScrollWindow );
+	bSizerMain->Add( m_assignmentsScrollWindow, 1, wxALL|wxEXPAND, 5 );
+
+
+	this->SetSizer( bSizerMain );
+	this->Layout();
+	bSizerMain->Fit( this );
+
+	// Connect Events
+	m_btnAddAssignment->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( PANEL_ASSIGN_COMPONENT_CLASSES_BASE::OnAddAssignmentClick ), NULL, this );
+}
+
+PANEL_ASSIGN_COMPONENT_CLASSES_BASE::~PANEL_ASSIGN_COMPONENT_CLASSES_BASE()
+{
+	// Disconnect Events
+	m_btnAddAssignment->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( PANEL_ASSIGN_COMPONENT_CLASSES_BASE::OnAddAssignmentClick ), NULL, this );
+
+}
+
+PANEL_COMPONENT_CLASS_ASSIGNMENT_BASE::PANEL_COMPONENT_CLASS_ASSIGNMENT_BASE( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style, const wxString& name ) : wxPanel( parent, id, pos, size, style, name )
+{
+	this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_3DLIGHT ) );
+
+	wxStaticBoxSizer* m_assignmentGroup;
+	m_assignmentGroup = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, wxEmptyString ), wxVERTICAL );
+
+	wxFlexGridSizer* m_header;
+	m_header = new wxFlexGridSizer( 0, 5, 0, 0 );
+	m_header->AddGrowableCol( 1 );
+	m_header->SetFlexibleDirection( wxHORIZONTAL );
+	m_header->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_NONE );
+
+	m_staticText101 = new wxStaticText( m_assignmentGroup->GetStaticBox(), wxID_ANY, _("Component Class:"), wxDefaultPosition, wxDefaultSize, 0 );
+	m_staticText101->Wrap( -1 );
+	m_header->Add( m_staticText101, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
+
+	m_componentClass = new wxTextCtrl( m_assignmentGroup->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
+	m_header->Add( m_componentClass, 0, wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND, 5 );
+
+
+	m_header->Add( 10, 0, 1, wxEXPAND, 5 );
+
+	m_buttonHighlightItems = new STD_BITMAP_BUTTON( m_assignmentGroup->GetStaticBox(), wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, wxBU_AUTODRAW|0 );
+	m_header->Add( m_buttonHighlightItems, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
+
+	m_buttonDeleteAssignment = new STD_BITMAP_BUTTON( m_assignmentGroup->GetStaticBox(), wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, wxBU_AUTODRAW|0 );
+	m_header->Add( m_buttonDeleteAssignment, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
+
+
+	m_assignmentGroup->Add( m_header, 0, wxEXPAND, 0 );
+
+	wxBoxSizer* bSizer4;
+	bSizer4 = new wxBoxSizer( wxVERTICAL );
+
+
+	bSizer4->Add( 0, 5, 0, 0, 5 );
+
+	wxBoxSizer* bSizer3;
+	bSizer3 = new wxBoxSizer( wxHORIZONTAL );
+
+	m_buttonAddCondition = new STD_BITMAP_BUTTON( m_assignmentGroup->GetStaticBox(), wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, wxBU_AUTODRAW|0 );
+	bSizer3->Add( m_buttonAddCondition, 0, wxALIGN_CENTER_VERTICAL, 0 );
+
+
+	bSizer3->Add( 0, 0, 1, wxEXPAND, 5 );
+
+	m_radioAll = new wxRadioButton( m_assignmentGroup->GetStaticBox(), wxID_ANY, _("Match All"), wxDefaultPosition, wxDefaultSize, 0 );
+	m_radioAll->SetValue( true );
+	bSizer3->Add( m_radioAll, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
+
+	m_radioAny = new wxRadioButton( m_assignmentGroup->GetStaticBox(), wxID_ANY, _("Match Any"), wxDefaultPosition, wxDefaultSize, 0 );
+	bSizer3->Add( m_radioAny, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
+
+
+	bSizer4->Add( bSizer3, 0, wxEXPAND, 5 );
+
+
+	m_assignmentGroup->Add( bSizer4, 0, wxEXPAND, 5 );
+
+
+	this->SetSizer( m_assignmentGroup );
+	this->Layout();
+	m_assignmentGroup->Fit( this );
+
+	// Connect Events
+	m_buttonHighlightItems->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( PANEL_COMPONENT_CLASS_ASSIGNMENT_BASE::OnHighlightItemsClick ), NULL, this );
+	m_buttonDeleteAssignment->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( PANEL_COMPONENT_CLASS_ASSIGNMENT_BASE::OnDeleteAssignmentClick ), NULL, this );
+	m_buttonAddCondition->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( PANEL_COMPONENT_CLASS_ASSIGNMENT_BASE::OnAddConditionClick ), NULL, this );
+}
+
+PANEL_COMPONENT_CLASS_ASSIGNMENT_BASE::~PANEL_COMPONENT_CLASS_ASSIGNMENT_BASE()
+{
+	// Disconnect Events
+	m_buttonHighlightItems->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( PANEL_COMPONENT_CLASS_ASSIGNMENT_BASE::OnHighlightItemsClick ), NULL, this );
+	m_buttonDeleteAssignment->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( PANEL_COMPONENT_CLASS_ASSIGNMENT_BASE::OnDeleteAssignmentClick ), NULL, this );
+	m_buttonAddCondition->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( PANEL_COMPONENT_CLASS_ASSIGNMENT_BASE::OnAddConditionClick ), NULL, this );
+
+}
+
+PANEL_COMPONENT_CLASS_CONDITION_REFERENCE_BASE::PANEL_COMPONENT_CLASS_CONDITION_REFERENCE_BASE( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style, const wxString& name ) : wxPanel( parent, id, pos, size, style, name )
+{
+	this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_3DLIGHT ) );
+
+	wxFlexGridSizer* m_conditionSizer;
+	m_conditionSizer = new wxFlexGridSizer( 0, 65, 0, 0 );
+	m_conditionSizer->AddGrowableCol( 1 );
+	m_conditionSizer->SetFlexibleDirection( wxBOTH );
+	m_conditionSizer->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
+
+	m_title = new wxStaticText( this, wxID_ANY, _("Reference:"), wxDefaultPosition, wxDefaultSize, 0 );
+	m_title->Wrap( -1 );
+	m_title->SetFont( wxFont( 12, wxFONTFAMILY_SWISS, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false, wxT("Helvetica") ) );
+
+	m_conditionSizer->Add( m_title, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
+
+	m_refs = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
+	m_conditionSizer->Add( m_refs, 0, wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND, 5 );
+
+
+	m_conditionSizer->Add( 10, 0, 1, wxEXPAND, 5 );
+
+	m_buttonImportRefs = new STD_BITMAP_BUTTON( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, wxBU_AUTODRAW|0 );
+	m_conditionSizer->Add( m_buttonImportRefs, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
+
+	m_buttonDeleteMatch = new STD_BITMAP_BUTTON( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, wxBU_AUTODRAW|0 );
+	m_conditionSizer->Add( m_buttonDeleteMatch, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
+
+
+	this->SetSizer( m_conditionSizer );
+	this->Layout();
+	m_conditionSizer->Fit( this );
+
+	// Connect Events
+	m_refs->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( PANEL_COMPONENT_CLASS_CONDITION_REFERENCE_BASE::OnReferenceRightDown ), NULL, this );
+	m_buttonImportRefs->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( PANEL_COMPONENT_CLASS_CONDITION_REFERENCE_BASE::OnImportRefsClick ), NULL, this );
+	m_buttonDeleteMatch->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( PANEL_COMPONENT_CLASS_CONDITION_REFERENCE_BASE::OnDeleteConditionClick ), NULL, this );
+}
+
+PANEL_COMPONENT_CLASS_CONDITION_REFERENCE_BASE::~PANEL_COMPONENT_CLASS_CONDITION_REFERENCE_BASE()
+{
+	// Disconnect Events
+	m_refs->Disconnect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( PANEL_COMPONENT_CLASS_CONDITION_REFERENCE_BASE::OnReferenceRightDown ), NULL, this );
+	m_buttonImportRefs->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( PANEL_COMPONENT_CLASS_CONDITION_REFERENCE_BASE::OnImportRefsClick ), NULL, this );
+	m_buttonDeleteMatch->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( PANEL_COMPONENT_CLASS_CONDITION_REFERENCE_BASE::OnDeleteConditionClick ), NULL, this );
+
+}
+
+PANEL_COMPONENT_CLASS_CONDITION_SIDE_BASE::PANEL_COMPONENT_CLASS_CONDITION_SIDE_BASE( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style, const wxString& name ) : wxPanel( parent, id, pos, size, style, name )
+{
+	this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_3DLIGHT ) );
+
+	wxFlexGridSizer* m_conditionSizer;
+	m_conditionSizer = new wxFlexGridSizer( 0, 4, 0, 0 );
+	m_conditionSizer->AddGrowableCol( 1 );
+	m_conditionSizer->SetFlexibleDirection( wxBOTH );
+	m_conditionSizer->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
+
+	m_title = new wxStaticText( this, wxID_ANY, _("Side:"), wxDefaultPosition, wxDefaultSize, 0 );
+	m_title->Wrap( -1 );
+	m_title->SetFont( wxFont( 12, wxFONTFAMILY_SWISS, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false, wxT("Helvetica") ) );
+
+	m_conditionSizer->Add( m_title, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
+
+	m_side = new wxComboBox( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, wxCB_READONLY );
+	m_conditionSizer->Add( m_side, 0, wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND, 5 );
+
+
+	m_conditionSizer->Add( 10, 0, 1, wxEXPAND, 5 );
+
+	m_buttonDeleteMatch = new STD_BITMAP_BUTTON( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, wxBU_AUTODRAW|0 );
+	m_conditionSizer->Add( m_buttonDeleteMatch, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
+
+
+	this->SetSizer( m_conditionSizer );
+	this->Layout();
+	m_conditionSizer->Fit( this );
+
+	// Connect Events
+	m_buttonDeleteMatch->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( PANEL_COMPONENT_CLASS_CONDITION_SIDE_BASE::OnDeleteConditionClick ), NULL, this );
+}
+
+PANEL_COMPONENT_CLASS_CONDITION_SIDE_BASE::~PANEL_COMPONENT_CLASS_CONDITION_SIDE_BASE()
+{
+	// Disconnect Events
+	m_buttonDeleteMatch->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( PANEL_COMPONENT_CLASS_CONDITION_SIDE_BASE::OnDeleteConditionClick ), NULL, this );
+
+}
+
+PANEL_COMPONENT_CLASS_CONDITION_ROTATION_BASE::PANEL_COMPONENT_CLASS_CONDITION_ROTATION_BASE( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style, const wxString& name ) : wxPanel( parent, id, pos, size, style, name )
+{
+	this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_3DLIGHT ) );
+
+	wxFlexGridSizer* m_conditionSizer;
+	m_conditionSizer = new wxFlexGridSizer( 0, 5, 0, 0 );
+	m_conditionSizer->AddGrowableCol( 1 );
+	m_conditionSizer->SetFlexibleDirection( wxBOTH );
+	m_conditionSizer->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
+
+	m_title = new wxStaticText( this, wxID_ANY, _("Rotation:"), wxDefaultPosition, wxDefaultSize, 0 );
+	m_title->Wrap( -1 );
+	m_title->SetFont( wxFont( 12, wxFONTFAMILY_SWISS, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false, wxT("Helvetica") ) );
+
+	m_conditionSizer->Add( m_title, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
+
+	m_rotation = new wxComboBox( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 );
+	m_conditionSizer->Add( m_rotation, 0, wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND, 5 );
+
+	m_rotUnit = new wxStaticText( this, wxID_ANY, _("deg"), wxDefaultPosition, wxDefaultSize, 0 );
+	m_rotUnit->Wrap( -1 );
+	m_conditionSizer->Add( m_rotUnit, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
+
+
+	m_conditionSizer->Add( 10, 0, 1, wxEXPAND, 5 );
+
+	m_buttonDeleteMatch = new STD_BITMAP_BUTTON( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, wxBU_AUTODRAW|0 );
+	m_conditionSizer->Add( m_buttonDeleteMatch, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
+
+
+	this->SetSizer( m_conditionSizer );
+	this->Layout();
+
+	// Connect Events
+	m_buttonDeleteMatch->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( PANEL_COMPONENT_CLASS_CONDITION_ROTATION_BASE::OnDeleteConditionClick ), NULL, this );
+}
+
+PANEL_COMPONENT_CLASS_CONDITION_ROTATION_BASE::~PANEL_COMPONENT_CLASS_CONDITION_ROTATION_BASE()
+{
+	// Disconnect Events
+	m_buttonDeleteMatch->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( PANEL_COMPONENT_CLASS_CONDITION_ROTATION_BASE::OnDeleteConditionClick ), NULL, this );
+
+}
+
+PANEL_COMPONENT_CLASS_CONDITION_FOOTPRINT_BASE::PANEL_COMPONENT_CLASS_CONDITION_FOOTPRINT_BASE( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style, const wxString& name ) : wxPanel( parent, id, pos, size, style, name )
+{
+	this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_3DLIGHT ) );
+
+	wxFlexGridSizer* m_conditionSizer;
+	m_conditionSizer = new wxFlexGridSizer( 0, 6, 0, 0 );
+	m_conditionSizer->AddGrowableCol( 1 );
+	m_conditionSizer->SetFlexibleDirection( wxBOTH );
+	m_conditionSizer->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
+
+	m_title = new wxStaticText( this, wxID_ANY, _("Footprint:"), wxDefaultPosition, wxDefaultSize, 0 );
+	m_title->Wrap( -1 );
+	m_title->SetFont( wxFont( 12, wxFONTFAMILY_SWISS, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false, wxT("Helvetica") ) );
+
+	m_conditionSizer->Add( m_title, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
+
+	m_footprint = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
+	m_conditionSizer->Add( m_footprint, 0, wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND, 5 );
+
+
+	m_conditionSizer->Add( 10, 0, 1, wxEXPAND, 5 );
+
+	m_buttonShowLibrary = new STD_BITMAP_BUTTON( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, wxBU_AUTODRAW|0 );
+	m_conditionSizer->Add( m_buttonShowLibrary, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
+
+
+	m_conditionSizer->Add( 10, 0, 1, wxEXPAND, 5 );
+
+	m_buttonDeleteMatch = new STD_BITMAP_BUTTON( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, wxBU_AUTODRAW|0 );
+	m_conditionSizer->Add( m_buttonDeleteMatch, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
+
+
+	this->SetSizer( m_conditionSizer );
+	this->Layout();
+	m_conditionSizer->Fit( this );
+
+	// Connect Events
+	m_buttonShowLibrary->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( PANEL_COMPONENT_CLASS_CONDITION_FOOTPRINT_BASE::OnShowLibraryClick ), NULL, this );
+	m_buttonDeleteMatch->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( PANEL_COMPONENT_CLASS_CONDITION_FOOTPRINT_BASE::OnDeleteConditionClick ), NULL, this );
+}
+
+PANEL_COMPONENT_CLASS_CONDITION_FOOTPRINT_BASE::~PANEL_COMPONENT_CLASS_CONDITION_FOOTPRINT_BASE()
+{
+	// Disconnect Events
+	m_buttonShowLibrary->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( PANEL_COMPONENT_CLASS_CONDITION_FOOTPRINT_BASE::OnShowLibraryClick ), NULL, this );
+	m_buttonDeleteMatch->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( PANEL_COMPONENT_CLASS_CONDITION_FOOTPRINT_BASE::OnDeleteConditionClick ), NULL, this );
+
+}
+
+PANEL_COMPONENT_CLASS_CONDITION_FIELD_BASE::PANEL_COMPONENT_CLASS_CONDITION_FIELD_BASE( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style, const wxString& name ) : wxPanel( parent, id, pos, size, style, name )
+{
+	this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_3DLIGHT ) );
+
+	wxFlexGridSizer* m_conditionSizer;
+	m_conditionSizer = new wxFlexGridSizer( 0, 7, 0, 0 );
+	m_conditionSizer->AddGrowableCol( 1 );
+	m_conditionSizer->AddGrowableCol( 4 );
+	m_conditionSizer->SetFlexibleDirection( wxBOTH );
+	m_conditionSizer->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
+
+	m_title = new wxStaticText( this, wxID_ANY, _("Footprint Field:"), wxDefaultPosition, wxDefaultSize, 0 );
+	m_title->Wrap( -1 );
+	m_title->SetFont( wxFont( 12, wxFONTFAMILY_SWISS, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false, wxT("Helvetica") ) );
+
+	m_conditionSizer->Add( m_title, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
+
+	m_fieldName = new wxComboBox( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 );
+	m_fieldName->SetFont( wxFont( 12, wxFONTFAMILY_SWISS, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false, wxT("Helvetica") ) );
+
+	m_conditionSizer->Add( m_fieldName, 0, wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND, 5 );
+
+
+	m_conditionSizer->Add( 10, 0, 1, wxEXPAND, 5 );
+
+	m_staticText44 = new wxStaticText( this, wxID_ANY, _("Field Value:"), wxDefaultPosition, wxDefaultSize, 0 );
+	m_staticText44->Wrap( -1 );
+	m_staticText44->SetFont( wxFont( 12, wxFONTFAMILY_SWISS, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false, wxT("Helvetica") ) );
+
+	m_conditionSizer->Add( m_staticText44, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
+
+	m_fieldValue = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
+	m_fieldValue->SetFont( wxFont( 12, wxFONTFAMILY_SWISS, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false, wxT("Helvetica") ) );
+
+	m_conditionSizer->Add( m_fieldValue, 0, wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND, 5 );
+
+
+	m_conditionSizer->Add( 10, 0, 1, wxEXPAND, 5 );
+
+	m_buttonDeleteMatch = new STD_BITMAP_BUTTON( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, wxBU_AUTODRAW|0 );
+	m_conditionSizer->Add( m_buttonDeleteMatch, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
+
+
+	this->SetSizer( m_conditionSizer );
+	this->Layout();
+	m_conditionSizer->Fit( this );
+
+	// Connect Events
+	m_buttonDeleteMatch->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( PANEL_COMPONENT_CLASS_CONDITION_FIELD_BASE::OnDeleteConditionClick ), NULL, this );
+}
+
+PANEL_COMPONENT_CLASS_CONDITION_FIELD_BASE::~PANEL_COMPONENT_CLASS_CONDITION_FIELD_BASE()
+{
+	// Disconnect Events
+	m_buttonDeleteMatch->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( PANEL_COMPONENT_CLASS_CONDITION_FIELD_BASE::OnDeleteConditionClick ), NULL, this );
+
+}
+
+PANEL_COMPONENT_CLASS_CONDITION_CUSTOM_BASE::PANEL_COMPONENT_CLASS_CONDITION_CUSTOM_BASE( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style, const wxString& name ) : wxPanel( parent, id, pos, size, style, name )
+{
+	this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_3DLIGHT ) );
+
+	wxFlexGridSizer* m_conditionSizer;
+	m_conditionSizer = new wxFlexGridSizer( 0, 4, 0, 0 );
+	m_conditionSizer->AddGrowableCol( 1 );
+	m_conditionSizer->SetFlexibleDirection( wxBOTH );
+	m_conditionSizer->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
+
+	m_title = new wxStaticText( this, wxID_ANY, _("Custom:"), wxDefaultPosition, wxDefaultSize, 0 );
+	m_title->Wrap( -1 );
+	m_title->SetFont( wxFont( 12, wxFONTFAMILY_SWISS, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false, wxT("Helvetica") ) );
+
+	m_conditionSizer->Add( m_title, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
+
+	m_customCondition = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
+	m_conditionSizer->Add( m_customCondition, 0, wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND, 5 );
+
+
+	m_conditionSizer->Add( 10, 0, 1, wxEXPAND, 5 );
+
+	m_buttonDeleteMatch = new STD_BITMAP_BUTTON( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, wxBU_AUTODRAW|0 );
+	m_conditionSizer->Add( m_buttonDeleteMatch, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
+
+
+	this->SetSizer( m_conditionSizer );
+	this->Layout();
+	m_conditionSizer->Fit( this );
+
+	// Connect Events
+	m_buttonDeleteMatch->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( PANEL_COMPONENT_CLASS_CONDITION_CUSTOM_BASE::OnDeleteConditionClick ), NULL, this );
+}
+
+PANEL_COMPONENT_CLASS_CONDITION_CUSTOM_BASE::~PANEL_COMPONENT_CLASS_CONDITION_CUSTOM_BASE()
+{
+	// Disconnect Events
+	m_buttonDeleteMatch->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( PANEL_COMPONENT_CLASS_CONDITION_CUSTOM_BASE::OnDeleteConditionClick ), NULL, this );
+
+}
+
+PANEL_COMPONENT_CLASS_CONDITION_SHEET_BASE::PANEL_COMPONENT_CLASS_CONDITION_SHEET_BASE( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style, const wxString& name ) : wxPanel( parent, id, pos, size, style, name )
+{
+	this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_3DLIGHT ) );
+
+	wxFlexGridSizer* m_conditionSizer;
+	m_conditionSizer = new wxFlexGridSizer( 0, 4, 0, 0 );
+	m_conditionSizer->AddGrowableCol( 1 );
+	m_conditionSizer->SetFlexibleDirection( wxBOTH );
+	m_conditionSizer->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
+
+	m_title = new wxStaticText( this, wxID_ANY, _("Sheet Name:"), wxDefaultPosition, wxDefaultSize, 0 );
+	m_title->Wrap( -1 );
+	m_title->SetFont( wxFont( 12, wxFONTFAMILY_SWISS, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false, wxT("Helvetica") ) );
+
+	m_conditionSizer->Add( m_title, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
+
+	m_sheetName = new wxComboBox( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, wxCB_READONLY );
+	m_conditionSizer->Add( m_sheetName, 0, wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND, 5 );
+
+
+	m_conditionSizer->Add( 10, 0, 1, wxEXPAND, 5 );
+
+	m_buttonDeleteMatch = new STD_BITMAP_BUTTON( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, wxBU_AUTODRAW|0 );
+	m_conditionSizer->Add( m_buttonDeleteMatch, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
+
+
+	this->SetSizer( m_conditionSizer );
+	this->Layout();
+	m_conditionSizer->Fit( this );
+
+	// Connect Events
+	m_buttonDeleteMatch->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( PANEL_COMPONENT_CLASS_CONDITION_SHEET_BASE::OnDeleteConditionClick ), NULL, this );
+}
+
+PANEL_COMPONENT_CLASS_CONDITION_SHEET_BASE::~PANEL_COMPONENT_CLASS_CONDITION_SHEET_BASE()
+{
+	// Disconnect Events
+	m_buttonDeleteMatch->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( PANEL_COMPONENT_CLASS_CONDITION_SHEET_BASE::OnDeleteConditionClick ), NULL, this );
+
+}
diff --git a/pcbnew/dialogs/panel_assign_component_classes_base.fbp b/pcbnew/dialogs/panel_assign_component_classes_base.fbp
new file mode 100644
index 0000000000..c06bbbd090
--- /dev/null
+++ b/pcbnew/dialogs/panel_assign_component_classes_base.fbp
@@ -0,0 +1,3121 @@
+<?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">1</property>
+    <property name="cpp_event_generation">connect</property>
+    <property name="cpp_help_provider">none</property>
+    <property name="cpp_namespace"></property>
+    <property name="cpp_precompiled_header"></property>
+    <property name="cpp_use_array_enum">0</property>
+    <property name="cpp_use_enum">0</property>
+    <property name="embedded_files_path">res</property>
+    <property name="encoding">UTF-8</property>
+    <property name="file">panel_assign_component_classes_base</property>
+    <property name="first_id">1000</property>
+    <property name="internationalize">1</property>
+    <property name="lua_skip_events">1</property>
+    <property name="lua_ui_table">UI</property>
+    <property name="name">PANEL_ASSIGN_COMPONENT_CLASSES_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"></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_ASSIGN_COMPONENT_CLASSES_BASE</property>
+      <property name="pos"></property>
+      <property name="size">-1,-1</property>
+      <property name="subclass"></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">bSizerMain</property>
+        <property name="orient">wxVERTICAL</property>
+        <property name="permission">none</property>
+        <object class="sizeritem" expanded="false">
+          <property name="border">5</property>
+          <property name="flag">wxALL</property>
+          <property name="proportion">0</property>
+          <object class="wxCheckBox" expanded="false">
+            <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">Assign component class per 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_assignSheetClasses</property>
+            <property name="pane_border">1</property>
+            <property name="pane_position"></property>
+            <property name="pane_size"></property>
+            <property name="permission">protected</property>
+            <property name="pin_button">1</property>
+            <property name="pos"></property>
+            <property name="resize">Resizable</property>
+            <property name="show">1</property>
+            <property name="size"></property>
+            <property name="style"></property>
+            <property name="subclass">; ; forward_declare</property>
+            <property name="toolbar_pane">0</property>
+            <property name="tooltip"></property>
+            <property name="validator_data_type"></property>
+            <property name="validator_style">wxFILTER_NONE</property>
+            <property name="validator_type">wxDefaultValidator</property>
+            <property name="validator_variable"></property>
+            <property name="window_extra_style"></property>
+            <property name="window_name"></property>
+            <property name="window_style"></property>
+          </object>
+        </object>
+        <object class="sizeritem" expanded="false">
+          <property name="border">5</property>
+          <property name="flag">wxEXPAND | wxALL</property>
+          <property name="proportion">0</property>
+          <object class="wxStaticLine" expanded="false">
+            <property name="BottomDockable">1</property>
+            <property name="LeftDockable">1</property>
+            <property name="RightDockable">1</property>
+            <property name="TopDockable">1</property>
+            <property name="aui_layer">0</property>
+            <property name="aui_name"></property>
+            <property name="aui_position">0</property>
+            <property name="aui_row">0</property>
+            <property name="best_size"></property>
+            <property name="bg"></property>
+            <property name="caption"></property>
+            <property name="caption_visible">1</property>
+            <property name="center_pane">0</property>
+            <property name="close_button">1</property>
+            <property name="context_help"></property>
+            <property name="context_menu">1</property>
+            <property name="default_pane">0</property>
+            <property name="dock">Dock</property>
+            <property name="dock_fixed">0</property>
+            <property name="docking">Left</property>
+            <property name="drag_accept_files">0</property>
+            <property name="enabled">1</property>
+            <property name="fg"></property>
+            <property name="floatable">1</property>
+            <property name="font"></property>
+            <property name="gripper">0</property>
+            <property name="hidden">0</property>
+            <property name="id">wxID_ANY</property>
+            <property name="max_size"></property>
+            <property name="maximize_button">0</property>
+            <property name="maximum_size"></property>
+            <property name="min_size"></property>
+            <property name="minimize_button">0</property>
+            <property name="minimum_size"></property>
+            <property name="moveable">1</property>
+            <property name="name">m_staticline1</property>
+            <property name="pane_border">1</property>
+            <property name="pane_position"></property>
+            <property name="pane_size"></property>
+            <property name="permission">protected</property>
+            <property name="pin_button">1</property>
+            <property name="pos"></property>
+            <property name="resize">Resizable</property>
+            <property name="show">1</property>
+            <property name="size"></property>
+            <property name="style">wxLI_HORIZONTAL</property>
+            <property name="subclass">; ; forward_declare</property>
+            <property name="toolbar_pane">0</property>
+            <property name="tooltip"></property>
+            <property name="window_extra_style"></property>
+            <property name="window_name"></property>
+            <property name="window_style"></property>
+          </object>
+        </object>
+        <object class="sizeritem" expanded="true">
+          <property name="border">5</property>
+          <property name="flag">wxEXPAND</property>
+          <property name="proportion">0</property>
+          <object class="wxFlexGridSizer" expanded="false">
+            <property name="cols">3</property>
+            <property name="flexible_direction">wxHORIZONTAL</property>
+            <property name="growablecols">1</property>
+            <property name="growablerows"></property>
+            <property name="hgap">0</property>
+            <property name="minimum_size"></property>
+            <property name="name">fgSizer8</property>
+            <property name="non_flexible_grow_mode">wxFLEX_GROWMODE_SPECIFIED</property>
+            <property name="permission">none</property>
+            <property name="rows">0</property>
+            <property name="vgap">0</property>
+            <object class="sizeritem" expanded="false">
+              <property name="border">5</property>
+              <property name="flag">wxALL</property>
+              <property name="proportion">0</property>
+              <object class="wxStaticText" expanded="false">
+                <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">Custom Assignments:</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_staticText3</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="false">
+              <property name="border">5</property>
+              <property name="flag">wxEXPAND</property>
+              <property name="proportion">1</property>
+              <object class="spacer" expanded="false">
+                <property name="height">0</property>
+                <property name="permission">protected</property>
+                <property name="width">0</property>
+              </object>
+            </object>
+            <object class="sizeritem" expanded="false">
+              <property name="border">5</property>
+              <property name="flag">wxALL</property>
+              <property name="proportion">0</property>
+              <object class="wxButton" expanded="false">
+                <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="auth_needed">0</property>
+                <property name="best_size"></property>
+                <property name="bg"></property>
+                <property name="bitmap"></property>
+                <property name="caption"></property>
+                <property name="caption_visible">1</property>
+                <property name="center_pane">0</property>
+                <property name="close_button">1</property>
+                <property name="context_help"></property>
+                <property name="context_menu">1</property>
+                <property name="current"></property>
+                <property name="default">0</property>
+                <property name="default_pane">0</property>
+                <property name="disabled"></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="focus"></property>
+                <property name="font"></property>
+                <property name="gripper">0</property>
+                <property name="hidden">0</property>
+                <property name="id">wxID_ANY</property>
+                <property name="label">Add Custom Assignment</property>
+                <property name="margins"></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_btnAddAssignment</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="position"></property>
+                <property name="pressed"></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>
+                <event name="OnButtonClick">OnAddAssignmentClick</event>
+              </object>
+            </object>
+          </object>
+        </object>
+        <object class="sizeritem" expanded="true">
+          <property name="border">5</property>
+          <property name="flag">wxALL|wxEXPAND</property>
+          <property name="proportion">1</property>
+          <object class="wxScrolledWindow" expanded="true">
+            <property name="BottomDockable">1</property>
+            <property name="LeftDockable">1</property>
+            <property name="RightDockable">1</property>
+            <property name="TopDockable">1</property>
+            <property name="aui_layer">0</property>
+            <property name="aui_name"></property>
+            <property name="aui_position">0</property>
+            <property name="aui_row">0</property>
+            <property name="best_size"></property>
+            <property name="bg"></property>
+            <property name="caption"></property>
+            <property name="caption_visible">1</property>
+            <property name="center_pane">0</property>
+            <property name="close_button">1</property>
+            <property name="context_help"></property>
+            <property name="context_menu">1</property>
+            <property name="default_pane">0</property>
+            <property name="dock">Dock</property>
+            <property name="dock_fixed">0</property>
+            <property name="docking">Left</property>
+            <property name="drag_accept_files">0</property>
+            <property name="enabled">1</property>
+            <property name="fg"></property>
+            <property name="floatable">1</property>
+            <property name="font"></property>
+            <property name="gripper">0</property>
+            <property name="hidden">0</property>
+            <property name="id">wxID_ANY</property>
+            <property name="max_size"></property>
+            <property name="maximize_button">0</property>
+            <property name="maximum_size"></property>
+            <property name="min_size"></property>
+            <property name="minimize_button">0</property>
+            <property name="minimum_size"></property>
+            <property name="moveable">1</property>
+            <property name="name">m_assignmentsScrollWindow</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="scroll_rate_x">5</property>
+            <property name="scroll_rate_y">5</property>
+            <property name="show">1</property>
+            <property name="size"></property>
+            <property name="subclass">; ; forward_declare</property>
+            <property name="toolbar_pane">0</property>
+            <property name="tooltip"></property>
+            <property name="window_extra_style"></property>
+            <property name="window_name"></property>
+            <property name="window_style">wxHSCROLL|wxVSCROLL</property>
+            <object class="wxBoxSizer" expanded="false">
+              <property name="minimum_size"></property>
+              <property name="name">m_assignmentsList</property>
+              <property name="orient">wxVERTICAL</property>
+              <property name="permission">none</property>
+            </object>
+          </object>
+        </object>
+      </object>
+    </object>
+    <object class="Panel" expanded="true">
+      <property name="aui_managed">0</property>
+      <property name="aui_manager_style">wxAUI_MGR_DEFAULT</property>
+      <property name="bg">wxSYS_COLOUR_3DLIGHT</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_COMPONENT_CLASS_ASSIGNMENT_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">wxBORDER_SUNKEN|wxTAB_TRAVERSAL</property>
+      <object class="wxStaticBoxSizer" expanded="true">
+        <property name="id">wxID_ANY</property>
+        <property name="label"></property>
+        <property name="minimum_size"></property>
+        <property name="name">m_assignmentGroup</property>
+        <property name="orient">wxVERTICAL</property>
+        <property name="parent">1</property>
+        <property name="permission">none</property>
+        <object class="sizeritem" expanded="true">
+          <property name="border">0</property>
+          <property name="flag">wxEXPAND</property>
+          <property name="proportion">0</property>
+          <object class="wxFlexGridSizer" expanded="true">
+            <property name="cols">5</property>
+            <property name="flexible_direction">wxHORIZONTAL</property>
+            <property name="growablecols">1</property>
+            <property name="growablerows"></property>
+            <property name="hgap">0</property>
+            <property name="minimum_size"></property>
+            <property name="name">m_header</property>
+            <property name="non_flexible_grow_mode">wxFLEX_GROWMODE_NONE</property>
+            <property name="permission">none</property>
+            <property name="rows">0</property>
+            <property name="vgap">0</property>
+            <object class="sizeritem" expanded="false">
+              <property name="border">5</property>
+              <property name="flag">wxALIGN_CENTER_VERTICAL|wxALL</property>
+              <property name="proportion">0</property>
+              <object class="wxStaticText" expanded="false">
+                <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="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_staticText101</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="false">
+              <property name="border">5</property>
+              <property name="flag">wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND</property>
+              <property name="proportion">0</property>
+              <object class="wxTextCtrl" expanded="false">
+                <property name="BottomDockable">1</property>
+                <property name="LeftDockable">1</property>
+                <property name="RightDockable">1</property>
+                <property name="TopDockable">1</property>
+                <property name="aui_layer">0</property>
+                <property name="aui_name"></property>
+                <property name="aui_position">0</property>
+                <property name="aui_row">0</property>
+                <property name="best_size"></property>
+                <property name="bg"></property>
+                <property name="caption"></property>
+                <property name="caption_visible">1</property>
+                <property name="center_pane">0</property>
+                <property name="close_button">1</property>
+                <property name="context_help"></property>
+                <property name="context_menu">1</property>
+                <property name="default_pane">0</property>
+                <property name="dock">Dock</property>
+                <property name="dock_fixed">0</property>
+                <property name="docking">Left</property>
+                <property name="drag_accept_files">0</property>
+                <property name="enabled">1</property>
+                <property name="fg"></property>
+                <property name="floatable">1</property>
+                <property name="font"></property>
+                <property name="gripper">0</property>
+                <property name="hidden">0</property>
+                <property name="id">wxID_ANY</property>
+                <property name="max_size"></property>
+                <property name="maximize_button">0</property>
+                <property name="maximum_size"></property>
+                <property name="maxlength">0</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_componentClass</property>
+                <property name="pane_border">1</property>
+                <property name="pane_position"></property>
+                <property name="pane_size"></property>
+                <property name="permission">protected</property>
+                <property name="pin_button">1</property>
+                <property name="pos"></property>
+                <property name="resize">Resizable</property>
+                <property name="show">1</property>
+                <property name="size"></property>
+                <property name="style"></property>
+                <property name="subclass">; ; forward_declare</property>
+                <property name="toolbar_pane">0</property>
+                <property name="tooltip"></property>
+                <property name="validator_data_type"></property>
+                <property name="validator_style">wxFILTER_NONE</property>
+                <property name="validator_type">wxDefaultValidator</property>
+                <property name="validator_variable"></property>
+                <property name="value"></property>
+                <property name="window_extra_style"></property>
+                <property name="window_name"></property>
+                <property name="window_style"></property>
+              </object>
+            </object>
+            <object class="sizeritem" expanded="false">
+              <property name="border">5</property>
+              <property name="flag">wxEXPAND</property>
+              <property name="proportion">1</property>
+              <object class="spacer" expanded="false">
+                <property name="height">0</property>
+                <property name="permission">protected</property>
+                <property name="width">10</property>
+              </object>
+            </object>
+            <object class="sizeritem" expanded="false">
+              <property name="border">5</property>
+              <property name="flag">wxALIGN_CENTER_VERTICAL|wxALL</property>
+              <property name="proportion">0</property>
+              <object class="wxBitmapButton" expanded="false">
+                <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="auth_needed">0</property>
+                <property name="best_size"></property>
+                <property name="bg"></property>
+                <property name="bitmap"></property>
+                <property name="caption"></property>
+                <property name="caption_visible">1</property>
+                <property name="center_pane">0</property>
+                <property name="close_button">1</property>
+                <property name="context_help"></property>
+                <property name="context_menu">1</property>
+                <property name="current"></property>
+                <property name="default">0</property>
+                <property name="default_pane">0</property>
+                <property name="disabled"></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="focus"></property>
+                <property name="font"></property>
+                <property name="gripper">0</property>
+                <property name="hidden">0</property>
+                <property name="id">wxID_ANY</property>
+                <property name="label">Highlight Matching Footprints</property>
+                <property name="margins"></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_buttonHighlightItems</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="position"></property>
+                <property name="pressed"></property>
+                <property name="resize">Resizable</property>
+                <property name="show">1</property>
+                <property name="size"></property>
+                <property name="style"></property>
+                <property name="subclass">STD_BITMAP_BUTTON; widgets/std_bitmap_button.h; 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="OnButtonClick">OnHighlightItemsClick</event>
+              </object>
+            </object>
+            <object class="sizeritem" expanded="true">
+              <property name="border">5</property>
+              <property name="flag">wxALIGN_CENTER_VERTICAL|wxALL</property>
+              <property name="proportion">0</property>
+              <object class="wxBitmapButton" 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="auth_needed">0</property>
+                <property name="best_size"></property>
+                <property name="bg"></property>
+                <property name="bitmap"></property>
+                <property name="caption"></property>
+                <property name="caption_visible">1</property>
+                <property name="center_pane">0</property>
+                <property name="close_button">1</property>
+                <property name="context_help"></property>
+                <property name="context_menu">1</property>
+                <property name="current"></property>
+                <property name="default">0</property>
+                <property name="default_pane">0</property>
+                <property name="disabled"></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="focus"></property>
+                <property name="font"></property>
+                <property name="gripper">0</property>
+                <property name="hidden">0</property>
+                <property name="id">wxID_ANY</property>
+                <property name="label">Delete Assignment</property>
+                <property name="margins"></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_buttonDeleteAssignment</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="position"></property>
+                <property name="pressed"></property>
+                <property name="resize">Resizable</property>
+                <property name="show">1</property>
+                <property name="size"></property>
+                <property name="style"></property>
+                <property name="subclass">STD_BITMAP_BUTTON; widgets/std_bitmap_button.h; 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="OnButtonClick">OnDeleteAssignmentClick</event>
+              </object>
+            </object>
+          </object>
+        </object>
+        <object class="sizeritem" expanded="true">
+          <property name="border">5</property>
+          <property name="flag">wxEXPAND</property>
+          <property name="proportion">0</property>
+          <object class="wxBoxSizer" expanded="true">
+            <property name="minimum_size"></property>
+            <property name="name">bSizer4</property>
+            <property name="orient">wxVERTICAL</property>
+            <property name="permission">none</property>
+            <object class="sizeritem" expanded="false">
+              <property name="border">5</property>
+              <property name="flag"></property>
+              <property name="proportion">0</property>
+              <object class="spacer" expanded="false">
+                <property name="height">5</property>
+                <property name="permission">protected</property>
+                <property name="width">0</property>
+              </object>
+            </object>
+            <object class="sizeritem" expanded="false">
+              <property name="border">5</property>
+              <property name="flag">wxEXPAND</property>
+              <property name="proportion">0</property>
+              <object class="wxBoxSizer" expanded="false">
+                <property name="minimum_size"></property>
+                <property name="name">bSizer3</property>
+                <property name="orient">wxHORIZONTAL</property>
+                <property name="permission">none</property>
+                <object class="sizeritem" expanded="false">
+                  <property name="border">0</property>
+                  <property name="flag">wxALIGN_CENTER_VERTICAL</property>
+                  <property name="proportion">0</property>
+                  <object class="wxBitmapButton" expanded="false">
+                    <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="auth_needed">0</property>
+                    <property name="best_size"></property>
+                    <property name="bg"></property>
+                    <property name="bitmap"></property>
+                    <property name="caption"></property>
+                    <property name="caption_visible">1</property>
+                    <property name="center_pane">0</property>
+                    <property name="close_button">1</property>
+                    <property name="context_help"></property>
+                    <property name="context_menu">1</property>
+                    <property name="current"></property>
+                    <property name="default">0</property>
+                    <property name="default_pane">0</property>
+                    <property name="disabled"></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="focus"></property>
+                    <property name="font"></property>
+                    <property name="gripper">0</property>
+                    <property name="hidden">0</property>
+                    <property name="id">wxID_ANY</property>
+                    <property name="label">Add Condition</property>
+                    <property name="margins"></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_buttonAddCondition</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="position"></property>
+                    <property name="pressed"></property>
+                    <property name="resize">Resizable</property>
+                    <property name="show">1</property>
+                    <property name="size"></property>
+                    <property name="style"></property>
+                    <property name="subclass">STD_BITMAP_BUTTON; widgets/std_bitmap_button.h; 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="OnButtonClick">OnAddConditionClick</event>
+                  </object>
+                </object>
+                <object class="sizeritem" expanded="false">
+                  <property name="border">5</property>
+                  <property name="flag">wxEXPAND</property>
+                  <property name="proportion">1</property>
+                  <object class="spacer" expanded="false">
+                    <property name="height">0</property>
+                    <property name="permission">protected</property>
+                    <property name="width">0</property>
+                  </object>
+                </object>
+                <object class="sizeritem" expanded="false">
+                  <property name="border">5</property>
+                  <property name="flag">wxALIGN_CENTER_VERTICAL|wxALL</property>
+                  <property name="proportion">0</property>
+                  <object class="wxRadioButton" expanded="false">
+                    <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">Match All</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_radioAll</property>
+                    <property name="pane_border">1</property>
+                    <property name="pane_position"></property>
+                    <property name="pane_size"></property>
+                    <property name="permission">protected</property>
+                    <property name="pin_button">1</property>
+                    <property name="pos"></property>
+                    <property name="resize">Resizable</property>
+                    <property name="show">1</property>
+                    <property name="size"></property>
+                    <property name="style"></property>
+                    <property name="subclass">; ; forward_declare</property>
+                    <property name="toolbar_pane">0</property>
+                    <property name="tooltip"></property>
+                    <property name="validator_data_type"></property>
+                    <property name="validator_style">wxFILTER_NONE</property>
+                    <property name="validator_type">wxDefaultValidator</property>
+                    <property name="validator_variable"></property>
+                    <property name="value">1</property>
+                    <property name="window_extra_style"></property>
+                    <property name="window_name"></property>
+                    <property name="window_style"></property>
+                  </object>
+                </object>
+                <object class="sizeritem" expanded="false">
+                  <property name="border">5</property>
+                  <property name="flag">wxALIGN_CENTER_VERTICAL|wxALL</property>
+                  <property name="proportion">0</property>
+                  <object class="wxRadioButton" expanded="false">
+                    <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">Match 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_radioAny</property>
+                    <property name="pane_border">1</property>
+                    <property name="pane_position"></property>
+                    <property name="pane_size"></property>
+                    <property name="permission">protected</property>
+                    <property name="pin_button">1</property>
+                    <property name="pos"></property>
+                    <property name="resize">Resizable</property>
+                    <property name="show">1</property>
+                    <property name="size"></property>
+                    <property name="style"></property>
+                    <property name="subclass">; ; forward_declare</property>
+                    <property name="toolbar_pane">0</property>
+                    <property name="tooltip"></property>
+                    <property name="validator_data_type"></property>
+                    <property name="validator_style">wxFILTER_NONE</property>
+                    <property name="validator_type">wxDefaultValidator</property>
+                    <property name="validator_variable"></property>
+                    <property name="value">0</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 class="Panel" expanded="true">
+      <property name="aui_managed">0</property>
+      <property name="aui_manager_style">wxAUI_MGR_DEFAULT</property>
+      <property name="bg">wxSYS_COLOUR_3DLIGHT</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_COMPONENT_CLASS_CONDITION_REFERENCE_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">wxBORDER_SUNKEN|wxTAB_TRAVERSAL</property>
+      <object class="wxFlexGridSizer" expanded="true">
+        <property name="cols">65</property>
+        <property name="flexible_direction">wxBOTH</property>
+        <property name="growablecols">1</property>
+        <property name="growablerows"></property>
+        <property name="hgap">0</property>
+        <property name="minimum_size"></property>
+        <property name="name">m_conditionSizer</property>
+        <property name="non_flexible_grow_mode">wxFLEX_GROWMODE_SPECIFIED</property>
+        <property name="permission">none</property>
+        <property name="rows">0</property>
+        <property name="vgap">0</property>
+        <object class="sizeritem" expanded="false">
+          <property name="border">5</property>
+          <property name="flag">wxALIGN_CENTER_VERTICAL|wxALL</property>
+          <property name="proportion">0</property>
+          <object class="wxStaticText" expanded="false">
+            <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">Helvetica,90,400,12,74,0</property>
+            <property name="gripper">0</property>
+            <property name="hidden">0</property>
+            <property name="id">wxID_ANY</property>
+            <property name="label">Reference:</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_title</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="false">
+          <property name="border">5</property>
+          <property name="flag">wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND</property>
+          <property name="proportion">0</property>
+          <object class="wxTextCtrl" expanded="false">
+            <property name="BottomDockable">1</property>
+            <property name="LeftDockable">1</property>
+            <property name="RightDockable">1</property>
+            <property name="TopDockable">1</property>
+            <property name="aui_layer">0</property>
+            <property name="aui_name"></property>
+            <property name="aui_position">0</property>
+            <property name="aui_row">0</property>
+            <property name="best_size"></property>
+            <property name="bg"></property>
+            <property name="caption"></property>
+            <property name="caption_visible">1</property>
+            <property name="center_pane">0</property>
+            <property name="close_button">1</property>
+            <property name="context_help"></property>
+            <property name="context_menu">1</property>
+            <property name="default_pane">0</property>
+            <property name="dock">Dock</property>
+            <property name="dock_fixed">0</property>
+            <property name="docking">Left</property>
+            <property name="drag_accept_files">0</property>
+            <property name="enabled">1</property>
+            <property name="fg"></property>
+            <property name="floatable">1</property>
+            <property name="font"></property>
+            <property name="gripper">0</property>
+            <property name="hidden">0</property>
+            <property name="id">wxID_ANY</property>
+            <property name="max_size"></property>
+            <property name="maximize_button">0</property>
+            <property name="maximum_size"></property>
+            <property name="maxlength">0</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_refs</property>
+            <property name="pane_border">1</property>
+            <property name="pane_position"></property>
+            <property name="pane_size"></property>
+            <property name="permission">protected</property>
+            <property name="pin_button">1</property>
+            <property name="pos"></property>
+            <property name="resize">Resizable</property>
+            <property name="show">1</property>
+            <property name="size"></property>
+            <property name="style"></property>
+            <property name="subclass">; ; forward_declare</property>
+            <property name="toolbar_pane">0</property>
+            <property name="tooltip"></property>
+            <property name="validator_data_type"></property>
+            <property name="validator_style">wxFILTER_NONE</property>
+            <property name="validator_type">wxDefaultValidator</property>
+            <property name="validator_variable"></property>
+            <property name="value"></property>
+            <property name="window_extra_style"></property>
+            <property name="window_name"></property>
+            <property name="window_style"></property>
+            <event name="OnRightDown">OnReferenceRightDown</event>
+          </object>
+        </object>
+        <object class="sizeritem" expanded="false">
+          <property name="border">5</property>
+          <property name="flag">wxEXPAND</property>
+          <property name="proportion">1</property>
+          <object class="spacer" expanded="false">
+            <property name="height">0</property>
+            <property name="permission">protected</property>
+            <property name="width">10</property>
+          </object>
+        </object>
+        <object class="sizeritem" expanded="false">
+          <property name="border">5</property>
+          <property name="flag">wxALIGN_CENTER_VERTICAL|wxALL</property>
+          <property name="proportion">0</property>
+          <object class="wxBitmapButton" expanded="false">
+            <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="auth_needed">0</property>
+            <property name="best_size"></property>
+            <property name="bg"></property>
+            <property name="bitmap"></property>
+            <property name="caption"></property>
+            <property name="caption_visible">1</property>
+            <property name="center_pane">0</property>
+            <property name="close_button">1</property>
+            <property name="context_help"></property>
+            <property name="context_menu">1</property>
+            <property name="current"></property>
+            <property name="default">0</property>
+            <property name="default_pane">0</property>
+            <property name="disabled"></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="focus"></property>
+            <property name="font"></property>
+            <property name="gripper">0</property>
+            <property name="hidden">0</property>
+            <property name="id">wxID_ANY</property>
+            <property name="label">Delete match</property>
+            <property name="margins"></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_buttonImportRefs</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="position"></property>
+            <property name="pressed"></property>
+            <property name="resize">Resizable</property>
+            <property name="show">1</property>
+            <property name="size"></property>
+            <property name="style"></property>
+            <property name="subclass">STD_BITMAP_BUTTON; widgets/std_bitmap_button.h; 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="OnButtonClick">OnImportRefsClick</event>
+          </object>
+        </object>
+        <object class="sizeritem" expanded="false">
+          <property name="border">5</property>
+          <property name="flag">wxALIGN_CENTER_VERTICAL|wxALL</property>
+          <property name="proportion">0</property>
+          <object class="wxBitmapButton" expanded="false">
+            <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="auth_needed">0</property>
+            <property name="best_size"></property>
+            <property name="bg"></property>
+            <property name="bitmap"></property>
+            <property name="caption"></property>
+            <property name="caption_visible">1</property>
+            <property name="center_pane">0</property>
+            <property name="close_button">1</property>
+            <property name="context_help"></property>
+            <property name="context_menu">1</property>
+            <property name="current"></property>
+            <property name="default">0</property>
+            <property name="default_pane">0</property>
+            <property name="disabled"></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="focus"></property>
+            <property name="font"></property>
+            <property name="gripper">0</property>
+            <property name="hidden">0</property>
+            <property name="id">wxID_ANY</property>
+            <property name="label">Delete match</property>
+            <property name="margins"></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_buttonDeleteMatch</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="position"></property>
+            <property name="pressed"></property>
+            <property name="resize">Resizable</property>
+            <property name="show">1</property>
+            <property name="size"></property>
+            <property name="style"></property>
+            <property name="subclass">STD_BITMAP_BUTTON; widgets/std_bitmap_button.h; 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="OnButtonClick">OnDeleteConditionClick</event>
+          </object>
+        </object>
+      </object>
+    </object>
+    <object class="Panel" expanded="true">
+      <property name="aui_managed">0</property>
+      <property name="aui_manager_style">wxAUI_MGR_DEFAULT</property>
+      <property name="bg">wxSYS_COLOUR_3DLIGHT</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_COMPONENT_CLASS_CONDITION_SIDE_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">wxBORDER_SUNKEN|wxTAB_TRAVERSAL</property>
+      <object class="wxFlexGridSizer" expanded="true">
+        <property name="cols">4</property>
+        <property name="flexible_direction">wxBOTH</property>
+        <property name="growablecols">1</property>
+        <property name="growablerows"></property>
+        <property name="hgap">0</property>
+        <property name="minimum_size"></property>
+        <property name="name">m_conditionSizer</property>
+        <property name="non_flexible_grow_mode">wxFLEX_GROWMODE_SPECIFIED</property>
+        <property name="permission">none</property>
+        <property name="rows">0</property>
+        <property name="vgap">0</property>
+        <object class="sizeritem" expanded="false">
+          <property name="border">5</property>
+          <property name="flag">wxALIGN_CENTER_VERTICAL|wxALL</property>
+          <property name="proportion">0</property>
+          <object class="wxStaticText" expanded="false">
+            <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">Helvetica,90,400,12,74,0</property>
+            <property name="gripper">0</property>
+            <property name="hidden">0</property>
+            <property name="id">wxID_ANY</property>
+            <property name="label">Side:</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_title</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="false">
+          <property name="border">5</property>
+          <property name="flag">wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND</property>
+          <property name="proportion">0</property>
+          <object class="wxComboBox" expanded="false">
+            <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_side</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">-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 class="sizeritem" expanded="false">
+          <property name="border">5</property>
+          <property name="flag">wxEXPAND</property>
+          <property name="proportion">1</property>
+          <object class="spacer" expanded="false">
+            <property name="height">0</property>
+            <property name="permission">protected</property>
+            <property name="width">10</property>
+          </object>
+        </object>
+        <object class="sizeritem" expanded="false">
+          <property name="border">5</property>
+          <property name="flag">wxALIGN_CENTER_VERTICAL|wxALL</property>
+          <property name="proportion">0</property>
+          <object class="wxBitmapButton" expanded="false">
+            <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="auth_needed">0</property>
+            <property name="best_size"></property>
+            <property name="bg"></property>
+            <property name="bitmap"></property>
+            <property name="caption"></property>
+            <property name="caption_visible">1</property>
+            <property name="center_pane">0</property>
+            <property name="close_button">1</property>
+            <property name="context_help"></property>
+            <property name="context_menu">1</property>
+            <property name="current"></property>
+            <property name="default">0</property>
+            <property name="default_pane">0</property>
+            <property name="disabled"></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="focus"></property>
+            <property name="font"></property>
+            <property name="gripper">0</property>
+            <property name="hidden">0</property>
+            <property name="id">wxID_ANY</property>
+            <property name="label">Delete match</property>
+            <property name="margins"></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_buttonDeleteMatch</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="position"></property>
+            <property name="pressed"></property>
+            <property name="resize">Resizable</property>
+            <property name="show">1</property>
+            <property name="size"></property>
+            <property name="style"></property>
+            <property name="subclass">STD_BITMAP_BUTTON; widgets/std_bitmap_button.h; 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="OnButtonClick">OnDeleteConditionClick</event>
+          </object>
+        </object>
+      </object>
+    </object>
+    <object class="Panel" expanded="true">
+      <property name="aui_managed">0</property>
+      <property name="aui_manager_style">wxAUI_MGR_DEFAULT</property>
+      <property name="bg">wxSYS_COLOUR_3DLIGHT</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_COMPONENT_CLASS_CONDITION_ROTATION_BASE</property>
+      <property name="pos"></property>
+      <property name="size">303,65</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">wxBORDER_SUNKEN|wxTAB_TRAVERSAL</property>
+      <object class="wxFlexGridSizer" expanded="true">
+        <property name="cols">5</property>
+        <property name="flexible_direction">wxBOTH</property>
+        <property name="growablecols">1</property>
+        <property name="growablerows"></property>
+        <property name="hgap">0</property>
+        <property name="minimum_size"></property>
+        <property name="name">m_conditionSizer</property>
+        <property name="non_flexible_grow_mode">wxFLEX_GROWMODE_SPECIFIED</property>
+        <property name="permission">none</property>
+        <property name="rows">0</property>
+        <property name="vgap">0</property>
+        <object class="sizeritem" expanded="true">
+          <property name="border">5</property>
+          <property name="flag">wxALIGN_CENTER_VERTICAL|wxALL</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">Helvetica,90,400,12,74,0</property>
+            <property name="gripper">0</property>
+            <property name="hidden">0</property>
+            <property name="id">wxID_ANY</property>
+            <property name="label">Rotation:</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_title</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">wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND</property>
+          <property name="proportion">0</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_rotation</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">-1</property>
+            <property name="show">1</property>
+            <property name="size"></property>
+            <property name="style"></property>
+            <property name="subclass">; ; forward_declare</property>
+            <property name="toolbar_pane">0</property>
+            <property name="tooltip"></property>
+            <property name="validator_data_type"></property>
+            <property name="validator_style">wxFILTER_NONE</property>
+            <property name="validator_type">wxDefaultValidator</property>
+            <property name="validator_variable"></property>
+            <property name="value"></property>
+            <property name="window_extra_style"></property>
+            <property name="window_name"></property>
+            <property name="window_style"></property>
+          </object>
+        </object>
+        <object class="sizeritem" expanded="true">
+          <property name="border">5</property>
+          <property name="flag">wxALIGN_CENTER_VERTICAL|wxALL</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">deg</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_rotUnit</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">1</property>
+          <object class="spacer" expanded="true">
+            <property name="height">0</property>
+            <property name="permission">protected</property>
+            <property name="width">10</property>
+          </object>
+        </object>
+        <object class="sizeritem" expanded="true">
+          <property name="border">5</property>
+          <property name="flag">wxALIGN_CENTER_VERTICAL|wxALL</property>
+          <property name="proportion">0</property>
+          <object class="wxBitmapButton" 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="auth_needed">0</property>
+            <property name="best_size"></property>
+            <property name="bg"></property>
+            <property name="bitmap"></property>
+            <property name="caption"></property>
+            <property name="caption_visible">1</property>
+            <property name="center_pane">0</property>
+            <property name="close_button">1</property>
+            <property name="context_help"></property>
+            <property name="context_menu">1</property>
+            <property name="current"></property>
+            <property name="default">0</property>
+            <property name="default_pane">0</property>
+            <property name="disabled"></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="focus"></property>
+            <property name="font"></property>
+            <property name="gripper">0</property>
+            <property name="hidden">0</property>
+            <property name="id">wxID_ANY</property>
+            <property name="label">Delete match</property>
+            <property name="margins"></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_buttonDeleteMatch</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="position"></property>
+            <property name="pressed"></property>
+            <property name="resize">Resizable</property>
+            <property name="show">1</property>
+            <property name="size"></property>
+            <property name="style"></property>
+            <property name="subclass">STD_BITMAP_BUTTON; widgets/std_bitmap_button.h; 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="OnButtonClick">OnDeleteConditionClick</event>
+          </object>
+        </object>
+      </object>
+    </object>
+    <object class="Panel" expanded="true">
+      <property name="aui_managed">0</property>
+      <property name="aui_manager_style">wxAUI_MGR_DEFAULT</property>
+      <property name="bg">wxSYS_COLOUR_3DLIGHT</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_COMPONENT_CLASS_CONDITION_FOOTPRINT_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">wxBORDER_SUNKEN|wxTAB_TRAVERSAL</property>
+      <object class="wxFlexGridSizer" expanded="true">
+        <property name="cols">6</property>
+        <property name="flexible_direction">wxBOTH</property>
+        <property name="growablecols">1</property>
+        <property name="growablerows"></property>
+        <property name="hgap">0</property>
+        <property name="minimum_size"></property>
+        <property name="name">m_conditionSizer</property>
+        <property name="non_flexible_grow_mode">wxFLEX_GROWMODE_SPECIFIED</property>
+        <property name="permission">none</property>
+        <property name="rows">0</property>
+        <property name="vgap">0</property>
+        <object class="sizeritem" expanded="true">
+          <property name="border">5</property>
+          <property name="flag">wxALIGN_CENTER_VERTICAL|wxALL</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">Helvetica,90,400,12,74,0</property>
+            <property name="gripper">0</property>
+            <property name="hidden">0</property>
+            <property name="id">wxID_ANY</property>
+            <property name="label">Footprint:</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_title</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="false">
+          <property name="border">5</property>
+          <property name="flag">wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND</property>
+          <property name="proportion">0</property>
+          <object class="wxTextCtrl" expanded="false">
+            <property name="BottomDockable">1</property>
+            <property name="LeftDockable">1</property>
+            <property name="RightDockable">1</property>
+            <property name="TopDockable">1</property>
+            <property name="aui_layer">0</property>
+            <property name="aui_name"></property>
+            <property name="aui_position">0</property>
+            <property name="aui_row">0</property>
+            <property name="best_size"></property>
+            <property name="bg"></property>
+            <property name="caption"></property>
+            <property name="caption_visible">1</property>
+            <property name="center_pane">0</property>
+            <property name="close_button">1</property>
+            <property name="context_help"></property>
+            <property name="context_menu">1</property>
+            <property name="default_pane">0</property>
+            <property name="dock">Dock</property>
+            <property name="dock_fixed">0</property>
+            <property name="docking">Left</property>
+            <property name="drag_accept_files">0</property>
+            <property name="enabled">1</property>
+            <property name="fg"></property>
+            <property name="floatable">1</property>
+            <property name="font"></property>
+            <property name="gripper">0</property>
+            <property name="hidden">0</property>
+            <property name="id">wxID_ANY</property>
+            <property name="max_size"></property>
+            <property name="maximize_button">0</property>
+            <property name="maximum_size"></property>
+            <property name="maxlength">0</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_footprint</property>
+            <property name="pane_border">1</property>
+            <property name="pane_position"></property>
+            <property name="pane_size"></property>
+            <property name="permission">protected</property>
+            <property name="pin_button">1</property>
+            <property name="pos"></property>
+            <property name="resize">Resizable</property>
+            <property name="show">1</property>
+            <property name="size"></property>
+            <property name="style"></property>
+            <property name="subclass">; ; forward_declare</property>
+            <property name="toolbar_pane">0</property>
+            <property name="tooltip"></property>
+            <property name="validator_data_type"></property>
+            <property name="validator_style">wxFILTER_NONE</property>
+            <property name="validator_type">wxDefaultValidator</property>
+            <property name="validator_variable"></property>
+            <property name="value"></property>
+            <property name="window_extra_style"></property>
+            <property name="window_name"></property>
+            <property name="window_style"></property>
+          </object>
+        </object>
+        <object class="sizeritem" expanded="false">
+          <property name="border">5</property>
+          <property name="flag">wxEXPAND</property>
+          <property name="proportion">1</property>
+          <object class="spacer" expanded="false">
+            <property name="height">0</property>
+            <property name="permission">protected</property>
+            <property name="width">10</property>
+          </object>
+        </object>
+        <object class="sizeritem" expanded="false">
+          <property name="border">5</property>
+          <property name="flag">wxALIGN_CENTER_VERTICAL|wxALL</property>
+          <property name="proportion">0</property>
+          <object class="wxBitmapButton" expanded="false">
+            <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="auth_needed">0</property>
+            <property name="best_size"></property>
+            <property name="bg"></property>
+            <property name="bitmap"></property>
+            <property name="caption"></property>
+            <property name="caption_visible">1</property>
+            <property name="center_pane">0</property>
+            <property name="close_button">1</property>
+            <property name="context_help"></property>
+            <property name="context_menu">1</property>
+            <property name="current"></property>
+            <property name="default">0</property>
+            <property name="default_pane">0</property>
+            <property name="disabled"></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="focus"></property>
+            <property name="font"></property>
+            <property name="gripper">0</property>
+            <property name="hidden">0</property>
+            <property name="id">wxID_ANY</property>
+            <property name="label">Delete match</property>
+            <property name="margins"></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_buttonShowLibrary</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="position"></property>
+            <property name="pressed"></property>
+            <property name="resize">Resizable</property>
+            <property name="show">1</property>
+            <property name="size"></property>
+            <property name="style"></property>
+            <property name="subclass">STD_BITMAP_BUTTON; widgets/std_bitmap_button.h; 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="OnButtonClick">OnShowLibraryClick</event>
+          </object>
+        </object>
+        <object class="sizeritem" expanded="false">
+          <property name="border">5</property>
+          <property name="flag">wxEXPAND</property>
+          <property name="proportion">1</property>
+          <object class="spacer" expanded="false">
+            <property name="height">0</property>
+            <property name="permission">protected</property>
+            <property name="width">10</property>
+          </object>
+        </object>
+        <object class="sizeritem" expanded="false">
+          <property name="border">5</property>
+          <property name="flag">wxALIGN_CENTER_VERTICAL|wxALL</property>
+          <property name="proportion">0</property>
+          <object class="wxBitmapButton" expanded="false">
+            <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="auth_needed">0</property>
+            <property name="best_size"></property>
+            <property name="bg"></property>
+            <property name="bitmap"></property>
+            <property name="caption"></property>
+            <property name="caption_visible">1</property>
+            <property name="center_pane">0</property>
+            <property name="close_button">1</property>
+            <property name="context_help"></property>
+            <property name="context_menu">1</property>
+            <property name="current"></property>
+            <property name="default">0</property>
+            <property name="default_pane">0</property>
+            <property name="disabled"></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="focus"></property>
+            <property name="font"></property>
+            <property name="gripper">0</property>
+            <property name="hidden">0</property>
+            <property name="id">wxID_ANY</property>
+            <property name="label">Delete match</property>
+            <property name="margins"></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_buttonDeleteMatch</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="position"></property>
+            <property name="pressed"></property>
+            <property name="resize">Resizable</property>
+            <property name="show">1</property>
+            <property name="size"></property>
+            <property name="style"></property>
+            <property name="subclass">STD_BITMAP_BUTTON; widgets/std_bitmap_button.h; 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="OnButtonClick">OnDeleteConditionClick</event>
+          </object>
+        </object>
+      </object>
+    </object>
+    <object class="Panel" expanded="true">
+      <property name="aui_managed">0</property>
+      <property name="aui_manager_style">wxAUI_MGR_DEFAULT</property>
+      <property name="bg">wxSYS_COLOUR_3DLIGHT</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_COMPONENT_CLASS_CONDITION_FIELD_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">wxBORDER_SUNKEN|wxTAB_TRAVERSAL</property>
+      <object class="wxFlexGridSizer" expanded="true">
+        <property name="cols">7</property>
+        <property name="flexible_direction">wxBOTH</property>
+        <property name="growablecols">1,4</property>
+        <property name="growablerows"></property>
+        <property name="hgap">0</property>
+        <property name="minimum_size"></property>
+        <property name="name">m_conditionSizer</property>
+        <property name="non_flexible_grow_mode">wxFLEX_GROWMODE_SPECIFIED</property>
+        <property name="permission">none</property>
+        <property name="rows">0</property>
+        <property name="vgap">0</property>
+        <object class="sizeritem" expanded="false">
+          <property name="border">5</property>
+          <property name="flag">wxALIGN_CENTER_VERTICAL|wxALL</property>
+          <property name="proportion">0</property>
+          <object class="wxStaticText" expanded="false">
+            <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">Helvetica,90,400,12,74,0</property>
+            <property name="gripper">0</property>
+            <property name="hidden">0</property>
+            <property name="id">wxID_ANY</property>
+            <property name="label">Footprint Field:</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_title</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="false">
+          <property name="border">5</property>
+          <property name="flag">wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND</property>
+          <property name="proportion">0</property>
+          <object class="wxComboBox" expanded="false">
+            <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">Helvetica,90,400,12,74,0</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_fieldName</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">-1</property>
+            <property name="show">1</property>
+            <property name="size"></property>
+            <property name="style"></property>
+            <property name="subclass">; ; forward_declare</property>
+            <property name="toolbar_pane">0</property>
+            <property name="tooltip"></property>
+            <property name="validator_data_type"></property>
+            <property name="validator_style">wxFILTER_NONE</property>
+            <property name="validator_type">wxDefaultValidator</property>
+            <property name="validator_variable"></property>
+            <property name="value"></property>
+            <property name="window_extra_style"></property>
+            <property name="window_name"></property>
+            <property name="window_style"></property>
+          </object>
+        </object>
+        <object class="sizeritem" expanded="false">
+          <property name="border">5</property>
+          <property name="flag">wxEXPAND</property>
+          <property name="proportion">1</property>
+          <object class="spacer" expanded="false">
+            <property name="height">0</property>
+            <property name="permission">protected</property>
+            <property name="width">10</property>
+          </object>
+        </object>
+        <object class="sizeritem" expanded="false">
+          <property name="border">5</property>
+          <property name="flag">wxALIGN_CENTER_VERTICAL|wxALL</property>
+          <property name="proportion">0</property>
+          <object class="wxStaticText" expanded="false">
+            <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">Helvetica,90,400,12,74,0</property>
+            <property name="gripper">0</property>
+            <property name="hidden">0</property>
+            <property name="id">wxID_ANY</property>
+            <property name="label">Field Value:</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_staticText44</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="false">
+          <property name="border">5</property>
+          <property name="flag">wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND</property>
+          <property name="proportion">0</property>
+          <object class="wxTextCtrl" expanded="false">
+            <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">Helvetica,90,400,12,74,0</property>
+            <property name="gripper">0</property>
+            <property name="hidden">0</property>
+            <property name="id">wxID_ANY</property>
+            <property name="max_size"></property>
+            <property name="maximize_button">0</property>
+            <property name="maximum_size"></property>
+            <property name="maxlength">0</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_fieldValue</property>
+            <property name="pane_border">1</property>
+            <property name="pane_position"></property>
+            <property name="pane_size"></property>
+            <property name="permission">protected</property>
+            <property name="pin_button">1</property>
+            <property name="pos"></property>
+            <property name="resize">Resizable</property>
+            <property name="show">1</property>
+            <property name="size"></property>
+            <property name="style"></property>
+            <property name="subclass">; ; forward_declare</property>
+            <property name="toolbar_pane">0</property>
+            <property name="tooltip"></property>
+            <property name="validator_data_type"></property>
+            <property name="validator_style">wxFILTER_NONE</property>
+            <property name="validator_type">wxDefaultValidator</property>
+            <property name="validator_variable"></property>
+            <property name="value"></property>
+            <property name="window_extra_style"></property>
+            <property name="window_name"></property>
+            <property name="window_style"></property>
+          </object>
+        </object>
+        <object class="sizeritem" expanded="false">
+          <property name="border">5</property>
+          <property name="flag">wxEXPAND</property>
+          <property name="proportion">1</property>
+          <object class="spacer" expanded="false">
+            <property name="height">0</property>
+            <property name="permission">protected</property>
+            <property name="width">10</property>
+          </object>
+        </object>
+        <object class="sizeritem" expanded="false">
+          <property name="border">5</property>
+          <property name="flag">wxALIGN_CENTER_VERTICAL|wxALL</property>
+          <property name="proportion">0</property>
+          <object class="wxBitmapButton" expanded="false">
+            <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="auth_needed">0</property>
+            <property name="best_size"></property>
+            <property name="bg"></property>
+            <property name="bitmap"></property>
+            <property name="caption"></property>
+            <property name="caption_visible">1</property>
+            <property name="center_pane">0</property>
+            <property name="close_button">1</property>
+            <property name="context_help"></property>
+            <property name="context_menu">1</property>
+            <property name="current"></property>
+            <property name="default">0</property>
+            <property name="default_pane">0</property>
+            <property name="disabled"></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="focus"></property>
+            <property name="font"></property>
+            <property name="gripper">0</property>
+            <property name="hidden">0</property>
+            <property name="id">wxID_ANY</property>
+            <property name="label">Delete match</property>
+            <property name="margins"></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_buttonDeleteMatch</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="position"></property>
+            <property name="pressed"></property>
+            <property name="resize">Resizable</property>
+            <property name="show">1</property>
+            <property name="size"></property>
+            <property name="style"></property>
+            <property name="subclass">STD_BITMAP_BUTTON; widgets/std_bitmap_button.h; 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="OnButtonClick">OnDeleteConditionClick</event>
+          </object>
+        </object>
+      </object>
+    </object>
+    <object class="Panel" expanded="true">
+      <property name="aui_managed">0</property>
+      <property name="aui_manager_style">wxAUI_MGR_DEFAULT</property>
+      <property name="bg">wxSYS_COLOUR_3DLIGHT</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_COMPONENT_CLASS_CONDITION_CUSTOM_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">wxBORDER_SUNKEN|wxTAB_TRAVERSAL</property>
+      <object class="wxFlexGridSizer" expanded="true">
+        <property name="cols">4</property>
+        <property name="flexible_direction">wxBOTH</property>
+        <property name="growablecols">1</property>
+        <property name="growablerows"></property>
+        <property name="hgap">0</property>
+        <property name="minimum_size"></property>
+        <property name="name">m_conditionSizer</property>
+        <property name="non_flexible_grow_mode">wxFLEX_GROWMODE_SPECIFIED</property>
+        <property name="permission">none</property>
+        <property name="rows">0</property>
+        <property name="vgap">0</property>
+        <object class="sizeritem" expanded="true">
+          <property name="border">5</property>
+          <property name="flag">wxALIGN_CENTER_VERTICAL|wxALL</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">Helvetica,90,400,12,74,0</property>
+            <property name="gripper">0</property>
+            <property name="hidden">0</property>
+            <property name="id">wxID_ANY</property>
+            <property name="label">Custom:</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_title</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">wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND</property>
+          <property name="proportion">0</property>
+          <object class="wxTextCtrl" expanded="true">
+            <property name="BottomDockable">1</property>
+            <property name="LeftDockable">1</property>
+            <property name="RightDockable">1</property>
+            <property name="TopDockable">1</property>
+            <property name="aui_layer">0</property>
+            <property name="aui_name"></property>
+            <property name="aui_position">0</property>
+            <property name="aui_row">0</property>
+            <property name="best_size"></property>
+            <property name="bg"></property>
+            <property name="caption"></property>
+            <property name="caption_visible">1</property>
+            <property name="center_pane">0</property>
+            <property name="close_button">1</property>
+            <property name="context_help"></property>
+            <property name="context_menu">1</property>
+            <property name="default_pane">0</property>
+            <property name="dock">Dock</property>
+            <property name="dock_fixed">0</property>
+            <property name="docking">Left</property>
+            <property name="drag_accept_files">0</property>
+            <property name="enabled">1</property>
+            <property name="fg"></property>
+            <property name="floatable">1</property>
+            <property name="font"></property>
+            <property name="gripper">0</property>
+            <property name="hidden">0</property>
+            <property name="id">wxID_ANY</property>
+            <property name="max_size"></property>
+            <property name="maximize_button">0</property>
+            <property name="maximum_size"></property>
+            <property name="maxlength">0</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_customCondition</property>
+            <property name="pane_border">1</property>
+            <property name="pane_position"></property>
+            <property name="pane_size"></property>
+            <property name="permission">protected</property>
+            <property name="pin_button">1</property>
+            <property name="pos"></property>
+            <property name="resize">Resizable</property>
+            <property name="show">1</property>
+            <property name="size"></property>
+            <property name="style"></property>
+            <property name="subclass">; ; forward_declare</property>
+            <property name="toolbar_pane">0</property>
+            <property name="tooltip"></property>
+            <property name="validator_data_type"></property>
+            <property name="validator_style">wxFILTER_NONE</property>
+            <property name="validator_type">wxDefaultValidator</property>
+            <property name="validator_variable"></property>
+            <property name="value"></property>
+            <property name="window_extra_style"></property>
+            <property name="window_name"></property>
+            <property name="window_style"></property>
+          </object>
+        </object>
+        <object class="sizeritem" expanded="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">10</property>
+          </object>
+        </object>
+        <object class="sizeritem" expanded="true">
+          <property name="border">5</property>
+          <property name="flag">wxALIGN_CENTER_VERTICAL|wxALL</property>
+          <property name="proportion">0</property>
+          <object class="wxBitmapButton" 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="auth_needed">0</property>
+            <property name="best_size"></property>
+            <property name="bg"></property>
+            <property name="bitmap"></property>
+            <property name="caption"></property>
+            <property name="caption_visible">1</property>
+            <property name="center_pane">0</property>
+            <property name="close_button">1</property>
+            <property name="context_help"></property>
+            <property name="context_menu">1</property>
+            <property name="current"></property>
+            <property name="default">0</property>
+            <property name="default_pane">0</property>
+            <property name="disabled"></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="focus"></property>
+            <property name="font"></property>
+            <property name="gripper">0</property>
+            <property name="hidden">0</property>
+            <property name="id">wxID_ANY</property>
+            <property name="label">Delete match</property>
+            <property name="margins"></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_buttonDeleteMatch</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="position"></property>
+            <property name="pressed"></property>
+            <property name="resize">Resizable</property>
+            <property name="show">1</property>
+            <property name="size"></property>
+            <property name="style"></property>
+            <property name="subclass">STD_BITMAP_BUTTON; widgets/std_bitmap_button.h; 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="OnButtonClick">OnDeleteConditionClick</event>
+          </object>
+        </object>
+      </object>
+    </object>
+    <object class="Panel" expanded="true">
+      <property name="aui_managed">0</property>
+      <property name="aui_manager_style">wxAUI_MGR_DEFAULT</property>
+      <property name="bg">wxSYS_COLOUR_3DLIGHT</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_COMPONENT_CLASS_SHEET_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">wxBORDER_SUNKEN|wxTAB_TRAVERSAL</property>
+      <object class="wxFlexGridSizer" expanded="true">
+        <property name="cols">4</property>
+        <property name="flexible_direction">wxBOTH</property>
+        <property name="growablecols">1</property>
+        <property name="growablerows"></property>
+        <property name="hgap">0</property>
+        <property name="minimum_size"></property>
+        <property name="name">m_conditionSizer</property>
+        <property name="non_flexible_grow_mode">wxFLEX_GROWMODE_SPECIFIED</property>
+        <property name="permission">none</property>
+        <property name="rows">0</property>
+        <property name="vgap">0</property>
+        <object class="sizeritem" expanded="true">
+          <property name="border">5</property>
+          <property name="flag">wxALIGN_CENTER_VERTICAL|wxALL</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">Helvetica,90,400,12,74,0</property>
+            <property name="gripper">0</property>
+            <property name="hidden">0</property>
+            <property name="id">wxID_ANY</property>
+            <property name="label">Sheet Name:</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_title</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">wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND</property>
+          <property name="proportion">0</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_sheetName</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">-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 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">10</property>
+          </object>
+        </object>
+        <object class="sizeritem" expanded="true">
+          <property name="border">5</property>
+          <property name="flag">wxALIGN_CENTER_VERTICAL|wxALL</property>
+          <property name="proportion">0</property>
+          <object class="wxBitmapButton" 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="auth_needed">0</property>
+            <property name="best_size"></property>
+            <property name="bg"></property>
+            <property name="bitmap"></property>
+            <property name="caption"></property>
+            <property name="caption_visible">1</property>
+            <property name="center_pane">0</property>
+            <property name="close_button">1</property>
+            <property name="context_help"></property>
+            <property name="context_menu">1</property>
+            <property name="current"></property>
+            <property name="default">0</property>
+            <property name="default_pane">0</property>
+            <property name="disabled"></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="focus"></property>
+            <property name="font"></property>
+            <property name="gripper">0</property>
+            <property name="hidden">0</property>
+            <property name="id">wxID_ANY</property>
+            <property name="label">Delete match</property>
+            <property name="margins"></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_buttonDeleteMatch</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="position"></property>
+            <property name="pressed"></property>
+            <property name="resize">Resizable</property>
+            <property name="show">1</property>
+            <property name="size"></property>
+            <property name="style"></property>
+            <property name="subclass">STD_BITMAP_BUTTON; widgets/std_bitmap_button.h; 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="OnButtonClick">OnDeleteConditionClick</event>
+          </object>
+        </object>
+      </object>
+    </object>
+  </object>
+</wxFormBuilder_Project>
diff --git a/pcbnew/dialogs/panel_assign_component_classes_base.h b/pcbnew/dialogs/panel_assign_component_classes_base.h
new file mode 100644
index 0000000000..3a8797bc57
--- /dev/null
+++ b/pcbnew/dialogs/panel_assign_component_classes_base.h
@@ -0,0 +1,269 @@
+///////////////////////////////////////////////////////////////////////////
+// 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>
+class STD_BITMAP_BUTTON;
+
+#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/statline.h>
+#include <wx/stattext.h>
+#include <wx/button.h>
+#include <wx/bitmap.h>
+#include <wx/image.h>
+#include <wx/icon.h>
+#include <wx/sizer.h>
+#include <wx/scrolwin.h>
+#include <wx/panel.h>
+#include <wx/textctrl.h>
+#include <wx/bmpbuttn.h>
+#include <wx/radiobut.h>
+#include <wx/statbox.h>
+#include <wx/combobox.h>
+
+///////////////////////////////////////////////////////////////////////////
+
+///////////////////////////////////////////////////////////////////////////////
+/// Class PANEL_ASSIGN_COMPONENT_CLASSES_BASE
+///////////////////////////////////////////////////////////////////////////////
+class PANEL_ASSIGN_COMPONENT_CLASSES_BASE : public wxPanel
+{
+	private:
+
+	protected:
+		wxCheckBox* m_assignSheetClasses;
+		wxStaticLine* m_staticline1;
+		wxStaticText* m_staticText3;
+		wxButton* m_btnAddAssignment;
+		wxScrolledWindow* m_assignmentsScrollWindow;
+
+		// Virtual event handlers, override them in your derived class
+		virtual void OnAddAssignmentClick( wxCommandEvent& event ) { event.Skip(); }
+
+
+	public:
+
+		PANEL_ASSIGN_COMPONENT_CLASSES_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_ASSIGN_COMPONENT_CLASSES_BASE();
+
+};
+
+///////////////////////////////////////////////////////////////////////////////
+/// Class PANEL_COMPONENT_CLASS_ASSIGNMENT_BASE
+///////////////////////////////////////////////////////////////////////////////
+class PANEL_COMPONENT_CLASS_ASSIGNMENT_BASE : public wxPanel
+{
+	private:
+
+	protected:
+		wxStaticText* m_staticText101;
+		wxTextCtrl* m_componentClass;
+		STD_BITMAP_BUTTON* m_buttonHighlightItems;
+		STD_BITMAP_BUTTON* m_buttonDeleteAssignment;
+		STD_BITMAP_BUTTON* m_buttonAddCondition;
+		wxRadioButton* m_radioAll;
+		wxRadioButton* m_radioAny;
+
+		// Virtual event handlers, override them in your derived class
+		virtual void OnHighlightItemsClick( wxCommandEvent& event ) { event.Skip(); }
+		virtual void OnDeleteAssignmentClick( wxCommandEvent& event ) { event.Skip(); }
+		virtual void OnAddConditionClick( wxCommandEvent& event ) { event.Skip(); }
+
+
+	public:
+
+		PANEL_COMPONENT_CLASS_ASSIGNMENT_BASE( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxBORDER_SUNKEN|wxTAB_TRAVERSAL, const wxString& name = wxEmptyString );
+
+		~PANEL_COMPONENT_CLASS_ASSIGNMENT_BASE();
+
+};
+
+///////////////////////////////////////////////////////////////////////////////
+/// Class PANEL_COMPONENT_CLASS_CONDITION_REFERENCE_BASE
+///////////////////////////////////////////////////////////////////////////////
+class PANEL_COMPONENT_CLASS_CONDITION_REFERENCE_BASE : public wxPanel
+{
+	private:
+
+	protected:
+		wxStaticText* m_title;
+		wxTextCtrl* m_refs;
+		STD_BITMAP_BUTTON* m_buttonImportRefs;
+		STD_BITMAP_BUTTON* m_buttonDeleteMatch;
+
+		// Virtual event handlers, override them in your derived class
+		virtual void OnReferenceRightDown( wxMouseEvent& event ) { event.Skip(); }
+		virtual void OnImportRefsClick( wxCommandEvent& event ) { event.Skip(); }
+		virtual void OnDeleteConditionClick( wxCommandEvent& event ) { event.Skip(); }
+
+
+	public:
+
+		PANEL_COMPONENT_CLASS_CONDITION_REFERENCE_BASE( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxBORDER_SUNKEN|wxTAB_TRAVERSAL, const wxString& name = wxEmptyString );
+
+		~PANEL_COMPONENT_CLASS_CONDITION_REFERENCE_BASE();
+
+};
+
+///////////////////////////////////////////////////////////////////////////////
+/// Class PANEL_COMPONENT_CLASS_CONDITION_SIDE_BASE
+///////////////////////////////////////////////////////////////////////////////
+class PANEL_COMPONENT_CLASS_CONDITION_SIDE_BASE : public wxPanel
+{
+	private:
+
+	protected:
+		wxStaticText* m_title;
+		wxComboBox* m_side;
+		STD_BITMAP_BUTTON* m_buttonDeleteMatch;
+
+		// Virtual event handlers, override them in your derived class
+		virtual void OnDeleteConditionClick( wxCommandEvent& event ) { event.Skip(); }
+
+
+	public:
+
+		PANEL_COMPONENT_CLASS_CONDITION_SIDE_BASE( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxBORDER_SUNKEN|wxTAB_TRAVERSAL, const wxString& name = wxEmptyString );
+
+		~PANEL_COMPONENT_CLASS_CONDITION_SIDE_BASE();
+
+};
+
+///////////////////////////////////////////////////////////////////////////////
+/// Class PANEL_COMPONENT_CLASS_CONDITION_ROTATION_BASE
+///////////////////////////////////////////////////////////////////////////////
+class PANEL_COMPONENT_CLASS_CONDITION_ROTATION_BASE : public wxPanel
+{
+	private:
+
+	protected:
+		wxStaticText* m_title;
+		wxComboBox* m_rotation;
+		wxStaticText* m_rotUnit;
+		STD_BITMAP_BUTTON* m_buttonDeleteMatch;
+
+		// Virtual event handlers, override them in your derived class
+		virtual void OnDeleteConditionClick( wxCommandEvent& event ) { event.Skip(); }
+
+
+	public:
+
+		PANEL_COMPONENT_CLASS_CONDITION_ROTATION_BASE( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 303,65 ), long style = wxBORDER_SUNKEN|wxTAB_TRAVERSAL, const wxString& name = wxEmptyString );
+
+		~PANEL_COMPONENT_CLASS_CONDITION_ROTATION_BASE();
+
+};
+
+///////////////////////////////////////////////////////////////////////////////
+/// Class PANEL_COMPONENT_CLASS_CONDITION_FOOTPRINT_BASE
+///////////////////////////////////////////////////////////////////////////////
+class PANEL_COMPONENT_CLASS_CONDITION_FOOTPRINT_BASE : public wxPanel
+{
+	private:
+
+	protected:
+		wxStaticText* m_title;
+		wxTextCtrl* m_footprint;
+		STD_BITMAP_BUTTON* m_buttonShowLibrary;
+		STD_BITMAP_BUTTON* m_buttonDeleteMatch;
+
+		// Virtual event handlers, override them in your derived class
+		virtual void OnShowLibraryClick( wxCommandEvent& event ) { event.Skip(); }
+		virtual void OnDeleteConditionClick( wxCommandEvent& event ) { event.Skip(); }
+
+
+	public:
+
+		PANEL_COMPONENT_CLASS_CONDITION_FOOTPRINT_BASE( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxBORDER_SUNKEN|wxTAB_TRAVERSAL, const wxString& name = wxEmptyString );
+
+		~PANEL_COMPONENT_CLASS_CONDITION_FOOTPRINT_BASE();
+
+};
+
+///////////////////////////////////////////////////////////////////////////////
+/// Class PANEL_COMPONENT_CLASS_CONDITION_FIELD_BASE
+///////////////////////////////////////////////////////////////////////////////
+class PANEL_COMPONENT_CLASS_CONDITION_FIELD_BASE : public wxPanel
+{
+	private:
+
+	protected:
+		wxStaticText* m_title;
+		wxComboBox* m_fieldName;
+		wxStaticText* m_staticText44;
+		wxTextCtrl* m_fieldValue;
+		STD_BITMAP_BUTTON* m_buttonDeleteMatch;
+
+		// Virtual event handlers, override them in your derived class
+		virtual void OnDeleteConditionClick( wxCommandEvent& event ) { event.Skip(); }
+
+
+	public:
+
+		PANEL_COMPONENT_CLASS_CONDITION_FIELD_BASE( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxBORDER_SUNKEN|wxTAB_TRAVERSAL, const wxString& name = wxEmptyString );
+
+		~PANEL_COMPONENT_CLASS_CONDITION_FIELD_BASE();
+
+};
+
+///////////////////////////////////////////////////////////////////////////////
+/// Class PANEL_COMPONENT_CLASS_CONDITION_CUSTOM_BASE
+///////////////////////////////////////////////////////////////////////////////
+class PANEL_COMPONENT_CLASS_CONDITION_CUSTOM_BASE : public wxPanel
+{
+	private:
+
+	protected:
+		wxStaticText* m_title;
+		wxTextCtrl* m_customCondition;
+		STD_BITMAP_BUTTON* m_buttonDeleteMatch;
+
+		// Virtual event handlers, override them in your derived class
+		virtual void OnDeleteConditionClick( wxCommandEvent& event ) { event.Skip(); }
+
+
+	public:
+
+		PANEL_COMPONENT_CLASS_CONDITION_CUSTOM_BASE( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxBORDER_SUNKEN|wxTAB_TRAVERSAL, const wxString& name = wxEmptyString );
+
+		~PANEL_COMPONENT_CLASS_CONDITION_CUSTOM_BASE();
+
+};
+
+///////////////////////////////////////////////////////////////////////////////
+/// Class PANEL_COMPONENT_CLASS_CONDITION_SHEET_BASE
+///////////////////////////////////////////////////////////////////////////////
+class PANEL_COMPONENT_CLASS_CONDITION_SHEET_BASE : public wxPanel
+{
+	private:
+
+	protected:
+		wxStaticText* m_title;
+		wxComboBox* m_sheetName;
+		STD_BITMAP_BUTTON* m_buttonDeleteMatch;
+
+		// Virtual event handlers, override them in your derived class
+		virtual void OnDeleteConditionClick( wxCommandEvent& event ) { event.Skip(); }
+
+
+	public:
+
+		PANEL_COMPONENT_CLASS_CONDITION_SHEET_BASE( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxBORDER_SUNKEN|wxTAB_TRAVERSAL, const wxString& name = wxEmptyString );
+
+		~PANEL_COMPONENT_CLASS_CONDITION_SHEET_BASE();
+
+};
+
diff --git a/pcbnew/drc/drc_engine.cpp b/pcbnew/drc/drc_engine.cpp
index b0b38c5ff5..d060529b21 100644
--- a/pcbnew/drc/drc_engine.cpp
+++ b/pcbnew/drc/drc_engine.cpp
@@ -632,6 +632,9 @@ void DRC_ENGINE::RunTests( EDA_UNITS aUnits, bool aReportAllTrackErrors, bool aT
     if( !cacheGenerator.Run() )         // ... and regenerate them.
         return;
 
+    // Recompute component classes
+    m_board->GetComponentClassManager().ForceComponentClassRecalculation();
+
     int timestamp = m_board->GetTimeStamp();
 
     for( DRC_TEST_PROVIDER* provider : m_testProviders )
diff --git a/pcbnew/drc/drc_rule_parser.cpp b/pcbnew/drc/drc_rule_parser.cpp
index 1de945a1d2..7169b9536d 100644
--- a/pcbnew/drc/drc_rule_parser.cpp
+++ b/pcbnew/drc/drc_rule_parser.cpp
@@ -29,6 +29,7 @@
 #include <drc_rules_lexer.h>
 #include <pcbexpr_evaluator.h>
 #include <reporter.h>
+#include <component_classes/component_class_assignment_rule.h>
 
 using namespace DRCRULE_T;
 
@@ -182,6 +183,81 @@ void DRC_RULES_PARSER::Parse( std::vector<std::shared_ptr<DRC_RULE>>& aRules, RE
 }
 
 
+void DRC_RULES_PARSER::ParseComponentClassAssignmentRules(
+        std::vector<std::shared_ptr<COMPONENT_CLASS_ASSIGNMENT_RULE>>& aRules, REPORTER* aReporter )
+{
+    bool     haveVersion = false;
+    wxString msg;
+
+    m_reporter = aReporter;
+
+    for( T token = NextTok(); token != T_EOF; token = NextTok() )
+    {
+        if( token != T_LEFT )
+            reportError( _( "Missing '('." ) );
+
+        token = NextTok();
+
+        if( !haveVersion && token != T_version )
+        {
+            reportError( _( "Missing version statement." ) );
+            haveVersion = true; // don't keep on reporting it
+        }
+
+        switch( token )
+        {
+        case T_version:
+            haveVersion = true;
+            token = NextTok();
+
+            if( (int) token == DSN_RIGHT )
+            {
+                reportError( _( "Missing version number." ) );
+                break;
+            }
+
+            if( (int) token == DSN_NUMBER )
+            {
+                m_requiredVersion = (int) strtol( CurText(), nullptr, 10 );
+                m_tooRecent = ( m_requiredVersion > DRC_RULE_FILE_VERSION );
+                token = NextTok();
+            }
+            else
+            {
+                msg.Printf( _( "Unrecognized item '%s'.| Expected version number." ), FromUTF8() );
+                reportError( msg );
+            }
+
+            if( (int) token != DSN_RIGHT )
+            {
+                msg.Printf( _( "Unrecognized item '%s'." ), FromUTF8() );
+                reportError( msg );
+                parseUnknown();
+            }
+
+            break;
+
+        case T_assign_component_class:
+            aRules.emplace_back( parseComponentClassAssignment() );
+            break;
+
+        case T_EOF: reportError( _( "Incomplete statement." ) ); break;
+
+        default:
+            msg.Printf( _( "Unrecognized item '%s'.| Expected %s." ), FromUTF8(),
+                        wxT( "assign_component_class or version" ) );
+            reportError( msg );
+            parseUnknown();
+        }
+    }
+
+    if( m_reporter && !m_reporter->HasMessage() )
+        m_reporter->Report( _( "No errors found." ), RPT_SEVERITY_INFO );
+
+    m_reporter = nullptr;
+}
+
+
 std::shared_ptr<DRC_RULE> DRC_RULES_PARSER::parseDRC_RULE()
 {
     std::shared_ptr<DRC_RULE> rule = std::make_shared<DRC_RULE>();
@@ -266,6 +342,80 @@ std::shared_ptr<DRC_RULE> DRC_RULES_PARSER::parseDRC_RULE()
 }
 
 
+std::shared_ptr<COMPONENT_CLASS_ASSIGNMENT_RULE> DRC_RULES_PARSER::parseComponentClassAssignment()
+{
+    std::shared_ptr<DRC_RULE_CONDITION> condition;
+
+    T        token = NextTok();
+    wxString msg;
+
+    if( !IsSymbol( token ) )
+        reportError( _( "Missing component class name." ) );
+
+    wxString componentClass = FromUTF8();
+
+    for( token = NextTok(); token != T_RIGHT && token != T_EOF; token = NextTok() )
+    {
+        if( token != T_LEFT )
+            reportError( _( "Missing '('." ) );
+
+        token = NextTok();
+
+        switch( token )
+        {
+        case T_condition:
+            token = NextTok();
+
+            if( (int) token == DSN_RIGHT )
+            {
+                reportError( _( "Missing condition expression." ) );
+                break;
+            }
+
+            if( IsSymbol( token ) )
+            {
+                condition = std::make_shared<DRC_RULE_CONDITION>( FromUTF8() );
+
+                if( !condition->Compile( m_reporter, CurLineNumber(), CurOffset() ) )
+                {
+                    reportError( wxString::Format( _( "Could not parse expression '%s'." ),
+                                                   FromUTF8() ) );
+                }
+            }
+            else
+            {
+                msg.Printf( _( "Unrecognized item '%s'.| Expected quoted expression." ),
+                            FromUTF8() );
+                reportError( msg );
+            }
+
+            if( (int) NextTok() != DSN_RIGHT )
+            {
+                reportError( wxString::Format( _( "Unrecognized item '%s'." ), FromUTF8() ) );
+                parseUnknown();
+            }
+
+            break;
+
+        case T_EOF: reportError( _( "Incomplete statement." ) ); return nullptr;
+
+        default:
+            msg.Printf( _( "Unrecognized item '%s'.| Expected %s." ), FromUTF8(),
+                        wxT( "condition" ) );
+            reportError( msg );
+            parseUnknown();
+        }
+    }
+
+    if( (int) CurTok() != DSN_RIGHT )
+        reportError( _( "Missing ')'." ) );
+
+    return std::make_shared<COMPONENT_CLASS_ASSIGNMENT_RULE>( componentClass,
+                                                              std::move( condition ) );
+    ;
+}
+
+
 void DRC_RULES_PARSER::parseConstraint( DRC_RULE* aRule )
 {
     DRC_CONSTRAINT c;
diff --git a/pcbnew/drc/drc_rule_parser.h b/pcbnew/drc/drc_rule_parser.h
index c2c5d8d71a..294d5a801d 100644
--- a/pcbnew/drc/drc_rule_parser.h
+++ b/pcbnew/drc/drc_rule_parser.h
@@ -45,9 +45,15 @@ public:
 
     void Parse( std::vector<std::shared_ptr<DRC_RULE>>& aRules, REPORTER* aReporter );
 
+    void ParseComponentClassAssignmentRules(
+            std::vector<std::shared_ptr<COMPONENT_CLASS_ASSIGNMENT_RULE>>& aRules,
+            REPORTER*                                                      aReporter );
+
 private:
     std::shared_ptr<DRC_RULE> parseDRC_RULE();
 
+    std::shared_ptr<COMPONENT_CLASS_ASSIGNMENT_RULE> parseComponentClassAssignment();
+
     void parseConstraint( DRC_RULE* aRule );
     void parseValueWithUnits( const wxString& aExpr, int& aResult, bool aUnitless = false );
     LSET parseLayer();
diff --git a/pcbnew/files.cpp b/pcbnew/files.cpp
index 13cbcf16bf..bdab0e9bdc 100644
--- a/pcbnew/files.cpp
+++ b/pcbnew/files.cpp
@@ -807,6 +807,14 @@ bool PCB_EDIT_FRAME::OpenProjectFiles( const std::vector<wxString>& aFileSet, in
             loadedBoard->SetModified();
         }
 
+        if( !loadedBoard->SynchronizeComponentClasses( std::unordered_set<wxString>() ) )
+        {
+            m_infoBar->RemoveAllButtons();
+            m_infoBar->AddCloseButton();
+            m_infoBar->ShowMessage( _( "Could not load component class assignment rules" ),
+                                    wxICON_WARNING, WX_INFOBAR::MESSAGE_TYPE::GENERIC );
+        }
+
         // we should not ask PCB_IOs to do these items:
         loadedBoard->BuildListOfNets();
         ResolveDRCExclusions( true );
@@ -944,6 +952,9 @@ bool PCB_EDIT_FRAME::OpenProjectFiles( const std::vector<wxString>& aFileSet, in
     LoadProjectSettings();
     LoadDrawingSheet();
 
+    // Initialise caches used by component classes
+    GetBoard()->GetComponentClassManager().RebuildRequiredCaches();
+
     // Syncs the UI (appearance panel, etc) with the loaded board and project
     onBoardLoaded();
 
diff --git a/pcbnew/footprint.cpp b/pcbnew/footprint.cpp
index 0e8559352a..c9d4c90e25 100644
--- a/pcbnew/footprint.cpp
+++ b/pcbnew/footprint.cpp
@@ -33,6 +33,8 @@
 #include <confirm.h>
 #include <convert_basic_shapes_to_polygon.h>
 #include <convert_shape_list_to_polygon.h>
+#include <component_classes/component_class.h>
+#include <component_classes/component_class_cache_proxy.h>
 #include <drc/drc_item.h>
 #include <embedded_files.h>
 #include <font/font.h>
@@ -67,12 +69,10 @@
 
 
 FOOTPRINT::FOOTPRINT( BOARD* parent ) :
-        BOARD_ITEM_CONTAINER((BOARD_ITEM*) parent, PCB_FOOTPRINT_T ),
-        m_boundingBoxCacheTimeStamp( 0 ),
-        m_textExcludedBBoxCacheTimeStamp( 0 ),
-        m_hullCacheTimeStamp( 0 ),
-        m_initial_comments( nullptr ),
-        m_componentClass( nullptr )
+        BOARD_ITEM_CONTAINER( (BOARD_ITEM*) parent, PCB_FOOTPRINT_T ),
+        m_boundingBoxCacheTimeStamp( 0 ), m_textExcludedBBoxCacheTimeStamp( 0 ),
+        m_hullCacheTimeStamp( 0 ), m_initial_comments( nullptr ),
+        m_componentClassCacheProxy( std::make_unique<COMPONENT_CLASS_CACHE_PROXY>( this ) )
 {
     m_attributes   = 0;
     m_layer        = F_Cu;
@@ -104,8 +104,8 @@ FOOTPRINT::FOOTPRINT( BOARD* parent ) :
 
 
 FOOTPRINT::FOOTPRINT( const FOOTPRINT& aFootprint ) :
-    BOARD_ITEM_CONTAINER( aFootprint ),
-    EMBEDDED_FILES( aFootprint )
+        BOARD_ITEM_CONTAINER( aFootprint ), EMBEDDED_FILES( aFootprint ),
+        m_componentClassCacheProxy( std::make_unique<COMPONENT_CLASS_CACHE_PROXY>( this ) )
 {
     m_pos          = aFootprint.m_pos;
     m_fpid         = aFootprint.m_fpid;
@@ -132,8 +132,6 @@ FOOTPRINT::FOOTPRINT( const FOOTPRINT& aFootprint ) :
     m_netTiePadGroups                = aFootprint.m_netTiePadGroups;
     m_fileFormatVersionAtLoad        = aFootprint.m_fileFormatVersionAtLoad;
 
-    m_componentClass                 = aFootprint.m_componentClass;
-
     std::map<BOARD_ITEM*, BOARD_ITEM*> ptrMap;
 
     // Copy fields
@@ -754,8 +752,6 @@ FOOTPRINT& FOOTPRINT::operator=( FOOTPRINT&& aOther )
     m_zoneConnection                 = aOther.m_zoneConnection;
     m_netTiePadGroups                = aOther.m_netTiePadGroups;
 
-    m_componentClass                 = aOther.m_componentClass;
-
     // Move the fields
     for( PCB_FIELD* field : m_fields )
         delete field;
@@ -867,8 +863,6 @@ FOOTPRINT& FOOTPRINT::operator=( const FOOTPRINT& aOther )
     m_zoneConnection                 = aOther.m_zoneConnection;
     m_netTiePadGroups                = aOther.m_netTiePadGroups;
 
-    m_componentClass                 = aOther.m_componentClass;
-
     std::map<BOARD_ITEM*, BOARD_ITEM*> ptrMap;
 
     // Copy fields
@@ -1717,9 +1711,11 @@ void FOOTPRINT::GetMsgPanelInfo( EDA_DRAW_FRAME* aFrame, std::vector<MSG_PANEL_I
     aList.emplace_back( _( "Rotation" ), wxString::Format( wxT( "%.4g" ),
                                                            GetOrientation().AsDegrees() ) );
 
-    if( m_componentClass )
+    if( !m_componentClassCacheProxy->GetComponentClass()->IsEmpty() )
     {
-        aList.emplace_back( _( "Component Class" ), m_componentClass->GetName() );
+        aList.emplace_back(
+                _( "Component Class" ),
+                m_componentClassCacheProxy->GetComponentClass()->GetHumanReadableName() );
     }
 
     msg.Printf( _( "Footprint: %s" ), m_fpid.GetUniStringLibId() );
@@ -4042,11 +4038,35 @@ void FOOTPRINT::EmbedFonts()
 }
 
 
+void FOOTPRINT::SetStaticComponentClass( const COMPONENT_CLASS* aClass ) const
+{
+    m_componentClassCacheProxy->SetStaticComponentClass( aClass );
+}
+
+
+const COMPONENT_CLASS* FOOTPRINT::GetStaticComponentClass() const
+{
+    return m_componentClassCacheProxy->GetStaticComponentClass();
+}
+
+
+void FOOTPRINT::RecomputeComponentClass() const
+{
+    m_componentClassCacheProxy->RecomputeComponentClass();
+}
+
+
+const COMPONENT_CLASS* FOOTPRINT::GetComponentClass() const
+{
+    return m_componentClassCacheProxy->GetComponentClass();
+}
+
+
 wxString FOOTPRINT::GetComponentClassAsString() const
 {
-    if( m_componentClass )
+    if( !m_componentClassCacheProxy->GetComponentClass()->IsEmpty() )
     {
-        return m_componentClass->GetFullName();
+        return m_componentClassCacheProxy->GetComponentClass()->GetName();
     }
 
     return wxEmptyString;
@@ -4057,8 +4077,15 @@ void FOOTPRINT::ResolveComponentClassNames(
         BOARD* aBoard, const std::unordered_set<wxString>& aComponentClassNames )
 {
     const COMPONENT_CLASS* componentClass =
-            aBoard->GetComponentClassManager().GetEffectiveComponentClass( aComponentClassNames );
-    SetComponentClass( componentClass );
+            aBoard->GetComponentClassManager().GetEffectiveStaticComponentClass(
+                    aComponentClassNames );
+    SetStaticComponentClass( componentClass );
+}
+
+
+void FOOTPRINT::InvalidateComponentClassCache() const
+{
+    m_componentClassCacheProxy->InvalidateCache();
 }
 
 
diff --git a/pcbnew/footprint.h b/pcbnew/footprint.h
index b3db53906a..26bdea21d9 100644
--- a/pcbnew/footprint.h
+++ b/pcbnew/footprint.h
@@ -32,7 +32,7 @@
 #include <board_item_container.h>
 #include <board_item.h>
 #include <collectors.h>
-#include <component_class_manager.h>
+#include <component_classes/component_class_manager.h>
 #include <embedded_files.h>
 #include <layer_ids.h> // ALL_LAYERS definition.
 #include <lset.h>
@@ -54,6 +54,7 @@ class BOARD;
 class MSG_PANEL_ITEM;
 class SHAPE;
 class REPORTER;
+class COMPONENT_CLASS_CACHE_PROXY;
 
 namespace KIGFX {
 class VIEW;
@@ -984,7 +985,22 @@ public:
     double Similarity( const BOARD_ITEM& aOther ) const override;
 
     /// Sets the component class object pointer for this footprint
-    void SetComponentClass( const COMPONENT_CLASS* aClass ) { m_componentClass = aClass; }
+    void SetStaticComponentClass( const COMPONENT_CLASS* aClass ) const;
+
+    /// Returns the component class for this footprint
+    const COMPONENT_CLASS* GetStaticComponentClass() const;
+
+    /// Returns the component class for this footprint
+    const COMPONENT_CLASS* GetComponentClass() const;
+
+    /// Used for display in the properties panel
+    wxString GetComponentClassAsString() const;
+
+    /// Forces immediate recalculation of the component class for this footprint
+    void RecomputeComponentClass() const;
+
+    /// Forces deferred (on next access) recalculation of the component class for this footprint
+    void InvalidateComponentClassCache() const;
 
     /**
      * @brief Sets the transient component class names
@@ -1010,13 +1026,6 @@ public:
     void ResolveComponentClassNames( BOARD*                              aBoard,
                                      const std::unordered_set<wxString>& aComponentClassNames );
 
-    /// Returns the component class for this footprint
-    const COMPONENT_CLASS* GetComponentClass() const { return m_componentClass; }
-
-    /// Used for display in the properties panel
-    wxString GetComponentClassAsString() const;
-
-
     bool operator==( const BOARD_ITEM& aOther ) const override;
     bool operator==( const FOOTPRINT& aOther ) const;
 
@@ -1117,8 +1126,8 @@ private:
     mutable HASH_128   m_courtyard_cache_back_hash;
     mutable std::mutex m_courtyard_cache_mutex;
 
-    const COMPONENT_CLASS* m_componentClass;
     std::unordered_set<wxString> m_transientComponentClassNames;
+    std::unique_ptr<COMPONENT_CLASS_CACHE_PROXY> m_componentClassCacheProxy;
 };
 
 #endif     // FOOTPRINT_H
diff --git a/pcbnew/netlist_reader/board_netlist_updater.cpp b/pcbnew/netlist_reader/board_netlist_updater.cpp
index 9c3a84654d..0d7e8e1921 100644
--- a/pcbnew/netlist_reader/board_netlist_updater.cpp
+++ b/pcbnew/netlist_reader/board_netlist_updater.cpp
@@ -32,6 +32,7 @@
 #include <base_units.h>
 #include <board.h>
 #include <board_design_settings.h>
+#include <component_classes/component_class.h>
 #include <netinfo.h>
 #include <footprint.h>
 #include <pad.h>
@@ -157,7 +158,8 @@ FOOTPRINT* BOARD_NETLIST_UPDATER::addNewFootprint( COMPONENT* aComponent )
         return nullptr;
     }
 
-    footprint->SetComponentClass( m_board->GetComponentClassManager().GetNoneComponentClass() );
+    footprint->SetStaticComponentClass(
+            m_board->GetComponentClassManager().GetNoneComponentClass() );
 
     if( m_isDryRun )
     {
@@ -207,8 +209,8 @@ void BOARD_NETLIST_UPDATER::updateComponentClass( FOOTPRINT* aFootprint, COMPONE
     wxString         curClassName, newClassName;
     COMPONENT_CLASS* newClass = nullptr;
 
-    if( const COMPONENT_CLASS* curClass = aFootprint->GetComponentClass() )
-        curClassName = curClass->GetFullName();
+    if( const COMPONENT_CLASS* curClass = aFootprint->GetStaticComponentClass() )
+        curClassName = curClass->GetName();
 
     // Calculate the new component class
     if( m_isDryRun )
@@ -218,9 +220,9 @@ void BOARD_NETLIST_UPDATER::updateComponentClass( FOOTPRINT* aFootprint, COMPONE
     }
     else
     {
-        newClass = m_board->GetComponentClassManager().GetEffectiveComponentClass(
+        newClass = m_board->GetComponentClassManager().GetEffectiveStaticComponentClass(
                 aNewComponent->GetComponentClassNames() );
-        newClassName = newClass->GetFullName();
+        newClassName = newClass->GetName();
     }
 
     if( curClassName == newClassName )
@@ -254,7 +256,7 @@ void BOARD_NETLIST_UPDATER::updateComponentClass( FOOTPRINT* aFootprint, COMPONE
     {
         wxASSERT_MSG( newClass != nullptr, "Component class should not be nullptr" );
 
-        aFootprint->SetComponentClass( newClass );
+        aFootprint->SetStaticComponentClass( newClass );
 
         if( curClassName == wxEmptyString && newClassName != wxEmptyString )
         {
@@ -1214,6 +1216,7 @@ bool BOARD_NETLIST_UPDATER::UpdateNetlist( NETLIST& aNetlist )
     FOOTPRINT* lastPreexistingFootprint = nullptr;
     COMPONENT* component = nullptr;
     wxString   msg;
+    std::unordered_set<wxString> sheetPaths;
 
     m_errorCount = 0;
     m_warningCount = 0;
@@ -1294,6 +1297,8 @@ bool BOARD_NETLIST_UPDATER::UpdateNetlist( NETLIST& aNetlist )
                     updateFootprintParameters( tmp, component );
                     updateComponentPadConnections( tmp, component );
                     updateComponentClass( tmp, component );
+
+                    sheetPaths.insert( footprint->GetSheetname() );
                 }
 
                 matchCount++;
@@ -1317,6 +1322,8 @@ bool BOARD_NETLIST_UPDATER::UpdateNetlist( NETLIST& aNetlist )
                 updateFootprintParameters( footprint, component );
                 updateComponentPadConnections( footprint, component );
                 updateComponentClass( footprint, component );
+
+                sheetPaths.insert( footprint->GetSheetname() );
             }
         }
         else if( matchCount > 1 )
@@ -1403,6 +1410,7 @@ bool BOARD_NETLIST_UPDATER::UpdateNetlist( NETLIST& aNetlist )
     {
         // Finalise the component class manager
         m_board->GetComponentClassManager().FinishNetlistUpdate();
+        m_board->SynchronizeComponentClasses( sheetPaths );
 
         m_board->BuildConnectivity();
         testConnectivity( aNetlist, footprintMap );
diff --git a/pcbnew/netlist_reader/netlist.cpp b/pcbnew/netlist_reader/netlist.cpp
index 2a883f15be..34ec4d803e 100644
--- a/pcbnew/netlist_reader/netlist.cpp
+++ b/pcbnew/netlist_reader/netlist.cpp
@@ -90,9 +90,14 @@ void PCB_EDIT_FRAME::OnNetlistChanged( BOARD_NETLIST_UPDATER& aUpdater, bool* aR
 
     SetMsgPanel( board );
 
-    // Re-sync nets, netclasses, and DRC rules to account for new aggregate netclass rules
+    // Re-sync nets and  netclasses
     board->SynchronizeNetsAndNetClasses( false );
 
+    // Recompute component classes
+    board->GetComponentClassManager().InvalidateComponentClasses();
+    board->GetComponentClassManager().RebuildRequiredCaches();
+
+    // Resync DRC rules to account for new aggregate netclass / component class rules
     DRC_TOOL* drcTool = m_toolManager->GetTool<DRC_TOOL>();
 
     try
diff --git a/pcbnew/pcb_edit_frame.cpp b/pcbnew/pcb_edit_frame.cpp
index 1c07df8025..ca93f7b482 100644
--- a/pcbnew/pcb_edit_frame.cpp
+++ b/pcbnew/pcb_edit_frame.cpp
@@ -1353,6 +1353,15 @@ void PCB_EDIT_FRAME::ShowBoardSetupDialog( const wxString& aInitialPage )
     if( dlg.ShowQuasiModal() == wxID_OK )
     {
         GetBoard()->SynchronizeNetsAndNetClasses( true );
+
+        if( !GetBoard()->SynchronizeComponentClasses( std::unordered_set<wxString>() ) )
+        {
+            m_infoBar->RemoveAllButtons();
+            m_infoBar->AddCloseButton();
+            m_infoBar->ShowMessage( _( "Could not load component class assignment rules" ),
+                                    wxICON_WARNING, WX_INFOBAR::MESSAGE_TYPE::GENERIC );
+        }
+
         // We don't know if anything was modified, so err on the side of requiring a save
         OnModify();
 
@@ -2538,7 +2547,7 @@ void PCB_EDIT_FRAME::ExchangeFootprint( FOOTPRINT* aExisting, FOOTPRINT* aNew,
     aNew->SetSheetfile( aExisting->GetSheetfile() );
     aNew->SetSheetname( aExisting->GetSheetname() );
     aNew->SetFilters( aExisting->GetFilters() );
-    aNew->SetComponentClass( aExisting->GetComponentClass() );
+    aNew->SetStaticComponentClass( aExisting->GetComponentClass() );
 
     aCommit.Remove( aExisting );
     aCommit.Add( aNew );
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 d50415ff4d..1d8f699809 100644
--- a/pcbnew/pcb_io/kicad_sexpr/pcb_io_kicad_sexpr.cpp
+++ b/pcbnew/pcb_io/kicad_sexpr/pcb_io_kicad_sexpr.cpp
@@ -1201,14 +1201,14 @@ void PCB_IO_KICAD_SEXPR::format( const FOOTPRINT* aFootprint ) const
         m_out->Print( ")" );
     }
 
-    if( const COMPONENT_CLASS* compClass = aFootprint->GetComponentClass() )
+    if( const COMPONENT_CLASS* compClass = aFootprint->GetStaticComponentClass() )
     {
         if( !compClass->IsEmpty() )
         {
             m_out->Print( "(component_classes" );
 
             for( const COMPONENT_CLASS* constituent : compClass->GetConstituentClasses() )
-                m_out->Print( "(class %s)", m_out->Quotew( constituent->GetFullName() ).c_str() );
+                m_out->Print( "(class %s)", m_out->Quotew( constituent->GetName() ).c_str() );
 
             m_out->Print( ")" );
         }
diff --git a/pcbnew/pcb_io/kicad_sexpr/pcb_io_kicad_sexpr.h b/pcbnew/pcb_io/kicad_sexpr/pcb_io_kicad_sexpr.h
index 6ee2b78315..6479906d06 100644
--- a/pcbnew/pcb_io/kicad_sexpr/pcb_io_kicad_sexpr.h
+++ b/pcbnew/pcb_io/kicad_sexpr/pcb_io_kicad_sexpr.h
@@ -177,10 +177,10 @@ class PCB_IO_KICAD_SEXPR;   // forward decl
 //#define SEXPR_BOARD_FILE_VERSION    20241229  // Expand User layers to arbitrary count
 //----------------- Start of 10.0 development -----------------
 //#define SEXPR_BOARD_FILE_VERSION    20250210  // Knockout for textboxes
-//#define SEXPR_BOARD_FILE_VERSION      20250222  // Hatching for PCB shapes
-//#define SEXPR_BOARD_FILE_VERSION      20250228  // ipc-4761 via protection features
-#define SEXPR_BOARD_FILE_VERSION      20250302  // Zone Hatching Offsets
-
+//#define SEXPR_BOARD_FILE_VERSION    20250222  // Hatching for PCB shapes
+//#define SEXPR_BOARD_FILE_VERSION    20250228  // ipc-4761 via protection features
+//#define SEXPR_BOARD_FILE_VERSION    20250302  // Zone Hatching Offsets
+#define SEXPR_BOARD_FILE_VERSION      20250309  // Component class dynamic assignment rules
 
 #define BOARD_FILE_HOST_VERSION       20200825  ///< Earlier files than this include the host tag
 #define LEGACY_ARC_FORMATTING         20210925  ///< These were the last to use old arc formatting
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 84257246a2..6f51f0e227 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
@@ -4507,7 +4507,8 @@ FOOTPRINT* PCB_IO_KICAD_SEXPR_PARSER::parseFOOTPRINT_unchecked( wxArrayString* a
 
     if( m_board )
     {
-        footprint->SetComponentClass( m_board->GetComponentClassManager().GetNoneComponentClass() );
+        footprint->SetStaticComponentClass(
+                m_board->GetComponentClassManager().GetNoneComponentClass() );
     }
 
     token = NextTok();
diff --git a/pcbnew/pcbexpr_evaluator.cpp b/pcbnew/pcbexpr_evaluator.cpp
index c48a9d2629..9f987c7187 100644
--- a/pcbnew/pcbexpr_evaluator.cpp
+++ b/pcbnew/pcbexpr_evaluator.cpp
@@ -31,6 +31,7 @@
 #include <board_connected_item.h>
 #include <pcbexpr_evaluator.h>
 #include <drc/drc_engine.h>
+#include <component_classes/component_class.h>
 
 /* --------------------------------------------------------------------------------------------
  * Specialized Expression References
@@ -216,7 +217,7 @@ public:
             return LIBEVAL::VALUE::AsString();
 
         if( const COMPONENT_CLASS* compClass = m_item->GetComponentClass() )
-            const_cast<PCBEXPR_COMPONENT_CLASS_VALUE*>( this )->Set( compClass->GetFullName() );
+            const_cast<PCBEXPR_COMPONENT_CLASS_VALUE*>( this )->Set( compClass->GetName() );
 
         return LIBEVAL::VALUE::AsString();
     }
@@ -232,9 +233,7 @@ public:
             const COMPONENT_CLASS* aClass = m_item->GetComponentClass();
             const COMPONENT_CLASS* bClass = bValue->m_item->GetComponentClass();
 
-            // Note this depends on COMPONENT_CLASS_MANAGER maintaining ownership
-            // of all unique component class objects
-            return aClass == bClass;
+            return *aClass == *bClass;
         }
 
         if( b->GetType() == LIBEVAL::VT_STRING )
@@ -242,7 +241,7 @@ public:
             if( m_item->GetComponentClass()->ContainsClassName( b->AsString() ) )
                 return true;
 
-            return m_item->GetComponentClass()->GetFullName() == b->AsString();
+            return m_item->GetComponentClass()->GetName() == b->AsString();
         }
 
         return LIBEVAL::VALUE::EqualTo( aCtx, b );
@@ -259,16 +258,14 @@ public:
             const COMPONENT_CLASS* aClass = m_item->GetComponentClass();
             const COMPONENT_CLASS* bClass = bValue->m_item->GetComponentClass();
 
-            // Note this depends on COMPONENT_CLASS_MANAGER maintaining ownership
-            // of all unique component class objects
-            return aClass != bClass;
+            return *aClass != *bClass;
         }
 
         if( b->GetType() == LIBEVAL::VT_STRING )
         {
             const bool isInConstituents =
                     m_item->GetComponentClass()->ContainsClassName( b->AsString() );
-            const bool isFullName = m_item->GetComponentClass()->GetFullName() == b->AsString();
+            const bool isFullName = m_item->GetComponentClass()->GetName() == b->AsString();
 
             return !isInConstituents && !isFullName;
         }
diff --git a/pcbnew/pcbexpr_functions.cpp b/pcbnew/pcbexpr_functions.cpp
index 8ef7f64280..d6e3106995 100644
--- a/pcbnew/pcbexpr_functions.cpp
+++ b/pcbnew/pcbexpr_functions.cpp
@@ -28,6 +28,7 @@
 #include <wx/log.h>
 #include <board.h>
 #include <board_design_settings.h>
+#include <component_classes/component_class.h>
 #include <drc/drc_rtree.h>
 #include <drc/drc_engine.h>
 #include <lset.h>
diff --git a/pcbnew/tools/edit_tool.cpp b/pcbnew/tools/edit_tool.cpp
index f42b59fbea..18d6172f4f 100644
--- a/pcbnew/tools/edit_tool.cpp
+++ b/pcbnew/tools/edit_tool.cpp
@@ -2059,6 +2059,9 @@ int EDIT_TOOL::Rotate( const TOOL_EVENT& aEvent )
 
                 board_item->Rotate( refPt, rotateAngle );
                 board_item->Normalize();
+
+                if( board_item->Type() == PCB_FOOTPRINT_T )
+                    static_cast<FOOTPRINT*>( board_item )->InvalidateComponentClassCache();
             }
         }
 
@@ -2389,6 +2392,9 @@ int EDIT_TOOL::Flip( const TOOL_EVENT& aEvent )
 
         boardItem->Flip( refPt, flipDirection );
         boardItem->Normalize();
+
+        if( boardItem->Type() == PCB_FOOTPRINT_T )
+            static_cast<FOOTPRINT*>( boardItem )->InvalidateComponentClassCache();
     }
 
     if( !localCommit.Empty() )
diff --git a/pcbnew/tools/multichannel_tool.cpp b/pcbnew/tools/multichannel_tool.cpp
index e8561e41dc..3e60ba260b 100644
--- a/pcbnew/tools/multichannel_tool.cpp
+++ b/pcbnew/tools/multichannel_tool.cpp
@@ -36,6 +36,7 @@
 #include <geometry/convex_hull.h>
 #include <geometry/shape_utils.h>
 #include <pcb_group.h>
+#include <component_classes/component_class.h>
 #include <connectivity/connectivity_data.h>
 #include <connectivity/topo_match.h>
 #include <optional>
diff --git a/pcbnew/undo_redo.cpp b/pcbnew/undo_redo.cpp
index 347bcd31e9..c89b13c49d 100644
--- a/pcbnew/undo_redo.cpp
+++ b/pcbnew/undo_redo.cpp
@@ -569,6 +569,13 @@ void PCB_BASE_EDIT_FRAME::PutDataInPreviousState( PICKED_ITEMS_LIST* aList )
                                           aList->GetPickedItemStatus( ii ) ) );
             break;
         }
+
+        if( eda_item->Type() == PCB_FOOTPRINT_T )
+        {
+            FOOTPRINT* fp = static_cast<FOOTPRINT*>( eda_item );
+            fp->InvalidateComponentClassCache();
+            GetBoard()->GetComponentClassManager().RebuildRequiredCaches( fp );
+        }
     }
 
     if( not_found )
@@ -587,6 +594,8 @@ void PCB_BASE_EDIT_FRAME::PutDataInPreviousState( PICKED_ITEMS_LIST* aList )
             HideSolderMask();
     }
 
+    GetBoard()->GetComponentClassManager().InvalidateComponentClasses();
+
     PCB_SELECTION_TOOL* selTool = m_toolManager->GetTool<PCB_SELECTION_TOOL>();
     selTool->RebuildSelection();
 
diff --git a/qa/data/pcbnew/component_classes.kicad_pcb b/qa/data/pcbnew/component_classes.kicad_pcb
new file mode 100644
index 0000000000..79e7a80c19
--- /dev/null
+++ b/qa/data/pcbnew/component_classes.kicad_pcb
@@ -0,0 +1,3875 @@
+(kicad_pcb
+	(version 20250309)
+	(generator "pcbnew")
+	(generator_version "9.99")
+	(general
+		(thickness 1.6)
+		(legacy_teardrops no)
+	)
+	(paper "A4")
+	(layers
+		(0 "F.Cu" signal)
+		(2 "B.Cu" signal)
+		(9 "F.Adhes" user "F.Adhesive")
+		(11 "B.Adhes" user "B.Adhesive")
+		(13 "F.Paste" user)
+		(15 "B.Paste" user)
+		(5 "F.SilkS" user "F.Silkscreen")
+		(7 "B.SilkS" user "B.Silkscreen")
+		(1 "F.Mask" user)
+		(3 "B.Mask" user)
+		(17 "Dwgs.User" user "User.Drawings")
+		(19 "Cmts.User" user "User.Comments")
+		(21 "Eco1.User" user "User.Eco1")
+		(23 "Eco2.User" user "User.Eco2")
+		(25 "Edge.Cuts" user)
+		(27 "Margin" user)
+		(31 "F.CrtYd" user "F.Courtyard")
+		(29 "B.CrtYd" user "B.Courtyard")
+		(35 "F.Fab" user)
+		(33 "B.Fab" user)
+		(39 "User.1" user)
+		(41 "User.2" user)
+		(43 "User.3" user)
+		(45 "User.4" user)
+	)
+	(setup
+		(pad_to_mask_clearance 0)
+		(allow_soldermask_bridges_in_footprints no)
+		(tenting
+			(front yes)
+			(back yes)
+		)
+		(covering
+			(front no)
+			(back no)
+		)
+		(plugging
+			(front no)
+			(back no)
+		)
+		(capping no)
+		(filling no)
+		(pcbplotparams
+			(layerselection 0x00000000_00000000_55555555_5755f5ff)
+			(plot_on_all_layers_selection 0x00000000_00000000_00000000_00000000)
+			(disableapertmacros no)
+			(usegerberextensions no)
+			(usegerberattributes yes)
+			(usegerberadvancedattributes yes)
+			(creategerberjobfile yes)
+			(dashed_line_dash_ratio 12.000000)
+			(dashed_line_gap_ratio 3.000000)
+			(svgprecision 4)
+			(plotframeref no)
+			(mode 1)
+			(useauxorigin no)
+			(hpglpennumber 1)
+			(hpglpenspeed 20)
+			(hpglpendiameter 15.000000)
+			(pdf_front_fp_property_popups yes)
+			(pdf_back_fp_property_popups yes)
+			(pdf_metadata yes)
+			(pdf_single_document no)
+			(dxfpolygonmode yes)
+			(dxfimperialunits yes)
+			(dxfusepcbnewfont yes)
+			(psnegative no)
+			(psa4output no)
+			(plot_black_and_white yes)
+			(sketchpadsonfab no)
+			(plotpadnumbers no)
+			(hidednponfab no)
+			(sketchdnponfab yes)
+			(crossoutdnponfab yes)
+			(subtractmaskfromsilk no)
+			(outputformat 1)
+			(mirror no)
+			(drillshape 1)
+			(scaleselection 1)
+			(outputdirectory "")
+		)
+	)
+	(net 0 "")
+	(net 1 "unconnected-(C1-Pad2)")
+	(net 2 "unconnected-(C1-Pad1)")
+	(net 3 "unconnected-(C2-Pad1)")
+	(net 4 "unconnected-(C2-Pad2)")
+	(net 5 "unconnected-(R1-Pad1)")
+	(net 6 "unconnected-(R1-Pad2)")
+	(net 7 "unconnected-(R2-Pad1)")
+	(net 8 "unconnected-(R2-Pad2)")
+	(net 9 "unconnected-(R3-Pad2)")
+	(net 10 "unconnected-(R3-Pad1)")
+	(footprint "Capacitor_SMD:C_0805_2012Metric"
+		(layer "F.Cu")
+		(uuid "20c594e2-dc3c-4ae4-b79f-4c60932e64f2")
+		(at 87.5 46.45 90)
+		(descr "Capacitor SMD 0805 (2012 Metric), square (rectangular) end terminal, IPC_7351 nominal, (Body size source: IPC-SM-782 page 76, https://www.pcb-3d.com/wordpress/wp-content/uploads/ipc-sm-782a_amendment_1_and_2.pdf, https://docs.google.com/spreadsheets/d/1BsfQQcO9C6DZCsRaXUlFlo91Tg2WpOkGARC1WS5S8t0/edit?usp=sharing), generated with kicad-footprint-generator")
+		(tags "capacitor")
+		(property "Reference" "C1"
+			(at 0 -1.68 90)
+			(layer "F.SilkS")
+			(uuid "b6a1d0d3-f718-4ca5-814a-1f800308f72f")
+			(effects
+				(font
+					(size 1 1)
+					(thickness 0.15)
+				)
+			)
+		)
+		(property "Value" "C"
+			(at 0 1.68 90)
+			(layer "F.Fab")
+			(uuid "4dadbb36-c200-4bfb-bb76-fe193473a20b")
+			(effects
+				(font
+					(size 1 1)
+					(thickness 0.15)
+				)
+			)
+		)
+		(property "Datasheet" ""
+			(at 0 0 90)
+			(unlocked yes)
+			(layer "F.Fab")
+			(hide yes)
+			(uuid "bdedce9c-accf-4675-938a-dac034b670cb")
+			(effects
+				(font
+					(size 1.27 1.27)
+					(thickness 0.15)
+				)
+			)
+		)
+		(property "Description" "Unpolarized capacitor"
+			(at 0 0 90)
+			(unlocked yes)
+			(layer "F.Fab")
+			(hide yes)
+			(uuid "a050b492-0cc0-4f77-a3d8-1a9b3e92c47d")
+			(effects
+				(font
+					(size 1.27 1.27)
+					(thickness 0.15)
+				)
+			)
+		)
+		(property "MY_FIELD" "MY_VALUE"
+			(at 0 0 0)
+			(unlocked yes)
+			(layer "F.Fab")
+			(hide yes)
+			(uuid "97db2fdf-4576-4f6d-b6c6-2067abc94423")
+			(effects
+				(font
+					(size 1 1)
+					(thickness 0.15)
+				)
+			)
+		)
+		(component_classes
+			(class "CLASS_3")
+			(class "CLASS_4")
+		)
+		(property ki_fp_filters "C_*")
+		(path "/ad3cf5f9-5e65-46c9-bb23-770c50780b5d")
+		(sheetname "/")
+		(sheetfile "component_classes.kicad_sch")
+		(attr smd)
+		(fp_line
+			(start -0.261252 -0.735)
+			(end 0.261252 -0.735)
+			(stroke
+				(width 0.12)
+				(type solid)
+			)
+			(layer "F.SilkS")
+			(uuid "53bca523-a3e4-463d-8894-442e891cdbf9")
+		)
+		(fp_line
+			(start -0.261252 0.735)
+			(end 0.261252 0.735)
+			(stroke
+				(width 0.12)
+				(type solid)
+			)
+			(layer "F.SilkS")
+			(uuid "c46e3680-c801-4516-8ab4-0b9c79d86e9b")
+		)
+		(fp_line
+			(start 1.7 -0.98)
+			(end 1.7 0.98)
+			(stroke
+				(width 0.05)
+				(type solid)
+			)
+			(layer "F.CrtYd")
+			(uuid "c9654d28-95f3-41a7-b0e3-aec96c3d4e5e")
+		)
+		(fp_line
+			(start -1.7 -0.98)
+			(end 1.7 -0.98)
+			(stroke
+				(width 0.05)
+				(type solid)
+			)
+			(layer "F.CrtYd")
+			(uuid "6e795437-e8dd-4973-ba75-6c6ad5038ef2")
+		)
+		(fp_line
+			(start 1.7 0.98)
+			(end -1.7 0.98)
+			(stroke
+				(width 0.05)
+				(type solid)
+			)
+			(layer "F.CrtYd")
+			(uuid "3f375192-2ede-4384-a3bc-7c9e5809bed1")
+		)
+		(fp_line
+			(start -1.7 0.98)
+			(end -1.7 -0.98)
+			(stroke
+				(width 0.05)
+				(type solid)
+			)
+			(layer "F.CrtYd")
+			(uuid "93de309c-b19d-4348-a136-7b7a0bf2d96c")
+		)
+		(fp_line
+			(start 1 -0.625)
+			(end 1 0.625)
+			(stroke
+				(width 0.1)
+				(type solid)
+			)
+			(layer "F.Fab")
+			(uuid "2e7c1bb5-6c65-4135-9028-4e2f5337399a")
+		)
+		(fp_line
+			(start -1 -0.625)
+			(end 1 -0.625)
+			(stroke
+				(width 0.1)
+				(type solid)
+			)
+			(layer "F.Fab")
+			(uuid "a1431db3-72a4-4aff-967f-c07fac25fc71")
+		)
+		(fp_line
+			(start 1 0.625)
+			(end -1 0.625)
+			(stroke
+				(width 0.1)
+				(type solid)
+			)
+			(layer "F.Fab")
+			(uuid "2d8193e6-adee-48bb-b8d7-eab9e9915a20")
+		)
+		(fp_line
+			(start -1 0.625)
+			(end -1 -0.625)
+			(stroke
+				(width 0.1)
+				(type solid)
+			)
+			(layer "F.Fab")
+			(uuid "c08c4576-c6d6-4c5c-a922-8cbd3c1a0b02")
+		)
+		(fp_text user "${REFERENCE}"
+			(at 0 0 90)
+			(layer "F.Fab")
+			(uuid "73647e52-a946-43ac-93b7-bc190e27925d")
+			(effects
+				(font
+					(size 0.5 0.5)
+					(thickness 0.08)
+				)
+			)
+		)
+		(pad "1" smd roundrect
+			(at -0.95 0 90)
+			(size 1 1.45)
+			(layers "F.Cu" "F.Mask" "F.Paste")
+			(roundrect_rratio 0.25)
+			(net 2 "unconnected-(C1-Pad1)")
+			(pintype "passive")
+			(tenting
+				(front none)
+				(back none)
+			)
+			(uuid "f94c860b-5cf6-4587-a9ba-125727c07672")
+		)
+		(pad "2" smd roundrect
+			(at 0.95 0 90)
+			(size 1 1.45)
+			(layers "F.Cu" "F.Mask" "F.Paste")
+			(roundrect_rratio 0.25)
+			(net 1 "unconnected-(C1-Pad2)")
+			(pintype "passive")
+			(tenting
+				(front none)
+				(back none)
+			)
+			(uuid "04ae99d4-7209-4ed3-9ce7-6d333bc2c7a3")
+		)
+		(embedded_fonts no)
+		(model "${KICAD8_3DMODEL_DIR}/Capacitor_SMD.3dshapes/C_0805_2012Metric.wrl"
+			(offset
+				(xyz 0 0 0)
+			)
+			(scale
+				(xyz 1 1 1)
+			)
+			(rotate
+				(xyz 0 0 0)
+			)
+		)
+	)
+	(footprint "Capacitor_SMD:C_0805_2012Metric"
+		(layer "F.Cu")
+		(uuid "35baf5a8-8c6c-4646-b94e-a1ce375dfb0c")
+		(at 87.5 61.5 180)
+		(descr "Capacitor SMD 0805 (2012 Metric), square (rectangular) end terminal, IPC_7351 nominal, (Body size source: IPC-SM-782 page 76, https://www.pcb-3d.com/wordpress/wp-content/uploads/ipc-sm-782a_amendment_1_and_2.pdf, https://docs.google.com/spreadsheets/d/1BsfQQcO9C6DZCsRaXUlFlo91Tg2WpOkGARC1WS5S8t0/edit?usp=sharing), generated with kicad-footprint-generator")
+		(tags "capacitor")
+		(property "Reference" "C3"
+			(at 0 -1.68 0)
+			(layer "F.SilkS")
+			(uuid "0c9eaa2a-673b-4117-abe2-4bb9de878b6f")
+			(effects
+				(font
+					(size 1 1)
+					(thickness 0.15)
+				)
+			)
+		)
+		(property "Value" "C"
+			(at 0 1.68 0)
+			(layer "F.Fab")
+			(uuid "af56a511-92c0-43a7-8a8d-739ca25c6842")
+			(effects
+				(font
+					(size 1 1)
+					(thickness 0.15)
+				)
+			)
+		)
+		(property "Datasheet" ""
+			(at 0 0 180)
+			(unlocked yes)
+			(layer "F.Fab")
+			(hide yes)
+			(uuid "56fb3cbe-d423-4442-9c68-2867655b042e")
+			(effects
+				(font
+					(size 1.27 1.27)
+					(thickness 0.15)
+				)
+			)
+		)
+		(property "Description" "Unpolarized capacitor"
+			(at 0 0 180)
+			(unlocked yes)
+			(layer "F.Fab")
+			(hide yes)
+			(uuid "24885389-31d2-4e5c-8945-bc82311457e5")
+			(effects
+				(font
+					(size 1.27 1.27)
+					(thickness 0.15)
+				)
+			)
+		)
+		(attr smd)
+		(fp_line
+			(start -0.261252 0.735)
+			(end 0.261252 0.735)
+			(stroke
+				(width 0.12)
+				(type solid)
+			)
+			(layer "F.SilkS")
+			(uuid "bc42404d-aa46-4422-b1b0-e1d52df828f5")
+		)
+		(fp_line
+			(start -0.261252 -0.735)
+			(end 0.261252 -0.735)
+			(stroke
+				(width 0.12)
+				(type solid)
+			)
+			(layer "F.SilkS")
+			(uuid "7506a2de-9b17-4c6d-b77d-e9226c491373")
+		)
+		(fp_line
+			(start 1.7 0.98)
+			(end -1.7 0.98)
+			(stroke
+				(width 0.05)
+				(type solid)
+			)
+			(layer "F.CrtYd")
+			(uuid "855cab4f-fdcc-4aa5-b4e2-3012d75c929c")
+		)
+		(fp_line
+			(start 1.7 -0.98)
+			(end 1.7 0.98)
+			(stroke
+				(width 0.05)
+				(type solid)
+			)
+			(layer "F.CrtYd")
+			(uuid "64d13c81-cc10-4d79-bc65-3fe243ab9fc8")
+		)
+		(fp_line
+			(start -1.7 0.98)
+			(end -1.7 -0.98)
+			(stroke
+				(width 0.05)
+				(type solid)
+			)
+			(layer "F.CrtYd")
+			(uuid "7a8edf8e-94ac-413a-936c-716fd97bf28b")
+		)
+		(fp_line
+			(start -1.7 -0.98)
+			(end 1.7 -0.98)
+			(stroke
+				(width 0.05)
+				(type solid)
+			)
+			(layer "F.CrtYd")
+			(uuid "525f5d03-764c-4f9d-8ec3-1eeadf283c34")
+		)
+		(fp_line
+			(start 1 0.625)
+			(end -1 0.625)
+			(stroke
+				(width 0.1)
+				(type solid)
+			)
+			(layer "F.Fab")
+			(uuid "61ca8780-d3be-4a61-8a82-1a9988251e92")
+		)
+		(fp_line
+			(start 1 -0.625)
+			(end 1 0.625)
+			(stroke
+				(width 0.1)
+				(type solid)
+			)
+			(layer "F.Fab")
+			(uuid "e9d06653-e85d-4c9b-b9b5-dbfe455e2b44")
+		)
+		(fp_line
+			(start -1 0.625)
+			(end -1 -0.625)
+			(stroke
+				(width 0.1)
+				(type solid)
+			)
+			(layer "F.Fab")
+			(uuid "eecaaf2b-9437-4daa-bcfe-4840e702993e")
+		)
+		(fp_line
+			(start -1 -0.625)
+			(end 1 -0.625)
+			(stroke
+				(width 0.1)
+				(type solid)
+			)
+			(layer "F.Fab")
+			(uuid "2412805d-884f-4c99-b83d-a2f11709df7c")
+		)
+		(fp_text user "${REFERENCE}"
+			(at 0 0 0)
+			(layer "F.Fab")
+			(uuid "9405f694-680a-4b9a-a26c-23da4388c1e5")
+			(effects
+				(font
+					(size 0.5 0.5)
+					(thickness 0.08)
+				)
+			)
+		)
+		(pad "1" smd roundrect
+			(at -0.95 0 180)
+			(size 1 1.45)
+			(layers "F.Cu" "F.Mask" "F.Paste")
+			(roundrect_rratio 0.25)
+			(pintype "passive")
+			(tenting
+				(front none)
+				(back none)
+			)
+			(uuid "bbe61eb3-d309-4016-9f6f-3d4841d31bb2")
+		)
+		(pad "2" smd roundrect
+			(at 0.95 0 180)
+			(size 1 1.45)
+			(layers "F.Cu" "F.Mask" "F.Paste")
+			(roundrect_rratio 0.25)
+			(pintype "passive")
+			(tenting
+				(front none)
+				(back none)
+			)
+			(uuid "7c7683cf-43f2-4ded-8ad7-13edf67c8ca6")
+		)
+		(embedded_fonts no)
+		(model "${KICAD8_3DMODEL_DIR}/Capacitor_SMD.3dshapes/C_0805_2012Metric.wrl"
+			(offset
+				(xyz 0 0 0)
+			)
+			(scale
+				(xyz 1 1 1)
+			)
+			(rotate
+				(xyz 0 0 0)
+			)
+		)
+	)
+	(footprint "Resistor_SMD:R_0805_2012Metric"
+		(layer "F.Cu")
+		(uuid "42431758-8246-40f3-a347-9cdef5490452")
+		(at 90 123.5)
+		(descr "Resistor SMD 0805 (2012 Metric), square (rectangular) end terminal, IPC_7351 nominal, (Body size source: IPC-SM-782 page 72, https://www.pcb-3d.com/wordpress/wp-content/uploads/ipc-sm-782a_amendment_1_and_2.pdf), generated with kicad-footprint-generator")
+		(tags "resistor")
+		(property "Reference" "R3"
+			(at 0 -1.65 0)
+			(layer "F.SilkS")
+			(uuid "79f60322-1203-4055-99e8-cc0785f9428b")
+			(effects
+				(font
+					(size 1 1)
+					(thickness 0.15)
+				)
+			)
+		)
+		(property "Value" "R"
+			(at 0 1.65 0)
+			(layer "F.Fab")
+			(uuid "d18e02a6-14d9-490c-be03-d830a5ec3ebd")
+			(effects
+				(font
+					(size 1 1)
+					(thickness 0.15)
+				)
+			)
+		)
+		(property "Datasheet" ""
+			(at 0 0 0)
+			(unlocked yes)
+			(layer "F.Fab")
+			(hide yes)
+			(uuid "55e386e1-92a6-4cd5-affc-4087715314ba")
+			(effects
+				(font
+					(size 1.27 1.27)
+					(thickness 0.15)
+				)
+			)
+		)
+		(property "Description" "Resistor"
+			(at 0 0 0)
+			(unlocked yes)
+			(layer "F.Fab")
+			(hide yes)
+			(uuid "219c8073-a727-42f8-aa86-cdc79fcfaa3b")
+			(effects
+				(font
+					(size 1.27 1.27)
+					(thickness 0.15)
+				)
+			)
+		)
+		(property ki_fp_filters "R_*")
+		(path "/e826c7ec-b0cb-4f53-915d-da3597387304/59f917aa-b3c3-44ac-945d-08ec2aba840d")
+		(sheetname "/SHEET1/")
+		(sheetfile "component_classes_sheet1.kicad_sch")
+		(attr smd)
+		(fp_line
+			(start -0.227064 -0.735)
+			(end 0.227064 -0.735)
+			(stroke
+				(width 0.12)
+				(type solid)
+			)
+			(layer "F.SilkS")
+			(uuid "67403d1b-4343-42b2-b41a-43ee6eef94e2")
+		)
+		(fp_line
+			(start -0.227064 0.735)
+			(end 0.227064 0.735)
+			(stroke
+				(width 0.12)
+				(type solid)
+			)
+			(layer "F.SilkS")
+			(uuid "717700e0-2084-4f03-81f1-40053d65a197")
+		)
+		(fp_line
+			(start -1.68 -0.95)
+			(end 1.68 -0.95)
+			(stroke
+				(width 0.05)
+				(type solid)
+			)
+			(layer "F.CrtYd")
+			(uuid "7637bb1f-5ff5-4bb3-9ba9-2af4bb4ffba5")
+		)
+		(fp_line
+			(start -1.68 0.95)
+			(end -1.68 -0.95)
+			(stroke
+				(width 0.05)
+				(type solid)
+			)
+			(layer "F.CrtYd")
+			(uuid "ef5e60b0-0d62-44ef-82b9-589b6423bfd8")
+		)
+		(fp_line
+			(start 1.68 -0.95)
+			(end 1.68 0.95)
+			(stroke
+				(width 0.05)
+				(type solid)
+			)
+			(layer "F.CrtYd")
+			(uuid "62d8e531-c0e8-4702-b509-c5d4b8ddd994")
+		)
+		(fp_line
+			(start 1.68 0.95)
+			(end -1.68 0.95)
+			(stroke
+				(width 0.05)
+				(type solid)
+			)
+			(layer "F.CrtYd")
+			(uuid "57193c6d-01d3-467b-ab09-2dbd29bba90e")
+		)
+		(fp_line
+			(start -1 -0.625)
+			(end 1 -0.625)
+			(stroke
+				(width 0.1)
+				(type solid)
+			)
+			(layer "F.Fab")
+			(uuid "aa4b6c94-089a-4a79-beec-f67f071723c7")
+		)
+		(fp_line
+			(start -1 0.625)
+			(end -1 -0.625)
+			(stroke
+				(width 0.1)
+				(type solid)
+			)
+			(layer "F.Fab")
+			(uuid "9c7bb760-f60f-4b85-89aa-734a416c9688")
+		)
+		(fp_line
+			(start 1 -0.625)
+			(end 1 0.625)
+			(stroke
+				(width 0.1)
+				(type solid)
+			)
+			(layer "F.Fab")
+			(uuid "1234ab70-e3a1-44be-afe6-471bc8eb9108")
+		)
+		(fp_line
+			(start 1 0.625)
+			(end -1 0.625)
+			(stroke
+				(width 0.1)
+				(type solid)
+			)
+			(layer "F.Fab")
+			(uuid "9b70aabf-8f98-4510-b99a-373f4699b387")
+		)
+		(fp_text user "${REFERENCE}"
+			(at 0 0 0)
+			(layer "F.Fab")
+			(uuid "7a861093-4569-4b9e-932c-c027d7fd0346")
+			(effects
+				(font
+					(size 0.5 0.5)
+					(thickness 0.08)
+				)
+			)
+		)
+		(pad "1" smd roundrect
+			(at -0.9125 0)
+			(size 1.025 1.4)
+			(layers "F.Cu" "F.Mask" "F.Paste")
+			(roundrect_rratio 0.243902)
+			(net 10 "unconnected-(R3-Pad1)")
+			(pintype "passive")
+			(tenting
+				(front none)
+				(back none)
+			)
+			(uuid "efe8153d-1300-492a-a8fa-e88b0da2b24e")
+		)
+		(pad "2" smd roundrect
+			(at 0.9125 0)
+			(size 1.025 1.4)
+			(layers "F.Cu" "F.Mask" "F.Paste")
+			(roundrect_rratio 0.243902)
+			(net 9 "unconnected-(R3-Pad2)")
+			(pintype "passive")
+			(tenting
+				(front none)
+				(back none)
+			)
+			(uuid "888c53eb-5967-4235-8121-cedb79ef022b")
+		)
+		(embedded_fonts no)
+		(model "${KICAD8_3DMODEL_DIR}/Resistor_SMD.3dshapes/R_0805_2012Metric.wrl"
+			(offset
+				(xyz 0 0 0)
+			)
+			(scale
+				(xyz 1 1 1)
+			)
+			(rotate
+				(xyz 0 0 0)
+			)
+		)
+	)
+	(footprint "Package_SO:MSOP-8_3x3mm_P0.65mm"
+		(layer "F.Cu")
+		(uuid "565a583a-c3f7-4ed1-915e-53451d914b0d")
+		(at 171 59.5)
+		(descr "MSOP, 8 Pin (https://www.jedec.org/system/files/docs/mo-187F.pdf variant AA), generated with kicad-footprint-generator ipc_gullwing_generator.py")
+		(tags "MSOP SO")
+		(property "Reference" "U2"
+			(at 0 -2.45 0)
+			(layer "F.SilkS")
+			(uuid "c5595c58-3b56-4cca-9c6e-a89fd40b25d4")
+			(effects
+				(font
+					(size 1 1)
+					(thickness 0.15)
+				)
+			)
+		)
+		(property "Value" "MSOP-8_3x3mm_P0.65mm"
+			(at 0 2.45 0)
+			(layer "F.Fab")
+			(uuid "5ce9adf3-2570-4711-ad04-deed4b654d49")
+			(effects
+				(font
+					(size 1 1)
+					(thickness 0.15)
+				)
+			)
+		)
+		(property "Datasheet" ""
+			(at 0 0 0)
+			(layer "F.Fab")
+			(hide yes)
+			(uuid "c05b7295-27f6-4834-8458-b8e5f834d5c9")
+			(effects
+				(font
+					(size 1.27 1.27)
+					(thickness 0.15)
+				)
+			)
+		)
+		(property "Description" ""
+			(at 0 0 0)
+			(layer "F.Fab")
+			(hide yes)
+			(uuid "bca6724c-4a56-4eef-8e8a-34184ea8deda")
+			(effects
+				(font
+					(size 1.27 1.27)
+					(thickness 0.15)
+				)
+			)
+		)
+		(property "FIELD2" "VALUE"
+			(at 0 0 0)
+			(unlocked yes)
+			(layer "F.Fab")
+			(hide yes)
+			(uuid "a9c134d3-fa97-4b30-a438-e73c9a90e745")
+			(effects
+				(font
+					(size 1 1)
+					(thickness 0.15)
+				)
+			)
+		)
+		(attr smd)
+		(fp_line
+			(start 0 -1.61)
+			(end -1.5 -1.61)
+			(stroke
+				(width 0.12)
+				(type solid)
+			)
+			(layer "F.SilkS")
+			(uuid "1f9c3066-bcd3-4a46-bf9e-2f9176cabf32")
+		)
+		(fp_line
+			(start 0 -1.61)
+			(end 1.5 -1.61)
+			(stroke
+				(width 0.12)
+				(type solid)
+			)
+			(layer "F.SilkS")
+			(uuid "05116392-5691-4a21-9992-d88cce58aa25")
+		)
+		(fp_line
+			(start 0 1.61)
+			(end -1.5 1.61)
+			(stroke
+				(width 0.12)
+				(type solid)
+			)
+			(layer "F.SilkS")
+			(uuid "6623a538-5622-4a99-a978-2b5c78296646")
+		)
+		(fp_line
+			(start 0 1.61)
+			(end 1.5 1.61)
+			(stroke
+				(width 0.12)
+				(type solid)
+			)
+			(layer "F.SilkS")
+			(uuid "db6e5df3-77bc-4c61-a1df-a6ec11a80907")
+		)
+		(fp_poly
+			(pts
+				(xy -2.2125 -1.435) (xy -2.4525 -1.765) (xy -1.9725 -1.765) (xy -2.2125 -1.435)
+			)
+			(stroke
+				(width 0.12)
+				(type solid)
+			)
+			(fill yes)
+			(layer "F.SilkS")
+			(uuid "f410c44d-8f16-44fd-a119-76d6c2be81cc")
+		)
+		(fp_line
+			(start -3.18 -1.75)
+			(end -3.18 1.75)
+			(stroke
+				(width 0.05)
+				(type solid)
+			)
+			(layer "F.CrtYd")
+			(uuid "643e5931-3709-400f-90e5-28485be04897")
+		)
+		(fp_line
+			(start -3.18 1.75)
+			(end 3.18 1.75)
+			(stroke
+				(width 0.05)
+				(type solid)
+			)
+			(layer "F.CrtYd")
+			(uuid "5b46bc45-e5cc-4e40-a7a4-8a9a37a7af0a")
+		)
+		(fp_line
+			(start 3.18 -1.75)
+			(end -3.18 -1.75)
+			(stroke
+				(width 0.05)
+				(type solid)
+			)
+			(layer "F.CrtYd")
+			(uuid "c4f47471-6107-46eb-bc73-1071c4c8d1c4")
+		)
+		(fp_line
+			(start 3.18 1.75)
+			(end 3.18 -1.75)
+			(stroke
+				(width 0.05)
+				(type solid)
+			)
+			(layer "F.CrtYd")
+			(uuid "74b2505c-991c-46be-bc5d-db7903bfab4f")
+		)
+		(fp_line
+			(start -1.5 -0.75)
+			(end -0.75 -1.5)
+			(stroke
+				(width 0.1)
+				(type solid)
+			)
+			(layer "F.Fab")
+			(uuid "69b29a6d-dfd8-4bd3-abdf-59e547c44c0d")
+		)
+		(fp_line
+			(start -1.5 1.5)
+			(end -1.5 -0.75)
+			(stroke
+				(width 0.1)
+				(type solid)
+			)
+			(layer "F.Fab")
+			(uuid "9df31c97-ae5a-4202-821a-94d9caf96a18")
+		)
+		(fp_line
+			(start -0.75 -1.5)
+			(end 1.5 -1.5)
+			(stroke
+				(width 0.1)
+				(type solid)
+			)
+			(layer "F.Fab")
+			(uuid "15b042c9-5160-4795-9cf1-550e5bddae50")
+		)
+		(fp_line
+			(start 1.5 -1.5)
+			(end 1.5 1.5)
+			(stroke
+				(width 0.1)
+				(type solid)
+			)
+			(layer "F.Fab")
+			(uuid "adb0b0a5-cc9f-4a16-a13a-2ed80ff2667b")
+		)
+		(fp_line
+			(start 1.5 1.5)
+			(end -1.5 1.5)
+			(stroke
+				(width 0.1)
+				(type solid)
+			)
+			(layer "F.Fab")
+			(uuid "bbbe1ebb-34ee-4215-a4a1-d147e576a6ed")
+		)
+		(fp_text user "${REFERENCE}"
+			(at 0 0 0)
+			(layer "F.Fab")
+			(uuid "75d43e08-b85b-47ad-8a50-fc8d34b43465")
+			(effects
+				(font
+					(size 0.75 0.75)
+					(thickness 0.11)
+				)
+			)
+		)
+		(pad "1" smd roundrect
+			(at -2.1125 -0.975)
+			(size 1.625 0.4)
+			(layers "F.Cu" "F.Mask" "F.Paste")
+			(roundrect_rratio 0.25)
+			(tenting
+				(front none)
+				(back none)
+			)
+			(uuid "b3971916-23e9-4c77-a6ce-141faa199df4")
+		)
+		(pad "2" smd roundrect
+			(at -2.1125 -0.325)
+			(size 1.625 0.4)
+			(layers "F.Cu" "F.Mask" "F.Paste")
+			(roundrect_rratio 0.25)
+			(tenting
+				(front none)
+				(back none)
+			)
+			(uuid "6a37074f-269d-4243-987e-abf47e5b6ffb")
+		)
+		(pad "3" smd roundrect
+			(at -2.1125 0.325)
+			(size 1.625 0.4)
+			(layers "F.Cu" "F.Mask" "F.Paste")
+			(roundrect_rratio 0.25)
+			(tenting
+				(front none)
+				(back none)
+			)
+			(uuid "b205b4df-e344-4118-9eed-8245f7992350")
+		)
+		(pad "4" smd roundrect
+			(at -2.1125 0.975)
+			(size 1.625 0.4)
+			(layers "F.Cu" "F.Mask" "F.Paste")
+			(roundrect_rratio 0.25)
+			(tenting
+				(front none)
+				(back none)
+			)
+			(uuid "5e489332-68f6-49b5-9003-43541992a3c8")
+		)
+		(pad "5" smd roundrect
+			(at 2.1125 0.975)
+			(size 1.625 0.4)
+			(layers "F.Cu" "F.Mask" "F.Paste")
+			(roundrect_rratio 0.25)
+			(tenting
+				(front none)
+				(back none)
+			)
+			(uuid "e45ae895-dc25-416e-852a-d2ab1bf2fc62")
+		)
+		(pad "6" smd roundrect
+			(at 2.1125 0.325)
+			(size 1.625 0.4)
+			(layers "F.Cu" "F.Mask" "F.Paste")
+			(roundrect_rratio 0.25)
+			(tenting
+				(front none)
+				(back none)
+			)
+			(uuid "084265cb-2b5a-4eaf-a2ca-233a2e2e3e75")
+		)
+		(pad "7" smd roundrect
+			(at 2.1125 -0.325)
+			(size 1.625 0.4)
+			(layers "F.Cu" "F.Mask" "F.Paste")
+			(roundrect_rratio 0.25)
+			(tenting
+				(front none)
+				(back none)
+			)
+			(uuid "82e9f7e1-9fd6-4f6a-8d9a-d4f036c19c1e")
+		)
+		(pad "8" smd roundrect
+			(at 2.1125 -0.975)
+			(size 1.625 0.4)
+			(layers "F.Cu" "F.Mask" "F.Paste")
+			(roundrect_rratio 0.25)
+			(tenting
+				(front none)
+				(back none)
+			)
+			(uuid "877f5c02-02c4-4747-ba2c-94b42660e9fe")
+		)
+		(embedded_fonts no)
+		(model "${KICAD8_3DMODEL_DIR}/Package_SO.3dshapes/MSOP-8_3x3mm_P0.65mm.wrl"
+			(offset
+				(xyz 0 0 0)
+			)
+			(scale
+				(xyz 1 1 1)
+			)
+			(rotate
+				(xyz 0 0 0)
+			)
+		)
+	)
+	(footprint "Package_SO:MSOP-8_3x3mm_P0.65mm"
+		(layer "F.Cu")
+		(uuid "5a2fde81-ef71-4606-bd2a-4919965ee0e9")
+		(at 171 47.5)
+		(descr "MSOP, 8 Pin (https://www.jedec.org/system/files/docs/mo-187F.pdf variant AA), generated with kicad-footprint-generator ipc_gullwing_generator.py")
+		(tags "MSOP SO")
+		(property "Reference" "U1"
+			(at 0 -2.45 0)
+			(layer "F.SilkS")
+			(uuid "85c40494-6ab0-4d88-ad94-79e4662a50a7")
+			(effects
+				(font
+					(size 1 1)
+					(thickness 0.15)
+				)
+			)
+		)
+		(property "Value" "MSOP-8_3x3mm_P0.65mm"
+			(at 0 2.45 0)
+			(layer "F.Fab")
+			(uuid "45f2f822-339a-44a4-b47e-ed4ada85118f")
+			(effects
+				(font
+					(size 1 1)
+					(thickness 0.15)
+				)
+			)
+		)
+		(property "Datasheet" ""
+			(at 0 0 0)
+			(layer "F.Fab")
+			(hide yes)
+			(uuid "7b2857f1-c21e-4ea1-a99d-f3c90c83e8b3")
+			(effects
+				(font
+					(size 1.27 1.27)
+					(thickness 0.15)
+				)
+			)
+		)
+		(property "Description" ""
+			(at 0 0 0)
+			(layer "F.Fab")
+			(hide yes)
+			(uuid "3292b06b-515f-436a-8510-6ba859b40f0a")
+			(effects
+				(font
+					(size 1.27 1.27)
+					(thickness 0.15)
+				)
+			)
+		)
+		(attr smd)
+		(fp_line
+			(start 0 -1.61)
+			(end -1.5 -1.61)
+			(stroke
+				(width 0.12)
+				(type solid)
+			)
+			(layer "F.SilkS")
+			(uuid "1770ee85-d6f1-42ba-95d8-c0e39e2239de")
+		)
+		(fp_line
+			(start 0 -1.61)
+			(end 1.5 -1.61)
+			(stroke
+				(width 0.12)
+				(type solid)
+			)
+			(layer "F.SilkS")
+			(uuid "bb25f61c-831e-4532-8d0b-b4eced7a7b9d")
+		)
+		(fp_line
+			(start 0 1.61)
+			(end -1.5 1.61)
+			(stroke
+				(width 0.12)
+				(type solid)
+			)
+			(layer "F.SilkS")
+			(uuid "56d9224c-d0df-411d-bda4-3cd91c77e9f6")
+		)
+		(fp_line
+			(start 0 1.61)
+			(end 1.5 1.61)
+			(stroke
+				(width 0.12)
+				(type solid)
+			)
+			(layer "F.SilkS")
+			(uuid "9d09536d-07ee-40f8-8d62-0f6f06f4cde0")
+		)
+		(fp_poly
+			(pts
+				(xy -2.2125 -1.435) (xy -2.4525 -1.765) (xy -1.9725 -1.765) (xy -2.2125 -1.435)
+			)
+			(stroke
+				(width 0.12)
+				(type solid)
+			)
+			(fill yes)
+			(layer "F.SilkS")
+			(uuid "639157a2-4ecb-4db4-b2d3-f132482052fb")
+		)
+		(fp_line
+			(start -3.18 -1.75)
+			(end -3.18 1.75)
+			(stroke
+				(width 0.05)
+				(type solid)
+			)
+			(layer "F.CrtYd")
+			(uuid "683dca2b-24c2-44f6-a553-de8d9ea25b8c")
+		)
+		(fp_line
+			(start -3.18 1.75)
+			(end 3.18 1.75)
+			(stroke
+				(width 0.05)
+				(type solid)
+			)
+			(layer "F.CrtYd")
+			(uuid "d78ea107-9825-4e27-9d10-8d3d1c5b2618")
+		)
+		(fp_line
+			(start 3.18 -1.75)
+			(end -3.18 -1.75)
+			(stroke
+				(width 0.05)
+				(type solid)
+			)
+			(layer "F.CrtYd")
+			(uuid "b1b24fae-2917-4c67-a515-adb11d7a8041")
+		)
+		(fp_line
+			(start 3.18 1.75)
+			(end 3.18 -1.75)
+			(stroke
+				(width 0.05)
+				(type solid)
+			)
+			(layer "F.CrtYd")
+			(uuid "5dc372a4-bb91-4076-9598-3698ad3e1183")
+		)
+		(fp_line
+			(start -1.5 -0.75)
+			(end -0.75 -1.5)
+			(stroke
+				(width 0.1)
+				(type solid)
+			)
+			(layer "F.Fab")
+			(uuid "fe02fd13-a6a9-4ee7-bc85-dde92b26c615")
+		)
+		(fp_line
+			(start -1.5 1.5)
+			(end -1.5 -0.75)
+			(stroke
+				(width 0.1)
+				(type solid)
+			)
+			(layer "F.Fab")
+			(uuid "37c7ffe8-5b19-462e-93e7-d388045115f6")
+		)
+		(fp_line
+			(start -0.75 -1.5)
+			(end 1.5 -1.5)
+			(stroke
+				(width 0.1)
+				(type solid)
+			)
+			(layer "F.Fab")
+			(uuid "7bda01bb-4525-4bb0-b57a-60831adc0702")
+		)
+		(fp_line
+			(start 1.5 -1.5)
+			(end 1.5 1.5)
+			(stroke
+				(width 0.1)
+				(type solid)
+			)
+			(layer "F.Fab")
+			(uuid "fa29eb1f-cb62-4764-8030-b04d7fcda071")
+		)
+		(fp_line
+			(start 1.5 1.5)
+			(end -1.5 1.5)
+			(stroke
+				(width 0.1)
+				(type solid)
+			)
+			(layer "F.Fab")
+			(uuid "e569ad75-a378-45c7-a14d-8dca75cf3de8")
+		)
+		(fp_text user "${REFERENCE}"
+			(at 0 0 0)
+			(layer "F.Fab")
+			(uuid "22953e01-2a26-48c5-95e4-82c931f17b0a")
+			(effects
+				(font
+					(size 0.75 0.75)
+					(thickness 0.11)
+				)
+			)
+		)
+		(pad "1" smd roundrect
+			(at -2.1125 -0.975)
+			(size 1.625 0.4)
+			(layers "F.Cu" "F.Mask" "F.Paste")
+			(roundrect_rratio 0.25)
+			(tenting
+				(front none)
+				(back none)
+			)
+			(uuid "6cee2a24-8b03-467a-acb4-8fe3188947b3")
+		)
+		(pad "2" smd roundrect
+			(at -2.1125 -0.325)
+			(size 1.625 0.4)
+			(layers "F.Cu" "F.Mask" "F.Paste")
+			(roundrect_rratio 0.25)
+			(tenting
+				(front none)
+				(back none)
+			)
+			(uuid "36cb45b8-cb53-43df-be49-f66bc586b7c5")
+		)
+		(pad "3" smd roundrect
+			(at -2.1125 0.325)
+			(size 1.625 0.4)
+			(layers "F.Cu" "F.Mask" "F.Paste")
+			(roundrect_rratio 0.25)
+			(tenting
+				(front none)
+				(back none)
+			)
+			(uuid "2eac4fbc-5a23-4be4-ad50-c0b7ce2054d6")
+		)
+		(pad "4" smd roundrect
+			(at -2.1125 0.975)
+			(size 1.625 0.4)
+			(layers "F.Cu" "F.Mask" "F.Paste")
+			(roundrect_rratio 0.25)
+			(tenting
+				(front none)
+				(back none)
+			)
+			(uuid "c3b2b4b2-d94b-42cf-a9f9-c3a325f3336a")
+		)
+		(pad "5" smd roundrect
+			(at 2.1125 0.975)
+			(size 1.625 0.4)
+			(layers "F.Cu" "F.Mask" "F.Paste")
+			(roundrect_rratio 0.25)
+			(tenting
+				(front none)
+				(back none)
+			)
+			(uuid "0c07821d-9fb6-40fd-90dc-d3e73d332cb9")
+		)
+		(pad "6" smd roundrect
+			(at 2.1125 0.325)
+			(size 1.625 0.4)
+			(layers "F.Cu" "F.Mask" "F.Paste")
+			(roundrect_rratio 0.25)
+			(tenting
+				(front none)
+				(back none)
+			)
+			(uuid "de34a102-a79e-47d5-97c2-45bc6b15916f")
+		)
+		(pad "7" smd roundrect
+			(at 2.1125 -0.325)
+			(size 1.625 0.4)
+			(layers "F.Cu" "F.Mask" "F.Paste")
+			(roundrect_rratio 0.25)
+			(tenting
+				(front none)
+				(back none)
+			)
+			(uuid "2925d99a-6f0d-4fc4-825d-85cb29e411d8")
+		)
+		(pad "8" smd roundrect
+			(at 2.1125 -0.975)
+			(size 1.625 0.4)
+			(layers "F.Cu" "F.Mask" "F.Paste")
+			(roundrect_rratio 0.25)
+			(tenting
+				(front none)
+				(back none)
+			)
+			(uuid "d0e4d0b3-5afb-4616-8266-c08221c38c58")
+		)
+		(embedded_fonts no)
+		(model "${KICAD8_3DMODEL_DIR}/Package_SO.3dshapes/MSOP-8_3x3mm_P0.65mm.wrl"
+			(offset
+				(xyz 0 0 0)
+			)
+			(scale
+				(xyz 1 1 1)
+			)
+			(rotate
+				(xyz 0 0 0)
+			)
+		)
+	)
+	(footprint "Resistor_SMD:R_0805_2012Metric"
+		(layer "F.Cu")
+		(uuid "60f384d6-922e-4fcd-beae-d652b0b068c9")
+		(at 87.4125 71.5)
+		(descr "Resistor SMD 0805 (2012 Metric), square (rectangular) end terminal, IPC_7351 nominal, (Body size source: IPC-SM-782 page 72, https://www.pcb-3d.com/wordpress/wp-content/uploads/ipc-sm-782a_amendment_1_and_2.pdf), generated with kicad-footprint-generator")
+		(tags "resistor")
+		(property "Reference" "R8"
+			(at 0 -1.65 0)
+			(layer "F.SilkS")
+			(uuid "957f649e-6506-4b2f-8e6e-29c2dab247d0")
+			(effects
+				(font
+					(size 1 1)
+					(thickness 0.15)
+				)
+			)
+		)
+		(property "Value" "R_0805_2012Metric"
+			(at 0 1.65 0)
+			(layer "F.Fab")
+			(uuid "bff0995d-5f3b-4084-b8a8-637a9bc57871")
+			(effects
+				(font
+					(size 1 1)
+					(thickness 0.15)
+				)
+			)
+		)
+		(property "Datasheet" ""
+			(at 0 0 0)
+			(unlocked yes)
+			(layer "F.Fab")
+			(hide yes)
+			(uuid "9f8e6051-438f-43d3-8c94-9f29c1e23fd8")
+			(effects
+				(font
+					(size 1.27 1.27)
+					(thickness 0.15)
+				)
+			)
+		)
+		(property "Description" ""
+			(at 0 0 0)
+			(unlocked yes)
+			(layer "F.Fab")
+			(hide yes)
+			(uuid "e9d5e9c7-3bb6-4338-bf88-65a11d8d614a")
+			(effects
+				(font
+					(size 1.27 1.27)
+					(thickness 0.15)
+				)
+			)
+		)
+		(attr smd)
+		(fp_line
+			(start -0.227064 -0.735)
+			(end 0.227064 -0.735)
+			(stroke
+				(width 0.12)
+				(type solid)
+			)
+			(layer "F.SilkS")
+			(uuid "1e43ec23-53df-48a6-8990-8165f372d517")
+		)
+		(fp_line
+			(start -0.227064 0.735)
+			(end 0.227064 0.735)
+			(stroke
+				(width 0.12)
+				(type solid)
+			)
+			(layer "F.SilkS")
+			(uuid "5363ddda-d0df-42ba-90cf-8afa2bc7b366")
+		)
+		(fp_line
+			(start -1.68 -0.95)
+			(end 1.68 -0.95)
+			(stroke
+				(width 0.05)
+				(type solid)
+			)
+			(layer "F.CrtYd")
+			(uuid "0c3fa329-c19d-4437-a53a-fe83a3c39e80")
+		)
+		(fp_line
+			(start -1.68 0.95)
+			(end -1.68 -0.95)
+			(stroke
+				(width 0.05)
+				(type solid)
+			)
+			(layer "F.CrtYd")
+			(uuid "bb4517fa-8df0-4cdf-88d9-df4b137678d0")
+		)
+		(fp_line
+			(start 1.68 -0.95)
+			(end 1.68 0.95)
+			(stroke
+				(width 0.05)
+				(type solid)
+			)
+			(layer "F.CrtYd")
+			(uuid "934ebf4c-a841-4ead-b839-85735595a133")
+		)
+		(fp_line
+			(start 1.68 0.95)
+			(end -1.68 0.95)
+			(stroke
+				(width 0.05)
+				(type solid)
+			)
+			(layer "F.CrtYd")
+			(uuid "dcf45983-9036-4bbd-853e-fe8a748bfa40")
+		)
+		(fp_line
+			(start -1 -0.625)
+			(end 1 -0.625)
+			(stroke
+				(width 0.1)
+				(type solid)
+			)
+			(layer "F.Fab")
+			(uuid "fbfd71ef-4932-4806-a443-a009badeda30")
+		)
+		(fp_line
+			(start -1 0.625)
+			(end -1 -0.625)
+			(stroke
+				(width 0.1)
+				(type solid)
+			)
+			(layer "F.Fab")
+			(uuid "dbf038b6-fe59-4b78-9c6f-29f50c2ebe1c")
+		)
+		(fp_line
+			(start 1 -0.625)
+			(end 1 0.625)
+			(stroke
+				(width 0.1)
+				(type solid)
+			)
+			(layer "F.Fab")
+			(uuid "cda6d683-dfcb-4dcf-b496-2cc9cb2b6a3f")
+		)
+		(fp_line
+			(start 1 0.625)
+			(end -1 0.625)
+			(stroke
+				(width 0.1)
+				(type solid)
+			)
+			(layer "F.Fab")
+			(uuid "54186cd7-ca2a-4acc-b15d-7c2e222db3d7")
+		)
+		(fp_text user "${REFERENCE}"
+			(at 0 0 0)
+			(layer "F.Fab")
+			(uuid "9431d0bf-9932-45e7-ac3d-642a74ec296b")
+			(effects
+				(font
+					(size 0.5 0.5)
+					(thickness 0.08)
+				)
+			)
+		)
+		(pad "1" smd roundrect
+			(at -0.9125 0)
+			(size 1.025 1.4)
+			(layers "F.Cu" "F.Mask" "F.Paste")
+			(roundrect_rratio 0.243902)
+			(tenting
+				(front none)
+				(back none)
+			)
+			(uuid "b91282b5-f4a4-45bd-b091-0bce2bd9ee03")
+		)
+		(pad "2" smd roundrect
+			(at 0.9125 0)
+			(size 1.025 1.4)
+			(layers "F.Cu" "F.Mask" "F.Paste")
+			(roundrect_rratio 0.243902)
+			(tenting
+				(front none)
+				(back none)
+			)
+			(uuid "d10a7585-99e6-4c7d-af2c-b870c15256d6")
+		)
+		(embedded_fonts no)
+		(model "${KICAD8_3DMODEL_DIR}/Resistor_SMD.3dshapes/R_0805_2012Metric.wrl"
+			(offset
+				(xyz 0 0 0)
+			)
+			(scale
+				(xyz 1 1 1)
+			)
+			(rotate
+				(xyz 0 0 0)
+			)
+		)
+	)
+	(footprint "Resistor_SMD:R_1206_3216Metric"
+		(layer "F.Cu")
+		(uuid "7a0722a1-0031-4081-a5e4-baf585b8d26e")
+		(at 86.5375 86)
+		(descr "Resistor SMD 1206 (3216 Metric), square (rectangular) end terminal, IPC_7351 nominal, (Body size source: IPC-SM-782 page 72, https://www.pcb-3d.com/wordpress/wp-content/uploads/ipc-sm-782a_amendment_1_and_2.pdf), generated with kicad-footprint-generator")
+		(tags "resistor")
+		(property "Reference" "R2"
+			(at 0 -1.82 0)
+			(layer "F.SilkS")
+			(uuid "0aec73dc-c69a-4fda-a73c-d9041e8aa56e")
+			(effects
+				(font
+					(size 1 1)
+					(thickness 0.15)
+				)
+			)
+		)
+		(property "Value" "R"
+			(at 0 1.82 0)
+			(layer "F.Fab")
+			(uuid "cca5403a-89ed-4fb0-9814-5a533a803bd4")
+			(effects
+				(font
+					(size 1 1)
+					(thickness 0.15)
+				)
+			)
+		)
+		(property "Datasheet" ""
+			(at 0 0 0)
+			(unlocked yes)
+			(layer "F.Fab")
+			(hide yes)
+			(uuid "cc3fd2f9-3818-48fd-b465-1781903bcba9")
+			(effects
+				(font
+					(size 1.27 1.27)
+					(thickness 0.15)
+				)
+			)
+		)
+		(property "Description" "Resistor"
+			(at 0 0 0)
+			(unlocked yes)
+			(layer "F.Fab")
+			(hide yes)
+			(uuid "4da6c036-c782-49b3-9cfb-d28ed8e77f61")
+			(effects
+				(font
+					(size 1.27 1.27)
+					(thickness 0.15)
+				)
+			)
+		)
+		(property "FIELD_2" "ANOTHER VALUE"
+			(at 0 0 0)
+			(unlocked yes)
+			(layer "F.Fab")
+			(hide yes)
+			(uuid "b679c675-a06b-4c2d-849b-7497d52e6c7f")
+			(effects
+				(font
+					(size 1 1)
+					(thickness 0.15)
+				)
+			)
+		)
+		(component_classes
+			(class "CLASS_1")
+		)
+		(property ki_fp_filters "R_*")
+		(path "/759e3836-df02-4bcc-823f-2488f4ccdc6a")
+		(sheetname "/")
+		(sheetfile "component_classes.kicad_sch")
+		(attr smd)
+		(fp_line
+			(start -0.727064 -0.91)
+			(end 0.727064 -0.91)
+			(stroke
+				(width 0.12)
+				(type solid)
+			)
+			(layer "F.SilkS")
+			(uuid "e610e93f-fc7a-4971-bad3-d4d20a2e9203")
+		)
+		(fp_line
+			(start -0.727064 0.91)
+			(end 0.727064 0.91)
+			(stroke
+				(width 0.12)
+				(type solid)
+			)
+			(layer "F.SilkS")
+			(uuid "7b109203-3f3c-4ab0-8d0a-73860efbbef9")
+		)
+		(fp_line
+			(start -2.28 -1.12)
+			(end 2.28 -1.12)
+			(stroke
+				(width 0.05)
+				(type solid)
+			)
+			(layer "F.CrtYd")
+			(uuid "8ebf011a-fafa-42e6-af87-33fceea106e1")
+		)
+		(fp_line
+			(start -2.28 1.12)
+			(end -2.28 -1.12)
+			(stroke
+				(width 0.05)
+				(type solid)
+			)
+			(layer "F.CrtYd")
+			(uuid "b01bf231-a778-4e47-b7be-2f1fcc22f8be")
+		)
+		(fp_line
+			(start 2.28 -1.12)
+			(end 2.28 1.12)
+			(stroke
+				(width 0.05)
+				(type solid)
+			)
+			(layer "F.CrtYd")
+			(uuid "dce761d1-3e1c-4f37-969c-aff92f4fa8ad")
+		)
+		(fp_line
+			(start 2.28 1.12)
+			(end -2.28 1.12)
+			(stroke
+				(width 0.05)
+				(type solid)
+			)
+			(layer "F.CrtYd")
+			(uuid "64e185e3-3dfe-48de-9ed2-76378834acf1")
+		)
+		(fp_line
+			(start -1.6 -0.8)
+			(end 1.6 -0.8)
+			(stroke
+				(width 0.1)
+				(type solid)
+			)
+			(layer "F.Fab")
+			(uuid "88ace82f-22ee-4c8c-bd64-c9d04c08aad9")
+		)
+		(fp_line
+			(start -1.6 0.8)
+			(end -1.6 -0.8)
+			(stroke
+				(width 0.1)
+				(type solid)
+			)
+			(layer "F.Fab")
+			(uuid "d67fdba2-cd14-481d-8651-8fe94674b6f2")
+		)
+		(fp_line
+			(start 1.6 -0.8)
+			(end 1.6 0.8)
+			(stroke
+				(width 0.1)
+				(type solid)
+			)
+			(layer "F.Fab")
+			(uuid "78b78da8-d9c7-4984-b7b6-9f560b57d777")
+		)
+		(fp_line
+			(start 1.6 0.8)
+			(end -1.6 0.8)
+			(stroke
+				(width 0.1)
+				(type solid)
+			)
+			(layer "F.Fab")
+			(uuid "f7b1b609-90fd-403b-af1c-eb1b78bff4f8")
+		)
+		(fp_text user "${REFERENCE}"
+			(at 0 0 0)
+			(layer "F.Fab")
+			(uuid "8e5cbedb-dfb2-49ea-b133-96fc3483939c")
+			(effects
+				(font
+					(size 0.8 0.8)
+					(thickness 0.12)
+				)
+			)
+		)
+		(pad "1" smd roundrect
+			(at -1.4625 0)
+			(size 1.125 1.75)
+			(layers "F.Cu" "F.Mask" "F.Paste")
+			(roundrect_rratio 0.222222)
+			(net 7 "unconnected-(R2-Pad1)")
+			(pintype "passive")
+			(tenting
+				(front none)
+				(back none)
+			)
+			(uuid "9ca1bbfd-3889-437a-b215-c45203243395")
+		)
+		(pad "2" smd roundrect
+			(at 1.4625 0)
+			(size 1.125 1.75)
+			(layers "F.Cu" "F.Mask" "F.Paste")
+			(roundrect_rratio 0.222222)
+			(net 8 "unconnected-(R2-Pad2)")
+			(pintype "passive")
+			(tenting
+				(front none)
+				(back none)
+			)
+			(uuid "9f379cee-b751-4845-be57-a3c685ad4072")
+		)
+		(embedded_fonts no)
+		(model "${KICAD8_3DMODEL_DIR}/Resistor_SMD.3dshapes/R_1206_3216Metric.wrl"
+			(offset
+				(xyz 0 0 0)
+			)
+			(scale
+				(xyz 1 1 1)
+			)
+			(rotate
+				(xyz 0 0 0)
+			)
+		)
+	)
+	(footprint "Resistor_SMD:R_0805_2012Metric"
+		(layer "F.Cu")
+		(uuid "bc38a3e8-8861-4809-a392-19708a7b4dac")
+		(at 87.4125 79)
+		(descr "Resistor SMD 0805 (2012 Metric), square (rectangular) end terminal, IPC_7351 nominal, (Body size source: IPC-SM-782 page 72, https://www.pcb-3d.com/wordpress/wp-content/uploads/ipc-sm-782a_amendment_1_and_2.pdf), generated with kicad-footprint-generator")
+		(tags "resistor")
+		(property "Reference" "R88"
+			(at 0 -1.65 0)
+			(layer "F.SilkS")
+			(uuid "afd1d8b3-aaa4-467b-b6df-2c5cb2709aff")
+			(effects
+				(font
+					(size 1 1)
+					(thickness 0.15)
+				)
+			)
+		)
+		(property "Value" "R_0805_2012Metric"
+			(at 0 1.65 0)
+			(layer "F.Fab")
+			(uuid "93b78388-f74d-4bc1-a7ce-9da051c4325f")
+			(effects
+				(font
+					(size 1 1)
+					(thickness 0.15)
+				)
+			)
+		)
+		(property "Datasheet" ""
+			(at 0 0 0)
+			(unlocked yes)
+			(layer "F.Fab")
+			(hide yes)
+			(uuid "fa5264b8-7605-47a0-b3be-ade6b4a26c74")
+			(effects
+				(font
+					(size 1.27 1.27)
+					(thickness 0.15)
+				)
+			)
+		)
+		(property "Description" ""
+			(at 0 0 0)
+			(unlocked yes)
+			(layer "F.Fab")
+			(hide yes)
+			(uuid "c89d2c96-9b67-4e79-9643-8e1b35ec2e0c")
+			(effects
+				(font
+					(size 1.27 1.27)
+					(thickness 0.15)
+				)
+			)
+		)
+		(attr smd)
+		(fp_line
+			(start -0.227064 -0.735)
+			(end 0.227064 -0.735)
+			(stroke
+				(width 0.12)
+				(type solid)
+			)
+			(layer "F.SilkS")
+			(uuid "85860814-e1ec-4c19-863d-75b18e09e462")
+		)
+		(fp_line
+			(start -0.227064 0.735)
+			(end 0.227064 0.735)
+			(stroke
+				(width 0.12)
+				(type solid)
+			)
+			(layer "F.SilkS")
+			(uuid "dd896ddc-c722-488b-8e79-8bdabe84519f")
+		)
+		(fp_line
+			(start -1.68 -0.95)
+			(end 1.68 -0.95)
+			(stroke
+				(width 0.05)
+				(type solid)
+			)
+			(layer "F.CrtYd")
+			(uuid "8baf50bd-d855-4ac8-acc9-f2fc1860fbc4")
+		)
+		(fp_line
+			(start -1.68 0.95)
+			(end -1.68 -0.95)
+			(stroke
+				(width 0.05)
+				(type solid)
+			)
+			(layer "F.CrtYd")
+			(uuid "8c881442-4106-4584-bef4-6fa47febc9f4")
+		)
+		(fp_line
+			(start 1.68 -0.95)
+			(end 1.68 0.95)
+			(stroke
+				(width 0.05)
+				(type solid)
+			)
+			(layer "F.CrtYd")
+			(uuid "d5d88b9e-38b0-4eb5-a1fb-49ded3e4e49b")
+		)
+		(fp_line
+			(start 1.68 0.95)
+			(end -1.68 0.95)
+			(stroke
+				(width 0.05)
+				(type solid)
+			)
+			(layer "F.CrtYd")
+			(uuid "f156b19a-0ff0-48fc-a32a-62ae6ca8d743")
+		)
+		(fp_line
+			(start -1 -0.625)
+			(end 1 -0.625)
+			(stroke
+				(width 0.1)
+				(type solid)
+			)
+			(layer "F.Fab")
+			(uuid "55635bcb-2c52-4e45-8d00-c941e0db3de8")
+		)
+		(fp_line
+			(start -1 0.625)
+			(end -1 -0.625)
+			(stroke
+				(width 0.1)
+				(type solid)
+			)
+			(layer "F.Fab")
+			(uuid "148df1a9-f5a5-4f18-9dc9-ea8ca45d0c3f")
+		)
+		(fp_line
+			(start 1 -0.625)
+			(end 1 0.625)
+			(stroke
+				(width 0.1)
+				(type solid)
+			)
+			(layer "F.Fab")
+			(uuid "3ff8686f-ad40-42de-9e0a-fee54979990e")
+		)
+		(fp_line
+			(start 1 0.625)
+			(end -1 0.625)
+			(stroke
+				(width 0.1)
+				(type solid)
+			)
+			(layer "F.Fab")
+			(uuid "5eb8363b-3991-42ae-bd16-85a60b2e3438")
+		)
+		(fp_text user "${REFERENCE}"
+			(at 0 0 0)
+			(layer "F.Fab")
+			(uuid "52b66be4-e273-42da-8908-75274c0fdec9")
+			(effects
+				(font
+					(size 0.5 0.5)
+					(thickness 0.08)
+				)
+			)
+		)
+		(pad "1" smd roundrect
+			(at -0.9125 0)
+			(size 1.025 1.4)
+			(layers "F.Cu" "F.Mask" "F.Paste")
+			(roundrect_rratio 0.243902)
+			(tenting
+				(front none)
+				(back none)
+			)
+			(uuid "535ee96d-6bf2-48aa-8e16-b88414e3063c")
+		)
+		(pad "2" smd roundrect
+			(at 0.9125 0)
+			(size 1.025 1.4)
+			(layers "F.Cu" "F.Mask" "F.Paste")
+			(roundrect_rratio 0.243902)
+			(tenting
+				(front none)
+				(back none)
+			)
+			(uuid "8c8e6b6d-353a-4a78-b41e-622fc46d7082")
+		)
+		(embedded_fonts no)
+		(model "${KICAD8_3DMODEL_DIR}/Resistor_SMD.3dshapes/R_0805_2012Metric.wrl"
+			(offset
+				(xyz 0 0 0)
+			)
+			(scale
+				(xyz 1 1 1)
+			)
+			(rotate
+				(xyz 0 0 0)
+			)
+		)
+	)
+	(footprint "Package_SO:MSOP-8_3x3mm_P0.65mm"
+		(layer "F.Cu")
+		(uuid "c23cd0d1-c94c-4103-8448-4bbee294e58f")
+		(at 171 86)
+		(descr "MSOP, 8 Pin (https://www.jedec.org/system/files/docs/mo-187F.pdf variant AA), generated with kicad-footprint-generator ipc_gullwing_generator.py")
+		(tags "MSOP SO")
+		(property "Reference" "U4"
+			(at 0 -2.45 0)
+			(layer "F.SilkS")
+			(uuid "3ee644a3-0afd-4d54-87ea-5b3bf0f28e9e")
+			(effects
+				(font
+					(size 1 1)
+					(thickness 0.15)
+				)
+			)
+		)
+		(property "Value" "MSOP-8_3x3mm_P0.65mm"
+			(at 0 2.45 0)
+			(layer "F.Fab")
+			(uuid "7e0d0d44-9b37-40bf-a47d-a82f5c7aca09")
+			(effects
+				(font
+					(size 1 1)
+					(thickness 0.15)
+				)
+			)
+		)
+		(property "Datasheet" ""
+			(at 0 0 0)
+			(layer "F.Fab")
+			(hide yes)
+			(uuid "ee7921c3-9e40-4032-aaac-b7dc5ff5423e")
+			(effects
+				(font
+					(size 1.27 1.27)
+					(thickness 0.15)
+				)
+			)
+		)
+		(property "Description" ""
+			(at 0 0 0)
+			(layer "F.Fab")
+			(hide yes)
+			(uuid "5abf5f1c-eb27-4c32-b80b-9243f8dd0b0b")
+			(effects
+				(font
+					(size 1.27 1.27)
+					(thickness 0.15)
+				)
+			)
+		)
+		(attr smd)
+		(fp_line
+			(start 0 -1.61)
+			(end -1.5 -1.61)
+			(stroke
+				(width 0.12)
+				(type solid)
+			)
+			(layer "F.SilkS")
+			(uuid "8a233ff6-5f6c-4f40-9498-03ee3d116b12")
+		)
+		(fp_line
+			(start 0 -1.61)
+			(end 1.5 -1.61)
+			(stroke
+				(width 0.12)
+				(type solid)
+			)
+			(layer "F.SilkS")
+			(uuid "4fbd7a92-1c67-432d-87ce-e66b1137d02a")
+		)
+		(fp_line
+			(start 0 1.61)
+			(end -1.5 1.61)
+			(stroke
+				(width 0.12)
+				(type solid)
+			)
+			(layer "F.SilkS")
+			(uuid "f05e3eb5-3b8d-4836-86cd-cbef2ccbe262")
+		)
+		(fp_line
+			(start 0 1.61)
+			(end 1.5 1.61)
+			(stroke
+				(width 0.12)
+				(type solid)
+			)
+			(layer "F.SilkS")
+			(uuid "c302a15a-fef6-4c3e-84cb-2bb50efa5cc5")
+		)
+		(fp_poly
+			(pts
+				(xy -2.2125 -1.435) (xy -2.4525 -1.765) (xy -1.9725 -1.765) (xy -2.2125 -1.435)
+			)
+			(stroke
+				(width 0.12)
+				(type solid)
+			)
+			(fill yes)
+			(layer "F.SilkS")
+			(uuid "7167174b-e6fb-464e-9df1-7d28ecdb147a")
+		)
+		(fp_line
+			(start -3.18 -1.75)
+			(end -3.18 1.75)
+			(stroke
+				(width 0.05)
+				(type solid)
+			)
+			(layer "F.CrtYd")
+			(uuid "b4c0106f-7939-431b-b30e-a82be8842aff")
+		)
+		(fp_line
+			(start -3.18 1.75)
+			(end 3.18 1.75)
+			(stroke
+				(width 0.05)
+				(type solid)
+			)
+			(layer "F.CrtYd")
+			(uuid "96b41e39-ac74-417f-9da3-55fa5d945c56")
+		)
+		(fp_line
+			(start 3.18 -1.75)
+			(end -3.18 -1.75)
+			(stroke
+				(width 0.05)
+				(type solid)
+			)
+			(layer "F.CrtYd")
+			(uuid "da6757e6-bd20-4cb4-8545-65b416c3a869")
+		)
+		(fp_line
+			(start 3.18 1.75)
+			(end 3.18 -1.75)
+			(stroke
+				(width 0.05)
+				(type solid)
+			)
+			(layer "F.CrtYd")
+			(uuid "ede335b9-7dc5-450d-a0ee-7a82190b7718")
+		)
+		(fp_line
+			(start -1.5 -0.75)
+			(end -0.75 -1.5)
+			(stroke
+				(width 0.1)
+				(type solid)
+			)
+			(layer "F.Fab")
+			(uuid "1926736c-6d3a-4a1f-8a87-06080dadaedb")
+		)
+		(fp_line
+			(start -1.5 1.5)
+			(end -1.5 -0.75)
+			(stroke
+				(width 0.1)
+				(type solid)
+			)
+			(layer "F.Fab")
+			(uuid "b8a20e8b-568f-4099-a991-d9744816a001")
+		)
+		(fp_line
+			(start -0.75 -1.5)
+			(end 1.5 -1.5)
+			(stroke
+				(width 0.1)
+				(type solid)
+			)
+			(layer "F.Fab")
+			(uuid "20c854ba-9cba-4569-8e0a-2f5ebde251ad")
+		)
+		(fp_line
+			(start 1.5 -1.5)
+			(end 1.5 1.5)
+			(stroke
+				(width 0.1)
+				(type solid)
+			)
+			(layer "F.Fab")
+			(uuid "5fde5708-dcd7-4b85-b3a5-c2c7c5ef2f65")
+		)
+		(fp_line
+			(start 1.5 1.5)
+			(end -1.5 1.5)
+			(stroke
+				(width 0.1)
+				(type solid)
+			)
+			(layer "F.Fab")
+			(uuid "93d6e007-e0e8-4d07-b8f2-834f4d59a9e4")
+		)
+		(fp_text user "${REFERENCE}"
+			(at 0 0 0)
+			(layer "F.Fab")
+			(uuid "af31fa45-0c30-4510-9c6c-9863aa3cdf87")
+			(effects
+				(font
+					(size 0.75 0.75)
+					(thickness 0.11)
+				)
+			)
+		)
+		(pad "1" smd roundrect
+			(at -2.1125 -0.975)
+			(size 1.625 0.4)
+			(layers "F.Cu" "F.Mask" "F.Paste")
+			(roundrect_rratio 0.25)
+			(tenting
+				(front none)
+				(back none)
+			)
+			(uuid "e65fff6e-a8f8-4e4c-9a8e-df5bee59d0b6")
+		)
+		(pad "2" smd roundrect
+			(at -2.1125 -0.325)
+			(size 1.625 0.4)
+			(layers "F.Cu" "F.Mask" "F.Paste")
+			(roundrect_rratio 0.25)
+			(tenting
+				(front none)
+				(back none)
+			)
+			(uuid "5aa816cb-e6a1-4500-8640-2d69dc776e00")
+		)
+		(pad "3" smd roundrect
+			(at -2.1125 0.325)
+			(size 1.625 0.4)
+			(layers "F.Cu" "F.Mask" "F.Paste")
+			(roundrect_rratio 0.25)
+			(tenting
+				(front none)
+				(back none)
+			)
+			(uuid "9115f640-f7be-4ac9-84a3-ff6816dc1697")
+		)
+		(pad "4" smd roundrect
+			(at -2.1125 0.975)
+			(size 1.625 0.4)
+			(layers "F.Cu" "F.Mask" "F.Paste")
+			(roundrect_rratio 0.25)
+			(tenting
+				(front none)
+				(back none)
+			)
+			(uuid "2dacb2f3-0d69-4a15-92f5-0771f59dd42a")
+		)
+		(pad "5" smd roundrect
+			(at 2.1125 0.975)
+			(size 1.625 0.4)
+			(layers "F.Cu" "F.Mask" "F.Paste")
+			(roundrect_rratio 0.25)
+			(tenting
+				(front none)
+				(back none)
+			)
+			(uuid "aa98d45e-1976-4985-bf02-f0f2afb34853")
+		)
+		(pad "6" smd roundrect
+			(at 2.1125 0.325)
+			(size 1.625 0.4)
+			(layers "F.Cu" "F.Mask" "F.Paste")
+			(roundrect_rratio 0.25)
+			(tenting
+				(front none)
+				(back none)
+			)
+			(uuid "fa6bb70b-637a-4c18-9e51-3af40cdcf47e")
+		)
+		(pad "7" smd roundrect
+			(at 2.1125 -0.325)
+			(size 1.625 0.4)
+			(layers "F.Cu" "F.Mask" "F.Paste")
+			(roundrect_rratio 0.25)
+			(tenting
+				(front none)
+				(back none)
+			)
+			(uuid "ffe983f0-7f2a-42c9-8ce4-2e1a0c3ec11b")
+		)
+		(pad "8" smd roundrect
+			(at 2.1125 -0.975)
+			(size 1.625 0.4)
+			(layers "F.Cu" "F.Mask" "F.Paste")
+			(roundrect_rratio 0.25)
+			(tenting
+				(front none)
+				(back none)
+			)
+			(uuid "97bb8e65-7dc0-4bac-b78b-a9e46a85fde9")
+		)
+		(embedded_fonts no)
+		(model "${KICAD8_3DMODEL_DIR}/Package_SO.3dshapes/MSOP-8_3x3mm_P0.65mm.wrl"
+			(offset
+				(xyz 0 0 0)
+			)
+			(scale
+				(xyz 1 1 1)
+			)
+			(rotate
+				(xyz 0 0 0)
+			)
+		)
+	)
+	(footprint "Package_SO:MSOP-8_3x3mm_P0.65mm"
+		(layer "F.Cu")
+		(uuid "dd1d3adf-bad6-4ef0-b056-88ba65648594")
+		(at 171 95)
+		(descr "MSOP, 8 Pin (https://www.jedec.org/system/files/docs/mo-187F.pdf variant AA), generated with kicad-footprint-generator ipc_gullwing_generator.py")
+		(tags "MSOP SO")
+		(property "Reference" "U55"
+			(at 0 -2.45 0)
+			(layer "F.SilkS")
+			(uuid "1cc4ab4f-bb87-4a60-88c8-daf9db8106d5")
+			(effects
+				(font
+					(size 1 1)
+					(thickness 0.15)
+				)
+			)
+		)
+		(property "Value" "MSOP-8_3x3mm_P0.65mm"
+			(at 0 2.45 0)
+			(layer "F.Fab")
+			(uuid "0c668c3d-99ee-4d61-929e-46fbe57c76e7")
+			(effects
+				(font
+					(size 1 1)
+					(thickness 0.15)
+				)
+			)
+		)
+		(property "Datasheet" ""
+			(at 0 0 0)
+			(layer "F.Fab")
+			(hide yes)
+			(uuid "93721926-9850-4e76-8e47-fda9428a532a")
+			(effects
+				(font
+					(size 1.27 1.27)
+					(thickness 0.15)
+				)
+			)
+		)
+		(property "Description" ""
+			(at 0 0 0)
+			(layer "F.Fab")
+			(hide yes)
+			(uuid "3a6637d8-f378-4828-977f-8c626af1b05b")
+			(effects
+				(font
+					(size 1.27 1.27)
+					(thickness 0.15)
+				)
+			)
+		)
+		(attr smd)
+		(fp_line
+			(start 0 -1.61)
+			(end -1.5 -1.61)
+			(stroke
+				(width 0.12)
+				(type solid)
+			)
+			(layer "F.SilkS")
+			(uuid "0d1dc2f3-f653-4dd7-a339-700a7fec7658")
+		)
+		(fp_line
+			(start 0 -1.61)
+			(end 1.5 -1.61)
+			(stroke
+				(width 0.12)
+				(type solid)
+			)
+			(layer "F.SilkS")
+			(uuid "b0e88d13-7787-4e22-9dba-2d3fb646589d")
+		)
+		(fp_line
+			(start 0 1.61)
+			(end -1.5 1.61)
+			(stroke
+				(width 0.12)
+				(type solid)
+			)
+			(layer "F.SilkS")
+			(uuid "c6be9291-4be1-4935-94ef-23b0e36450a9")
+		)
+		(fp_line
+			(start 0 1.61)
+			(end 1.5 1.61)
+			(stroke
+				(width 0.12)
+				(type solid)
+			)
+			(layer "F.SilkS")
+			(uuid "5194f9c9-e53d-4a90-bf9d-7b77cb4731dc")
+		)
+		(fp_poly
+			(pts
+				(xy -2.2125 -1.435) (xy -2.4525 -1.765) (xy -1.9725 -1.765) (xy -2.2125 -1.435)
+			)
+			(stroke
+				(width 0.12)
+				(type solid)
+			)
+			(fill yes)
+			(layer "F.SilkS")
+			(uuid "6ce11564-081f-48ae-9c47-dca26ac28d95")
+		)
+		(fp_line
+			(start -3.18 -1.75)
+			(end -3.18 1.75)
+			(stroke
+				(width 0.05)
+				(type solid)
+			)
+			(layer "F.CrtYd")
+			(uuid "65c9dbee-c94a-4849-acbe-f1820cb83b19")
+		)
+		(fp_line
+			(start -3.18 1.75)
+			(end 3.18 1.75)
+			(stroke
+				(width 0.05)
+				(type solid)
+			)
+			(layer "F.CrtYd")
+			(uuid "242dc59e-f846-45f2-89fb-cb3381d77e80")
+		)
+		(fp_line
+			(start 3.18 -1.75)
+			(end -3.18 -1.75)
+			(stroke
+				(width 0.05)
+				(type solid)
+			)
+			(layer "F.CrtYd")
+			(uuid "035b32ad-18b7-4c67-810e-ccc5365eff83")
+		)
+		(fp_line
+			(start 3.18 1.75)
+			(end 3.18 -1.75)
+			(stroke
+				(width 0.05)
+				(type solid)
+			)
+			(layer "F.CrtYd")
+			(uuid "4e135ab8-dba7-4984-8c46-43d46a5873fc")
+		)
+		(fp_line
+			(start -1.5 -0.75)
+			(end -0.75 -1.5)
+			(stroke
+				(width 0.1)
+				(type solid)
+			)
+			(layer "F.Fab")
+			(uuid "ef4e57c9-697c-4d38-81e0-b6c692c9bd15")
+		)
+		(fp_line
+			(start -1.5 1.5)
+			(end -1.5 -0.75)
+			(stroke
+				(width 0.1)
+				(type solid)
+			)
+			(layer "F.Fab")
+			(uuid "a21cb06c-b625-4c8c-97bc-9bada405dfd9")
+		)
+		(fp_line
+			(start -0.75 -1.5)
+			(end 1.5 -1.5)
+			(stroke
+				(width 0.1)
+				(type solid)
+			)
+			(layer "F.Fab")
+			(uuid "d414962b-3d93-4a51-8504-1f104fe64f09")
+		)
+		(fp_line
+			(start 1.5 -1.5)
+			(end 1.5 1.5)
+			(stroke
+				(width 0.1)
+				(type solid)
+			)
+			(layer "F.Fab")
+			(uuid "0875e206-05ed-4169-b3a5-22e3ceb12055")
+		)
+		(fp_line
+			(start 1.5 1.5)
+			(end -1.5 1.5)
+			(stroke
+				(width 0.1)
+				(type solid)
+			)
+			(layer "F.Fab")
+			(uuid "58d09196-b220-4adf-add4-472a9ddd2a13")
+		)
+		(fp_text user "${REFERENCE}"
+			(at 0 0 0)
+			(layer "F.Fab")
+			(uuid "31ca0c0c-2632-4a94-995e-1259d0ca718a")
+			(effects
+				(font
+					(size 0.75 0.75)
+					(thickness 0.11)
+				)
+			)
+		)
+		(pad "1" smd roundrect
+			(at -2.1125 -0.975)
+			(size 1.625 0.4)
+			(layers "F.Cu" "F.Mask" "F.Paste")
+			(roundrect_rratio 0.25)
+			(tenting
+				(front none)
+				(back none)
+			)
+			(uuid "6494e37c-3874-4450-a23f-c5f6e7e99dd9")
+		)
+		(pad "2" smd roundrect
+			(at -2.1125 -0.325)
+			(size 1.625 0.4)
+			(layers "F.Cu" "F.Mask" "F.Paste")
+			(roundrect_rratio 0.25)
+			(tenting
+				(front none)
+				(back none)
+			)
+			(uuid "b75236f9-9769-4878-9deb-8036840f7b6d")
+		)
+		(pad "3" smd roundrect
+			(at -2.1125 0.325)
+			(size 1.625 0.4)
+			(layers "F.Cu" "F.Mask" "F.Paste")
+			(roundrect_rratio 0.25)
+			(tenting
+				(front none)
+				(back none)
+			)
+			(uuid "e6d08ab8-b498-4e28-90ea-a9e8f68bf5dc")
+		)
+		(pad "4" smd roundrect
+			(at -2.1125 0.975)
+			(size 1.625 0.4)
+			(layers "F.Cu" "F.Mask" "F.Paste")
+			(roundrect_rratio 0.25)
+			(tenting
+				(front none)
+				(back none)
+			)
+			(uuid "53fd57c9-f68e-478e-8d21-0b6e19da90ba")
+		)
+		(pad "5" smd roundrect
+			(at 2.1125 0.975)
+			(size 1.625 0.4)
+			(layers "F.Cu" "F.Mask" "F.Paste")
+			(roundrect_rratio 0.25)
+			(tenting
+				(front none)
+				(back none)
+			)
+			(uuid "aa152cd2-362f-4abb-8594-f363d3a2ef41")
+		)
+		(pad "6" smd roundrect
+			(at 2.1125 0.325)
+			(size 1.625 0.4)
+			(layers "F.Cu" "F.Mask" "F.Paste")
+			(roundrect_rratio 0.25)
+			(tenting
+				(front none)
+				(back none)
+			)
+			(uuid "b4145500-d026-424f-9acc-8116d08ecb8d")
+		)
+		(pad "7" smd roundrect
+			(at 2.1125 -0.325)
+			(size 1.625 0.4)
+			(layers "F.Cu" "F.Mask" "F.Paste")
+			(roundrect_rratio 0.25)
+			(tenting
+				(front none)
+				(back none)
+			)
+			(uuid "09f58f37-d10b-4538-a35f-99ff4f4f0a85")
+		)
+		(pad "8" smd roundrect
+			(at 2.1125 -0.975)
+			(size 1.625 0.4)
+			(layers "F.Cu" "F.Mask" "F.Paste")
+			(roundrect_rratio 0.25)
+			(tenting
+				(front none)
+				(back none)
+			)
+			(uuid "6426af8b-6176-4922-b753-73697d9707ef")
+		)
+		(embedded_fonts no)
+		(model "${KICAD8_3DMODEL_DIR}/Package_SO.3dshapes/MSOP-8_3x3mm_P0.65mm.wrl"
+			(offset
+				(xyz 0 0 0)
+			)
+			(scale
+				(xyz 1 1 1)
+			)
+			(rotate
+				(xyz 0 0 0)
+			)
+		)
+	)
+	(footprint "Package_SO:MSOP-8_3x3mm_P0.65mm"
+		(layer "F.Cu")
+		(uuid "def61013-b20d-422a-8252-16de6514d1f9")
+		(at 171 105.5)
+		(descr "MSOP, 8 Pin (https://www.jedec.org/system/files/docs/mo-187F.pdf variant AA), generated with kicad-footprint-generator ipc_gullwing_generator.py")
+		(tags "MSOP SO")
+		(property "Reference" "U555"
+			(at 0 -2.45 0)
+			(layer "F.SilkS")
+			(uuid "4b318165-98b1-43d2-9e41-fcb71ff910c2")
+			(effects
+				(font
+					(size 1 1)
+					(thickness 0.15)
+				)
+			)
+		)
+		(property "Value" "MSOP-8_3x3mm_P0.65mm"
+			(at 0 2.45 0)
+			(layer "F.Fab")
+			(uuid "2111332b-7df9-47a8-a2ae-e4493f5f5655")
+			(effects
+				(font
+					(size 1 1)
+					(thickness 0.15)
+				)
+			)
+		)
+		(property "Datasheet" ""
+			(at 0 0 0)
+			(layer "F.Fab")
+			(hide yes)
+			(uuid "dd5b2b74-e7c0-4d2d-b2a5-a0b99ee97780")
+			(effects
+				(font
+					(size 1.27 1.27)
+					(thickness 0.15)
+				)
+			)
+		)
+		(property "Description" ""
+			(at 0 0 0)
+			(layer "F.Fab")
+			(hide yes)
+			(uuid "b611fe51-3d1e-4e63-86da-be84fc74fce0")
+			(effects
+				(font
+					(size 1.27 1.27)
+					(thickness 0.15)
+				)
+			)
+		)
+		(attr smd)
+		(fp_line
+			(start 0 -1.61)
+			(end -1.5 -1.61)
+			(stroke
+				(width 0.12)
+				(type solid)
+			)
+			(layer "F.SilkS")
+			(uuid "c9b105f9-b3ed-445e-8b6a-5a2a9b6d44c8")
+		)
+		(fp_line
+			(start 0 -1.61)
+			(end 1.5 -1.61)
+			(stroke
+				(width 0.12)
+				(type solid)
+			)
+			(layer "F.SilkS")
+			(uuid "9f97728c-910d-4f85-b6aa-1035c5ba47b2")
+		)
+		(fp_line
+			(start 0 1.61)
+			(end -1.5 1.61)
+			(stroke
+				(width 0.12)
+				(type solid)
+			)
+			(layer "F.SilkS")
+			(uuid "f0fd9037-61e3-4569-be72-4ba9bf26f614")
+		)
+		(fp_line
+			(start 0 1.61)
+			(end 1.5 1.61)
+			(stroke
+				(width 0.12)
+				(type solid)
+			)
+			(layer "F.SilkS")
+			(uuid "87da266d-c12a-4431-977c-8c7a7837d707")
+		)
+		(fp_poly
+			(pts
+				(xy -2.2125 -1.435) (xy -2.4525 -1.765) (xy -1.9725 -1.765) (xy -2.2125 -1.435)
+			)
+			(stroke
+				(width 0.12)
+				(type solid)
+			)
+			(fill yes)
+			(layer "F.SilkS")
+			(uuid "f4ed06b0-eae7-4062-86c2-6b533cf78ef5")
+		)
+		(fp_line
+			(start -3.18 -1.75)
+			(end -3.18 1.75)
+			(stroke
+				(width 0.05)
+				(type solid)
+			)
+			(layer "F.CrtYd")
+			(uuid "71f9d4a2-4c2a-4346-a53a-b7fe13e0beb8")
+		)
+		(fp_line
+			(start -3.18 1.75)
+			(end 3.18 1.75)
+			(stroke
+				(width 0.05)
+				(type solid)
+			)
+			(layer "F.CrtYd")
+			(uuid "8e4af227-6105-4c6d-919e-51e9380e378c")
+		)
+		(fp_line
+			(start 3.18 -1.75)
+			(end -3.18 -1.75)
+			(stroke
+				(width 0.05)
+				(type solid)
+			)
+			(layer "F.CrtYd")
+			(uuid "d5e923de-a82b-431d-8245-992a4f8cf5ef")
+		)
+		(fp_line
+			(start 3.18 1.75)
+			(end 3.18 -1.75)
+			(stroke
+				(width 0.05)
+				(type solid)
+			)
+			(layer "F.CrtYd")
+			(uuid "fdc953a2-bc30-449e-9fc8-144739877deb")
+		)
+		(fp_line
+			(start -1.5 -0.75)
+			(end -0.75 -1.5)
+			(stroke
+				(width 0.1)
+				(type solid)
+			)
+			(layer "F.Fab")
+			(uuid "a5d75465-231c-4700-90a9-7504ec6a01dc")
+		)
+		(fp_line
+			(start -1.5 1.5)
+			(end -1.5 -0.75)
+			(stroke
+				(width 0.1)
+				(type solid)
+			)
+			(layer "F.Fab")
+			(uuid "dd56b854-40d3-4db3-be18-27efd780cb83")
+		)
+		(fp_line
+			(start -0.75 -1.5)
+			(end 1.5 -1.5)
+			(stroke
+				(width 0.1)
+				(type solid)
+			)
+			(layer "F.Fab")
+			(uuid "58dfa318-9f00-44ee-8ae5-fd6ff757215c")
+		)
+		(fp_line
+			(start 1.5 -1.5)
+			(end 1.5 1.5)
+			(stroke
+				(width 0.1)
+				(type solid)
+			)
+			(layer "F.Fab")
+			(uuid "feb7ca5c-3260-4251-817e-d9e44d2dcf4e")
+		)
+		(fp_line
+			(start 1.5 1.5)
+			(end -1.5 1.5)
+			(stroke
+				(width 0.1)
+				(type solid)
+			)
+			(layer "F.Fab")
+			(uuid "5330fcdb-c801-48d5-9f2b-d90df1d0b86d")
+		)
+		(fp_text user "${REFERENCE}"
+			(at 0 0 0)
+			(layer "F.Fab")
+			(uuid "6ea8b185-2a8e-4d1a-bfa8-90ac9a6591aa")
+			(effects
+				(font
+					(size 0.75 0.75)
+					(thickness 0.11)
+				)
+			)
+		)
+		(pad "1" smd roundrect
+			(at -2.1125 -0.975)
+			(size 1.625 0.4)
+			(layers "F.Cu" "F.Mask" "F.Paste")
+			(roundrect_rratio 0.25)
+			(tenting
+				(front none)
+				(back none)
+			)
+			(uuid "c1df7a2e-179b-4454-b29c-0926de6a6006")
+		)
+		(pad "2" smd roundrect
+			(at -2.1125 -0.325)
+			(size 1.625 0.4)
+			(layers "F.Cu" "F.Mask" "F.Paste")
+			(roundrect_rratio 0.25)
+			(tenting
+				(front none)
+				(back none)
+			)
+			(uuid "35dbe1aa-8c75-4db9-9aef-332834c6b25b")
+		)
+		(pad "3" smd roundrect
+			(at -2.1125 0.325)
+			(size 1.625 0.4)
+			(layers "F.Cu" "F.Mask" "F.Paste")
+			(roundrect_rratio 0.25)
+			(tenting
+				(front none)
+				(back none)
+			)
+			(uuid "dee8e4bf-d83f-4755-ad4a-00239c20f8e4")
+		)
+		(pad "4" smd roundrect
+			(at -2.1125 0.975)
+			(size 1.625 0.4)
+			(layers "F.Cu" "F.Mask" "F.Paste")
+			(roundrect_rratio 0.25)
+			(tenting
+				(front none)
+				(back none)
+			)
+			(uuid "6cb3b4cb-d646-421d-a498-05c3cc501100")
+		)
+		(pad "5" smd roundrect
+			(at 2.1125 0.975)
+			(size 1.625 0.4)
+			(layers "F.Cu" "F.Mask" "F.Paste")
+			(roundrect_rratio 0.25)
+			(tenting
+				(front none)
+				(back none)
+			)
+			(uuid "047fc30c-309e-4bf9-bc11-7f731eea4a70")
+		)
+		(pad "6" smd roundrect
+			(at 2.1125 0.325)
+			(size 1.625 0.4)
+			(layers "F.Cu" "F.Mask" "F.Paste")
+			(roundrect_rratio 0.25)
+			(tenting
+				(front none)
+				(back none)
+			)
+			(uuid "f399d9a7-68f0-4c13-bca8-66feebcdc5e1")
+		)
+		(pad "7" smd roundrect
+			(at 2.1125 -0.325)
+			(size 1.625 0.4)
+			(layers "F.Cu" "F.Mask" "F.Paste")
+			(roundrect_rratio 0.25)
+			(tenting
+				(front none)
+				(back none)
+			)
+			(uuid "1902e43a-02a8-491e-9d6e-1139c8bac1ee")
+		)
+		(pad "8" smd roundrect
+			(at 2.1125 -0.975)
+			(size 1.625 0.4)
+			(layers "F.Cu" "F.Mask" "F.Paste")
+			(roundrect_rratio 0.25)
+			(tenting
+				(front none)
+				(back none)
+			)
+			(uuid "4d14e5ee-831f-4790-9b8e-b403d496e5c3")
+		)
+		(embedded_fonts no)
+		(model "${KICAD8_3DMODEL_DIR}/Package_SO.3dshapes/MSOP-8_3x3mm_P0.65mm.wrl"
+			(offset
+				(xyz 0 0 0)
+			)
+			(scale
+				(xyz 1 1 1)
+			)
+			(rotate
+				(xyz 0 0 0)
+			)
+		)
+	)
+	(footprint "Package_SO:MSOP-8_3x3mm_P0.65mm"
+		(layer "F.Cu")
+		(uuid "f4a5b291-5773-4706-80db-f4574b8eba87")
+		(at 171 75.5)
+		(descr "MSOP, 8 Pin (https://www.jedec.org/system/files/docs/mo-187F.pdf variant AA), generated with kicad-footprint-generator ipc_gullwing_generator.py")
+		(tags "MSOP SO")
+		(property "Reference" "U3"
+			(at 0 -2.45 0)
+			(layer "F.SilkS")
+			(uuid "92987383-c9d1-43ae-9970-5fbf653c02ce")
+			(effects
+				(font
+					(size 1 1)
+					(thickness 0.15)
+				)
+			)
+		)
+		(property "Value" "MSOP-8_3x3mm_P0.65mm"
+			(at 0 2.45 0)
+			(layer "F.Fab")
+			(uuid "b68aed9a-70ae-4b72-8ffb-ff3a8ad5225a")
+			(effects
+				(font
+					(size 1 1)
+					(thickness 0.15)
+				)
+			)
+		)
+		(property "Datasheet" ""
+			(at 0 0 0)
+			(layer "F.Fab")
+			(hide yes)
+			(uuid "a96d1072-a639-4c42-9587-827929cc0e18")
+			(effects
+				(font
+					(size 1.27 1.27)
+					(thickness 0.15)
+				)
+			)
+		)
+		(property "Description" ""
+			(at 0 0 0)
+			(layer "F.Fab")
+			(hide yes)
+			(uuid "8f62a733-bbf9-4561-aac7-f4dfc4e60a11")
+			(effects
+				(font
+					(size 1.27 1.27)
+					(thickness 0.15)
+				)
+			)
+		)
+		(attr smd)
+		(fp_line
+			(start 0 -1.61)
+			(end -1.5 -1.61)
+			(stroke
+				(width 0.12)
+				(type solid)
+			)
+			(layer "F.SilkS")
+			(uuid "fc62a11e-cbd7-47fb-81eb-68bc429dafe6")
+		)
+		(fp_line
+			(start 0 -1.61)
+			(end 1.5 -1.61)
+			(stroke
+				(width 0.12)
+				(type solid)
+			)
+			(layer "F.SilkS")
+			(uuid "c60a1a76-6903-4a21-ac50-a32d35fce124")
+		)
+		(fp_line
+			(start 0 1.61)
+			(end -1.5 1.61)
+			(stroke
+				(width 0.12)
+				(type solid)
+			)
+			(layer "F.SilkS")
+			(uuid "5756703b-8cf1-41b1-81f1-efeeeac80b32")
+		)
+		(fp_line
+			(start 0 1.61)
+			(end 1.5 1.61)
+			(stroke
+				(width 0.12)
+				(type solid)
+			)
+			(layer "F.SilkS")
+			(uuid "3847defa-7d78-4250-b3e7-fda264f90454")
+		)
+		(fp_poly
+			(pts
+				(xy -2.2125 -1.435) (xy -2.4525 -1.765) (xy -1.9725 -1.765) (xy -2.2125 -1.435)
+			)
+			(stroke
+				(width 0.12)
+				(type solid)
+			)
+			(fill yes)
+			(layer "F.SilkS")
+			(uuid "1f9c1cc3-813b-4613-92f2-903c4aa4f7c9")
+		)
+		(fp_line
+			(start -3.18 -1.75)
+			(end -3.18 1.75)
+			(stroke
+				(width 0.05)
+				(type solid)
+			)
+			(layer "F.CrtYd")
+			(uuid "7f3dbead-f92e-4839-bddf-fad17329d73f")
+		)
+		(fp_line
+			(start -3.18 1.75)
+			(end 3.18 1.75)
+			(stroke
+				(width 0.05)
+				(type solid)
+			)
+			(layer "F.CrtYd")
+			(uuid "9c42bbdc-cc69-47a8-ac40-0e5aad387647")
+		)
+		(fp_line
+			(start 3.18 -1.75)
+			(end -3.18 -1.75)
+			(stroke
+				(width 0.05)
+				(type solid)
+			)
+			(layer "F.CrtYd")
+			(uuid "84ec0ceb-0355-44f2-9a59-e8e68517e9cb")
+		)
+		(fp_line
+			(start 3.18 1.75)
+			(end 3.18 -1.75)
+			(stroke
+				(width 0.05)
+				(type solid)
+			)
+			(layer "F.CrtYd")
+			(uuid "10d99c47-c57c-4bfe-b39e-fe34edbce376")
+		)
+		(fp_line
+			(start -1.5 -0.75)
+			(end -0.75 -1.5)
+			(stroke
+				(width 0.1)
+				(type solid)
+			)
+			(layer "F.Fab")
+			(uuid "4c3f6ac0-6008-47a0-85ee-4c21055e09e1")
+		)
+		(fp_line
+			(start -1.5 1.5)
+			(end -1.5 -0.75)
+			(stroke
+				(width 0.1)
+				(type solid)
+			)
+			(layer "F.Fab")
+			(uuid "4041a2b0-1b3f-4c46-b14a-b5006c3a8d1f")
+		)
+		(fp_line
+			(start -0.75 -1.5)
+			(end 1.5 -1.5)
+			(stroke
+				(width 0.1)
+				(type solid)
+			)
+			(layer "F.Fab")
+			(uuid "6a3c6931-4fbe-4041-902b-7ddf4259cb49")
+		)
+		(fp_line
+			(start 1.5 -1.5)
+			(end 1.5 1.5)
+			(stroke
+				(width 0.1)
+				(type solid)
+			)
+			(layer "F.Fab")
+			(uuid "6df3d6dc-a696-4cc3-ad36-c47771c2f584")
+		)
+		(fp_line
+			(start 1.5 1.5)
+			(end -1.5 1.5)
+			(stroke
+				(width 0.1)
+				(type solid)
+			)
+			(layer "F.Fab")
+			(uuid "fa2de77e-acba-4982-ac9d-b735b176ebf7")
+		)
+		(fp_text user "${REFERENCE}"
+			(at 0 0 0)
+			(layer "F.Fab")
+			(uuid "d8e58d05-8ac3-4830-a3e7-01fc54a91f0f")
+			(effects
+				(font
+					(size 0.75 0.75)
+					(thickness 0.11)
+				)
+			)
+		)
+		(pad "1" smd roundrect
+			(at -2.1125 -0.975)
+			(size 1.625 0.4)
+			(layers "F.Cu" "F.Mask" "F.Paste")
+			(roundrect_rratio 0.25)
+			(tenting
+				(front none)
+				(back none)
+			)
+			(uuid "226bbf0a-c65d-4335-9627-4720cb06ec54")
+		)
+		(pad "2" smd roundrect
+			(at -2.1125 -0.325)
+			(size 1.625 0.4)
+			(layers "F.Cu" "F.Mask" "F.Paste")
+			(roundrect_rratio 0.25)
+			(tenting
+				(front none)
+				(back none)
+			)
+			(uuid "c00aab31-574a-4fc1-867c-f98577aeb914")
+		)
+		(pad "3" smd roundrect
+			(at -2.1125 0.325)
+			(size 1.625 0.4)
+			(layers "F.Cu" "F.Mask" "F.Paste")
+			(roundrect_rratio 0.25)
+			(tenting
+				(front none)
+				(back none)
+			)
+			(uuid "527fda01-d8fb-4aab-be80-90d69a545dac")
+		)
+		(pad "4" smd roundrect
+			(at -2.1125 0.975)
+			(size 1.625 0.4)
+			(layers "F.Cu" "F.Mask" "F.Paste")
+			(roundrect_rratio 0.25)
+			(tenting
+				(front none)
+				(back none)
+			)
+			(uuid "bf44cfe6-6542-4f7b-bf01-01911c9066de")
+		)
+		(pad "5" smd roundrect
+			(at 2.1125 0.975)
+			(size 1.625 0.4)
+			(layers "F.Cu" "F.Mask" "F.Paste")
+			(roundrect_rratio 0.25)
+			(tenting
+				(front none)
+				(back none)
+			)
+			(uuid "794fd24f-49f4-4b7c-b63c-e9a18b0b6e8c")
+		)
+		(pad "6" smd roundrect
+			(at 2.1125 0.325)
+			(size 1.625 0.4)
+			(layers "F.Cu" "F.Mask" "F.Paste")
+			(roundrect_rratio 0.25)
+			(tenting
+				(front none)
+				(back none)
+			)
+			(uuid "52d4710b-208d-42ea-ad1d-206e26d7aa16")
+		)
+		(pad "7" smd roundrect
+			(at 2.1125 -0.325)
+			(size 1.625 0.4)
+			(layers "F.Cu" "F.Mask" "F.Paste")
+			(roundrect_rratio 0.25)
+			(tenting
+				(front none)
+				(back none)
+			)
+			(uuid "1d34f1d1-576d-4253-8e1b-894d1aec1790")
+		)
+		(pad "8" smd roundrect
+			(at 2.1125 -0.975)
+			(size 1.625 0.4)
+			(layers "F.Cu" "F.Mask" "F.Paste")
+			(roundrect_rratio 0.25)
+			(tenting
+				(front none)
+				(back none)
+			)
+			(uuid "175af230-3822-43c3-8edb-41aa349976e0")
+		)
+		(embedded_fonts no)
+		(model "${KICAD8_3DMODEL_DIR}/Package_SO.3dshapes/MSOP-8_3x3mm_P0.65mm.wrl"
+			(offset
+				(xyz 0 0 0)
+			)
+			(scale
+				(xyz 1 1 1)
+			)
+			(rotate
+				(xyz 0 0 0)
+			)
+		)
+	)
+	(footprint "Resistor_SMD:R_0805_2012Metric"
+		(layer "B.Cu")
+		(uuid "c941d594-abc5-48d7-8a1b-65d2b1197a94")
+		(at 85.5875 94.5 180)
+		(descr "Resistor SMD 0805 (2012 Metric), square (rectangular) end terminal, IPC_7351 nominal, (Body size source: IPC-SM-782 page 72, https://www.pcb-3d.com/wordpress/wp-content/uploads/ipc-sm-782a_amendment_1_and_2.pdf), generated with kicad-footprint-generator")
+		(tags "resistor")
+		(property "Reference" "R1"
+			(at 0 1.65 0)
+			(layer "B.SilkS")
+			(uuid "d47786d3-779a-4879-9855-10cdde79092c")
+			(effects
+				(font
+					(size 1 1)
+					(thickness 0.15)
+				)
+				(justify mirror)
+			)
+		)
+		(property "Value" "R"
+			(at 0 -1.65 0)
+			(layer "B.Fab")
+			(uuid "e318ecc6-e313-4ea6-9468-4be6a2182dd8")
+			(effects
+				(font
+					(size 1 1)
+					(thickness 0.15)
+				)
+				(justify mirror)
+			)
+		)
+		(property "Datasheet" ""
+			(at 0 0 0)
+			(unlocked yes)
+			(layer "B.Fab")
+			(hide yes)
+			(uuid "ef403127-dcde-418f-b11a-963ccf636d54")
+			(effects
+				(font
+					(size 1.27 1.27)
+					(thickness 0.15)
+				)
+				(justify mirror)
+			)
+		)
+		(property "Description" "Resistor"
+			(at 0 0 0)
+			(unlocked yes)
+			(layer "B.Fab")
+			(hide yes)
+			(uuid "a84dcd2a-31a4-4198-991d-b6f1794f3252")
+			(effects
+				(font
+					(size 1.27 1.27)
+					(thickness 0.15)
+				)
+				(justify mirror)
+			)
+		)
+		(component_classes
+			(class "CLASS_1")
+			(class "CLASS_2")
+		)
+		(property ki_fp_filters "R_*")
+		(path "/46977abc-c53a-4b10-a881-2435f24468fa")
+		(sheetname "/")
+		(sheetfile "component_classes.kicad_sch")
+		(attr smd)
+		(fp_line
+			(start -0.227064 0.735)
+			(end 0.227064 0.735)
+			(stroke
+				(width 0.12)
+				(type solid)
+			)
+			(layer "B.SilkS")
+			(uuid "839aff37-c9da-4f07-b8cd-934f36ead07a")
+		)
+		(fp_line
+			(start -0.227064 -0.735)
+			(end 0.227064 -0.735)
+			(stroke
+				(width 0.12)
+				(type solid)
+			)
+			(layer "B.SilkS")
+			(uuid "28f16ba2-350c-47ed-8e6d-f041e8e5c3da")
+		)
+		(fp_line
+			(start 1.68 0.95)
+			(end 1.68 -0.95)
+			(stroke
+				(width 0.05)
+				(type solid)
+			)
+			(layer "B.CrtYd")
+			(uuid "b826539d-bd28-40a0-b5a1-7b18c85e878a")
+		)
+		(fp_line
+			(start 1.68 -0.95)
+			(end -1.68 -0.95)
+			(stroke
+				(width 0.05)
+				(type solid)
+			)
+			(layer "B.CrtYd")
+			(uuid "31cc092c-264b-4303-9e0d-2a1fb45f929d")
+		)
+		(fp_line
+			(start -1.68 0.95)
+			(end 1.68 0.95)
+			(stroke
+				(width 0.05)
+				(type solid)
+			)
+			(layer "B.CrtYd")
+			(uuid "97f91eba-83ff-42ca-b5e4-682035cccb95")
+		)
+		(fp_line
+			(start -1.68 -0.95)
+			(end -1.68 0.95)
+			(stroke
+				(width 0.05)
+				(type solid)
+			)
+			(layer "B.CrtYd")
+			(uuid "b65dddf5-214b-40fd-b24e-0dbd21d2bbeb")
+		)
+		(fp_line
+			(start 1 0.625)
+			(end 1 -0.625)
+			(stroke
+				(width 0.1)
+				(type solid)
+			)
+			(layer "B.Fab")
+			(uuid "855e567b-e8fc-4f23-9a94-d93775bc7bfb")
+		)
+		(fp_line
+			(start 1 -0.625)
+			(end -1 -0.625)
+			(stroke
+				(width 0.1)
+				(type solid)
+			)
+			(layer "B.Fab")
+			(uuid "261bd9f2-415b-4da9-94d9-3d73ee3772c6")
+		)
+		(fp_line
+			(start -1 0.625)
+			(end 1 0.625)
+			(stroke
+				(width 0.1)
+				(type solid)
+			)
+			(layer "B.Fab")
+			(uuid "a636bedb-893e-472e-b645-32e4e019c2a5")
+		)
+		(fp_line
+			(start -1 -0.625)
+			(end -1 0.625)
+			(stroke
+				(width 0.1)
+				(type solid)
+			)
+			(layer "B.Fab")
+			(uuid "4eb60202-63fb-4660-a322-d6a7738c07b7")
+		)
+		(fp_text user "${REFERENCE}"
+			(at 0 0 0)
+			(layer "B.Fab")
+			(uuid "d5e1412d-5450-49c9-a799-666530b1f8a7")
+			(effects
+				(font
+					(size 0.5 0.5)
+					(thickness 0.08)
+				)
+				(justify mirror)
+			)
+		)
+		(pad "1" smd roundrect
+			(at -0.9125 0 180)
+			(size 1.025 1.4)
+			(layers "B.Cu" "B.Mask" "B.Paste")
+			(roundrect_rratio 0.243902)
+			(net 5 "unconnected-(R1-Pad1)")
+			(pintype "passive")
+			(tenting
+				(front none)
+				(back none)
+			)
+			(uuid "0b42bbaf-569d-4658-9499-e7114af8494f")
+		)
+		(pad "2" smd roundrect
+			(at 0.9125 0 180)
+			(size 1.025 1.4)
+			(layers "B.Cu" "B.Mask" "B.Paste")
+			(roundrect_rratio 0.243902)
+			(net 6 "unconnected-(R1-Pad2)")
+			(pintype "passive")
+			(tenting
+				(front none)
+				(back none)
+			)
+			(uuid "f611c416-e8db-4e40-ab69-718eb4a1f3a6")
+		)
+		(embedded_fonts no)
+		(model "${KICAD8_3DMODEL_DIR}/Resistor_SMD.3dshapes/R_0805_2012Metric.wrl"
+			(offset
+				(xyz 0 0 0)
+			)
+			(scale
+				(xyz 1 1 1)
+			)
+			(rotate
+				(xyz 0 0 0)
+			)
+		)
+	)
+	(footprint "Capacitor_SMD:C_0805_2012Metric"
+		(layer "B.Cu")
+		(uuid "e5973a8e-049d-44c8-9168-d318d202231e")
+		(at 87.45 56 180)
+		(descr "Capacitor SMD 0805 (2012 Metric), square (rectangular) end terminal, IPC_7351 nominal, (Body size source: IPC-SM-782 page 76, https://www.pcb-3d.com/wordpress/wp-content/uploads/ipc-sm-782a_amendment_1_and_2.pdf, https://docs.google.com/spreadsheets/d/1BsfQQcO9C6DZCsRaXUlFlo91Tg2WpOkGARC1WS5S8t0/edit?usp=sharing), generated with kicad-footprint-generator")
+		(tags "capacitor")
+		(property "Reference" "C2"
+			(at 0 1.68 0)
+			(layer "B.SilkS")
+			(uuid "a5927f2a-77e3-4afc-9616-c85b108026be")
+			(effects
+				(font
+					(size 1 1)
+					(thickness 0.15)
+				)
+				(justify mirror)
+			)
+		)
+		(property "Value" "C"
+			(at 0 -1.68 0)
+			(layer "B.Fab")
+			(uuid "cc6bd9a5-51df-434a-8433-f2f2a85b3051")
+			(effects
+				(font
+					(size 1 1)
+					(thickness 0.15)
+				)
+				(justify mirror)
+			)
+		)
+		(property "Datasheet" ""
+			(at 0 0 0)
+			(unlocked yes)
+			(layer "B.Fab")
+			(hide yes)
+			(uuid "b1bc6372-276e-4c7a-a3f3-0f0834d95e52")
+			(effects
+				(font
+					(size 1.27 1.27)
+					(thickness 0.15)
+				)
+				(justify mirror)
+			)
+		)
+		(property "Description" "Unpolarized capacitor"
+			(at 0 0 0)
+			(unlocked yes)
+			(layer "B.Fab")
+			(hide yes)
+			(uuid "3a9d39ff-357b-4a6f-bcfa-59e0b4ca9a7a")
+			(effects
+				(font
+					(size 1.27 1.27)
+					(thickness 0.15)
+				)
+				(justify mirror)
+			)
+		)
+		(component_classes
+			(class "CLASS_3")
+		)
+		(property ki_fp_filters "C_*")
+		(path "/efa7a2fa-3528-4332-b199-9931f7e1b80b")
+		(sheetname "/")
+		(sheetfile "component_classes.kicad_sch")
+		(attr smd)
+		(fp_line
+			(start -0.261252 0.735)
+			(end 0.261252 0.735)
+			(stroke
+				(width 0.12)
+				(type solid)
+			)
+			(layer "B.SilkS")
+			(uuid "43f71695-8dc6-4da3-919e-7081c78513f5")
+		)
+		(fp_line
+			(start -0.261252 -0.735)
+			(end 0.261252 -0.735)
+			(stroke
+				(width 0.12)
+				(type solid)
+			)
+			(layer "B.SilkS")
+			(uuid "3de3d64e-1437-4e5c-a5a9-fddbff089246")
+		)
+		(fp_line
+			(start 1.7 0.98)
+			(end 1.7 -0.98)
+			(stroke
+				(width 0.05)
+				(type solid)
+			)
+			(layer "B.CrtYd")
+			(uuid "1024e270-120d-4137-aafc-ec898671f198")
+		)
+		(fp_line
+			(start 1.7 -0.98)
+			(end -1.7 -0.98)
+			(stroke
+				(width 0.05)
+				(type solid)
+			)
+			(layer "B.CrtYd")
+			(uuid "d0809707-2e0e-47aa-a5d1-ba0a073fa8b0")
+		)
+		(fp_line
+			(start -1.7 0.98)
+			(end 1.7 0.98)
+			(stroke
+				(width 0.05)
+				(type solid)
+			)
+			(layer "B.CrtYd")
+			(uuid "9eb8b8fd-2b94-4156-8aca-1f45aca6c6c1")
+		)
+		(fp_line
+			(start -1.7 -0.98)
+			(end -1.7 0.98)
+			(stroke
+				(width 0.05)
+				(type solid)
+			)
+			(layer "B.CrtYd")
+			(uuid "f154f50f-3fc0-4a56-aa5d-706a3a30ccb0")
+		)
+		(fp_line
+			(start 1 0.625)
+			(end 1 -0.625)
+			(stroke
+				(width 0.1)
+				(type solid)
+			)
+			(layer "B.Fab")
+			(uuid "ffb6a014-0021-419d-a145-5a07eb441133")
+		)
+		(fp_line
+			(start 1 -0.625)
+			(end -1 -0.625)
+			(stroke
+				(width 0.1)
+				(type solid)
+			)
+			(layer "B.Fab")
+			(uuid "2e53f441-3318-4f0c-bd8a-42705105bd6e")
+		)
+		(fp_line
+			(start -1 0.625)
+			(end 1 0.625)
+			(stroke
+				(width 0.1)
+				(type solid)
+			)
+			(layer "B.Fab")
+			(uuid "9cb4ed0f-17c7-4a08-baa1-24c7cdd270bc")
+		)
+		(fp_line
+			(start -1 -0.625)
+			(end -1 0.625)
+			(stroke
+				(width 0.1)
+				(type solid)
+			)
+			(layer "B.Fab")
+			(uuid "722f3998-ecaf-40c2-b0b7-6b5a2ac9fc27")
+		)
+		(fp_text user "${REFERENCE}"
+			(at 0 0 0)
+			(layer "B.Fab")
+			(uuid "e60634c0-6e60-4100-8de1-ab11a78be59a")
+			(effects
+				(font
+					(size 0.5 0.5)
+					(thickness 0.08)
+				)
+				(justify mirror)
+			)
+		)
+		(pad "1" smd roundrect
+			(at -0.95 0 180)
+			(size 1 1.45)
+			(layers "B.Cu" "B.Mask" "B.Paste")
+			(roundrect_rratio 0.25)
+			(net 3 "unconnected-(C2-Pad1)")
+			(pintype "passive")
+			(tenting
+				(front none)
+				(back none)
+			)
+			(uuid "2951f2a9-27bd-4823-bbaf-8ad115020cda")
+		)
+		(pad "2" smd roundrect
+			(at 0.95 0 180)
+			(size 1 1.45)
+			(layers "B.Cu" "B.Mask" "B.Paste")
+			(roundrect_rratio 0.25)
+			(net 4 "unconnected-(C2-Pad2)")
+			(pintype "passive")
+			(tenting
+				(front none)
+				(back none)
+			)
+			(uuid "e2c52e34-2695-476b-a42d-df76a580a2c9")
+		)
+		(embedded_fonts no)
+		(model "${KICAD8_3DMODEL_DIR}/Capacitor_SMD.3dshapes/C_0805_2012Metric.wrl"
+			(offset
+				(xyz 0 0 0)
+			)
+			(scale
+				(xyz 1 1 1)
+			)
+			(rotate
+				(xyz 0 0 0)
+			)
+		)
+	)
+	(gr_text "Static class: <none>\nDynamic class: RES_2"
+		(at 96.9125 81 0)
+		(layer "Dwgs.User")
+		(uuid "3a7e76aa-a1ed-415d-9364-06bf8809be19")
+		(effects
+			(font
+				(size 1.5 1.5)
+				(thickness 0.3)
+				(bold yes)
+			)
+			(justify left bottom)
+		)
+	)
+	(gr_text "Static class: <none>\nDynamic class: MULTI_REF"
+		(at 186.5 76.5 0)
+		(layer "Dwgs.User")
+		(uuid "3fb9a105-5ff6-4c98-9ff5-7f5ea6177477")
+		(effects
+			(font
+				(size 1.5 1.5)
+				(thickness 0.3)
+				(bold yes)
+			)
+			(justify left bottom)
+		)
+	)
+	(gr_text "Static class: CLASS_1\nDynamic class: RES_1,RES_2,RES_4"
+		(at 96.5 96 0)
+		(layer "Dwgs.User")
+		(uuid "4a3bbda8-29bc-48e7-9569-8de216f0e495")
+		(effects
+			(font
+				(size 1.5 1.5)
+				(thickness 0.3)
+				(bold yes)
+			)
+			(justify left bottom)
+		)
+	)
+	(gr_text "Static class: CLASS_3\nDynamic class: CAP_2"
+		(at 92.5 57.5 0)
+		(layer "Dwgs.User")
+		(uuid "5f6bb301-2f2e-4da2-ad52-dddb04b85272")
+		(effects
+			(font
+				(size 1.5 1.5)
+				(thickness 0.3)
+				(bold yes)
+			)
+			(justify left bottom)
+		)
+	)
+	(gr_text "Static class: CLASS_1\nDynamic class: RES_1,RES_2,RES_3"
+		(at 97 88 0)
+		(layer "Dwgs.User")
+		(uuid "63d4f7b4-b59c-4a12-bbde-d0cc7a14d94f")
+		(effects
+			(font
+				(size 1.5 1.5)
+				(thickness 0.3)
+				(bold yes)
+			)
+			(justify left bottom)
+		)
+	)
+	(gr_text "Static class: <none>\nDynamic class: ANY"
+		(at 186.5 61.5 0)
+		(layer "Dwgs.User")
+		(uuid "747667b2-c709-4324-b580-b62fab37ba71")
+		(effects
+			(font
+				(size 1.5 1.5)
+				(thickness 0.3)
+				(bold yes)
+			)
+			(justify left bottom)
+		)
+	)
+	(gr_text "Static class: <none>\nDynamic class: ANY"
+		(at 186.5 50 0)
+		(layer "Dwgs.User")
+		(uuid "7f749d55-8cc2-4185-bfa3-ae6ce2cbb324")
+		(effects
+			(font
+				(size 1.5 1.5)
+				(thickness 0.3)
+				(bold yes)
+			)
+			(justify left bottom)
+		)
+	)
+	(gr_text "Static class: <none>\nDynamic class: RES_1,RES_2"
+		(at 96.9125 74 0)
+		(layer "Dwgs.User")
+		(uuid "8d7ebdd2-0c9a-40f0-8067-0b0db32e870c")
+		(effects
+			(font
+				(size 1.5 1.5)
+				(thickness 0.3)
+				(bold yes)
+			)
+			(justify left bottom)
+		)
+	)
+	(gr_text "Static class: <none>\nDynamic class: REF_WILDCARD2"
+		(at 186.5 107 0)
+		(layer "Dwgs.User")
+		(uuid "9f848f08-1987-4f50-a79e-7b004b17d701")
+		(effects
+			(font
+				(size 1.5 1.5)
+				(thickness 0.3)
+				(bold yes)
+			)
+			(justify left bottom)
+		)
+	)
+	(gr_text "Static class: <none>\nDynamic class: /SHEET1/,RES_1,RES_2"
+		(at 96 125 0)
+		(layer "Dwgs.User")
+		(uuid "a86af067-b292-4f06-827e-1cac3a2c9303")
+		(effects
+			(font
+				(size 1.5 1.5)
+				(thickness 0.3)
+				(bold yes)
+			)
+			(justify left bottom)
+		)
+	)
+	(gr_text "Static class: CLASS_3, CLASS_4\nDynamic class: CAP_1"
+		(at 92.5 48.5 0)
+		(layer "Dwgs.User")
+		(uuid "ac840a1b-97dc-4cff-a3ca-0d38a24a8ac0")
+		(effects
+			(font
+				(size 1.5 1.5)
+				(thickness 0.3)
+				(bold yes)
+			)
+			(justify left bottom)
+		)
+	)
+	(gr_text "Static class: <none>\nDynamic class: <none>"
+		(at 92.5 63.5 0)
+		(layer "Dwgs.User")
+		(uuid "cef64fb6-c151-493c-b1e6-3f79f8f47a58")
+		(effects
+			(font
+				(size 1.5 1.5)
+				(thickness 0.3)
+				(bold yes)
+			)
+			(justify left bottom)
+		)
+	)
+	(gr_text "Static class: <none>\nDynamic class: MULTI_REF"
+		(at 186.5 88 0)
+		(layer "Dwgs.User")
+		(uuid "e2586b3e-943d-49c4-ac3a-96ae19853e05")
+		(effects
+			(font
+				(size 1.5 1.5)
+				(thickness 0.3)
+				(bold yes)
+			)
+			(justify left bottom)
+		)
+	)
+	(gr_text "Static class: <none>\nDynamic class: REF_WILDCARD,REF_WILDCARD2"
+		(at 187 97.5 0)
+		(layer "Dwgs.User")
+		(uuid "f3c8b8c2-80a4-4f8e-8283-4a17ef6b3c71")
+		(effects
+			(font
+				(size 1.5 1.5)
+				(thickness 0.3)
+				(bold yes)
+			)
+			(justify left bottom)
+		)
+	)
+	(zone
+		(net 0)
+		(net_name "")
+		(layer "B.Cu")
+		(uuid "3120c473-15a4-4946-a9c1-b03a4711dbec")
+		(name "RULE_1")
+		(hatch edge 0.5)
+		(connect_pads
+			(clearance 0)
+		)
+		(min_thickness 0.25)
+		(filled_areas_thickness no)
+		(keepout
+			(tracks not_allowed)
+			(vias not_allowed)
+			(pads not_allowed)
+			(copperpour allowed)
+			(footprints allowed)
+		)
+		(placement
+			(enabled no)
+			(sheetname "/")
+		)
+		(fill
+			(thermal_gap 0.5)
+			(thermal_bridge_width 0.5)
+		)
+		(polygon
+			(pts
+				(xy 82 51.5) (xy 91.5 51.5) (xy 91.5 66.5) (xy 82 66.5)
+			)
+		)
+	)
+	(embedded_fonts no)
+)
diff --git a/qa/data/pcbnew/component_classes.kicad_pro b/qa/data/pcbnew/component_classes.kicad_pro
new file mode 100644
index 0000000000..dc346ed3bc
--- /dev/null
+++ b/qa/data/pcbnew/component_classes.kicad_pro
@@ -0,0 +1,761 @@
+{
+  "board": {
+    "3dviewports": [],
+    "design_settings": {
+      "defaults": {
+        "apply_defaults_to_fp_fields": false,
+        "apply_defaults_to_fp_shapes": false,
+        "apply_defaults_to_fp_text": false,
+        "board_outline_line_width": 0.05,
+        "copper_line_width": 0.2,
+        "copper_text_italic": false,
+        "copper_text_size_h": 1.5,
+        "copper_text_size_v": 1.5,
+        "copper_text_thickness": 0.3,
+        "copper_text_upright": false,
+        "courtyard_line_width": 0.05,
+        "dimension_precision": 4,
+        "dimension_units": 3,
+        "dimensions": {
+          "arrow_length": 1270000,
+          "extension_offset": 500000,
+          "keep_text_aligned": true,
+          "suppress_zeroes": true,
+          "text_position": 0,
+          "units_format": 0
+        },
+        "fab_line_width": 0.1,
+        "fab_text_italic": false,
+        "fab_text_size_h": 1.0,
+        "fab_text_size_v": 1.0,
+        "fab_text_thickness": 0.15,
+        "fab_text_upright": false,
+        "other_line_width": 0.1,
+        "other_text_italic": false,
+        "other_text_size_h": 1.0,
+        "other_text_size_v": 1.0,
+        "other_text_thickness": 0.15,
+        "other_text_upright": false,
+        "pads": {
+          "drill": 0.8,
+          "height": 1.27,
+          "width": 2.54
+        },
+        "silk_line_width": 0.1,
+        "silk_text_italic": false,
+        "silk_text_size_h": 1.0,
+        "silk_text_size_v": 1.0,
+        "silk_text_thickness": 0.1,
+        "silk_text_upright": false,
+        "zones": {
+          "min_clearance": 0.5
+        }
+      },
+      "diff_pair_dimensions": [],
+      "drc_exclusions": [],
+      "meta": {
+        "version": 2
+      },
+      "rule_severities": {
+        "annular_width": "error",
+        "clearance": "error",
+        "connection_width": "warning",
+        "copper_edge_clearance": "error",
+        "copper_sliver": "warning",
+        "courtyards_overlap": "error",
+        "creepage": "error",
+        "diff_pair_gap_out_of_range": "error",
+        "diff_pair_uncoupled_length_too_long": "error",
+        "drill_out_of_range": "error",
+        "duplicate_footprints": "warning",
+        "extra_footprint": "warning",
+        "footprint": "error",
+        "footprint_filters_mismatch": "ignore",
+        "footprint_symbol_mismatch": "warning",
+        "footprint_type_mismatch": "ignore",
+        "hole_clearance": "error",
+        "hole_to_hole": "warning",
+        "holes_co_located": "warning",
+        "invalid_outline": "error",
+        "isolated_copper": "warning",
+        "item_on_disabled_layer": "error",
+        "items_not_allowed": "error",
+        "length_out_of_range": "error",
+        "lib_footprint_issues": "warning",
+        "lib_footprint_mismatch": "warning",
+        "malformed_courtyard": "error",
+        "microvia_drill_out_of_range": "error",
+        "mirrored_text_on_front_layer": "warning",
+        "missing_courtyard": "ignore",
+        "missing_footprint": "warning",
+        "net_conflict": "warning",
+        "nonmirrored_text_on_back_layer": "warning",
+        "npth_inside_courtyard": "ignore",
+        "padstack": "warning",
+        "pth_inside_courtyard": "ignore",
+        "shorting_items": "error",
+        "silk_edge_clearance": "warning",
+        "silk_over_copper": "warning",
+        "silk_overlap": "warning",
+        "skew_out_of_range": "error",
+        "solder_mask_bridge": "error",
+        "starved_thermal": "error",
+        "text_height": "warning",
+        "text_on_edge_cuts": "error",
+        "text_thickness": "warning",
+        "through_hole_pad_without_hole": "error",
+        "too_many_vias": "error",
+        "track_angle": "error",
+        "track_dangling": "warning",
+        "track_segment_length": "error",
+        "track_width": "error",
+        "tracks_crossing": "error",
+        "unconnected_items": "error",
+        "unresolved_variable": "error",
+        "via_dangling": "warning",
+        "zones_intersect": "error"
+      },
+      "rules": {
+        "max_error": 0.005,
+        "min_clearance": 0.0,
+        "min_connection": 0.0,
+        "min_copper_edge_clearance": 0.5,
+        "min_groove_width": 0.0,
+        "min_hole_clearance": 0.25,
+        "min_hole_to_hole": 0.25,
+        "min_microvia_diameter": 0.2,
+        "min_microvia_drill": 0.1,
+        "min_resolved_spokes": 2,
+        "min_silk_clearance": 0.0,
+        "min_text_height": 0.8,
+        "min_text_thickness": 0.08,
+        "min_through_hole_diameter": 0.3,
+        "min_track_width": 0.0,
+        "min_via_annular_width": 0.1,
+        "min_via_diameter": 0.5,
+        "solder_mask_to_copper_clearance": 0.0,
+        "use_height_for_length_calcs": true
+      },
+      "teardrop_options": [
+        {
+          "td_onpthpad": true,
+          "td_onroundshapesonly": false,
+          "td_onsmdpad": true,
+          "td_ontrackend": false,
+          "td_onvia": true
+        }
+      ],
+      "teardrop_parameters": [
+        {
+          "td_allow_use_two_tracks": true,
+          "td_curve_segcount": 0,
+          "td_height_ratio": 1.0,
+          "td_length_ratio": 0.5,
+          "td_maxheight": 2.0,
+          "td_maxlen": 1.0,
+          "td_on_pad_in_zone": false,
+          "td_target_name": "td_round_shape",
+          "td_width_to_size_filter_ratio": 0.9
+        },
+        {
+          "td_allow_use_two_tracks": true,
+          "td_curve_segcount": 0,
+          "td_height_ratio": 1.0,
+          "td_length_ratio": 0.5,
+          "td_maxheight": 2.0,
+          "td_maxlen": 1.0,
+          "td_on_pad_in_zone": false,
+          "td_target_name": "td_rect_shape",
+          "td_width_to_size_filter_ratio": 0.9
+        },
+        {
+          "td_allow_use_two_tracks": true,
+          "td_curve_segcount": 0,
+          "td_height_ratio": 1.0,
+          "td_length_ratio": 0.5,
+          "td_maxheight": 2.0,
+          "td_maxlen": 1.0,
+          "td_on_pad_in_zone": false,
+          "td_target_name": "td_track_end",
+          "td_width_to_size_filter_ratio": 0.9
+        }
+      ],
+      "track_widths": [],
+      "tuning_pattern_settings": {
+        "diff_pair_defaults": {
+          "corner_radius_percentage": 80,
+          "corner_style": 1,
+          "max_amplitude": 1.0,
+          "min_amplitude": 0.2,
+          "single_sided": false,
+          "spacing": 1.0
+        },
+        "diff_pair_skew_defaults": {
+          "corner_radius_percentage": 80,
+          "corner_style": 1,
+          "max_amplitude": 1.0,
+          "min_amplitude": 0.2,
+          "single_sided": false,
+          "spacing": 0.6
+        },
+        "single_track_defaults": {
+          "corner_radius_percentage": 80,
+          "corner_style": 1,
+          "max_amplitude": 1.0,
+          "min_amplitude": 0.2,
+          "single_sided": false,
+          "spacing": 0.6
+        }
+      },
+      "via_dimensions": [],
+      "zones_allow_external_fillets": false
+    },
+    "ipc2581": {
+      "dist": "",
+      "distpn": "",
+      "internal_id": "",
+      "mfg": "",
+      "mpn": ""
+    },
+    "layer_pairs": [],
+    "layer_presets": [],
+    "viewports": []
+  },
+  "boards": [],
+  "component_class_settings": {
+    "assignments": [
+      {
+        "component_class": "CAP_1",
+        "conditions": {
+          "FOOTPRINT": {
+            "primary": "Capacitor_SMD:C_0805_2012Metric"
+          },
+          "FOOTPRINT_FIELD": {
+            "primary": "MY_FIELD",
+            "secondary": "MY_VALUE"
+          },
+          "REFERENCE": {
+            "primary": "C1"
+          },
+          "ROTATION": {
+            "primary": "90"
+          },
+          "SIDE": {
+            "primary": "Front"
+          }
+        },
+        "conditions_operator": "ALL"
+      },
+      {
+        "component_class": "CAP_2",
+        "conditions": {
+          "CUSTOM": {
+            "primary": "A.intersectsArea('RULE_1')"
+          },
+          "REFERENCE": {
+            "primary": "C?"
+          }
+        },
+        "conditions_operator": "ALL"
+      },
+      {
+        "component_class": "RES_1",
+        "conditions": {
+          "REFERENCE": {
+            "primary": "R?"
+          }
+        },
+        "conditions_operator": "ALL"
+      },
+      {
+        "component_class": "RES_2",
+        "conditions": {
+          "REFERENCE": {
+            "primary": "R*"
+          }
+        },
+        "conditions_operator": "ALL"
+      },
+      {
+        "component_class": "RES_3",
+        "conditions": {
+          "FOOTPRINT_FIELD": {
+            "primary": "FIELD_2",
+            "secondary": "ANOTHER*"
+          }
+        },
+        "conditions_operator": "ALL"
+      },
+      {
+        "component_class": "RES_4",
+        "conditions": {
+          "REFERENCE": {
+            "primary": "R1"
+          },
+          "ROTATION": {
+            "primary": "180"
+          },
+          "SIDE": {
+            "primary": "Back"
+          }
+        },
+        "conditions_operator": "ALL"
+      },
+      {
+        "component_class": "ANY",
+        "conditions": {
+          "FOOTPRINT_FIELD": {
+            "primary": "FIELD2",
+            "secondary": "VALUE"
+          },
+          "REFERENCE": {
+            "primary": "U1"
+          }
+        },
+        "conditions_operator": "ANY"
+      },
+      {
+        "component_class": "MULTI_REF",
+        "conditions": {
+          "REFERENCE": {
+            "primary": "U3,U4"
+          }
+        },
+        "conditions_operator": "ALL"
+      },
+      {
+        "component_class": "REF_WILDCARD",
+        "conditions": {
+          "REFERENCE": {
+            "primary": "U5?"
+          }
+        },
+        "conditions_operator": "ALL"
+      },
+      {
+        "component_class": "REF_WILDCARD2",
+        "conditions": {
+          "REFERENCE": {
+            "primary": "U5*"
+          }
+        },
+        "conditions_operator": "ALL"
+      }
+    ],
+    "meta": {
+      "version": 0
+    },
+    "sheet_component_classes": {
+      "enabled": true
+    }
+  },
+  "cvpcb": {
+    "equivalence_files": []
+  },
+  "erc": {
+    "erc_exclusions": [],
+    "meta": {
+      "version": 0
+    },
+    "pin_map": [
+      [
+        0,
+        0,
+        0,
+        0,
+        0,
+        0,
+        1,
+        0,
+        0,
+        0,
+        0,
+        2
+      ],
+      [
+        0,
+        2,
+        0,
+        1,
+        0,
+        0,
+        1,
+        0,
+        2,
+        2,
+        2,
+        2
+      ],
+      [
+        0,
+        0,
+        0,
+        0,
+        0,
+        0,
+        1,
+        0,
+        1,
+        0,
+        1,
+        2
+      ],
+      [
+        0,
+        1,
+        0,
+        0,
+        0,
+        0,
+        1,
+        1,
+        2,
+        1,
+        1,
+        2
+      ],
+      [
+        0,
+        0,
+        0,
+        0,
+        0,
+        0,
+        1,
+        0,
+        0,
+        0,
+        0,
+        2
+      ],
+      [
+        0,
+        0,
+        0,
+        0,
+        0,
+        0,
+        0,
+        0,
+        0,
+        0,
+        0,
+        2
+      ],
+      [
+        1,
+        1,
+        1,
+        1,
+        1,
+        0,
+        1,
+        1,
+        1,
+        1,
+        1,
+        2
+      ],
+      [
+        0,
+        0,
+        0,
+        1,
+        0,
+        0,
+        1,
+        0,
+        0,
+        0,
+        0,
+        2
+      ],
+      [
+        0,
+        2,
+        1,
+        2,
+        0,
+        0,
+        1,
+        0,
+        2,
+        2,
+        2,
+        2
+      ],
+      [
+        0,
+        2,
+        0,
+        1,
+        0,
+        0,
+        1,
+        0,
+        2,
+        0,
+        0,
+        2
+      ],
+      [
+        0,
+        2,
+        1,
+        1,
+        0,
+        0,
+        1,
+        0,
+        2,
+        0,
+        0,
+        2
+      ],
+      [
+        2,
+        2,
+        2,
+        2,
+        2,
+        2,
+        2,
+        2,
+        2,
+        2,
+        2,
+        2
+      ]
+    ],
+    "rule_severities": {
+      "bus_definition_conflict": "error",
+      "bus_entry_needed": "error",
+      "bus_to_bus_conflict": "error",
+      "bus_to_net_conflict": "error",
+      "different_unit_footprint": "error",
+      "different_unit_net": "error",
+      "duplicate_reference": "error",
+      "duplicate_sheet_names": "error",
+      "endpoint_off_grid": "warning",
+      "extra_units": "error",
+      "footprint_filter": "ignore",
+      "footprint_link_issues": "warning",
+      "four_way_junction": "ignore",
+      "global_label_dangling": "warning",
+      "hier_label_mismatch": "error",
+      "label_dangling": "error",
+      "label_multiple_wires": "warning",
+      "lib_symbol_issues": "warning",
+      "lib_symbol_mismatch": "warning",
+      "missing_bidi_pin": "warning",
+      "missing_input_pin": "warning",
+      "missing_power_pin": "error",
+      "missing_unit": "warning",
+      "multiple_net_names": "warning",
+      "net_not_bus_member": "warning",
+      "no_connect_connected": "warning",
+      "no_connect_dangling": "warning",
+      "pin_not_connected": "error",
+      "pin_not_driven": "error",
+      "pin_to_pin": "warning",
+      "power_pin_not_driven": "error",
+      "same_local_global_label": "warning",
+      "similar_label_and_power": "warning",
+      "similar_labels": "warning",
+      "similar_power": "warning",
+      "simulation_model_issue": "ignore",
+      "single_global_label": "ignore",
+      "unannotated": "error",
+      "unconnected_wire_endpoint": "warning",
+      "unit_value_mismatch": "error",
+      "unresolved_variable": "error",
+      "wire_dangling": "error"
+    }
+  },
+  "libraries": {
+    "pinned_footprint_libs": [],
+    "pinned_symbol_libs": []
+  },
+  "meta": {
+    "filename": "component_classes.kicad_pro",
+    "version": 3
+  },
+  "net_settings": {
+    "classes": [
+      {
+        "bus_width": 12,
+        "clearance": 0.2,
+        "diff_pair_gap": 0.25,
+        "diff_pair_via_gap": 0.25,
+        "diff_pair_width": 0.2,
+        "line_style": 0,
+        "microvia_diameter": 0.3,
+        "microvia_drill": 0.1,
+        "name": "Default",
+        "pcb_color": "rgba(0, 0, 0, 0.000)",
+        "priority": 2147483647,
+        "schematic_color": "rgba(0, 0, 0, 0.000)",
+        "track_width": 0.2,
+        "via_diameter": 0.6,
+        "via_drill": 0.3,
+        "wire_width": 6
+      }
+    ],
+    "meta": {
+      "version": 4
+    },
+    "net_colors": null,
+    "netclass_assignments": null,
+    "netclass_patterns": []
+  },
+  "pcbnew": {
+    "last_paths": {
+      "gencad": "",
+      "idf": "",
+      "netlist": "",
+      "plot": "",
+      "pos_files": "",
+      "specctra_dsn": "",
+      "step": "",
+      "svg": "",
+      "vrml": ""
+    },
+    "page_layout_descr_file": ""
+  },
+  "schematic": {
+    "annotate_start_num": 0,
+    "bom_export_filename": "${PROJECTNAME}.csv",
+    "bom_fmt_presets": [],
+    "bom_fmt_settings": {
+      "field_delimiter": ",",
+      "keep_line_breaks": false,
+      "keep_tabs": false,
+      "name": "CSV",
+      "ref_delimiter": ",",
+      "ref_range_delimiter": "",
+      "string_delimiter": "\""
+    },
+    "bom_presets": [],
+    "bom_settings": {
+      "exclude_dnp": false,
+      "fields_ordered": [
+        {
+          "group_by": false,
+          "label": "Reference",
+          "name": "Reference",
+          "show": true
+        },
+        {
+          "group_by": false,
+          "label": "Qty",
+          "name": "${QUANTITY}",
+          "show": true
+        },
+        {
+          "group_by": true,
+          "label": "Value",
+          "name": "Value",
+          "show": true
+        },
+        {
+          "group_by": true,
+          "label": "DNP",
+          "name": "${DNP}",
+          "show": true
+        },
+        {
+          "group_by": true,
+          "label": "Exclude from BOM",
+          "name": "${EXCLUDE_FROM_BOM}",
+          "show": true
+        },
+        {
+          "group_by": true,
+          "label": "Exclude from Board",
+          "name": "${EXCLUDE_FROM_BOARD}",
+          "show": true
+        },
+        {
+          "group_by": true,
+          "label": "Footprint",
+          "name": "Footprint",
+          "show": true
+        },
+        {
+          "group_by": false,
+          "label": "Datasheet",
+          "name": "Datasheet",
+          "show": true
+        },
+        {
+          "group_by": false,
+          "label": "Description",
+          "name": "Description",
+          "show": false
+        },
+        {
+          "group_by": false,
+          "label": "#",
+          "name": "${ITEM_NUMBER}",
+          "show": false
+        }
+      ],
+      "filter_string": "",
+      "group_symbols": true,
+      "include_excluded_from_bom": true,
+      "name": "",
+      "sort_asc": true,
+      "sort_field": "Reference"
+    },
+    "connection_grid_size": 50.0,
+    "drawing": {
+      "dashed_lines_dash_length_ratio": 12.0,
+      "dashed_lines_gap_length_ratio": 3.0,
+      "default_line_thickness": 6.0,
+      "default_text_size": 50.0,
+      "field_names": [],
+      "intersheets_ref_own_page": false,
+      "intersheets_ref_prefix": "",
+      "intersheets_ref_short": false,
+      "intersheets_ref_show": false,
+      "intersheets_ref_suffix": "",
+      "junction_size_choice": 3,
+      "label_size_ratio": 0.375,
+      "operating_point_overlay_i_precision": 3,
+      "operating_point_overlay_i_range": "~A",
+      "operating_point_overlay_v_precision": 3,
+      "operating_point_overlay_v_range": "~V",
+      "overbar_offset_ratio": 1.23,
+      "pin_symbol_size": 25.0,
+      "text_offset_ratio": 0.15
+    },
+    "legacy_lib_dir": "",
+    "legacy_lib_list": [],
+    "meta": {
+      "version": 1
+    },
+    "net_format_name": "",
+    "page_layout_descr_file": "",
+    "plot_directory": "",
+    "space_save_all_events": true,
+    "spice_current_sheet_as_root": false,
+    "spice_external_command": "spice \"%I\"",
+    "spice_model_current_sheet_as_root": true,
+    "spice_save_all_currents": false,
+    "spice_save_all_dissipations": false,
+    "spice_save_all_voltages": false,
+    "subpart_first_id": 65,
+    "subpart_id_separator": 0
+  },
+  "sheets": [
+    [
+      "d9ed75ce-7084-4177-b32b-fceb2cf7aac3",
+      "Root"
+    ],
+    [
+      "e826c7ec-b0cb-4f53-915d-da3597387304",
+      "SHEET1"
+    ]
+  ],
+  "text_variables": {}
+}
diff --git a/qa/data/pcbnew/component_classes.kicad_sch b/qa/data/pcbnew/component_classes.kicad_sch
new file mode 100644
index 0000000000..5b5c2b231f
--- /dev/null
+++ b/qa/data/pcbnew/component_classes.kicad_sch
@@ -0,0 +1,784 @@
+(kicad_sch
+	(version 20250227)
+	(generator "eeschema")
+	(generator_version "9.99")
+	(uuid "d9ed75ce-7084-4177-b32b-fceb2cf7aac3")
+	(paper "A4")
+	(lib_symbols
+		(symbol "Device:C"
+			(pin_numbers
+				(hide yes)
+			)
+			(pin_names
+				(offset 0.254)
+			)
+			(exclude_from_sim no)
+			(in_bom yes)
+			(on_board yes)
+			(property "Reference" "C"
+				(at 0.635 2.54 0)
+				(effects
+					(font
+						(size 1.27 1.27)
+					)
+					(justify left)
+				)
+			)
+			(property "Value" "C"
+				(at 0.635 -2.54 0)
+				(effects
+					(font
+						(size 1.27 1.27)
+					)
+					(justify left)
+				)
+			)
+			(property "Footprint" ""
+				(at 0.9652 -3.81 0)
+				(hide yes)
+				(effects
+					(font
+						(size 1.27 1.27)
+					)
+				)
+			)
+			(property "Datasheet" "~"
+				(at 0 0 0)
+				(hide yes)
+				(effects
+					(font
+						(size 1.27 1.27)
+					)
+				)
+			)
+			(property "Description" "Unpolarized capacitor"
+				(at 0 0 0)
+				(hide yes)
+				(effects
+					(font
+						(size 1.27 1.27)
+					)
+				)
+			)
+			(property "ki_keywords" "cap capacitor"
+				(at 0 0 0)
+				(hide yes)
+				(effects
+					(font
+						(size 1.27 1.27)
+					)
+				)
+			)
+			(property "ki_fp_filters" "C_*"
+				(at 0 0 0)
+				(hide yes)
+				(effects
+					(font
+						(size 1.27 1.27)
+					)
+				)
+			)
+			(symbol "C_0_1"
+				(polyline
+					(pts
+						(xy -2.032 0.762) (xy 2.032 0.762)
+					)
+					(stroke
+						(width 0.508)
+						(type default)
+					)
+					(fill
+						(type none)
+					)
+				)
+				(polyline
+					(pts
+						(xy -2.032 -0.762) (xy 2.032 -0.762)
+					)
+					(stroke
+						(width 0.508)
+						(type default)
+					)
+					(fill
+						(type none)
+					)
+				)
+			)
+			(symbol "C_1_1"
+				(pin passive line
+					(at 0 3.81 270)
+					(length 2.794)
+					(name "~"
+						(effects
+							(font
+								(size 1.27 1.27)
+							)
+						)
+					)
+					(number "1"
+						(effects
+							(font
+								(size 1.27 1.27)
+							)
+						)
+					)
+				)
+				(pin passive line
+					(at 0 -3.81 90)
+					(length 2.794)
+					(name "~"
+						(effects
+							(font
+								(size 1.27 1.27)
+							)
+						)
+					)
+					(number "2"
+						(effects
+							(font
+								(size 1.27 1.27)
+							)
+						)
+					)
+				)
+			)
+			(embedded_fonts no)
+		)
+		(symbol "Device:R"
+			(pin_numbers
+				(hide yes)
+			)
+			(pin_names
+				(offset 0)
+			)
+			(exclude_from_sim no)
+			(in_bom yes)
+			(on_board yes)
+			(property "Reference" "R"
+				(at 2.032 0 90)
+				(effects
+					(font
+						(size 1.27 1.27)
+					)
+				)
+			)
+			(property "Value" "R"
+				(at 0 0 90)
+				(effects
+					(font
+						(size 1.27 1.27)
+					)
+				)
+			)
+			(property "Footprint" ""
+				(at -1.778 0 90)
+				(hide yes)
+				(effects
+					(font
+						(size 1.27 1.27)
+					)
+				)
+			)
+			(property "Datasheet" "~"
+				(at 0 0 0)
+				(hide yes)
+				(effects
+					(font
+						(size 1.27 1.27)
+					)
+				)
+			)
+			(property "Description" "Resistor"
+				(at 0 0 0)
+				(hide yes)
+				(effects
+					(font
+						(size 1.27 1.27)
+					)
+				)
+			)
+			(property "ki_keywords" "R res resistor"
+				(at 0 0 0)
+				(hide yes)
+				(effects
+					(font
+						(size 1.27 1.27)
+					)
+				)
+			)
+			(property "ki_fp_filters" "R_*"
+				(at 0 0 0)
+				(hide yes)
+				(effects
+					(font
+						(size 1.27 1.27)
+					)
+				)
+			)
+			(symbol "R_0_1"
+				(rectangle
+					(start -1.016 -2.54)
+					(end 1.016 2.54)
+					(stroke
+						(width 0.254)
+						(type default)
+					)
+					(fill
+						(type none)
+					)
+				)
+			)
+			(symbol "R_1_1"
+				(pin passive line
+					(at 0 3.81 270)
+					(length 1.27)
+					(name "~"
+						(effects
+							(font
+								(size 1.27 1.27)
+							)
+						)
+					)
+					(number "1"
+						(effects
+							(font
+								(size 1.27 1.27)
+							)
+						)
+					)
+				)
+				(pin passive line
+					(at 0 -3.81 90)
+					(length 1.27)
+					(name "~"
+						(effects
+							(font
+								(size 1.27 1.27)
+							)
+						)
+					)
+					(number "2"
+						(effects
+							(font
+								(size 1.27 1.27)
+							)
+						)
+					)
+				)
+			)
+			(embedded_fonts no)
+		)
+	)
+	(rule_area
+		(polyline
+			(pts
+				(xy 59.69 54.61) (xy 71.12 54.61) (xy 71.12 68.58) (xy 59.69 68.58)
+			)
+			(stroke
+				(width 0)
+				(type dash)
+			)
+			(fill
+				(type none)
+			)
+			(uuid 60676821-919a-4f11-bd58-e337d82fbd8b)
+		)
+	)
+	(rule_area
+		(polyline
+			(pts
+				(xy 83.82 49.53) (xy 111.76 49.53) (xy 111.76 71.12) (xy 83.82 71.12)
+			)
+			(stroke
+				(width 0)
+				(type dash)
+			)
+			(fill
+				(type none)
+			)
+			(uuid a23b373f-8385-48e5-92cc-856340ee73bd)
+		)
+	)
+	(rule_area
+		(polyline
+			(pts
+				(xy 55.88 49.53) (xy 81.28 49.53) (xy 81.28 71.12) (xy 55.88 71.12)
+			)
+			(stroke
+				(width 0)
+				(type dash)
+			)
+			(fill
+				(type none)
+			)
+			(uuid bf519547-0f5f-46b4-89ee-2b48c33cd0fa)
+		)
+	)
+	(rule_area
+		(polyline
+			(pts
+				(xy 87.63 54.61) (xy 99.06 54.61) (xy 99.06 68.58) (xy 87.63 68.58)
+			)
+			(stroke
+				(width 0)
+				(type dash)
+			)
+			(fill
+				(type none)
+			)
+			(uuid cbff79ad-6039-46f6-903e-1814abb160d6)
+		)
+	)
+	(netclass_flag ""
+		(length 2.54)
+		(shape round)
+		(at 60.96 54.61 0)
+		(fields_autoplaced yes)
+		(effects
+			(font
+				(size 1.27 1.27)
+			)
+			(justify left bottom)
+		)
+		(uuid "95ce2569-329d-4346-bbd4-b51dfac2d0ae")
+		(property "Net Class" ""
+			(at -93.98 -5.08 0)
+			(effects
+				(font
+					(size 1.27 1.27)
+				)
+			)
+		)
+		(property "Component Class" "CLASS_2"
+			(at 61.6585 52.07 0)
+			(effects
+				(font
+					(size 1.27 1.27)
+					(italic yes)
+				)
+				(justify left)
+			)
+		)
+	)
+	(netclass_flag ""
+		(length 2.54)
+		(shape round)
+		(at 88.9 54.61 0)
+		(fields_autoplaced yes)
+		(effects
+			(font
+				(size 1.27 1.27)
+			)
+			(justify left bottom)
+		)
+		(uuid "aee35f39-27b9-471a-86b7-d88f529d2361")
+		(property "Net Class" ""
+			(at -66.04 -5.08 0)
+			(effects
+				(font
+					(size 1.27 1.27)
+				)
+			)
+		)
+		(property "Component Class" "CLASS_4"
+			(at 89.5985 52.07 0)
+			(effects
+				(font
+					(size 1.27 1.27)
+					(italic yes)
+				)
+				(justify left)
+			)
+		)
+	)
+	(netclass_flag ""
+		(length 2.54)
+		(shape round)
+		(at 57.15 49.53 0)
+		(fields_autoplaced yes)
+		(effects
+			(font
+				(size 1.27 1.27)
+			)
+			(justify left bottom)
+		)
+		(uuid "dbcaa6d2-dcb9-4a23-9e8c-5540859c5c95")
+		(property "Net Class" ""
+			(at -97.79 -10.16 0)
+			(effects
+				(font
+					(size 1.27 1.27)
+				)
+			)
+		)
+		(property "Component Class" "CLASS_1"
+			(at 57.8485 46.99 0)
+			(effects
+				(font
+					(size 1.27 1.27)
+					(italic yes)
+				)
+				(justify left)
+			)
+		)
+	)
+	(netclass_flag ""
+		(length 2.54)
+		(shape round)
+		(at 85.09 49.53 0)
+		(fields_autoplaced yes)
+		(effects
+			(font
+				(size 1.27 1.27)
+			)
+			(justify left bottom)
+		)
+		(uuid "ea51b758-1c26-4244-8696-148d5cd9f58c")
+		(property "Net Class" ""
+			(at -69.85 -10.16 0)
+			(effects
+				(font
+					(size 1.27 1.27)
+				)
+			)
+		)
+		(property "Component Class" "CLASS_3"
+			(at 85.7885 46.99 0)
+			(effects
+				(font
+					(size 1.27 1.27)
+					(italic yes)
+				)
+				(justify left)
+			)
+		)
+	)
+	(symbol
+		(lib_id "Device:R")
+		(at 64.77 60.96 0)
+		(unit 1)
+		(exclude_from_sim no)
+		(in_bom yes)
+		(on_board yes)
+		(dnp no)
+		(fields_autoplaced yes)
+		(uuid "46977abc-c53a-4b10-a881-2435f24468fa")
+		(property "Reference" "R1"
+			(at 67.31 59.6899 0)
+			(effects
+				(font
+					(size 1.27 1.27)
+				)
+				(justify left)
+			)
+		)
+		(property "Value" "R"
+			(at 67.31 62.2299 0)
+			(effects
+				(font
+					(size 1.27 1.27)
+				)
+				(justify left)
+			)
+		)
+		(property "Footprint" "Resistor_SMD:R_0805_2012Metric"
+			(at 62.992 60.96 90)
+			(hide yes)
+			(effects
+				(font
+					(size 1.27 1.27)
+				)
+			)
+		)
+		(property "Datasheet" "~"
+			(at 64.77 60.96 0)
+			(hide yes)
+			(effects
+				(font
+					(size 1.27 1.27)
+				)
+			)
+		)
+		(property "Description" "Resistor"
+			(at 64.77 60.96 0)
+			(hide yes)
+			(effects
+				(font
+					(size 1.27 1.27)
+				)
+			)
+		)
+		(pin "2"
+			(uuid "53eae49a-03b2-47c9-b978-836e854c42a1")
+		)
+		(pin "1"
+			(uuid "2dc56f9e-ed1a-423c-9716-246a54c077eb")
+		)
+		(instances
+			(project ""
+				(path "/d9ed75ce-7084-4177-b32b-fceb2cf7aac3"
+					(reference "R1")
+					(unit 1)
+				)
+			)
+		)
+	)
+	(symbol
+		(lib_id "Device:R")
+		(at 74.93 60.96 0)
+		(unit 1)
+		(exclude_from_sim no)
+		(in_bom yes)
+		(on_board yes)
+		(dnp no)
+		(fields_autoplaced yes)
+		(uuid "759e3836-df02-4bcc-823f-2488f4ccdc6a")
+		(property "Reference" "R2"
+			(at 77.47 59.6899 0)
+			(effects
+				(font
+					(size 1.27 1.27)
+				)
+				(justify left)
+			)
+		)
+		(property "Value" "R"
+			(at 77.47 62.2299 0)
+			(effects
+				(font
+					(size 1.27 1.27)
+				)
+				(justify left)
+			)
+		)
+		(property "Footprint" "Resistor_SMD:R_1206_3216Metric"
+			(at 73.152 60.96 90)
+			(hide yes)
+			(effects
+				(font
+					(size 1.27 1.27)
+				)
+			)
+		)
+		(property "Datasheet" "~"
+			(at 74.93 60.96 0)
+			(hide yes)
+			(effects
+				(font
+					(size 1.27 1.27)
+				)
+			)
+		)
+		(property "Description" "Resistor"
+			(at 74.93 60.96 0)
+			(hide yes)
+			(effects
+				(font
+					(size 1.27 1.27)
+				)
+			)
+		)
+		(pin "2"
+			(uuid "213fa619-1218-4639-837f-def396924d49")
+		)
+		(pin "1"
+			(uuid "3c26611e-5590-4cfc-9f38-c8d4c2888995")
+		)
+		(instances
+			(project "dynamic_component_class"
+				(path "/d9ed75ce-7084-4177-b32b-fceb2cf7aac3"
+					(reference "R2")
+					(unit 1)
+				)
+			)
+		)
+	)
+	(symbol
+		(lib_id "Device:C")
+		(at 92.71 60.96 0)
+		(unit 1)
+		(exclude_from_sim no)
+		(in_bom yes)
+		(on_board yes)
+		(dnp no)
+		(fields_autoplaced yes)
+		(uuid "ad3cf5f9-5e65-46c9-bb23-770c50780b5d")
+		(property "Reference" "C1"
+			(at 96.52 59.6899 0)
+			(effects
+				(font
+					(size 1.27 1.27)
+				)
+				(justify left)
+			)
+		)
+		(property "Value" "C"
+			(at 96.52 62.2299 0)
+			(effects
+				(font
+					(size 1.27 1.27)
+				)
+				(justify left)
+			)
+		)
+		(property "Footprint" "Capacitor_SMD:C_0805_2012Metric"
+			(at 93.6752 64.77 0)
+			(hide yes)
+			(effects
+				(font
+					(size 1.27 1.27)
+				)
+			)
+		)
+		(property "Datasheet" "~"
+			(at 92.71 60.96 0)
+			(hide yes)
+			(effects
+				(font
+					(size 1.27 1.27)
+				)
+			)
+		)
+		(property "Description" "Unpolarized capacitor"
+			(at 92.71 60.96 0)
+			(hide yes)
+			(effects
+				(font
+					(size 1.27 1.27)
+				)
+			)
+		)
+		(pin "1"
+			(uuid "58054707-8b09-45ae-8013-e46b0d7e0c18")
+		)
+		(pin "2"
+			(uuid "6718e73b-d736-47bd-ad02-995313219a5c")
+		)
+		(instances
+			(project ""
+				(path "/d9ed75ce-7084-4177-b32b-fceb2cf7aac3"
+					(reference "C1")
+					(unit 1)
+				)
+			)
+		)
+	)
+	(symbol
+		(lib_id "Device:C")
+		(at 104.14 60.96 0)
+		(unit 1)
+		(exclude_from_sim no)
+		(in_bom yes)
+		(on_board yes)
+		(dnp no)
+		(fields_autoplaced yes)
+		(uuid "efa7a2fa-3528-4332-b199-9931f7e1b80b")
+		(property "Reference" "C2"
+			(at 107.95 59.6899 0)
+			(effects
+				(font
+					(size 1.27 1.27)
+				)
+				(justify left)
+			)
+		)
+		(property "Value" "C"
+			(at 107.95 62.2299 0)
+			(effects
+				(font
+					(size 1.27 1.27)
+				)
+				(justify left)
+			)
+		)
+		(property "Footprint" "Capacitor_SMD:C_0805_2012Metric"
+			(at 105.1052 64.77 0)
+			(hide yes)
+			(effects
+				(font
+					(size 1.27 1.27)
+				)
+			)
+		)
+		(property "Datasheet" "~"
+			(at 104.14 60.96 0)
+			(hide yes)
+			(effects
+				(font
+					(size 1.27 1.27)
+				)
+			)
+		)
+		(property "Description" "Unpolarized capacitor"
+			(at 104.14 60.96 0)
+			(hide yes)
+			(effects
+				(font
+					(size 1.27 1.27)
+				)
+			)
+		)
+		(pin "1"
+			(uuid "cb84c371-6a34-4196-b6f2-6452853b524b")
+		)
+		(pin "2"
+			(uuid "24d51371-3fd2-4d66-9272-f054638174b7")
+		)
+		(instances
+			(project "dynamic_component_class"
+				(path "/d9ed75ce-7084-4177-b32b-fceb2cf7aac3"
+					(reference "C2")
+					(unit 1)
+				)
+			)
+		)
+	)
+	(sheet
+		(at 148.59 40.64)
+		(size 46.99 41.91)
+		(exclude_from_sim no)
+		(in_bom yes)
+		(on_board yes)
+		(dnp no)
+		(fields_autoplaced yes)
+		(stroke
+			(width 0.1524)
+			(type solid)
+		)
+		(fill
+			(color 0 0 0 0.0000)
+		)
+		(uuid "e826c7ec-b0cb-4f53-915d-da3597387304")
+		(property "Sheetname" "SHEET1"
+			(at 148.59 39.9284 0)
+			(effects
+				(font
+					(size 1.27 1.27)
+				)
+				(justify left bottom)
+			)
+		)
+		(property "Sheetfile" "component_classes_sheet1.kicad_sch"
+			(at 148.59 83.1346 0)
+			(effects
+				(font
+					(size 1.27 1.27)
+				)
+				(justify left top)
+			)
+		)
+		(instances
+			(project "component_classes"
+				(path "/d9ed75ce-7084-4177-b32b-fceb2cf7aac3"
+					(page "2")
+				)
+			)
+		)
+	)
+	(sheet_instances
+		(path "/"
+			(page "1")
+		)
+	)
+	(embedded_fonts no)
+)
diff --git a/qa/pcbnew_utils/board_test_utils.cpp b/qa/pcbnew_utils/board_test_utils.cpp
index 5cd5b470c5..75d53513dd 100644
--- a/qa/pcbnew_utils/board_test_utils.cpp
+++ b/qa/pcbnew_utils/board_test_utils.cpp
@@ -38,6 +38,7 @@
 #include <pcb_shape.h>
 #include <zone.h>
 #include <zone_filler.h>
+#include <drc/drc_cache_generator.h>
 #include <pcbnew_utils/board_file_utils.h>
 #include <settings/settings_manager.h>
 #include <tool/tool_manager.h>
@@ -113,6 +114,16 @@ void LoadBoard( SETTINGS_MANAGER& aSettingsManager, const wxString& aRelPath,
     aBoard->GetDesignSettings().m_DRCEngine = m_DRCEngine;
     aBoard->BuildListOfNets();
     aBoard->BuildConnectivity();
+
+    if( aBoard->GetProject() )
+    {
+        std::unordered_set<wxString> dummy;
+        aBoard->SynchronizeComponentClasses( dummy );
+
+        DRC_CACHE_GENERATOR cacheGenerator;
+        cacheGenerator.SetDRCEngine( m_DRCEngine.get() );
+        cacheGenerator.Run();
+    }
 }
 
 
diff --git a/qa/tests/pcbnew/CMakeLists.txt b/qa/tests/pcbnew/CMakeLists.txt
index f7b4b2a028..885560d997 100644
--- a/qa/tests/pcbnew/CMakeLists.txt
+++ b/qa/tests/pcbnew/CMakeLists.txt
@@ -33,6 +33,7 @@ set( QA_PCBNEW_SRCS
     # test compilation units (start test_)
     test_array_pad_name_provider.cpp
     test_board_item.cpp
+    test_component_classes.cpp
     test_generator_load_save.cpp
     test_graphics_load_save.cpp
     test_graphics_import_mgr.cpp
diff --git a/qa/tests/pcbnew/test_component_classes.cpp b/qa/tests/pcbnew/test_component_classes.cpp
new file mode 100644
index 0000000000..01e8246591
--- /dev/null
+++ b/qa/tests/pcbnew/test_component_classes.cpp
@@ -0,0 +1,159 @@
+/*
+ * This program source code file is part of KiCad, a free EDA CAD application.
+ *
+ * Copyright The KiCad Developers, see AUTHORS.txt for contributors.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, you may find one here:
+ * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
+ * or you may search the http://www.gnu.org website for the version 2 license,
+ * or you may write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+ */
+
+#include <qa_utils/wx_utils/unit_test_utils.h>
+#include <pcbnew_utils/board_test_utils.h>
+#include <board.h>
+#include <board_design_settings.h>
+#include <component_classes/component_class.h>
+#include <pad.h>
+#include <pcb_track.h>
+#include <pcb_marker.h>
+#include <footprint.h>
+#include <drc/drc_item.h>
+#include <settings/settings_manager.h>
+
+
+struct PCB_COMPONENT_CLASS_FIXTURE
+{
+    PCB_COMPONENT_CLASS_FIXTURE() :
+            m_settingsManager( true /* headless */ )
+    { }
+
+    SETTINGS_MANAGER       m_settingsManager;
+    std::unique_ptr<BOARD> m_board;
+};
+
+
+BOOST_FIXTURE_TEST_CASE( ComponentClasses, PCB_COMPONENT_CLASS_FIXTURE )
+{
+    KI_TEST::LoadBoard( m_settingsManager, "component_classes", m_board );
+
+    std::vector<DRC_ITEM>  violations;
+    BOARD_DESIGN_SETTINGS& bds = m_board->GetDesignSettings();
+
+    std::vector<wxString> allClasses{ "ANY",          "CAP_1",         "CAP_2",   "CLASS_1",
+                                      "CLASS_2",      "CLASS_3",       "CLASS_4", "MULTI_REF",
+                                      "REF_WILDCARD", "REF_WILDCARD2", "RES_1",   "RES_2",
+                                      "RES_3",        "RES_4" };
+
+    auto testClasses = [&allClasses](const wxString& ref, const COMPONENT_CLASS* compClass, std::vector<wxString> assignedClasses)
+    {
+        std::vector<wxString> unassignedClasses;
+        std::ranges::set_difference(allClasses, assignedClasses, std::back_inserter(unassignedClasses));
+
+        for( const wxString& className : assignedClasses )
+        {
+            if( !compClass->ContainsClassName( className ) )
+            {
+                BOOST_ERROR( wxString::Format(
+                        "%s component class failed (%s expected but not found - full class %s)",
+                        ref, className, compClass->GetName() ) );
+            }
+        }
+
+        for( const wxString& className : unassignedClasses )
+        {
+            if( compClass->ContainsClassName( className ) )
+            {
+                BOOST_ERROR( wxString::Format(
+                        "%s component class failed (%s found but not expected - full class %s)",
+                        ref, className, compClass->GetName() ) );
+            }
+        }
+    };
+
+    for( const auto fp : m_board->Footprints() )
+    {
+        if( fp->Reference().GetText() == wxT( "C1" ) )
+        {
+            testClasses( "C1", fp->GetComponentClass(), {"CAP_1", "CLASS_3", "CLASS_4"});
+        }
+
+        if( fp->Reference().GetText() == wxT( "C2" ) )
+        {
+            testClasses( "C2", fp->GetComponentClass(), {"CAP_2", "CLASS_3"});
+        }
+
+        if( fp->Reference().GetText() == wxT( "C3" ) )
+        {
+            testClasses( "C2", fp->GetComponentClass(), {});
+        }
+
+        if( fp->Reference().GetText() == wxT( "R8" ) )
+        {
+            testClasses( "R8", fp->GetComponentClass(), {"RES_1", "RES_2"});
+        }
+
+        if( fp->Reference().GetText() == wxT( "R88" ) )
+        {
+            testClasses( "R88", fp->GetComponentClass(), {"RES_2"});
+        }
+
+        if( fp->Reference().GetText() == wxT( "R2" ) )
+        {
+            testClasses( "R2", fp->GetComponentClass(), {"CLASS_1", "RES_1", "RES_2", "RES_3"});
+        }
+
+        if( fp->Reference().GetText() == wxT( "R1" ) )
+        {
+            testClasses( "R1", fp->GetComponentClass(), {"CLASS_1", "CLASS_2", "RES_1", "RES_2", "RES_4"});
+        }
+
+        if( fp->Reference().GetText() == wxT( "U1" ) )
+        {
+            testClasses( "U1", fp->GetComponentClass(), { "ANY" } );
+        }
+
+        if( fp->Reference().GetText() == wxT( "U2" ) )
+        {
+            testClasses( "U2", fp->GetComponentClass(), { "ANY" } );
+        }
+
+        if( fp->Reference().GetText() == wxT( "U3" ) )
+        {
+            testClasses( "U3", fp->GetComponentClass(), { "MULTI_REF" } );
+        }
+
+        if( fp->Reference().GetText() == wxT( "U4" ) )
+        {
+            testClasses( "U4", fp->GetComponentClass(), { "MULTI_REF" } );
+        }
+
+        if( fp->Reference().GetText() == wxT( "U55" ) )
+        {
+            testClasses( "U55", fp->GetComponentClass(), { "REF_WILDCARD", "REF_WILDCARD2" } );
+        }
+
+        if( fp->Reference().GetText() == wxT( "U555" ) )
+        {
+            testClasses( "U555", fp->GetComponentClass(), { "REF_WILDCARD2" } );
+        }
+
+        if( fp->Reference().GetText() == wxT( "R3" ) )
+        {
+            testClasses( "R3", fp->GetComponentClass(), { "/SHEET1/", "RES_1", "RES_2" } );
+        }
+    }
+
+}