diff --git a/3d-viewer/3d_canvas/board_adapter.cpp b/3d-viewer/3d_canvas/board_adapter.cpp
index 3fc3a01956..87c998acee 100644
--- a/3d-viewer/3d_canvas/board_adapter.cpp
+++ b/3d-viewer/3d_canvas/board_adapter.cpp
@@ -852,7 +852,10 @@ std::bitset<LAYER_3D_END> BOARD_ADAPTER::GetVisibleLayers() const
             return ret;
 
         const PCB_PLOT_PARAMS& plotParams = m_board->GetPlotOptions();
-        LSET layers = plotParams.GetLayerSelection() | plotParams.GetPlotOnAllLayersSelection();
+        LSET                   layers = plotParams.GetLayerSelection();
+
+        for( PCB_LAYER_ID commonLayer : plotParams.GetPlotOnAllLayersSequence() )
+            layers.set( commonLayer );
 
         ret.set( LAYER_3D_BOARD,             true );
         ret.set( LAYER_3D_COPPER_TOP,        layers.test( F_Cu ) );
diff --git a/common/jobs/job_export_pcb_gerbers.cpp b/common/jobs/job_export_pcb_gerbers.cpp
index bd0df610a2..d51d8a540c 100644
--- a/common/jobs/job_export_pcb_gerbers.cpp
+++ b/common/jobs/job_export_pcb_gerbers.cpp
@@ -24,17 +24,9 @@
 
 JOB_EXPORT_PCB_GERBERS::JOB_EXPORT_PCB_GERBERS() :
         JOB_EXPORT_PCB_GERBER( "gerbers" ),
-        m_layersIncludeOnAll(),
-        m_layersIncludeOnAllSet( false ),
         m_useBoardPlotParams( false ),
         m_createJobsFile( true )
 {
-    m_params.emplace_back( new JOB_PARAM<bool>( "layers_include_on_all_set", &m_layersIncludeOnAllSet,
-                                                m_layersIncludeOnAllSet ) );
-
-    m_params.emplace_back( new JOB_PARAM_LSEQ( "layers_include_on_all", &m_layersIncludeOnAll,
-                                                m_layersIncludeOnAll ) );
-
     m_params.emplace_back( new JOB_PARAM<bool>( "create_gerber_job_file", &m_createJobsFile,
                                                 m_createJobsFile ) );
 }
diff --git a/common/jobs/job_export_pcb_gerbers.h b/common/jobs/job_export_pcb_gerbers.h
index 3dffaca5c4..f5ac8d4202 100644
--- a/common/jobs/job_export_pcb_gerbers.h
+++ b/common/jobs/job_export_pcb_gerbers.h
@@ -35,9 +35,6 @@ public:
     wxString GetDefaultDescription() const override;
     wxString GetSettingsDialogTitle() const override;
 
-    LSEQ m_layersIncludeOnAll;
-
-    bool m_layersIncludeOnAllSet;
     bool m_useBoardPlotParams;
 
     bool m_createJobsFile;
diff --git a/common/jobs/job_export_pcb_plot.cpp b/common/jobs/job_export_pcb_plot.cpp
index d82bf08681..1b04bcec4a 100644
--- a/common/jobs/job_export_pcb_plot.cpp
+++ b/common/jobs/job_export_pcb_plot.cpp
@@ -38,16 +38,17 @@ JOB_EXPORT_PCB_PLOT::JOB_EXPORT_PCB_PLOT( PLOT_FORMAT aFormat, const std::string
         m_plotDrawingSheet( true ),
         m_subtractSolderMaskFromSilk( false ),
         m_plotPadNumbers( false ),
-        m_printMaskLayer(),
-        m_printMaskLayersToIncludeOnAllLayers(),
+        m_plotLayerSequence(),
+        m_plotOnAllLayersSequence(),
         m_drillShapeOption( DRILL_MARKS::FULL_DRILL_SHAPE ),
         m_useDrillOrigin( false )
 {
-    m_params.emplace_back( new JOB_PARAM_LSEQ( "layers", &m_printMaskLayer, m_printMaskLayer ) );
+    m_params.emplace_back( new JOB_PARAM_LSEQ( "layers",
+                                               &m_plotLayerSequence, m_plotLayerSequence ) );
 
     m_params.emplace_back( new JOB_PARAM_LSEQ( "layers_to_include_on_all_layers",
-                                                &m_printMaskLayersToIncludeOnAllLayers,
-                                                m_printMaskLayersToIncludeOnAllLayers ) );
+                                                &m_plotOnAllLayersSequence,
+                                               m_plotOnAllLayersSequence ) );
 
     m_params.emplace_back( new JOB_PARAM<bool>( "mirror",
                                                 &m_mirror, m_mirror ) );
