diff --git a/api/proto/board/board.proto b/api/proto/board/board.proto
index 75f7f22cdd..bb560cf8e8 100644
--- a/api/proto/board/board.proto
+++ b/api/proto/board/board.proto
@@ -61,14 +61,40 @@ message BoardStackupCopperLayer
 
 }
 
+enum BoardStackupLayerType
+{
+  BSLT_UNKNOWN = 0;
+  BSLT_COPPER = 1;
+  BSLT_DIELECTRIC = 2;
+  BSLT_SILKSCREEN = 3;
+  BSLT_SOLDERMASK = 4;
+  BSLT_SOLDERPASTE = 5;
+  BSLT_UNDEFINED = 7;
+}
+
+message BoardStackupDielectricProperties
+{
+  double epsilon_r = 1;
+  double loss_tangent = 2;
+  string material_name = 3;
+  kiapi.common.types.Distance thickness = 4;
+}
+
+message BoardStackupDielectricLayer
+{
+  // A single dielectric slot (between copper layers) can be made up of multiple physical layers
+  repeated BoardStackupDielectricProperties layer = 1;
+}
+
 message BoardStackupLayer
 {
   kiapi.common.types.Distance thickness = 1;
   kiapi.board.types.BoardLayer layer = 2;
   bool enabled = 3;
-  oneof item {
-    BoardStackupCopperLayer copper = 4;
-  }
+  BoardStackupLayerType type = 4;
+  BoardStackupDielectricLayer dielectric = 5;
+  kiapi.common.types.Color color = 6;
+  string material_name = 7;
 }
 
 message BoardStackup
diff --git a/pcbnew/api/api_pcb_enums.cpp b/pcbnew/api/api_pcb_enums.cpp
index 7c031d0e51..03d5e4122b 100644
--- a/pcbnew/api/api_pcb_enums.cpp
+++ b/pcbnew/api/api_pcb_enums.cpp
@@ -24,6 +24,7 @@
 #include <api/board/board_commands.pb.h>
 #include <wx/wx.h>
 
+#include <board_stackup_manager/board_stackup.h>
 #include <padstack.h>
 #include <pcb_dimension.h>
 #include <pcb_track.h>
@@ -766,4 +767,42 @@ RATSNEST_MODE FromProtoEnum( commands::RatsnestDisplayMode aValue )
     }
 }
 
+
+template<>
+BoardStackupLayerType ToProtoEnum( BOARD_STACKUP_ITEM_TYPE aValue )
+{
+    switch( aValue )
+    {
+    case BS_ITEM_TYPE_UNDEFINED:    return BoardStackupLayerType::BSLT_UNDEFINED;
+    case BS_ITEM_TYPE_COPPER:       return BoardStackupLayerType::BSLT_COPPER;
+    case BS_ITEM_TYPE_DIELECTRIC:   return BoardStackupLayerType::BSLT_DIELECTRIC;
+    case BS_ITEM_TYPE_SOLDERPASTE:  return BoardStackupLayerType::BSLT_SOLDERPASTE;
+    case BS_ITEM_TYPE_SOLDERMASK:   return BoardStackupLayerType::BSLT_SOLDERMASK;
+    case BS_ITEM_TYPE_SILKSCREEN:   return BoardStackupLayerType::BSLT_SILKSCREEN;
+
+    default:
+        wxCHECK_MSG( false, BoardStackupLayerType::BSLT_UNKNOWN,
+                     "Unhandled case in ToProtoEnum<BOARD_STACKUP_ITEM_TYPE>");
+    }
+}
+
+
+template<>
+BOARD_STACKUP_ITEM_TYPE FromProtoEnum( BoardStackupLayerType aValue )
+{
+    switch( aValue )
+    {
+    case BoardStackupLayerType::BSLT_UNDEFINED:    return BS_ITEM_TYPE_UNDEFINED;
+    case BoardStackupLayerType::BSLT_COPPER:       return BS_ITEM_TYPE_COPPER;
+    case BoardStackupLayerType::BSLT_DIELECTRIC:   return BS_ITEM_TYPE_DIELECTRIC;
+    case BoardStackupLayerType::BSLT_SOLDERPASTE:  return BS_ITEM_TYPE_SOLDERPASTE;
+    case BoardStackupLayerType::BSLT_SOLDERMASK:   return BS_ITEM_TYPE_SOLDERMASK;
+    case BoardStackupLayerType::BSLT_SILKSCREEN:   return BS_ITEM_TYPE_SILKSCREEN;
+
+    default:
+        wxCHECK_MSG( false, BS_ITEM_TYPE_UNDEFINED,
+                     "Unhandled case in FromProtoEnum<BoardStackupLayerType>" );
+    }
+}
+
 // Adding something new here?  Add it to test_api_enums.cpp!
