diff --git a/libraries/base/ring/hdllib.cfg b/libraries/base/ring/hdllib.cfg
index 05ea894b803b961ed19893a98d196a74a6ab7730..71e708ef4e749402e72a83a5a6d30c2cf47ff99a 100644
--- a/libraries/base/ring/hdllib.cfg
+++ b/libraries/base/ring/hdllib.cfg
@@ -10,6 +10,7 @@ synth_files =
     src/vhdl/ring_lane_info.vhd
     src/vhdl/ring_tx.vhd
     src/vhdl/ring_rx.vhd
+    src/vhdl/ring_lane.vhd
 test_bench_files =
     tb/vhdl/tb_ring_lane_info.vhd
 
diff --git a/libraries/base/ring/src/vhdl/ring_lane.vhd b/libraries/base/ring/src/vhdl/ring_lane.vhd
new file mode 100644
index 0000000000000000000000000000000000000000..b6d9a7bbef957ad6421edbf665d8f69f54d3773e
--- /dev/null
+++ b/libraries/base/ring/src/vhdl/ring_lane.vhd
@@ -0,0 +1,178 @@
+-------------------------------------------------------------------------------
+--
+-- Copyright 2021
+-- ASTRON (Netherlands Institute for Radio Astronomy) <http://www.astron.nl/>
+-- P.O.Box 2, 7990 AA Dwingeloo, The Netherlands
+--
+-- Licensed under the Apache License, Version 2.0 (the "License");
+-- you may not use this file except in compliance with the License.
+-- You may obtain a copy of the License at
+--
+--     http://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing, software
+-- distributed under the License is distributed on an "AS IS" BASIS,
+-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+-- See the License for the specific language governing permissions and
+-- limitations under the License.
+--
+-------------------------------------------------------------------------------
+
+-------------------------------------------------------------------------------
+--
+-- Author: R. van der Walle
+
+-- Purpose: Implement the function of a complete ring lane by combining ring_lane/tx.
+-- Description: See https://support.astron.nl/confluence/x/jyu7Ag
+-- Remark:
+-- . Note that the dp_fifo_fill_eop in dp_block_validate_err cannot handle
+--   continues stream of blocks without a gap between blocks the dp_fifo_fill_eop 
+--   needs 1 cycle to process a block. Streaming without gaps may cause the fifo 
+--   to overflow. Bursts of blocks can be handled by increasing gvalidate_err_fifo_size.
+
+-------------------------------------------------------------------------------
+
+LIBRARY IEEE, common_lib, mm_lib, dp_lib;
+USE IEEE.STD_LOGIC_1164.ALL;
+USE common_lib.common_pkg.ALL;
+USE common_lib.common_mem_pkg.ALL;
+USE common_lib.common_field_pkg.ALL;
+USE dp_lib.dp_stream_pkg.ALL;
+USE work.ring_pkg.ALL;
+
+ENTITY ring_lane IS
+  GENERIC (
+    g_lane_direction            : NATURAL := 1;
+    g_lane_data_w               : NATURAL := 64;
+    g_lane_packet_length        : NATURAL := 1024; 
+    g_use_dp_layer              : BOOLEAN := TRUE;
+    g_nof_rx_monitors           : NATURAL := 0;
+    g_nof_tx_monitors           : NATURAL := 1;
+    g_err_bi                    : NATURAL := 0; -- ring_rx bit index in sosi.err field to set for wrongly sized packets 
+    g_nof_err_counts            : NATURAL := 1; -- nof counters to count the set err bits in range sosi.err(g_nof_err_counts-1 DOWNTO 0)
+    g_validate_err_fifo_size    : NATURAL := 1536; -- should be >= g_lane_packet_length
+    g_bsn_at_sync_check_channel : NATURAL := 1; -- on which channel should the bsn be checked
+    g_validate_channel          : BOOLEAN := TRUE;
+    g_validate_channel_mode     : STRING := ">"
+  );
+  PORT (
+    -- Clocks and reset
+    mm_rst : IN  STD_LOGIC;
+    mm_clk : IN  STD_LOGIC;
+
+    dp_clk : IN  STD_LOGIC;
+    dp_rst : IN  STD_LOGIC;
+
+    from_lane_sosi     : OUT t_dp_sosi;
+    to_lane_sosi       : IN  t_dp_sosi;
+    lane_rx_cable_sosi : IN  t_dp_sosi;
+    lane_rx_board_sosi : IN  t_dp_sosi;
+    lane_tx_cable_sosi : OUT t_dp_sosi;
+    lane_tx_board_sosi : OUT t_dp_sosi;
+    bs_sosi            : IN  t_dp_sosi;
+
+    reg_ring_lane_info_copi                : IN  t_mem_copi;
+    reg_ring_lane_info_cipo                : OUT t_mem_cipo;
+    reg_bsn_monitor_v2_ring_rx_copi        : IN  t_mem_copi;
+    reg_bsn_monitor_v2_ring_rx_cipo        : OUT t_mem_cipo;
+    reg_bsn_monitor_v2_ring_tx_copi        : IN  t_mem_copi;
+    reg_bsn_monitor_v2_ring_tx_cipo        : OUT t_mem_cipo;
+    reg_dp_block_validate_err_copi         : IN  t_mem_copi;
+    reg_dp_block_validate_err_cipo         : OUT t_mem_cipo;
+    reg_dp_block_validate_bsn_at_sync_copi : IN  t_mem_copi;
+    reg_dp_block_validate_bsn_at_sync_cipo : OUT t_mem_cipo;
+
+    ref_sync  : IN  STD_LOGIC; 
+    this_rn   : IN  STD_LOGIC_VECTOR(c_byte_w-1 DOWNTO 0);
+    N_rn      : IN  STD_LOGIC_VECTOR(c_byte_w-1 DOWNTO 0)
+  );
+END ring_lane;
+
+ARCHITECTURE str OF ring_lane IS
+
+  CONSTANT c_lane_direction : STD_LOGIC := sel_a_b(g_lane_direction, '1', '0');
+  SIGNAL lane_info : t_lane_info;
+
+BEGIN
+
+  u_ring_lane_info : ENTITY work.ring_lane_info
+  PORT MAP (
+    dp_rst => dp_rst,
+    dp_clk => dp_clk,
+
+    mm_rst => mm_rst,
+    mm_clk => mm_clk,
+
+    reg_mosi => reg_ring_lane_info_copi,
+    reg_miso => reg_ring_lane_info_cipo,
+
+    lane_direction => c_lane_direction,
+    lane_info => lane_info
+  );
+
+
+  u_ring_rx : ENTITY work.ring_rx
+  GENERIC MAP (
+    g_use_dp_layer    => g_use_dp_layer, 
+    g_lane_direction  => g_lane_direction, 
+    g_data_w          => g_lane_data_w, 
+    g_nof_rx_monitors => g_nof_rx_monitors, 
+    g_err_bi          => g_err_bi, 
+    g_block_size      => g_lane_packet_length, 
+    g_nof_err_counts  => g_nof_err_counts, 
+    g_fifo_size       => g_validate_err_fifo_size, 
+    g_check_channel   => g_bsn_at_sync_check_channel 
+  )
+  PORT MAP (
+    mm_rst => mm_rst,                 
+    mm_clk => mm_clk,                 
+    dp_clk => dp_clk,                 
+    dp_rst => dp_rst,                 
+                            
+    from_lane_sosi     => from_lane_sosi,     
+    lane_rx_cable_sosi => lane_rx_cable_sosi,     
+    lane_rx_board_sosi => lane_rx_board_sosi,     
+    bs_sosi            => bs_sosi,     
+                                           
+    reg_bsn_monitor_v2_copi                => reg_bsn_monitor_v2_ring_rx_copi,                
+    reg_bsn_monitor_v2_cipo                => reg_bsn_monitor_v2_ring_rx_cipo,                
+    reg_dp_block_validate_err_copi         => reg_dp_block_validate_err_copi,         
+    reg_dp_block_validate_err_cipo         => reg_dp_block_validate_err_cipo,         
+    reg_dp_block_validate_bsn_at_sync_copi => reg_dp_block_validate_bsn_at_sync_copi, 
+    reg_dp_block_validate_bsn_at_sync_cipo => reg_dp_block_validate_bsn_at_sync_cipo, 
+                                           
+    ref_sync  => ref_sync, -- bs_sosi.sync? 
+    rx_select => lane_info.rx_select, 
+    this_rn   => this_rn, 
+    N_rn      => N_rn 
+  );
+
+  u_ring_tx : ENTITY work.ring_tx
+  GENERIC MAP (
+    g_use_dp_layer    => g_use_dp_layer, 
+    g_lane_direction  => g_lane_direction, 
+    g_data_w          => g_lane_data_w, 
+    g_nof_tx_monitors => g_nof_tx_monitors, 
+    g_validate_channel=> g_validate_channel,
+    g_mode            => g_validate_channel_mode
+  )
+  PORT MAP (
+    mm_rst =>  mm_rst,                 
+    mm_clk =>  mm_clk,                 
+    dp_clk =>  dp_clk,                 
+    dp_rst =>  dp_rst,                 
+                            
+    to_lane_sosi       => to_lane_sosi,     
+    lane_tx_cable_sosi => lane_tx_cable_sosi,     
+    lane_tx_board_sosi => lane_tx_board_sosi,     
+                                           
+    reg_bsn_monitor_v2_copi => reg_bsn_monitor_v2_ring_tx_copi,                
+    reg_bsn_monitor_v2_cipo => reg_bsn_monitor_v2_ring_tx_cipo,                
+                                           
+    tx_select      => lane_info.tx_select,
+    remove_channel => lane_info.transport_nof_hops,
+    this_rn        => this_rn, 
+    N_rn           => N_rn 
+  );
+
+END str;
diff --git a/libraries/base/ring/src/vhdl/ring_rx.vhd b/libraries/base/ring/src/vhdl/ring_rx.vhd
index 7597142cc45c3d3cecb8bdf052d9e8880ea02e76..369cc84298942f58dbad751e5cd4a23cc7eba795 100644
--- a/libraries/base/ring/src/vhdl/ring_rx.vhd
+++ b/libraries/base/ring/src/vhdl/ring_rx.vhd
@@ -22,7 +22,7 @@
 --
 -- Author: R. van der Walle
 