diff --git a/common/jobs/job_export_pcb_plot.h b/common/jobs/job_export_pcb_plot.h
index 7dd940573b..1a4c22ee54 100644
--- a/common/jobs/job_export_pcb_plot.h
+++ b/common/jobs/job_export_pcb_plot.h
@@ -66,9 +66,9 @@ public:
     bool m_subtractSolderMaskFromSilk;
     bool m_plotPadNumbers;
 
-    LSEQ m_printMaskLayer;
+    LSEQ m_plotLayerSequence;
     ///< Layers to include on all individual layer prints
-    LSEQ m_printMaskLayersToIncludeOnAllLayers;
+    LSEQ m_plotOnAllLayersSequence;
 
     enum class DRILL_MARKS
     {
diff --git a/kicad/cli/command_pcb_export_base.cpp b/kicad/cli/command_pcb_export_base.cpp
index 0375dee81d..ddf3aab05f 100644
--- a/kicad/cli/command_pcb_export_base.cpp
+++ b/kicad/cli/command_pcb_export_base.cpp
@@ -74,8 +74,7 @@ CLI::PCB_EXPORT_BASE_COMMAND::PCB_EXPORT_BASE_COMMAND( const std::string& aName,
 }
 
 
-LSEQ CLI::PCB_EXPORT_BASE_COMMAND::convertLayerStringList( wxString& aLayerString,
-                                                           bool& aLayerArgSet ) const
+LSEQ CLI::PCB_EXPORT_BASE_COMMAND::convertLayerStringList( wxString& aLayerString ) const
 {
     LSEQ layerMask;
 
@@ -92,16 +91,12 @@ LSEQ CLI::PCB_EXPORT_BASE_COMMAND::convertLayerStringList( wxString& aLayerStrin
             {
                 for( PCB_LAYER_ID layer : m_layerMasks.at( token ).Seq() )
                     layerMask.push_back( layer );
-
-                aLayerArgSet = true;
             }
             // Search for a layer name in canonical layer name used in GUI (not translated):
             else if( m_layerGuiMasks.count( token ) )
             {
                 for( PCB_LAYER_ID layer : m_layerGuiMasks.at( token ).Seq() )
                     layerMask.push_back( layer );
-
-                aLayerArgSet = true;
             }
             else
             {
@@ -134,7 +129,7 @@ int CLI::PCB_EXPORT_BASE_COMMAND::doPerform( KIWAY& aKiway )
     {
         wxString layers = From_UTF8( m_argParser.get<std::string>( ARG_LAYERS ).c_str() );
 
-        LSEQ layerMask = convertLayerStringList( layers, m_selectedLayersSet );
+        LSEQ layerMask = convertLayerStringList( layers );
 
         if( m_requireLayers && layerMask.size() < 1 )
         {
diff --git a/kicad/cli/command_pcb_export_base.h b/kicad/cli/command_pcb_export_base.h
index 519bd0cad1..f7accb3e54 100644
--- a/kicad/cli/command_pcb_export_base.h
+++ b/kicad/cli/command_pcb_export_base.h
@@ -75,7 +75,7 @@ struct PCB_EXPORT_BASE_COMMAND : public COMMAND
 
 protected:
     int  doPerform( KIWAY& aKiway ) override;
-    LSEQ convertLayerStringList( wxString& aLayerString, bool& aLayerArgSet ) const;
+    LSEQ convertLayerStringList( wxString& aLayerString ) const;
     void addLayerArg( bool aRequire );
 
     // The list of canonical layer names used in .kicad_pcb files:
diff --git a/kicad/cli/command_pcb_export_dxf.cpp b/kicad/cli/command_pcb_export_dxf.cpp
index 8019cf0e20..c67f6d7453 100644
--- a/kicad/cli/command_pcb_export_dxf.cpp
+++ b/kicad/cli/command_pcb_export_dxf.cpp
@@ -99,8 +99,7 @@ CLI::PCB_EXPORT_DXF_COMMAND::PCB_EXPORT_DXF_COMMAND() : PCB_EXPORT_BASE_COMMAND(
             .default_value( std::string() )
             .help( UTF8STDSTR(
                     _( "Layers to include on each plot, comma separated list of untranslated "
-                       "layer names to include such as "
-                       "F.Cu,B.Cu" ) ) )
+                       "layer names to include such as F.Cu,B.Cu" ) ) )
             .metavar( "COMMON_LAYER_LIST" );
 
     m_argParser.add_argument( ARG_MODE_SINGLE )
@@ -175,11 +174,10 @@ int CLI::PCB_EXPORT_DXF_COMMAND::doPerform( KIWAY& aKiway )
         return EXIT_CODES::ERR_ARGS;
     }
 
-    dxfJob->m_printMaskLayer = m_selectedLayers;
+    dxfJob->m_plotLayerSequence = m_selectedLayers;
 
     wxString layers = From_UTF8( m_argParser.get<std::string>( ARG_COMMON_LAYERS ).c_str() );
-    bool     blah = false;
-    dxfJob->m_printMaskLayersToIncludeOnAllLayers = convertLayerStringList( layers, blah );
+    dxfJob->m_plotOnAllLayersSequence = convertLayerStringList( layers );
 
     if( m_argParser.get<bool>( ARG_MODE_MULTI ) )
         dxfJob->m_genMode = JOB_EXPORT_PCB_DXF::GEN_MODE::MULTI;
diff --git a/kicad/cli/command_pcb_export_gerber.cpp b/kicad/cli/command_pcb_export_gerber.cpp
index ebe6aa6da0..c76fc5b9a5 100644
--- a/kicad/cli/command_pcb_export_gerber.cpp
+++ b/kicad/cli/command_pcb_export_gerber.cpp
@@ -29,7 +29,7 @@
 #include <wx/tokenzr.h>
 
 #include <locale_io.h>
-
+#include <string_utils.h>
 
 
 CLI::PCB_EXPORT_GERBER_COMMAND::PCB_EXPORT_GERBER_COMMAND( const std::string& aName ) :
@@ -90,6 +90,13 @@ CLI::PCB_EXPORT_GERBER_COMMAND::PCB_EXPORT_GERBER_COMMAND( const std::string& aN
             .help( UTF8STDSTR( _( "Use drill/place file origin" ) ) )
             .flag();
 
+    m_argParser.add_argument( "--cl", ARG_COMMON_LAYERS )
+            .default_value( std::string() )
+            .help( UTF8STDSTR(
+                    _( "Layers to include on each plot, comma separated list of untranslated "
+                       "layer names to include such as F.Cu,B.Cu" ) ) )
+            .metavar( "COMMON_LAYER_LIST" );
+
     m_argParser.add_argument( ARG_PRECISION )
             .help( UTF8STDSTR( _( "Precision of Gerber coordinates, valid options: 5 or 6" ) ) )
             .scan<'i', int>()
@@ -106,7 +113,8 @@ CLI::PCB_EXPORT_GERBER_COMMAND::PCB_EXPORT_GERBER_COMMAND( const std::string& aN
 }
 
 
-CLI::PCB_EXPORT_GERBER_COMMAND::PCB_EXPORT_GERBER_COMMAND() : PCB_EXPORT_GERBER_COMMAND( "gerber" )
+CLI::PCB_EXPORT_GERBER_COMMAND::PCB_EXPORT_GERBER_COMMAND() :
+        PCB_EXPORT_GERBER_COMMAND( "gerber" )
 {
 }
 
@@ -132,7 +140,10 @@ int CLI::PCB_EXPORT_GERBER_COMMAND::populateJob( JOB_EXPORT_PCB_GERBER* aJob )
     aJob->m_useDrillOrigin = m_argParser.get<bool>( ARG_USE_DRILL_FILE_ORIGIN );
     aJob->m_useProtelFileExtension = !m_argParser.get<bool>( ARG_NO_PROTEL_EXTENSION );
     aJob->m_precision = m_argParser.get<int>( ARG_PRECISION );
-    aJob->m_printMaskLayer = m_selectedLayers;
+    aJob->m_plotLayerSequence = m_selectedLayers;
+
+    wxString layers = From_UTF8( m_argParser.get<std::string>( ARG_COMMON_LAYERS ).c_str() );
+    aJob->m_plotOnAllLayersSequence = convertLayerStringList( layers );
 
     if( m_argParser.get<bool>( DEPRECATED_ARG_PLOT_INVISIBLE_TEXT ) )
         wxFprintf( stdout, DEPRECATED_ARD_PLOT_INVISIBLE_TEXT_WARNING );
diff --git a/kicad/cli/command_pcb_export_gerbers.cpp b/kicad/cli/command_pcb_export_gerbers.cpp
index 347fec843e..694f87d4d8 100644
--- a/kicad/cli/command_pcb_export_gerbers.cpp
+++ b/kicad/cli/command_pcb_export_gerbers.cpp
@@ -72,8 +72,7 @@ int CLI::PCB_EXPORT_GERBERS_COMMAND::doPerform( KIWAY& aKiway )
         return exitCode;
 
     wxString layers = From_UTF8( m_argParser.get<std::string>( ARG_COMMON_LAYERS ).c_str() );
-    gerberJob->m_layersIncludeOnAll =
-            convertLayerStringList( layers, gerberJob->m_layersIncludeOnAllSet );
+    gerberJob->m_plotOnAllLayersSequence = convertLayerStringList( layers );
     gerberJob->m_useBoardPlotParams = m_argParser.get<bool>( ARG_USE_BOARD_PLOT_PARAMS );
 
     LOCALE_IO dummy;
diff --git a/kicad/cli/command_pcb_export_pdf.cpp b/kicad/cli/command_pcb_export_pdf.cpp
index a430b8bacc..a43933253b 100644
--- a/kicad/cli/command_pcb_export_pdf.cpp
+++ b/kicad/cli/command_pcb_export_pdf.cpp
@@ -165,7 +165,7 @@ int CLI::PCB_EXPORT_PDF_COMMAND::doPerform( KIWAY& aKiway )
     int drillShape = m_argParser.get<int>( ARG_DRILL_SHAPE_OPTION );
     pdfJob->m_drillShapeOption = static_cast<JOB_EXPORT_PCB_PDF::DRILL_MARKS>( drillShape );
 
-    pdfJob->m_printMaskLayer = m_selectedLayers;
+    pdfJob->m_plotLayerSequence = m_selectedLayers;
 
     bool argModeMulti = m_argParser.get<bool>( ARG_MODE_MULTIPAGE );
     bool argModeSeparate = m_argParser.get<bool>( ARG_MODE_SEPARATE );
@@ -178,8 +178,7 @@ int CLI::PCB_EXPORT_PDF_COMMAND::doPerform( KIWAY& aKiway )
     }
 
     wxString layers = From_UTF8( m_argParser.get<std::string>( ARG_COMMON_LAYERS ).c_str() );
-    bool     blah = false;
-    pdfJob->m_printMaskLayersToIncludeOnAllLayers = convertLayerStringList( layers, blah );
+    pdfJob->m_plotOnAllLayersSequence = convertLayerStringList( layers );
 
     if( argModeMulti )
         pdfJob->m_pdfGenMode = JOB_EXPORT_PCB_PDF::GEN_MODE::ONE_PAGE_PER_LAYER_ONE_FILE;
diff --git a/kicad/cli/command_pcb_export_svg.cpp b/kicad/cli/command_pcb_export_svg.cpp
index 74890b5d54..57f3b8d52d 100644
--- a/kicad/cli/command_pcb_export_svg.cpp
+++ b/kicad/cli/command_pcb_export_svg.cpp
@@ -179,8 +179,7 @@ int CLI::PCB_EXPORT_SVG_COMMAND::doPerform( KIWAY& aKiway )
     svgJob->SetVarOverrides( m_argDefineVars );
 
     wxString layers = From_UTF8( m_argParser.get<std::string>( ARG_COMMON_LAYERS ).c_str() );
-    bool     blah = false;
-    svgJob->m_printMaskLayersToIncludeOnAllLayers = convertLayerStringList( layers, blah );
+    svgJob->m_plotOnAllLayersSequence = convertLayerStringList( layers );
 
     if( !wxFile::Exists( svgJob->m_filename ) )
     {
@@ -188,7 +187,7 @@ int CLI::PCB_EXPORT_SVG_COMMAND::doPerform( KIWAY& aKiway )
         return EXIT_CODES::ERR_INVALID_INPUT_FILE;
     }
 
-    svgJob->m_printMaskLayer = m_selectedLayers;
+    svgJob->m_plotLayerSequence = m_selectedLayers;
 
     if( m_argParser.get<bool>( ARG_MODE_MULTI ) )
         svgJob->m_genMode = JOB_EXPORT_PCB_SVG::GEN_MODE::MULTI;
diff --git a/pcbnew/dialogs/dialog_plot.cpp b/pcbnew/dialogs/dialog_plot.cpp
index 73f1ab0cfa..145233c18f 100644
--- a/pcbnew/dialogs/dialog_plot.cpp
+++ b/pcbnew/dialogs/dialog_plot.cpp
@@ -135,7 +135,6 @@ DIALOG_PLOT::DIALOG_PLOT( PCB_EDIT_FRAME* aEditFrame, wxWindow* aParent,
     m_hash_key = TO_UTF8( GetTitle() );
 
     int                       order = 0;
-    LSET                      plotOnAllLayersSelection = m_plotOpts.GetPlotOnAllLayersSelection();
     wxArrayInt                plotAllLayersOrder;
     wxArrayString             plotAllLayersChoicesStrings;
     std::vector<PCB_LAYER_ID> layersIdChoiceList;
@@ -151,9 +150,7 @@ DIALOG_PLOT::DIALOG_PLOT( PCB_EDIT_FRAME* aEditFrame, wxWindow* aParent,
         plotAllLayersChoicesStrings.Add( layerName );
         layersIdChoiceList.push_back( layer );
 
-        size_t size = plotOnAllLayersSelection.size();
-
-        if( ( static_cast<size_t>( layer ) <= size ) && plotOnAllLayersSelection.test( layer ) )
+        if( alg::contains( m_plotOpts.GetPlotOnAllLayersSequence(), layer ) )
             plotAllLayersOrder.push_back( order );
         else
             plotAllLayersOrder.push_back( ~order );
@@ -493,8 +490,8 @@ void DIALOG_PLOT::transferPlotParamsToJob()
     m_job->m_blackAndWhite = m_plotOpts.GetBlackAndWhite();
     m_job->m_mirror = m_plotOpts.GetMirror();
     m_job->m_negative = m_plotOpts.GetNegative();
-    m_job->m_printMaskLayer = m_plotOpts.GetLayerSelection().UIOrder();
-    m_job->m_printMaskLayersToIncludeOnAllLayers = m_plotOpts.GetPlotOnAllLayersSelection().UIOrder();
+    m_job->m_plotLayerSequence = m_plotOpts.GetLayerSelection().SeqStackupForPlotting();
+    m_job->m_plotOnAllLayersSequence = m_plotOpts.GetPlotOnAllLayersSequence();
 
     if( m_job->m_plotFormat == JOB_EXPORT_PCB_PLOT::PLOT_FORMAT::SVG ||
         m_job->m_plotFormat == JOB_EXPORT_PCB_PLOT::PLOT_FORMAT::PDF )
@@ -1172,27 +1169,24 @@ void DIALOG_PLOT::applyPlotSettings()
     // Get a list of copper layers that aren't being used by inverting enabled layers.
     LSET disabledCopperLayers = LSET::AllCuMask() & ~m_editFrame->GetBoard()->GetEnabledLayers();
 
-    LSET plotOnAllLayers;
-
     // Add selected layers from plot on all layers list in order set by user.
-    wxArrayInt plotOnAllLayersSelections;
+    wxArrayInt plotOnAllLayers;
+    LSEQ commonLayers;
 
-    m_plotAllLayersList->GetCheckedItems( plotOnAllLayersSelections );
-
-    size_t count = plotOnAllLayersSelections.GetCount();
-
-    for( size_t i = 0; i < count; i++ )
+    if( m_plotAllLayersList->GetCheckedItems( plotOnAllLayers ) )
     {
-        int index = plotOnAllLayersSelections.Item( i );
-        wxClientData* tmp = m_plotAllLayersList->GetClientObject( index );
-        PCB_LAYER_ID_CLIENT_DATA* layerId = dynamic_cast<PCB_LAYER_ID_CLIENT_DATA*>( tmp );
+        size_t count = plotOnAllLayers.GetCount();
 
-        wxCHECK2( layerId, continue );
+        for( size_t i = 0; i < count; i++ )
+        {
+            int          index = plotOnAllLayers.Item( i );
+            PCB_LAYER_ID client_layer = getLayerClientData( m_plotAllLayersList, index )->Layer();
 
-        plotOnAllLayers.set( layerId->Layer() );
+            commonLayers.push_back( client_layer );
+        }
     }
 
-    tempOptions.SetPlotOnAllLayersSelection( plotOnAllLayers );
+    tempOptions.SetPlotOnAllLayersSequence( commonLayers );
 
     // Enable all of the disabled copper layers.
     // If someone enables more copper layers they will be selected by default.
diff --git a/pcbnew/pcb_plot_params.cpp b/pcbnew/pcb_plot_params.cpp
index 9d8ab9d84c..ae76cb8935 100644
--- a/pcbnew/pcb_plot_params.cpp
+++ b/pcbnew/pcb_plot_params.cpp
@@ -31,6 +31,7 @@
 #include <plotters/plotter.h>
 #include <io/kicad/kicad_io_utils.h>
 #include <settings/color_settings.h>
+#include <lseq.h>
 
 
 #define PLOT_LINEWIDTH_DEFAULT    ( DEFAULT_TEXT_WIDTH * IU_PER_MM )
@@ -180,8 +181,12 @@ void PCB_PLOT_PARAMS::Format( OUTPUTFORMATTER* aFormatter ) const
 
     aFormatter->Print( "(layerselection 0x%s)", m_layerSelection.FmtHex().c_str() );
 
-    aFormatter->Print( "(plot_on_all_layers_selection 0x%s)",
-                       m_plotOnAllLayersSelection.FmtHex().c_str() );
+    LSET commonLayers;
+
+    for( PCB_LAYER_ID commonLayer : m_plotOnAllLayersSequence )
+        commonLayers.set( commonLayer );
+
+    aFormatter->Print( "(plot_on_all_layers_selection 0x%s)", commonLayers.FmtHex().c_str() );
 
     KICAD_FORMAT::FormatBool( aFormatter, "disableapertmacros", m_gerberDisableApertMacros );
     KICAD_FORMAT::FormatBool( aFormatter, "usegerberextensions", m_useGerberProtelExtensions );
@@ -255,7 +260,7 @@ bool PCB_PLOT_PARAMS::IsSameAs( const PCB_PLOT_PARAMS &aPcbPlotParams ) const
     if( m_layerSelection != aPcbPlotParams.m_layerSelection )
         return false;
 
-    if( m_plotOnAllLayersSelection != aPcbPlotParams.m_plotOnAllLayersSelection )
+    if( m_plotOnAllLayersSequence != aPcbPlotParams.m_plotOnAllLayersSequence )
         return false;
 
     if( m_useGerberProtelExtensions != aPcbPlotParams.m_useGerberProtelExtensions )
@@ -647,22 +652,27 @@ void PCB_PLOT_PARAMS_PARSER::Parse( PCB_PLOT_PARAMS* aPcbPlotParams )
 
             if( cur.find_first_of( "0x" ) == 0 )
             {
-                // The layers were renumbered in 5e0abadb23425765e164f49ee2f893e94ddb97fc, but there wasn't
-                // a board file version change with it, so this value is the one immediately after that happened.
+                LSET layers;
+
+                // The layers were renumbered in 5e0abadb23425765e164f49ee2f893e94ddb97fc, but
+                // there wasn't a board file version change with it, so this value is the one
+                // immediately after that happened.
                 if( m_boardFileVersion < 20240819 )
                 {
                     BASE_SET legacyLSET( LEGACY_PCB_LAYER_ID_COUNT );
 
                     // skip the leading 2 0x bytes.
                     legacyLSET.ParseHex( cur.c_str() + 2, cur.size() - 2 );
-                    aPcbPlotParams->SetPlotOnAllLayersSelection( remapLegacyLayerLSET( legacyLSET ) );
+
+                    layers = remapLegacyLayerLSET( legacyLSET );
                 }
                 else
                 {
                     // skip the leading 2 0x bytes.
-                    aPcbPlotParams->m_plotOnAllLayersSelection.ParseHex( cur.c_str() + 2,
-                                                                         cur.size() - 2 );
+                    layers.ParseHex( cur.c_str() + 2, cur.size() - 2 );
                 }
+
+                aPcbPlotParams->SetPlotOnAllLayersSequence( layers.SeqStackupForPlotting() );
             }
             else
             {
@@ -719,7 +729,7 @@ void PCB_PLOT_PARAMS_PARSER::Parse( PCB_PLOT_PARAMS* aPcbPlotParams )
 
         case T_excludeedgelayer:
             if( !parseBool() )
-                aPcbPlotParams->m_plotOnAllLayersSelection.set( Edge_Cuts );
+                aPcbPlotParams->m_plotOnAllLayersSequence.push_back( Edge_Cuts );
 
             break;
 
diff --git a/pcbnew/pcb_plot_params.h b/pcbnew/pcb_plot_params.h
index 6251c1af73..3dcf0217ab 100644
--- a/pcbnew/pcb_plot_params.h
+++ b/pcbnew/pcb_plot_params.h
@@ -26,6 +26,7 @@
 #include <plotters/plotter.h>
 #include <layer_ids.h>
 #include <plotprint_opts.h>
+#include <lseq.h>
 
 class COLOR_SETTINGS;
 class PCB_PLOT_PARAMS_PARSER;
@@ -165,12 +166,8 @@ public:
     void        SetLayerSelection( LSET aSelection )    { m_layerSelection = aSelection; }
     LSET        GetLayerSelection() const               { return m_layerSelection; }
 
-    void        SetPlotOnAllLayersSelection( LSET aSelection )
-    {
-        m_plotOnAllLayersSelection = aSelection;
-    }
-
-    LSET        GetPlotOnAllLayersSelection() const { return m_plotOnAllLayersSelection; }
+    void        SetPlotOnAllLayersSequence( LSEQ aSeq ) { m_plotOnAllLayersSequence = aSeq; }
+    LSEQ        GetPlotOnAllLayersSequence() const      { return m_plotOnAllLayersSequence; }
 
     void        SetUseAuxOrigin( bool aAux ) { m_useAuxOrigin = aAux; }
     bool        GetUseAuxOrigin() const { return m_useAuxOrigin; }
@@ -210,7 +207,7 @@ private:
 
     PLOT_FORMAT     m_format;           /// Plot format type (chooses the driver to be used)
     LSET            m_layerSelection;
-    LSET            m_plotOnAllLayersSelection;
+    LSEQ            m_plotOnAllLayersSequence;
 
     bool            m_skipNPTH_Pads;    /// Used to disable NPTH pads plotting on copper layers
     OUTLINE_MODE    m_plotMode;         /// FILLED or SKETCH for filled objects.
diff --git a/pcbnew/pcb_plotter.cpp b/pcbnew/pcb_plotter.cpp
index de76f758f9..2d2d0b203c 100644
--- a/pcbnew/pcb_plotter.cpp
+++ b/pcbnew/pcb_plotter.cpp
@@ -408,8 +408,8 @@ void PCB_PLOTTER::PlotJobToPlotOpts( PCB_PLOT_PARAMS& aOpts, JOB_EXPORT_PCB_PLOT
     aOpts.SetMirror( aJob->m_mirror );
     aOpts.SetNegative( aJob->m_negative );
 
-    aOpts.SetLayerSelection( aJob->m_printMaskLayer );
-    aOpts.SetPlotOnAllLayersSelection( aJob->m_printMaskLayersToIncludeOnAllLayers );
+    aOpts.SetLayerSelection( aJob->m_plotLayerSequence );
+    aOpts.SetPlotOnAllLayersSequence( aJob->m_plotOnAllLayersSequence );
 
     switch( aJob->m_plotFormat )
     {
diff --git a/pcbnew/pcbnew_jobs_handler.cpp b/pcbnew/pcbnew_jobs_handler.cpp
index 9b20af9161..c5fdb158b0 100644
--- a/pcbnew/pcbnew_jobs_handler.cpp
+++ b/pcbnew/pcbnew_jobs_handler.cpp
@@ -778,12 +778,10 @@ int PCBNEW_JOBS_HANDLER::JobExportSvg( JOB* aJob )
     }
 
     LOCALE_IO dummy;
-    if( !plotter.Plot( outPath, aSvgJob->m_printMaskLayer,
-                       aSvgJob->m_printMaskLayersToIncludeOnAllLayers, false,
-                       aSvgJob->m_genMode == JOB_EXPORT_PCB_SVG::GEN_MODE::SINGLE,
-                       layerName,
-                       sheetName,
-                       sheetPath ) )
+
+    if( !plotter.Plot( outPath, aSvgJob->m_plotLayerSequence, aSvgJob->m_plotOnAllLayersSequence,
+                       false, aSvgJob->m_genMode == JOB_EXPORT_PCB_SVG::GEN_MODE::SINGLE,
+                       layerName, sheetName, sheetPath ) )
     {
         return CLI::EXIT_CODES::ERR_UNKNOWN;
     }
@@ -851,10 +849,9 @@ int PCBNEW_JOBS_HANDLER::JobExportDxf( JOB* aJob )
             sheetPath = aDxfJob->GetVarOverrides().at( wxT( "SHEETPATH" ) );
     }
 
-    if( !plotter.Plot( outPath, aDxfJob->m_printMaskLayer,
-                       aDxfJob->m_printMaskLayersToIncludeOnAllLayers, false,
-                       aDxfJob->m_genMode == JOB_EXPORT_PCB_DXF::GEN_MODE::SINGLE, layerName,
-                       sheetName, sheetPath ) )
+    if( !plotter.Plot( outPath, aDxfJob->m_plotLayerSequence, aDxfJob->m_plotOnAllLayersSequence,
+                       false, aDxfJob->m_genMode == JOB_EXPORT_PCB_DXF::GEN_MODE::SINGLE,
+                       layerName, sheetName, sheetPath ) )
     {
         return CLI::EXIT_CODES::ERR_UNKNOWN;
     }
@@ -928,13 +925,11 @@ int PCBNEW_JOBS_HANDLER::JobExportPdf( JOB* aJob )
 
 
     LOCALE_IO dummy;
-    if( !pcbPlotter.Plot( outPath, aPdfJob->m_printMaskLayer,
-                            aPdfJob->m_printMaskLayersToIncludeOnAllLayers,
-                            false,
-                            aPdfJob->m_pdfGenMode == JOB_EXPORT_PCB_PDF::GEN_MODE::ALL_LAYERS_ONE_FILE,
-                            layerName,
-                            sheetName,
-                            sheetPath ) )
+
+    if( !pcbPlotter.Plot( outPath, aPdfJob->m_plotLayerSequence,
+                          aPdfJob->m_plotOnAllLayersSequence, false,
+                          aPdfJob->m_pdfGenMode == JOB_EXPORT_PCB_PDF::GEN_MODE::ALL_LAYERS_ONE_FILE,
+                          layerName, sheetName, sheetPath ) )
     {
         returnCode = CLI::EXIT_CODES::ERR_UNKNOWN;
     }
@@ -970,7 +965,6 @@ int PCBNEW_JOBS_HANDLER::JobExportGerbers( JOB* aJob )
     brd->SynchronizeProperties();
 
     PCB_PLOT_PARAMS       boardPlotOptions = brd->GetPlotOptions();
-    LSET                  plotOnAllLayersSelection = boardPlotOptions.GetPlotOnAllLayersSelection();
     GERBER_JOBFILE_WRITER jobfile_writer( brd );
 
     wxString fileExt;
@@ -983,21 +977,18 @@ int PCBNEW_JOBS_HANDLER::JobExportGerbers( JOB* aJob )
         // we don't plot 32 layers when we only have 4, etc.
         LSET plotLayers = ( boardPlotOptions.GetLayerSelection() & LSET::AllNonCuMask() )
                           | ( brd->GetEnabledLayers() & LSET::AllCuMask() );
-        aGerberJob->m_printMaskLayer = plotLayers.SeqStackupForPlotting();
-        aGerberJob->m_layersIncludeOnAll = boardPlotOptions.GetPlotOnAllLayersSelection().UIOrder();
+        aGerberJob->m_plotLayerSequence = plotLayers.SeqStackupForPlotting();
+        aGerberJob->m_plotOnAllLayersSequence = boardPlotOptions.GetPlotOnAllLayersSequence();
     }
     else
     {
         // default to the board enabled layers
-        if( aGerberJob->m_printMaskLayer.empty() )
-            aGerberJob->m_printMaskLayer = brd->GetEnabledLayers().SeqStackupForPlotting();
-
-        if( aGerberJob->m_layersIncludeOnAllSet )
-            aGerberJob->m_layersIncludeOnAll = plotOnAllLayersSelection.UIOrder();
+        if( aGerberJob->m_plotLayerSequence.empty() )
+            aGerberJob->m_plotLayerSequence = brd->GetEnabledLayers().SeqStackupForPlotting();
     }
 
     // Ensure layers to plot are restricted to enabled layers of the board to plot
-    LSET layersToPlot = LSET( { aGerberJob->m_printMaskLayer } ) & brd->GetEnabledLayers();
+    LSET layersToPlot = LSET( { aGerberJob->m_plotLayerSequence } ) & brd->GetEnabledLayers();
 
     for( PCB_LAYER_ID layer : layersToPlot.UIOrder() )
     {
@@ -1007,7 +998,7 @@ int PCBNEW_JOBS_HANDLER::JobExportGerbers( JOB* aJob )
         plotSequence.push_back( layer );
 
         // Now all the "include on all" layers
-        for( PCB_LAYER_ID layer_all : aGerberJob->m_layersIncludeOnAll )
+        for( PCB_LAYER_ID layer_all : aGerberJob->m_plotOnAllLayersSequence )
         {
             // Don't plot the same layer more than once;
             if( find( plotSequence.begin(), plotSequence.end(), layer_all ) != plotSequence.end() )
@@ -1202,8 +1193,8 @@ int PCBNEW_JOBS_HANDLER::JobExportGerber( JOB* aJob )
 
     PCB_PLOT_PARAMS plotOpts;
     populateGerberPlotOptionsFromJob( plotOpts, aGerberJob );
-    plotOpts.SetLayerSelection( aGerberJob->m_printMaskLayer );
-    plotOpts.SetPlotOnAllLayersSelection( aGerberJob->m_printMaskLayersToIncludeOnAllLayers );
+    plotOpts.SetLayerSelection( aGerberJob->m_plotLayerSequence );
+    plotOpts.SetPlotOnAllLayersSequence( aGerberJob->m_plotOnAllLayersSequence );
 
     PCB_LAYER_ID layer = UNDEFINED_LAYER;
     wxString     layerName;
@@ -1214,9 +1205,9 @@ int PCBNEW_JOBS_HANDLER::JobExportGerber( JOB* aJob )
     // The first layer will be treated as the layer name for the gerber header,
     // the other layers will be treated equivalent to the "Plot on All Layers" option
     // in the GUI
-    if( aGerberJob->m_printMaskLayer.size() >= 1 )
+    if( aGerberJob->m_plotLayerSequence.size() >= 1 )
     {
-        layer = aGerberJob->m_printMaskLayer.front();
+        layer = aGerberJob->m_plotLayerSequence.front();
         layerName = brd->GetLayerName( layer );
     }
 
@@ -1235,7 +1226,7 @@ int PCBNEW_JOBS_HANDLER::JobExportGerber( JOB* aJob )
 
     if( plotter )
     {
-        PlotBoardLayers( brd, plotter, aGerberJob->m_printMaskLayer, plotOpts );
+        PlotBoardLayers( brd, plotter, aGerberJob->m_plotLayerSequence, plotOpts );
         plotter->EndPlot();
     }
     else