From 9fd79dfa9156c8077b1910c9b437a2d015a66b9d Mon Sep 17 00:00:00 2001
From: Lorenzo Marcantonio <l.marcantonio@logossrl.com>
Date: Sun, 31 Mar 2013 15:27:46 +0200
Subject: [PATCH] Implemented the LAYER_NUM typedef (LAYER was already taken as
 a class name...) to represent a layer number.

---
 3d-viewer/3d_draw.cpp                         | 51 ++++++------
 3d-viewer/info3d_visu.cpp                     |  4 +-
 3d-viewer/info3d_visu.h                       |  4 +-
 bitmap2component/bitmap2component.cpp         |  5 +-
 common/class_colors_design_settings.cpp       |  4 +-
 common/class_layer_box_selector.cpp           | 12 +--
 eeschema/dialogs/dialog_color_config.cpp      |  3 +-
 gerbview/class_excellon.h                     |  2 +-
 gerbview/class_gbr_layer_box_selector.cpp     |  6 +-
 gerbview/class_gbr_layer_box_selector.h       |  6 +-
 gerbview/class_gbr_layout.cpp                 |  2 +-
 gerbview/class_gbr_layout.h                   |  2 +-
 gerbview/class_gbr_screen.h                   |  2 +-
 gerbview/class_gerber_draw_item.cpp           |  2 +-
 gerbview/class_gerber_draw_item.h             |  6 +-
 gerbview/class_gerbview_layer_widget.cpp      | 11 ++-
 gerbview/class_gerbview_layer_widget.h        |  6 +-
 gerbview/dcode.cpp                            |  2 +-
 .../dialogs/dialog_print_using_printer.cpp    | 15 ++--
 .../dialogs/dialog_select_one_pcb_layer.cpp   | 30 +++----
 gerbview/draw_gerber_screen.cpp               |  4 +-
 gerbview/events_called_functions.cpp          |  4 +-
 gerbview/excellon_read_drill_file.cpp         |  6 +-
 gerbview/export_to_pcbnew.cpp                 | 42 +++++-----
 gerbview/files.cpp                            |  4 +-
 gerbview/gerbview.cpp                         |  7 +-
 gerbview/gerbview.h                           |  2 -
 gerbview/gerbview_frame.cpp                   | 30 +++----
 gerbview/gerbview_frame.h                     | 20 ++---
 gerbview/initpcb.cpp                          |  8 +-
 gerbview/locate.cpp                           |  2 +-
 gerbview/readgerb.cpp                         |  2 +-
 gerbview/rs274d.cpp                           | 10 +--
 gerbview/select_layers_to_pcb.cpp             | 60 +++++++-------
 gerbview/select_layers_to_pcb.h               |  4 +-
 gerbview/toolbars_gerber.cpp                  |  2 +-
 include/class_board_design_settings.h         |  8 +-
 include/class_board_item.h                    | 10 +--
 include/class_colors_design_settings.h        |  5 +-
 include/class_layer_box_selector.h            | 14 ++--
 include/class_pcb_screen.h                    |  6 +-
 include/layers_id_colors_and_visibility.h     | 44 +++++-----
 include/macros.h                              |  2 +-
 include/pcbcommon.h                           |  2 +-
 include/sch_item_struct.h                     |  1 +
 include/wxBasePcbFrame.h                      |  4 +-
 include/wxPcbStruct.h                         |  8 +-
 pcbnew/autorouter/autoplac.cpp                |  4 +-
 pcbnew/autorouter/routing_matrix.cpp          |  4 +-
 pcbnew/basepcbframe.cpp                       |  4 +-
 pcbnew/block.cpp                              |  2 +-
 pcbnew/board_undo_redo.cpp                    |  2 +-
 pcbnew/class_board.cpp                        | 62 +++++++-------
 pcbnew/class_board.h                          | 44 +++++-----
 pcbnew/class_board_design_settings.cpp        |  9 +-
 pcbnew/class_dimension.cpp                    |  4 +-
 pcbnew/class_dimension.h                      |  2 +-
 pcbnew/class_drawsegment.cpp                  |  5 +-
 pcbnew/class_edge_mod.cpp                     |  2 +-
 pcbnew/class_marker_pcb.cpp                   |  2 +-
 pcbnew/class_marker_pcb.h                     |  2 +-
 pcbnew/class_mire.cpp                         |  2 +-
 pcbnew/class_mire.h                           |  2 +-
 pcbnew/class_module_transform_functions.cpp   |  4 +-
 pcbnew/class_pad.cpp                          |  2 +-
 pcbnew/class_pad.h                            |  2 +-
 pcbnew/class_pad_draw_functions.cpp           |  4 +-
 pcbnew/class_pcb_layer_box_selector.cpp       | 10 +--
 pcbnew/class_pcb_layer_box_selector.h         | 25 +-----
 pcbnew/class_pcb_layer_widget.cpp             | 18 ++--
 pcbnew/class_pcb_layer_widget.h               |  6 +-
 pcbnew/class_text_mod.cpp                     |  6 +-
 pcbnew/class_text_mod.h                       |  2 +-
 pcbnew/class_track.cpp                        | 36 ++++----
 pcbnew/class_track.h                          |  8 +-
 pcbnew/class_zone.cpp                         |  6 +-
 pcbnew/class_zone.h                           |  2 +-
 pcbnew/class_zone_settings.cpp                |  2 +-
 pcbnew/class_zone_settings.h                  |  2 +-
 pcbnew/clean.cpp                              |  8 +-
 pcbnew/collectors.cpp                         |  4 +-
 pcbnew/collectors.h                           | 22 ++---
 pcbnew/deltrack.cpp                           |  4 +-
 pcbnew/dialogs/dialog_SVG_print.cpp           | 18 ++--
 pcbnew/dialogs/dialog_copper_zones.cpp        |  8 +-
 pcbnew/dialogs/dialog_global_deletion.cpp     |  4 +-
 pcbnew/dialogs/dialog_global_deletion.h       |  4 +-
 .../dialog_graphic_item_properties.cpp        | 18 ++--
 ...og_graphic_item_properties_for_Modedit.cpp |  6 +-
 .../dialog_keepout_area_properties.cpp        |  4 +-
 pcbnew/dialogs/dialog_layers_setup.cpp        | 53 ++++++------
 pcbnew/dialogs/dialog_pcb_text_properties.cpp |  4 +-
 pcbnew/dialogs/dialog_plot.cpp                |  3 +-
 pcbnew/dialogs/dialog_print_using_printer.cpp | 19 ++---
 pcbnew/dimension.cpp                          |  6 +-
 pcbnew/drc_clearance_test_functions.cpp       |  2 +-
 pcbnew/eagle_plugin.cpp                       | 44 +++++-----
 pcbnew/eagle_plugin.h                         |  2 +-
 pcbnew/edgemod.cpp                            |  2 +-
 pcbnew/edit.cpp                               | 14 ++--
 pcbnew/edit_pcb_text.cpp                      |  2 +-
 pcbnew/editedge.cpp                           |  2 +-
 pcbnew/editrack-part2.cpp                     |  6 +-
 pcbnew/editrack.cpp                           |  2 +-
 pcbnew/export_gencad.cpp                      |  6 +-
 pcbnew/export_vrml.cpp                        | 51 ++++++------
 pcbnew/gen_drill_report_files.cpp             |  6 +-
 pcbnew/gen_modules_placefile.cpp              |  4 +-
 pcbnew/gendrill_Excellon_writer.h             |  4 +-
 pcbnew/hotkeys_board_editor.cpp               | 10 +--
 pcbnew/kicad_plugin.cpp                       | 14 ++--
 pcbnew/layer_widget.cpp                       | 32 +++----
 pcbnew/layer_widget.h                         | 20 ++---
 pcbnew/legacy_plugin.cpp                      | 83 +++++++++++--------
 pcbnew/magnetic_tracks_functions.cpp          |  2 +-
 pcbnew/pcad2kicadpcb_plugin/pcb.cpp           | 14 ++--
 pcbnew/pcad2kicadpcb_plugin/pcb.h             |  2 +-
 pcbnew/pcad2kicadpcb_plugin/pcb_callbacks.h   |  4 +-
 pcbnew/pcad2kicadpcb_plugin/pcb_component.cpp |  6 +-
 pcbnew/pcad2kicadpcb_plugin/pcb_component.h   |  6 +-
 pcbnew/pcb_parser.cpp                         | 14 ++--
 pcbnew/pcb_parser.h                           |  4 +-
 pcbnew/pcbframe.cpp                           |  2 +-
 pcbnew/pcbnew.cpp                             |  4 +-
 pcbnew/pcbnew.h                               |  4 +-
 pcbnew/pcbplot.cpp                            |  8 +-
 pcbnew/pcbplot.h                              |  4 +-
 pcbnew/plot_board_layers.cpp                  |  4 +-
 pcbnew/plot_brditems_plotter.cpp              | 10 +--
 pcbnew/plotcontroller.h                       |  2 +-
 pcbnew/print_board_functions.cpp              |  6 +-
 pcbnew/printout_controler.cpp                 |  6 +-
 pcbnew/protos.h                               |  2 +-
 pcbnew/sel_layer.cpp                          | 47 +++++------
 pcbnew/specctra.cpp                           | 15 ++--
 pcbnew/specctra.h                             |  8 +-
 pcbnew/specctra_export.cpp                    | 38 ++++-----
 pcbnew/specctra_import.cpp                    | 10 +--
 pcbnew/specctra_test.cpp                      |  2 +-
 pcbnew/swap_layers.cpp                        | 32 +++----
 pcbnew/zones_by_polygon.cpp                   | 12 +--
 pcbnew/zones_functions_for_undo_redo.cpp      |  2 +-
 pcbnew/zones_functions_for_undo_redo.h        |  2 +-
 pcbnew/zones_non_copper_type_functions.cpp    | 10 ++-
 pcbnew/zones_test_and_combine_areas.cpp       |  4 +-
 polygon/PolyLine.cpp                          |  6 +-
 polygon/PolyLine.h                            |  8 +-
 147 files changed, 782 insertions(+), 782 deletions(-)

diff --git a/3d-viewer/3d_draw.cpp b/3d-viewer/3d_draw.cpp
index b97701bd75..d2ad04e200 100644
--- a/3d-viewer/3d_draw.cpp
+++ b/3d-viewer/3d_draw.cpp
@@ -56,14 +56,14 @@ extern void CheckGLError();
 
  /* returns true if aLayer should be displayed, false otherwise
   */
-static bool    Is3DLayerEnabled( int aLayer );
+static bool    Is3DLayerEnabled( LAYER_NUM aLayer );
 
  /* returns the Z orientation parameter 1.0 or -1.0 for aLayer
   * Z orientation is 1.0 for all layers but "back" layers:
   *  LAYER_N_BACK , ADHESIVE_N_BACK, SOLDERPASTE_N_BACK ), SILKSCREEN_N_BACK
   * used to calculate the Z orientation parameter for glNormal3f
   */
-static GLfloat  Get3DLayer_Z_Orientation( int aLayer );
+static GLfloat  Get3DLayer_Z_Orientation( LAYER_NUM aLayer );
 
 void EDA_3D_CANVAS::Redraw( bool finish )
 {
@@ -163,7 +163,7 @@ GLuint EDA_3D_CANVAS::CreateDrawGL_List()
             Draw3D_Via( (SEGVIA*) track );
         else
         {
-            int    layer = track->GetLayer();
+            LAYER_NUM layer = track->GetLayer();
 
             if( g_Parm_3D_Visu.m_BoardSettings->IsLayerVisible( layer ) )
                 Draw3D_Track( track );
@@ -174,7 +174,7 @@ GLuint EDA_3D_CANVAS::CreateDrawGL_List()
     {
         for( int ii = 0; ii < pcb->GetAreaCount(); ii++ )
         {
-            int layer = pcb->GetArea( ii )->GetLayer();
+            LAYER_NUM layer = pcb->GetArea( ii )->GetLayer();
 
             if( g_Parm_3D_Visu.m_BoardSettings->IsLayerVisible( layer )  )
                 Draw3D_Zone( pcb->GetArea( ii ) );
@@ -236,8 +236,8 @@ GLuint EDA_3D_CANVAS::CreateDrawGL_List()
  */
 void EDA_3D_CANVAS::Draw3D_Zone( ZONE_CONTAINER* aZone )
 {
-    int layer = aZone->GetLayer();
-    int color = g_ColorsSettings.GetLayerColor( layer );
+    LAYER_NUM layer = aZone->GetLayer();
+    EDA_COLOR_T color = g_ColorsSettings.GetLayerColor( layer );
     int thickness = g_Parm_3D_Visu.GetLayerObjectThicknessBIU( layer );
 
     if( layer == LAST_COPPER_LAYER )
@@ -456,7 +456,7 @@ void EDA_3D_CANVAS::DrawGrid( double aGriSizeMM )
 
 void EDA_3D_CANVAS::Draw3D_Track( TRACK* aTrack )
 {
-    int layer = aTrack->GetLayer();
+    LAYER_NUM layer = aTrack->GetLayer();
     int color = g_ColorsSettings.GetLayerColor( layer );
     int thickness = g_Parm_3D_Visu.GetCopperThicknessBIU();
 
@@ -475,7 +475,7 @@ void EDA_3D_CANVAS::Draw3D_Track( TRACK* aTrack )
 
 void EDA_3D_CANVAS::Draw3D_Via( SEGVIA* via )
 {
-    int    layer, top_layer, bottom_layer;
+    LAYER_NUM layer, top_layer, bottom_layer;
     int    color;
     double biu_to_3Dunits = g_Parm_3D_Visu.m_BiuTo3Dunits ;
 
@@ -486,7 +486,7 @@ void EDA_3D_CANVAS::Draw3D_Via( SEGVIA* via )
     via->ReturnLayerPair( &top_layer, &bottom_layer );
 
     // Drawing horizontal thick rings:
-    for( layer = bottom_layer; layer < g_Parm_3D_Visu.m_CopperLayersCount; layer++ )
+    for( layer = bottom_layer; layer < g_Parm_3D_Visu.m_CopperLayersCount; ++layer )
     {
         int zpos = g_Parm_3D_Visu.GetLayerZcoordBIU( layer );
 
@@ -530,7 +530,7 @@ void EDA_3D_CANVAS::Draw3D_Via( SEGVIA* via )
 
 void EDA_3D_CANVAS::Draw3D_DrawSegment( DRAWSEGMENT* segment )
 {
-    int layer = segment->GetLayer();
+    LAYER_NUM layer = segment->GetLayer();
     int color = g_ColorsSettings.GetLayerColor( layer );
     int thickness = g_Parm_3D_Visu.GetLayerObjectThicknessBIU( layer );
 
@@ -538,7 +538,7 @@ void EDA_3D_CANVAS::Draw3D_DrawSegment( DRAWSEGMENT* segment )
 
     if( layer == EDGE_N )
     {
-        for( layer = 0; layer < g_Parm_3D_Visu.m_CopperLayersCount; layer++ )
+        for( layer = FIRST_LAYER; layer < g_Parm_3D_Visu.m_CopperLayersCount; ++layer )
         {
             glNormal3f( 0.0, 0.0, Get3DLayer_Z_Orientation( layer ) );
             int zpos = g_Parm_3D_Visu.GetLayerZcoordBIU(layer);
@@ -624,7 +624,7 @@ static void Draw3dTextSegm( int x0, int y0, int xf, int yf )
 
 void EDA_3D_CANVAS::Draw3D_DrawText( TEXTE_PCB* text )
 {
-    int layer = text->GetLayer();
+    LAYER_NUM layer = text->GetLayer();
     int color = g_ColorsSettings.GetLayerColor( layer );
 
     SetGLColor( color );
@@ -754,7 +754,7 @@ void EDGE_MODULE::Draw3D( EDA_3D_CANVAS* glcanvas )
     if( g_Parm_3D_Visu.m_BoardSettings->IsLayerVisible( m_Layer ) == false )
         return;
 
-    int color = g_ColorsSettings.GetLayerColor( m_Layer );
+    EDA_COLOR_T color = g_ColorsSettings.GetLayerColor( m_Layer );
     SetGLColor( color );
 
     // for outline shape = S_POLYGON:
@@ -790,7 +790,7 @@ void EDGE_MODULE::Draw3D( EDA_3D_CANVAS* glcanvas )
 
     if( m_Layer == EDGE_N )
     {
-        for( int layer = 0; layer < g_Parm_3D_Visu.m_CopperLayersCount; layer++ )
+        for( LAYER_NUM layer = FIRST_LAYER; layer < g_Parm_3D_Visu.m_CopperLayersCount; ++layer )
         {
             glNormal3f( 0.0, 0.0, Get3DLayer_Z_Orientation( layer ) );
             int zpos = g_Parm_3D_Visu.GetLayerZcoordBIU( layer );
@@ -948,7 +948,7 @@ void D_PAD::Draw3D( EDA_3D_CANVAS* glcanvas )
     switch( GetShape() )
     {
     case PAD_CIRCLE:
-        for( int layer = FIRST_COPPER_LAYER; layer <= LAST_COPPER_LAYER; layer++ )
+        for( LAYER_NUM layer = FIRST_COPPER_LAYER; layer <= LAST_COPPER_LAYER; ++layer )
         {
             if( layer && (layer == nlmax) )
                 layer = LAYER_N_FRONT;
@@ -1007,7 +1007,6 @@ void D_PAD::Draw3D( EDA_3D_CANVAS* glcanvas )
         wxPoint coord[5];
         BuildPadPolygon( coord, wxSize(0,0), m_Orient );
         for( int ii = 0; ii < 4; ii ++ )
-
         {
             CPolyPt pt( coord[ii].x + shape_pos.x, coord[ii].y+ shape_pos.y );
             polyPadShape.push_back( pt );
@@ -1027,7 +1026,7 @@ void D_PAD::Draw3D( EDA_3D_CANVAS* glcanvas )
 
     if( polyPadShape.size() )
     {
-        for( int layer = FIRST_COPPER_LAYER; layer <= LAST_COPPER_LAYER; layer++ )
+        for( LAYER_NUM layer = FIRST_COPPER_LAYER; layer <= LAST_COPPER_LAYER; ++layer )
         {
             if( layer && (layer == nlmax) )
                 layer = LAYER_N_FRONT;
@@ -1061,41 +1060,41 @@ void D_PAD::Draw3D( EDA_3D_CANVAS* glcanvas )
 
 }
 
-bool Is3DLayerEnabled( int aLayer )
+bool Is3DLayerEnabled( LAYER_NUM aLayer )
 {
-    int flg = -1;
+    int flg;
 
     // see if layer needs to be shown
     // check the flags
     switch (aLayer)
     {
         case DRAW_N:
-            flg=g_Parm_3D_Visu.FL_DRAWINGS;
+            flg = g_Parm_3D_Visu.FL_DRAWINGS;
             break;
 
         case COMMENT_N:
-            flg=g_Parm_3D_Visu.FL_COMMENTS;
+            flg = g_Parm_3D_Visu.FL_COMMENTS;
             break;
 
         case ECO1_N:
-            flg=g_Parm_3D_Visu.FL_ECO1;
+            flg = g_Parm_3D_Visu.FL_ECO1;
             break;
 
         case ECO2_N:
-            flg=g_Parm_3D_Visu.FL_ECO2;
+            flg = g_Parm_3D_Visu.FL_ECO2;
             break;
-    }
 
+        default:
     // the layer was not a layer with a flag, so show it
-    if( flg < 0 )
         return true;
+    }
 
     // if the layer has a flag, return the flag
     return g_Parm_3D_Visu.m_DrawFlags[flg];
 }
 
 
-GLfloat Get3DLayer_Z_Orientation( int aLayer )
+GLfloat Get3DLayer_Z_Orientation( LAYER_NUM aLayer )
 {
     double nZ;
 
diff --git a/3d-viewer/info3d_visu.cpp b/3d-viewer/info3d_visu.cpp
index 6fe6c9248b..4047783b4d 100644
--- a/3d-viewer/info3d_visu.cpp
+++ b/3d-viewer/info3d_visu.cpp
@@ -135,7 +135,7 @@ void INFO3D_VISU::InitSettings( BOARD* aBoard )
     }
 
     // calculate z position for each non copper layer
-    for( int layer_id = FIRST_NO_COPPER_LAYER; layer_id < NB_LAYERS; layer_id++ )
+    for( int layer_id = FIRST_NON_COPPER_LAYER; layer_id < NB_PCB_LAYERS; layer_id++ )
     {
         double zpos;
         #define NonCopperLayerThicknessMargin 1.1
@@ -184,7 +184,7 @@ void INFO3D_VISU::InitSettings( BOARD* aBoard )
 
         default:
             zpos = zpos_copper_front +
-                   (layer_id - FIRST_NO_COPPER_LAYER + 5) *
+                   (layer_id - FIRST_NON_COPPER_LAYER + 5) *
                    m_NonCopperLayerThickness * NonCopperLayerThicknessMargin;
             break;
         }
diff --git a/3d-viewer/info3d_visu.h b/3d-viewer/info3d_visu.h
index ec2aa74d86..a6b0456ef1 100644
--- a/3d-viewer/info3d_visu.h
+++ b/3d-viewer/info3d_visu.h
@@ -93,7 +93,7 @@ public:
     double  m_CurrentZpos;                          // temporary storage of current value of Z position,
                                                     // used in some calculation
 private:
-    double  m_LayerZcoord[LAYER_COUNT];             // Z position of each layer (normalized)
+    double  m_LayerZcoord[NB_LAYERS];               // Z position of each layer (normalized)
     double  m_CopperThickness;                      // Copper thickness (normalized)
     double  m_EpoxyThickness;                       // Epoxy thickness (normalized)
     double  m_NonCopperLayerThickness;              // Non copper layers thickness
@@ -173,7 +173,7 @@ public: INFO3D_VISU();
      */
     int GetLayerObjectThicknessBIU( int aLayerId) const
     {
-        return aLayerId >= FIRST_NO_COPPER_LAYER ?
+        return aLayerId >= FIRST_NON_COPPER_LAYER ?
                         GetNonCopperLayerThicknessBIU() :
                         GetCopperThicknessBIU();
     }
diff --git a/bitmap2component/bitmap2component.cpp b/bitmap2component/bitmap2component.cpp
index 7c5ac02efa..bbb64cd5a8 100644
--- a/bitmap2component/bitmap2component.cpp
+++ b/bitmap2component/bitmap2component.cpp
@@ -32,7 +32,7 @@
 #include <stdlib.h>
 #include <cmath>
 #include <vector>
-
+#include <layers_id_colors_and_visibility.h>
 #include <potracelib.h>
 #include <auxiliary.h>
 
@@ -310,8 +310,7 @@ void BITMAPCONV_INFO::OuputOnePolygon( KPolygon & aPolygon )
 
     case PCBNEW_FMT:
     {
-        #define SILKSCREEN_N_FRONT 21
-        int layer = SILKSCREEN_N_FRONT;
+        LAYER_NUM layer = SILKSCREEN_N_FRONT;
         int width = 1;
         fprintf( m_Outfile, "DP %d %d %d %d %d %d %d\n",
                  0, 0, 0, 0,
diff --git a/common/class_colors_design_settings.cpp b/common/class_colors_design_settings.cpp
index 8901544c58..21835b80e5 100644
--- a/common/class_colors_design_settings.cpp
+++ b/common/class_colors_design_settings.cpp
@@ -78,7 +78,7 @@ COLORS_DESIGN_SETTINGS:: COLORS_DESIGN_SETTINGS()
  * @return the color for aLayer which is one of the layer indices given
  * in pcbstruct.h or in schematic
  */
-EDA_COLOR_T COLORS_DESIGN_SETTINGS::GetLayerColor( int aLayer ) const
+EDA_COLOR_T COLORS_DESIGN_SETTINGS::GetLayerColor( LAYER_NUM aLayer ) const
 {
     if( (unsigned) aLayer < DIM(m_LayersColors) )
     {
@@ -93,7 +93,7 @@ EDA_COLOR_T COLORS_DESIGN_SETTINGS::GetLayerColor( int aLayer ) const
  * sets the color for aLayer which is one of the layer indices given
  * in pcbstruct.h or in schematic
  */
-void COLORS_DESIGN_SETTINGS::SetLayerColor( int aLayer, EDA_COLOR_T aColor )
+void COLORS_DESIGN_SETTINGS::SetLayerColor( LAYER_NUM aLayer, EDA_COLOR_T aColor )
 {
     if( (unsigned) aLayer < DIM(m_LayersColors) )
     {
diff --git a/common/class_layer_box_selector.cpp b/common/class_layer_box_selector.cpp
index d38943a7bb..3ec360025b 100644
--- a/common/class_layer_box_selector.cpp
+++ b/common/class_layer_box_selector.cpp
@@ -65,14 +65,14 @@ int LAYER_BOX_SELECTOR::GetChoice()
 
 
 // Get Current Layer
-int LAYER_BOX_SELECTOR::GetLayerSelection()
+LAYER_NUM LAYER_BOX_SELECTOR::GetLayerSelection() const
 {
-    return (long) GetClientData( GetSelection() );
+    return (LAYER_NUM)((unsigned long) GetClientData( GetSelection() ) );
 }
 
 
 // Set Layer #
-int LAYER_BOX_SELECTOR::SetLayerSelection( int layer )
+int LAYER_BOX_SELECTOR::SetLayerSelection( LAYER_NUM layer )
 {
     int elements = GetCount();
 
@@ -97,8 +97,8 @@ int LAYER_BOX_SELECTOR::SetLayerSelection( int layer )
 
 void LAYER_BOX_SELECTOR::ResyncBitmapOnly()
 {
-    int elements = GetCount();
-    for( int i = 0; i < elements; i++ )
+    LAYER_NUM elements = GetCount();
+    for( LAYER_NUM i = FIRST_LAYER; i < elements; ++i )
     {
         wxBitmap layerbmp( 14, 14 );
         SetBitmapLayer( layerbmp, i );
@@ -106,7 +106,7 @@ void LAYER_BOX_SELECTOR::ResyncBitmapOnly()
 }
 
 
-void LAYER_BOX_SELECTOR::SetBitmapLayer( wxBitmap& aLayerbmp, int aLayerIndex )
+void LAYER_BOX_SELECTOR::SetBitmapLayer( wxBitmap& aLayerbmp, LAYER_NUM aLayerIndex )
 {
     wxMemoryDC bmpDC;
     wxBrush    brush;
diff --git a/eeschema/dialogs/dialog_color_config.cpp b/eeschema/dialogs/dialog_color_config.cpp
index 92b5e0b9d1..57ec480a0a 100644
--- a/eeschema/dialogs/dialog_color_config.cpp
+++ b/eeschema/dialogs/dialog_color_config.cpp
@@ -11,6 +11,7 @@
 #include <protos.h>
 
 #include <dialog_color_config.h>
+#include <layers_id_colors_and_visibility.h>
 
 
 #define ID_COLOR_SETUP  1800
@@ -290,7 +291,7 @@ bool DIALOG_COLOR_CONFIG::UpdateColorsSettings()
 
     bool warning = false;
 
-    for( int ii = 0;  ii < MAX_LAYERS;  ii++ )
+    for( LAYER_NUM ii = FIRST_LAYER; ii < MAX_LAYERS; ++ii )
     {
         SetLayerColor( currentColors[ ii ], ii );
 
diff --git a/gerbview/class_excellon.h b/gerbview/class_excellon.h
index 7f8b5b9df3..0bc3e26449 100644
--- a/gerbview/class_excellon.h
+++ b/gerbview/class_excellon.h
@@ -76,7 +76,7 @@ private:
     excellon_state m_State;         // state of excellon file analysis
     bool           m_SlotOn;        // true during an oval driil definition
 
-public: EXCELLON_IMAGE( GERBVIEW_FRAME* aParent, int layer ) :
+public: EXCELLON_IMAGE( GERBVIEW_FRAME* aParent, LAYER_NUM layer ) :
         GERBER_IMAGE( aParent, layer )
     {
         m_State  = READ_HEADER_STATE;
diff --git a/gerbview/class_gbr_layer_box_selector.cpp b/gerbview/class_gbr_layer_box_selector.cpp
index 45918ec131..038aac142f 100644
--- a/gerbview/class_gbr_layer_box_selector.cpp
+++ b/gerbview/class_gbr_layer_box_selector.cpp
@@ -46,7 +46,7 @@ void GBR_LAYER_BOX_SELECTOR::Resync()
 {
     Clear();
 
-    for( int layerid = 0; layerid < LAYER_COUNT; layerid++ )
+    for( LAYER_NUM layerid = FIRST_LAYER; layerid < NB_LAYERS; ++layerid )
     {
         wxBitmap    layerbmp( 14, 14 );
         wxString    layername;
@@ -65,7 +65,7 @@ void GBR_LAYER_BOX_SELECTOR::Resync()
 
 
 // Returns a color index from the layer id
-EDA_COLOR_T GBR_LAYER_BOX_SELECTOR::GetLayerColor( int aLayerIndex ) const
+EDA_COLOR_T GBR_LAYER_BOX_SELECTOR::GetLayerColor( LAYER_NUM aLayerIndex ) const
 {
     GERBVIEW_FRAME* frame = (GERBVIEW_FRAME*) GetParent()->GetParent();
 
@@ -74,7 +74,7 @@ EDA_COLOR_T GBR_LAYER_BOX_SELECTOR::GetLayerColor( int aLayerIndex ) const
 
 
 // Returns the name of the layer id
-wxString GBR_LAYER_BOX_SELECTOR::GetLayerName( int aLayerIndex ) const
+wxString GBR_LAYER_BOX_SELECTOR::GetLayerName( LAYER_NUM aLayerIndex ) const
 {
     wxString name;
     name.Printf( _( "Layer %d" ), aLayerIndex + 1 );
diff --git a/gerbview/class_gbr_layer_box_selector.h b/gerbview/class_gbr_layer_box_selector.h
index 64812e5a57..0ba19a2647 100644
--- a/gerbview/class_gbr_layer_box_selector.h
+++ b/gerbview/class_gbr_layer_box_selector.h
@@ -37,15 +37,15 @@ public:
 
     // Returns a color index from the layer id
     // Virtual function
-    EDA_COLOR_T GetLayerColor( int aLayerIndex ) const;
+    EDA_COLOR_T GetLayerColor( LAYER_NUM aLayerIndex ) const;
 
     // Returns true if the layer id is enabled (i.e. is it should be displayed)
     // Virtual function
-    bool IsLayerEnabled( int aLayerIndex ) const { return true; };
+    bool IsLayerEnabled( LAYER_NUM aLayerIndex ) const { return true; };
 
     // Returns the name of the layer id
     // Virtual function
-    wxString GetLayerName( int aLayerIndex ) const;
+    wxString GetLayerName( LAYER_NUM aLayerIndex ) const;
 };
 
 #endif //CLASS_GBR_LAYER_BOX_SELECTOR_H
diff --git a/gerbview/class_gbr_layout.cpp b/gerbview/class_gbr_layout.cpp
index abd461876a..345722f2f5 100644
--- a/gerbview/class_gbr_layout.cpp
+++ b/gerbview/class_gbr_layout.cpp
@@ -27,7 +27,7 @@ GBR_LAYOUT::~GBR_LAYOUT()
  * param aLayerIndex = The index of the layer to be tested
  * return bool - true if the layer is visible.
  */
-bool GBR_LAYOUT::IsLayerVisible( int aLayerIndex ) const
+bool GBR_LAYOUT::IsLayerVisible( LAYER_NUM aLayerIndex ) const
 {
     return m_printLayersMask & GetLayerMask( aLayerIndex );
 }
diff --git a/gerbview/class_gbr_layout.h b/gerbview/class_gbr_layout.h
index 8967357e38..cc497703b5 100644
--- a/gerbview/class_gbr_layout.h
+++ b/gerbview/class_gbr_layout.h
@@ -102,7 +102,7 @@ public:
      * @param aLayerIndex = The index of the layer to be tested
      * @return bool - true if the layer is visible.
      */
-    bool    IsLayerVisible( int aLayerIndex ) const;
+    bool    IsLayerVisible( LAYER_NUM aLayerIndex ) const;
 
 #if defined(DEBUG)
     void    Show( int nestLevel, std::ostream& os ) const;  // overload
diff --git a/gerbview/class_gbr_screen.h b/gerbview/class_gbr_screen.h
index 77640a1a2a..8be96b21d5 100644
--- a/gerbview/class_gbr_screen.h
+++ b/gerbview/class_gbr_screen.h
@@ -17,7 +17,7 @@
 class GBR_SCREEN : public BASE_SCREEN
 {
 public:
-    int m_Active_Layer;
+    LAYER_NUM m_Active_Layer;
     /**
      * Constructor
      * @param aPageSizeIU is the size of the initial paper page in internal units.
diff --git a/gerbview/class_gerber_draw_item.cpp b/gerbview/class_gerber_draw_item.cpp
index f9fb900284..39d8053eab 100644
--- a/gerbview/class_gerber_draw_item.cpp
+++ b/gerbview/class_gerber_draw_item.cpp
@@ -44,7 +44,7 @@ GERBER_DRAW_ITEM::GERBER_DRAW_ITEM( GBR_LAYOUT* aParent, GERBER_IMAGE* aGerberpa
     EDA_ITEM( (EDA_ITEM*)aParent, TYPE_GERBER_DRAW_ITEM )
 {
     m_imageParams = aGerberparams;
-    m_Layer         = 0;
+    m_Layer         = FIRST_LAYER;
     m_Shape         = GBR_SEGMENT;
     m_Flashed       = false;
     m_DCode         = 0;
diff --git a/gerbview/class_gerber_draw_item.h b/gerbview/class_gerber_draw_item.h
index 3d6cfda162..cb304dbc64 100644
--- a/gerbview/class_gerber_draw_item.h
+++ b/gerbview/class_gerber_draw_item.h
@@ -90,7 +90,7 @@ public:
                                              * redundancy for these parameters
                                              */
 private:
-    int m_Layer;
+    LAYER_NUM m_Layer;
 
     // These values are used to draw this item, according to gerber layers parameters
     // Because they can change inside a gerber image, they are stored here
@@ -123,7 +123,7 @@ public:
      * Function GetLayer
      * returns the layer this item is on.
      */
-    int GetLayer() const { return m_Layer; }
+    LAYER_NUM GetLayer() const { return m_Layer; }
 
     /**
      * Function SetLayer
@@ -132,7 +132,7 @@ public:
      * is virtual because some items (in fact: class DIMENSION)
      * have a slightly different initialization
      */
-    void SetLayer( int aLayer )  { m_Layer = aLayer; }
+    void SetLayer( LAYER_NUM aLayer )  { m_Layer = aLayer; }
 
     LAYER_MSK GetLayerMask()
     {
diff --git a/gerbview/class_gerbview_layer_widget.cpp b/gerbview/class_gerbview_layer_widget.cpp
index eea92f7d16..bb6a3a57df 100644
--- a/gerbview/class_gerbview_layer_widget.cpp
+++ b/gerbview/class_gerbview_layer_widget.cpp
@@ -196,10 +196,9 @@ void GERBER_LAYER_WIDGET::onPopupSelection( wxCommandEvent& event )
 
 void GERBER_LAYER_WIDGET::ReFill()
 {
-    int     layer;
     ClearLayerRows();
 
-    for( layer = 0; layer < GERBVIEW_LAYER_COUNT; layer++ )
+    for( LAYER_NUM layer = FIRST_LAYER; layer < NB_GERBER_LAYERS; ++layer )
     {
         wxString msg;
         msg.Printf( _("Layer %d"), layer+1 );
@@ -212,18 +211,18 @@ void GERBER_LAYER_WIDGET::ReFill()
 
 //-----<LAYER_WIDGET callbacks>-------------------------------------------
 
-void GERBER_LAYER_WIDGET::OnLayerColorChange( int aLayer, EDA_COLOR_T aColor )
+void GERBER_LAYER_WIDGET::OnLayerColorChange( LAYER_NUM aLayer, EDA_COLOR_T aColor )
 {
     myframe->SetLayerColor( aLayer, aColor );
     myframe->m_SelLayerBox->ResyncBitmapOnly();
     myframe->GetCanvas()->Refresh();
 }
 
-bool GERBER_LAYER_WIDGET::OnLayerSelect( int aLayer )
+bool GERBER_LAYER_WIDGET::OnLayerSelect( LAYER_NUM aLayer )
 {
     // the layer change from the GERBER_LAYER_WIDGET can be denied by returning
     // false from this function.
-    int layer = myframe->getActiveLayer( );
+    LAYER_NUM layer = myframe->getActiveLayer( );
     myframe->setActiveLayer( aLayer, false );
     myframe->syncLayerBox();
 
@@ -233,7 +232,7 @@ bool GERBER_LAYER_WIDGET::OnLayerSelect( int aLayer )
     return true;
 }
 
-void GERBER_LAYER_WIDGET::OnLayerVisible( int aLayer, bool isVisible, bool isFinal )
+void GERBER_LAYER_WIDGET::OnLayerVisible( LAYER_NUM aLayer, bool isVisible, bool isFinal )
 {
     LAYER_MSK visibleLayers = myframe->GetVisibleLayers();
 
diff --git a/gerbview/class_gerbview_layer_widget.h b/gerbview/class_gerbview_layer_widget.h
index 60349aba6b..cd974e08ea 100644
--- a/gerbview/class_gerbview_layer_widget.h
+++ b/gerbview/class_gerbview_layer_widget.h
@@ -88,9 +88,9 @@ public:
     void ReFillRender();
 
     //-----<implement LAYER_WIDGET abstract callback functions>-----------
-    void OnLayerColorChange( int aLayer, EDA_COLOR_T aColor );
-    bool OnLayerSelect( int aLayer );
-    void OnLayerVisible( int aLayer, bool isVisible, bool isFinal );
+    void OnLayerColorChange( LAYER_NUM aLayer, EDA_COLOR_T aColor );
+    bool OnLayerSelect( LAYER_NUM aLayer );
+    void OnLayerVisible( LAYER_NUM aLayer, bool isVisible, bool isFinal );
     void OnRenderColorChange( int aId, EDA_COLOR_T aColor );
     void OnRenderEnable( int aId, bool isEnabled );
     /**
diff --git a/gerbview/dcode.cpp b/gerbview/dcode.cpp
index 8bfa1c4c8b..7cc851c5b1 100644
--- a/gerbview/dcode.cpp
+++ b/gerbview/dcode.cpp
@@ -165,7 +165,7 @@ int GERBVIEW_FRAME::ReadDCodeDefinitionFile( const wxString& D_Code_FullFileName
     wxString msg;
     D_CODE*  dcode;
     FILE*    dest;
-    int      layer = getActiveLayer();
+    LAYER_NUM      layer = getActiveLayer();
     int      type_outil;
 
     if( g_GERBER_List[layer] == NULL )
diff --git a/gerbview/dialogs/dialog_print_using_printer.cpp b/gerbview/dialogs/dialog_print_using_printer.cpp
index 27749d4df4..31d21469ad 100644
--- a/gerbview/dialogs/dialog_print_using_printer.cpp
+++ b/gerbview/dialogs/dialog_print_using_printer.cpp
@@ -123,7 +123,7 @@ void DIALOG_PRINT_USING_PRINTER::InitValues( )
 /************************************************************************/
 {
     SetFocus();
-    int      layer_max = GERBVIEW_LAYER_COUNT;
+    LAYER_NUM layer_max = NB_GERBER_LAYERS;
     wxString msg;
 
     if( g_pageSetupData == NULL )
@@ -137,11 +137,11 @@ void DIALOG_PRINT_USING_PRINTER::InitValues( )
 
     s_Parameters.m_PageSetupData = g_pageSetupData;
 
-    layer_max = 32;
+    layer_max = NB_LAYERS;
     // Create layer list
-    int mask = 1, ii;
-    for( ii = 0; ii < layer_max; ii++, mask <<= 1 )
+    for(LAYER_NUM ii = FIRST_LAYER; ii < layer_max; ++ii )
     {
+        LAYER_MSK mask = GetLayerMask( ii );
         msg = _( "Layer" );
         msg << wxT( " " ) << ii + 1;
         m_BoxSelectLayer[ii] = new wxCheckBox( this, -1, msg );
@@ -176,7 +176,7 @@ void DIALOG_PRINT_USING_PRINTER::InitValues( )
             s_Parameters.m_XScaleAdjust = s_Parameters.m_YScaleAdjust = 1.0;
 
         s_SelectedLayers = 0;
-        for( int layer = 0;  layer<layer_max;  ++layer )
+        for( LAYER_NUM layer = FIRST_LAYER; layer<layer_max; ++layer )
         {
             wxString layerKey;
             bool     option;
@@ -225,8 +225,7 @@ int DIALOG_PRINT_USING_PRINTER::SetLayerMaskFromListSelection()
 {
     int page_count = 0;
     s_Parameters.m_PrintMaskLayer = NO_LAYERS;
-    int ii;
-    for( ii = 0, page_count = 0; ii < GERBVIEW_LAYER_COUNT; ii++ )
+    for( LAYER_NUM ii = FIRST_LAYER; ii < NB_GERBER_LAYERS; ++ii )
     {
         if( m_BoxSelectLayer[ii]->IsChecked() )
         {
@@ -255,7 +254,7 @@ void DIALOG_PRINT_USING_PRINTER::OnCloseWindow( wxCloseEvent& event )
         m_Config->Write( OPTKEY_PRINT_PAGE_FRAME, s_Parameters.m_Print_Sheet_Ref);
         m_Config->Write( OPTKEY_PRINT_MONOCHROME_MODE, s_Parameters.m_Print_Black_and_White);
         wxString layerKey;
-        for( int layer = 0;  layer < GERBVIEW_LAYER_COUNT;  ++layer )
+        for( LAYER_NUM layer = FIRST_LAYER; layer < NB_GERBER_LAYERS; ++layer )
         {
             layerKey.Printf( OPTKEY_LAYERBASE, layer );
             m_Config->Write( layerKey, m_BoxSelectLayer[layer]->IsChecked() );
diff --git a/gerbview/dialogs/dialog_select_one_pcb_layer.cpp b/gerbview/dialogs/dialog_select_one_pcb_layer.cpp
index 6c6e06f329..4da2ad218a 100644
--- a/gerbview/dialogs/dialog_select_one_pcb_layer.cpp
+++ b/gerbview/dialogs/dialog_select_one_pcb_layer.cpp
@@ -8,7 +8,7 @@
 #include <select_layers_to_pcb.h>
 
 // Exported function
-const wxString GetPCBDefaultLayerName( int aLayerNumber );
+const wxString GetPCBDefaultLayerName( LAYER_NUM aLayerNumber );
 
 
 enum layer_sel_id {
@@ -23,11 +23,11 @@ class SELECT_LAYER_DIALOG : public wxDialog
 private:
     GERBVIEW_FRAME* m_Parent;
     wxRadioBox*     m_LayerList;
-    int m_LayerId[NB_LAYERS + 1]; // One extra element for "(Deselect)" radiobutton
+    LAYER_NUM m_LayerId[int(NB_LAYERS) + 1]; // One extra element for "(Deselect)" radiobutton
 
 public:
     // Constructor and destructor
-    SELECT_LAYER_DIALOG( GERBVIEW_FRAME* parent, int aDefaultLayer,
+    SELECT_LAYER_DIALOG( GERBVIEW_FRAME* parent, LAYER_NUM aDefaultLayer,
                          int aCopperLayerCount, bool aShowDeselectOption );
     ~SELECT_LAYER_DIALOG() { };
 
@@ -61,9 +61,9 @@ END_EVENT_TABLE()
  * different radiobutton is clicked on) prior to then clicking on the "Deselect"
  * button provided within the "Layer selection:" dialog box).
  */
-int GERBVIEW_FRAME::SelectPCBLayer( int aDefaultLayer, int aCopperLayerCount, bool aShowDeselectOption )
+LAYER_NUM GERBVIEW_FRAME::SelectPCBLayer( LAYER_NUM aDefaultLayer, int aCopperLayerCount, bool aShowDeselectOption )
 {
-    int layer;
+    LAYER_NUM layer;
     SELECT_LAYER_DIALOG* frame = new SELECT_LAYER_DIALOG( this, aDefaultLayer,
                                                           aCopperLayerCount,
                                                           aShowDeselectOption );
@@ -81,14 +81,14 @@ int GERBVIEW_FRAME::SelectPCBLayer( int aDefaultLayer, int aCopperLayerCount, bo
  * to the right of that radiobox.
  */
 SELECT_LAYER_DIALOG::SELECT_LAYER_DIALOG( GERBVIEW_FRAME* parent,
-                                          int aDefaultLayer, int aCopperLayerCount,
+                                          LAYER_NUM aDefaultLayer, int aCopperLayerCount,
                                           bool aShowDeselectOption ) :
     wxDialog( parent, -1, _( "Select Layer:" ), wxPoint( -1, -1 ),
               wxSize( 470, 250 ),
               DIALOG_STYLE )
 {
     wxButton* Button;
-    int       ii;
+    LAYER_NUM ii;
     wxString  LayerList[NB_LAYERS + 1]; // One extra element for "(Deselect)"
                                         // radiobutton
     int       LayerCount, LayerSelect = -1;
@@ -97,11 +97,11 @@ SELECT_LAYER_DIALOG::SELECT_LAYER_DIALOG( GERBVIEW_FRAME* parent,
 
     // Build the layer list; first build copper layers list
     LayerCount = 0;
-    for( ii = 0; ii < BOARD_COPPER_LAYERS_MAX_COUNT; ii++ )
+    for( ii = FIRST_COPPER_LAYER; ii < NB_COPPER_LAYERS; ++ii )
     {
-        m_LayerId[ii] = 0;
+        m_LayerId[ii] = FIRST_LAYER;
 
-        if( ii == 0 || ii == BOARD_COPPER_LAYERS_MAX_COUNT-1 || ii < aCopperLayerCount-1 )
+        if( ii == FIRST_COPPER_LAYER || ii == LAST_COPPER_LAYER || ii < aCopperLayerCount-1 )
         {
             LayerList[LayerCount] = GetPCBDefaultLayerName( ii );
 
@@ -113,9 +113,9 @@ SELECT_LAYER_DIALOG::SELECT_LAYER_DIALOG( GERBVIEW_FRAME* parent,
         }
     }
     // Build the layer list; build copper layers list
-    for( ; ii < NB_LAYERS; ii++ )
+    for( ; ii < NB_LAYERS; ++ii )
     {
-        m_LayerId[ii] = 0;
+        m_LayerId[ii] = FIRST_LAYER;
 
         LayerList[LayerCount] = GetPCBDefaultLayerName( ii );
 
@@ -131,10 +131,10 @@ SELECT_LAYER_DIALOG::SELECT_LAYER_DIALOG( GERBVIEW_FRAME* parent,
     {
         LayerList[LayerCount] = _( "(Deselect)" );
 
-        if( NB_LAYERS == aDefaultLayer )
+        if( NB_PCB_LAYERS == aDefaultLayer )
             LayerSelect = LayerCount;
 
-        m_LayerId[LayerCount] = NB_LAYERS;
+        m_LayerId[LayerCount] = NB_PCB_LAYERS;
         LayerCount++;
     }
 
@@ -181,7 +181,7 @@ void SELECT_LAYER_DIALOG::OnCancelClick( wxCommandEvent& event )
     EndModal( -1 );
 }
 
-const wxString GetPCBDefaultLayerName( int aLayerNumber )
+const wxString GetPCBDefaultLayerName( LAYER_NUM aLayerNumber )
 {
     const wxChar* txt;
 
diff --git a/gerbview/draw_gerber_screen.cpp b/gerbview/draw_gerber_screen.cpp
index 42aa4d79dd..198eb78efd 100644
--- a/gerbview/draw_gerber_screen.cpp
+++ b/gerbview/draw_gerber_screen.cpp
@@ -193,9 +193,9 @@ void GBR_LAYOUT::Draw( EDA_DRAW_PANEL* aPanel, wxDC* aDC, GR_DRAWMODE aDrawMode,
 
     bool end = false;
 
-    for( int layer = 0; !end; layer++ )
+    for( LAYER_NUM layer = FIRST_LAYER; !end; ++layer )
     {
-        int active_layer = gerbFrame->getActiveLayer();
+        LAYER_NUM active_layer = gerbFrame->getActiveLayer();
 
         if( layer == active_layer ) // active layer will be drawn after other layers
             continue;
diff --git a/gerbview/events_called_functions.cpp b/gerbview/events_called_functions.cpp
index 46b69c1385..28df5efb48 100644
--- a/gerbview/events_called_functions.cpp
+++ b/gerbview/events_called_functions.cpp
@@ -235,7 +235,7 @@ void GERBVIEW_FRAME::OnSelectActiveDCode( wxCommandEvent& event )
  */
 void GERBVIEW_FRAME::OnSelectActiveLayer( wxCommandEvent& event )
 {
-    int layer = getActiveLayer();
+    LAYER_NUM layer = getActiveLayer();
 
     setActiveLayer( event.GetSelection() );
 
@@ -249,7 +249,7 @@ void GERBVIEW_FRAME::OnSelectActiveLayer( wxCommandEvent& event )
  */
 void GERBVIEW_FRAME::OnShowGerberSourceFile( wxCommandEvent& event )
 {
-    int           layer = getActiveLayer();
+    LAYER_NUM     layer = getActiveLayer();
     GERBER_IMAGE* gerber_layer = g_GERBER_List[layer];
 
     if( gerber_layer )
diff --git a/gerbview/excellon_read_drill_file.cpp b/gerbview/excellon_read_drill_file.cpp
index 7d6a07e32e..2057432fae 100644
--- a/gerbview/excellon_read_drill_file.cpp
+++ b/gerbview/excellon_read_drill_file.cpp
@@ -78,13 +78,13 @@ extern double ReadDouble( char*& text, bool aSkipSeparator = true );
 extern void fillFlashedGBRITEM(  GERBER_DRAW_ITEM* aGbrItem,
                                  APERTURE_T        aAperture,
                                  int               Dcode_index,
-                                 int               aLayer,
+                                 LAYER_NUM         aLayer,
                                  const wxPoint&    aPos,
                                  wxSize            aSize,
                                  bool              aLayerNegative );
 void fillLineGBRITEM(  GERBER_DRAW_ITEM* aGbrItem,
                               int               Dcode_index,
-                              int               aLayer,
+                              LAYER_NUM         aLayer,
                               const wxPoint&    aStart,
                               const wxPoint&    aEnd,
                               wxSize            aPenSize,
@@ -153,7 +153,7 @@ static EXCELLON_CMD excellon_G_CmdList[] =
 bool GERBVIEW_FRAME::Read_EXCELLON_File( const wxString& aFullFileName )
 {
     wxString msg;
-    int      layer = getActiveLayer();      // current layer used in GerbView
+    LAYER_NUM layer = getActiveLayer();      // current layer used in GerbView
 
     if( g_GERBER_List[layer] == NULL )
     {
diff --git a/gerbview/export_to_pcbnew.cpp b/gerbview/export_to_pcbnew.cpp
index 73510a082b..c7c2c6d018 100644
--- a/gerbview/export_to_pcbnew.cpp
+++ b/gerbview/export_to_pcbnew.cpp
@@ -44,7 +44,7 @@ public:
      * Function ExportPcb
      * saves a board from a set of Gerber images.
      */
-    bool    ExportPcb( int* LayerLookUpTable );
+    bool    ExportPcb( LAYER_NUM* LayerLookUpTable );
 
 private:
     /**
@@ -53,7 +53,7 @@ private:
      * @param aGbrItem = the Gerber item (line, arc) to export
      * @param aLayer = the technical layer to use
      */
-    void    export_non_copper_item( GERBER_DRAW_ITEM* aGbrItem, int aLayer );
+    void    export_non_copper_item( GERBER_DRAW_ITEM* aGbrItem, LAYER_NUM aLayer );
 
     /**
      * Function export_copper_item
@@ -61,7 +61,7 @@ private:
      * @param aGbrItem = the Gerber item (line, arc, flashed) to export
      * @param aLayer = the copper layer to use
      */
-    void    export_copper_item( GERBER_DRAW_ITEM* aGbrItem, int aLayer );
+    void    export_copper_item( GERBER_DRAW_ITEM* aGbrItem, LAYER_NUM aLayer );
 
     /**
      * Function export_flashed_copper_item
@@ -76,7 +76,7 @@ private:
      * @param aGbrItem = the Gerber item (line only) to export
      * @param aLayer = the copper layer to use
      */
-    void    export_segline_copper_item( GERBER_DRAW_ITEM* aGbrItem, int aLayer );
+    void    export_segline_copper_item( GERBER_DRAW_ITEM* aGbrItem, LAYER_NUM aLayer );
 
     /**
      * Function export_segarc_copper_item
@@ -85,7 +85,7 @@ private:
      * @param aGbrItem = the Gerber item (arc only) to export
      * @param aLayer = the copper layer to use
      */
-    void    export_segarc_copper_item( GERBER_DRAW_ITEM* aGbrItem, int aLayer );
+    void    export_segarc_copper_item( GERBER_DRAW_ITEM* aGbrItem, LAYER_NUM aLayer );
 
     /**
      * function writePcbLineItem
@@ -93,7 +93,7 @@ private:
      * to the board file
      */
     void    writePcbLineItem( int aShape, int aType, wxPoint& aStart, wxPoint& aEnd,
-                              int aWidth, int aLayer, int aDrill, int aAngle = 0 );
+                              int aWidth, LAYER_NUM aLayer, int aDrill, int aAngle = 0 );
 
     /**
      * function writePcbHeader
@@ -123,7 +123,7 @@ void GERBVIEW_FRAME::ExportDataInPcbnewFormat( wxCommandEvent& event )
     int layercount = 0;
 
     // Count the Gerber layers which are actually currently used
-    for( int ii = 0; ii < GERBVIEW_LAYER_COUNT; ii++ )
+    for( LAYER_NUM ii = FIRST_LAYER; ii < NB_GERBER_LAYERS; ++ii )
     {
         if( g_GERBER_List[ii] != NULL )
             layercount++;
@@ -170,7 +170,7 @@ void GERBVIEW_FRAME::ExportDataInPcbnewFormat( wxCommandEvent& event )
 }
 
 
-bool GBR_TO_PCB_EXPORTER::ExportPcb( int* LayerLookUpTable )
+bool GBR_TO_PCB_EXPORTER::ExportPcb( LAYER_NUM* LayerLookUpTable )
 {
     m_fp = wxFopen( m_pcb_file_name, wxT( "wt" ) );
 
@@ -182,7 +182,7 @@ bool GBR_TO_PCB_EXPORTER::ExportPcb( int* LayerLookUpTable )
         return false;
     }
 
-    m_pcbCopperLayersCount = LayerLookUpTable[GERBVIEW_LAYER_COUNT];
+    m_pcbCopperLayersCount = LayerLookUpTable[NB_GERBER_LAYERS];
 
     writePcbHeader();
 
@@ -192,10 +192,10 @@ bool GBR_TO_PCB_EXPORTER::ExportPcb( int* LayerLookUpTable )
 
     for( ; gerb_item; gerb_item = gerb_item->Next() )
     {
-        int layer = gerb_item->GetLayer();
-        int pcb_layer_number = LayerLookUpTable[layer];
+        LAYER_NUM layer = gerb_item->GetLayer();
+        LAYER_NUM pcb_layer_number = LayerLookUpTable[layer];
 
-        if( pcb_layer_number < 0 || pcb_layer_number > LAST_NO_COPPER_LAYER )
+        if( pcb_layer_number < FIRST_LAYER || pcb_layer_number > LAST_NON_COPPER_LAYER )
             continue;
 
         if( pcb_layer_number > LAST_COPPER_LAYER )
@@ -208,8 +208,8 @@ bool GBR_TO_PCB_EXPORTER::ExportPcb( int* LayerLookUpTable )
 
     for( ; gerb_item; gerb_item = gerb_item->Next() )
     {
-        int layer = gerb_item->GetLayer();
-        int pcb_layer_number = LayerLookUpTable[layer];
+        LAYER_NUM layer = gerb_item->GetLayer();
+        LAYER_NUM pcb_layer_number = LayerLookUpTable[layer];
 
         if( pcb_layer_number < 0 || pcb_layer_number > LAST_COPPER_LAYER )
             continue;
@@ -227,7 +227,7 @@ bool GBR_TO_PCB_EXPORTER::ExportPcb( int* LayerLookUpTable )
 }
 
 
-void GBR_TO_PCB_EXPORTER::export_non_copper_item( GERBER_DRAW_ITEM* aGbrItem, int aLayer )
+void GBR_TO_PCB_EXPORTER::export_non_copper_item( GERBER_DRAW_ITEM* aGbrItem, LAYER_NUM aLayer )
 {
     #define SEG_SHAPE   0
     #define ARC_SHAPE   2
@@ -263,7 +263,7 @@ void GBR_TO_PCB_EXPORTER::export_non_copper_item( GERBER_DRAW_ITEM* aGbrItem, in
 }
 
 
-void GBR_TO_PCB_EXPORTER::export_copper_item( GERBER_DRAW_ITEM* aGbrItem, int aLayer )
+void GBR_TO_PCB_EXPORTER::export_copper_item( GERBER_DRAW_ITEM* aGbrItem, LAYER_NUM aLayer )
 {
     switch( aGbrItem->m_Shape )
     {
@@ -285,7 +285,7 @@ void GBR_TO_PCB_EXPORTER::export_copper_item( GERBER_DRAW_ITEM* aGbrItem, int aL
 }
 
 
-void GBR_TO_PCB_EXPORTER::export_segline_copper_item( GERBER_DRAW_ITEM* aGbrItem, int aLayer )
+void GBR_TO_PCB_EXPORTER::export_segline_copper_item( GERBER_DRAW_ITEM* aGbrItem, LAYER_NUM aLayer )
 {
     wxPoint seg_start, seg_end;
 
@@ -300,7 +300,7 @@ void GBR_TO_PCB_EXPORTER::export_segline_copper_item( GERBER_DRAW_ITEM* aGbrItem
 }
 
 
-void GBR_TO_PCB_EXPORTER::export_segarc_copper_item( GERBER_DRAW_ITEM* aGbrItem, int aLayer )
+void GBR_TO_PCB_EXPORTER::export_segarc_copper_item( GERBER_DRAW_ITEM* aGbrItem, LAYER_NUM aLayer )
 {
     double  a = atan2( (double) ( aGbrItem->m_Start.y - aGbrItem->m_ArcCentre.y ),
                        (double) ( aGbrItem->m_Start.x - aGbrItem->m_ArcCentre.x ) );
@@ -378,7 +378,9 @@ void GBR_TO_PCB_EXPORTER::export_flashed_copper_item( GERBER_DRAW_ITEM* aGbrItem
     // Layers are 0 to 15 (Cu/Cmp) = 0x0F
     #define IS_VIA 1
     #define SHAPE_VIA_THROUGH 3
-    writePcbLineItem( SHAPE_VIA_THROUGH, IS_VIA, via_pos, via_pos, width, 0x0F, -1 );
+    // XXX EVIL usage of LAYER
+    writePcbLineItem( SHAPE_VIA_THROUGH, IS_VIA, via_pos, via_pos, width,
+                      0x0F, -1 );
 }
 
 
@@ -408,7 +410,7 @@ void GBR_TO_PCB_EXPORTER::writePcbHeader()
 
 
 void GBR_TO_PCB_EXPORTER::writePcbLineItem( int aShape, int aType, wxPoint& aStart, wxPoint& aEnd,
-                                            int aWidth, int aLayer, int aDrill, int aAngle )
+                                            int aWidth, LAYER_NUM aLayer, int aDrill, int aAngle )
 {
     if( aDrill <= -2 )
         fprintf( m_fp, "$DRAWSEGMENT\n" );
diff --git a/gerbview/files.cpp b/gerbview/files.cpp
index 5d0a8aaf7d..14cb8fc4df 100644
--- a/gerbview/files.cpp
+++ b/gerbview/files.cpp
@@ -168,7 +168,7 @@ bool GERBVIEW_FRAME::LoadGerberFiles( const wxString& aFullFileName )
     }
 
     // Read gerber files: each file is loaded on a new GerbView layer
-    int layer = getActiveLayer();
+    LAYER_NUM layer = getActiveLayer();
 
     for( unsigned ii = 0; ii < filenamesList.GetCount(); ii++ )
     {
@@ -249,7 +249,7 @@ bool GERBVIEW_FRAME::LoadExcellonFiles( const wxString& aFullFileName )
     }
 
     // Read gerber files: each file is loaded on a new GerbView layer
-    int layer = getActiveLayer();
+    LAYER_NUM layer = getActiveLayer();
 
     for( unsigned ii = 0; ii < filenamesList.GetCount(); ii++ )
     {
diff --git a/gerbview/gerbview.cpp b/gerbview/gerbview.cpp
index 36bbd91341..a79cf2038a 100644
--- a/gerbview/gerbview.cpp
+++ b/gerbview/gerbview.cpp
@@ -126,15 +126,16 @@ bool EDA_APP::OnInit()
             wxSetWorkingDirectory( fn.GetPath() );
 
         // Load all files specified on the command line.
-        int jj = 0;
+        LAYER_NUM jj = FIRST_LAYER;
 
-        for( int ii = 1; ii < argc && ii <= GERBVIEW_LAYER_COUNT; ++ii )
+        for( LAYER_NUM ii = LAYER_N_2; ii < argc && ii <= NB_GERBER_LAYERS; ++ii )
         {
             fn = wxFileName( argv[ii] );
 
             if( fn.FileExists() )
             {
-                frame->setActiveLayer( jj++ );
+                frame->setActiveLayer( jj );
+                ++jj;
                 frame->LoadGerberFiles( fn.GetFullPath() );
             }
         }
diff --git a/gerbview/gerbview.h b/gerbview/gerbview.h
index 48fd793af5..42a469a631 100644
--- a/gerbview/gerbview.h
+++ b/gerbview/gerbview.h
@@ -24,8 +24,6 @@ class PAGE_INFO;
 */
 #define GERBER_BUFZ     4000
 
-#define GERBVIEW_LAYER_COUNT 32     // Number of different layers shown by GerbView
-
 /// List of page sizes
 extern const wxChar* g_GerberPageSizeList[8];
 
diff --git a/gerbview/gerbview_frame.cpp b/gerbview/gerbview_frame.cpp
index b1b9945afb..ab0c0e8217 100644
--- a/gerbview/gerbview_frame.cpp
+++ b/gerbview/gerbview_frame.cpp
@@ -92,7 +92,7 @@ GERBVIEW_FRAME::GERBVIEW_FRAME( wxWindow* aParent, const wxString& aTitle,
 
     SetLayout( new GBR_LAYOUT() );
 
-    SetVisibleLayers( -1 );     // All 32 layers visible.
+    SetVisibleLayers( FULL_LAYERS );     // All 32 layers visible.
 
     SetScreen( new GBR_SCREEN( GetLayout()->GetPageSettings().GetSizeIU() ) );
 
@@ -325,21 +325,21 @@ void GERBVIEW_FRAME::SetElementVisibility( GERBER_VISIBLE_ID aItemIdVisible,
 }
 
 
-int GERBVIEW_FRAME::getNextAvailableLayer( int aLayer ) const
+LAYER_NUM GERBVIEW_FRAME::getNextAvailableLayer( LAYER_NUM aLayer ) const
 {
-    int layer = aLayer;
+    LAYER_NUM layer = aLayer;
 
-    for( int i = 0; i < GERBVIEW_LAYER_COUNT; i++ )
+    for( LAYER_NUM i = FIRST_LAYER; i < NB_GERBER_LAYERS; ++i )
     {
         GERBER_IMAGE* gerber = g_GERBER_List[ layer ];
 
         if( gerber == NULL || gerber->m_FileName.IsEmpty() )
             return layer;
 
-        layer++;
+        ++layer;
 
-        if( layer >= GERBVIEW_LAYER_COUNT )
-            layer = 0;
+        if( layer >= NB_GERBER_LAYERS )
+            layer = FIRST_LAYER;
     }
 
     return NO_AVAILABLE_LAYERS;
@@ -385,9 +385,9 @@ void GERBVIEW_FRAME::Liste_D_Codes()
     wxString        Line;
     wxArrayString   list;
     double          scale = IU_PER_MILS * 1000;
-    int             curr_layer = getActiveLayer();
+    LAYER_NUM       curr_layer = getActiveLayer();
 
-    for( int layer = 0; layer < 32; layer++ )
+    for( LAYER_NUM layer = FIRST_LAYER; layer < NB_LAYERS; ++layer )
     {
         GERBER_IMAGE* gerber = g_GERBER_List[layer];
 
@@ -539,7 +539,7 @@ void GERBVIEW_FRAME::SetVisibleAlls()
  */
 LAYER_MSK GERBVIEW_FRAME::GetVisibleLayers() const
 {
-    return -1;    // TODO
+    return FULL_LAYERS;    // TODO
 }
 
 
@@ -561,7 +561,7 @@ void GERBVIEW_FRAME::SetVisibleLayers( LAYER_MSK aLayerMask )
  * @param aLayerIndex = The index of the layer to be tested
  * @return bool - true if the layer is visible.
  */
-bool GERBVIEW_FRAME::IsLayerVisible( int aLayerIndex ) const
+bool GERBVIEW_FRAME::IsLayerVisible( LAYER_NUM aLayerIndex ) const
 {
     if( ! m_DisplayOptions.m_IsPrinting )
         return m_LayersManager->IsLayerVisible( aLayerIndex );
@@ -650,7 +650,7 @@ EDA_COLOR_T GERBVIEW_FRAME::GetNegativeItemsColor() const
  * Function GetLayerColor
  * gets a layer color for any valid layer.
  */
-EDA_COLOR_T GERBVIEW_FRAME::GetLayerColor( int aLayer ) const
+EDA_COLOR_T GERBVIEW_FRAME::GetLayerColor( LAYER_NUM aLayer ) const
 {
     return m_colorsSettings->GetLayerColor( aLayer );
 }
@@ -660,7 +660,7 @@ EDA_COLOR_T GERBVIEW_FRAME::GetLayerColor( int aLayer ) const
  * Function SetLayerColor
  * changes a layer color for any valid layer.
  */
-void GERBVIEW_FRAME::SetLayerColor( int aLayer, EDA_COLOR_T aColor )
+void GERBVIEW_FRAME::SetLayerColor( LAYER_NUM aLayer, EDA_COLOR_T aColor )
 {
     m_colorsSettings->SetLayerColor( aLayer, aColor );
 }
@@ -670,7 +670,7 @@ void GERBVIEW_FRAME::SetLayerColor( int aLayer, EDA_COLOR_T aColor )
  * Function getActiveLayer
  * returns the active layer
  */
-int GERBVIEW_FRAME::getActiveLayer()
+LAYER_NUM GERBVIEW_FRAME::getActiveLayer()
 {
     return ( (GBR_SCREEN*) GetScreen() )->m_Active_Layer;
 }
@@ -681,7 +681,7 @@ int GERBVIEW_FRAME::getActiveLayer()
  * will change the currently active layer to \a aLayer and also
  * update the PCB_LAYER_WIDGET.
  */
-void GERBVIEW_FRAME::setActiveLayer( int aLayer, bool doLayerWidgetUpdate )
+void GERBVIEW_FRAME::setActiveLayer( LAYER_NUM aLayer, bool doLayerWidgetUpdate )
 {
     ( (GBR_SCREEN*) GetScreen() )->m_Active_Layer = aLayer;
 
diff --git a/gerbview/gerbview_frame.h b/gerbview/gerbview_frame.h
index bc69fd4915..36ccf8e7e3 100644
--- a/gerbview/gerbview_frame.h
+++ b/gerbview/gerbview_frame.h
@@ -39,7 +39,7 @@
 #include <class_gbr_screen.h>
 #include <layers_id_colors_and_visibility.h>
 
-#define NO_AVAILABLE_LAYERS -1
+#define NO_AVAILABLE_LAYERS UNDEFINED_LAYER
 
 class DCODE_SELECTION_BOX;
 class GERBER_LAYER_WIDGET;
@@ -145,10 +145,10 @@ public:
     void                SetCurItem( GERBER_DRAW_ITEM* aItem, bool aDisplayInfo = true );
 
     /** Install the dialog box for layer selection
-     * @param aDefaultLayer = Preselection (NB_LAYERS for "(Deselect)" layer)
+     * @param aDefaultLayer = Preselection (NB_PCB_LAYERS for "(Deselect)" layer)
      * @param aCopperLayerCount = number of copper layers
      * @param aShowDeselectOption = display a "(Deselect)" radiobutton (when set to true)
-     * @return new layer value (NB_LAYERS when "(Deselect)" radiobutton selected),
+     * @return new layer value (NB_PCB_LAYERS when "(Deselect)" radiobutton selected),
      *                         or -1 if canceled
      *
      * Providing the option to also display a "(Deselect)" radiobutton makes the
@@ -159,7 +159,7 @@ public:
      * different radiobutton is clicked on) prior to then clicking on the "Deselect"
      * button provided within the "Layer selection:" dialog box).
      */
-    int SelectPCBLayer( int aDefaultLayer, int aOpperLayerCount, bool aNullLayer = false );
+    LAYER_NUM SelectPCBLayer( LAYER_NUM aDefaultLayer, int aOpperLayerCount, bool aNullLayer = false );
 
 protected:
     GERBER_LAYER_WIDGET*    m_LayersManager;
@@ -316,7 +316,7 @@ public:
      * @param aLayerIndex = The index of the layer to be tested
      * @return bool - true if the layer is visible.
      */
-    bool    IsLayerVisible( int aLayerIndex ) const;
+    bool    IsLayerVisible( LAYER_NUM aLayerIndex ) const;
 
     /**
      * Function GetVisibleElementColor
@@ -330,13 +330,13 @@ public:
      * Function GetLayerColor
      * gets a layer color for any valid layer.
      */
-    EDA_COLOR_T GetLayerColor( int aLayer ) const;
+    EDA_COLOR_T GetLayerColor( LAYER_NUM aLayer ) const;
 
     /**
      * Function SetLayerColor
      * changes a layer color for any valid layer.
      */
-    void    SetLayerColor( int aLayer, EDA_COLOR_T aColor );
+    void    SetLayerColor( LAYER_NUM aLayer, EDA_COLOR_T aColor );
 
     /**
      * Function GetNegativeItemsColor
@@ -388,13 +388,13 @@ public:
      * will change the currently active layer to \a aLayer and also
      * update the PCB_LAYER_WIDGET.
      */
-    void    setActiveLayer( int aLayer, bool doLayerWidgetUpdate = true );
+    void    setActiveLayer( LAYER_NUM aLayer, bool doLayerWidgetUpdate = true );
 
     /**
      * Function getActiveLayer
      * returns the active layer
      */
-    int     getActiveLayer();
+    LAYER_NUM getActiveLayer();
 
     /**
      * Function getNextAvailableLayer
@@ -403,7 +403,7 @@ public:
      * @param aLayer The first layer to search.
      * @return The first empty layer found or NO_AVAILABLE_LAYERS.
      */
-    int     getNextAvailableLayer( int aLayer = 0 ) const;
+    LAYER_NUM getNextAvailableLayer( LAYER_NUM aLayer = FIRST_LAYER ) const;
 
     bool hasAvailableLayers() const
     {
diff --git a/gerbview/initpcb.cpp b/gerbview/initpcb.cpp
index 2c84644919..0efef5b750 100644
--- a/gerbview/initpcb.cpp
+++ b/gerbview/initpcb.cpp
@@ -39,7 +39,7 @@
 
 bool GERBVIEW_FRAME::Clear_Pcb( bool query )
 {
-    int layer;
+    LAYER_NUM layer;
 
     if( GetLayout() == NULL )
         return false;
@@ -52,7 +52,7 @@ bool GERBVIEW_FRAME::Clear_Pcb( bool query )
 
     GetLayout()->m_Drawings.DeleteAll();
 
-    for( layer = 0; layer < GERBVIEW_LAYER_COUNT; layer++ )
+    for( layer = FIRST_LAYER; layer < NB_GERBER_LAYERS; ++layer )
     {
         if( g_GERBER_List[layer] )
         {
@@ -65,7 +65,7 @@ bool GERBVIEW_FRAME::Clear_Pcb( bool query )
 
     SetScreen( new GBR_SCREEN( GetPageSettings().GetSizeIU() ) );
 
-    setActiveLayer(0);
+    setActiveLayer( FIRST_LAYER );
     m_LayersManager->UpdateLayerIcons();
     syncLayerBox();
     return true;
@@ -74,7 +74,7 @@ bool GERBVIEW_FRAME::Clear_Pcb( bool query )
 
 void GERBVIEW_FRAME::Erase_Current_Layer( bool query )
 {
-    int      layer = getActiveLayer();
+    LAYER_NUM layer = getActiveLayer();
     wxString msg;
 
     msg.Printf( _( "Clear layer %d?" ), layer + 1 );
diff --git a/gerbview/locate.cpp b/gerbview/locate.cpp
index 38261076a4..4a16337f68 100644
--- a/gerbview/locate.cpp
+++ b/gerbview/locate.cpp
@@ -46,7 +46,7 @@ GERBER_DRAW_ITEM* GERBVIEW_FRAME::Locate( const wxPoint& aPosition, int aTypeloc
     if( aTypeloc == CURSEUR_ON_GRILLE )
         ref = GetScreen()->GetNearestGridPosition( ref );
 
-    int layer = getActiveLayer();
+    LAYER_NUM layer = getActiveLayer();
 
     // Search first on active layer
     GERBER_DRAW_ITEM* gerb_item = GetItemsList();
diff --git a/gerbview/readgerb.cpp b/gerbview/readgerb.cpp
index 3c89f21c08..45f0541b32 100644
--- a/gerbview/readgerb.cpp
+++ b/gerbview/readgerb.cpp
@@ -24,7 +24,7 @@ bool GERBVIEW_FRAME::Read_GERBER_File( const wxString& GERBER_FullFileName,
 
     wxString msg;
     char*    text;
-    int      layer;         /* current layer used in GerbView */
+    LAYER_NUM layer;         // current layer used in GerbView
 
     layer = getActiveLayer();
 
diff --git a/gerbview/rs274d.cpp b/gerbview/rs274d.cpp
index 1256aeaae3..e7681bbedd 100644
--- a/gerbview/rs274d.cpp
+++ b/gerbview/rs274d.cpp
@@ -88,7 +88,7 @@
 void fillFlashedGBRITEM(  GERBER_DRAW_ITEM* aGbrItem,
                                  APERTURE_T        aAperture,
                                  int               Dcode_index,
-                                 int               aLayer,
+                                 LAYER_NUM         aLayer,
                                  const wxPoint&    aPos,
                                  wxSize            aSize,
                                  bool              aLayerNegative )
@@ -140,7 +140,7 @@ void fillFlashedGBRITEM(  GERBER_DRAW_ITEM* aGbrItem,
  */
 void fillLineGBRITEM(  GERBER_DRAW_ITEM* aGbrItem,
                               int               Dcode_index,
-                              int               aLayer,
+                              LAYER_NUM         aLayer,
                               const wxPoint&    aStart,
                               const wxPoint&    aEnd,
                               wxSize            aPenSize,
@@ -189,7 +189,7 @@ void fillLineGBRITEM(  GERBER_DRAW_ITEM* aGbrItem,
  *                      false when arc is inside one quadrant
  * @param aLayerNegative = true if the current layer is negative
  */
-static void fillArcGBRITEM(  GERBER_DRAW_ITEM* aGbrItem, int Dcode_index, int aLayer,
+static void fillArcGBRITEM(  GERBER_DRAW_ITEM* aGbrItem, int Dcode_index, LAYER_NUM aLayer,
                              const wxPoint& aStart, const wxPoint& aEnd,
                              const wxPoint& aRelCenter, wxSize aPenSize,
                              bool aClockwise, bool aMultiquadrant,
@@ -328,7 +328,7 @@ static void fillArcPOLY(  GERBER_DRAW_ITEM* aGbrItem,
 
     aGbrItem->SetLayerPolarity( aLayerNegative );
 
-    fillArcGBRITEM(  &dummyGbrItem, 0, 0,
+    fillArcGBRITEM(  &dummyGbrItem, 0, FIRST_LAYER,
                      aStart, aEnd, rel_center, wxSize(0, 0),
                      aClockwise, aMultiquadrant, aLayerNegative );
 
@@ -549,7 +549,7 @@ bool GERBER_IMAGE::Execute_DCODE_Command( char*& text, int D_commande )
     GERBER_DRAW_ITEM* gbritem;
     GBR_LAYOUT*       layout = m_Parent->GetLayout();
 
-    int      activeLayer = m_Parent->getActiveLayer();
+    LAYER_NUM activeLayer = m_Parent->getActiveLayer();
 
     int      dcode = 0;
     D_CODE*  tool  = NULL;
diff --git a/gerbview/select_layers_to_pcb.cpp b/gerbview/select_layers_to_pcb.cpp
index a8a3c8d756..def5128ef1 100644
--- a/gerbview/select_layers_to_pcb.cpp
+++ b/gerbview/select_layers_to_pcb.cpp
@@ -35,12 +35,12 @@
 #include <select_layers_to_pcb.h>
 
 // Imported function
-extern const wxString GetPCBDefaultLayerName( int aLayerNumber );
+extern const wxString GetPCBDefaultLayerName( LAYER_NUM aLayerNumber );
 
 enum swap_layer_id {
     ID_LAYERS_MAP_DIALOG = ID_GERBER_END_LIST,
     ID_BUTTON_0,
-    ID_TEXT_0 = ID_BUTTON_0 + GERBVIEW_LAYER_COUNT
+    ID_TEXT_0 = ID_BUTTON_0 + NB_GERBER_LAYERS
 };
 
 
@@ -54,7 +54,7 @@ int LAYERS_MAP_DIALOG::m_exportBoardCopperLayersCount = 2;
 
 
 BEGIN_EVENT_TABLE( LAYERS_MAP_DIALOG, LAYERS_MAP_DIALOG_BASE )
-    EVT_COMMAND_RANGE( ID_BUTTON_0, ID_BUTTON_0 + GERBVIEW_LAYER_COUNT-1,
+    EVT_COMMAND_RANGE( ID_BUTTON_0, ID_BUTTON_0 + NB_GERBER_LAYERS-1,
                        wxEVT_COMMAND_BUTTON_CLICKED,
                        LAYERS_MAP_DIALOG::OnSelectLayer )
 END_EVENT_TABLE()
@@ -102,11 +102,11 @@ void LAYERS_MAP_DIALOG::initDialog()
     // the above code should be modified as required in the event that those
     // buttons should be some other size in that version.
 
-    for( int ii = 0; ii < GERBVIEW_LAYER_COUNT; ii++ )
+    for( LAYER_NUM ii = FIRST_LAYER; ii < NB_GERBER_LAYERS; ++ii )
     {
         // Specify the default value for each member of these arrays.
         m_buttonTable[ii] = -1;
-        m_layersLookUpTable[ii] = LAYER_UNSELECTED;
+        m_layersLookUpTable[ii] = UNSELECTED_LAYER;
     }
 
     // Ensure we have:
@@ -118,9 +118,9 @@ void LAYERS_MAP_DIALOG::initDialog()
     int idx = ( m_exportBoardCopperLayersCount / 2 ) - 1;
     m_comboCopperLayersCount->SetSelection( idx );
 
-    int pcb_layer_num = 0;
+    LAYER_NUM pcb_layer_num = FIRST_LAYER;
     m_itemsCount = 0;
-    for( int ii = 0; ii < GERBVIEW_LAYER_COUNT; ii++ )
+    for( LAYER_NUM ii = FIRST_LAYER; ii < NB_GERBER_LAYERS; ++ii )
     {
         if( g_GERBER_List[ii] == NULL )
             continue;
@@ -132,10 +132,10 @@ void LAYERS_MAP_DIALOG::initDialog()
         m_buttonTable[m_itemsCount] = ii;
         m_layersLookUpTable[ii]  = pcb_layer_num;
         m_itemsCount++;
-        pcb_layer_num++;
+        ++pcb_layer_num;
     }
 
-    if( m_itemsCount <= GERBVIEW_LAYER_COUNT/2 )    // Only one list is enough
+    if( m_itemsCount <= NB_GERBER_LAYERS/2 )    // Only one list is enough
     {
         m_staticlineSep->Hide();
     }
@@ -177,7 +177,7 @@ void LAYERS_MAP_DIALOG::initDialog()
         // is nb_items; otherwise, the number of rows is 16 (with two
         // separate columns of controls being used if nb_items > 16).
 
-        if( ii == GERBVIEW_LAYER_COUNT/2 )
+        if( ii == NB_GERBER_LAYERS/2 )
             flexColumnBoxSizer = m_flexRightColumnBoxSizer;
 
         // Provide a text string to identify the Gerber layer
@@ -225,7 +225,7 @@ void LAYERS_MAP_DIALOG::initDialog()
                                      wxDefaultSize, 0 );
             goodSize = text->GetSize();
 
-            for( int jj = 0; jj < BOARD_LAYERS_MAX_COUNT; jj++ )
+            for( LAYER_NUM jj = FIRST_LAYER; jj < NB_LAYERS; ++jj )
             {
                 text->SetLabel( GetPCBDefaultLayerName( jj ) );
                 if( goodSize.x < text->GetSize().x )
@@ -258,8 +258,8 @@ void LAYERS_MAP_DIALOG::normalizeBrdLayersCount()
     if( ( m_exportBoardCopperLayersCount & 1 ) )
         m_exportBoardCopperLayersCount++;
 
-    if( m_exportBoardCopperLayersCount > BOARD_COPPER_LAYERS_MAX_COUNT )
-        m_exportBoardCopperLayersCount = BOARD_COPPER_LAYERS_MAX_COUNT;
+    if( m_exportBoardCopperLayersCount > NB_LAYERS )
+        m_exportBoardCopperLayersCount = NB_LAYERS;
 
     if( m_exportBoardCopperLayersCount < 2 )
         m_exportBoardCopperLayersCount = 2;
@@ -281,8 +281,9 @@ void LAYERS_MAP_DIALOG::OnBrdLayersCountSelection( wxCommandEvent& event )
 void LAYERS_MAP_DIALOG::OnResetClick( wxCommandEvent& event )
 {
     wxString msg;
-    int ii, layer;
-    for( ii = 0, layer = 0; ii < m_itemsCount; ii++, layer++ )
+    int ii;
+    LAYER_NUM layer;
+    for( ii = 0, layer = FIRST_LAYER; ii < m_itemsCount; ii++, ++layer )
     {
         if( (layer == m_exportBoardCopperLayersCount - 1)
            && (m_exportBoardCopperLayersCount > 1) )
@@ -304,7 +305,7 @@ void LAYERS_MAP_DIALOG::OnStoreSetup( wxCommandEvent& event )
     config->Write( wxT("BrdLayersCount"), m_exportBoardCopperLayersCount );
 
     wxString key;
-    for( int ii = 0; ii < GERBVIEW_LAYER_COUNT; ii++ )
+    for( LAYER_NUM ii = FIRST_LAYER; ii < NB_GERBER_LAYERS; ++ii )
     {
         key.Printf( wxT("GbrLyr%dToPcb"), ii );
         config->Write( key, m_layersLookUpTable[ii] );
@@ -322,16 +323,18 @@ void LAYERS_MAP_DIALOG::OnGetSetup( wxCommandEvent& event )
     m_comboCopperLayersCount->SetSelection( idx );
 
     wxString key;
-    for( int ii = 0; ii < GERBVIEW_LAYER_COUNT; ii++ )
+    for( LAYER_NUM ii = FIRST_LAYER; ii < NB_GERBER_LAYERS; ++ii )
     {
         key.Printf( wxT("GbrLyr%dToPcb"), ii );
-        config->Read( key, &m_layersLookUpTable[ii] );
+        int ilayer;
+        config->Read( key, &ilayer);
+        m_layersLookUpTable[ii] = ilayer;
     }
 
     for( int ii = 0; ii < m_itemsCount; ii++ )
     {
-        int layer =  m_layersLookUpTable[ii];
-        if( layer == LAYER_UNSELECTED )
+        LAYER_NUM layer = m_layersLookUpTable[ii];
+        if( layer == UNSELECTED_LAYER )
         {
             m_layersList[ii]->SetLabel( _( "Do not export" ) );
             m_layersList[ii]->SetForegroundColour( *wxBLUE );
@@ -346,29 +349,29 @@ void LAYERS_MAP_DIALOG::OnGetSetup( wxCommandEvent& event )
 
 void LAYERS_MAP_DIALOG::OnSelectLayer( wxCommandEvent& event )
 {
-    int ii, jj;
+    int ii;
 
     ii = event.GetId() - ID_BUTTON_0;
 
-    if( (ii < 0) || (ii >= GERBVIEW_LAYER_COUNT) )
+    if( (ii < FIRST_LAYER) || (ii >= NB_GERBER_LAYERS) )
     {
         wxFAIL_MSG( wxT("Bad layer id") );
         return;
     }
 
-    jj = m_layersLookUpTable[m_buttonTable[ii]];
-    if( ( jj < 0 ) || ( jj > LAYER_UNSELECTED ) )
+    LAYER_NUM jj = m_layersLookUpTable[m_buttonTable[ii]];
+    if( ( jj < FIRST_LAYER ) || ( jj > NB_LAYERS ) )
         jj = LAYER_N_BACK;  // (Defaults to "Copper" layer.)
 
     jj = m_Parent->SelectPCBLayer( jj, m_exportBoardCopperLayersCount, true );
 
-    if( ( jj < 0 ) || ( jj > LAYER_UNSELECTED ) )
+    if( ( jj < FIRST_LAYER ) || ( jj > NB_LAYERS ) )
         return;
 
     if( jj != m_layersLookUpTable[m_buttonTable[ii]] )
     {
         m_layersLookUpTable[m_buttonTable[ii]] = jj;
-        if( jj == LAYER_UNSELECTED )
+        if( jj == UNSELECTED_LAYER )
         {
             m_layersList[ii]->SetLabel( _( "Do not export" ) );
 
@@ -402,7 +405,7 @@ void LAYERS_MAP_DIALOG::OnOkClick( wxCommandEvent& event )
     normalizeBrdLayersCount();
 
     int inner_layer_max = 0;
-    for( int ii = 0; ii < GERBVIEW_LAYER_COUNT; ii++ )
+    for( LAYER_NUM ii = FIRST_LAYER; ii < NB_GERBER_LAYERS; ++ii )
     {
             if( m_layersLookUpTable[ii] < LAYER_N_FRONT )
             {
@@ -420,6 +423,7 @@ void LAYERS_MAP_DIALOG::OnOkClick( wxCommandEvent& event )
         _("The exported board has not enough copper layers to handle selected inner layers") );
         return;
     }
-    m_layersLookUpTable[GERBVIEW_LAYER_COUNT] = m_exportBoardCopperLayersCount;
+    // XXX EVIL usage of LAYER
+    m_layersLookUpTable[NB_GERBER_LAYERS] = m_exportBoardCopperLayersCount;
     EndModal( wxID_OK );
 }
diff --git a/gerbview/select_layers_to_pcb.h b/gerbview/select_layers_to_pcb.h
index 47d3155743..b2040c9354 100644
--- a/gerbview/select_layers_to_pcb.h
+++ b/gerbview/select_layers_to_pcb.h
@@ -24,7 +24,7 @@ private:
     static int m_exportBoardCopperLayersCount;
     wxFlexGridSizer* m_flexRightColumnBoxSizer;     // An extra wxFlexGridSizer used
                                                     // when we have more than 16 gerber files loaded
-    int    m_layersLookUpTable[32+1];               // Indexes Gerber layers to PCB file layers
+    LAYER_NUM m_layersLookUpTable[int(NB_LAYERS)+1];   // Indexes Gerber layers to PCB file layers
                                                     // the last value in table is the number of copper layers
     int    m_buttonTable[32];                       // Indexes buttons to Gerber layers
     wxStaticText* m_layersList[32];                 // Indexes text strings to buttons
@@ -32,7 +32,7 @@ private:
 public: LAYERS_MAP_DIALOG( GERBVIEW_FRAME* parent );
     ~LAYERS_MAP_DIALOG() {};
 
-    int * GetLayersLookUpTable() { return m_layersLookUpTable; }
+    LAYER_NUM * GetLayersLookUpTable() { return m_layersLookUpTable; }
     int GetCopperLayersCount() { return m_exportBoardCopperLayersCount; }
 
 private:
diff --git a/gerbview/toolbars_gerber.cpp b/gerbview/toolbars_gerber.cpp
index 820980ee1c..2247e83f51 100644
--- a/gerbview/toolbars_gerber.cpp
+++ b/gerbview/toolbars_gerber.cpp
@@ -291,7 +291,7 @@ void GERBVIEW_FRAME::OnUpdateShowLayerManager( wxUpdateUIEvent& aEvent )
 
 void GERBVIEW_FRAME::OnUpdateSelectDCode( wxUpdateUIEvent& aEvent )
 {
-    int layer = getActiveLayer();
+    LAYER_NUM layer = getActiveLayer();
     GERBER_IMAGE* gerber = g_GERBER_List[layer];
     int selected = ( gerber ) ? gerber->m_Selected_Tool : 0;
 
diff --git a/include/class_board_design_settings.h b/include/class_board_design_settings.h
index bcf6e6b651..3fed1d53c5 100644
--- a/include/class_board_design_settings.h
+++ b/include/class_board_design_settings.h
@@ -78,10 +78,10 @@ public:
      * @param aLayerIndex = The index of the layer to be tested
      * @return bool - true if the layer is visible.
      */
-    bool IsLayerVisible( int aLayerIndex ) const
+    bool IsLayerVisible( LAYER_NUM aLayerIndex ) const
     {
         // @@IMB: Altough Pcbnew uses only 29, GerbView uses all 32 layers
-        if( aLayerIndex < 0 || aLayerIndex >= 32 )
+        if( aLayerIndex < FIRST_LAYER || aLayerIndex >= NB_LAYERS )
             return false;
 
         // If a layer is disabled, it is automatically invisible
@@ -94,7 +94,7 @@ public:
      * @param aLayerIndex = The index of the layer to be changed
      * @param aNewState = The new visibility state of the layer
      */
-    void SetLayerVisibility( int aLayerIndex, bool aNewState );
+    void SetLayerVisibility( LAYER_NUM aLayerIndex, bool aNewState );
 
     /**
      * Function GetVisibleElements
@@ -161,7 +161,7 @@ public:
      * @param aLayerIndex = The index of the layer to be tested
      * @return bool - true if the layer is enabled
      */
-    bool IsLayerEnabled( int aLayerIndex ) const
+    bool IsLayerEnabled( LAYER_NUM aLayerIndex ) const
     {
         return bool( m_EnabledLayers & GetLayerMask( aLayerIndex ) );
     }
diff --git a/include/class_board_item.h b/include/class_board_item.h
index 99b36d54f7..586490e5f6 100644
--- a/include/class_board_item.h
+++ b/include/class_board_item.h
@@ -78,13 +78,13 @@ class BOARD_ITEM : public EDA_ITEM
     void SetBack( EDA_ITEM* aBack )       { Pback = aBack; }
 
 protected:
-    int m_Layer;
+    LAYER_NUM m_Layer;
 
 public:
 
     BOARD_ITEM( BOARD_ITEM* aParent, KICAD_T idtype ) :
         EDA_ITEM( aParent, idtype )
-        , m_Layer( 0 )
+        , m_Layer( FIRST_LAYER )
     {
     }
 
@@ -103,7 +103,7 @@ public:
      * Function GetLayer
      * returns the layer this item is on.
      */
-    int GetLayer() const { return m_Layer; }
+    LAYER_NUM GetLayer() const { return m_Layer; }
 
     /**
      * Function SetLayer
@@ -112,7 +112,7 @@ public:
      * is virtual because some items (in fact: class DIMENSION)
      * have a slightly different initialization
      */
-    virtual void SetLayer( int aLayer )  { m_Layer = aLayer; }
+    virtual void SetLayer( LAYER_NUM aLayer )  { m_Layer = aLayer; }
 
     /**
      * Function Draw
@@ -129,7 +129,7 @@ public:
      * @param aLayer The layer to test for.
      * @return bool - true if on given layer, else false.
      */
-    virtual bool IsOnLayer( int aLayer ) const
+    virtual bool IsOnLayer( LAYER_NUM aLayer ) const
     {
         return m_Layer == aLayer;
     }
diff --git a/include/class_colors_design_settings.h b/include/class_colors_design_settings.h
index b2149a1149..5813b82676 100644
--- a/include/class_colors_design_settings.h
+++ b/include/class_colors_design_settings.h
@@ -7,6 +7,7 @@
 #define _COLORS_DESIGN_SETTING_H
 #include <layers_id_colors_and_visibility.h>
 
+// XXX shouldn't these come from somewhere else?
 #define LAYERSCOLORSBUFFERSIZE 32
 #define ITEMSCOLORSBUFFERSIZE 32
 
@@ -33,14 +34,14 @@ public:
      * @return the color for aLayer which is one of the layer indices given
      * in pcbstruct.h or in schematic
      */
-    EDA_COLOR_T GetLayerColor( int aLayer ) const;
+    EDA_COLOR_T GetLayerColor( LAYER_NUM aLayer ) const;
 
     /**
      * Function SetLayerColor
      * sets the color for aLayer which is one of the layer indices given
      * in pcbstruct.h or in schematic
      */
-    void SetLayerColor( int aLayer, EDA_COLOR_T aColor );
+    void SetLayerColor( LAYER_NUM aLayer, EDA_COLOR_T aColor );
 
     /**
      * Function GetItemColor
diff --git a/include/class_layer_box_selector.h b/include/class_layer_box_selector.h
index 23ba970766..e7248584aa 100644
--- a/include/class_layer_box_selector.h
+++ b/include/class_layer_box_selector.h
@@ -35,24 +35,24 @@ public:
 
     // Returns a color index from the layer id
     // Virtual function because GerbView uses its own functions in a derived class
-    virtual EDA_COLOR_T GetLayerColor( int aLayerIndex ) const = 0;
+    virtual EDA_COLOR_T GetLayerColor( LAYER_NUM aLayerIndex ) const = 0;
 
     // Returns the name of the layer id
     // Virtual pure function because GerbView uses its own functions in a derived class
-    virtual wxString GetLayerName( int aLayerIndex ) const = 0;
+    virtual wxString GetLayerName( LAYER_NUM aLayerIndex ) const = 0;
 
     // Returns true if the layer id is enabled (i.e. is it should be displayed)
     // Virtual function pure because GerbView uses its own functions in a derived class
-    virtual bool IsLayerEnabled( int aLayerIndex ) const = 0;
+    virtual bool IsLayerEnabled( LAYER_NUM aLayerIndex ) const = 0;
 
    // Get Current Item #
     int GetChoice();
 
     // Get Current Layer
-    int GetLayerSelection();
+    LAYER_NUM GetLayerSelection() const;
 
     // Set Layer #
-    int SetLayerSelection(int layer);
+    int SetLayerSelection(LAYER_NUM layer);
 
     // Reload the Layers
     // Virtual pure function because GerbView uses its own functions in a derived class
@@ -66,10 +66,10 @@ public:
 
 protected:
    // Fills the layer bitmap aLayerbmp with the layer color
-    void SetBitmapLayer( wxBitmap& aLayerbmp, int aLayerIndex );
+    void SetBitmapLayer( wxBitmap& aLayerbmp, LAYER_NUM aLayerIndex );
 };
 
-#define DECLARE_LAYERS_HOTKEY(list) int list[LAYER_COUNT] = \
+#define DECLARE_LAYERS_HOTKEY(list) int list[NB_LAYERS] = \
         { \
             HK_SWITCH_LAYER_TO_COPPER,   \
             HK_SWITCH_LAYER_TO_INNER1,   \
diff --git a/include/class_pcb_screen.h b/include/class_pcb_screen.h
index c7381f32af..e15082be40 100644
--- a/include/class_pcb_screen.h
+++ b/include/class_pcb_screen.h
@@ -17,9 +17,9 @@ class UNDO_REDO_CONTAINER;
 class PCB_SCREEN : public BASE_SCREEN
 {
 public:
-    int m_Active_Layer;
-    int m_Route_Layer_TOP;
-    int m_Route_Layer_BOTTOM;
+    LAYER_NUM m_Active_Layer;
+    LAYER_NUM m_Route_Layer_TOP;
+    LAYER_NUM m_Route_Layer_BOTTOM;
 
 public:
 
diff --git a/include/layers_id_colors_and_visibility.h b/include/layers_id_colors_and_visibility.h
index c6e703fa8f..acae0e041f 100644
--- a/include/layers_id_colors_and_visibility.h
+++ b/include/layers_id_colors_and_visibility.h
@@ -30,10 +30,17 @@
 #ifndef _LAYERS_ID_AND_VISIBILITY_H_
 #define _LAYERS_ID_AND_VISIBILITY_H_
 
-#include <wx/debug.h>            // wxASSERT
+/* NOTE: the idea here is to have LAYER_NUM and LAYER_MSK as abstract
+ * type as possible (even if they're currently implemented as int and
+ * unsigned int, respectively). In this way it would be reasonably easy
+ * to overcome the current 32 layer limit. For example switching to a 64
+ * bit mask or even some kind of bit array */
 
 /* Layer identification (layer number) */
+typedef int LAYER_NUM;
 #define UNDEFINED_LAYER         -1
+#define NO_LAYER                0
+#define FIRST_LAYER             0
 #define FIRST_COPPER_LAYER      0
 #define LAYER_N_BACK            0
 #define LAYER_N_2               1
@@ -52,9 +59,9 @@
 #define LAYER_N_15              14
 #define LAYER_N_FRONT           15
 #define LAST_COPPER_LAYER       LAYER_N_FRONT
-#define NB_COPPER_LAYERS        (LAST_COPPER_LAYER + 1)
+#define NB_COPPER_LAYERS        (LAST_COPPER_LAYER - FIRST_COPPER_LAYER + 1)
 
-#define FIRST_NO_COPPER_LAYER   16
+#define FIRST_NON_COPPER_LAYER  16
 #define ADHESIVE_N_BACK         16
 #define ADHESIVE_N_FRONT        17
 #define SOLDERPASTE_N_BACK      18
@@ -68,13 +75,14 @@
 #define ECO1_N                  26
 #define ECO2_N                  27
 #define EDGE_N                  28
-#define LAST_NO_COPPER_LAYER    28
+#define LAST_NON_COPPER_LAYER   28
+#define NB_PCB_LAYERS           (LAST_NON_COPPER_LAYER + 1)
 #define UNUSED_LAYER_29         29
 #define UNUSED_LAYER_30         30
 #define UNUSED_LAYER_31         31
-#define NB_LAYERS               (LAST_NO_COPPER_LAYER + 1)
-
-#define LAYER_COUNT             32
+#define NB_GERBER_LAYERS        32
+#define NB_LAYERS               32
+#define UNSELECTED_LAYER        32
 
 // Masks to identify a layer by a bit map
 typedef unsigned LAYER_MSK;
@@ -108,9 +116,6 @@ typedef unsigned LAYER_MSK;
 #define ECO2_LAYER              (1 << ECO2_N)
 #define EDGE_LAYER              (1 << EDGE_N)
 
-#define FIRST_NON_COPPER_LAYER  ADHESIVE_N_BACK
-#define LAST_NON_COPPER_LAYER   EDGE_N
-
 //      extra bits              0xE0000000
 /* Helpful global layers mask : */
 #define ALL_LAYERS              0x1FFFFFFF              // Pcbnew used 29 layers
@@ -124,9 +129,8 @@ typedef unsigned LAYER_MSK;
 /** return a one bit layer mask from a layer number
  * aLayerNumber = the layer number to convert (0 .. LAYERS-1)
  */
-inline LAYER_MSK GetLayerMask( unsigned aLayerNumber )
+inline LAYER_MSK GetLayerMask( LAYER_NUM aLayerNumber )
 {
-    wxASSERT( aLayerNumber < LAYER_COUNT && aLayerNumber >= 0 );
     return 1 << aLayerNumber;
 }
 
@@ -135,7 +139,7 @@ inline LAYER_MSK GetLayerMask( unsigned aLayerNumber )
 // layers order in dialogs (plot, print and toolbars)
 // in same order than in setup layers dialog
 // (Front or Top to Back or Bottom)
-#define DECLARE_LAYERS_ORDER_LIST(list) int list[LAYER_COUNT] =\
+#define DECLARE_LAYERS_ORDER_LIST(list) LAYER_NUM list[NB_LAYERS] =\
 {   LAYER_N_FRONT,\
     LAYER_N_15, LAYER_N_14, LAYER_N_13, LAYER_N_12,\
     LAYER_N_11, LAYER_N_10, LAYER_N_9, LAYER_N_8,\
@@ -186,14 +190,14 @@ enum PCB_VISIBLE
 
 
 /**
- * Function IsValidLayerIndex
+ * Function IsValidPcbLayerIndex
  * tests whether a given integer is a valid layer index
  * @param aLayerIndex = Layer index to test
  * @return true if aLayerIndex is a valid layer index
  */
-inline bool IsValidLayerIndex( int aLayerIndex )
+inline bool IsValidPcbLayerIndex( LAYER_NUM aLayerIndex )
 {
-    return aLayerIndex >= 0 && aLayerIndex < NB_LAYERS;
+    return aLayerIndex >= FIRST_LAYER && aLayerIndex < NB_PCB_LAYERS;
 }
 
 /**
@@ -202,7 +206,7 @@ inline bool IsValidLayerIndex( int aLayerIndex )
  * @param aLayerIndex = Layer index to test
  * @return true if aLayerIndex is a valid copper layer index
  */
-inline bool IsValidCopperLayerIndex( int aLayerIndex )
+inline bool IsValidCopperLayerIndex( LAYER_NUM aLayerIndex )
 {
     return aLayerIndex >= FIRST_COPPER_LAYER && aLayerIndex <= LAST_COPPER_LAYER;
 }
@@ -213,10 +217,10 @@ inline bool IsValidCopperLayerIndex( int aLayerIndex )
  * @param aLayerIndex = Layer index to test
  * @return true if aLayerIndex is a valid non copper layer index
  */
-inline bool IsValidNonCopperLayerIndex( int aLayerIndex )
+inline bool IsValidNonCopperLayerIndex( LAYER_NUM aLayerIndex )
 {
-    return aLayerIndex >= FIRST_NO_COPPER_LAYER
-        && aLayerIndex <= LAST_NO_COPPER_LAYER;
+    return aLayerIndex >= FIRST_NON_COPPER_LAYER
+        && aLayerIndex <= LAST_NON_COPPER_LAYER;
 }
 
 #endif // _LAYERS_ID_AND_VISIBILITY_H_
diff --git a/include/macros.h b/include/macros.h
index c72863456a..f7c370f464 100644
--- a/include/macros.h
+++ b/include/macros.h
@@ -17,7 +17,7 @@
 #define TO_UTF8( wxstring )  ( (const char*) (wxstring).utf8_str() )
 
 /**
- * Macro FROM_UTF8
+ * function FROM_UTF8
  * converts a UTF8 encoded C string to a wxString for all wxWidgets build modes.
  */
 //#define FROM_UTF8( cstring )    wxString::FromUTF8( cstring )
diff --git a/include/pcbcommon.h b/include/pcbcommon.h
index 6ce9572123..8f4af14fc0 100644
--- a/include/pcbcommon.h
+++ b/include/pcbcommon.h
@@ -7,7 +7,7 @@
 
 
 #include <dlist.h>
-#include <layers_id_colors_and_visibility.h>  // LAYER_COUNT and NB_COPPER_LAYERS definitions.
+#include <layers_id_colors_and_visibility.h>
 
 
 #define MIN_DRAW_WIDTH      1               ///< Minimum trace drawing width.
diff --git a/include/sch_item_struct.h b/include/sch_item_struct.h
index 42e6496715..3f71041b4d 100644
--- a/include/sch_item_struct.h
+++ b/include/sch_item_struct.h
@@ -83,6 +83,7 @@ enum DANGLING_END_T {
  */
 class DANGLING_END_ITEM
 {
+private:
     /// A pointer to the connectable object.
     const void*    m_item;
 
diff --git a/include/wxBasePcbFrame.h b/include/wxBasePcbFrame.h
index 8903f6f904..cdc7b19cf7 100644
--- a/include/wxBasePcbFrame.h
+++ b/include/wxBasePcbFrame.h
@@ -597,9 +597,9 @@ public:
     // layerhandling:
     // (See pcbnew/sel_layer.cpp for description of why null_layer parameter
     // is provided)
-    int SelectLayer( int default_layer, int min_layer, int max_layer, bool null_layer = false );
+    LAYER_NUM SelectLayer( LAYER_NUM default_layer, LAYER_NUM min_layer, LAYER_NUM max_layer, bool null_layer = false );
     void SelectLayerPair();
-    virtual void SwitchLayer( wxDC* DC, int layer );
+    virtual void SwitchLayer( wxDC* DC, LAYER_NUM layer );
 
     void InstallGridFrame( const wxPoint& pos );
 
diff --git a/include/wxPcbStruct.h b/include/wxPcbStruct.h
index fdd36da6a0..5ba16dc3e6 100644
--- a/include/wxPcbStruct.h
+++ b/include/wxPcbStruct.h
@@ -113,7 +113,7 @@ protected:
      * will change the currently active layer to \a aLayer and also
      * update the PCB_LAYER_WIDGET.
      */
-    void setActiveLayer( int aLayer, bool doLayerWidgetUpdate = true )
+    void setActiveLayer( LAYER_NUM aLayer, bool doLayerWidgetUpdate = true )
     {
         ( (PCB_SCREEN*) GetScreen() )->m_Active_Layer = aLayer;
 
@@ -125,7 +125,7 @@ protected:
      * Function getActiveLayer
      * returns the active layer
      */
-    int getActiveLayer()
+    LAYER_NUM getActiveLayer()
     {
         return ( (PCB_SCREEN*) GetScreen() )->m_Active_Layer;
     }
@@ -1206,7 +1206,7 @@ public:
     bool MergeCollinearTracks( TRACK* track, wxDC* DC, int end );
 
     void Start_DragTrackSegmentAndKeepSlope( TRACK* track, wxDC* DC );
-    void SwitchLayer( wxDC* DC, int layer );
+    void SwitchLayer( wxDC* DC, LAYER_NUM layer );
 
     /**
      * Function Add45DegreeSegment
@@ -1406,7 +1406,7 @@ public:
     DRAWSEGMENT* Begin_DrawSegment( DRAWSEGMENT* Segment, STROKE_T shape, wxDC* DC );
     void End_Edge( DRAWSEGMENT* Segment, wxDC* DC );
     void Delete_Segment_Edge( DRAWSEGMENT* Segment, wxDC* DC );
-    void Delete_Drawings_All_Layer( int aLayer );
+    void Delete_Drawings_All_Layer( LAYER_NUM aLayer );
 
     // Dimension handling:
     void ShowDimensionPropertyDialog( DIMENSION* aDimension, wxDC* aDC );
diff --git a/pcbnew/autorouter/autoplac.cpp b/pcbnew/autorouter/autoplac.cpp
index 431e25bf8a..ce7d5bb9d8 100644
--- a/pcbnew/autorouter/autoplac.cpp
+++ b/pcbnew/autorouter/autoplac.cpp
@@ -99,7 +99,7 @@ void PCB_EDIT_FRAME::AutoPlaceModule( MODULE* Module, int place_mode, wxDC* DC )
     wxPoint  PosOK;
     wxPoint  memopos;
     int      error;
-    int      lay_tmp_TOP, lay_tmp_BOTTOM;
+    LAYER_NUM lay_tmp_TOP, lay_tmp_BOTTOM;
 
     // Undo: init list
     PICKED_ITEMS_LIST  newList;
@@ -457,7 +457,7 @@ int PCB_EDIT_FRAME::GenPlaceBoard()
     /* Place the edge layer segments */
     TRACK TmpSegm( NULL );
 
-    TmpSegm.SetLayer( -1 );
+    TmpSegm.SetLayer( UNDEFINED_LAYER );
     TmpSegm.SetNet( -1 );
     TmpSegm.SetWidth( RoutingMatrix.m_GridRouting / 2 );
 
diff --git a/pcbnew/autorouter/routing_matrix.cpp b/pcbnew/autorouter/routing_matrix.cpp
index 5508ffda70..5ed0f91e4b 100644
--- a/pcbnew/autorouter/routing_matrix.cpp
+++ b/pcbnew/autorouter/routing_matrix.cpp
@@ -240,7 +240,7 @@ void PlaceCells( BOARD* aPcb, int net_code, int flag )
                 tmpSegm.SetLayer( edge->GetLayer() );
 
                 if( tmpSegm.GetLayer() == EDGE_N )
-                    tmpSegm.SetLayer( -1 );
+                    tmpSegm.SetLayer( UNDEFINED_LAYER );
 
                 tmpSegm.SetStart( edge->GetStart() );
                 tmpSegm.SetEnd(   edge->GetEnd() );
@@ -275,7 +275,7 @@ void PlaceCells( BOARD* aPcb, int net_code, int flag )
 
             if( DrawSegm->GetLayer() == EDGE_N )
             {
-                tmpSegm.SetLayer( -1 );
+                tmpSegm.SetLayer( UNDEFINED_LAYER );
                 type_cell |= CELL_is_EDGE;
             }
 
diff --git a/pcbnew/basepcbframe.cpp b/pcbnew/basepcbframe.cpp
index c35d951f86..a4eedd1c48 100644
--- a/pcbnew/basepcbframe.cpp
+++ b/pcbnew/basepcbframe.cpp
@@ -305,9 +305,9 @@ void PCB_BASE_FRAME::Show3D_Frame( wxCommandEvent& event )
 
 
 // Note: virtual, overridden in PCB_EDIT_FRAME;
-void PCB_BASE_FRAME::SwitchLayer( wxDC* DC, int layer )
+void PCB_BASE_FRAME::SwitchLayer( wxDC* DC, LAYER_NUM layer )
 {
-    int preslayer = ((PCB_SCREEN*)GetScreen())->m_Active_Layer;
+    LAYER_NUM preslayer = ((PCB_SCREEN*)GetScreen())->m_Active_Layer;
 
     // Check if the specified layer matches the present layer
     if( layer == preslayer )
diff --git a/pcbnew/block.cpp b/pcbnew/block.cpp
index a95a6c159e..88e96f8abf 100644
--- a/pcbnew/block.cpp
+++ b/pcbnew/block.cpp
@@ -393,7 +393,7 @@ void PCB_EDIT_FRAME::Block_SelectItems()
     {
         for( MODULE* module = m_Pcb->m_Modules; module != NULL; module = module->Next() )
         {
-            int layer = module->GetLayer();
+            LAYER_NUM layer = module->GetLayer();
 
             if( module->HitTest( GetScreen()->m_BlockLocate )
                 && ( !module->IsLocked() || blockIncludeLockedModules ) )
diff --git a/pcbnew/board_undo_redo.cpp b/pcbnew/board_undo_redo.cpp
index 8a03a3002f..88cfaa49b1 100644
--- a/pcbnew/board_undo_redo.cpp
+++ b/pcbnew/board_undo_redo.cpp
@@ -198,7 +198,7 @@ void SwapData( BOARD_ITEM* aItem, BOARD_ITEM* aImage )
     if( aItem->Type() != PCB_MODULE_T && aItem->Type() != PCB_ZONE_AREA_T )
     {
         // These items have a global swap function.
-        int layer, layerimg;
+        LAYER_NUM layer, layerimg;
         layer    = aItem->GetLayer();
         layerimg = aImage->GetLayer();
         aItem->SetLayer( layerimg );
diff --git a/pcbnew/class_board.cpp b/pcbnew/class_board.cpp
index 7ccfdb71d8..a71bbef987 100644
--- a/pcbnew/class_board.cpp
+++ b/pcbnew/class_board.cpp
@@ -75,7 +75,7 @@ BOARD::BOARD() :
 
     BuildListOfNets();                      // prepare pad and netlist containers.
 
-    for( int layer = 0; layer < LAYER_COUNT; ++layer )
+    for( LAYER_NUM layer = FIRST_LAYER; layer < NB_LAYERS; ++layer )
     {
         m_Layer[layer].m_Name = GetStandardLayerName( layer );
 
@@ -344,7 +344,7 @@ int BOARD::GetCurrentMicroViaDrill()
 }
 
 
-bool BOARD::SetLayer( int aIndex, const LAYER& aLayer )
+bool BOARD::SetLayer( LAYER_NUM aIndex, const LAYER& aLayer )
 {
     if( aIndex < NB_COPPER_LAYERS )
     {
@@ -356,9 +356,9 @@ bool BOARD::SetLayer( int aIndex, const LAYER& aLayer )
 }
 
 
-wxString BOARD::GetLayerName( int aLayerIndex ) const
+wxString BOARD::GetLayerName( LAYER_NUM aLayerIndex ) const
 {
-    if( !IsValidLayerIndex( aLayerIndex ) )
+    if( !IsValidPcbLayerIndex( aLayerIndex ) )
         return wxEmptyString;
 
     // All layer names are stored in the BOARD.
@@ -368,7 +368,7 @@ wxString BOARD::GetLayerName( int aLayerIndex ) const
         // over-ridden by BOARD::SetLayerName().
         // For copper layers, return the actual copper layer name,
         // otherwise return the Standard English layer name.
-        if( aLayerIndex < FIRST_NO_COPPER_LAYER )
+        if( aLayerIndex < FIRST_NON_COPPER_LAYER )
             return m_Layer[aLayerIndex].m_Name;
     }
 
@@ -376,7 +376,7 @@ wxString BOARD::GetLayerName( int aLayerIndex ) const
 }
 
 
-wxString BOARD::GetStandardLayerName( int aLayerNumber )
+wxString BOARD::GetStandardLayerName( LAYER_NUM aLayerNumber )
 {
     const wxChar* txt;
 
@@ -422,7 +422,7 @@ wxString BOARD::GetStandardLayerName( int aLayerNumber )
 }
 
 
-bool BOARD::SetLayerName( int aLayerIndex, const wxString& aLayerName )
+bool BOARD::SetLayerName( LAYER_NUM aLayerIndex, const wxString& aLayerName )
 {
     if( !IsValidCopperLayerIndex( aLayerIndex ) )
         return false;
@@ -441,7 +441,7 @@ bool BOARD::SetLayerName( int aLayerIndex, const wxString& aLayerName )
 
     if( IsLayerEnabled( aLayerIndex ) )
     {
-        for( int i = 0; i < NB_COPPER_LAYERS; i++ )
+        for( LAYER_NUM i = FIRST_COPPER_LAYER; i < NB_COPPER_LAYERS; ++i )
         {
             if( i != aLayerIndex && IsLayerEnabled( i ) && NameTemp == m_Layer[i].m_Name )
                 return false;
@@ -456,7 +456,7 @@ bool BOARD::SetLayerName( int aLayerIndex, const wxString& aLayerName )
 }
 
 
-LAYER_T BOARD::GetLayerType( int aLayerIndex ) const
+LAYER_T BOARD::GetLayerType( LAYER_NUM aLayerIndex ) const
 {
     if( !IsValidCopperLayerIndex( aLayerIndex ) )
         return LT_SIGNAL;
@@ -470,7 +470,7 @@ LAYER_T BOARD::GetLayerType( int aLayerIndex ) const
 }
 
 
-bool BOARD::SetLayerType( int aLayerIndex, LAYER_T aLayerType )
+bool BOARD::SetLayerType( LAYER_NUM aLayerIndex, LAYER_T aLayerType )
 {
     if( !IsValidCopperLayerIndex( aLayerIndex ) )
         return false;
@@ -574,7 +574,7 @@ void BOARD::SetVisibleElements( int aMask )
     for( int ii = 0; ii < PCB_VISIBLE( END_PCB_VISIBLE_LIST ); ii++ )
     {
         int item_mask = 1 << ii;
-        SetElementVisibility( ii, bool( aMask & item_mask ) );
+        SetElementVisibility( ii, aMask & item_mask );
     }
 }
 
@@ -683,19 +683,19 @@ void BOARD::SetVisibleElementColor( int aPCB_VISIBLE, EDA_COLOR_T aColor )
 }
 
 
-void BOARD::SetLayerColor( int aLayer, EDA_COLOR_T aColor )
+void BOARD::SetLayerColor( LAYER_NUM aLayer, EDA_COLOR_T aColor )
 {
     GetColorsSettings()->SetLayerColor( aLayer, aColor );
 }
 
 
-EDA_COLOR_T BOARD::GetLayerColor( int aLayer ) const
+EDA_COLOR_T BOARD::GetLayerColor( LAYER_NUM aLayer ) const
 {
     return GetColorsSettings()->GetLayerColor( aLayer );
 }
 
 
-bool BOARD::IsModuleLayerVisible( int layer )
+bool BOARD::IsModuleLayerVisible( LAYER_NUM layer )
 {
     if( layer==LAYER_N_FRONT )
         return IsElementVisible( PCB_VISIBLE(MOD_FR_VISIBLE) );
@@ -1195,16 +1195,16 @@ SEARCH_RESULT BOARD::Visit( INSPECTOR* inspector, const void* testData,
 /*  now using PcbGeneralLocateAndDisplay(), but this remains a useful example
  *   of how the INSPECTOR can be used in a lightweight way.
  *  // see pcbstruct.h
- *  BOARD_ITEM* BOARD::FindPadOrModule( const wxPoint& refPos, int layer )
+ *  BOARD_ITEM* BOARD::FindPadOrModule( const wxPoint& refPos, LAYER_NUM layer )
  *  {
  *   class PadOrModule : public INSPECTOR
  *   {
  *   public:
  *       BOARD_ITEM*         found;
- *       int                 layer;
+ *       LAYER_NUM           layer;
  *       int                 layer_mask;
  *
- *       PadOrModule( int alayer ) :
+ *       PadOrModule( LAYER_NUM alayer ) :
  *           found(0), layer(alayer), layer_mask( g_TabOneLayerMask[alayer] )
  *       {}
  *
@@ -1437,7 +1437,7 @@ int BOARD::ReturnSortedNetnamesList( wxArrayString& aNames, bool aSortbyPadsCoun
 }
 
 
-void BOARD::RedrawAreasOutlines( EDA_DRAW_PANEL* panel, wxDC* aDC, GR_DRAWMODE aDrawMode, int aLayer )
+void BOARD::RedrawAreasOutlines( EDA_DRAW_PANEL* panel, wxDC* aDC, GR_DRAWMODE aDrawMode, LAYER_NUM aLayer )
 {
     if( !aDC )
         return;
@@ -1452,7 +1452,7 @@ void BOARD::RedrawAreasOutlines( EDA_DRAW_PANEL* panel, wxDC* aDC, GR_DRAWMODE a
 }
 
 
-void BOARD::RedrawFilledAreas( EDA_DRAW_PANEL* panel, wxDC* aDC, GR_DRAWMODE aDrawMode, int aLayer )
+void BOARD::RedrawFilledAreas( EDA_DRAW_PANEL* panel, wxDC* aDC, GR_DRAWMODE aDrawMode, LAYER_NUM aLayer )
 {
     if( !aDC )
         return;
@@ -1468,8 +1468,8 @@ void BOARD::RedrawFilledAreas( EDA_DRAW_PANEL* panel, wxDC* aDC, GR_DRAWMODE aDr
 
 
 ZONE_CONTAINER* BOARD::HitTestForAnyFilledArea( const wxPoint& aRefPos,
-                                                int            aStartLayer,
-                                                int            aEndLayer )
+                                                LAYER_NUM      aStartLayer,
+                                                LAYER_NUM      aEndLayer )
 {
     if( aEndLayer < 0 )
         aEndLayer = aStartLayer;
@@ -1480,7 +1480,7 @@ ZONE_CONTAINER* BOARD::HitTestForAnyFilledArea( const wxPoint& aRefPos,
     for( unsigned ia = 0; ia < m_ZoneDescriptorList.size(); ia++ )
     {
         ZONE_CONTAINER* area  = m_ZoneDescriptorList[ia];
-        int             layer = area->GetLayer();
+        LAYER_NUM       layer = area->GetLayer();
 
         if( (layer < aStartLayer) || (layer > aEndLayer) )
             continue;
@@ -1531,7 +1531,7 @@ int BOARD::SetAreasNetCodesFromNetNames( void )
 }
 
 
-TRACK* BOARD::GetViaByPosition( const wxPoint& aPosition, int aLayerMask )
+TRACK* BOARD::GetViaByPosition( const wxPoint& aPosition, LAYER_NUM aLayer)
 {
     TRACK* track;
 
@@ -1546,10 +1546,10 @@ TRACK* BOARD::GetViaByPosition( const wxPoint& aPosition, int aLayerMask )
         if( track->GetState( BUSY | IS_DELETED ) )
             continue;
 
-        if( aLayerMask < 0 )
+        if( aLayer == UNDEFINED_LAYER )
             break;
 
-        if( track->IsOnLayer( aLayerMask ) )
+        if( track->IsOnLayer( aLayer ) )
             break;
     }
 
@@ -1751,7 +1751,7 @@ TRACK* BOARD::GetTrace( TRACK* aTrace, const wxPoint& aPosition, LAYER_MSK aLaye
 {
     for( TRACK* track = aTrace;   track;  track =  track->Next() )
     {
-        int layer = track->GetLayer();
+        LAYER_NUM layer = track->GetLayer();
 
         if( track->GetState( BUSY | IS_DELETED ) )
             continue;
@@ -1893,7 +1893,7 @@ TRACK* BOARD::MarkTrace( TRACK*  aTrace, int* aCount,
          * if there are on the same layer, the via is on the selected track
          * if there are on different layers, the via is on an other track
          */
-        int layer = track->GetLayer();
+        LAYER_NUM layer = track->GetLayer();
 
         while( ( track = ::GetTrace( track->Next(), NULL, via->GetStart(), layerMask ) ) != NULL )
         {
@@ -2018,7 +2018,7 @@ TRACK* BOARD::MarkTrace( TRACK*  aTrace, int* aCount,
 }
 
 
-MODULE* BOARD::GetFootprint( const wxPoint& aPosition, int aActiveLayer,
+MODULE* BOARD::GetFootprint( const wxPoint& aPosition, LAYER_NUM aActiveLayer,
                              bool aVisibleOnly, bool aIgnoreLocked )
 {
     MODULE* pt_module;
@@ -2026,7 +2026,7 @@ MODULE* BOARD::GetFootprint( const wxPoint& aPosition, int aActiveLayer,
     MODULE* Altmodule   = NULL;
     int     min_dim     = 0x7FFFFFFF;
     int     alt_min_dim = 0x7FFFFFFF;
-    int     layer;
+    LAYER_NUM layer;
 
     for( pt_module = m_Modules;  pt_module;  pt_module = (MODULE*) pt_module->Next() )
     {
@@ -2213,7 +2213,7 @@ void BOARD::SetTrackWidthIndex( unsigned aIndex )
 
 
 ZONE_CONTAINER* BOARD::AddArea( PICKED_ITEMS_LIST* aNewZonesList, int aNetcode,
-                                int aLayer, wxPoint aStartPointPosition, int aHatch )
+                                LAYER_NUM aLayer, wxPoint aStartPointPosition, int aHatch )
 {
     ZONE_CONTAINER* new_area = InsertArea( aNetcode,
                                            m_ZoneDescriptorList.size( ) - 1,
@@ -2248,7 +2248,7 @@ void BOARD::RemoveArea( PICKED_ITEMS_LIST* aDeletedList, ZONE_CONTAINER* area_to
 }
 
 
-ZONE_CONTAINER* BOARD::InsertArea( int netcode, int iarea, int layer, int x, int y, int hatch )
+ZONE_CONTAINER* BOARD::InsertArea( int netcode, int iarea, LAYER_NUM layer, int x, int y, int hatch )
 {
     ZONE_CONTAINER* new_area = new ZONE_CONTAINER( this );
 
diff --git a/pcbnew/class_board.h b/pcbnew/class_board.h
index c397e3d05b..bd2885df42 100644
--- a/pcbnew/class_board.h
+++ b/pcbnew/class_board.h
@@ -188,7 +188,7 @@ private:
     /// edge zone descriptors, owned by pointer.
     ZONE_CONTAINERS         m_ZoneDescriptorList;
 
-    LAYER                   m_Layer[LAYER_COUNT];
+    LAYER                   m_Layer[NB_LAYERS];
                                                     // if true m_highLight_NetCode is used
     HIGH_LIGHT_INFO         m_highLight;                // current high light data
     HIGH_LIGHT_INFO         m_highLightPrevious;        // a previously stored high light data
@@ -442,7 +442,7 @@ public:
      * @param aLayer = The layer to be tested
      * @return bool - true if the layer is visible.
      */
-    bool IsLayerEnabled( int aLayer ) const
+    bool IsLayerEnabled( LAYER_NUM aLayer ) const
     {
         return m_designSettings.IsLayerEnabled( aLayer );
     }
@@ -454,7 +454,7 @@ public:
      * @param aLayerIndex = The index of the layer to be tested
      * @return bool - true if the layer is visible.
      */
-    bool IsLayerVisible( int aLayerIndex ) const
+    bool IsLayerVisible( LAYER_NUM aLayerIndex ) const
     {
         return m_designSettings.IsLayerVisible( aLayerIndex );
     }
@@ -529,7 +529,7 @@ public:
      * @param layer One of the two allowed layers for modules: LAYER_N_FRONT or LAYER_N_BACK
      * @return bool - true if the layer is visible, else false.
      */
-    bool IsModuleLayerVisible( int layer );
+    bool IsModuleLayerVisible( LAYER_NUM layer );
 
     /**
      * Function GetVisibleElementColor
@@ -596,7 +596,7 @@ public:
      * @return wxString -   the layer name, which for copper layers may
      *                      be custom, else standard.
      */
-    wxString GetLayerName( int aLayerIndex ) const;
+    wxString GetLayerName( LAYER_NUM aLayerIndex ) const;
 
     /**
      * Function SetLayerName
@@ -607,7 +607,7 @@ public:
      * @return bool - true if aLayerName was legal and unique among other
      *   layer names at other layer indices and aLayerIndex was within range, else false.
      */
-    bool SetLayerName( int aLayerIndex, const wxString& aLayerName );
+    bool SetLayerName( LAYER_NUM aLayerIndex, const wxString& aLayerName );
 
     /**
      * Function GetStandardLayerName
@@ -620,9 +620,9 @@ public:
      * @return wxString - containing the layer name or "BAD INDEX" if aLayerNumber
      *                      is not legal
      */
-    static wxString GetStandardLayerName( int aLayerNumber );
+    static wxString GetStandardLayerName( LAYER_NUM aLayerNumber );
 
-    bool SetLayer( int aIndex, const LAYER& aLayer );
+    bool SetLayer( LAYER_NUM aIndex, const LAYER& aLayer );
 
     /**
      * Function GetLayerType
@@ -632,7 +632,7 @@ public:
      * @return LAYER_T - the layer type, or LAYER_T(-1) if the
      *  index was out of range.
      */
-    LAYER_T GetLayerType( int aLayerIndex ) const;
+    LAYER_T GetLayerType( LAYER_NUM aLayerIndex ) const;
 
     /**
      * Function SetLayerType
@@ -642,19 +642,19 @@ public:
      * @param aLayerType The new layer type.
      * @return bool - true if aLayerType was legal and aLayerIndex was within range, else false.
      */
-    bool SetLayerType( int aLayerIndex, LAYER_T aLayerType );
+    bool SetLayerType( LAYER_NUM aLayerIndex, LAYER_T aLayerType );
 
     /**
      * Function SetLayerColor
      * changes a layer color for any valid layer, including non-copper ones.
      */
-    void SetLayerColor( int aLayer, EDA_COLOR_T aColor );
+    void SetLayerColor( LAYER_NUM aLayer, EDA_COLOR_T aColor );
 
     /**
      * Function GetLayerColor
      * gets a layer color for any valid layer, including non-copper ones.
      */
-    EDA_COLOR_T GetLayerColor( int aLayer ) const;
+    EDA_COLOR_T GetLayerColor( LAYER_NUM aLayer ) const;
 
     /**
      * Function ReturnFlippedLayerNumber
@@ -662,7 +662,7 @@ public:
      * some (not all) layers: external copper, Mask, Paste, and solder
      * are swapped between front and back sides
      */
-    static int ReturnFlippedLayerNumber( int oldlayer );
+    static LAYER_NUM ReturnFlippedLayerNumber( LAYER_NUM oldlayer );
 
     /** Functions to get some items count */
     int GetNumSegmTrack() const;
@@ -1005,8 +1005,8 @@ public:
      * @return ZONE_CONTAINER* return a pointer to the ZONE_CONTAINER found, else NULL
      */
     ZONE_CONTAINER* HitTestForAnyFilledArea( const wxPoint& aRefPos,
-                                             int            aStartLayer,
-                                             int            aEndLayer = -1 );
+                                             LAYER_NUM      aStartLayer,
+                                             LAYER_NUM      aEndLayer = UNDEFINED_LAYER );
 
     /**
      * Function RedrawAreasOutlines
@@ -1015,14 +1015,14 @@ public:
     void RedrawAreasOutlines( EDA_DRAW_PANEL* aPanel,
                               wxDC*           aDC,
                               GR_DRAWMODE     aDrawMode,
-                              int             aLayer );
+                              LAYER_NUM       aLayer );
 
     /**
      * Function RedrawFilledAreas
      * Redraw all filled areas on layer aLayer ( redraw all if aLayer < 0 )
      */
     void RedrawFilledAreas( EDA_DRAW_PANEL* aPanel, wxDC* aDC, GR_DRAWMODE aDrawMode,
-                            int aLayer );
+                            LAYER_NUM aLayer );
 
     /**
      * Function SetAreasNetCodesFromNetNames
@@ -1090,14 +1090,14 @@ public:
      * @return a reference to the new area
      */
     ZONE_CONTAINER* AddArea( PICKED_ITEMS_LIST* aNewZonesList, int aNetcode,
-                             int aLayer, wxPoint aStartPointPosition, int aHatch );
+                             LAYER_NUM aLayer, wxPoint aStartPointPosition, int aHatch );
 
     /**
      * Function InsertArea
      * add empty copper area to net, inserting after m_ZoneDescriptorList[iarea]
      * @return pointer to the new area
      */
-    ZONE_CONTAINER* InsertArea( int netcode, int iarea, int layer, int x, int y, int hatch );
+    ZONE_CONTAINER* InsertArea( int netcode, int iarea, LAYER_NUM layer, int x, int y, int hatch );
 
     /**
      * Function NormalizeAreaPolygon
@@ -1210,10 +1210,10 @@ public:
      * of the via.
      * </p>
      * @param aPosition The wxPoint to HitTest() against.
-     * @param aLayerMask The layers to search.  Use -1 for a don't care.
+     * @param aLayer The layer to search.  Use -1 for a don't care.
      * @return TRACK* A point a to the SEGVIA object if found, else NULL.
      */
-    TRACK* GetViaByPosition( const wxPoint& aPosition, int aLayerMask = -1 );
+    TRACK* GetViaByPosition( const wxPoint& aPosition, LAYER_NUM aLayer = UNDEFINED_LAYER );
 
     /**
      * Function GetPad
@@ -1332,7 +1332,7 @@ public:
      * @param aIgnoreLocked Ignore locked modules when true.
      * @return MODULE* The best module or NULL if none.
      */
-    MODULE* GetFootprint( const wxPoint& aPosition, int aActiveLayer,
+    MODULE* GetFootprint( const wxPoint& aPosition, LAYER_NUM aActiveLayer,
                           bool aVisibleOnly, bool aIgnoreLocked = false );
 
     /**
diff --git a/pcbnew/class_board_design_settings.cpp b/pcbnew/class_board_design_settings.cpp
index a7764d807f..633a685507 100644
--- a/pcbnew/class_board_design_settings.cpp
+++ b/pcbnew/class_board_design_settings.cpp
@@ -191,7 +191,7 @@ void BOARD_DESIGN_SETTINGS::SetVisibleLayers( LAYER_MSK aMask )
 }
 
 
-void BOARD_DESIGN_SETTINGS::SetLayerVisibility( int aLayerIndex, bool aNewState )
+void BOARD_DESIGN_SETTINGS::SetLayerVisibility( LAYER_NUM aLayerIndex, bool aNewState )
 {
     // Altough Pcbnew uses only 29, GerbView uses all 32 layers
     if( aLayerIndex < 0 || aLayerIndex >= 32 )
@@ -229,7 +229,7 @@ void BOARD_DESIGN_SETTINGS::SetCopperLayerCount( int aNewLayerCount )
     if( m_CopperLayerCount > 1 )
         m_EnabledLayers |= LAYER_FRONT;
 
-    for( int ii = LAYER_N_2; ii < aNewLayerCount - 1; ++ii )
+    for( LAYER_NUM ii = LAYER_N_2; ii < aNewLayerCount - 1; ++ii )
         m_EnabledLayers |= GetLayerMask( ii );
 }
 
@@ -247,9 +247,10 @@ void BOARD_DESIGN_SETTINGS::SetEnabledLayers( LAYER_MSK aMask )
     // update m_CopperLayerCount to ensure its consistency with m_EnabledLayers
     m_CopperLayerCount = 0;
 
-    for( int ii = 0;  aMask && ii < NB_COPPER_LAYERS;  ii++, aMask >>= 1 )
+    unsigned shiftMask = aMask;
+    for( LAYER_NUM ii = FIRST_LAYER; aMask && ii < NB_COPPER_LAYERS; ++ii, shiftMask >>= 1 )
     {
-        if( aMask & 1 )
+        if( shiftMask & 1 )
             m_CopperLayerCount++;
     }
 }
diff --git a/pcbnew/class_dimension.cpp b/pcbnew/class_dimension.cpp
index 6d3183107d..1b77f73417 100644
--- a/pcbnew/class_dimension.cpp
+++ b/pcbnew/class_dimension.cpp
@@ -49,7 +49,7 @@ DIMENSION::DIMENSION( BOARD_ITEM* aParent ) :
     BOARD_ITEM( aParent, PCB_DIMENSION_T ),
     m_Text( this )
 {
-    m_Layer = DRAW_LAYER;
+    m_Layer = DRAW_N;
     m_Width = Millimeter2iu( 0.2 );
     m_Value = 0;
     m_Shape = 0;
@@ -86,7 +86,7 @@ const wxString DIMENSION::GetText() const
 }
 
 
-void DIMENSION::SetLayer( int aLayer )
+void DIMENSION::SetLayer( LAYER_NUM aLayer )
 {
     m_Layer = aLayer;
     m_Text.SetLayer( aLayer );
diff --git a/pcbnew/class_dimension.h b/pcbnew/class_dimension.h
index 42b32930e0..26f17d72b1 100644
--- a/pcbnew/class_dimension.h
+++ b/pcbnew/class_dimension.h
@@ -80,7 +80,7 @@ public:
         m_Text.SetSize( aTextSize );
     }
 
-    void SetLayer( int aLayer );
+    void SetLayer( LAYER_NUM aLayer );
 
     void SetShape( int aShape )         { m_Shape = aShape; }
     int GetShape() const { return m_Shape; }
diff --git a/pcbnew/class_drawsegment.cpp b/pcbnew/class_drawsegment.cpp
index 746442fea9..9e23534245 100644
--- a/pcbnew/class_drawsegment.cpp
+++ b/pcbnew/class_drawsegment.cpp
@@ -55,7 +55,8 @@
 DRAWSEGMENT::DRAWSEGMENT( BOARD_ITEM* aParent, KICAD_T idtype ) :
     BOARD_ITEM( aParent, idtype )
 {
-    m_Width = m_Flags = m_Type = m_Angle = 0;
+    m_Width = m_Type = m_Angle = 0;
+    m_Flags = 0;
     m_Shape = S_SEGMENT;
 }
 
@@ -175,7 +176,7 @@ void DRAWSEGMENT::Draw( EDA_DRAW_PANEL* panel, wxDC* DC, GR_DRAWMODE draw_mode,
     int l_trace;
     int mode;
     int radius;
-    int curr_layer = ( (PCB_SCREEN*) panel->GetScreen() )->m_Active_Layer;
+    LAYER_NUM curr_layer = ( (PCB_SCREEN*) panel->GetScreen() )->m_Active_Layer;
     EDA_COLOR_T color;
 
     BOARD * brd =  GetBoard( );
diff --git a/pcbnew/class_edge_mod.cpp b/pcbnew/class_edge_mod.cpp
index 1d73a2f9be..5ea8860864 100644
--- a/pcbnew/class_edge_mod.cpp
+++ b/pcbnew/class_edge_mod.cpp
@@ -103,7 +103,7 @@ void EDGE_MODULE::Draw( EDA_DRAW_PANEL* panel, wxDC* DC, GR_DRAWMODE draw_mode,
     int             ux0, uy0, dx, dy, radius, StAngle, EndAngle;
     int             type_trace;
     int             typeaff;
-    int curr_layer = ( (PCB_SCREEN*) panel->GetScreen() )->m_Active_Layer;
+    LAYER_NUM curr_layer = ( (PCB_SCREEN*) panel->GetScreen() )->m_Active_Layer;
     PCB_BASE_FRAME* frame;
     MODULE* module = (MODULE*) m_Parent;
 
diff --git a/pcbnew/class_marker_pcb.cpp b/pcbnew/class_marker_pcb.cpp
index d16c973855..d7c4beb2e4 100644
--- a/pcbnew/class_marker_pcb.cpp
+++ b/pcbnew/class_marker_pcb.cpp
@@ -86,7 +86,7 @@ MARKER_PCB::~MARKER_PCB()
  * param aLayer The layer to test for.
  * return bool - true if on given layer, else false.
  */
-bool MARKER_PCB::IsOnLayer( int aLayer ) const
+bool MARKER_PCB::IsOnLayer( LAYER_NUM aLayer ) const
 {
     return IsValidCopperLayerIndex( aLayer );
 }
diff --git a/pcbnew/class_marker_pcb.h b/pcbnew/class_marker_pcb.h
index d1fc47ec7a..7728b152c0 100644
--- a/pcbnew/class_marker_pcb.h
+++ b/pcbnew/class_marker_pcb.h
@@ -69,7 +69,7 @@ public:
         return HitTestMarker( aPosition );
     }
 
-    bool IsOnLayer( int aLayer ) const;
+    bool IsOnLayer( LAYER_NUM aLayer ) const;
 
     void GetMsgPanelInfo( std::vector< MSG_PANEL_ITEM >& aList );
 
diff --git a/pcbnew/class_mire.cpp b/pcbnew/class_mire.cpp
index 340d2020f5..c05a03dfee 100644
--- a/pcbnew/class_mire.cpp
+++ b/pcbnew/class_mire.cpp
@@ -53,7 +53,7 @@ PCB_TARGET::PCB_TARGET( BOARD_ITEM* aParent ) :
     m_Size  = 5000;
 }
 
-PCB_TARGET::PCB_TARGET( BOARD_ITEM* aParent, int aShape, int aLayer,
+PCB_TARGET::PCB_TARGET( BOARD_ITEM* aParent, int aShape, LAYER_NUM aLayer,
     const wxPoint& aPos, int aSize, int aWidth ) :
     BOARD_ITEM( aParent, PCB_TARGET_T )
 {
diff --git a/pcbnew/class_mire.h b/pcbnew/class_mire.h
index e454c3431c..32f02dd103 100644
--- a/pcbnew/class_mire.h
+++ b/pcbnew/class_mire.h
@@ -51,7 +51,7 @@ public:
 
     // Do not create a copy constructor.  The one generated by the compiler is adequate.
 
-    PCB_TARGET( BOARD_ITEM* aParent, int aShape, int aLayer,
+    PCB_TARGET( BOARD_ITEM* aParent, int aShape, LAYER_NUM aLayer,
                 const wxPoint& aPos, int aSize, int aWidth );
 
     ~PCB_TARGET();
diff --git a/pcbnew/class_module_transform_functions.cpp b/pcbnew/class_module_transform_functions.cpp
index be9bb14dc8..159b83697d 100644
--- a/pcbnew/class_module_transform_functions.cpp
+++ b/pcbnew/class_module_transform_functions.cpp
@@ -22,9 +22,9 @@
  * some layers: external copper, Mask, Paste, and solder
  * are swapped between front and back sides
  */
-int BOARD::ReturnFlippedLayerNumber( int oldlayer )
+LAYER_NUM BOARD::ReturnFlippedLayerNumber( LAYER_NUM oldlayer )
 {
-    int newlayer;
+    LAYER_NUM newlayer;
 
     switch( oldlayer )
     {
diff --git a/pcbnew/class_pad.cpp b/pcbnew/class_pad.cpp
index d80ff222ae..ee52e4ad20 100644
--- a/pcbnew/class_pad.cpp
+++ b/pcbnew/class_pad.cpp
@@ -688,7 +688,7 @@ void D_PAD::GetMsgPanelInfo( std::vector< MSG_PANEL_ITEM>& aList )
 
 
 // see class_pad.h
-bool D_PAD::IsOnLayer( int aLayer ) const
+bool D_PAD::IsOnLayer( LAYER_NUM aLayer ) const
 {
     return ::GetLayerMask( aLayer ) & m_layerMask;
 }
diff --git a/pcbnew/class_pad.h b/pcbnew/class_pad.h
index a7003f9cfb..55387f4378 100644
--- a/pcbnew/class_pad.h
+++ b/pcbnew/class_pad.h
@@ -345,7 +345,7 @@ public:
 
     void GetMsgPanelInfo( std::vector< MSG_PANEL_ITEM >& aList );
 
-    bool IsOnLayer( int aLayer ) const;
+    bool IsOnLayer( LAYER_NUM aLayer ) const;
 
     bool HitTest( const wxPoint& aPosition );
 
diff --git a/pcbnew/class_pad_draw_functions.cpp b/pcbnew/class_pad_draw_functions.cpp
index 09d1862a71..5db58b736f 100644
--- a/pcbnew/class_pad_draw_functions.cpp
+++ b/pcbnew/class_pad_draw_functions.cpp
@@ -240,8 +240,8 @@ void D_PAD::Draw( EDA_DRAW_PANEL* aPanel, wxDC* aDC, GR_DRAWMODE aDraw_mode,
         // when routing tracks
         if( frame && frame->GetToolId() == ID_TRACK_BUTT )
         {
-            int routeTop = screen->m_Route_Layer_TOP;
-            int routeBot = screen->m_Route_Layer_BOTTOM;
+            LAYER_NUM routeTop = screen->m_Route_Layer_TOP;
+            LAYER_NUM routeBot = screen->m_Route_Layer_BOTTOM;
 
             // if routing between copper and component layers,
             // or the current layer is one of said 2 external copper layers,
diff --git a/pcbnew/class_pcb_layer_box_selector.cpp b/pcbnew/class_pcb_layer_box_selector.cpp
index e44dabaa7d..be7c847f33 100644
--- a/pcbnew/class_pcb_layer_box_selector.cpp
+++ b/pcbnew/class_pcb_layer_box_selector.cpp
@@ -58,11 +58,11 @@ void PCB_LAYER_BOX_SELECTOR::Resync()
     static DECLARE_LAYERS_ORDER_LIST( layertranscode );
     static DECLARE_LAYERS_HOTKEY( layerhk );
 
-    for( int i = 0; i < LAYER_COUNT; i++ )
+    for( LAYER_NUM i = FIRST_LAYER; i < NB_LAYERS; ++i )
     {
         wxBitmap   layerbmp( 14, 14 );
         wxString   layername;
-        int        layerid = i;
+        LAYER_NUM  layerid = i;
 
         if( m_layerorder )
             layerid = layertranscode[i];
@@ -83,7 +83,7 @@ void PCB_LAYER_BOX_SELECTOR::Resync()
 
 
 // Returns true if the layer id is enabled (i.e. is it should be displayed)
-bool PCB_LAYER_BOX_SELECTOR::IsLayerEnabled( int aLayerIndex ) const
+bool PCB_LAYER_BOX_SELECTOR::IsLayerEnabled( LAYER_NUM aLayerIndex ) const
 {
     PCB_BASE_FRAME* pcbFrame = (PCB_BASE_FRAME*) GetParent()->GetParent();
     BOARD* board = pcbFrame->GetBoard();
@@ -94,7 +94,7 @@ bool PCB_LAYER_BOX_SELECTOR::IsLayerEnabled( int aLayerIndex ) const
 
 
 // Returns a color index from the layer id
-EDA_COLOR_T PCB_LAYER_BOX_SELECTOR::GetLayerColor( int aLayerIndex ) const
+EDA_COLOR_T PCB_LAYER_BOX_SELECTOR::GetLayerColor( LAYER_NUM aLayerIndex ) const
 {
     PCB_BASE_FRAME* pcbFrame = (PCB_BASE_FRAME*) GetParent()->GetParent();
     BOARD* board = pcbFrame->GetBoard();
@@ -105,7 +105,7 @@ EDA_COLOR_T PCB_LAYER_BOX_SELECTOR::GetLayerColor( int aLayerIndex ) const
 
 
 // Returns the name of the layer id
-wxString PCB_LAYER_BOX_SELECTOR::GetLayerName( int aLayerIndex ) const
+wxString PCB_LAYER_BOX_SELECTOR::GetLayerName( LAYER_NUM aLayerIndex ) const
 {
     PCB_BASE_FRAME* pcbFrame = (PCB_BASE_FRAME*) GetParent()->GetParent();
     BOARD* board = pcbFrame->GetBoard();
diff --git a/pcbnew/class_pcb_layer_box_selector.h b/pcbnew/class_pcb_layer_box_selector.h
index 790988fd07..ef75213cc4 100644
--- a/pcbnew/class_pcb_layer_box_selector.h
+++ b/pcbnew/class_pcb_layer_box_selector.h
@@ -40,34 +40,15 @@ public:
 
     // Returns a color index from the layer id
     // Virtual function
-    EDA_COLOR_T GetLayerColor( int aLayerIndex ) const;
+    EDA_COLOR_T GetLayerColor( LAYER_NUM aLayerIndex ) const;
 
     // Returns true if the layer id is enabled (i.e. is it should be displayed)
     // Virtual function
-    bool IsLayerEnabled( int aLayerIndex ) const;
+    bool IsLayerEnabled( LAYER_NUM aLayerIndex ) const;
 
     // Returns the name of the layer id
     // Virtual function
-    wxString GetLayerName( int aLayerIndex ) const;
+    wxString GetLayerName( LAYER_NUM aLayerIndex ) const;
 };
 
-#define DECLARE_LAYERS_HOTKEY(list) int list[LAYER_COUNT] = \
-        { \
-            HK_SWITCH_LAYER_TO_COPPER,   \
-            HK_SWITCH_LAYER_TO_INNER1,   \
-            HK_SWITCH_LAYER_TO_INNER2,   \
-            HK_SWITCH_LAYER_TO_INNER3,   \
-            HK_SWITCH_LAYER_TO_INNER4,   \
-            HK_SWITCH_LAYER_TO_INNER5,   \
-            HK_SWITCH_LAYER_TO_INNER6,   \
-            HK_SWITCH_LAYER_TO_INNER7,   \
-            HK_SWITCH_LAYER_TO_INNER8,   \
-            HK_SWITCH_LAYER_TO_INNER9,   \
-            HK_SWITCH_LAYER_TO_INNER10,  \
-            HK_SWITCH_LAYER_TO_INNER11,  \
-            HK_SWITCH_LAYER_TO_INNER12,  \
-            HK_SWITCH_LAYER_TO_INNER13,  \
-            HK_SWITCH_LAYER_TO_INNER14,  \
-            HK_SWITCH_LAYER_TO_COMPONENT \
-        };
 #endif //CLASS_PCB_PCB_LAYER_BOX_SELECTOR_H
diff --git a/pcbnew/class_pcb_layer_widget.cpp b/pcbnew/class_pcb_layer_widget.cpp
index 6de78f808d..a852a2723d 100644
--- a/pcbnew/class_pcb_layer_widget.cpp
+++ b/pcbnew/class_pcb_layer_widget.cpp
@@ -151,7 +151,7 @@ void PCB_LAYER_WIDGET::onPopupSelection( wxCommandEvent& event )
         for( int row=rowCount-1;  row>=0;  --row )
         {
             wxCheckBox* cb = (wxCheckBox*) getLayerComp( row, 3 );
-            int layer = getDecodedId( cb->GetId() );
+            LAYER_NUM layer = getDecodedId( cb->GetId() );
             if( IsValidCopperLayerIndex( layer ) )
             {
                 lastCu = row;
@@ -162,7 +162,7 @@ void PCB_LAYER_WIDGET::onPopupSelection( wxCommandEvent& event )
         for( int row=0;  row<rowCount;  ++row )
         {
             wxCheckBox* cb = (wxCheckBox*) getLayerComp( row, 3 );
-            int layer = getDecodedId( cb->GetId() );
+            LAYER_NUM layer = getDecodedId( cb->GetId() );
 
             if( IsValidCopperLayerIndex( layer ) )
             {
@@ -241,7 +241,7 @@ void PCB_LAYER_WIDGET::SyncLayerVisibilities()
 
         wxWindow* w = getLayerComp( row, 0 );
 
-        int layerId = getDecodedId( w->GetId() );
+        LAYER_NUM layerId = getDecodedId( w->GetId() );
 
         // this does not fire a UI event
         SetLayerVisible( layerId, board->IsLayerVisible( layerId ) );
@@ -252,7 +252,7 @@ void PCB_LAYER_WIDGET::SyncLayerVisibilities()
 void PCB_LAYER_WIDGET::ReFill()
 {
     BOARD*  brd = myframe->GetBoard();
-    int     layer;
+    LAYER_NUM layer;
 
     int enabledLayers = brd->GetEnabledLayers();
 
@@ -269,7 +269,7 @@ void PCB_LAYER_WIDGET::ReFill()
             brd->GetLayerName( layer ), layer, brd->GetLayerColor( layer ), _("Front copper layer"), true ) );
     }
 
-    for( layer = LAYER_N_FRONT-1;  layer >= 1;  --layer )
+    for( layer = LAYER_N_FRONT-1; layer >= 1; --layer )
     {
         if( enabledLayers & GetLayerMask( layer ) )
         {
@@ -287,7 +287,7 @@ void PCB_LAYER_WIDGET::ReFill()
 
     // technical layers are shown in this order:
     static const struct {
-        int         layerId;
+        LAYER_NUM   layerId;
         wxString    tooltip;
     } techLayerSeq[] = {
         { ADHESIVE_N_FRONT,     _( "Adhesive on board's front" )    },
@@ -324,7 +324,7 @@ void PCB_LAYER_WIDGET::ReFill()
 
 //-----<LAYER_WIDGET callbacks>-------------------------------------------
 
-void PCB_LAYER_WIDGET::OnLayerColorChange( int aLayer, EDA_COLOR_T aColor )
+void PCB_LAYER_WIDGET::OnLayerColorChange( LAYER_NUM aLayer, EDA_COLOR_T aColor )
 {
     myframe->GetBoard()->SetLayerColor( aLayer, aColor );
     myframe->ReCreateLayerBox( NULL );
@@ -332,7 +332,7 @@ void PCB_LAYER_WIDGET::OnLayerColorChange( int aLayer, EDA_COLOR_T aColor )
 }
 
 
-bool PCB_LAYER_WIDGET::OnLayerSelect( int aLayer )
+bool PCB_LAYER_WIDGET::OnLayerSelect( LAYER_NUM aLayer )
 {
     // the layer change from the PCB_LAYER_WIDGET can be denied by returning
     // false from this function.
@@ -345,7 +345,7 @@ bool PCB_LAYER_WIDGET::OnLayerSelect( int aLayer )
 }
 
 
-void PCB_LAYER_WIDGET::OnLayerVisible( int aLayer, bool isVisible, bool isFinal )
+void PCB_LAYER_WIDGET::OnLayerVisible( LAYER_NUM aLayer, bool isVisible, bool isFinal )
 {
     BOARD* brd = myframe->GetBoard();
 
diff --git a/pcbnew/class_pcb_layer_widget.h b/pcbnew/class_pcb_layer_widget.h
index 8fa09595b5..dd8d8ade01 100644
--- a/pcbnew/class_pcb_layer_widget.h
+++ b/pcbnew/class_pcb_layer_widget.h
@@ -82,9 +82,9 @@ public:
     void SetLayersManagerTabsText();
 
     //-----<implement LAYER_WIDGET abstract callback functions>-----------
-    void OnLayerColorChange( int aLayer, EDA_COLOR_T aColor );
-    bool OnLayerSelect( int aLayer );
-    void OnLayerVisible( int aLayer, bool isVisible, bool isFinal );
+    void OnLayerColorChange( LAYER_NUM aLayer, EDA_COLOR_T aColor );
+    bool OnLayerSelect( LAYER_NUM aLayer );
+    void OnLayerVisible( LAYER_NUM aLayer, bool isVisible, bool isFinal );
     void OnRenderColorChange( int aId, EDA_COLOR_T aColor );
     void OnRenderEnable( int aId, bool isEnabled );
     //-----</implement LAYER_WIDGET abstract callback functions>----------
diff --git a/pcbnew/class_text_mod.cpp b/pcbnew/class_text_mod.cpp
index bbcacd4f8b..bd0b9790e3 100644
--- a/pcbnew/class_text_mod.cpp
+++ b/pcbnew/class_text_mod.cpp
@@ -71,7 +71,7 @@ TEXTE_MODULE::TEXTE_MODULE( MODULE* parent, int text_type ) :
     {
         m_Pos = module->GetPosition();
 
-        int moduleLayer = module->GetLayer();
+        LAYER_NUM moduleLayer = module->GetLayer();
 
         if( moduleLayer == LAYER_N_BACK )
             SetLayer( SILKSCREEN_N_BACK );
@@ -397,7 +397,7 @@ void TEXTE_MODULE::GetMsgPanelInfo( std::vector< MSG_PANEL_ITEM >& aList )
     BOARD* board = NULL;
     board = (BOARD*) module->GetParent();
 
-    if( m_Layer < NB_LAYERS && board )
+    if( m_Layer < NB_PCB_LAYERS && board )
         msg = board->GetLayerName( m_Layer );
     else
         msg.Printf( wxT( "%d" ), m_Layer );
@@ -426,7 +426,7 @@ void TEXTE_MODULE::GetMsgPanelInfo( std::vector< MSG_PANEL_ITEM >& aList )
 
 
 // see class_text_mod.h
-bool TEXTE_MODULE::IsOnLayer( int aLayer ) const
+bool TEXTE_MODULE::IsOnLayer( LAYER_NUM aLayer ) const
 {
     if( m_Layer == aLayer )
         return true;
diff --git a/pcbnew/class_text_mod.h b/pcbnew/class_text_mod.h
index 6394f0a7c8..e5087c9ed5 100644
--- a/pcbnew/class_text_mod.h
+++ b/pcbnew/class_text_mod.h
@@ -130,7 +130,7 @@ public:
 
     bool HitTest( const wxPoint& aPosition );
 
-    bool IsOnLayer( int aLayer ) const;
+    bool IsOnLayer( LAYER_NUM aLayer ) const;
 
 
     wxString GetClass() const
diff --git a/pcbnew/class_track.cpp b/pcbnew/class_track.cpp
index 514c091529..0f8aa12aaa 100644
--- a/pcbnew/class_track.cpp
+++ b/pcbnew/class_track.cpp
@@ -222,8 +222,8 @@ wxString SEGVIA::GetSelectMenuText() const
         if( shape != VIA_THROUGH )
         {
             // say which layers, only two for now
-            int topLayer;
-            int botLayer;
+            LAYER_NUM topLayer;
+            LAYER_NUM botLayer;
             ReturnLayerPair( &topLayer, &botLayer );
             text << _( " on " ) << board->GetLayerName( topLayer ).Trim() << wxT( " <-> " )
                  << board->GetLayerName( botLayer ).Trim();
@@ -416,9 +416,9 @@ SEARCH_RESULT TRACK::Visit( INSPECTOR* inspector, const void* testData,
 }
 
 
-bool SEGVIA::IsOnLayer( int layer_number ) const
+bool SEGVIA::IsOnLayer( LAYER_NUM layer_number ) const
 {
-    int bottom_layer, top_layer;
+    LAYER_NUM bottom_layer, top_layer;
 
     ReturnLayerPair( &top_layer, &bottom_layer );
 
@@ -440,7 +440,7 @@ LAYER_MSK TRACK::GetLayerMask() const
 
         // VIA_BLIND_BURIED or VIA_MICRVIA:
 
-        int bottom_layer, top_layer;
+        LAYER_NUM bottom_layer, top_layer;
 
         // ReturnLayerPair() knows how layers are stored
         ( (SEGVIA*) this )->ReturnLayerPair( &top_layer, &bottom_layer );
@@ -462,7 +462,7 @@ LAYER_MSK TRACK::GetLayerMask() const
 }
 
 
-void SEGVIA::SetLayerPair( int top_layer, int bottom_layer )
+void SEGVIA::SetLayerPair( LAYER_NUM top_layer, LAYER_NUM bottom_layer )
 {
     if( GetShape() == VIA_THROUGH )
     {
@@ -473,17 +473,19 @@ void SEGVIA::SetLayerPair( int top_layer, int bottom_layer )
     if( bottom_layer > top_layer )
         EXCHG( bottom_layer, top_layer );
 
+    // XXX EVIL usage of LAYER
     m_Layer = (top_layer & 15) + ( (bottom_layer & 15) << 4 );
 }
 
 
-void SEGVIA::ReturnLayerPair( int* top_layer, int* bottom_layer ) const
+void SEGVIA::ReturnLayerPair( LAYER_NUM* top_layer, LAYER_NUM* bottom_layer ) const
 {
-    int b_layer = LAYER_N_BACK;
-    int t_layer = LAYER_N_FRONT;
+    LAYER_NUM b_layer = LAYER_N_BACK;
+    LAYER_NUM t_layer = LAYER_N_FRONT;
 
     if( GetShape() != VIA_THROUGH )
     {
+        // XXX EVIL usage of LAYER
         b_layer = (m_Layer >> 4) & 15;
         t_layer = m_Layer & 15;
 
@@ -586,7 +588,7 @@ void TRACK::Draw( EDA_DRAW_PANEL* panel, wxDC* DC, GR_DRAWMODE draw_mode,
 {
     int l_trace;
     int radius;
-    int curr_layer = ( (PCB_SCREEN*) panel->GetScreen() )->m_Active_Layer;
+    LAYER_NUM curr_layer = ( (PCB_SCREEN*) panel->GetScreen() )->m_Active_Layer;
 
     if( Type() == PCB_ZONE_T && DisplayOpt.DisplayZonesMode != 0 )
         return;
@@ -751,7 +753,7 @@ void SEGVIA::Draw( EDA_DRAW_PANEL* panel, wxDC* DC, GR_DRAWMODE draw_mode,
                    const wxPoint& aOffset )
 {
     int radius;
-    int curr_layer = ( (PCB_SCREEN*) panel->GetScreen() )->m_Active_Layer;
+    LAYER_NUM curr_layer = ( (PCB_SCREEN*) panel->GetScreen() )->m_Active_Layer;
 
     int fillvia = 0;
     PCB_BASE_FRAME* frame  = (PCB_BASE_FRAME*) panel->GetParent();
@@ -906,7 +908,7 @@ void SEGVIA::Draw( EDA_DRAW_PANEL* panel, wxDC* DC, GR_DRAWMODE draw_mode,
     if( GetShape() == VIA_BLIND_BURIED )
     {
         int ax = 0, ay = radius, bx = 0, by = drill_radius;
-        int layer_top, layer_bottom;
+        LAYER_NUM layer_top, layer_bottom;
 
         ( (SEGVIA*) this )->ReturnLayerPair( &layer_top, &layer_bottom );
 
@@ -1114,7 +1116,7 @@ void TRACK::GetMsgPanelInfoBase( std::vector< MSG_PANEL_ITEM >& aList )
     if( Type() == PCB_VIA_T )
     {
         SEGVIA* Via = (SEGVIA*) this;
-        int     top_layer, bottom_layer;
+        LAYER_NUM top_layer, bottom_layer;
 
         Via->ReturnLayerPair( &top_layer, &bottom_layer );
         msg = board->GetLayerName( top_layer ) + wxT( "/" ) + board->GetLayerName( bottom_layer );
@@ -1191,7 +1193,7 @@ bool TRACK::HitTest( const EDA_RECT& aRect ) const
 }
 
 
-TRACK* TRACK::GetVia( const wxPoint& aPosition, int aLayer )
+TRACK* TRACK::GetVia( const wxPoint& aPosition, LAYER_NUM aLayer)
 {
     TRACK* track;
 
@@ -1206,7 +1208,7 @@ TRACK* TRACK::GetVia( const wxPoint& aPosition, int aLayer )
         if( track->GetState( BUSY | IS_DELETED ) )
             continue;
 
-        if( aLayer < 0 )
+        if( aLayer == UNDEFINED_LAYER  )
             break;
 
         if( track->IsOnLayer( aLayer ) )
@@ -1580,8 +1582,8 @@ void SEGVIA::Show( int nestLevel, std::ostream& os ) const
         break;
     }
 
-    int    topLayer;
-    int    botLayer;
+    LAYER_NUM topLayer;
+    LAYER_NUM botLayer;
     BOARD* board = (BOARD*) m_Parent;
 
 
diff --git a/pcbnew/class_track.h b/pcbnew/class_track.h
index 14d6eac95e..7bc1eff36b 100644
--- a/pcbnew/class_track.h
+++ b/pcbnew/class_track.h
@@ -268,7 +268,7 @@ public:
      * @param aLayer The layer to match, pass -1 for a don't care.
      * @return A pointer to a SEGVIA object if found, else NULL.
      */
-    TRACK* GetVia( const wxPoint& aPosition, int aLayer = -1 );
+    TRACK* GetVia( const wxPoint& aPosition, LAYER_NUM aLayer = UNDEFINED_LAYER );
 
     /**
      * Function GetVia
@@ -377,7 +377,7 @@ public:
     void Draw( EDA_DRAW_PANEL* panel, wxDC* DC,
                GR_DRAWMODE aDrawMode, const wxPoint& aOffset = ZeroOffset );
 
-    bool IsOnLayer( int aLayer ) const;
+    bool IsOnLayer( LAYER_NUM aLayer ) const;
 
     /**
      * Function SetLayerPair
@@ -389,7 +389,7 @@ public:
      * @param top_layer = first layer connected by the via
      * @param bottom_layer = last layer connected by the via
      */
-    void SetLayerPair( int top_layer, int bottom_layer );
+    void SetLayerPair( LAYER_NUM top_layer, LAYER_NUM bottom_layer );
 
     /**
      * Function ReturnLayerPair
@@ -398,7 +398,7 @@ public:
      *  @param top_layer = pointer to the first layer (can be null)
      *  @param bottom_layer = pointer to the last layer (can be null)
      */
-    void ReturnLayerPair( int* top_layer, int* bottom_layer ) const;
+    void ReturnLayerPair( LAYER_NUM* top_layer, LAYER_NUM* bottom_layer ) const;
 
     const wxPoint& GetPosition() const  {  return m_Start; }       // was overload
     void SetPosition( const wxPoint& aPoint ) { m_Start = aPoint;  m_End = aPoint; }    // was overload
diff --git a/pcbnew/class_zone.cpp b/pcbnew/class_zone.cpp
index d3ad2608ea..6b161ad189 100644
--- a/pcbnew/class_zone.cpp
+++ b/pcbnew/class_zone.cpp
@@ -170,7 +170,7 @@ void ZONE_CONTAINER::Draw( EDA_DRAW_PANEL* panel, wxDC* DC, GR_DRAWMODE aDrawMod
         return;
 
     wxPoint seg_start, seg_end;
-    int     curr_layer = ( (PCB_SCREEN*) panel->GetScreen() )->m_Active_Layer;
+    LAYER_NUM curr_layer = ( (PCB_SCREEN*) panel->GetScreen() )->m_Active_Layer;
 
     BOARD*  brd   = GetBoard();
     EDA_COLOR_T color = brd->GetLayerColor( m_Layer );
@@ -255,7 +255,7 @@ void ZONE_CONTAINER::DrawFilledArea( EDA_DRAW_PANEL* panel,
         return;
 
     BOARD* brd = GetBoard();
-    int    curr_layer = ( (PCB_SCREEN*) panel->GetScreen() )->m_Active_Layer;
+    LAYER_NUM curr_layer = ( (PCB_SCREEN*) panel->GetScreen() )->m_Active_Layer;
     EDA_COLOR_T color = brd->GetLayerColor( m_Layer );
 
     if( brd->IsLayerVisible( m_Layer ) == false && ( color & HIGHLIGHT_FLAG ) != HIGHLIGHT_FLAG )
@@ -400,7 +400,7 @@ void ZONE_CONTAINER::DrawWhileCreateOutline( EDA_DRAW_PANEL* panel, wxDC* DC,
     if( DC == NULL )
         return;
 
-    int    curr_layer = ( (PCB_SCREEN*) panel->GetScreen() )->m_Active_Layer;
+    LAYER_NUM curr_layer = ( (PCB_SCREEN*) panel->GetScreen() )->m_Active_Layer;
     BOARD* brd   = GetBoard();
     EDA_COLOR_T color = brd->GetLayerColor( m_Layer );
 
diff --git a/pcbnew/class_zone.h b/pcbnew/class_zone.h
index 7b14356c49..c06d3076ab 100644
--- a/pcbnew/class_zone.h
+++ b/pcbnew/class_zone.h
@@ -183,7 +183,7 @@ public:
      */
     bool IsOnCopperLayer( void ) const
     {
-        return ( GetLayer() < FIRST_NO_COPPER_LAYER ) ? true : false;
+        return ( GetLayer() < FIRST_NON_COPPER_LAYER ) ? true : false;
     }
 
     /**
diff --git a/pcbnew/class_zone_settings.cpp b/pcbnew/class_zone_settings.cpp
index af0d0e5d44..bdf85dbbd6 100644
--- a/pcbnew/class_zone_settings.cpp
+++ b/pcbnew/class_zone_settings.cpp
@@ -44,7 +44,7 @@ ZONE_SETTINGS::ZONE_SETTINGS()
     // Min thickness value in filled areas (this is the minimum width of copper to fill solid areas) :
     m_ZoneMinThickness   = Mils2iu( ZONE_THICKNESS_MIL );
     m_NetcodeSelection   = 0;                                  // Net code selection for the current zone
-    m_CurrentZone_Layer  = 0;                                  // Layer used to create the current zone
+    m_CurrentZone_Layer  = FIRST_LAYER;                        // Layer used to create the current zone
     m_Zone_HatchingStyle = CPolyLine::DIAGONAL_EDGE;           // Option to show the zone area (outlines only, short hatches or full hatches
 
     m_ArcToSegmentsCount = ARC_APPROX_SEGMENTS_COUNT_LOW_DEF;  // Option to select number of segments to approximate a circle
diff --git a/pcbnew/class_zone_settings.h b/pcbnew/class_zone_settings.h
index b26db0c7b8..0ec12f32df 100644
--- a/pcbnew/class_zone_settings.h
+++ b/pcbnew/class_zone_settings.h
@@ -39,7 +39,7 @@ public:
     int  m_ZoneClearance;               ///< Clearance value
     int  m_ZoneMinThickness;            ///< Min thickness value in filled areas
     int  m_NetcodeSelection;            ///< Net code selection for the current zone
-    int  m_CurrentZone_Layer;           ///< Layer used to create the current zone
+    LAYER_NUM  m_CurrentZone_Layer;     ///< Layer used to create the current zone
 
     /// Option to show the zone area (outlines only, short hatches or full hatches
     int  m_Zone_HatchingStyle;
diff --git a/pcbnew/clean.cpp b/pcbnew/clean.cpp
index b2b5e7a1fe..dc426d0c6c 100644
--- a/pcbnew/clean.cpp
+++ b/pcbnew/clean.cpp
@@ -182,7 +182,7 @@ void TRACKS_CLEANER::buildTrackConnectionInfo()
         track->start = NULL;
         track->end = NULL;
         track->m_PadsConnected.clear();
-        track->SetState( START_ON_PAD|END_ON_PAD|BUSY, OFF );
+        track->SetState( START_ON_PAD|END_ON_PAD|BUSY, false );
     }
 
     // Build connections info tracks to pads
@@ -197,13 +197,13 @@ void TRACKS_CLEANER::buildTrackConnectionInfo()
             if( pad->HitTest( track->GetStart() ) )
             {
                 track->start = pad;
-                track->SetState( START_ON_PAD, ON );
+                track->SetState( START_ON_PAD, true );
             }
 
             if( pad->HitTest( track->GetEnd() ) )
             {
                 track->end = pad;
-                track->SetState( END_ON_PAD, ON );
+                track->SetState( END_ON_PAD, true );
             }
         }
     }
@@ -309,7 +309,7 @@ bool TRACKS_CLEANER::deleteUnconnectedTracks()
             // For via test, an enhancement could be to test if connected
             // to 2 items on different layers.
             // Currently a via must be connected to 2 items, that can be on the same layer
-            int top_layer, bottom_layer;
+            LAYER_NUM top_layer, bottom_layer;
             ZONE_CONTAINER* zone;
 
             if( (type_end & START_ON_PAD ) == 0 )
diff --git a/pcbnew/collectors.cpp b/pcbnew/collectors.cpp
index 965f35a9ef..5970de7ef7 100644
--- a/pcbnew/collectors.cpp
+++ b/pcbnew/collectors.cpp
@@ -350,7 +350,7 @@ SEARCH_RESULT GENERAL_COLLECTOR::Inspect( EDA_ITEM* testItem, const void* testDa
 
     if( item->IsOnLayer( m_Guide->GetPreferredLayer() ) || m_Guide->IgnorePreferredLayer() )
     {
-        int layer = item->GetLayer();
+        LAYER_NUM layer = item->GetLayer();
 
         // Modules and their subcomponents: text and pads are not sensitive to the layer
         // visibility controls.  They all have their own separate visibility controls
@@ -378,7 +378,7 @@ SEARCH_RESULT GENERAL_COLLECTOR::Inspect( EDA_ITEM* testItem, const void* testDa
         // no effect on other criteria, since there is a separate "ignore" control for
         // those in the COLLECTORS_GUIDE
 
-        int layer = item->GetLayer();
+        LAYER_NUM layer = item->GetLayer();
 
         // Modules and their subcomponents: text and pads are not sensitive to the layer
         // visibility controls.  They all have their own separate visibility controls
diff --git a/pcbnew/collectors.h b/pcbnew/collectors.h
index b958b82e98..8eef56af40 100644
--- a/pcbnew/collectors.h
+++ b/pcbnew/collectors.h
@@ -71,13 +71,13 @@ public:
      * Function IsLayerLocked
      * @return bool - true if the given layer is locked, else false.
      */
-    virtual     bool IsLayerLocked( int layer ) const = 0;
+    virtual     bool IsLayerLocked( LAYER_NUM layer ) const = 0;
 
     /**
      * Function IsLayerVisible
      * @return bool - true if the given layer is visible, else false.
      */
-    virtual     bool IsLayerVisible( int layer ) const = 0;
+    virtual     bool IsLayerVisible( LAYER_NUM layer ) const = 0;
 
     /**
      * Function IgnoreLockedLayers
@@ -95,7 +95,7 @@ public:
      * Function GetPreferredLayer
      * @return int - the preferred layer for HitTest()ing.
      */
-    virtual     int GetPreferredLayer() const = 0;
+    virtual     LAYER_NUM GetPreferredLayer() const = 0;
 
     /**
      * Function IgnorePreferredLayer
@@ -376,7 +376,7 @@ private:
     // the storage architecture here is not important, since this is only
     // a carrier object and its functions are what is used, and data only indirectly.
 
-    int     m_PreferredLayer;
+    LAYER_NUM m_PreferredLayer;
     bool    m_IgnorePreferredLayer;
 
     LAYER_MSK m_LayerLocked;                  ///< bit-mapped layer locked bits
@@ -407,7 +407,7 @@ public:
      * @param aVisibleLayerMask = current visible layers (bit mask)
      * @param aPreferredLayer = the layer to search first
      */
-    GENERAL_COLLECTORS_GUIDE( LAYER_MSK aVisibleLayerMask, int aPreferredLayer )
+    GENERAL_COLLECTORS_GUIDE( LAYER_MSK aVisibleLayerMask, LAYER_NUM aPreferredLayer )
     {
         m_PreferredLayer            = LAYER_N_FRONT;
         m_IgnorePreferredLayer      = false;
@@ -443,11 +443,11 @@ public:
      * Function IsLayerLocked
      * @return bool - true if the given layer is locked, else false.
      */
-    bool IsLayerLocked( int aLayer ) const  
+    bool IsLayerLocked( LAYER_NUM aLayer ) const  
     {  
         return GetLayerMask( aLayer ) & m_LayerLocked; 
     }
-    void SetLayerLocked( int aLayer, bool isLocked )
+    void SetLayerLocked( LAYER_NUM aLayer, bool isLocked )
     {
         if( isLocked )
             m_LayerLocked |= GetLayerMask( aLayer );
@@ -460,11 +460,11 @@ public:
      * Function IsLayerVisible
      * @return bool - true if the given layer is visible, else false.
      */
-    bool IsLayerVisible( int aLayer ) const
+    bool IsLayerVisible( LAYER_NUM aLayer ) const 
     { 
         return GetLayerMask( aLayer ) & m_LayerVisible; 
     }
-    void SetLayerVisible( int aLayer, bool isVisible )
+    void SetLayerVisible( LAYER_NUM aLayer, bool isVisible )
     {
         if( isVisible )
             m_LayerVisible |= GetLayerMask( aLayer );
@@ -494,8 +494,8 @@ public:
      * Function GetPreferredLayer
      * @return int - the preferred layer for HitTest()ing.
      */
-    int GetPreferredLayer() const { return m_PreferredLayer; }
-    void SetPreferredLayer( int aLayer )  { m_PreferredLayer = aLayer; }
+    LAYER_NUM GetPreferredLayer() const { return m_PreferredLayer; }
+    void SetPreferredLayer( LAYER_NUM aLayer )  { m_PreferredLayer = aLayer; }
 
 
     /**
diff --git a/pcbnew/deltrack.cpp b/pcbnew/deltrack.cpp
index b69e4bd487..f85c787f69 100644
--- a/pcbnew/deltrack.cpp
+++ b/pcbnew/deltrack.cpp
@@ -53,7 +53,7 @@ TRACK* PCB_EDIT_FRAME::Delete_Segment( wxDC* DC, TRACK* aTrack )
     {
         if( g_CurrentTrackList.GetCount() > 0 )
         {
-            int previous_layer = getActiveLayer();
+            LAYER_NUM previous_layer = getActiveLayer();
 
             D( g_CurrentTrackList.VerifyListIntegrity(); )
 
@@ -216,7 +216,7 @@ void PCB_EDIT_FRAME::Remove_One_Track( wxDC* DC, TRACK* pt_segm )
         tracksegment->SetState( BUSY, false );
 
         D( std::cout << __func__ << ": track " << tracksegment << " status=" \
-                     << TO_UTF8( TRACK::ShowState( tracksegment->GetState( -1 ) ) ) \
+                     << TO_UTF8( TRACK::ShowState( tracksegment->GetStatus() ) ) \
                      << std::endl; )
 
         GetBoard()->m_Track.Remove( tracksegment );
diff --git a/pcbnew/dialogs/dialog_SVG_print.cpp b/pcbnew/dialogs/dialog_SVG_print.cpp
index 9b9e7052bb..39eab85e9d 100644
--- a/pcbnew/dialogs/dialog_SVG_print.cpp
+++ b/pcbnew/dialogs/dialog_SVG_print.cpp
@@ -103,8 +103,8 @@ void DIALOG_SVG_PRINT::initDialog()
         ReturnStringFromValue( g_UserUnit, g_DrawDefaultLineThickness ) );
 
     // Create layers list
-    int     layer;
-    for( layer = 0; layer < NB_LAYERS; ++layer )
+    LAYER_NUM layer;
+    for( layer = FIRST_LAYER; layer < NB_PCB_LAYERS; ++layer )
     {
         if( !m_board->IsLayerEnabled( layer ) )
             m_boxSelectLayer[layer] = NULL;
@@ -118,7 +118,7 @@ void DIALOG_SVG_PRINT::initDialog()
     // (Front or Top to Back or Bottom)
     DECLARE_LAYERS_ORDER_LIST( layersOrder );
 
-    for( int layer_idx = 0; layer_idx < NB_LAYERS; ++layer_idx )
+    for( LAYER_NUM layer_idx = FIRST_LAYER; layer_idx < NB_LAYERS; ++layer_idx )
     {
         layer = layersOrder[layer_idx];
 
@@ -132,7 +132,7 @@ void DIALOG_SVG_PRINT::initDialog()
         if( mask & s_SelectedLayers )
             m_boxSelectLayer[layer]->SetValue( true );
 
-        if( layer < 16 )
+        if( layer <= LAST_COPPER_LAYER )
             m_CopperLayersBoxSizer->Add(  m_boxSelectLayer[layer],
                                           0,
                                           wxGROW | wxALL,
@@ -148,7 +148,7 @@ void DIALOG_SVG_PRINT::initDialog()
     {
         wxString layerKey;
 
-        for( int layer = 0; layer<NB_LAYERS; ++layer )
+        for( LAYER_NUM layer = FIRST_LAYER; layer < NB_LAYERS; ++layer )
         {
             bool option;
 
@@ -237,14 +237,14 @@ void DIALOG_SVG_PRINT::ExportSVGFile( bool aOnlyOneFile )
     // Build layers mask
     LAYER_MSK printMaskLayer = NO_LAYERS;
 
-    for( int layer = 0; layer<NB_LAYERS; layer++ )
+    for( LAYER_NUM layer = FIRST_LAYER; layer < NB_LAYERS; ++layer )
     {
         if( m_boxSelectLayer[layer] && m_boxSelectLayer[layer]->GetValue() )
-            printMaskLayer |= 1 << layer;
+            printMaskLayer |= GetLayerMask( layer );
     }
 
     wxString    msg;
-    for( int layer = 0; layer<NB_LAYERS; layer++ )
+    for( LAYER_NUM layer = FIRST_LAYER; layer < NB_PCB_LAYERS; ++layer )
     {
         LAYER_MSK currlayer_mask = GetLayerMask( layer );
         if( (printMaskLayer & currlayer_mask ) == 0 )
@@ -363,7 +363,7 @@ void DIALOG_SVG_PRINT::OnCloseWindow( wxCloseEvent& event )
 
         wxString layerKey;
 
-        for( int layer = 0; layer<NB_LAYERS; ++layer )
+        for( LAYER_NUM layer = FIRST_LAYER; layer<NB_LAYERS;  ++layer )
         {
             if( m_boxSelectLayer[layer] == NULL )
                 continue;
diff --git a/pcbnew/dialogs/dialog_copper_zones.cpp b/pcbnew/dialogs/dialog_copper_zones.cpp
index 92167854f5..d5af4bbc7f 100644
--- a/pcbnew/dialogs/dialog_copper_zones.cpp
+++ b/pcbnew/dialogs/dialog_copper_zones.cpp
@@ -43,7 +43,7 @@
 
 #include <wx/imaglist.h>    // needed for wx/listctrl.h, in wxGTK 2.8.12
 #include <wx/listctrl.h>
-
+#include <layers_id_colors_and_visibility.h>
 
 
 /**
@@ -70,7 +70,7 @@ private:
                                             ///< true = pad count sort.
 
     long            m_NetFiltering;
-    std::vector<int> m_LayerId;             ///< Handle the real layer number from layer
+    std::vector<LAYER_NUM> m_LayerId;       ///< Handle the real layer number from layer
                                             ///< name position in m_LayerSelectionCtrl
 
     static wxString m_netNameShowFilter;    ///< the filter to show nets (default * "*").
@@ -250,9 +250,9 @@ void DIALOG_COPPER_ZONE::initDialog()
     int layerCount = board->GetCopperLayerCount();
     wxImageList* imageList = new wxImageList( LAYER_BITMAP_SIZE_X, LAYER_BITMAP_SIZE_Y );
     m_LayerSelectionCtrl->AssignImageList( imageList, wxIMAGE_LIST_SMALL );
-    for( int ii = 0; ii < layerCount; ii++ )
+    for( LAYER_NUM ii = FIRST_LAYER; ii < layerCount; ++ii )
     {
-        int layerNumber = LAYER_N_BACK;
+        LAYER_NUM layerNumber = LAYER_N_BACK;
 
         if( layerCount <= 1 || ii < layerCount - 1 )
             layerNumber = ii;
diff --git a/pcbnew/dialogs/dialog_global_deletion.cpp b/pcbnew/dialogs/dialog_global_deletion.cpp
index 5be3fe9a6e..0481490122 100644
--- a/pcbnew/dialogs/dialog_global_deletion.cpp
+++ b/pcbnew/dialogs/dialog_global_deletion.cpp
@@ -22,7 +22,7 @@ DIALOG_GLOBAL_DELETION::DIALOG_GLOBAL_DELETION( PCB_EDIT_FRAME* parent )
     : DIALOG_GLOBAL_DELETION_BASE( parent )
 {
     m_Parent = parent;
-    m_currentLayer = 0;
+    m_currentLayer = FIRST_LAYER;
     m_TrackFilterAR->Enable( m_DelTracks->GetValue() );
     m_TrackFilterLocked->Enable( m_DelTracks->GetValue() );
     m_TrackFilterNormal->Enable( m_DelTracks->GetValue() );
@@ -42,7 +42,7 @@ void PCB_EDIT_FRAME::InstallPcbGlobalDeleteFrame( const wxPoint& pos )
     dlg.ShowModal();
 }
 
-void DIALOG_GLOBAL_DELETION::SetCurrentLayer( int aLayer )
+void DIALOG_GLOBAL_DELETION::SetCurrentLayer( LAYER_NUM aLayer )
 {
     m_currentLayer = aLayer;
     m_textCtrlCurrLayer->SetValue( m_Parent->GetBoard()->GetLayerName( aLayer ) );
diff --git a/pcbnew/dialogs/dialog_global_deletion.h b/pcbnew/dialogs/dialog_global_deletion.h
index c5bbaac03b..1983409708 100644
--- a/pcbnew/dialogs/dialog_global_deletion.h
+++ b/pcbnew/dialogs/dialog_global_deletion.h
@@ -11,11 +11,11 @@ class DIALOG_GLOBAL_DELETION: public DIALOG_GLOBAL_DELETION_BASE
 {
 private:
     PCB_EDIT_FRAME * m_Parent;
-    int m_currentLayer;
+    LAYER_NUM m_currentLayer;
 
 public:
     DIALOG_GLOBAL_DELETION( PCB_EDIT_FRAME* parent );
-    void SetCurrentLayer( int aLayer );
+    void SetCurrentLayer( LAYER_NUM aLayer );
 
 private:
     void OnOkClick( wxCommandEvent& event )
diff --git a/pcbnew/dialogs/dialog_graphic_item_properties.cpp b/pcbnew/dialogs/dialog_graphic_item_properties.cpp
index 6dddab0eee..9b4525e962 100644
--- a/pcbnew/dialogs/dialog_graphic_item_properties.cpp
+++ b/pcbnew/dialogs/dialog_graphic_item_properties.cpp
@@ -156,18 +156,18 @@ void DIALOG_GRAPHIC_ITEM_PROPERTIES::initDlg( )
 
     PutValueInLocalUnits( *m_DefaultThicknessCtrl, thickness );
 
-    for( int layer=FIRST_NO_COPPER_LAYER; layer <= LAST_NO_COPPER_LAYER;  ++layer )
+    for( LAYER_NUM layer=FIRST_NON_COPPER_LAYER; layer <= LAST_NON_COPPER_LAYER;  ++layer )
     {
         m_LayerSelectionCtrl->Append( m_parent->GetBoard()->GetLayerName( layer ) );
     }
 
-    int layer =  m_Item->GetLayer();
+    LAYER_NUM layer = m_Item->GetLayer();
     // Control:
-    if ( layer < FIRST_NO_COPPER_LAYER )
-        layer = FIRST_NO_COPPER_LAYER;
-    if ( layer > LAST_NO_COPPER_LAYER )
-        layer = LAST_NO_COPPER_LAYER;
-    m_LayerSelectionCtrl->SetSelection( layer - FIRST_NO_COPPER_LAYER );
+    if ( layer < FIRST_NON_COPPER_LAYER )
+        layer = FIRST_NON_COPPER_LAYER;
+    if ( layer > LAST_NON_COPPER_LAYER )
+        layer = LAST_NON_COPPER_LAYER;
+    m_LayerSelectionCtrl->SetSelection( layer - FIRST_NON_COPPER_LAYER );
 }
 
 
@@ -177,7 +177,7 @@ void DIALOG_GRAPHIC_ITEM_PROPERTIES::OnLayerChoice( wxCommandEvent& event )
 {
     int thickness;
 
-    if( (m_LayerSelectionCtrl->GetCurrentSelection() + FIRST_NO_COPPER_LAYER) == EDGE_N )
+    if( (m_LayerSelectionCtrl->GetCurrentSelection() + FIRST_NON_COPPER_LAYER) == EDGE_N )
         thickness =  m_brdSettings.m_EdgeSegmentWidth;
     else
         thickness =  m_brdSettings.m_DrawSegmentWidth;
@@ -216,7 +216,7 @@ void DIALOG_GRAPHIC_ITEM_PROPERTIES::OnOkClick( wxCommandEvent& event )
     msg = m_DefaultThicknessCtrl->GetValue();
     int thickness = ReturnValueFromString( g_UserUnit, msg );
 
-    m_Item->SetLayer( m_LayerSelectionCtrl->GetCurrentSelection() + FIRST_NO_COPPER_LAYER);
+    m_Item->SetLayer( FIRST_NON_COPPER_LAYER + m_LayerSelectionCtrl->GetCurrentSelection() );
 
     if( m_Item->GetLayer() == EDGE_N )
          m_brdSettings.m_EdgeSegmentWidth = thickness;
diff --git a/pcbnew/dialogs/dialog_graphic_item_properties_for_Modedit.cpp b/pcbnew/dialogs/dialog_graphic_item_properties_for_Modedit.cpp
index 677a3ff7cc..a7ed5de1e0 100644
--- a/pcbnew/dialogs/dialog_graphic_item_properties_for_Modedit.cpp
+++ b/pcbnew/dialogs/dialog_graphic_item_properties_for_Modedit.cpp
@@ -32,7 +32,7 @@ private:
     EDGE_MODULE* m_item;
     BOARD_DESIGN_SETTINGS  m_brdSettings;
     MODULE * m_module;
-    std::vector<int> m_layerId;         // the layer Id with the same order as m_LayerSelectionCtrl widget
+    std::vector<LAYER_NUM> m_layerId;   // the layer Id with the same order as m_LayerSelectionCtrl widget
 
 public:
     DIALOG_MODEDIT_FP_BODY_ITEM_PROPERTIES( FOOTPRINT_EDIT_FRAME* aParent,
@@ -155,7 +155,7 @@ void DIALOG_MODEDIT_FP_BODY_ITEM_PROPERTIES::initDlg()
     m_layerId.push_back( LAYER_N_BACK );
     m_LayerSelectionCtrl->Append( m_parent->GetBoard()->GetLayerName( LAYER_N_FRONT ) );
     m_layerId.push_back( LAYER_N_FRONT );
-    for( int layer = FIRST_NO_COPPER_LAYER; layer <= LAST_NO_COPPER_LAYER; ++layer )
+    for( LAYER_NUM layer = FIRST_NON_COPPER_LAYER; layer <= LAST_NON_COPPER_LAYER; ++layer )
     {
         if( layer == EDGE_N )
         // Do not use pcb edge layer for footprints, this is a special layer
@@ -195,7 +195,7 @@ void DIALOG_MODEDIT_FP_BODY_ITEM_PROPERTIES::OnOkClick( wxCommandEvent& event )
         return;
     }
 
-    int layer = m_layerId[idx];
+    LAYER_NUM layer = m_layerId[idx];
     if( IsValidCopperLayerIndex( layer ) )
     {
         /* an edge is put on a copper layer, and it is very dangerous. a
diff --git a/pcbnew/dialogs/dialog_keepout_area_properties.cpp b/pcbnew/dialogs/dialog_keepout_area_properties.cpp
index 98c587d5bd..7a5f105196 100644
--- a/pcbnew/dialogs/dialog_keepout_area_properties.cpp
+++ b/pcbnew/dialogs/dialog_keepout_area_properties.cpp
@@ -60,7 +60,7 @@ private:
     ZONE_SETTINGS   m_zonesettings;
     ZONE_SETTINGS*  m_ptr;
 
-    std::vector<int> m_layerId;             ///< Handle the real layer number from layer
+    std::vector<LAYER_NUM> m_layerId;       ///< Handle the real layer number from layer
                                             ///< name position in m_LayerSelectionCtrl
 
     /**
@@ -153,7 +153,7 @@ void DIALOG_KEEPOUT_AREA_PROPERTIES::initDialog()
     m_LayerSelectionCtrl->AssignImageList( imageList, wxIMAGE_LIST_SMALL );
     for( int ii = 0; ii < layerCount; ii++ )
     {
-        int layerNumber = LAYER_N_BACK;
+        LAYER_NUM layerNumber = LAYER_N_BACK;
 
         if( layerCount <= 1 || ii < layerCount - 1 )
             layerNumber = ii;
diff --git a/pcbnew/dialogs/dialog_layers_setup.cpp b/pcbnew/dialogs/dialog_layers_setup.cpp
index 7d7d836410..a1825fc194 100644
--- a/pcbnew/dialogs/dialog_layers_setup.cpp
+++ b/pcbnew/dialogs/dialog_layers_setup.cpp
@@ -85,7 +85,7 @@ private:
     wxStaticText*       m_TypeStaticText;
 
 
-    void setLayerCheckBox( int layer, bool isChecked );
+    void setLayerCheckBox( LAYER_NUM layer, bool isChecked );
     void setCopperLayerCheckBoxes( int copperCount );
 
     void showCopperChoice( int copperCount );
@@ -96,8 +96,8 @@ private:
 
     /** return the selected layer mask within the UI checkboxes */
     LAYER_MSK getUILayerMask();
-    wxString getLayerName( int layer );
-    int getLayerTypeIndex( int layer );
+    wxString getLayerName( LAYER_NUM layer );
+    int getLayerTypeIndex( LAYER_NUM layer );
 
 
     void OnCancelButtonClick( wxCommandEvent& event );
@@ -114,19 +114,19 @@ private:
      * maps \a aLayerNumber to the wx IDs for that layer which are
      * the layer name control ID, checkbox control ID, and choice control ID
      */
-    CTLs getCTLs( int aLayerNumber );
+    CTLs getCTLs( LAYER_NUM aLayerNumber );
 
-    wxControl* getName( int aLayer )
+    wxControl* getName( LAYER_NUM aLayer )
     {
         return getCTLs( aLayer ).name;
     }
 
-    wxCheckBox* getCheckBox( int aLayer )
+    wxCheckBox* getCheckBox( LAYER_NUM aLayer )
     {
         return getCTLs( aLayer ).checkbox;
     }
 
-    wxChoice* getChoice( int aLayer )
+    wxChoice* getChoice( LAYER_NUM aLayer )
     {
         return (wxChoice*) getCTLs( aLayer ).choice;
     }
@@ -198,7 +198,7 @@ static const LAYER_MSK presets[] =
 };
 
 
-CTLs DIALOG_LAYERS_SETUP::getCTLs( int aLayerNumber )
+CTLs DIALOG_LAYERS_SETUP::getCTLs( LAYER_NUM aLayerNumber )
 {
 #define RETCOP(x)    return CTLs( x##Name, x##CheckBox, x##Choice, x##Panel );
 #define RETAUX(x)    return CTLs( x##Name, x##CheckBox, x##StaticText, x##Panel );
@@ -327,7 +327,7 @@ void DIALOG_LAYERS_SETUP::showBoardLayerNames()
     // obtaining them from BOARD::GetLayerName() which calls
     // BOARD::GetStandardLayerName() for non-coppers.
 
-    for( int layer=0; layer<NB_LAYERS;  ++layer )
+    for( LAYER_NUM layer=FIRST_LAYER; layer<NB_PCB_LAYERS;  ++layer )
     {
         wxControl*  ctl = getName( layer );
 
@@ -350,7 +350,7 @@ void DIALOG_LAYERS_SETUP::showBoardLayerNames()
 
 void DIALOG_LAYERS_SETUP::showSelectedLayerCheckBoxes( LAYER_MSK enabledLayers )
 {
-    for( int layer=0;  layer<NB_LAYERS;  ++layer )
+    for( LAYER_NUM layer=FIRST_LAYER; layer<NB_PCB_LAYERS; ++layer )
     {
         setLayerCheckBox( layer, GetLayerMask( layer ) & enabledLayers );
     }
@@ -376,7 +376,7 @@ void DIALOG_LAYERS_SETUP::showPresets( LAYER_MSK enabledLayers )
 
 void DIALOG_LAYERS_SETUP::showLayerTypes()
 {
-    for( int copperLayer =  FIRST_COPPER_LAYER;
+    for( LAYER_NUM copperLayer = FIRST_COPPER_LAYER;
              copperLayer <= LAST_COPPER_LAYER; ++copperLayer )
     {
         wxChoice* ctl = getChoice( copperLayer );
@@ -389,7 +389,7 @@ LAYER_MSK DIALOG_LAYERS_SETUP::getUILayerMask()
 {
     LAYER_MSK layerMaskResult = NO_LAYERS;
 
-    for( int layer=0;  layer<NB_LAYERS;  ++layer )
+    for( LAYER_NUM layer=FIRST_LAYER; layer<NB_PCB_LAYERS; ++layer )
     {
         wxCheckBox*  ctl = getCheckBox( layer );
         if( ctl->GetValue() )
@@ -402,7 +402,7 @@ LAYER_MSK DIALOG_LAYERS_SETUP::getUILayerMask()
 }
 
 
-void DIALOG_LAYERS_SETUP::setLayerCheckBox( int aLayer, bool isChecked )
+void DIALOG_LAYERS_SETUP::setLayerCheckBox( LAYER_NUM aLayer, bool isChecked )
 {
     wxCheckBox*  ctl = getCheckBox( aLayer );
     ctl->SetValue(  isChecked );
@@ -427,8 +427,7 @@ void DIALOG_LAYERS_SETUP::setCopperLayerCheckBoxes( int copperCount )
         setLayerCheckBox( LAYER_N_FRONT, false );
     }
 
-    int layer;
-    for( layer=LAYER_N_2; layer < NB_COPPER_LAYERS-1;  ++layer, --copperCount )
+    for( LAYER_NUM layer=LAYER_N_2; layer < NB_COPPER_LAYERS-1; ++layer, --copperCount )
     {
         bool state = copperCount > 0;
 
@@ -548,10 +547,10 @@ void DIALOG_LAYERS_SETUP::OnOkButtonClick( wxCommandEvent& event )
          */
         m_Pcb->SetVisibleLayers( m_EnabledLayers );
 
-        for( int layer =  FIRST_COPPER_LAYER;
+        for( LAYER_NUM layer = FIRST_COPPER_LAYER;
                  layer <= LAST_COPPER_LAYER; ++layer )
         {
-            if( (1<<layer) & m_EnabledLayers )
+            if( GetLayerMask( layer ) & m_EnabledLayers )
             {
                 name = getLayerName( layer );
 
@@ -571,7 +570,7 @@ void DIALOG_LAYERS_SETUP::OnOkButtonClick( wxCommandEvent& event )
     }
 }
 
-int DIALOG_LAYERS_SETUP::getLayerTypeIndex( int aLayer )
+int DIALOG_LAYERS_SETUP::getLayerTypeIndex( LAYER_NUM aLayer )
 {
     wxChoice*  ctl =  getChoice( aLayer );
 
@@ -580,7 +579,7 @@ int DIALOG_LAYERS_SETUP::getLayerTypeIndex( int aLayer )
     return ret;
 }
 
-wxString DIALOG_LAYERS_SETUP::getLayerName( int aLayer )
+wxString DIALOG_LAYERS_SETUP::getLayerName( LAYER_NUM aLayer )
 {
     wxString ret;
 
@@ -607,10 +606,10 @@ bool DIALOG_LAYERS_SETUP::testLayerNames()
 
     wxTextCtrl*  ctl;
 
-    for( int layer=0;  layer<=LAST_COPPER_LAYER;  ++layer )
+    for( LAYER_NUM layer=FIRST_LAYER; layer<=LAST_COPPER_LAYER; ++layer )
     {
         // we _can_ rely on m_EnabledLayers being current here:
-        if( !(m_EnabledLayers & (1<<layer)) )
+        if( !(m_EnabledLayers & GetLayerMask( layer )) )
             continue;
 
         wxString name = getLayerName( layer );
@@ -677,16 +676,16 @@ void PCB_EDIT_FRAME::InstallDialogLayerSetup()
 
     // If the current active layer was removed, find the next avaiable layer to set as the
     // active layer.
-    if( ( ( 1 << getActiveLayer() ) & GetBoard()->GetEnabledLayers() ) == 0 )
+    if( !( GetLayerMask( getActiveLayer() ) & GetBoard()->GetEnabledLayers() ) )
     {
-        for( int i = 0;  i < LAYER_COUNT;  i++ )
+        for( LAYER_NUM i = FIRST_LAYER; i < NB_LAYERS; ++i )
         {
-            int tmp = i;
+            LAYER_NUM tmp = i;
 
-            if( i >= LAYER_COUNT )
-                tmp = i - LAYER_COUNT;
+            if( i >= NB_LAYERS )
+                tmp = i - NB_LAYERS;
 
-            if( ( 1 << tmp ) & GetBoard()->GetEnabledLayers() )
+            if( GetLayerMask( tmp ) & GetBoard()->GetEnabledLayers() )
             {
                 wxLogDebug( wxT( "Setting current layer to  %d." ), getActiveLayer() );
                 setActiveLayer( tmp, true );
diff --git a/pcbnew/dialogs/dialog_pcb_text_properties.cpp b/pcbnew/dialogs/dialog_pcb_text_properties.cpp
index dfcc221af1..7a78102c41 100644
--- a/pcbnew/dialogs/dialog_pcb_text_properties.cpp
+++ b/pcbnew/dialogs/dialog_pcb_text_properties.cpp
@@ -56,7 +56,7 @@ private:
     PCB_EDIT_FRAME*     m_Parent;
     wxDC*               m_DC;
     TEXTE_PCB*          m_SelectedPCBText;
-    std::vector<int>    layerList;
+    std::vector<LAYER_NUM> layerList;
 
     void MyInit();
 
@@ -128,7 +128,7 @@ void DIALOG_PCB_TEXT_PROPERTIES::MyInit()
 
     LAYER_MSK enabledLayers = m_Parent->GetBoard()->GetEnabledLayers();
 
-    for( int layer = 0; layer < NB_LAYERS; ++layer )
+    for( LAYER_NUM layer = FIRST_LAYER; layer < NB_PCB_LAYERS;  ++layer )
     {
         if( enabledLayers & GetLayerMask( layer ) )
         {
diff --git a/pcbnew/dialogs/dialog_plot.cpp b/pcbnew/dialogs/dialog_plot.cpp
index fff9f9bbf7..cdf268ed5a 100644
--- a/pcbnew/dialogs/dialog_plot.cpp
+++ b/pcbnew/dialogs/dialog_plot.cpp
@@ -148,7 +148,8 @@ void DIALOG_PLOT::Init_Dialog()
     // List layers in same order than in setup layers dialog
     // (Front or Top to Back or Bottom)
     DECLARE_LAYERS_ORDER_LIST( layersOrder );
-    int layerIndex, checkIndex, layer;
+    int layerIndex, checkIndex;
+    LAYER_NUM layer;
 
     for( layerIndex = 0; layerIndex < NB_LAYERS; layerIndex++ )
     {
diff --git a/pcbnew/dialogs/dialog_print_using_printer.cpp b/pcbnew/dialogs/dialog_print_using_printer.cpp
index 7d711ae9f1..21afdf456c 100644
--- a/pcbnew/dialogs/dialog_print_using_printer.cpp
+++ b/pcbnew/dialogs/dialog_print_using_printer.cpp
@@ -144,16 +144,16 @@ DIALOG_PRINT_USING_PRINTER::DIALOG_PRINT_USING_PRINTER( PCB_EDIT_FRAME* parent )
 
 void DIALOG_PRINT_USING_PRINTER::InitValues( )
 {
-    int      layer_max = NB_LAYERS;
+    LAYER_NUM layer_max = NB_PCB_LAYERS;
     wxString msg;
     BOARD*   board = m_parent->GetBoard();
 
     s_Parameters.m_PageSetupData = s_pageSetupData;
 
      // Create layer list.
-    int      layer;
+    LAYER_NUM layer;
     wxString layerKey;
-    for( layer = 0; layer < NB_LAYERS; ++layer )
+    for( layer = FIRST_LAYER; layer < NB_PCB_LAYERS; ++layer )
     {
         if( !board->IsLayerEnabled( layer ) )
             m_BoxSelectLayer[layer] = NULL;
@@ -166,16 +166,16 @@ void DIALOG_PRINT_USING_PRINTER::InitValues( )
     //  List layers in same order than in setup layers dialog
     // (Front or Top to Back or Bottom)
     DECLARE_LAYERS_ORDER_LIST(layersOrder);
-    for( int layer_idx = 0; layer_idx < NB_LAYERS; ++layer_idx )
+    for( LAYER_NUM layer_idx = FIRST_LAYER; layer_idx < NB_PCB_LAYERS; ++layer_idx )
     {
         layer = layersOrder[layer_idx];
 
-        wxASSERT(layer < NB_LAYERS);
+        wxASSERT(layer < NB_PCB_LAYERS);
 
         if( m_BoxSelectLayer[layer] == NULL )
             continue;
 
-        if( layer < NB_COPPER_LAYERS )
+        if( layer <= LAST_COPPER_LAYER )
             m_CopperLayersBoxSizer->Add( m_BoxSelectLayer[layer],
                                      0, wxGROW | wxALL, 1 );
         else
@@ -280,11 +280,10 @@ void DIALOG_PRINT_USING_PRINTER::InitValues( )
 int DIALOG_PRINT_USING_PRINTER::SetLayerMaskFromListSelection()
 {
     int page_count;
-    int layers_count = NB_LAYERS;
 
     s_Parameters.m_PrintMaskLayer = NO_LAYERS;
-    int ii;
-    for( ii = 0, page_count = 0; ii < layers_count; ii++ )
+    LAYER_NUM ii;
+    for( ii = FIRST_LAYER, page_count = 0; ii < NB_PCB_LAYERS; ++ii )
     {
         if( m_BoxSelectLayer[ii] == NULL )
             continue;
@@ -324,7 +323,7 @@ void DIALOG_PRINT_USING_PRINTER::OnCloseWindow( wxCloseEvent& event )
         m_config->Write( OPTKEY_PRINT_PAGE_PER_LAYER, s_Parameters.m_OptionPrintPage );
         m_config->Write( OPTKEY_PRINT_PADS_DRILL, (long) s_Parameters.m_DrillShapeOpt );
         wxString layerKey;
-        for( int layer = 0; layer < NB_LAYERS;  ++layer )
+        for( LAYER_NUM layer = FIRST_LAYER; layer < NB_PCB_LAYERS;  ++layer )
         {
             if( m_BoxSelectLayer[layer] == NULL )
                 continue;
diff --git a/pcbnew/dimension.cpp b/pcbnew/dimension.cpp
index adc6c49a2a..45d76f83cd 100644
--- a/pcbnew/dimension.cpp
+++ b/pcbnew/dimension.cpp
@@ -132,12 +132,12 @@ DIALOG_DIMENSION_EDITOR::DIALOG_DIMENSION_EDITOR( PCB_EDIT_FRAME* aParent,
     PutValueInLocalUnits( *m_textCtrlPosY, aDimension->Text().GetTextPosition().y );
     AddUnitSymbol( *m_staticTextPosY );
 
-    for( int layer = FIRST_NO_COPPER_LAYER;  layer<NB_LAYERS;  layer++ )
+    for( LAYER_NUM layer = FIRST_NON_COPPER_LAYER; layer < NB_PCB_LAYERS; ++layer )
     {
         m_SelLayerBox->Append( aParent->GetBoard()->GetLayerName( layer ) );
     }
 
-    m_SelLayerBox->SetSelection( aDimension->GetLayer() - FIRST_NO_COPPER_LAYER );
+    m_SelLayerBox->SetSelection( aDimension->GetLayer() - FIRST_NON_COPPER_LAYER );
 
     GetSizer()->Fit( this );
     GetSizer()->SetSizeHints( this );
@@ -199,7 +199,7 @@ void DIALOG_DIMENSION_EDITOR::OnOKClick( wxCommandEvent& event )
 
     CurrentDimension->Text().SetMirrored( ( m_rbMirror->GetSelection() == 1 ) ? true : false );
 
-    CurrentDimension->SetLayer( m_SelLayerBox->GetCurrentSelection() + FIRST_NO_COPPER_LAYER );
+    CurrentDimension->SetLayer( FIRST_NON_COPPER_LAYER + m_SelLayerBox->GetCurrentSelection() );
 
     if( m_DC )     // Display new text
     {
diff --git a/pcbnew/drc_clearance_test_functions.cpp b/pcbnew/drc_clearance_test_functions.cpp
index 5df8dcfe95..640f4a4639 100644
--- a/pcbnew/drc_clearance_test_functions.cpp
+++ b/pcbnew/drc_clearance_test_functions.cpp
@@ -205,7 +205,7 @@ bool DRC::doTrackDrc( TRACK* aRefSeg, TRACK* aStart, bool testPads )
         // and **only one layer** can be drilled
         if( aRefSeg->GetShape() == VIA_MICROVIA )
         {
-            int  layer1, layer2;
+            LAYER_NUM layer1, layer2;
             bool err = true;
 
             ( (SEGVIA*) aRefSeg )->ReturnLayerPair( &layer1, &layer2 );
diff --git a/pcbnew/eagle_plugin.cpp b/pcbnew/eagle_plugin.cpp
index a1b0f61443..fd2384fe2d 100644
--- a/pcbnew/eagle_plugin.cpp
+++ b/pcbnew/eagle_plugin.cpp
@@ -256,7 +256,7 @@ struct EWIRE
     double      x2;
     double      y2;
     double      width;
-    int         layer;
+    LAYER_NUM   layer;
 
     // for style: (continuous | longdash | shortdash | dashdot)
     enum {
@@ -388,7 +388,7 @@ struct ECIRCLE
     double  y;
     double  radius;
     double  width;
-    int     layer;
+    LAYER_NUM layer;
 
     ECIRCLE( CPTREE& aCircle );
 };
@@ -1312,7 +1312,7 @@ void EAGLE_PLUGIN::loadLayerDefs( CPTREE& aLayers )
 
     for( EITER it = cu.begin();  it != cu.end();  ++it )
     {
-        int layer = kicad_layer( it->number );
+        LAYER_NUM layer = kicad_layer( it->number );
 
         m_board->SetLayerName( layer, FROM_UTF8( it->name.c_str() ) );
         m_board->SetLayerType( layer, LT_SIGNAL );
@@ -1333,9 +1333,9 @@ void EAGLE_PLUGIN::loadPlain( CPTREE& aGraphics )
         {
             m_xpath->push( "wire" );
             EWIRE   w( gr->second );
-            int     layer = kicad_layer( w.layer );
+            LAYER_NUM layer = kicad_layer( w.layer );
 
-            if( layer != -1 )
+            if( layer != UNDEFINED_LAYER )
             {
                 DRAWSEGMENT* dseg = new DRAWSEGMENT( m_board );
                 m_board->Add( dseg, ADD_APPEND );
@@ -1360,7 +1360,7 @@ void EAGLE_PLUGIN::loadPlain( CPTREE& aGraphics )
 #endif
             m_xpath->push( "text" );
             ETEXT   t( gr->second );
-            int     layer = kicad_layer( t.layer );
+            LAYER_NUM layer = kicad_layer( t.layer );
 
             if( layer != -1 )       // supported layer
             {
@@ -1450,9 +1450,9 @@ void EAGLE_PLUGIN::loadPlain( CPTREE& aGraphics )
         {
             m_xpath->push( "circle" );
             ECIRCLE c( gr->second );
-            int     layer = kicad_layer( c.layer );
+            LAYER_NUM layer = kicad_layer( c.layer );
 
-            if( layer != -1 )       // unsupported layer
+            if( layer != UNDEFINED_LAYER )       // unsupported layer
             {
                 DRAWSEGMENT* dseg = new DRAWSEGMENT( m_board );
                 m_board->Add( dseg, ADD_APPEND );
@@ -1473,7 +1473,7 @@ void EAGLE_PLUGIN::loadPlain( CPTREE& aGraphics )
         {
             m_xpath->push( "rectangle" );
             ERECT   r( gr->second );
-            int     layer = kicad_layer( r.layer );
+            LAYER_NUM layer = kicad_layer( r.layer );
 
             if( IsValidCopperLayerIndex( layer ) )
             {
@@ -1908,7 +1908,7 @@ MODULE* EAGLE_PLUGIN::makeModule( CPTREE& aPackage, const std::string& aPkgName
 void EAGLE_PLUGIN::packageWire( MODULE* aModule, CPTREE& aTree ) const
 {
     EWIRE   w( aTree );
-    int     layer = kicad_layer( w.layer );
+    LAYER_NUM layer = kicad_layer( w.layer );
 
     if( IsValidNonCopperLayerIndex( layer ) )  // skip copper package wires
     {
@@ -2015,7 +2015,7 @@ void EAGLE_PLUGIN::packagePad( MODULE* aModule, CPTREE& aTree ) const
 void EAGLE_PLUGIN::packageText( MODULE* aModule, CPTREE& aTree ) const
 {
     ETEXT   t( aTree );
-    int     layer = kicad_layer( t.layer );
+    LAYER_NUM layer = kicad_layer( t.layer );
 
     TEXTE_MODULE* txt;
 
@@ -2118,7 +2118,7 @@ void EAGLE_PLUGIN::packageText( MODULE* aModule, CPTREE& aTree ) const
 void EAGLE_PLUGIN::packageRectangle( MODULE* aModule, CPTREE& aTree ) const
 {
     ERECT   r( aTree );
-    int     layer = kicad_layer( r.layer );
+    LAYER_NUM layer = kicad_layer( r.layer );
 
     if( IsValidNonCopperLayerIndex( layer ) )  // skip copper "package.rectangle"s
     {
@@ -2151,7 +2151,7 @@ void EAGLE_PLUGIN::packageRectangle( MODULE* aModule, CPTREE& aTree ) const
 void EAGLE_PLUGIN::packagePolygon( MODULE* aModule, CPTREE& aTree ) const
 {
     EPOLYGON    p( aTree );
-    int         layer = kicad_layer( p.layer );
+    LAYER_NUM layer = kicad_layer( p.layer );
 
     if( IsValidNonCopperLayerIndex( layer ) )  // skip copper "package.rectangle"s
     {
@@ -2200,7 +2200,7 @@ void EAGLE_PLUGIN::packagePolygon( MODULE* aModule, CPTREE& aTree ) const
 void EAGLE_PLUGIN::packageCircle( MODULE* aModule, CPTREE& aTree ) const
 {
     ECIRCLE e( aTree );
-    int     layer = kicad_layer( e.layer );
+    LAYER_NUM layer = kicad_layer( e.layer );
 
     EDGE_MODULE* gr = new EDGE_MODULE( aModule, S_CIRCLE );
     aModule->GraphicalItems().PushBack( gr );
@@ -2257,7 +2257,7 @@ void EAGLE_PLUGIN::packageHole( MODULE* aModule, CPTREE& aTree ) const
 void EAGLE_PLUGIN::packageSMD( MODULE* aModule, CPTREE& aTree ) const
 {
     ESMD    e( aTree );
-    int     layer = kicad_layer( e.layer );
+    LAYER_NUM layer = kicad_layer( e.layer );
 
     if( !IsValidCopperLayerIndex( layer ) )
     {
@@ -2349,7 +2349,7 @@ void EAGLE_PLUGIN::loadSignals( CPTREE& aSignals )
             {
                 m_xpath->push( "wire" );
                 EWIRE   w( it->second );
-                int     layer = kicad_layer( w.layer );
+                LAYER_NUM layer = kicad_layer( w.layer );
 
                 if( IsValidCopperLayerIndex( layer ) )
                 {
@@ -2383,8 +2383,8 @@ void EAGLE_PLUGIN::loadSignals( CPTREE& aSignals )
                 m_xpath->push( "via" );
                 EVIA    v( it->second );
 
-                int layer_front_most = kicad_layer( v.layer_front_most );
-                int layer_back_most  = kicad_layer( v.layer_back_most );
+                LAYER_NUM layer_front_most = kicad_layer( v.layer_front_most );
+                LAYER_NUM layer_back_most  = kicad_layer( v.layer_back_most );
 
                 if( IsValidCopperLayerIndex( layer_front_most ) &&
                     IsValidCopperLayerIndex( layer_back_most ) )
@@ -2462,7 +2462,7 @@ void EAGLE_PLUGIN::loadSignals( CPTREE& aSignals )
             {
                 m_xpath->push( "polygon" );
                 EPOLYGON p( it->second );
-                int      layer = kicad_layer( p.layer );
+                LAYER_NUM layer = kicad_layer( p.layer );
 
                 if( IsValidCopperLayerIndex( layer ) )
                 {
@@ -2545,7 +2545,7 @@ void EAGLE_PLUGIN::loadSignals( CPTREE& aSignals )
 }
 
 
-int EAGLE_PLUGIN::kicad_layer( int aEagleLayer ) const
+LAYER_NUM EAGLE_PLUGIN::kicad_layer( int aEagleLayer ) const
 {
     /* will assume this is a valid mapping for all eagle boards until I get paid more:
 
@@ -2625,7 +2625,7 @@ int EAGLE_PLUGIN::kicad_layer( int aEagleLayer ) const
     else
     {
 /*
-#define FIRST_NO_COPPER_LAYER   16
+#define FIRST_NON_COPPER_LAYER  16
 #define ADHESIVE_N_BACK         16
 #define ADHESIVE_N_FRONT        17
 #define SOLDERPASTE_N_BACK      18
@@ -2639,7 +2639,7 @@ int EAGLE_PLUGIN::kicad_layer( int aEagleLayer ) const
 #define ECO1_N                  26
 #define ECO2_N                  27
 #define EDGE_N                  28
-#define LAST_NO_COPPER_LAYER    28
+#define LAST_NON_COPPER_LAYER   28
 #define UNUSED_LAYER_29         29
 #define UNUSED_LAYER_30         30
 #define UNUSED_LAYER_31         31
diff --git a/pcbnew/eagle_plugin.h b/pcbnew/eagle_plugin.h
index a84b2af6bd..077bb942aa 100644
--- a/pcbnew/eagle_plugin.h
+++ b/pcbnew/eagle_plugin.h
@@ -159,7 +159,7 @@ private:
     wxSize  kicad_fontz( double d ) const;
 
     /// Convert an Eagle layer to a KiCad layer.
-    int     kicad_layer( int aLayer ) const;
+    LAYER_NUM kicad_layer( int aLayer ) const;
 
     /// Convert a KiCad distance to an Eagle distance.
     double  eagle( BIU d ) const            { return mm_per_biu * d; }
diff --git a/pcbnew/edgemod.cpp b/pcbnew/edgemod.cpp
index 620ae55961..2b5f52b82d 100644
--- a/pcbnew/edgemod.cpp
+++ b/pcbnew/edgemod.cpp
@@ -191,7 +191,7 @@ void FOOTPRINT_EDIT_FRAME::Edit_Edge_Width( EDGE_MODULE* aEdge )
 void FOOTPRINT_EDIT_FRAME::Edit_Edge_Layer( EDGE_MODULE* aEdge )
 {
     MODULE* module    = GetBoard()->m_Modules;
-    int     new_layer = SILKSCREEN_N_FRONT;
+    LAYER_NUM new_layer = SILKSCREEN_N_FRONT;
 
     if( aEdge )
         new_layer = aEdge->GetLayer();
diff --git a/pcbnew/edit.cpp b/pcbnew/edit.cpp
index 13d0908dc5..51f4c5f8e8 100755
--- a/pcbnew/edit.cpp
+++ b/pcbnew/edit.cpp
@@ -62,7 +62,7 @@ void PCB_EDIT_FRAME::Process_Special_Functions( wxCommandEvent& event )
     int         id = event.GetId();
     wxPoint     pos;
 
-    int         itmp;
+    LAYER_NUM itmp;
     INSTALL_UNBUFFERED_DC( dc, m_canvas );
     MODULE* module;
 
@@ -916,7 +916,7 @@ void PCB_EDIT_FRAME::Process_Special_Functions( wxCommandEvent& event )
         break;
 
     case ID_POPUP_PCB_SELECT_LAYER:
-        itmp = SelectLayer( getActiveLayer(), -1, -1 );
+        itmp = SelectLayer( getActiveLayer(), UNDEFINED_LAYER, UNDEFINED_LAYER );
 
         if( itmp >= 0 )
             setActiveLayer( itmp );
@@ -929,7 +929,7 @@ void PCB_EDIT_FRAME::Process_Special_Functions( wxCommandEvent& event )
         break;
 
     case ID_POPUP_PCB_SELECT_NO_CU_LAYER:
-        itmp = SelectLayer( getActiveLayer(), FIRST_NO_COPPER_LAYER, -1 );
+        itmp = SelectLayer( getActiveLayer(), FIRST_NON_COPPER_LAYER, UNDEFINED_LAYER );
 
         if( itmp >= 0 )
             setActiveLayer( itmp );
@@ -938,7 +938,7 @@ void PCB_EDIT_FRAME::Process_Special_Functions( wxCommandEvent& event )
         break;
 
     case ID_POPUP_PCB_SELECT_CU_LAYER:
-        itmp = SelectLayer( getActiveLayer(), -1, LAST_COPPER_LAYER );
+        itmp = SelectLayer( getActiveLayer(), UNDEFINED_LAYER, LAST_COPPER_LAYER );
 
         if( itmp >= 0 )
             setActiveLayer( itmp );
@@ -951,7 +951,7 @@ void PCB_EDIT_FRAME::Process_Special_Functions( wxCommandEvent& event )
         break;
 
     case ID_TOOLBARH_PCB_SELECT_LAYER:
-        setActiveLayer( (size_t) m_SelLayerBox->GetLayerSelection());
+        setActiveLayer( m_SelLayerBox->GetLayerSelection() );
 
         if( DisplayOpt.ContrastModeDisplay )
             m_canvas->Refresh( true );
@@ -1238,9 +1238,9 @@ void PCB_EDIT_FRAME::RemoveStruct( BOARD_ITEM* Item, wxDC* DC )
 }
 
 
-void PCB_EDIT_FRAME::SwitchLayer( wxDC* DC, int layer )
+void PCB_EDIT_FRAME::SwitchLayer( wxDC* DC, LAYER_NUM layer )
 {
-    int curLayer = getActiveLayer();
+    LAYER_NUM curLayer = getActiveLayer();
 
     // Check if the specified layer matches the present layer
     if( layer == curLayer )
diff --git a/pcbnew/edit_pcb_text.cpp b/pcbnew/edit_pcb_text.cpp
index 3930ab6026..3037184890 100644
--- a/pcbnew/edit_pcb_text.cpp
+++ b/pcbnew/edit_pcb_text.cpp
@@ -203,7 +203,7 @@ TEXTE_PCB* PCB_EDIT_FRAME::CreateTextePcb( wxDC* aDC, TEXTE_PCB* aText )
     {
         GetBoard()->Add( textePcb );
         textePcb->SetFlags( IS_NEW );
-        int layer = ( (PCB_SCREEN*) GetScreen() )->m_Active_Layer;
+        LAYER_NUM layer = ( (PCB_SCREEN*) GetScreen() )->m_Active_Layer;
         textePcb->SetLayer( layer );
 
         // Set the mirrored option for layers on the BACK side of the board
diff --git a/pcbnew/editedge.cpp b/pcbnew/editedge.cpp
index 685bf7a916..39bd894238 100644
--- a/pcbnew/editedge.cpp
+++ b/pcbnew/editedge.cpp
@@ -144,7 +144,7 @@ void PCB_EDIT_FRAME::Delete_Segment_Edge( DRAWSEGMENT* Segment, wxDC* DC )
 }
 
 
-void PCB_EDIT_FRAME::Delete_Drawings_All_Layer( int aLayer )
+void PCB_EDIT_FRAME::Delete_Drawings_All_Layer( LAYER_NUM aLayer )
 {
     if( aLayer <= LAST_COPPER_LAYER )
     {
diff --git a/pcbnew/editrack-part2.cpp b/pcbnew/editrack-part2.cpp
index 6f89d66e60..e36a3a92a1 100644
--- a/pcbnew/editrack-part2.cpp
+++ b/pcbnew/editrack-part2.cpp
@@ -109,8 +109,8 @@ bool PCB_EDIT_FRAME::Other_Layer_Route( TRACK* aTrack, wxDC* DC )
     via->SetLayerPair( LAYER_N_BACK, LAYER_N_FRONT );
     via->SetDrill( GetBoard()->GetCurrentViaDrill() );
 
-    int first_layer = getActiveLayer();
-    int last_layer;
+    LAYER_NUM first_layer = getActiveLayer();
+    LAYER_NUM last_layer;
 
     // prepare switch to new active layer:
     if( first_layer != GetScreen()->m_Route_Layer_TOP )
@@ -127,7 +127,7 @@ bool PCB_EDIT_FRAME::Other_Layer_Route( TRACK* aTrack, wxDC* DC )
 
         case VIA_MICROVIA:  // from external to the near neighbor inner layer
         {
-            int last_inner_layer = GetBoard()->GetCopperLayerCount() - 2;
+            LAYER_NUM last_inner_layer = FIRST_LAYER + (GetBoard()->GetCopperLayerCount() - 2);
             if ( first_layer == LAYER_N_BACK )
                 last_layer = LAYER_N_2;
             else if ( first_layer == LAYER_N_FRONT )
diff --git a/pcbnew/editrack.cpp b/pcbnew/editrack.cpp
index 7064aceac4..651f26dd0c 100644
--- a/pcbnew/editrack.cpp
+++ b/pcbnew/editrack.cpp
@@ -535,7 +535,7 @@ bool PCB_EDIT_FRAME::End_Route( TRACK* aTrack, wxDC* aDC )
 }
 
 
-TRACK* LocateIntrusion( TRACK* listStart, TRACK* aTrack, int aLayer, const wxPoint& aRef )
+TRACK* LocateIntrusion( TRACK* listStart, TRACK* aTrack, LAYER_NUM aLayer, const wxPoint& aRef )
 {
     int     net   = aTrack->GetNet();
     int     width = aTrack->GetWidth();
diff --git a/pcbnew/export_gencad.cpp b/pcbnew/export_gencad.cpp
index 06001dcdd7..4d19b63a34 100644
--- a/pcbnew/export_gencad.cpp
+++ b/pcbnew/export_gencad.cpp
@@ -439,7 +439,7 @@ static void CreatePadsShapesSection( FILE* aFile, BOARD* aPcb )
                  via->GetWidth(), via->GetDrillValue(), mask,
                  via->GetDrillValue() / SCALE_FACTOR );
 
-        for( int layer = 0; layer < 32; layer++ )
+        for( LAYER_NUM layer = FIRST_LAYER; layer < NB_LAYERS; ++layer )
         {
             if( mask & GetLayerMask( layer ) )
             {
@@ -463,7 +463,7 @@ static void CreatePadsShapesSection( FILE* aFile, BOARD* aPcb )
         // Straight padstack
         fprintf( aFile, "PADSTACK PAD%d %g\n", i,
                  pad->GetDrillSize().x / SCALE_FACTOR );
-        for( int layer = 0; layer < 32; layer++ )
+        for( LAYER_NUM layer = FIRST_LAYER; layer < NB_LAYERS; ++layer )
         {
             if( pad->GetLayerMask() & GetLayerMask( layer ) & master_layermask )
             {
@@ -475,7 +475,7 @@ static void CreatePadsShapesSection( FILE* aFile, BOARD* aPcb )
         // Flipped padstack
         fprintf( aFile, "PADSTACK PAD%dF %g\n", i,
                  pad->GetDrillSize().x / SCALE_FACTOR );
-        for( int layer = 0; layer < 32; layer++ )
+        for( LAYER_NUM layer = FIRST_LAYER; layer < NB_LAYERS; ++layer )
         {
             if( pad->GetLayerMask() & GetLayerMask( layer ) & master_layermask )
             {
diff --git a/pcbnew/export_vrml.cpp b/pcbnew/export_vrml.cpp
index b1706d069a..99e4e006d5 100644
--- a/pcbnew/export_vrml.cpp
+++ b/pcbnew/export_vrml.cpp
@@ -96,7 +96,7 @@ struct FLAT_FAN
     {
         pts.push_back( POINT_2D( x, y ) );
     }
-    void bag( int layer, bool close = true );
+    void bag( LAYER_NUM layer, bool close = true );
 };
 
 // A flat quad ring
@@ -114,7 +114,7 @@ struct FLAT_RING
         outer.push_back( POINT_2D( x, y ) );
     }
 
-    void bag( int layer, bool close = true );
+    void bag( LAYER_NUM layer, bool close = true );
 };
 
 // A vertical quad loop
@@ -131,11 +131,11 @@ struct VLoop
 };
 
 // The bags for all the layers
-static TRIANGLEBAG layer_triangles[LAYER_COUNT];
+static TRIANGLEBAG layer_triangles[NB_LAYERS];
 static TRIANGLEBAG via_triangles[4];
-static double      layer_z[LAYER_COUNT];
+static double      layer_z[NB_LAYERS];
 
-static void bag_flat_triangle( int layer, //{{{
+static void bag_flat_triangle( LAYER_NUM layer, //{{{
                                double x1, double y1,
                                double x2, double y2,
                                double x3, double y3 )
@@ -146,7 +146,7 @@ static void bag_flat_triangle( int layer, //{{{
 }
 
 
-void FLAT_FAN::bag( int layer, bool close ) //{{{
+void FLAT_FAN::bag( LAYER_NUM layer, bool close ) //{{{
 {
     unsigned i;
 
@@ -158,7 +158,7 @@ void FLAT_FAN::bag( int layer, bool close ) //{{{
 }
 
 
-static void bag_flat_quad( int layer, //{{{
+static void bag_flat_quad( LAYER_NUM layer, //{{{
                            double x1, double y1,
                            double x2, double y2,
                            double x3, double y3,
@@ -169,7 +169,7 @@ static void bag_flat_quad( int layer, //{{{
 }
 
 
-void FLAT_RING::bag( int layer, bool close ) //{{{
+void FLAT_RING::bag( LAYER_NUM layer, bool close ) //{{{
 {
     unsigned i;
 
@@ -343,7 +343,7 @@ static void compute_layer_Zs( BOARD* pcb ) //{{{
     double half_thickness  = board_thickness / 2;
 
     // Compute each layer's Z value, more or less like the 3d view
-    for( int i = 0; i <= LAYER_N_FRONT; i++ )
+    for( LAYER_NUM i = FIRST_LAYER; i <= LAYER_N_FRONT; ++i )
     {
         if( i < copper_layers )
             layer_z[i] = board_thickness * i / (copper_layers - 1) - half_thickness;
@@ -370,7 +370,7 @@ static void compute_layer_Zs( BOARD* pcb ) //{{{
 }
 
 
-static void export_vrml_line( int layer, double startx, double starty, //{{{
+static void export_vrml_line( LAYER_NUM layer, double startx, double starty, //{{{
                               double endx, double endy, double width, int divisions )
 {
     double  r     = width / 2;
@@ -399,7 +399,7 @@ static void export_vrml_line( int layer, double startx, double starty, //{{{
 }
 
 
-static void export_vrml_circle( int layer, double startx, double starty,
+static void export_vrml_circle( LAYER_NUM layer, double startx, double starty, //{{{
                                 double endx, double endy, double width )
 {
     double   hole, radius;
@@ -419,7 +419,7 @@ static void export_vrml_circle( int layer, double startx, double starty,
 
 
 static void export_vrml_slot( TRIANGLEBAG& triangles, //{{{
-                              int top_layer, int bottom_layer, double xc, double yc,
+                              LAYER_NUM top_layer, LAYER_NUM bottom_layer, double xc, double yc,
                               double dx, double dy, int orient )
 {
     double capx, capy; // Cap center
@@ -478,7 +478,7 @@ static void export_vrml_hole( TRIANGLEBAG& triangles,
 }
 
 
-static void export_vrml_oval_pad( int layer, double xc, double yc,
+static void export_vrml_oval_pad( LAYER_NUM layer, double xc, double yc,
                                   double dx, double dy, int orient )
 {
     double  capx, capy; // Cap center
@@ -521,7 +521,7 @@ static void export_vrml_oval_pad( int layer, double xc, double yc,
 }
 
 
-static void export_vrml_arc( int layer, double centerx, double centery,
+static void export_vrml_arc( LAYER_NUM layer, double centerx, double centery,
                              double arc_startx, double arc_starty,
                              double width, double arc_angle )
 {
@@ -557,7 +557,7 @@ static void export_vrml_arc( int layer, double centerx, double centery,
 
 
 static void export_vrml_varc( TRIANGLEBAG& triangles,
-                              int top_layer, int bottom_layer,
+                              LAYER_NUM top_layer, LAYER_NUM bottom_layer,
                               double centerx, double centery,
                               double arc_startx, double arc_starty,
                               double arc_angle )
@@ -594,7 +594,7 @@ static void export_vrml_varc( TRIANGLEBAG& triangles,
 
 static void export_vrml_drawsegment( DRAWSEGMENT* drawseg ) //{{{
 {
-    int    layer = drawseg->GetLayer();
+    LAYER_NUM layer = drawseg->GetLayer();
     double w     = drawseg->GetWidth();
     double x     = drawseg->GetStart().x;
     double y     = drawseg->GetStart().y;
@@ -658,7 +658,7 @@ static void export_vrml_drawsegment( DRAWSEGMENT* drawseg ) //{{{
 /* C++ doesn't have closures and neither continuation forms... this is
  * for coupling the vrml_text_callback with the common parameters */
 
-static int s_text_layer;
+static LAYER_NUM s_text_layer;
 static int s_text_width;
 static void vrml_text_callback( int x0, int y0, int xf, int yf )
 {
@@ -735,13 +735,12 @@ static void export_vrml_drawings( BOARD* pcb ) //{{{
 }
 
 
-static void export_round_padstack( BOARD* pcb, double x, double y,
-                                   double r,
-                                   int bottom_layer, int top_layer )
+static void export_round_padstack( BOARD* pcb, double x, double y, double r, //{{{
+                                   LAYER_NUM bottom_layer, LAYER_NUM top_layer )
 {
     int copper_layers = pcb->GetCopperLayerCount( );
 
-    for( int layer = bottom_layer; layer < copper_layers; layer++ )
+    for( LAYER_NUM layer = bottom_layer; layer < copper_layers; ++layer )
     {
         // The last layer is always the component one, unless it's single face
         if( (layer > FIRST_COPPER_LAYER) && (layer == copper_layers - 1) )
@@ -756,7 +755,7 @@ static void export_round_padstack( BOARD* pcb, double x, double y,
 static void export_vrml_via( BOARD* pcb, SEGVIA* via ) //{{{
 {
     double x, y, r, hole;
-    int    top_layer, bottom_layer;
+    LAYER_NUM top_layer, bottom_layer;
 
     r    = via->GetWidth() / 2;
     hole = via->GetDrillValue() / 2;
@@ -813,7 +812,7 @@ static void export_vrml_zones( BOARD* pcb )
         if( width > 0 )
         {
             int      imax  = zone->m_FilledPolysList.size() - 1;
-            int      layer = zone->GetLayer();
+            LAYER_NUM layer = zone->GetLayer();
             CPolyPt* firstcorner = &zone->m_FilledPolysList[0];
             CPolyPt* begincorner = firstcorner;
 
@@ -866,7 +865,7 @@ static void export_vrml_text_module( TEXTE_MODULE* module ) //{{{
 
 static void export_vrml_edge_module( EDGE_MODULE* aOutline ) //{{{
 {
-    int    layer = aOutline->GetLayer();
+    LAYER_NUM layer = aOutline->GetLayer();
     double x     = aOutline->GetStart().x;
     double y     = aOutline->GetStart().y;
     double xf    = aOutline->GetEnd().x;
@@ -933,7 +932,7 @@ static void export_vrml_pad( BOARD* pcb, D_PAD* aPad ) //{{{
     double      pad_w     = aPad->GetSize().x / 2;
     double      pad_h     = aPad->GetSize().y / 2;
 
-    for( int layer = FIRST_COPPER_LAYER; layer < copper_layers; layer++ )
+    for( LAYER_NUM layer = FIRST_COPPER_LAYER; layer < copper_layers; ++layer )
     {
         // The last layer is always the component one, unless it's single face
         if( (layer > FIRST_COPPER_LAYER) && (layer == copper_layers - 1) )
@@ -1267,7 +1266,7 @@ bool PCB_EDIT_FRAME::ExportVRML_File( const wxString & aFullFileName,
 
     /* Output the bagged triangles for each layer
      * Each layer will be a separate shape */
-    for( int layer = 0; layer < LAYER_COUNT; layer++ )
+    for( LAYER_NUM layer = FIRST_LAYER; layer < NB_LAYERS; ++layer )
         write_and_empty_triangle_bag( output_file,
                                       layer_triangles[layer],
                                       pcb->GetLayerColor(layer),
diff --git a/pcbnew/gen_drill_report_files.cpp b/pcbnew/gen_drill_report_files.cpp
index ce0d15e015..462cf2a60f 100644
--- a/pcbnew/gen_drill_report_files.cpp
+++ b/pcbnew/gen_drill_report_files.cpp
@@ -336,8 +336,8 @@ bool EXCELLON_WRITER::GenDrillReportFile( const wxString& aFullFileName )
 {
     unsigned    totalHoleCount;
     char        line[1024];
-    int         layer1  = LAYER_N_BACK;
-    int         layer2  = LAYER_N_FRONT;
+    LAYER_NUM   layer1 = LAYER_N_BACK;
+    LAYER_NUM   layer2 = LAYER_N_FRONT;
     bool        gen_through_holes   = true;
     bool        gen_NPTH_holes      = false;
 
@@ -443,7 +443,7 @@ bool EXCELLON_WRITER::GenDrillReportFile( const wxString& aFullFileName )
                     continue;
                 }
 
-                layer1++; layer2++;           // use next layer pair
+                ++layer1; ++layer2;           // use next layer pair
 
                 if( layer2 == m_pcb->GetCopperLayerCount() - 1 )
                     layer2 = LAYER_N_FRONT; // the last layer is always the
diff --git a/pcbnew/gen_modules_placefile.cpp b/pcbnew/gen_modules_placefile.cpp
index f6cbbe1afa..eaf18bb680 100644
--- a/pcbnew/gen_modules_placefile.cpp
+++ b/pcbnew/gen_modules_placefile.cpp
@@ -57,7 +57,7 @@ public:
     MODULE*       m_Module;         // Link to the actual footprint
     const wxChar* m_Reference;      // Its schematic reference
     const wxChar* m_Value;          // Its schematic value
-    int           m_Layer;          // its side (LAYER_N_BACK, or LAYER_N_FRONT)
+    LAYER_NUM     m_Layer;          // its side (LAYER_N_BACK, or LAYER_N_FRONT)
 };
 
 
@@ -486,7 +486,7 @@ int PCB_EDIT_FRAME::DoGenFootprintsPositionFile( const wxString& aFullFileName,
                  -module_pos.y * conv_unit,
                  double(list[ii].m_Module->GetOrientation()) / 10 );
 
-        int layer = list[ii].m_Module->GetLayer();
+        LAYER_NUM layer = list[ii].m_Module->GetLayer();
 
         wxASSERT( layer==LAYER_N_FRONT || layer==LAYER_N_BACK );
 
diff --git a/pcbnew/gendrill_Excellon_writer.h b/pcbnew/gendrill_Excellon_writer.h
index 0e1318a39c..0803066f44 100644
--- a/pcbnew/gendrill_Excellon_writer.h
+++ b/pcbnew/gendrill_Excellon_writer.h
@@ -70,8 +70,8 @@ public:
     int m_Hole_Orient;              // Hole rotation (= pad rotation) for oblong holes
     int m_Hole_Shape;               // hole shape: round (0) or oval (1)
     wxPoint m_Hole_Pos;             // hole position
-    int m_Hole_Bottom_Layer;        // hole starting layer (usually back layer)
-    int m_Hole_Top_Layer;           // hole ending layer (usually front layer):
+    LAYER_NUM m_Hole_Bottom_Layer;  // hole starting layer (usually back layer)
+    LAYER_NUM m_Hole_Top_Layer;     // hole ending layer (usually front layer):
                                     // m_Hole_First_Layer < m_Hole_Last_Layer
     bool m_Hole_NotPlated;          // hole not plated. Must be in a specific drill file
 public:
diff --git a/pcbnew/hotkeys_board_editor.cpp b/pcbnew/hotkeys_board_editor.cpp
index 2593994d4f..f1ef2fa000 100644
--- a/pcbnew/hotkeys_board_editor.cpp
+++ b/pcbnew/hotkeys_board_editor.cpp
@@ -129,7 +129,7 @@ void PCB_EDIT_FRAME::OnHotKey( wxDC* aDC, int aHotkeyCode, const wxPoint& aPosit
     wxCommandEvent cmd( wxEVT_COMMAND_MENU_SELECTED );
     cmd.SetEventObject( this );
 
-    int            ll;
+    LAYER_NUM      ll;
     unsigned int   cnt;
 
     switch( hk_id )
@@ -249,9 +249,9 @@ void PCB_EDIT_FRAME::OnHotKey( wxDC* aDC, int aHotkeyCode, const wxPoint& aPosit
         if( GetBoard()->GetCopperLayerCount() < 2 ) // Single layer
             ll = LAYER_N_BACK;
         else if( ll == LAYER_N_FRONT )
-            ll = std::max( LAYER_N_BACK, GetBoard()->GetCopperLayerCount() - 2 );
+            ll = std::max( LAYER_N_BACK, FIRST_COPPER_LAYER + GetBoard()->GetCopperLayerCount() - 2 );
         else
-            ll--;
+            --ll;
 
         SwitchLayer( aDC, ll );
         break;
@@ -267,7 +267,7 @@ void PCB_EDIT_FRAME::OnHotKey( wxDC* aDC, int aHotkeyCode, const wxPoint& aPosit
         else if( ll >= GetBoard()->GetCopperLayerCount() - 2 )
             ll = LAYER_N_FRONT;
         else
-            ll++;
+            ++ll;
 
         SwitchLayer( aDC, ll );
         break;
@@ -585,7 +585,7 @@ bool PCB_EDIT_FRAME::OnHotkeyDeleteItem( wxDC* aDC )
         if( ItemFree )
         {
             wxPoint pos = GetScreen()->RefPos( false );
-            MODULE* module = GetBoard()->GetFootprint( pos, ALL_LAYERS, false );
+            MODULE* module = GetBoard()->GetFootprint( pos, UNDEFINED_LAYER, false );
 
             if( module == NULL )
                 return false;
diff --git a/pcbnew/kicad_plugin.cpp b/pcbnew/kicad_plugin.cpp
index a047e644fa..d9c5ee4c49 100644
--- a/pcbnew/kicad_plugin.cpp
+++ b/pcbnew/kicad_plugin.cpp
@@ -383,7 +383,7 @@ void PCB_IO::formatLayer( const BOARD_ITEM* aItem ) const
 {
     if( m_ctl & CTL_STD_LAYER_NAMES )
     {
-        int layer = aItem->GetLayer();
+        LAYER_NUM layer = aItem->GetLayer();
 
         // English layer names should never need quoting.
         m_out->Print( 0, " (layer %s)", TO_UTF8( BOARD::GetStandardLayerName( layer ) ) );
@@ -425,7 +425,7 @@ void PCB_IO::format( BOARD* aBoard, int aNestLevel ) const
     m_out->Print( aNestLevel, "(layers\n" );
 
     unsigned mask = LAYER_FRONT;
-    int layer = LAYER_N_FRONT;
+    LAYER_NUM layer = LAYER_N_FRONT;
 
     // Save only the used copper layers from front to back.
     while( mask != 0 )
@@ -443,14 +443,14 @@ void PCB_IO::format( BOARD* aBoard, int aNestLevel ) const
         }
 
         mask >>= 1;
-        layer--;
+        --layer;
     }
 
     mask = ADHESIVE_LAYER_BACK;
     layer = ADHESIVE_N_BACK;
 
     // Save used non-copper layers in the order they are defined.
-    while( layer < LAYER_COUNT )
+    while( layer < NB_LAYERS )
     {
         if( mask & aBoard->GetEnabledLayers() )
         {
@@ -464,7 +464,7 @@ void PCB_IO::format( BOARD* aBoard, int aNestLevel ) const
         }
 
         mask <<= 1;
-        layer++;
+        ++layer;
     }
 
     m_out->Print( aNestLevel, ")\n\n" );
@@ -1036,7 +1036,7 @@ void PCB_IO::formatLayers( LAYER_MSK aLayerMask, int aNestLevel ) const
 
     wxString layerName;
 
-    for( int layer = 0;  layerMask;  ++layer, layerMask >>= 1 )
+    for( LAYER_NUM layer = FIRST_LAYER; layerMask; ++layer, layerMask >>= 1 )
     {
         if( layerMask & 1 )
         {
@@ -1236,7 +1236,7 @@ void PCB_IO::format( TRACK* aTrack, int aNestLevel ) const
 {
     if( aTrack->Type() == PCB_VIA_T )
     {
-        int layer1, layer2;
+        LAYER_NUM layer1, layer2;
 
         SEGVIA* via = (SEGVIA*) aTrack;
         BOARD* board = (BOARD*) via->GetParent();
diff --git a/pcbnew/layer_widget.cpp b/pcbnew/layer_widget.cpp
index 63f372ae15..3d028f2ead 100644
--- a/pcbnew/layer_widget.cpp
+++ b/pcbnew/layer_widget.cpp
@@ -223,7 +223,7 @@ wxBitmapButton* LAYER_WIDGET::makeColorButton( wxWindow* aParent, EDA_COLOR_T aC
 void LAYER_WIDGET::OnLeftDownLayers( wxMouseEvent& event )
 {
     int row;
-    int layer;
+    LAYER_NUM layer;
 
     wxWindow* eventSource = (wxWindow*) event.GetEventObject();
 
@@ -284,7 +284,7 @@ void LAYER_WIDGET::OnMiddleDownLayerColor( wxMouseEvent& event )
         wxBitmap bm = makeBitmap( newColor );
         eventSource->SetBitmapLabel( bm );
 
-        int layer = getDecodedId( eventSource->GetId() );
+        LAYER_NUM layer = getDecodedId( eventSource->GetId() );
 
         // tell the client code.
         OnLayerColorChange( layer, newColor );
@@ -297,7 +297,7 @@ void LAYER_WIDGET::OnMiddleDownLayerColor( wxMouseEvent& event )
 void LAYER_WIDGET::OnLayerCheckBox( wxCommandEvent& event )
 {
     wxCheckBox* eventSource = (wxCheckBox*) event.GetEventObject();
-    int layer = getDecodedId( eventSource->GetId() );
+    LAYER_NUM layer = getDecodedId( eventSource->GetId() );
     OnLayerVisible( layer, eventSource->IsChecked() );
     passOnFocus();
 }
@@ -348,14 +348,14 @@ void LAYER_WIDGET::OnTabChange( wxNotebookEvent& event )
 
 wxWindow* LAYER_WIDGET::getLayerComp( int aRow, int aColumn ) const
 {
-    int ndx = aRow * LYR_COLUMN_COUNT + aColumn;
-    if( (unsigned) ndx < m_LayersFlexGridSizer->GetChildren().GetCount() )
+    unsigned ndx = aRow * LYR_COLUMN_COUNT + aColumn;
+    if( ndx < m_LayersFlexGridSizer->GetChildren().GetCount() )
         return m_LayersFlexGridSizer->GetChildren()[ndx]->GetWindow();
     return NULL;
 }
 
 
-int LAYER_WIDGET::findLayerRow( int aLayer ) const
+int LAYER_WIDGET::findLayerRow( LAYER_NUM aLayer ) const
 {
     int count = GetLayerRowCount();
     for( int row=0;  row<count;  ++row )
@@ -739,24 +739,24 @@ void LAYER_WIDGET::SelectLayerRow( int aRow )
 }
 
 
-void LAYER_WIDGET::SelectLayer( int aLayer )
+void LAYER_WIDGET::SelectLayer( LAYER_NUM aLayer )
 {
     int row = findLayerRow( aLayer );
     SelectLayerRow( row );
 }
 
 
-int LAYER_WIDGET::GetSelectedLayer()
+LAYER_NUM LAYER_WIDGET::GetSelectedLayer()
 {
     wxWindow* w = getLayerComp( m_CurrentRow, 0 );
     if( w )
         return getDecodedId( w->GetId() );
 
-    return -1;
+    return UNDEFINED_LAYER;
 }
 
 
-void LAYER_WIDGET::SetLayerVisible( int aLayer, bool isVisible )
+void LAYER_WIDGET::SetLayerVisible( LAYER_NUM aLayer, bool isVisible )
 {
     int row = findLayerRow( aLayer );
     if( row >= 0 )
@@ -768,7 +768,7 @@ void LAYER_WIDGET::SetLayerVisible( int aLayer, bool isVisible )
 }
 
 
-bool LAYER_WIDGET::IsLayerVisible( int aLayer )
+bool LAYER_WIDGET::IsLayerVisible( LAYER_NUM aLayer )
 {
     int row = findLayerRow( aLayer );
     if( row >= 0 )
@@ -781,7 +781,7 @@ bool LAYER_WIDGET::IsLayerVisible( int aLayer )
 }
 
 
-void LAYER_WIDGET::SetLayerColor( int aLayer, EDA_COLOR_T aColor )
+void LAYER_WIDGET::SetLayerColor( LAYER_NUM aLayer, EDA_COLOR_T aColor )
 {
     int row = findLayerRow( aLayer );
     if( row >= 0 )
@@ -798,7 +798,7 @@ void LAYER_WIDGET::SetLayerColor( int aLayer, EDA_COLOR_T aColor )
 }
 
 
-EDA_COLOR_T LAYER_WIDGET::GetLayerColor( int aLayer ) const
+EDA_COLOR_T LAYER_WIDGET::GetLayerColor( LAYER_NUM aLayer ) const
 {
     int row = findLayerRow( aLayer );
     if( row >= 0 )
@@ -875,7 +875,7 @@ class MYFRAME : public wxFrame
         {
         }
 
-        void OnLayerColorChange( int aLayer, EDA_COLOR_T aColor )
+        void OnLayerColorChange( LAYER aLayer, EDA_COLOR_T aColor )
         {
             printf( "OnLayerColorChange( aLayer:%d, aColor:%d )\n", aLayer, aColor );
 
@@ -888,13 +888,13 @@ class MYFRAME : public wxFrame
             */
         }
 
-        bool OnLayerSelect( int aLayer )
+        bool OnLayerSelect( LAYER aLayer )
         {
             printf( "OnLayerSelect( aLayer:%d )\n", aLayer );
             return true;
         }
 
-        void OnLayerVisible( int aLayer, bool isVisible, bool isFinal )
+        void OnLayerVisible( LAYER aLayer, bool isVisible, bool isFinal )
         {
             printf( "OnLayerVisible( aLayer:%d, isVisible:%d isFinal:%d)\n", aLayer, isVisible, isFinal );
         }
diff --git a/pcbnew/layer_widget.h b/pcbnew/layer_widget.h
index a39fe8644b..a74a9e186b 100644
--- a/pcbnew/layer_widget.h
+++ b/pcbnew/layer_widget.h
@@ -181,7 +181,7 @@ protected:
      * Function findLayerRow
      * returns the row index that \a aLayer resides in, or -1 if not found.
      */
-    int findLayerRow( int aLayer ) const;
+    int findLayerRow( LAYER_NUM aLayer ) const;
     int findRenderRow( int aId ) const;
 
     /**
@@ -296,37 +296,37 @@ public:
      * Function SelectLayer
      * changes the row selection in the layer list to \a aLayer provided.
      */
-    void SelectLayer( int aLayer );
+    void SelectLayer( LAYER_NUM aLayer );
 
     /**
      * Function GetSelectedLayer
      * returns the selected layer or -1 if none.
      */
-    int GetSelectedLayer();
+    LAYER_NUM GetSelectedLayer();
 
     /**
      * Function SetLayerVisible
      * sets \a aLayer visible or not.  This does not invoke OnLayerVisible().
      */
-    void SetLayerVisible( int aLayer, bool isVisible );
+    void SetLayerVisible( LAYER_NUM aLayer, bool isVisible );
 
     /**
      * Function IsLayerVisible
      * returns the visible state of the layer ROW associated with \a aLayer id.
      */
-    bool IsLayerVisible( int aLayer );
+    bool IsLayerVisible( LAYER_NUM aLayer );
 
     /**
      * Function SetLayerColor
      * changes the color of \a aLayer
      */
-    void SetLayerColor( int aLayer, EDA_COLOR_T aColor );
+    void SetLayerColor( LAYER_NUM aLayer, EDA_COLOR_T aColor );
 
     /**
      * Function GetLayerColor
      * returns the color of the layer ROW associated with \a aLayer id.
      */
-    EDA_COLOR_T GetLayerColor( int aLayer ) const;
+    EDA_COLOR_T GetLayerColor( LAYER_NUM aLayer ) const;
 
     /**
      * Function SetRenderState
@@ -374,7 +374,7 @@ public:
      * @param aLayer is the board layer to change
      * @param aColor is the new color
      */
-    virtual void OnLayerColorChange( int aLayer, EDA_COLOR_T aColor ) = 0;
+    virtual void OnLayerColorChange( LAYER_NUM aLayer, EDA_COLOR_T aColor ) = 0;
 
     /**
      * Function OnLayerSelect
@@ -383,7 +383,7 @@ public:
      * the change by returning false.
      * @param aLayer is the board layer to select
      */
-    virtual bool OnLayerSelect( int aLayer ) = 0;
+    virtual bool OnLayerSelect( LAYER_NUM aLayer ) = 0;
 
     /**
      * Function OnLayerVisible
@@ -395,7 +395,7 @@ public:
      *  such calls, and can be used to decide when to update the screen only
      *  one time instead of several times in the midst of a multiple layer change.
      */
-    virtual void OnLayerVisible( int aLayer, bool isVisible, bool isFinal = true ) = 0;
+    virtual void OnLayerVisible( LAYER_NUM aLayer, bool isVisible, bool isFinal = true ) = 0;
 
     /**
      * Function OnRenderColorChange
diff --git a/pcbnew/legacy_plugin.cpp b/pcbnew/legacy_plugin.cpp
index 3a945691a3..29669bec82 100644
--- a/pcbnew/legacy_plugin.cpp
+++ b/pcbnew/legacy_plugin.cpp
@@ -208,6 +208,14 @@ static inline int intParse( const char* next, const char** out = NULL )
     return (int) strtol( next, (char**) out, 10 );
 }
 
+/**
+ * Function layerParse
+ * Like intParse but returns a LAYER_NUM
+ */
+static inline LAYER_NUM layerParse( const char* next, const char** out = NULL )
+{
+    return intParse( next, out );
+}
 
 /**
  * Function hexParse
@@ -429,7 +437,9 @@ void LEGACY_PLUGIN::loadGENERAL()
             int layer_mask  = hexParse( line + SZ( "Ly" ) );
             int layer_count = 0;
 
-            for( int ii = 0;  ii < NB_COPPER_LAYERS && layer_mask;  ++ii, layer_mask >>= 1 )
+            for( LAYER_NUM ii = FIRST_COPPER_LAYER;
+                 ii < NB_COPPER_LAYERS && layer_mask;
+                 ++ii, layer_mask >>= 1 )
             {
                 if( layer_mask & 1 )
                     layer_count++;
@@ -657,7 +667,7 @@ void LEGACY_PLUGIN::loadSETUP()
         {
             // eg: "Layer[n]  <a_Layer_name_with_no_spaces> <LAYER_T>"
 
-            int   layer = intParse( line + SZ( "Layer[" ), &data );
+            LAYER_NUM layer = layerParse( line + SZ( "Layer[" ), &data );
 
             data = strtok( (char*) data+1, delims );    // +1 for ']'
             if( data )
@@ -970,7 +980,7 @@ MODULE* LEGACY_PLUGIN::LoadMODULE()
             BIU pos_x  = biuParse( line + SZ( "Po" ), &data );
             BIU pos_y  = biuParse( data, &data );
             int orient = intParse( data, &data );
-            int layer  = intParse( data, &data );
+            LAYER_NUM layer = layerParse( data, &data );
 
             long edittime  = hexParse( data, &data );
             time_t timestamp = hexParse( data, &data );
@@ -1377,7 +1387,7 @@ void LEGACY_PLUGIN::loadMODULE_EDGE( MODULE* aModule )
 
     // common to all cases, and we have to check their values uniformly at end
     BIU     width = 1;
-    int     layer = FIRST_NON_COPPER_LAYER;
+    LAYER_NUM layer = FIRST_NON_COPPER_LAYER;
 
     switch( shape )
     {
@@ -1391,7 +1401,7 @@ void LEGACY_PLUGIN::loadMODULE_EDGE( MODULE* aModule )
             double  angle    = degParse( data, &data );
 
             width   = biuParse( data, &data );
-            layer   = intParse( data );
+            layer   = layerParse( data );
 
             dwg->SetAngle( angle );
             dwg->m_Start0 = wxPoint( start0_x, start0_y );
@@ -1411,7 +1421,7 @@ void LEGACY_PLUGIN::loadMODULE_EDGE( MODULE* aModule )
             BIU     end0_y   = biuParse( data, &data );
 
             width   = biuParse( data, &data );
-            layer   = intParse( data );
+            layer   = layerParse( data );
 
             dwg->m_Start0 = wxPoint( start0_x, start0_y );
             dwg->m_End0   = wxPoint( end0_x, end0_y );
@@ -1430,7 +1440,7 @@ void LEGACY_PLUGIN::loadMODULE_EDGE( MODULE* aModule )
             int ptCount  = intParse( data, &data );
 
             width   = biuParse( data, &data );
-            layer   = intParse( data );
+            layer   = layerParse( data );
 
             dwg->m_Start0 = wxPoint( start0_x, start0_y );
             dwg->m_End0   = wxPoint( end0_x, end0_y );
@@ -1481,7 +1491,7 @@ void LEGACY_PLUGIN::loadMODULE_EDGE( MODULE* aModule )
     // can use the copper layers m_Layer < FIRST_NON_COPPER_LAYER is allowed.
     // @todo: changes use of EDGE_MODULE these footprints and allows only
     // m_Layer >= FIRST_NON_COPPER_LAYER
-    if( layer < 0 || layer > LAST_NON_COPPER_LAYER )
+    if( layer < FIRST_LAYER || layer > LAST_NON_COPPER_LAYER )
         layer = SILKSCREEN_N_FRONT;
 
     dwg->SetWidth( width );
@@ -1543,7 +1553,7 @@ void LEGACY_PLUGIN::loadMODULE_TEXT( TEXTE_MODULE* aText )
     char*   mirror  = strtok( (char*) data, delims );
     char*   hide    = strtok( NULL, delims );
     char*   tmp     = strtok( NULL, delims );
-    int     layer   = tmp ? intParse( tmp ) : SILKSCREEN_N_FRONT;
+    LAYER_NUM layer = tmp ? layerParse( tmp ) : SILKSCREEN_N_FRONT;
     char*   italic  = strtok( NULL, delims );
 
     char*   hjust   = strtok( (char*) txt_end, delims );
@@ -1584,10 +1594,10 @@ void LEGACY_PLUGIN::loadMODULE_TEXT( TEXTE_MODULE* aText )
     if( vjust )
         aText->SetVertJustify( vertJustify( vjust ) );
 
-    if( layer < 0 )
-        layer = 0;
-    else if( layer > LAST_NO_COPPER_LAYER )
-        layer = LAST_NO_COPPER_LAYER;
+    if( layer < FIRST_LAYER )
+        layer = FIRST_LAYER;
+    else if( layer > LAST_NON_COPPER_LAYER )
+        layer = LAST_NON_COPPER_LAYER;
     else if( layer == LAYER_N_BACK )
         layer = SILKSCREEN_N_BACK;
     else if( layer == LAYER_N_FRONT )
@@ -1701,14 +1711,14 @@ void LEGACY_PLUGIN::loadPCB_LINE()
                 switch( i )
                 {
                 case 0:
-                    int layer;
-                    layer = intParse( data );
+                    LAYER_NUM layer;
+                    layer = layerParse( data );
 
-                    if( layer < FIRST_NO_COPPER_LAYER )
-                        layer = FIRST_NO_COPPER_LAYER;
+                    if( layer < FIRST_NON_COPPER_LAYER )
+                        layer = FIRST_NON_COPPER_LAYER;
 
-                    else if( layer > LAST_NO_COPPER_LAYER )
-                        layer = LAST_NO_COPPER_LAYER;
+                    else if( layer > LAST_NON_COPPER_LAYER )
+                        layer = LAST_NON_COPPER_LAYER;
 
                     dseg->SetLayer( layer );
                     break;
@@ -1893,7 +1903,7 @@ void LEGACY_PLUGIN::loadPCB_TEXT()
             // e.g. "De 21 1 0 Normal C\r\n"
             // sscanf( line + 2, " %d %d %lX %s %c\n", &m_Layer, &normal_display, &m_TimeStamp, style, &hJustify );
 
-            int     layer       = intParse( line + SZ( "De" ), &data );
+            LAYER_NUM layer     = layerParse( line + SZ( "De" ), &data );
             int     notMirrored = intParse( data, &data );
             time_t  timestamp   = hexParse( data, &data );
             char*   style       = strtok( (char*) data, delims );
@@ -1917,8 +1927,8 @@ void LEGACY_PLUGIN::loadPCB_TEXT()
 
             if( layer < FIRST_COPPER_LAYER )
                 layer = FIRST_COPPER_LAYER;
-            else if( layer > LAST_NO_COPPER_LAYER )
-                layer = LAST_NO_COPPER_LAYER;
+            else if( layer > LAST_NON_COPPER_LAYER )
+                layer = LAST_NON_COPPER_LAYER;
 
             pcbtxt->SetLayer( layer );
         }
@@ -2200,7 +2210,7 @@ void LEGACY_PLUGIN::loadZONE_CONTAINER()
 
         else if( TESTLINE( "ZLayer" ) )     // layer found
         {
-            int layer = intParse( line + SZ( "ZLayer" ) );
+            LAYER_NUM layer = layerParse( line + SZ( "ZLayer" ) );
             zc->SetLayer( layer );
         }
 
@@ -2435,17 +2445,18 @@ void LEGACY_PLUGIN::loadDIMENSION()
 
         else if( TESTLINE( "Ge" ) )
         {
-            int     layer;
+            LAYER_NUM layer;
             time_t  timestamp;
             int     shape;
+            int     ilayer;
 
-            sscanf( line + SZ( "Ge" ), " %d %d %lX", &shape, &layer, &timestamp );
+            sscanf( line + SZ( "Ge" ), " %d %d %lX", &shape, &ilayer, &timestamp );
 
-            if( layer < FIRST_NO_COPPER_LAYER )
-                layer = FIRST_NO_COPPER_LAYER;
-
-            else if( layer > LAST_NO_COPPER_LAYER )
-                layer = LAST_NO_COPPER_LAYER;
+            if( ilayer < FIRST_NON_COPPER_LAYER )
+                layer = FIRST_NON_COPPER_LAYER;
+            else if( ilayer > LAST_NON_COPPER_LAYER )
+                layer = LAST_NON_COPPER_LAYER;
+            else layer = ilayer;
 
             dim->SetLayer( layer );
             dim->SetTimeStamp( timestamp );
@@ -2625,18 +2636,18 @@ void LEGACY_PLUGIN::loadPCB_TARGET()
             // sscanf( Line + 2, " %X %d %d %d %d %d %lX", &m_Shape, &m_Layer, &m_Pos.x, &m_Pos.y, &m_Size, &m_Width, &m_TimeStamp );
 
             int shape = intParse( line + SZ( "Po" ), &data );
-            int layer = intParse( data, &data );
+            LAYER_NUM layer = layerParse( data, &data );
             BIU pos_x = biuParse( data, &data );
             BIU pos_y = biuParse( data, &data );
             BIU size  = biuParse( data, &data );
             BIU width = biuParse( data, &data );
             time_t timestamp = hexParse( data );
 
-            if( layer < FIRST_NO_COPPER_LAYER )
-                layer = FIRST_NO_COPPER_LAYER;
+            if( layer < FIRST_NON_COPPER_LAYER )
+                layer = FIRST_NON_COPPER_LAYER;
 
-            else if( layer > LAST_NO_COPPER_LAYER )
-                layer = LAST_NO_COPPER_LAYER;
+            else if( layer > LAST_NON_COPPER_LAYER )
+                layer = LAST_NON_COPPER_LAYER;
 
             PCB_TARGET* t = new PCB_TARGET( m_board, shape, layer, wxPoint( pos_x, pos_y ), size, width );
             m_board->Add( t, ADD_APPEND );
@@ -2973,7 +2984,7 @@ void LEGACY_PLUGIN::saveSETUP( const BOARD* aBoard ) const
 
     unsigned layerMask = ALL_CU_LAYERS & aBoard->GetEnabledLayers();
 
-    for( int layer = 0;  layerMask;  ++layer, layerMask >>= 1 )
+    for( LAYER_NUM layer = FIRST_LAYER; layerMask; ++layer, layerMask >>= 1 )
     {
         if( layerMask & 1 )
         {
diff --git a/pcbnew/magnetic_tracks_functions.cpp b/pcbnew/magnetic_tracks_functions.cpp
index 4edb3d416c..87ad7bff83 100644
--- a/pcbnew/magnetic_tracks_functions.cpp
+++ b/pcbnew/magnetic_tracks_functions.cpp
@@ -173,7 +173,7 @@ bool Magnetize( PCB_EDIT_FRAME* frame, int aCurrentTool, wxSize aGridSize,
     // after pads, only track & via tests remain, skip them if not desired
     if( doTrack )
     {
-        int layer = screen->m_Active_Layer;
+        LAYER_NUM layer = screen->m_Active_Layer;
 
         for( TRACK* via = m_Pcb->m_Track;
              via && (via = via->GetVia( *curpos, layer )) != NULL;
diff --git a/pcbnew/pcad2kicadpcb_plugin/pcb.cpp b/pcbnew/pcad2kicadpcb_plugin/pcb.cpp
index 393ab9da63..39a65ebf33 100644
--- a/pcbnew/pcad2kicadpcb_plugin/pcb.cpp
+++ b/pcbnew/pcad2kicadpcb_plugin/pcb.cpp
@@ -48,7 +48,7 @@
 
 namespace PCAD2KICAD {
 
-int PCB::GetKiCadLayer( int aPCadLayer )
+LAYER_NUM PCB::GetKiCadLayer( int aPCadLayer )
 {
     wxASSERT( aPCadLayer >= 0 && aPCadLayer < MAX_PCAD_LAYER_QTY );
     return m_layersMap[aPCadLayer].KiCadLayer;
@@ -447,9 +447,7 @@ void PCB::ConnectPinToNet( wxString aCompRef, wxString aPinRef, wxString aNetNam
 
 int PCB::FindLayer( wxString aLayerName )
 {
-    int i;
-
-    for ( i = 0; i < (int) m_layersStackup.GetCount(); i++ )
+    for ( LAYER_NUM i = FIRST_COPPER_LAYER; i < (int)m_layersStackup.GetCount(); ++i )
     {
         if( m_layersStackup[i] == aLayerName )
             return i;
@@ -479,7 +477,7 @@ int PCB::FindLayer( wxString aLayerName )
 void PCB::MapLayer( XNODE* aNode )
 {
     wxString    lName, layerType;
-    int         KiCadLayer;
+    LAYER_NUM   KiCadLayer;
     long        num = 0;
 
     aNode->GetAttribute( wxT( "Name" ), &lName );
@@ -509,12 +507,12 @@ void PCB::MapLayer( XNODE* aNode )
         KiCadLayer = EDGE_N;
     else
     {
-        KiCadLayer = FindLayer( lName );
+        int layernum = FindLayer( lName );
 
-        if( KiCadLayer == -1 )
+        if( layernum == -1 )
             KiCadLayer = DRAW_N;    // default
         else
-            KiCadLayer = FIRST_COPPER_LAYER + m_layersStackup.GetCount() - 1 - KiCadLayer;
+            KiCadLayer = FIRST_COPPER_LAYER + m_layersStackup.GetCount() - 1 - layernum;
     }
 
     if( FindNode( aNode, wxT( "layerNum" ) ) )
diff --git a/pcbnew/pcad2kicadpcb_plugin/pcb.h b/pcbnew/pcad2kicadpcb_plugin/pcb.h
index 91b76cd6c4..baedea0e55 100644
--- a/pcbnew/pcad2kicadpcb_plugin/pcb.h
+++ b/pcbnew/pcad2kicadpcb_plugin/pcb.h
@@ -53,7 +53,7 @@ public:
     PCB( BOARD* aBoard );
     ~PCB();
 
-    int             GetKiCadLayer( int aPCadLayer );
+    LAYER_NUM       GetKiCadLayer( int aPCadLayer );
     LAYER_TYPE_T    GetLayerType( int aPCadLayer );
     wxString        GetLayerNetNameRef( int aPCadLayer );
     int             GetNewTimestamp();
diff --git a/pcbnew/pcad2kicadpcb_plugin/pcb_callbacks.h b/pcbnew/pcad2kicadpcb_plugin/pcb_callbacks.h
index 05b4837ee5..a12dc70343 100644
--- a/pcbnew/pcad2kicadpcb_plugin/pcb_callbacks.h
+++ b/pcbnew/pcad2kicadpcb_plugin/pcb_callbacks.h
@@ -42,7 +42,7 @@ enum LAYER_TYPE_T
 
 typedef struct _TLAYER
 {
-    int           KiCadLayer;
+    LAYER_NUM     KiCadLayer;
     LAYER_TYPE_T  layerType;
     wxString      netNameRef;
 } TLAYER;
@@ -53,7 +53,7 @@ namespace PCAD2KICAD
     class PCB_CALLBACKS
     {
     public:
-        virtual int           GetKiCadLayer( int aPCadLayer ) = 0;
+        virtual LAYER_NUM     GetKiCadLayer( int aPCadLayer ) = 0;
         virtual LAYER_TYPE_T  GetLayerType( int aPCadLayer ) = 0;
         virtual wxString      GetLayerNetNameRef( int aPCadLayer ) = 0;
         virtual int           GetNewTimestamp() = 0;
diff --git a/pcbnew/pcad2kicadpcb_plugin/pcb_component.cpp b/pcbnew/pcad2kicadpcb_plugin/pcb_component.cpp
index 2e59042f43..0bcb43984b 100644
--- a/pcbnew/pcad2kicadpcb_plugin/pcb_component.cpp
+++ b/pcbnew/pcad2kicadpcb_plugin/pcb_component.cpp
@@ -43,7 +43,7 @@ PCB_COMPONENT::PCB_COMPONENT( PCB_CALLBACKS*    aCallbacks,
     m_tag       = 0;
     m_objType   = wxT( '?' );
     m_PCadLayer     = 0;
-    m_KiCadLayer    = 0;
+    m_KiCadLayer    = NO_LAYER;
     m_timestamp     = 0;
     m_positionX     = 0;
     m_positionY     = 0;
@@ -77,9 +77,9 @@ void PCB_COMPONENT::Flip()
     m_positionX = -m_positionX;
 }
 
-int PCB_COMPONENT::FlipLayers( int aLayer )
+LAYER_NUM PCB_COMPONENT::FlipLayers( LAYER_NUM aLayer )
 {
-    int result = aLayer;    // dafault is no swap
+    LAYER_NUM result = aLayer;    // dafault is no swap
 
     // routed layers
     if( aLayer == LAYER_N_BACK )
diff --git a/pcbnew/pcad2kicadpcb_plugin/pcb_component.h b/pcbnew/pcad2kicadpcb_plugin/pcb_component.h
index a89deb9062..48700318d0 100644
--- a/pcbnew/pcad2kicadpcb_plugin/pcb_component.h
+++ b/pcbnew/pcad2kicadpcb_plugin/pcb_component.h
@@ -51,7 +51,7 @@ public:
     int         m_tag;
     char        m_objType;
     int         m_PCadLayer;
-    int         m_KiCadLayer;
+    LAYER_NUM   m_KiCadLayer;
     int         m_timestamp;
     int         m_positionX;
     int         m_positionY;
@@ -70,7 +70,7 @@ public:
     virtual void    AddToModule( MODULE* aModule );
     virtual void    AddToBoard() = 0;
 
-    int GetKiCadLayer() { return m_callbacks->GetKiCadLayer( m_PCadLayer ); }
+    LAYER_NUM GetKiCadLayer() { return m_callbacks->GetKiCadLayer( m_PCadLayer ); }
     int GetNewTimestamp() { return m_callbacks->GetNewTimestamp(); }
     int GetNetCode( wxString aNetName ) { return m_callbacks->GetNetCode( aNetName ); }
 
@@ -78,7 +78,7 @@ protected:
     PCB_CALLBACKS*  m_callbacks;
     BOARD*          m_board;
 
-    int             FlipLayers( int aLayer );
+    LAYER_NUM       FlipLayers( LAYER_NUM aLayer );
 };
 
 WX_DEFINE_ARRAY( PCB_COMPONENT*, PCB_COMPONENTS_ARRAY );
diff --git a/pcbnew/pcb_parser.cpp b/pcbnew/pcb_parser.cpp
index 8f45cec82a..ecf7ddac85 100644
--- a/pcbnew/pcb_parser.cpp
+++ b/pcbnew/pcb_parser.cpp
@@ -61,7 +61,7 @@ void PCB_PARSER::init()
     // Add untranslated default (i.e. english) layernames.
     // Some may be overridden later if parsing a board rather than a footprint.
     // The english name will survive if parsing only a footprint.
-    for( int layerNdx = 0;  layerNdx < NB_LAYERS;  ++layerNdx )
+    for( LAYER_NUM layerNdx = FIRST_LAYER;  layerNdx < NB_PCB_LAYERS;  ++layerNdx )
     {
         std::string untranslated = TO_UTF8( BOARD::GetStandardLayerName( layerNdx ) );
 
@@ -665,7 +665,7 @@ void PCB_PARSER::parseLayers() throw( IO_ERROR, PARSE_ERROR )
     T           token;
     std::string name;
     std::string type;
-    int         layerIndex;
+    LAYER_NUM   layerIndex;
     bool        isVisible = true;
     LAYER_MSK   visibleLayers = NO_LAYERS;
     LAYER_MSK   enabledLayers = NO_LAYERS;
@@ -765,14 +765,14 @@ T PCB_PARSER::lookUpLayer( const M& aMap ) throw( PARSE_ERROR, IO_ERROR )
 }
 
 
-int PCB_PARSER::parseBoardItemLayer() throw( PARSE_ERROR, IO_ERROR )
+LAYER_NUM PCB_PARSER::parseBoardItemLayer() throw( PARSE_ERROR, IO_ERROR )
 {
     wxCHECK_MSG( CurTok() == T_layer, UNDEFINED_LAYER,
                  wxT( "Cannot parse " ) + GetTokenString( CurTok() ) + wxT( " as layer." ) );
 
     NextTok();
 
-    int layerIndex = lookUpLayer<int>( m_layerIndices );
+    LAYER_NUM layerIndex = lookUpLayer<LAYER_NUM>( m_layerIndices );
 
     // Handle closing ) in object parser.
 
@@ -2323,11 +2323,11 @@ SEGVIA* PCB_PARSER::parseSEGVIA() throw( IO_ERROR, PARSE_ERROR )
 
         case T_layers:
             {
-                int layer1, layer2;
+                LAYER_NUM layer1, layer2;
                 NextTok();
-                layer1 = lookUpLayer<int>( m_layerIndices );
+                layer1 = lookUpLayer<LAYER_NUM>( m_layerIndices );
                 NextTok();
-                layer2 = lookUpLayer<int>( m_layerIndices );
+                layer2 = lookUpLayer<LAYER_NUM>( m_layerIndices );
                 via->SetLayerPair( layer1, layer2 );
                 NeedRIGHT();
             }
diff --git a/pcbnew/pcb_parser.h b/pcbnew/pcb_parser.h
index e1f89e839e..92574af4e4 100644
--- a/pcbnew/pcb_parser.h
+++ b/pcbnew/pcb_parser.h
@@ -58,7 +58,7 @@ class FPL_CACHE;
  */
 class PCB_PARSER : public PCB_LEXER
 {
-    typedef boost::unordered_map< std::string, int > LAYER_NUM_MAP;
+    typedef boost::unordered_map< std::string, LAYER_NUM > LAYER_NUM_MAP;
     typedef boost::unordered_map< std::string, LAYER_MSK > LAYER_MSK_MAP;
 
     BOARD*          m_board;
@@ -117,7 +117,7 @@ class PCB_PARSER : public PCB_LEXER
      * @throw PARSE_ERROR if the layer syntax is incorrect.
      * @return The index the parsed #BOARD_ITEM layer.
      */
-    int parseBoardItemLayer() throw( IO_ERROR, PARSE_ERROR );
+    LAYER_NUM parseBoardItemLayer() throw( IO_ERROR, PARSE_ERROR );
 
     /**
      * Function parseBoardItemLayersAsMask
diff --git a/pcbnew/pcbframe.cpp b/pcbnew/pcbframe.cpp
index 5ee7f1a2f1..9a72c1078c 100644
--- a/pcbnew/pcbframe.cpp
+++ b/pcbnew/pcbframe.cpp
@@ -658,7 +658,7 @@ void PCB_EDIT_FRAME::SetGridColor(EDA_COLOR_T aColor)
 bool PCB_EDIT_FRAME::IsMicroViaAcceptable( void )
 {
     int copperlayercnt = GetBoard()->GetCopperLayerCount( );
-    int currLayer = getActiveLayer();
+    LAYER_NUM currLayer = getActiveLayer();
 
     if( !GetDesignSettings().m_MicroViasAllowed )
         return false;   // Obvious..
diff --git a/pcbnew/pcbnew.cpp b/pcbnew/pcbnew.cpp
index 199ff3a537..279829bb44 100644
--- a/pcbnew/pcbnew.cpp
+++ b/pcbnew/pcbnew.cpp
@@ -65,8 +65,8 @@ bool           g_Track_45_Only_Allowed = true;  // True to allow horiz, vert. an
 bool           g_Segments_45_Only;                // True to allow horiz, vert. and 45deg only graphic segments
 bool           g_TwoSegmentTrackBuild = true;
 
-int            g_Route_Layer_TOP;
-int            g_Route_Layer_BOTTOM;
+LAYER_NUM      g_Route_Layer_TOP;
+LAYER_NUM      g_Route_Layer_BOTTOM;
 int            g_MaxLinksShowed;
 int            g_MagneticPadOption   = capture_cursor_in_track_tool;
 int            g_MagneticTrackOption = capture_cursor_in_track_tool;
diff --git a/pcbnew/pcbnew.h b/pcbnew/pcbnew.h
index aeeb6a9a61..bea9f057bf 100644
--- a/pcbnew/pcbnew.h
+++ b/pcbnew/pcbnew.h
@@ -59,8 +59,8 @@ extern bool        g_Alternate_Track_Posture;
 extern bool        g_Segments_45_Only;
 
 /* Layer pair for auto routing and switch layers by hotkey */
-extern int         g_Route_Layer_TOP;
-extern int         g_Route_Layer_BOTTOM;
+extern LAYER_NUM   g_Route_Layer_TOP;
+extern LAYER_NUM   g_Route_Layer_BOTTOM;
 
 extern int         g_MaxLinksShowed;        // Max count links showed in routing
 extern bool        g_TwoSegmentTrackBuild;
diff --git a/pcbnew/pcbplot.cpp b/pcbnew/pcbplot.cpp
index 503e44f31e..1a508a4265 100644
--- a/pcbnew/pcbplot.cpp
+++ b/pcbnew/pcbplot.cpp
@@ -44,7 +44,7 @@
 
 /** Get the 'traditional' gerber extension depending on the layer
 */
-static wxString GetGerberExtension( int layer )/*{{{*/
+static wxString GetGerberExtension( LAYER_NUM layer )/*{{{*/
 {
     switch( layer )
     {
@@ -190,8 +190,6 @@ bool EnsureOutputDirectory( wxFileName *aOutputDir,
  */
 void DIALOG_PLOT::Plot( wxCommandEvent& event )
 {
-    int        layer;
-
     applyPlotSettings();
 
     // Create output directory if it does not exist (also transform it in
@@ -255,7 +253,7 @@ void DIALOG_PLOT::Plot( wxCommandEvent& event )
     // Save the current plot options in the board
     m_parent->SetPlotSettings( m_plotOpts );
 
-    for( layer = 0; layer < NB_LAYERS; ++layer )
+    for( LAYER_NUM layer = FIRST_LAYER; layer < NB_PCB_LAYERS; ++layer )
     {
         if( m_plotOpts.GetLayerSelection() & GetLayerMask( layer ) )
         {
@@ -372,7 +370,7 @@ bool PLOT_CONTROLLER::OpenPlotfile( const wxString &aSuffix, /*{{{*/
 }/*}}}*/
 
 /** Plot a single layer on the current plotfile */
-bool PLOT_CONTROLLER::PlotLayer( int aLayer )/*{{{*/
+bool PLOT_CONTROLLER::PlotLayer( LAYER_NUM aLayer )/*{{{*/
 {
     LOCALE_IO toggle;
 
diff --git a/pcbnew/pcbplot.h b/pcbnew/pcbplot.h
index a4e71ee323..21c352e994 100644
--- a/pcbnew/pcbplot.h
+++ b/pcbnew/pcbplot.h
@@ -148,7 +148,7 @@ public:
      * and in B&W mode, is plotted as white but other colors are plotted in BLACK
      * so the returned color is LIGHTGRAY when the layer color is WHITE
      */
-    EDA_COLOR_T getColor( int aLayer );
+    EDA_COLOR_T getColor( LAYER_NUM aLayer );
 
 private:
     /** Helper function to plot a single drill mark. It compensate and clamp
@@ -176,7 +176,7 @@ PLOTTER* StartPlotBoard( BOARD* aBoard,
  * @param aLayer = the layer id to plot
  * @param aPlotOpt = the plot options (files, sketch). Has meaning for some formats only
  */
-void PlotOneBoardLayer( BOARD* aBoard, PLOTTER* aPlotter, int aLayer,
+void PlotOneBoardLayer( BOARD *aBoard, PLOTTER* aPlotter, LAYER_NUM aLayer,
                         const PCB_PLOT_PARAMS& aPlotOpt );
 
 /**
diff --git a/pcbnew/plot_board_layers.cpp b/pcbnew/plot_board_layers.cpp
index 8e9ec9ad72..7b8b9c9ad3 100644
--- a/pcbnew/plot_board_layers.cpp
+++ b/pcbnew/plot_board_layers.cpp
@@ -142,7 +142,7 @@ void PlotSilkScreen( BOARD *aBoard, PLOTTER* aPlotter, LAYER_MSK aLayerMask,
     }
 }
 
-void PlotOneBoardLayer( BOARD *aBoard, PLOTTER* aPlotter, int aLayer,
+void PlotOneBoardLayer( BOARD *aBoard, PLOTTER* aPlotter, LAYER_NUM aLayer,
                      const PCB_PLOT_PARAMS& aPlotOpt )
 {
     PCB_PLOT_PARAMS plotOpt = aPlotOpt;
@@ -468,7 +468,7 @@ void PlotSolderMaskLayer( BOARD *aBoard, PLOTTER* aPlotter,
                           long aLayerMask, const PCB_PLOT_PARAMS& aPlotOpt,
                           int aMinThickness )
 {
-    int layer = ( aLayerMask & SOLDERMASK_LAYER_BACK ) ?
+    LAYER_NUM layer = ( aLayerMask & SOLDERMASK_LAYER_BACK ) ?
                  SOLDERMASK_N_BACK : SOLDERMASK_N_FRONT;
     int inflate = aMinThickness/2;
 
diff --git a/pcbnew/plot_brditems_plotter.cpp b/pcbnew/plot_brditems_plotter.cpp
index a549acde42..f1c271de6f 100644
--- a/pcbnew/plot_brditems_plotter.cpp
+++ b/pcbnew/plot_brditems_plotter.cpp
@@ -54,7 +54,7 @@
  */
 
 
-EDA_COLOR_T BRDITEMS_PLOTTER::getColor( int aLayer )
+EDA_COLOR_T BRDITEMS_PLOTTER::getColor( LAYER_NUM aLayer )
 {
     EDA_COLOR_T color = m_board->GetLayerColor( aLayer );
     if (color == WHITE)
@@ -107,9 +107,9 @@ bool BRDITEMS_PLOTTER::PlotAllTextsModule( MODULE* aModule )
     bool trace_ref = GetPlotReference();
 
     TEXTE_MODULE* textModule = &aModule->Reference();
-    unsigned      textLayer = textModule->GetLayer();
+    LAYER_NUM     textLayer = textModule->GetLayer();
 
-    if( textLayer >= LAYER_COUNT )
+    if( textLayer >= NB_LAYERS )
         return false;
 
     if( ( GetLayerMask( textLayer ) & m_layerMask ) == 0 )
@@ -121,7 +121,7 @@ bool BRDITEMS_PLOTTER::PlotAllTextsModule( MODULE* aModule )
     textModule = &aModule->Value();
     textLayer = textModule->GetLayer();
 
-    if( textLayer > LAYER_COUNT )
+    if( textLayer > NB_LAYERS )
         return false;
 
     if( ( GetLayerMask( textLayer ) & m_layerMask ) == 0 )
@@ -161,7 +161,7 @@ bool BRDITEMS_PLOTTER::PlotAllTextsModule( MODULE* aModule )
 
         textLayer = textModule->GetLayer();
 
-        if( textLayer >= LAYER_COUNT )
+        if( textLayer >= NB_LAYERS )
             return false;
 
         if( !( GetLayerMask( textLayer ) & m_layerMask ) )
diff --git a/pcbnew/plotcontroller.h b/pcbnew/plotcontroller.h
index b4afbc77b4..89e0028d0b 100644
--- a/pcbnew/plotcontroller.h
+++ b/pcbnew/plotcontroller.h
@@ -25,7 +25,7 @@ public:
     void ClosePlot();
     bool OpenPlotfile( const wxString &aSuffix, PlotFormat aFormat,
                        const wxString &aSheetDesc );
-    bool PlotLayer( int layer );
+    bool PlotLayer( LAYER_NUM layer );
 
 private:
     /// Option bank
diff --git a/pcbnew/print_board_functions.cpp b/pcbnew/print_board_functions.cpp
index 09c4a3f9d0..9fb8bdb7f1 100644
--- a/pcbnew/print_board_functions.cpp
+++ b/pcbnew/print_board_functions.cpp
@@ -156,7 +156,7 @@ void PCB_EDIT_FRAME::PrintPage( wxDC* aDC,
     }
 
     save_opt = DisplayOpt;
-    int activeLayer = GetScreen()->m_Active_Layer;
+    LAYER_NUM activeLayer = GetScreen()->m_Active_Layer;
 
     DisplayOpt.ContrastModeDisplay = false;
     DisplayOpt.DisplayPadFill = true;
@@ -172,9 +172,9 @@ void PCB_EDIT_FRAME::PrintPage( wxDC* aDC,
             DisplayOpt.DisplayPadFill = true;
 
             // Calculate the active layer number to print from its mask layer:
-            GetScreen()->m_Active_Layer = 0;
+            GetScreen()->m_Active_Layer = FIRST_LAYER;
 
-            for(int kk = 0; kk < 32; kk ++ )
+            for( LAYER_NUM kk = FIRST_LAYER; kk < NB_LAYERS; ++kk )
             {
                 if( GetLayerMask( kk ) & aPrintMaskLayer )
                 {
diff --git a/pcbnew/printout_controler.cpp b/pcbnew/printout_controler.cpp
index 74fd538310..44eea74cc9 100644
--- a/pcbnew/printout_controler.cpp
+++ b/pcbnew/printout_controler.cpp
@@ -65,7 +65,7 @@ PRINT_PARAMETERS::PRINT_PARAMETERS()
     m_XScaleAdjust          = 1.0;
     m_YScaleAdjust          = 1.0;
     m_Print_Sheet_Ref       = false;
-    m_PrintMaskLayer        = 0xFFFFFFFF;
+    m_PrintMaskLayer        = FULL_LAYERS;
     m_PrintMirror           = false;
     m_Print_Black_and_White = true;
     m_OptionPrintPage       = 1;
@@ -90,9 +90,9 @@ BOARD_PRINTOUT_CONTROLLER::BOARD_PRINTOUT_CONTROLLER( const PRINT_PARAMETERS& aP
 bool BOARD_PRINTOUT_CONTROLLER::OnPrintPage( int aPage )
 {
 #ifdef PCBNEW
-    int layers_count = NB_LAYERS;
+    int layers_count = NB_PCB_LAYERS;
 #else
-    int layers_count = LAYER_COUNT;
+    int layers_count = NB_LAYERS;
 #endif
 
     LAYER_MSK mask_layer = m_PrintParams.m_PrintMaskLayer;
diff --git a/pcbnew/protos.h b/pcbnew/protos.h
index 0ae8f2e77b..a906b947df 100644
--- a/pcbnew/protos.h
+++ b/pcbnew/protos.h
@@ -65,7 +65,7 @@ void DrawModuleOutlines( EDA_DRAW_PANEL* panel, wxDC* DC, MODULE* module );
 /* EDITRACK.C : */
 /****************/
 
-TRACK* LocateIntrusion( TRACK* listStart, TRACK* aTrack, int aLayer, const wxPoint& aRef );
+TRACK* LocateIntrusion( TRACK* listStart, TRACK* aTrack, LAYER_NUM aLayer, const wxPoint& aRef );
 
 void ShowNewTrackWhenMovingCursor( EDA_DRAW_PANEL* aPanel, wxDC* aDC, const wxPoint& aPosition,
                                    bool aErase );
diff --git a/pcbnew/sel_layer.cpp b/pcbnew/sel_layer.cpp
index d1e739ebe9..0985c06a41 100644
--- a/pcbnew/sel_layer.cpp
+++ b/pcbnew/sel_layer.cpp
@@ -25,12 +25,12 @@ class SELECT_LAYER_DIALOG : public wxDialog
 private:
     PCB_BASE_FRAME* m_Parent;
     wxRadioBox*     m_LayerList;
-    int m_LayerId[NB_LAYERS + 1]; // One extra element for "(Deselect)" radiobutton
+    LAYER_NUM m_LayerId[int(NB_PCB_LAYERS) + 1]; // One extra element for "(Deselect)" radiobutton
 
 public:
     // Constructor and destructor
-    SELECT_LAYER_DIALOG( PCB_BASE_FRAME* parent, int default_layer,
-                         int min_layer, int max_layer, bool null_layer );
+    SELECT_LAYER_DIALOG( PCB_BASE_FRAME* parent, LAYER_NUM default_layer,
+                         LAYER_NUM min_layer, LAYER_NUM max_layer, bool null_layer );
     ~SELECT_LAYER_DIALOG() { };
 
 private:
@@ -49,11 +49,11 @@ END_EVENT_TABLE()
 
 
 /** Install the dialog box for layer selection
- * @param default_layer = Preselection (NB_LAYERS for "(Deselect)" layer)
+ * @param default_layer = Preselection (NB_PCB_LAYERS for "(Deselect)" layer)
  * @param min_layer = min layer value (-1 if no min value)
  * @param max_layer = max layer value (-1 if no max value)
  * @param null_layer = display a "(Deselect)" radiobutton (when set to true)
- * @return new layer value (NB_LAYERS when "(Deselect)" radiobutton selected),
+ * @return new layer value (NB_PCB_LAYERS when "(Deselect)" radiobutton selected),
  *                         or -1 if canceled
  *
  * Providing the option to also display a "(Deselect)" radiobutton makes the
@@ -65,19 +65,18 @@ END_EVENT_TABLE()
  * "Deselect"
  * button provided within the "Swap Layers:" or "Layer selection:" dialog box).
  */
-int PCB_BASE_FRAME::SelectLayer( int  default_layer,
-                                 int  min_layer,
-                                 int  max_layer,
+LAYER_NUM PCB_BASE_FRAME::SelectLayer( LAYER_NUM  default_layer,
+                                       LAYER_NUM  min_layer,
+                                       LAYER_NUM  max_layer,
                                  bool null_layer )
 {
-    int layer;
     SELECT_LAYER_DIALOG* frame = new SELECT_LAYER_DIALOG( this,
                                                             default_layer,
                                                             min_layer,
                                                             max_layer,
                                                             null_layer );
 
-    layer = frame->ShowModal();
+    LAYER_NUM layer = frame->ShowModal();
     frame->Destroy();
     return layer;
 }
@@ -90,16 +89,16 @@ int PCB_BASE_FRAME::SelectLayer( int  default_layer,
  * to the right of that radiobox.
  */
 SELECT_LAYER_DIALOG::SELECT_LAYER_DIALOG( PCB_BASE_FRAME* parent,
-                                            int default_layer, int min_layer,
-                                            int max_layer, bool null_layer ) :
+                                          LAYER_NUM default_layer, LAYER_NUM min_layer,
+                                          LAYER_NUM max_layer, bool null_layer ) :
     wxDialog( parent, -1, _( "Select Layer:" ), wxPoint( -1, -1 ),
               wxSize( 470, 250 ),
               DIALOG_STYLE )
 {
     BOARD*    board = parent->GetBoard();
     wxButton* Button;
-    int       ii;
-    wxString  LayerList[NB_LAYERS + 1]; // One extra element for "(Deselect)"
+    LAYER_NUM ii;
+    wxString  LayerList[NB_PCB_LAYERS + 1]; // One extra element for "(Deselect)"
                                         // radiobutton
     int       LayerCount, LayerSelect = -1;
 
@@ -110,9 +109,9 @@ SELECT_LAYER_DIALOG::SELECT_LAYER_DIALOG( PCB_BASE_FRAME* parent,
     LAYER_MSK Masque_Layer = g_TabAllCopperLayerMask[board->GetCopperLayerCount() - 1];
     Masque_Layer |= ALL_NO_CU_LAYERS;
 
-    for( ii = 0; ii < NB_LAYERS; ii++ )
+    for( ii = FIRST_LAYER; ii < NB_PCB_LAYERS; ++ii )
     {
-        m_LayerId[ii] = 0;
+        m_LayerId[ii] = FIRST_LAYER;
 
         if( GetLayerMask( ii ) & Masque_Layer )
         {
@@ -137,10 +136,10 @@ SELECT_LAYER_DIALOG::SELECT_LAYER_DIALOG( PCB_BASE_FRAME* parent,
     {
         LayerList[LayerCount] = _( "(Deselect)" );
 
-        if( NB_LAYERS == default_layer )
+        if( NB_PCB_LAYERS == default_layer )
             LayerSelect = LayerCount;
 
-        m_LayerId[LayerCount] = NB_LAYERS;
+        m_LayerId[LayerCount] = NB_PCB_LAYERS;
         LayerCount++;
     }
 
@@ -198,7 +197,7 @@ private:
     PCB_BASE_FRAME* m_Parent;
     wxRadioBox*     m_LayerListTOP;
     wxRadioBox*     m_LayerListBOTTOM;
-    int m_LayerId[NB_COPPER_LAYERS];
+    LAYER_NUM m_LayerId[NB_COPPER_LAYERS];
 
 public: SELECT_LAYERS_PAIR_DIALOG( PCB_BASE_FRAME* parent );
     ~SELECT_LAYERS_PAIR_DIALOG() { };
@@ -255,9 +254,8 @@ SELECT_LAYERS_PAIR_DIALOG::SELECT_LAYERS_PAIR_DIALOG( PCB_BASE_FRAME* parent ) :
 {
     BOARD*    board = parent->GetBoard();
     wxButton* Button;
-    int       ii, LayerCount;
     wxString  LayerList[NB_COPPER_LAYERS];
-    int       LayerTopSelect = 0, LayerBottomSelect = 0;
+    LAYER_NUM LayerTopSelect = FIRST_LAYER, LayerBottomSelect = FIRST_LAYER;
 
     m_Parent = parent;
 
@@ -265,9 +263,10 @@ SELECT_LAYERS_PAIR_DIALOG::SELECT_LAYERS_PAIR_DIALOG( PCB_BASE_FRAME* parent ) :
     LAYER_MSK Masque_Layer = g_TabAllCopperLayerMask[board->GetCopperLayerCount() - 1];
     Masque_Layer |= ALL_NO_CU_LAYERS;
 
-    for( ii = 0, LayerCount = 0; ii < NB_COPPER_LAYERS; ii++ )
+    LAYER_NUM LayerCount = FIRST_LAYER;
+    for( LAYER_NUM ii = FIRST_COPPER_LAYER; ii < NB_COPPER_LAYERS; ++ii )
     {
-        m_LayerId[ii] = 0;
+        m_LayerId[ii] = FIRST_LAYER;
 
         if( (GetLayerMask( ii ) & Masque_Layer) )
         {
@@ -280,7 +279,7 @@ SELECT_LAYERS_PAIR_DIALOG::SELECT_LAYERS_PAIR_DIALOG( PCB_BASE_FRAME* parent ) :
                 LayerBottomSelect = LayerCount;
 
             m_LayerId[LayerCount] = ii;
-            LayerCount++;
+            ++LayerCount;
         }
     }
 
diff --git a/pcbnew/specctra.cpp b/pcbnew/specctra.cpp
index 398297f1b4..cc2c8cfc1d 100644
--- a/pcbnew/specctra.cpp
+++ b/pcbnew/specctra.cpp
@@ -79,11 +79,12 @@ void SPECCTRA_DB::buildLayerMaps( BOARD* aBoard )
 
     layerIds.clear();
     pcbLayer2kicad.resize( layerCount );
-    kicadLayer2pcb.resize( LAYER_N_FRONT+1 );
+    kicadLayer2pcb.resize( LAYER_N_FRONT + 1 );
 
-    for( int kiNdx=layerCount-1, pcbNdx=0;  kiNdx >= 0;  --kiNdx, ++pcbNdx )
+    for( LAYER_NUM kiNdx = layerCount - 1, pcbNdx=FIRST_LAYER;
+         kiNdx >= 0; --kiNdx, ++pcbNdx )
     {
-        int kilayer = kiNdx>0 && kiNdx==layerCount-1 ? LAYER_N_FRONT : kiNdx;
+        LAYER_NUM kilayer = (kiNdx>0 && kiNdx==layerCount-1) ? LAYER_N_FRONT : kiNdx;
 
         // establish bi-directional mapping between KiCad's BOARD layer and PCB layer
         pcbLayer2kicad[pcbNdx]  = kilayer;
@@ -95,14 +96,14 @@ void SPECCTRA_DB::buildLayerMaps( BOARD* aBoard )
 }
 
 
-int SPECCTRA_DB::findLayerName( const std::string& aLayerName ) const
+LAYER_NUM SPECCTRA_DB::findLayerName( const std::string& aLayerName ) const
 {
-    for( unsigned i=0;  i<layerIds.size();  ++i )
+    for( LAYER_NUM i=FIRST_LAYER;  i<int(layerIds.size());  ++i )
     {
         if( 0 == aLayerName.compare( layerIds[i] ) )
-            return (int) i;
+            return i;
     }
-    return -1;
+    return UNDEFINED_LAYER;
 }
 
 
diff --git a/pcbnew/specctra.h b/pcbnew/specctra.h
index ff3ad32256..dc2ed9640a 100644
--- a/pcbnew/specctra.h
+++ b/pcbnew/specctra.h
@@ -3577,10 +3577,10 @@ class SPECCTRA_DB : public SPECCTRA_LEXER
     STRINGS         layerIds;       ///< indexed by PCB layer number
 
     /// maps BOARD layer number to PCB layer numbers
-    std::vector<int>    kicadLayer2pcb;
+    std::vector<LAYER_NUM> kicadLayer2pcb;
 
     /// maps PCB layer number to BOARD layer numbers
-    std::vector<int>    pcbLayer2kicad;
+    std::vector<LAYER_NUM> pcbLayer2kicad;
 
     /// used during FromSESSION() only, memory for it is not owned here.
     UNIT_RES*       routeResolution;
@@ -3608,7 +3608,7 @@ class SPECCTRA_DB : public SPECCTRA_LEXER
      * Function findLayerName
      * returns the PCB layer index for a given layer name
      */
-    int findLayerName( const std::string& aLayerName ) const;
+    LAYER_NUM findLayerName( const std::string& aLayerName ) const;
 
     /**
      * Function readCOMPnPIN
@@ -3740,7 +3740,7 @@ class SPECCTRA_DB : public SPECCTRA_LEXER
      *  or delete it.
      */
     PADSTACK* makeVia( int aCopperDiameter, int aDrillDiameter,
-                               int aTopLayer, int aBotLayer );
+                       LAYER_NUM aTopLayer, LAYER_NUM aBotLayer );
 
     /**
      * Function makeVia
diff --git a/pcbnew/specctra_export.cpp b/pcbnew/specctra_export.cpp
index 1faabd2388..de4fe71b55 100644
--- a/pcbnew/specctra_export.cpp
+++ b/pcbnew/specctra_export.cpp
@@ -330,9 +330,9 @@ PADSTACK* SPECCTRA_DB::makePADSTACK( BOARD* aBoard, D_PAD* aPad )
         uniqifier += 'A';               // A for all layers
 
     const int copperCount = aBoard->GetCopperLayerCount();
-    for( int layer=0;  layer<copperCount;  ++layer )
+    for( LAYER_NUM layer=FIRST_LAYER; layer<copperCount; ++layer )
     {
-        int kilayer = pcbLayer2kicad[layer];
+        LAYER_NUM kilayer = pcbLayer2kicad[layer];
 
         if( onAllCopperLayers || aPad->IsOnLayer( kilayer ) )
         {
@@ -376,7 +376,7 @@ PADSTACK* SPECCTRA_DB::makePADSTACK( BOARD* aBoard, D_PAD* aPad )
         {
             double  diameter = scale(aPad->GetSize().x);
 
-            for( int ndx=0;  ndx<reportedLayers;  ++ndx )
+            for( LAYER_NUM ndx=FIRST_LAYER; ndx<reportedLayers; ++ndx )
             {
                 SHAPE*      shape = new SHAPE( padstack );
                 padstack->Append( shape );
@@ -409,7 +409,7 @@ PADSTACK* SPECCTRA_DB::makePADSTACK( BOARD* aBoard, D_PAD* aPad )
             lowerLeft  += dsnOffset;
             upperRight += dsnOffset;
 
-            for( int ndx=0;  ndx<reportedLayers;  ++ndx )
+            for( LAYER_NUM ndx=FIRST_LAYER; ndx<reportedLayers; ++ndx )
             {
                 SHAPE*      shape = new SHAPE( padstack );
                 padstack->Append( shape );
@@ -460,7 +460,7 @@ PADSTACK* SPECCTRA_DB::makePADSTACK( BOARD* aBoard, D_PAD* aPad )
             start += dsnOffset;
             stop  += dsnOffset;
 
-            for( int ndx=0;  ndx<reportedLayers;  ++ndx )
+            for( LAYER_NUM ndx=FIRST_LAYER; ndx<reportedLayers; ++ndx )
             {
                 SHAPE*  shape;
                 PATH*   path;
@@ -501,7 +501,7 @@ PADSTACK* SPECCTRA_DB::makePADSTACK( BOARD* aBoard, D_PAD* aPad )
             upperRight += dsnOffset;
             lowerRight += dsnOffset;
 
-            for( int ndx=0;  ndx<reportedLayers;  ++ndx )
+            for( LAYER_NUM ndx=FIRST_LAYER; ndx<reportedLayers; ++ndx )
             {
                 SHAPE*      shape = new SHAPE( padstack );
                 padstack->Append( shape );
@@ -569,7 +569,7 @@ IMAGE* SPECCTRA_DB::makeIMAGE( BOARD* aBoard, MODULE* aModule )
             POINT   vertex   = mapPt( pad->GetPos0() );
 
             int layerCount = aBoard->GetCopperLayerCount();
-            for( int layer=0;  layer<layerCount;  ++layer )
+            for( LAYER_NUM layer=FIRST_LAYER;  layer<layerCount;  ++layer )
             {
                 KEEPOUT* keepout = new KEEPOUT(image, T_keepout);
                 image->keepouts.push_back( keepout );
@@ -716,14 +716,14 @@ IMAGE* SPECCTRA_DB::makeIMAGE( BOARD* aBoard, MODULE* aModule )
 
 
 PADSTACK* SPECCTRA_DB::makeVia( int aCopperDiameter, int aDrillDiameter,
-                               int aTopLayer, int aBotLayer )
+                               LAYER_NUM aTopLayer, LAYER_NUM aBotLayer )
 {
     char        name[48];
     PADSTACK*   padstack = new PADSTACK();
 
     double      dsnDiameter = scale( aCopperDiameter );
 
-    for( int layer=aTopLayer;  layer<=aBotLayer;  ++layer )
+    for( LAYER_NUM layer=aTopLayer; layer<=aBotLayer; ++layer )
     {
         SHAPE* shape = new SHAPE( padstack );
         padstack->Append( shape );
@@ -750,8 +750,8 @@ PADSTACK* SPECCTRA_DB::makeVia( int aCopperDiameter, int aDrillDiameter,
 
 PADSTACK* SPECCTRA_DB::makeVia( const SEGVIA* aVia )
 {
-    int     topLayer;
-    int     botLayer;
+    LAYER_NUM topLayer;
+    LAYER_NUM botLayer;
 
     aVia->ReturnLayerPair( &topLayer, &botLayer );
 
@@ -991,7 +991,7 @@ void SPECCTRA_DB::FromBOARD( BOARD* aBoard ) throw( IO_ERROR )
 
         int layerCount = aBoard->GetCopperLayerCount();
 
-        for( int pcbNdx=0;  pcbNdx<layerCount; ++pcbNdx )
+        for( LAYER_NUM pcbNdx=FIRST_LAYER; pcbNdx<layerCount; ++pcbNdx )
         {
             LAYER*      layer = new LAYER( pcb->structure );
             pcb->structure->layers.push_back( layer );
@@ -1415,7 +1415,7 @@ void SPECCTRA_DB::FromBOARD( BOARD* aBoard ) throw( IO_ERROR )
         NETCLASS*   netclass  = nclasses.GetDefault();
 
         PADSTACK*   via = makeVia( netclass->GetViaDiameter(), netclass->GetViaDrill(),
-                                   0, aBoard->GetCopperLayerCount()-1 );
+                                   FIRST_LAYER, aBoard->GetCopperLayerCount()-1 );
 
         // we AppendVia() this first one, there is no way it can be a duplicate,
         // the pcb->library via container is empty at this point.  After this,
@@ -1431,7 +1431,7 @@ void SPECCTRA_DB::FromBOARD( BOARD* aBoard ) throw( IO_ERROR )
             int viaDrill = aBoard->m_ViasDimensionsList[i].m_Drill;
 
             via = makeVia( viaSize, viaDrill,
-                           0, aBoard->GetCopperLayerCount()-1 );
+                           FIRST_LAYER, aBoard->GetCopperLayerCount()-1 );
 
             // maybe add 'via' to the library, but only if unique.
             PADSTACK* registered = pcb->library->LookupVia( via );
@@ -1448,7 +1448,7 @@ void SPECCTRA_DB::FromBOARD( BOARD* aBoard ) throw( IO_ERROR )
             netclass = nc->second;
 
             via = makeVia( netclass->GetViaDiameter(), netclass->GetViaDrill(),
-                           0, aBoard->GetCopperLayerCount()-1 );
+                           FIRST_LAYER, aBoard->GetCopperLayerCount()-1 );
 
             // maybe add 'via' to the library, but only if unique.
             PADSTACK* registered = pcb->library->LookupVia( via );
@@ -1474,7 +1474,7 @@ void SPECCTRA_DB::FromBOARD( BOARD* aBoard ) throw( IO_ERROR )
 
         int old_netcode = -1;
         int old_width = -1;
-        int old_layer = -1;
+        LAYER_NUM old_layer = UNDEFINED_LAYER;
 
         for( int i=0;  i<items.GetCount();  ++i )
         {
@@ -1508,8 +1508,8 @@ void SPECCTRA_DB::FromBOARD( BOARD* aBoard ) throw( IO_ERROR )
 
                 wire->wire_type = T_protect;  // @todo, this should be configurable
 
-                int kiLayer  = track->GetLayer();
-                int pcbLayer = kicadLayer2pcb[kiLayer];
+                LAYER_NUM kiLayer  = track->GetLayer();
+                LAYER_NUM pcbLayer = kicadLayer2pcb[kiLayer];
 
                 path = new PATH( wire );
                 wire->SetShape( path );
@@ -1666,7 +1666,7 @@ void SPECCTRA_DB::exportNETCLASS( NETCLASS* aNetClass, BOARD* aBoard )
     // this should never become a performance issue.
 
     PADSTACK* via = makeVia( aNetClass->GetViaDiameter(), aNetClass->GetViaDrill(),
-                             0, aBoard->GetCopperLayerCount()-1 );
+                             FIRST_LAYER, aBoard->GetCopperLayerCount()-1 );
 
     snprintf( text, sizeof(text), "(use_via %s)", via->GetPadstackId().c_str() );
     clazz->circuit.push_back( text );
diff --git a/pcbnew/specctra_import.cpp b/pcbnew/specctra_import.cpp
index e96be41bf4..5a495ca4f3 100644
--- a/pcbnew/specctra_import.cpp
+++ b/pcbnew/specctra_import.cpp
@@ -224,7 +224,7 @@ static wxPoint mapPt( const POINT& aPoint, UNIT_RES* aResolution )
 
 TRACK* SPECCTRA_DB::makeTRACK( PATH* aPath, int aPointIndex, int aNetcode ) throw( IO_ERROR )
 {
-    int layerNdx = findLayerName( aPath->layer_id );
+    LAYER_NUM layerNdx = findLayerName( aPath->layer_id );
 
     if( layerNdx == -1 )
     {
@@ -319,8 +319,8 @@ SEGVIA* SPECCTRA_DB::makeVIA( PADSTACK* aPadstack, const POINT& aPoint, int aNet
     }
     else    // VIA_MICROVIA or VIA_BLIND_BURIED
     {
-        int topLayerNdx = -1;
-        int botLayerNdx = 7000;
+        LAYER_NUM topLayerNdx = UNDEFINED_LAYER;
+        LAYER_NUM botLayerNdx = 7000;
         int viaDiam = -1;
 
         for( int i=0; i<shapeCount;  ++i )
@@ -333,8 +333,8 @@ SEGVIA* SPECCTRA_DB::makeVIA( PADSTACK* aPadstack, const POINT& aPoint, int aNet
 
             CIRCLE* circle = (CIRCLE*) shape->shape;
 
-            int layerNdx = findLayerName( circle->layer_id );
-            if( layerNdx == -1 )
+            LAYER_NUM layerNdx = findLayerName( circle->layer_id );
+            if( layerNdx == UNDEFINED_LAYER )
             {
                 wxString layerName = FROM_UTF8( circle->layer_id.c_str() );
                 ThrowIOError( _("Session file uses invalid layer id \"%s\""),
diff --git a/pcbnew/specctra_test.cpp b/pcbnew/specctra_test.cpp
index 713c9b15a0..c0b95f7d72 100644
--- a/pcbnew/specctra_test.cpp
+++ b/pcbnew/specctra_test.cpp
@@ -100,7 +100,7 @@ int BOARD::GetCopperLayerCount() const
 }
 
 // a dummy to satisfy link of specctra_test without pulling in BOARD stuff.
-wxString BOARD::GetLayerName( int aLayer ) const
+wxString BOARD::GetLayerName( LAYER_NUM aLayer ) const
 {
     return wxEmptyString;
 }
diff --git a/pcbnew/swap_layers.cpp b/pcbnew/swap_layers.cpp
index bf9f0c5789..58be1f5469 100644
--- a/pcbnew/swap_layers.cpp
+++ b/pcbnew/swap_layers.cpp
@@ -20,14 +20,14 @@
 
 
 #define LAYER_NO_CHANGE NB_LAYERS
-static int    New_Layer[NB_LAYERS];
-wxStaticText* layer_list[NB_LAYERS];
+static LAYER_NUM New_Layer[NB_PCB_LAYERS];
+wxStaticText* layer_list[NB_PCB_LAYERS];
 
 
 enum swap_layer_id {
     ID_WINEDA_SWAPLAYERFRAME = 1800,
     ID_BUTTON_0,
-    ID_TEXT_0 = ID_BUTTON_0 + NB_LAYERS
+    ID_TEXT_0 = ID_BUTTON_0 + NB_PCB_LAYERS
 };
 
 
@@ -59,7 +59,7 @@ private:
 
 
 BEGIN_EVENT_TABLE( WinEDA_SwapLayerFrame, wxDialog )
-    EVT_COMMAND_RANGE( ID_BUTTON_0, ID_BUTTON_0 + NB_LAYERS - 1,
+    EVT_COMMAND_RANGE( ID_BUTTON_0, ID_BUTTON_0 + NB_PCB_LAYERS - 1,
                        wxEVT_COMMAND_BUTTON_CLICKED,
                        WinEDA_SwapLayerFrame::Sel_Layer )
     EVT_BUTTON( wxID_OK, WinEDA_SwapLayerFrame::OnOkClick )
@@ -114,7 +114,7 @@ WinEDA_SwapLayerFrame::WinEDA_SwapLayerFrame( PCB_BASE_FRAME* parent ) :
     MainBoxSizer = new wxBoxSizer( wxHORIZONTAL );
     OuterBoxSizer->Add( MainBoxSizer, 1, wxGROW | wxLEFT | wxRIGHT | wxTOP, 5 );
 
-    for( int ii = 0; ii < NB_LAYERS; ii++ )
+    for( LAYER_NUM ii = FIRST_LAYER; ii < NB_PCB_LAYERS; ++ii )
     {
         // Provide a vertical line to separate the two FlexGrid sizers
         if( ii == 16 )
@@ -204,11 +204,11 @@ WinEDA_SwapLayerFrame::WinEDA_SwapLayerFrame( PCB_BASE_FRAME* parent ) :
          */
         if( ii == 0 )
         {
-            text = new wxStaticText( this, item_ID, board->GetLayerName( 0 ),
+            text = new wxStaticText( this, item_ID, board->GetLayerName( FIRST_LAYER ),
                                      wxDefaultPosition, wxDefaultSize, 0 );
             goodSize = text->GetSize();
 
-            for( int jj = 1; jj < NB_LAYERS; jj++ )
+            for( LAYER_NUM jj = LAYER_N_2; jj < NB_PCB_LAYERS; ++jj )
             {
                 text->SetLabel( board->GetLayerName( jj ) );
 
@@ -238,7 +238,7 @@ WinEDA_SwapLayerFrame::WinEDA_SwapLayerFrame( PCB_BASE_FRAME* parent ) :
      * FlexGrid sizer. (As it incorporates three columns, three spacers
      * are thus required for each otherwise unused row.)
      */
-    for( int ii = 3 * NB_LAYERS; ii < 96; ii++ )
+    for( int ii = 3 * NB_PCB_LAYERS; ii < 96; ii++ )
     {
         FlexColumnBoxSizer->Add( 5, h, 0, wxALIGN_CENTER_HORIZONTAL |
                                  wxALIGN_CENTER_VERTICAL | wxLEFT |
@@ -275,23 +275,23 @@ WinEDA_SwapLayerFrame::WinEDA_SwapLayerFrame( PCB_BASE_FRAME* parent ) :
 
 void WinEDA_SwapLayerFrame::Sel_Layer( wxCommandEvent& event )
 {
-    int ii, jj;
+    int ii;
 
     ii = event.GetId();
 
-    if( ii < ID_BUTTON_0 || ii >= ID_BUTTON_0 + NB_LAYERS )
+    if( ii < ID_BUTTON_0 || ii >= ID_BUTTON_0 + NB_PCB_LAYERS )
         return;
 
     ii = event.GetId() - ID_BUTTON_0;
 
-    jj = New_Layer[ii];
+    LAYER_NUM jj = New_Layer[ii];
 
-    if( (jj < 0) || (jj > NB_LAYERS) )
+    if( (jj < 0) || (jj > NB_PCB_LAYERS) )
         jj = LAYER_NO_CHANGE; // (Defaults to "No Change".)
 
-    jj = m_Parent->SelectLayer( jj, -1, -1, true );
+    jj = m_Parent->SelectLayer( jj, UNDEFINED_LAYER, UNDEFINED_LAYER, true );
 
-    if( (jj < 0) || (jj > NB_LAYERS) )
+    if( (jj < FIRST_LAYER) || (jj > NB_PCB_LAYERS) )
         return;
 
     // No change if the selected layer matches the layer being edited.
@@ -350,7 +350,7 @@ void PCB_EDIT_FRAME::Swap_Layers( wxCommandEvent& event )
     EDA_ITEM*    PtStruct;
 
     /* Init default values */
-    for( ii = 0; ii < NB_LAYERS; ii++ )
+    for( ii = FIRST_LAYER; ii < NB_PCB_LAYERS; ii++ )
         New_Layer[ii] = LAYER_NO_CHANGE;
 
     WinEDA_SwapLayerFrame* frame = new WinEDA_SwapLayerFrame( this );
@@ -375,7 +375,7 @@ void PCB_EDIT_FRAME::Swap_Layers( wxCommandEvent& event )
             if( Via->GetShape() == VIA_THROUGH )
                 continue;
 
-            int     top_layer, bottom_layer;
+            LAYER_NUM top_layer, bottom_layer;
 
             Via->ReturnLayerPair( &top_layer, &bottom_layer );
 
diff --git a/pcbnew/zones_by_polygon.cpp b/pcbnew/zones_by_polygon.cpp
index f8a5a6592f..fd48f024ee 100644
--- a/pcbnew/zones_by_polygon.cpp
+++ b/pcbnew/zones_by_polygon.cpp
@@ -372,7 +372,7 @@ void PCB_EDIT_FRAME::Remove_Zone_Corner( wxDC* DC, ZONE_CONTAINER* aZone )
         return;
     }
 
-    int layer = aZone->GetLayer();
+    LAYER_NUM layer = aZone->GetLayer();
 
     if( DC )
     {
@@ -620,7 +620,7 @@ int PCB_EDIT_FRAME::Begin_Zone( wxDC* DC )
         }
 
         // Show the Net for zones on copper layers
-        if( zoneInfo.m_CurrentZone_Layer < FIRST_NO_COPPER_LAYER &&
+        if( zoneInfo.m_CurrentZone_Layer < FIRST_NON_COPPER_LAYER &&
             ! zoneInfo.GetIsKeepout() )
         {
             if( s_CurrentZone )
@@ -739,7 +739,7 @@ bool PCB_EDIT_FRAME::End_Zone( wxDC* DC )
     m_canvas->SetMouseCapture( NULL, NULL );
 
     // Undraw old drawings, because they can have important changes
-    int layer = zone->GetLayer();
+    LAYER_NUM layer = zone->GetLayer();
     GetBoard()->RedrawAreasOutlines( m_canvas, DC, GR_XOR, layer );
     GetBoard()->RedrawFilledAreas( m_canvas, DC, GR_XOR, layer );
 
@@ -851,7 +851,7 @@ void PCB_EDIT_FRAME::Edit_Zone_Params( wxDC* DC, ZONE_CONTAINER* aZone )
     // note the net name and the layer can be changed, so we must save all zones
     s_AuxiliaryList.ClearListAndDeleteItems();
     s_PickedList.ClearListAndDeleteItems();
-    SaveCopyOfZones(s_PickedList, GetBoard(), -1, -1 );
+    SaveCopyOfZones(s_PickedList, GetBoard(), -1, UNDEFINED_LAYER );
 
     if( aZone->GetIsKeepout() )
     {
@@ -859,7 +859,7 @@ void PCB_EDIT_FRAME::Edit_Zone_Params( wxDC* DC, ZONE_CONTAINER* aZone )
         zoneInfo << *aZone;
         edited = InvokeKeepoutAreaEditor( this, &zoneInfo );
     }
-    else if( aZone->GetLayer() < FIRST_NO_COPPER_LAYER )
+    else if( aZone->GetLayer() < FIRST_NON_COPPER_LAYER )
     {
         // edit a zone on a copper layer
 
@@ -910,7 +910,7 @@ void PCB_EDIT_FRAME::Edit_Zone_Params( wxDC* DC, ZONE_CONTAINER* aZone )
     GetBoard()->OnAreaPolygonModified( &s_AuxiliaryList, aZone );
 
     // Redraw the real new zone outlines
-    GetBoard()->RedrawAreasOutlines( m_canvas, DC, GR_OR, -1 );
+    GetBoard()->RedrawAreasOutlines( m_canvas, DC, GR_OR, UNDEFINED_LAYER );
 
     UpdateCopyOfZonesList( s_PickedList, s_AuxiliaryList, GetBoard() );
     SaveCopyInUndoList(s_PickedList, UR_UNSPECIFIED);
diff --git a/pcbnew/zones_functions_for_undo_redo.cpp b/pcbnew/zones_functions_for_undo_redo.cpp
index e113f7a61a..922e955c41 100644
--- a/pcbnew/zones_functions_for_undo_redo.cpp
+++ b/pcbnew/zones_functions_for_undo_redo.cpp
@@ -134,7 +134,7 @@ bool ZONE_CONTAINER::IsSame( const ZONE_CONTAINER& aZoneToCompare )
  * @param aLayer = the layer of zones. if aLayer < 0, all layers are used
  * @return the count of saved copies
  */
-int SaveCopyOfZones( PICKED_ITEMS_LIST& aPickList, BOARD* aPcb, int aNetCode, int aLayer )
+int SaveCopyOfZones( PICKED_ITEMS_LIST& aPickList, BOARD* aPcb, int aNetCode, LAYER_NUM aLayer )
 {
     int copyCount = 0;
 
diff --git a/pcbnew/zones_functions_for_undo_redo.h b/pcbnew/zones_functions_for_undo_redo.h
index 7ef0ae2a9d..a5260a3fa8 100644
--- a/pcbnew/zones_functions_for_undo_redo.h
+++ b/pcbnew/zones_functions_for_undo_redo.h
@@ -56,7 +56,7 @@
  * @param aLayer = the layer of zones. if aLayer < 0, all layers are used
  * @return the count of saved copies
  */
-int SaveCopyOfZones(PICKED_ITEMS_LIST & aPickList, BOARD* aPcb, int aNetCode, int aLayer );
+int SaveCopyOfZones(PICKED_ITEMS_LIST & aPickList, BOARD* aPcb, int aNetCode, LAYER_NUM aLayer );
 
 
 /**
diff --git a/pcbnew/zones_non_copper_type_functions.cpp b/pcbnew/zones_non_copper_type_functions.cpp
index 5305c4e137..f6b2594bff 100644
--- a/pcbnew/zones_non_copper_type_functions.cpp
+++ b/pcbnew/zones_non_copper_type_functions.cpp
@@ -98,9 +98,11 @@ void DIALOG_NON_COPPER_ZONES_EDITOR::Init()
         break;
     }
 
-    for( int layer_number = FIRST_NO_COPPER_LAYER, ii = 0;
-         layer_number <= LAST_NO_COPPER_LAYER;
-         layer_number++, ii++ )
+    int ii;
+    LAYER_NUM layer_number;
+    for( layer_number = FIRST_NON_COPPER_LAYER, ii = 0;
+         layer_number <= LAST_NON_COPPER_LAYER;
+         ++layer_number, ++ii )
     {
         wxString msg;
 
@@ -171,7 +173,7 @@ void DIALOG_NON_COPPER_ZONES_EDITOR::OnOkClick( wxCommandEvent& event )
         return;
     }
 
-    m_settings.m_CurrentZone_Layer = ii + FIRST_NO_COPPER_LAYER;
+    m_settings.m_CurrentZone_Layer = FIRST_NON_COPPER_LAYER + ii;
 
     *m_ptr = m_settings;
 
diff --git a/pcbnew/zones_test_and_combine_areas.cpp b/pcbnew/zones_test_and_combine_areas.cpp
index 718661e8a2..c476d79bf5 100644
--- a/pcbnew/zones_test_and_combine_areas.cpp
+++ b/pcbnew/zones_test_and_combine_areas.cpp
@@ -53,7 +53,7 @@ bool BOARD::OnAreaPolygonModified( PICKED_ITEMS_LIST* aModifiedZonesList,
     bool modified = NormalizeAreaPolygon( aModifiedZonesList, modified_area );
 
     // now see if we need to clip against other areas
-    int  layer = modified_area->GetLayer();
+    LAYER_NUM layer = modified_area->GetLayer();
     bool bCheckAllAreas = TestAreaIntersections( modified_area );
 
     if( bCheckAllAreas )
@@ -62,7 +62,7 @@ bool BOARD::OnAreaPolygonModified( PICKED_ITEMS_LIST* aModifiedZonesList,
         CombineAllAreasInNet( aModifiedZonesList, modified_area->GetNet(), true );
     }
 
-    if( layer >= FIRST_NO_COPPER_LAYER )    // Refill non copper zones on this layer
+    if( layer >= FIRST_NON_COPPER_LAYER )    // Refill non copper zones on this layer
     {
         for( unsigned ia = 0; ia < m_ZoneDescriptorList.size(); ia++ )
             if( m_ZoneDescriptorList[ia]->GetLayer() == layer )
diff --git a/polygon/PolyLine.cpp b/polygon/PolyLine.cpp
index 1475f4c755..5ed3951842 100644
--- a/polygon/PolyLine.cpp
+++ b/polygon/PolyLine.cpp
@@ -21,7 +21,7 @@ CPolyLine::CPolyLine()
 {
     m_hatchStyle    = NO_HATCH;
     m_hatchPitch    = 0;
-    m_layer     = 0;
+    m_layer     = NO_LAYER;
     m_utility   = 0;
 }
 
@@ -207,7 +207,7 @@ void CPolyLine::ImportSettings( const CPolyLine * aPoly )
 /* initialize a contour
  * set layer, hatch style, and starting point
  */
-void CPolyLine::Start( int layer, int x, int y, int hatch )
+void CPolyLine::Start( LAYER_NUM layer, int x, int y, int hatch )
 {
     m_layer = layer;
     SetHatchStyle( (enum HATCH_STYLE) hatch );
@@ -795,7 +795,7 @@ void CPolyLine::Hatch()
     double  hatch_line_len = m_hatchPitch;
 
     // To have a better look, give a slope depending on the layer
-    int     layer = GetLayer();
+    LAYER_NUM layer = GetLayer();
     int     slope_flag = (layer & 1) ? 1 : -1;  // 1 or -1
     double  slope = 0.707106 * slope_flag;      // 45 degrees slope
     int     max_a, min_a;
diff --git a/polygon/PolyLine.h b/polygon/PolyLine.h
index 39368bf003..15f2cb49d9 100644
--- a/polygon/PolyLine.h
+++ b/polygon/PolyLine.h
@@ -98,7 +98,7 @@ public:
     /* initialize a contour
      * set layer, hatch style, and starting point
      */
-    void        Start( int layer, int x, int y, int hatch );
+    void        Start( LAYER_NUM layer, int x, int y, int hatch );
 
     void        AppendCorner( int x, int y );
     void        InsertCorner( int ic, int x, int y );
@@ -175,8 +175,8 @@ public:
     void        AppendArc( int xi, int yi, int xf, int yf, int xc, int yc, int num );
 
     // access functions
-    void       SetLayer( int aLayer ) { m_layer = aLayer; }
-    int        GetLayer() const { return m_layer; }
+    void       SetLayer( LAYER_NUM aLayer ) { m_layer = aLayer; }
+    LAYER_NUM  GetLayer() const { return m_layer; }
     int        GetNumCorners();
     int        GetNumSides();
     int        GetClosed();
@@ -254,7 +254,7 @@ public:
     int     Distance( wxPoint aStart, wxPoint aEnd, int aWidth );
 
 private:
-    int                     m_layer;                // layer to draw on
+    LAYER_NUM               m_layer;                // layer to draw on
     enum HATCH_STYLE        m_hatchStyle;           // hatch style, see enum above
     int                     m_hatchPitch;           // for DIAGONAL_EDGE hatched outlines, basic distance between 2 hatch lines
                                                     // and the len of eacvh segment