diff --git a/pcbnew/board_stackup_manager/board_stackup.cpp b/pcbnew/board_stackup_manager/board_stackup.cpp
index 16abaca243..0770dfee83 100644
--- a/pcbnew/board_stackup_manager/board_stackup.cpp
+++ b/pcbnew/board_stackup_manager/board_stackup.cpp
@@ -425,28 +425,44 @@ bool BOARD_STACKUP::operator==( const BOARD_STACKUP& aOther ) const
 
 void BOARD_STACKUP::Serialize( google::protobuf::Any& aContainer ) const
 {
-    kiapi::board::BoardStackup stackup;
+    using namespace kiapi::board;
+    BoardStackup stackup;
 
     for( const BOARD_STACKUP_ITEM* item : m_list )
     {
-        kiapi::board::BoardStackupLayer* layer = stackup.mutable_layers()->Add();
+        BoardStackupLayer* layer = stackup.mutable_layers()->Add();
 
-        // TODO dielectric sub-layers
         layer->mutable_thickness()->set_value_nm( item->GetThickness() );
-        layer->set_layer( ToProtoEnum<PCB_LAYER_ID, kiapi::board::types::BoardLayer>(
-                item->GetBrdLayerId() ) );
+        layer->set_layer( ToProtoEnum<PCB_LAYER_ID, types::BoardLayer>( item->GetBrdLayerId() ) );
+        layer->set_type(
+                ToProtoEnum<BOARD_STACKUP_ITEM_TYPE, BoardStackupLayerType>( item->GetType() ) );
 
         switch( item->GetType() )
         {
-        case BOARD_STACKUP_ITEM_TYPE::BS_ITEM_TYPE_COPPER:
+        case BS_ITEM_TYPE_COPPER:
         {
-            layer->mutable_copper()->New();
+            layer->set_material_name( "copper" );
             // (no copper params yet...)
             break;
         }
 
+        case BS_ITEM_TYPE_DIELECTRIC:
+        {
+            BoardStackupDielectricLayer* dielectric = layer->mutable_dielectric()->New();
+
+            for( int i = 0; i < item->GetSublayersCount(); ++i )
+            {
+                BoardStackupDielectricProperties* props = dielectric->mutable_layer()->Add();
+                props->set_epsilon_r( item->GetEpsilonR( i ) );
+                props->set_loss_tangent( item->GetLossTangent( i ) );
+                props->set_material_name( item->GetMaterial( i ).ToUTF8() );
+                props->mutable_thickness()->set_value_nm( item->GetThickness( i ) );
+            }
+
+            break;
+        }
+
         default:
-            // TODO
             break;
         }
     }
@@ -457,7 +473,8 @@ void BOARD_STACKUP::Serialize( google::protobuf::Any& aContainer ) const
 
 bool BOARD_STACKUP::Deserialize( const google::protobuf::Any& aContainer )
 {
-    return true;
+    // Read-only for now
+    return false;
 }
 
 
diff --git a/qa/tests/api/test_api_enums.cpp b/qa/tests/api/test_api_enums.cpp
index 537b55c82f..2184f1348d 100644
--- a/qa/tests/api/test_api_enums.cpp
+++ b/qa/tests/api/test_api_enums.cpp
@@ -34,6 +34,7 @@
 // Board-specific
 #include <api/board/board_types.pb.h>
 #include <api/board/board_commands.pb.h>
+#include <board_stackup_manager/board_stackup.h>
 #include <padstack.h>
 #include <pcb_dimension.h>
 #include <pcb_track.h>
@@ -261,4 +262,9 @@ BOOST_AUTO_TEST_CASE( RatsnestDisplayMode )
     testEnums<RATSNEST_MODE, kiapi::board::commands::RatsnestDisplayMode>();
 }
 
+BOOST_AUTO_TEST_CASE( BoardStackupLayerType )
+{
+    testEnums<BOARD_STACKUP_ITEM_TYPE, kiapi::board::BoardStackupLayerType>();
+}
+
 BOOST_AUTO_TEST_SUITE_END()