--- Purpose: Handle TX side of ring design.
+-- Purpose: Handle RX side of ring design.
 -- Description: See https://support.astron.nl/confluence/x/jyu7Ag
 -- Remark:
 -- . Note that the dp_fifo_fill_eop in dp_block_validate_err cannot handle
diff --git a/libraries/base/ring/src/vhdl/ring_tx.vhd b/libraries/base/ring/src/vhdl/ring_tx.vhd
index 4e8d6c7d3ff2173ccc915aa0ce8182c2744c4459..deded34423aa5708da279a613f3b9239497d63ec 100644
--- a/libraries/base/ring/src/vhdl/ring_tx.vhd
+++ b/libraries/base/ring/src/vhdl/ring_tx.vhd
@@ -39,6 +39,7 @@ USE work.ring_pkg.ALL;
 ENTITY ring_tx IS
   GENERIC (
     g_lane_direction   : NATURAL := 1;
+    g_use_dp_layer     : BOOLEAN := TRUE;
     g_data_w           : NATURAL := 64;
     g_symbol_w         : NATURAL := 8;
     g_ring_pkt_type    : STD_LOGIC_VECTOR(c_halfword_w-1 DOWNTO 0) := c_ring_pkt_type_bf;
@@ -58,8 +59,8 @@ ENTITY ring_tx IS
     lane_tx_cable_sosi      : OUT t_dp_sosi;
     lane_tx_board_sosi      : OUT t_dp_sosi;
 
-    reg_bsn_monitor_v2_mosi : IN  t_mem_mosi;
-    reg_bsn_monitor_v2_miso : OUT t_mem_miso;
+    reg_bsn_monitor_v2_copi : IN  t_mem_copi;
+    reg_bsn_monitor_v2_cipo : OUT t_mem_cipo;
    
     tx_select               : IN  STD_LOGIC;
     remove_channel          : IN  STD_LOGIC_VECTOR(c_dp_stream_channel_w-1 DOWNTO 0);
@@ -72,10 +73,9 @@ ARCHITECTURE str OF ring_tx IS
 
   CONSTANT c_use_empty      : BOOLEAN := sel_a_b(g_symbol_w = g_data_w, FALSE, TRUE);
   CONSTANT c_empty_w        : NATURAL := ceil_log2(g_data_w / g_symbol_w);
-  CONSTANT c_use_dp_layer   : BOOLEAN := TRUE;
-  CONSTANT c_nof_hdr_fields : NATURAL := sel_a_b(c_use_dp_layer, c_ring_dp_nof_hdr_fields, c_ring_eth_nof_hdr_fields);
-  CONSTANT c_hdr_field_sel  : STD_LOGIC_VECTOR(c_nof_hdr_fields-1 DOWNTO 0)   := sel_a_b(c_use_dp_layer, c_ring_dp_hdr_field_sel, c_ring_eth_hdr_field_sel);
-  CONSTANT c_hdr_field_arr  : t_common_field_arr(c_nof_hdr_fields-1 DOWNTO 0) := sel_a_b(c_use_dp_layer, c_ring_dp_hdr_field_arr, c_ring_eth_hdr_field_arr);
+  CONSTANT c_nof_hdr_fields : NATURAL := sel_a_b(g_use_dp_layer, c_ring_dp_nof_hdr_fields, c_ring_eth_nof_hdr_fields);
+  CONSTANT c_hdr_field_sel  : STD_LOGIC_VECTOR(c_nof_hdr_fields-1 DOWNTO 0)   := sel_a_b(g_use_dp_layer, c_ring_dp_hdr_field_sel, c_ring_eth_hdr_field_sel);
+  CONSTANT c_hdr_field_arr  : t_common_field_arr(c_nof_hdr_fields-1 DOWNTO 0) := sel_a_b(g_use_dp_layer, c_ring_dp_hdr_field_arr, c_ring_eth_hdr_field_arr);
   CONSTANT c_fifo_size      : NATURAL := 5; -- Large enough to fit ETH/DP header.
 
   SIGNAL validated_sosi   : t_dp_sosi;
@@ -126,7 +126,7 @@ BEGIN
   hdr_fields_in(field_hi(c_hdr_field_arr, "eth_dst_mac"  ) DOWNTO field_lo(c_hdr_field_arr, "eth_dst_mac" )) <= c_ring_eth_dst_mac;
   hdr_fields_in(field_hi(c_hdr_field_arr, "eth_src_mac"  ) DOWNTO field_lo(c_hdr_field_arr, "eth_src_mac" )) <= c_ring_eth_src_mac;
   hdr_fields_in(field_hi(c_hdr_field_arr, "eth_type"     ) DOWNTO field_lo(c_hdr_field_arr, "eth_type"    )) <= g_ring_pkt_type;
-  gen_hdr_dp : IF c_use_dp_layer GENERATE
+  gen_hdr_dp : IF g_use_dp_layer GENERATE
     hdr_fields_in(field_hi(c_hdr_field_arr, "dp_channel" ) DOWNTO field_lo(c_hdr_field_arr, "dp_channel"  )) <= tx_sosi.channel(c_halfword_w-1 DOWNTO 0);
     hdr_fields_in(field_hi(c_hdr_field_arr, "dp_sync"    ) DOWNTO field_lo(c_hdr_field_arr, "dp_sync"     )) <= slv(tx_sosi.sync);
     hdr_fields_in(field_hi(c_hdr_field_arr, "dp_bsn"     ) DOWNTO field_lo(c_hdr_field_arr, "dp_bsn"      )) <= tx_sosi.bsn(62 DOWNTO 0);
@@ -189,7 +189,7 @@ BEGIN
   END PROCESS;
  
   -- BSN Monitors
-  gen_bsn_monitors : IF c_use_dp_layer GENERATE
+  gen_bsn_monitors : IF g_use_dp_layer GENERATE
     -- Convert nof_hops to source RN
     p_hop_to_src_rn: PROCESS(validated_sosi, this_rn, N_rn)
     BEGIN
@@ -216,8 +216,8 @@ BEGIN
     PORT MAP (
       mm_rst      => mm_rst,
       mm_clk      => mm_clk,
-      reg_mosi    => reg_bsn_monitor_v2_mosi,
-      reg_miso    => reg_bsn_monitor_v2_miso,
+      reg_mosi    => reg_bsn_monitor_v2_copi,
+      reg_miso    => reg_bsn_monitor_v2_cipo,
 
       dp_rst      => dp_rst,
       dp_clk      => dp_clk,