diff --git a/applications/disturb2/designs/disturb2_unb2b_station/src/vhdl/disturb2_unb2b_station.vhd b/applications/disturb2/designs/disturb2_unb2b_station/src/vhdl/disturb2_unb2b_station.vhd
index 5196dec8760d16e753405a7fcd2b0e70add4cb61..c5296dcf395df3dd9f0e7735c2e4b644d0107933 100644
--- a/applications/disturb2/designs/disturb2_unb2b_station/src/vhdl/disturb2_unb2b_station.vhd
+++ b/applications/disturb2/designs/disturb2_unb2b_station/src/vhdl/disturb2_unb2b_station.vhd
@@ -799,8 +799,9 @@ BEGIN
     ram_st_xsq_cipo                              => ram_st_xsq_cipo 
   );
 
+  -- Use gn_id = ID MOD 32, so map ID to 0:31 range (c_disturb_W_gn_id = 5)
+  gn_id <= ID(c_disturb_W_gn_id-1 DOWNTO 0);
 
-  gn_id    <= ID(c_disturb_W_gn_id-1 DOWNTO 0);
   -----------------------------------------------------------------------------
   -- disturb nodes
   -----------------------------------------------------------------------------
diff --git a/applications/disturb2/libraries/disturb/src/vhdl/disturb_info.vhd b/applications/disturb2/libraries/disturb/src/vhdl/disturb_info.vhd
index fb50b588a5d8195e86af0af60abdc43bcba33b16..87c09eda8b0fa95f9dd8a4975722bf9c3bf6de77 100644
--- a/applications/disturb2/libraries/disturb/src/vhdl/disturb_info.vhd
+++ b/applications/disturb2/libraries/disturb/src/vhdl/disturb_info.vhd
@@ -52,12 +52,11 @@ ENTITY disturb_info IS
     reg_miso           : OUT t_mem_miso;
 
     -- inputs from other blocks
-    gn_index           : IN NATURAL;
     f_adc              : IN STD_LOGIC;
     fsub_type          : IN STD_LOGIC;
 
     -- disturb info
-    disturb_info           : OUT t_disturb_info
+    disturb_info       : OUT t_disturb_info
   );
 END disturb_info;
 
diff --git a/applications/disturb2/libraries/disturb/src/vhdl/disturb_pkg.vhd b/applications/disturb2/libraries/disturb/src/vhdl/disturb_pkg.vhd
index d9a2456e73639ff491f4f01134575cef5f1deaa8..e8764f458cc2e131c1b1313830b9c6d457083138 100644
--- a/applications/disturb2/libraries/disturb/src/vhdl/disturb_pkg.vhd
+++ b/applications/disturb2/libraries/disturb/src/vhdl/disturb_pkg.vhd
@@ -95,7 +95,7 @@ PACKAGE disturb_pkg is
   CONSTANT c_disturb_W_crosslet                : NATURAL := 16;
   CONSTANT c_disturb_W_beamlet_sum             : NATURAL := 18;
   CONSTANT c_disturb_W_beamlet                 : NATURAL := 8;
-  CONSTANT c_disturb_W_gn_id                   : NATURAL := 5;
+  CONSTANT c_disturb_W_gn_id                   : NATURAL := 5;  -- Use gn_id = ID MOD 32, so map ID to 0:31 range (2**5 = 32)
   CONSTANT c_disturb_W_statistic               : NATURAL := 64;
   CONSTANT c_disturb_W_statistic_sz            : NATURAL := 2;   -- = c_disturb_W_statistic / c_word_w
   CONSTANT c_disturb_W_sub_weight              : NATURAL := 16;  -- = w in s(w, p), s = signed
@@ -183,8 +183,9 @@ PACKAGE disturb_pkg is
   --   https://git.astron.nl/desp/hdl/-/blob/master/boards/uniboard2b/libraries/unb2b_board/src/vhdl/ctrl_unb2b_board.vhd
 
   -- Can use same offload time for all statistics, because 1GbE mux will combine them
+  -- see https://support.astron.nl/confluence/display/L2M/L3+SDP+Testing+Notebook%3A+Statistics+offload
   --CONSTANT c_disturb_offload_time : NATURAL := 13000;  -- from wave window 62855nS / 5nS = 12571 cycles.
-  CONSTANT c_disturb_offload_time : NATURAL := 600000;  -- see L2SDP-452
+  CONSTANT c_disturb_offload_time : NATURAL := 600000;  -- 600000 * 5 ns = 3 ms, so gn 31 starts after 93 ms
 
   -- packet lengths, see ICD SC-SDP
   CONSTANT c_disturb_nof_bytes_per_statistic : NATURAL := 8;  -- c_disturb_W_statistic_sz * c_word_sz = 2 * 4 = 8
diff --git a/applications/disturb2/libraries/disturb/src/vhdl/disturb_station.vhd b/applications/disturb2/libraries/disturb/src/vhdl/disturb_station.vhd
index 40ae21aa8c68a9bc1c324c864f869850f8113192..76da0893816500eec9b755aa0fc7467902cc037b 100644
--- a/applications/disturb2/libraries/disturb/src/vhdl/disturb_station.vhd
+++ b/applications/disturb2/libraries/disturb/src/vhdl/disturb_station.vhd
@@ -409,8 +409,9 @@ ARCHITECTURE str OF disturb_station IS
   CONSTANT c_ring_1_if_offset          : NATURAL := 2; -- RING_1 signals are indexed at c_nof_if * I + 2.
   CONSTANT c_nof_mac                   : NATURAL := 12; -- Using 9 out of 12 (this is NOT optimized away during synthesis), must match one of the MAC IP variations, e.g. 1, 3, 4, 12, 24, 48
 
-  SIGNAL gn_index : NATURAL := 0;
-  SIGNAL this_rn  : STD_LOGIC_VECTOR(c_byte_w-1 DOWNTO 0);  
+  SIGNAL gn_index : NATURAL := 0;  -- range 0:31 (c_disturb_W_gn_id = 5)
+  SIGNAL this_rn  : STD_LOGIC_VECTOR(c_byte_w-1 DOWNTO 0);
+
   ----------------------------------------------
   -- BF 
   ----------------------------------------------
@@ -538,16 +539,16 @@ ARCHITECTURE str OF disturb_station IS
   SIGNAL bst_udp_src_port                  : STD_LOGIC_VECTOR(c_network_udp_port_w-1 DOWNTO 0);
   SIGNAL xst_udp_src_port                  : STD_LOGIC_VECTOR(c_network_udp_port_w-1 DOWNTO 0);
 
-  SIGNAL disturb_info                          : t_disturb_info := c_disturb_info_rst;
+  SIGNAL disturb_info                      : t_disturb_info := c_disturb_info_rst;
   SIGNAL ring_info                         : t_ring_info;
 
-
 BEGIN
 
+  gn_index <= TO_UINT(gn_id);
+
   -----------------------------------------------------------------------------
   -- SDP Info register
   -----------------------------------------------------------------------------
-  gn_index <= TO_UINT(gn_id);
   -- derive MAC, IP and UDP Port 
   cep_eth_src_mac  <= c_disturb_cep_eth_src_mac_47_16 & RESIZE_UVEC(this_bck_id, c_byte_w) & RESIZE_UVEC(this_chip_id, c_byte_w); -- Simply use chip_id since we only use 1 of the 6*4 = 24 10GbE port.
   cep_ip_src_addr  <= c_disturb_cep_ip_src_addr_31_16 & RESIZE_UVEC(this_bck_id, c_byte_w) & INCR_UVEC(RESIZE_UVEC(this_chip_id, c_byte_w), 1); -- +1 to avoid IP = *.*.*.0
@@ -572,7 +573,6 @@ BEGIN
     reg_miso  => reg_disturb_info_cipo,
 
     -- inputs from other blocks
-    gn_index  => gn_index, 
     f_adc     => c_f_adc, 
     fsub_type => c_fsub_type, 
 
@@ -584,6 +584,9 @@ BEGIN
   -- Ring info
   -----------------------------------------------------------------------------
   u_ring_info : ENTITY ring_lib.ring_info
+  GENERIC MAP  (
+    g_ring_info_O_rn_w => c_disturb_W_gn_id  -- wrap O_rn to gn_index range
+  )
   PORT MAP (
     mm_rst => mm_rst,
     mm_clk => mm_clk,
diff --git a/applications/disturb2/libraries/disturb/tb/vhdl/tb_disturb_info.vhd b/applications/disturb2/libraries/disturb/tb/vhdl/tb_disturb_info.vhd
index d73b62312ae3d9e2bfd8ff35ad65fa77c925d475..eb3706b84b91e7187117f873714a51f846b0de89 100644
--- a/applications/disturb2/libraries/disturb/tb/vhdl/tb_disturb_info.vhd
+++ b/applications/disturb2/libraries/disturb/tb/vhdl/tb_disturb_info.vhd
@@ -72,7 +72,6 @@ ARCHITECTURE tb OF tb_disturb_info IS
   SIGNAL reg_miso            : t_mem_miso;
 
   -- signals used to change settings of disturb_info 
-  SIGNAL gn_index  : NATURAL   := 15; 
   SIGNAL f_adc     : STD_LOGIC := '0'; 
   SIGNAL fsub_type : STD_LOGIC := '0';
 
@@ -225,7 +224,6 @@ BEGIN
       reg_mosi  => reg_mosi,
       reg_miso  => reg_miso,
 
-      gn_index  => gn_index,
       f_adc     => f_adc,
       fsub_type => fsub_type,
 
diff --git a/applications/lofar2/designs/lofar2_unb2b_ring/src/vhdl/lofar2_unb2b_ring.vhd b/applications/lofar2/designs/lofar2_unb2b_ring/src/vhdl/lofar2_unb2b_ring.vhd
index 8d69605e8dea2e6d33de389dbcc854503753b70f..d6d240b2e8f67554150a3daab9bf2d7684bbe314 100644
--- a/applications/lofar2/designs/lofar2_unb2b_ring/src/vhdl/lofar2_unb2b_ring.vhd
+++ b/applications/lofar2/designs/lofar2_unb2b_ring/src/vhdl/lofar2_unb2b_ring.vhd
@@ -750,6 +750,7 @@ BEGIN
     ring_info => ring_info
   );
 
+  -- Use full c_byte_w range of ID for gn_index and ring_info.O_rn
   gn_index <= TO_UINT(ID);
   this_rn <= TO_UVEC(gn_index - TO_UINT(ring_info.O_rn), c_byte_w) WHEN rising_edge(dp_clk); -- Using register to ease timing closure.
 
diff --git a/applications/lofar2/designs/lofar2_unb2b_sdp_station/src/vhdl/lofar2_unb2b_sdp_station.vhd b/applications/lofar2/designs/lofar2_unb2b_sdp_station/src/vhdl/lofar2_unb2b_sdp_station.vhd
index ed8aa99838b2caecf441bcca6ed632ee80d56b38..a5f605b3520af98c62aa61a552bad970cc807c3a 100644
--- a/applications/lofar2/designs/lofar2_unb2b_sdp_station/src/vhdl/lofar2_unb2b_sdp_station.vhd
+++ b/applications/lofar2/designs/lofar2_unb2b_sdp_station/src/vhdl/lofar2_unb2b_sdp_station.vhd
@@ -797,7 +797,9 @@ BEGIN
   );
 
 
-  gn_id    <= ID(c_sdp_W_gn_id-1 DOWNTO 0);
+  -- Use gn_id = ID MOD 32, so map ID to 0:31 range (c_sdp_W_gn_id = 5)
+  gn_id <= ID(c_sdp_W_gn_id-1 DOWNTO 0);
+
   -----------------------------------------------------------------------------
   -- sdp nodes
   -----------------------------------------------------------------------------
diff --git a/applications/lofar2/designs/lofar2_unb2c_ring/src/vhdl/lofar2_unb2c_ring.vhd b/applications/lofar2/designs/lofar2_unb2c_ring/src/vhdl/lofar2_unb2c_ring.vhd
index ef5867134bb4f7251ee7b4fb0a0ae828cac3bdb4..11260553a0c6d9c0f8c4ebf6b505072db71ab067 100644
--- a/applications/lofar2/designs/lofar2_unb2c_ring/src/vhdl/lofar2_unb2c_ring.vhd
+++ b/applications/lofar2/designs/lofar2_unb2c_ring/src/vhdl/lofar2_unb2c_ring.vhd
@@ -716,6 +716,7 @@ BEGIN
     ring_info => ring_info
   );
 
+  -- Use full c_byte_w range of ID for gn_index and ring_info.O_rn
   gn_index <= TO_UINT(ID);
   this_rn <= TO_UVEC(gn_index - TO_UINT(ring_info.O_rn), c_byte_w) WHEN rising_edge(dp_clk); -- Using register to ease timing closure.
 
diff --git a/applications/lofar2/designs/lofar2_unb2c_sdp_station/src/vhdl/lofar2_unb2c_sdp_station.vhd b/applications/lofar2/designs/lofar2_unb2c_sdp_station/src/vhdl/lofar2_unb2c_sdp_station.vhd
index b4b4601ea9be41cef8a0cf7262862d7bc412fe5f..1ef4c3b4ab9444431c638f49ef5a2d7289010c23 100644
--- a/applications/lofar2/designs/lofar2_unb2c_sdp_station/src/vhdl/lofar2_unb2c_sdp_station.vhd
+++ b/applications/lofar2/designs/lofar2_unb2c_sdp_station/src/vhdl/lofar2_unb2c_sdp_station.vhd
@@ -763,8 +763,9 @@ BEGIN
     ram_st_xsq_cipo                              => ram_st_xsq_cipo 
   );
 
+  -- Use gn_id = ID MOD 32, so map ID to 0:31 range (c_sdp_W_gn_id = 5)
+  gn_id <= ID(c_sdp_W_gn_id-1 DOWNTO 0);
 
-  gn_id    <= ID(c_sdp_W_gn_id-1 DOWNTO 0);
   -----------------------------------------------------------------------------
   -- sdp nodes
   -----------------------------------------------------------------------------
diff --git a/applications/lofar2/libraries/sdp/src/vhdl/node_sdp_beamformer.vhd b/applications/lofar2/libraries/sdp/src/vhdl/node_sdp_beamformer.vhd
index b1972f74aa3ad94953a3dcdb1587725903982b5c..e94ce343eca19537f3c2d7b261c7f9e187b5471d 100644
--- a/applications/lofar2/libraries/sdp/src/vhdl/node_sdp_beamformer.vhd
+++ b/applications/lofar2/libraries/sdp/src/vhdl/node_sdp_beamformer.vhd
@@ -132,11 +132,14 @@ ARCHITECTURE str OF node_sdp_beamformer IS
   SIGNAL scope_bf_out_sosi_arr   : t_dp_sosi_integer_arr(c_sdp_N_pol_bf-1 DOWNTO 0);
   SIGNAL beamlet_scale           : STD_LOGIC_VECTOR(c_sdp_W_beamlet_scale-1 DOWNTO 0);
   
-  SIGNAL rn_index              : NATURAL RANGE 0 TO c_sdp_N_pn_max-1 := 0;
+  SIGNAL rn_index                : NATURAL RANGE 0 TO c_sdp_N_pn_max-1 := 0;
+  SIGNAL ref_sync                : STD_LOGIC;
 
 BEGIN
 
-  rn_index <= TO_UINT(SUB_UVEC(gn_id, ring_info.O_rn)) WHEN rising_edge(dp_clk); -- Using register to ease timing closure.
+  -- Use register to ease timing closure.
+  rn_index <= TO_UINT(SUB_UVEC(gn_id, ring_info.O_rn)) WHEN rising_edge(dp_clk);
+  ref_sync <= in_sosi_arr(0).sync WHEN rising_edge(dp_clk);
 
   ---------------------------------------------------------------
   -- Beamlet Subband Select 
@@ -297,7 +300,7 @@ BEGIN
     -- Streaming clock domain
     dp_rst         => dp_rst,
     dp_clk         => dp_clk,
-    ref_sync       => mon_bf_udp_sosi.sync, 
+    ref_sync       => ref_sync,
 
     in_sosi_arr(0) => mon_bf_udp_sosi
   );
diff --git a/applications/lofar2/libraries/sdp/src/vhdl/node_sdp_correlator.vhd b/applications/lofar2/libraries/sdp/src/vhdl/node_sdp_correlator.vhd
index d7467674f8b7a78d568da9ea681077fe0a62cde1..56b2b2c35ba01da8bc9f60d83683b7eed9e28b71 100644
--- a/applications/lofar2/libraries/sdp/src/vhdl/node_sdp_correlator.vhd
+++ b/applications/lofar2/libraries/sdp/src/vhdl/node_sdp_correlator.vhd
@@ -485,8 +485,8 @@ BEGIN
     sdp_info       => sdp_info,
     weighted_subbands_flag => '1',  -- because XSub uses in_sosi_arr = fsub_sosi_arr, so weighted subbands
 
-    nof_crosslets      => nof_crosslets,
-    crosslets_info_rec => prev_crosslets_info_rec
+    nof_crosslets           => nof_crosslets,  -- from MM
+    prev_crosslets_info_rec => prev_crosslets_info_rec
   );
 
 END str;
diff --git a/applications/lofar2/libraries/sdp/src/vhdl/sdp_crosslets_subband_select.vhd b/applications/lofar2/libraries/sdp/src/vhdl/sdp_crosslets_subband_select.vhd
index 2e9acfb004d6e586a1e032f21cabccc6994b5646..3873d035fc0fd618afe26587fcd3a27ea9f8de0b 100644
--- a/applications/lofar2/libraries/sdp/src/vhdl/sdp_crosslets_subband_select.vhd
+++ b/applications/lofar2/libraries/sdp/src/vhdl/sdp_crosslets_subband_select.vhd
@@ -33,9 +33,12 @@
 --   The prev_crosslets_info identifies the crosslets that were calculated
 --   during the previous out_sosi.sync interval, so the XST for those crosslets
 --   are then pending to be offloaded.
--- * The new_interval is active before the first out_sosi.sync and inactive
---   before the next out_sosi.sync, so it can be used to know when a new
---   sequence of out_sosi.sync intervals starts.
+-- * The new_interval is active during the first in_sosi_arr.sync interval. The
+--   out_sosi.sync is active one sop period after the in_sosi_arr.sync. Hence
+--   the new_interval is active about one block before the first out_sosi.sync
+--   and inactive about one block before the next out_sosi.sync, so
+--   new_interval can be used to know when a new sequence of out_sosi.sync
+--   intervals starts.
 -- Remark:
 -- . See L5 SDPFW Design Document: Subband Correlator
 --   Link: https://support.astron.nl/confluence/pages/viewpage.action?spaceKey=L2M&title=L5+SDPFW+Design+Document%3A+Subband+Correlator
diff --git a/applications/lofar2/libraries/sdp/src/vhdl/sdp_info.vhd b/applications/lofar2/libraries/sdp/src/vhdl/sdp_info.vhd
index 1e8aa33621e61ec599f4068f2e75a1e0be9bc327..9a81eccb020d86a917b979b79c36702519bd4a86 100644
--- a/applications/lofar2/libraries/sdp/src/vhdl/sdp_info.vhd
+++ b/applications/lofar2/libraries/sdp/src/vhdl/sdp_info.vhd
@@ -52,7 +52,6 @@ ENTITY sdp_info IS
     reg_miso           : OUT t_mem_miso;
 
     -- inputs from other blocks
-    gn_index           : IN NATURAL;
     f_adc              : IN STD_LOGIC;
     fsub_type          : IN STD_LOGIC;
 
diff --git a/applications/lofar2/libraries/sdp/src/vhdl/sdp_pkg.vhd b/applications/lofar2/libraries/sdp/src/vhdl/sdp_pkg.vhd
index 1f392030b12ec07086cbf4db03e3f304d44545a5..8435ef4163ca221cb5376635be90f1760e96bfe9 100644
--- a/applications/lofar2/libraries/sdp/src/vhdl/sdp_pkg.vhd
+++ b/applications/lofar2/libraries/sdp/src/vhdl/sdp_pkg.vhd
@@ -94,7 +94,7 @@ PACKAGE sdp_pkg is
   CONSTANT c_sdp_W_crosslet                : NATURAL := 16;
   CONSTANT c_sdp_W_beamlet_sum             : NATURAL := 18;
   CONSTANT c_sdp_W_beamlet                 : NATURAL := 8;
-  CONSTANT c_sdp_W_gn_id                   : NATURAL := 5;
+  CONSTANT c_sdp_W_gn_id                   : NATURAL := 5;  -- Use gn_id = ID MOD 32, so map ID to 0:31 range (2**5 = 32)
   CONSTANT c_sdp_W_statistic               : NATURAL := 64;
   CONSTANT c_sdp_W_statistic_sz            : NATURAL := 2;   -- = c_sdp_W_statistic / c_word_w
   CONSTANT c_sdp_W_sub_weight              : NATURAL := 16;  -- = w in s(w, p), s = signed
@@ -189,8 +189,9 @@ PACKAGE sdp_pkg is
   --   https://git.astron.nl/desp/hdl/-/blob/master/boards/uniboard2b/libraries/unb2b_board/src/vhdl/ctrl_unb2b_board.vhd
 
   -- Can use same offload time for all statistics, because 1GbE mux will combine them
+  -- see https://support.astron.nl/confluence/display/L2M/L3+SDP+Testing+Notebook%3A+Statistics+offload
   --CONSTANT c_sdp_offload_time : NATURAL := 13000;  -- from wave window 62855nS / 5nS = 12571 cycles.
-  CONSTANT c_sdp_offload_time : NATURAL := 600000;  -- see L2SDP-452
+  CONSTANT c_sdp_offload_time : NATURAL := 600000;  -- 600000 * 5 ns = 3 ms, so gn 31 starts after 93 ms
 
   -- packet lengths, see ICD SC-SDP
   CONSTANT c_sdp_nof_bytes_per_statistic : NATURAL := 8;  -- c_sdp_W_statistic_sz * c_word_sz = 2 * 4 = 8
diff --git a/applications/lofar2/libraries/sdp/src/vhdl/sdp_station.vhd b/applications/lofar2/libraries/sdp/src/vhdl/sdp_station.vhd
index 7455fcaf62c5127110fd4ff974b0c1d6a6187b3d..9260356e07c5ae4dc0ae0cb67188bfc601653dc5 100644
--- a/applications/lofar2/libraries/sdp/src/vhdl/sdp_station.vhd
+++ b/applications/lofar2/libraries/sdp/src/vhdl/sdp_station.vhd
@@ -65,9 +65,9 @@ ENTITY sdp_station IS
     dp_clk        : IN STD_LOGIC;
 
     -- ID
-    gn_id         : IN STD_LOGIC_VECTOR(c_sdp_W_gn_id-1 DOWNTO 0);
-    this_bck_id   : IN STD_LOGIC_VECTOR(6-1 DOWNTO 0);
-    this_chip_id  : IN STD_LOGIC_VECTOR(2-1 DOWNTO 0);
+    gn_id         : IN STD_LOGIC_VECTOR(c_sdp_W_gn_id-1 DOWNTO 0);  -- used for udp src port
+    this_bck_id   : IN STD_LOGIC_VECTOR(6-1 DOWNTO 0);  -- used for src mac / ip
+    this_chip_id  : IN STD_LOGIC_VECTOR(2-1 DOWNTO 0);  -- used for src mac / ip
 
     -- Transceiver clocks
     SA_CLK        : IN    STD_LOGIC := '0'; -- Clock 10GbE front (qsfp) and ring lines
@@ -421,7 +421,7 @@ ARCHITECTURE str OF sdp_station IS
   CONSTANT c_ring_1_if_offset          : NATURAL := 2; -- RING_1 signals are indexed at c_nof_if * I + 2.
   CONSTANT c_ring_nof_mac              : NATURAL := 12; -- Using 9 out of 12 (this is NOT optimized away during synthesis), must match one of the MAC IP variations, e.g. 1, 3, 4, 12, 24, 48
 
-  SIGNAL gn_index                   : NATURAL := 0;
+  SIGNAL gn_index                   : NATURAL := 0;  -- range 0:31 (c_sdp_W_gn_id = 5)
   SIGNAL this_rn                    : STD_LOGIC_VECTOR(c_byte_w-1 DOWNTO 0);
 
   SIGNAL sdp_info                   : t_sdp_info := c_sdp_info_rst;
@@ -559,10 +559,11 @@ ARCHITECTURE str OF sdp_station IS
 
 BEGIN
 
+  gn_index <= TO_UINT(gn_id);
+
   -----------------------------------------------------------------------------
   -- SDP Info register
   -----------------------------------------------------------------------------
-  gn_index <= TO_UINT(gn_id);
   -- derive MAC, IP and UDP Port 
   cep_eth_src_mac  <= c_sdp_cep_eth_src_mac_47_16 & RESIZE_UVEC(this_bck_id, c_byte_w) & RESIZE_UVEC(this_chip_id, c_byte_w); -- Simply use chip_id since we only use 1 of the 6*4 = 24 10GbE port.
   cep_ip_src_addr  <= c_sdp_cep_ip_src_addr_31_16 & RESIZE_UVEC(this_bck_id, c_byte_w) & INCR_UVEC(RESIZE_UVEC(this_chip_id, c_byte_w), 1); -- +1 to avoid IP = *.*.*.0
@@ -587,7 +588,6 @@ BEGIN
     reg_miso  => reg_sdp_info_cipo,
 
     -- inputs from other blocks
-    gn_index  => gn_index, 
     f_adc     => c_f_adc, 
     fsub_type => c_fsub_type, 
 
@@ -599,6 +599,9 @@ BEGIN
   -- Ring info
   -----------------------------------------------------------------------------
   u_ring_info : ENTITY ring_lib.ring_info
+  GENERIC MAP  (
+    g_ring_info_O_rn_w => c_sdp_W_gn_id  -- wrap O_rn to gn_index range
+  )
   PORT MAP (
     mm_rst => mm_rst,
     mm_clk => mm_clk,
diff --git a/applications/lofar2/libraries/sdp/src/vhdl/sdp_statistics_offload.vhd b/applications/lofar2/libraries/sdp/src/vhdl/sdp_statistics_offload.vhd
index b9815e98407b87317b19f63ed24da1f6c0b7fc98..40a078a306a943b1d30d856ab94704e7f9c16331 100644
--- a/applications/lofar2/libraries/sdp/src/vhdl/sdp_statistics_offload.vhd
+++ b/applications/lofar2/libraries/sdp/src/vhdl/sdp_statistics_offload.vhd
@@ -84,13 +84,13 @@
 --   BST           (Xh,  Xl), (Yh,  Yl),     2   keep X, Y parts order
 --   XST           (Rh,  Rl), (Ih,  Il),     2   keep Re, Im parts order
 --
--- . g_P_sq and nof_used_P_sq
+-- . g_P_sq and p.nof_used_P_sq
 --   The g_P_sq defines the number of correlator cells that is available in
 --   the SDPFW. Use generic to support P_sq = 1 for one node and P_sq =
 --   c_sdp_P_sq for multiple nodes (with ring).
---   The nof_used_P_sq is the number of correlator cells that is actually
+--   The p.nof_used_P_sq is the number of correlator cells that is actually
 --   used and that will output XST packets. Unused correlator cells yield
---   zero data that should not be output. The nof_used_P_sq is the smallest
+--   zero data that should not be output. The p.nof_used_P_sq is the smallest
 --   of g_P_sq and ring_info.N_rn/2 + 1. In this way the XST offload can work
 --   with g_P_sq = 1 when N_rn > 1 and also in a ring with N_rn < N_pn when
 --   g_P_sq = 9.
@@ -158,8 +158,8 @@ ENTITY sdp_statistics_offload IS
     sdp_info                : IN t_sdp_info;
     weighted_subbands_flag  : IN STD_LOGIC := '0';
 
-    nof_crosslets           : IN STD_LOGIC_VECTOR(c_sdp_nof_crosslets_reg_w-1 DOWNTO 0) := (OTHERS => '0');
-    crosslets_info_rec      : IN t_sdp_crosslets_info := c_sdp_crosslets_info_rst
+    nof_crosslets           : IN STD_LOGIC_VECTOR(c_sdp_nof_crosslets_reg_w-1 DOWNTO 0) := (OTHERS => '0');  -- from MM
+    prev_crosslets_info_rec : IN t_sdp_crosslets_info := c_sdp_crosslets_info_rst
   );
 END sdp_statistics_offload;
 
@@ -185,43 +185,57 @@ ARCHITECTURE str OF sdp_statistics_offload IS
   CONSTANT c_mm_nof_data               : NATURAL := func_sdp_get_stat_from_mm_nof_data(g_statistics_type);
   CONSTANT c_mm_ram_size               : NATURAL := c_mm_nof_data * c_mm_data_size * c_nof_packets_max;
 
-  -- offload control
+  -- Parameters that are fixed per node
+  TYPE t_parameters IS RECORD
+    gn_index             : NATURAL;  -- index of this global node
+    pn_index             : NATURAL;  -- index of this node in antenna band
+    rn_index             : NATURAL;  -- index of this ring node
+    local_si_offset      : NATURAL;  -- index of first signal input on this node
+    remote_rn            : NATURAL;  -- index of remote ring node
+    remote_gn            : NATURAL;  -- index of remote global node
+    remote_pn            : NATURAL;  -- index of remote node in antenna band
+    remote_si_offset     : NATURAL;  -- index of first signal input on remote node
+    nof_cycles_dly       : NATURAL;  -- trigger_offload delay for this node
+    offset_rn            : NATURAL;  -- = ring_info.O_rn, GN index of first ring node
+    nof_rn               : NATURAL;  -- = ring_info.N_rn, number of GN in the ring
+    nof_used_P_sq        : NATURAL;  -- number of used correlator cells <= g_P_sq (is number of available correlator cells)
+  END RECORD;
+
+  -- Input capture per sync interval
+  TYPE t_input IS RECORD
+    nof_crosslets        : NATURAL RANGE 0 TO c_sdp_N_crosslets_max;  -- nof_crosslets from MM
+    nof_packets          : NATURAL;  -- nof XST offload packets per integration interval dependend on nof_crosslets
+    bsn_at_sync          : STD_LOGIC_VECTOR(c_dp_stream_bsn_w-1 DOWNTO 0);
+    integration_interval : NATURAL;
+    crosslets_info_rec   : t_sdp_crosslets_info;
+    sop_cnt              : NATURAL;
+    payload_err          : STD_LOGIC;
+  END RECORD;
+
+  -- Offload control
   TYPE t_reg IS RECORD
     packet_count         : NATURAL RANGE 0 TO c_nof_packets_max;
     start_address        : NATURAL RANGE 0 TO c_mm_ram_size;
     start_pulse          : STD_LOGIC;
     start_sync           : STD_LOGIC;
     dp_header_info       : STD_LOGIC_VECTOR(1023 DOWNTO 0);
-    payload_err          : STD_LOGIC;
-    in_sop_cnt           : NATURAL;
-    integration_interval : NATURAL;
     interleave_count     : NATURAL RANGE 0 TO c_sdp_Q_fft;
     interleave_address   : NATURAL RANGE 0 TO c_mm_ram_size;
     crosslet_count       : NATURAL RANGE 0 TO c_sdp_N_crosslets_max;
     instance_count       : NATURAL RANGE 0 TO c_sdp_P_sq;
     instance_address     : NATURAL RANGE 0 TO c_mm_ram_size;
-    nof_crosslets        : NATURAL RANGE 0 TO c_sdp_N_crosslets_max;
-    crosslets_info_rec   : t_sdp_crosslets_info;
   END RECORD;
 
-  CONSTANT c_reg_rst : t_reg := (0, 0, '0', '0', (OTHERS => '0'), '0', 0, 0, 0, 0, 0, 0, 0, 0, c_sdp_crosslets_info_rst);
-
-  SIGNAL r     : t_reg;
-  SIGNAL nxt_r : t_reg;
-
-  SIGNAL gn_index_reg             : NATURAL;  -- index of this global node
-  SIGNAL pn_index                 : NATURAL;  -- index of this node in antenna band
-  SIGNAL rn_index                 : NATURAL;  -- index of this ring node
-  SIGNAL local_si_offset          : NATURAL;  -- index of first signal input on this node
-  SIGNAL remote_rn                : NATURAL;  -- index of remote ring node
-  SIGNAL remote_gn                : NATURAL;  -- index of remote global node
-  SIGNAL remote_pn                : NATURAL;  -- index of remote node in antenna band
-  SIGNAL remote_si_offset         : NATURAL;  -- index of first signal input on remote node
-  SIGNAL nof_cycles_dly           : NATURAL;  -- trigger_offload delay for this node
-  SIGNAL offset_rn                : NATURAL;  -- = ring_info.O_rn, GN index of first ring node
-  SIGNAL nof_rn                   : NATURAL;  -- = ring_info.N_rn, number of GN in the ring
-  SIGNAL nof_used_P_sq            : NATURAL;  -- number of used correlator cells <= g_P_sq (is number of available correlator cells)
-  SIGNAL nof_packets              : NATURAL;  -- nof XST offload packets per integration interval
+  CONSTANT c_reg_rst : t_reg := (0, 0, '0', '0', (OTHERS => '0'), 0, 0, 0, 0, 0);
+
+  SIGNAL p                        : t_parameters;
+
+  SIGNAL reg_input                : t_input;
+  SIGNAL prev_input               : t_input;
+  SIGNAL hdr_input                : t_input;
+
+  SIGNAL r                        : t_reg;
+  SIGNAL nxt_r                    : t_reg;
 
   SIGNAL data_id_rec              : t_sdp_stat_data_id;
   SIGNAL data_id_slv              : STD_LOGIC_VECTOR(31 DOWNTO 0) := (OTHERS => '0');
@@ -239,7 +253,6 @@ ARCHITECTURE str OF sdp_statistics_offload IS
 
   SIGNAL udp_sosi                 : t_dp_sosi;
 
-  SIGNAL bsn_at_sync              : STD_LOGIC_VECTOR(c_dp_stream_bsn_w-1 DOWNTO 0) := (OTHERS => '0');
   SIGNAL dp_header_info           : STD_LOGIC_VECTOR(1023 DOWNTO 0):= (OTHERS => '0');
   SIGNAL r_dp_header_sop          : STD_LOGIC;
   SIGNAL r_dp_header_rec          : t_sdp_stat_header;
@@ -258,8 +271,6 @@ ARCHITECTURE str OF sdp_statistics_offload IS
 
 BEGIN
 
-  bsn_at_sync <= RESIZE_UVEC(in_sosi.bsn, c_dp_stream_bsn_w) WHEN rising_edge(dp_clk) AND in_sosi.sync = '1';
-
   -------------------------------------------------------------------------------
   -- Assemble offload header info, for data path fields that are selected by:
   --   c_sdp_stat_hdr_field_sel = "1"&"101"&"111011111001"&"0100"&"0100"&"000000010"&"1000000"&"0"
@@ -300,17 +311,17 @@ BEGIN
   dp_header_info(field_hi(c_sdp_stat_hdr_field_arr, "sdp_source_info_nyquist_zone_id"         ) DOWNTO field_lo(c_sdp_stat_hdr_field_arr,  "sdp_source_info_nyquist_zone_id"         )) <= sdp_info.nyquist_zone_index;
   dp_header_info(field_hi(c_sdp_stat_hdr_field_arr, "sdp_source_info_f_adc"                   ) DOWNTO field_lo(c_sdp_stat_hdr_field_arr,  "sdp_source_info_f_adc"                   )) <= SLV(sdp_info.f_adc);
   dp_header_info(field_hi(c_sdp_stat_hdr_field_arr, "sdp_source_info_fsub_type"               ) DOWNTO field_lo(c_sdp_stat_hdr_field_arr,  "sdp_source_info_fsub_type"               )) <= SLV(sdp_info.fsub_type);
-  dp_header_info(field_hi(c_sdp_stat_hdr_field_arr, "sdp_source_info_payload_error"           ) DOWNTO field_lo(c_sdp_stat_hdr_field_arr,  "sdp_source_info_payload_error"           )) <= SLV(r.payload_err);
+  dp_header_info(field_hi(c_sdp_stat_hdr_field_arr, "sdp_source_info_payload_error"           ) DOWNTO field_lo(c_sdp_stat_hdr_field_arr,  "sdp_source_info_payload_error"           )) <= SLV(hdr_input.payload_err);
   dp_header_info(field_hi(c_sdp_stat_hdr_field_arr, "sdp_source_info_beam_repositioning_flag" ) DOWNTO field_lo(c_sdp_stat_hdr_field_arr,  "sdp_source_info_beam_repositioning_flag" )) <= SLV(sdp_info.beam_repositioning_flag);
   dp_header_info(field_hi(c_sdp_stat_hdr_field_arr, "sdp_source_info_weighted_subbands_flag"  ) DOWNTO field_lo(c_sdp_stat_hdr_field_arr,  "sdp_source_info_weighted_subbands_flag"  )) <= SLV(weighted_subbands_flag);
-  dp_header_info(field_hi(c_sdp_stat_hdr_field_arr, "sdp_source_info_gn_id"                   ) DOWNTO field_lo(c_sdp_stat_hdr_field_arr,  "sdp_source_info_gn_id"                   )) <= TO_UVEC(gn_index, 5);
-  dp_header_info(field_hi(c_sdp_stat_hdr_field_arr, "sdp_integration_interval"                ) DOWNTO field_lo(c_sdp_stat_hdr_field_arr,  "sdp_integration_interval"                )) <= TO_UVEC(r.integration_interval, 24);
+  dp_header_info(field_hi(c_sdp_stat_hdr_field_arr, "sdp_source_info_gn_id"                   ) DOWNTO field_lo(c_sdp_stat_hdr_field_arr,  "sdp_source_info_gn_id"                   )) <= TO_UVEC(p.gn_index, 5);
+  dp_header_info(field_hi(c_sdp_stat_hdr_field_arr, "sdp_integration_interval"                ) DOWNTO field_lo(c_sdp_stat_hdr_field_arr,  "sdp_integration_interval"                )) <= TO_UVEC(hdr_input.integration_interval, 24);
   dp_header_info(field_hi(c_sdp_stat_hdr_field_arr, "sdp_data_id"                             ) DOWNTO field_lo(c_sdp_stat_hdr_field_arr,  "sdp_data_id"                             )) <= data_id_slv;
   dp_header_info(field_hi(c_sdp_stat_hdr_field_arr, "sdp_nof_signal_inputs"                   ) DOWNTO field_lo(c_sdp_stat_hdr_field_arr,  "sdp_nof_signal_inputs"                   )) <= TO_UVEC(c_nof_signal_inputs, 8);
   dp_header_info(field_hi(c_sdp_stat_hdr_field_arr, "sdp_nof_bytes_per_statistic"             ) DOWNTO field_lo(c_sdp_stat_hdr_field_arr,  "sdp_nof_bytes_per_statistic"             )) <= TO_UVEC(c_sdp_nof_bytes_per_statistic, 8);
   dp_header_info(field_hi(c_sdp_stat_hdr_field_arr, "sdp_nof_statistics_per_packet"           ) DOWNTO field_lo(c_sdp_stat_hdr_field_arr,  "sdp_nof_statistics_per_packet"           )) <= TO_UVEC(c_nof_statistics_per_packet, 16);
   dp_header_info(field_hi(c_sdp_stat_hdr_field_arr, "sdp_block_period"                        ) DOWNTO field_lo(c_sdp_stat_hdr_field_arr,  "sdp_block_period"                        )) <= sdp_info.block_period;
-  dp_header_info(field_hi(c_sdp_stat_hdr_field_arr, "dp_bsn"                                  ) DOWNTO field_lo(c_sdp_stat_hdr_field_arr,  "dp_bsn"                                  )) <= bsn_at_sync;
+  dp_header_info(field_hi(c_sdp_stat_hdr_field_arr, "dp_bsn"                                  ) DOWNTO field_lo(c_sdp_stat_hdr_field_arr,  "dp_bsn"                                  )) <= hdr_input.bsn_at_sync;
 
   p_reg : PROCESS(dp_rst, dp_clk)
   BEGIN
@@ -321,81 +332,105 @@ BEGIN
     END IF;
   END PROCESS;
 
-  -- Derive and pipeline dynamic parameters
-  p_parameters : PROCESS(dp_clk)
+  -- Derive and pipeline dynamic parameters that depend on node id and MM, but are otherwise fixed
+  -- . gn_index and ring_info.O_rn are in 0:31 range defined by c_sdp_W_gn_id = 5
+  -- . O_rn is first GN index in ring, so O_rn <= gn_index
+  -- . c_sdp_offload_time = 600000 * 5 ns = 3 ms, so for max gn_index = 31 the
+  --   offload starts after 93 ms, to just fit within XST T_int min is 100 ms.
+  p_reg_parameters : PROCESS(dp_clk)
   BEGIN
     IF rising_edge(dp_clk) THEN
-      gn_index_reg     <= gn_index;
-      pn_index         <= func_sdp_gn_index_to_pn_index(gn_index_reg);
-      offset_rn        <= TO_UINT(ring_info.O_rn);
-      rn_index         <= gn_index_reg - offset_rn;
-      local_si_offset  <= pn_index * c_sdp_S_pn;
-      nof_cycles_dly   <= gn_index_reg * g_offload_time;
-      nof_rn           <= TO_UINT(ring_info.N_rn);
-      nof_used_P_sq    <= smallest(nof_rn / 2 + 1, g_P_sq);
-      nof_packets      <= func_sdp_get_stat_nof_packets(g_statistics_type, c_sdp_S_pn, nof_used_P_sq, r.nof_crosslets);
-      remote_rn        <= func_ring_nof_hops_to_source_rn(r.instance_count, rn_index, nof_rn, g_crosslets_direction);
-      remote_gn        <= offset_rn + remote_rn;
-      remote_pn        <= func_sdp_gn_index_to_pn_index(remote_gn);
-      remote_si_offset <= remote_pn * c_sdp_S_pn;
+      p.gn_index         <= gn_index;
+      p.pn_index         <= func_sdp_gn_index_to_pn_index(p.gn_index);
+      p.offset_rn        <= TO_UINT(ring_info.O_rn);
+      p.rn_index         <= p.gn_index - p.offset_rn;
+      p.local_si_offset  <= p.pn_index * c_sdp_S_pn;
+      p.nof_cycles_dly   <= p.gn_index * g_offload_time;
+      p.nof_rn           <= TO_UINT(ring_info.N_rn);
+      p.nof_used_P_sq    <= smallest(p.nof_rn / 2 + 1, g_P_sq);
+      p.remote_rn        <= func_ring_nof_hops_to_source_rn(r.instance_count, p.rn_index, p.nof_rn, g_crosslets_direction);
+      p.remote_gn        <= p.offset_rn + p.remote_rn;
+      p.remote_pn        <= func_sdp_gn_index_to_pn_index(p.remote_gn);
+      p.remote_si_offset <= p.remote_pn * c_sdp_S_pn;
+    END IF;
+  END PROCESS;
+
+  -- Determine info from previous sync interval in which the statistics were
+  -- measured.
+  -- . hold nof_crosslets from MM (and related nof_packets) per sync interval
+  -- . capture bsn_at_sync at start of a sync interval
+  -- . count number of sop that occur in a sync interval, to determine the
+  --   actual number of sop for the previous integration_interval
+  -- . track whether payload errors occur in a sync interval, to determine
+  --   the payload_err flag for the previous integration_interval
+  p_input_capture : PROCESS(dp_clk)
+  BEGIN
+    IF rising_edge(dp_clk) THEN
+      -- Capture input
+      IF in_sosi.sync = '1' THEN
+        reg_input.nof_crosslets <= TO_UINT(nof_crosslets);
+        reg_input.bsn_at_sync <= in_sosi.bsn;
+        reg_input.integration_interval <= reg_input.sop_cnt + 1;  -- size = index + 1
+        reg_input.crosslets_info_rec <= prev_crosslets_info_rec;
+        reg_input.sop_cnt <= 0;
+        reg_input.payload_err <= '0';
+      ELSIF in_sosi.sop = '1' THEN
+        reg_input.sop_cnt <= reg_input.sop_cnt + 1;
+      ELSIF in_sosi.eop = '1' THEN
+        reg_input.payload_err <= reg_input.payload_err OR in_sosi.err(0);
+      END IF;
+      reg_input.nof_packets <= func_sdp_get_stat_nof_packets(g_statistics_type, c_sdp_S_pn, p.nof_used_P_sq, reg_input.nof_crosslets);
+
+      -- Determine previous sync interval info
+      -- . just register when the value suits any sync interval
+      prev_input.nof_crosslets <= reg_input.nof_crosslets;
+      prev_input.nof_packets <= reg_input.nof_packets;
+      -- . register at sync to get value for previous sync interval
+      IF in_sosi.sync = '1' THEN
+        prev_input.bsn_at_sync <= reg_input.bsn_at_sync;
+      END IF;
+      -- . just register when the value already is for the previous sync interval
+      prev_input.integration_interval <= reg_input.integration_interval;
+      prev_input.crosslets_info_rec <= reg_input.crosslets_info_rec;
+      prev_input.sop_cnt <= reg_input.sop_cnt;
+      prev_input.payload_err <= reg_input.payload_err;
+
+      -- Hold previous sync interval info at trigger_offload, so that
+      -- hdr_input can be used in p_control_packet_offload and
+      -- dp_header_info.
+      IF trigger_offload = '1' THEN
+        hdr_input <= prev_input;
+      END IF;
     END IF;
   END PROCESS;
 
   -- Assign application header data_id for different statistic types, use
   -- GENERATE to keep unused fields at 0 (all fields are NATURAL, so default to 0).
   gen_data_id_sst : IF g_statistics_type = "SST" GENERATE
-    data_id_rec.sst_signal_input_index <= r.packet_count + local_si_offset;
+    data_id_rec.sst_signal_input_index <= r.packet_count + p.local_si_offset;
   END GENERATE;
   gen_data_id_bst : IF g_statistics_type = "BST" GENERATE
     data_id_rec.bst_beamlet_index <= c_beamlet_id;
   END GENERATE;
   gen_data_id_xst : IF g_statistics_type = "XST" GENERATE
-    data_id_rec.xst_subband_index <= func_sdp_modulo_N_sub(r.crosslets_info_rec.offset_arr(r.crosslet_count));
-    data_id_rec.xst_signal_input_A_index <= local_si_offset;
-    data_id_rec.xst_signal_input_B_index <= remote_si_offset;
+    data_id_rec.xst_subband_index <= func_sdp_modulo_N_sub(hdr_input.crosslets_info_rec.offset_arr(r.crosslet_count));
+    data_id_rec.xst_signal_input_A_index <= p.local_si_offset;
+    data_id_rec.xst_signal_input_B_index <= p.remote_si_offset;
   END GENERATE;
 
   data_id_slv <= func_sdp_map_stat_data_id(g_statistics_type, data_id_rec);
 
-  p_control_packet_offload : PROCESS(r, in_sosi, nof_crosslets, crosslets_info_rec, trigger_offload, dp_sop, dp_header_info, nof_packets)  -- in order of appearance
+  -- sensitivity list in order of appearance
+  p_control_packet_offload : PROCESS(r, trigger_offload, dp_sop, dp_header_info, reg_input)
     VARIABLE v       : t_reg;
     VARIABLE v_index : NATURAL;
   BEGIN
     v := r;
     v.start_pulse := '0';
     v.start_sync := '0';
-    
-    -- Count number of sop in a sync interval and get payload errors and keep them till next sync.
-    IF in_sosi.sync = '1' THEN
-      v.integration_interval := r.in_sop_cnt + 1;  -- count = index + 1
-      v.in_sop_cnt := 0;
-      v.payload_err := '0';
-    ELSE
-      IF in_sosi.eop = '1' THEN
-        v.payload_err := r.payload_err OR in_sosi.err(0);
-      END IF;
-
-      IF in_sosi.sop = '1' THEN
-        v.in_sop_cnt := r.in_sop_cnt + 1;
-      END IF;
-    END IF;
-
-    -- For XST offload capture nof_crosslets and crosslets_info_rec at in_sosi.sync,
-    -- to make sure they do not change during packets offload.
-    -- . The sdp_crosslets_subband_select.vhd in [2] takes care that
-    --   nof_crosslets and crosslets_info_rec are valid at the xsel_sosi.sync. The
-    --   mmp_dp_bsn_align_v2 in [2] then aligns the local xsel_sosi with the
-    --   remote data and passes on the sync. After some latency the sync
-    --   arrives at the sdp_statistics_offload. This latency is very short
-    --   compared to the sync period, so the nof_crosslets and crosslets_info_rec
-    --   are still valid at the in_sosi.sync.
-    IF in_sosi.sync = '1' THEN
-      v.nof_crosslets      := TO_UINT(nof_crosslets);
-      v.crosslets_info_rec := crosslets_info_rec;
-    END IF;
 
-    -- The trigger_offload occurs nof_cycles_dly after the in_sosi.sync and the
-    -- offload will have finished before the next in_sosi.sync, because
+    -- The trigger_offload occurs p.nof_cycles_dly after the in_sosi.sync and
+    -- the offload will have finished before the next in_sosi.sync, because
     -- c_sdp_offload_time is such that all offload will finish within 100 ms
     -- and the integration interval (= sync interval) is 1 s for SST and BST
     -- and minimal 0.1s (= c_sdp_xst_nof_clk_per_sync_min) for XST.
@@ -428,7 +463,7 @@ BEGIN
       v.dp_header_info := dp_header_info;
 
       -- Start next packets offload.
-      IF r.packet_count < nof_packets - 1 THEN
+      IF r.packet_count < reg_input.nof_packets - 1 THEN
         IF g_statistics_type = "SST" THEN
           --                 step        step        step        step        step        step
           -- start_address :    0,    2, 2048, 2050, 4096, 4098, 6144, 6146, 8192, 8194, 10240, 10242
@@ -448,7 +483,8 @@ BEGIN
 
         ELSIF g_statistics_type = "XST" THEN
           -- start_address:
-          --   nof_crosslets:     1,     2,     3,     4,     5,     6,     7
+          --   reg_input.nof_crosslets:
+          --                      1,     2,     3,     4,     5,     6,     7
           --   X_sq instance:
           --           0          0,   576,  1152,  1728,  2304,  2880,  3456
           --           1       4096,  4672,  5248,  5824,  6400,  6976,  7552
@@ -461,7 +497,7 @@ BEGIN
           --           8      32768, 33344, 33920, 34496, 35072, 35648, 36224
           v.start_address := r.start_address + c_sdp_X_sq * c_nof_complex * c_sdp_W_statistic_sz;  -- continue with next packet in this instance
           v.crosslet_count := r.crosslet_count + 1;
-          IF r.crosslet_count = TO_UINT(nof_crosslets) - 1 THEN
+          IF r.crosslet_count = reg_input.nof_crosslets - 1 THEN
             v.start_address := r.instance_address + 2**c_sdp_ram_st_xsq_addr_w;  -- jump to first packet in next instance
             v.crosslet_count := 0;
             v.instance_count := r.instance_count + 1;
@@ -498,7 +534,7 @@ BEGIN
     reg_enable_mosi => reg_enable_mosi,
     reg_enable_miso => reg_enable_miso,
 
-    delay           => nof_cycles_dly,
+    delay           => p.nof_cycles_dly,
     trigger         => in_trigger,
     trigger_en      => trigger_en,
     trigger_dly     => trigger_offload
@@ -522,7 +558,7 @@ BEGIN
     mm_clk        => mm_clk,
     start_pulse   => r.start_pulse,
     sync_in       => r.start_sync,
-    bsn_at_sync   => bsn_at_sync,
+    bsn_at_sync   => hdr_input.bsn_at_sync,
     start_address => r.start_address,
     mm_mosi       => master_mosi,
     mm_miso       => master_miso,
@@ -551,7 +587,7 @@ BEGIN
     src_out      => dp_offload_snk_in
   );
 
-  -- The bsn_at_sync is passed on via r.dp_header_info so that
+  -- The hdr_input.bsn_at_sync is passed on via r.dp_header_info so that
   -- u_dp_offload_tx_v3 can put it in the udp_sosi header.
   -- The dp_offload_snk_in.bsn that is passed on by u_dp_block_from_mm_dc is
   -- in fact not used, but useful to see in udp_sosi.bsn in the Wave Window.
diff --git a/applications/lofar2/libraries/sdp/tb/vhdl/tb_sdp_info.vhd b/applications/lofar2/libraries/sdp/tb/vhdl/tb_sdp_info.vhd
index 552b5ee8f28d839ba42a1d43be788724fcc18cb0..d775dbcc8e7f00878b786be46003d6e5674fc46a 100644
--- a/applications/lofar2/libraries/sdp/tb/vhdl/tb_sdp_info.vhd
+++ b/applications/lofar2/libraries/sdp/tb/vhdl/tb_sdp_info.vhd
@@ -72,7 +72,6 @@ ARCHITECTURE tb OF tb_sdp_info IS
   SIGNAL reg_miso            : t_mem_miso;
 
   -- signals used to change settings of sdp_info 
-  SIGNAL gn_index  : NATURAL   := 15; 
   SIGNAL f_adc     : STD_LOGIC := '0'; 
   SIGNAL fsub_type : STD_LOGIC := '0';
 
@@ -225,7 +224,6 @@ BEGIN
       reg_mosi  => reg_mosi,
       reg_miso  => reg_miso,
 
-      gn_index  => gn_index,
       f_adc     => f_adc,
       fsub_type => fsub_type,
 
diff --git a/applications/lofar2/libraries/sdp/tb/vhdl/tb_sdp_statistics_offload.vhd b/applications/lofar2/libraries/sdp/tb/vhdl/tb_sdp_statistics_offload.vhd
index 5298580a65d5c2f3be3ffb750a21a60821eb7e3f..279c2d3243826eeab089e3414dfea26ad4453aab 100644
--- a/applications/lofar2/libraries/sdp/tb/vhdl/tb_sdp_statistics_offload.vhd
+++ b/applications/lofar2/libraries/sdp/tb/vhdl/tb_sdp_statistics_offload.vhd
@@ -191,6 +191,7 @@ ARCHITECTURE tb OF tb_sdp_statistics_offload IS
   SIGNAL rx_sdp_stat_header      : t_sdp_stat_header;
   SIGNAL exp_sdp_stat_header     : t_sdp_stat_header;
 
+  SIGNAL cur_dp_bsn              : NATURAL;
   SIGNAL exp_dp_bsn              : NATURAL;
   SIGNAL exp_sst_signal_input    : NATURAL;
   SIGNAL exp_bst_beamlet_index   : NATURAL;
@@ -357,7 +358,8 @@ BEGIN
   -- verify it at rx_offload_sosi.eop.
 
   -- For all statistics
-  exp_dp_bsn <= c_bsn_init + 1 + rx_sync_cnt * c_nof_block_per_sync;
+  cur_dp_bsn <= c_bsn_init + 1 + rx_sync_cnt * c_nof_block_per_sync;  -- in current sync interval
+  exp_dp_bsn <= cur_dp_bsn WHEN rising_edge(dp_clk) AND rx_offload_sosi.sync = '1';  -- previous sync interval
   -- SST
   exp_sst_signal_input <= rx_packet_cnt + c_sdp_S_pn * gn_index;
   -- BST
@@ -667,7 +669,7 @@ BEGIN
     weighted_subbands_flag  => weighted_subbands_flag,
 
     nof_crosslets           => c_mm_nof_crosslets,
-    crosslets_info_rec      => in_crosslets_info_rec
+    prev_crosslets_info_rec => in_crosslets_info_rec
   );
 
   -- Verify crosslets_info functions
diff --git a/libraries/base/ring/src/vhdl/ring_info.vhd b/libraries/base/ring/src/vhdl/ring_info.vhd
index 47e8cdb9fdfbe4e9ea069b85f3067817bf23a863..e1fbd16e32ca86c5a07df79654a30f34578ea79e 100644
--- a/libraries/base/ring/src/vhdl/ring_info.vhd
+++ b/libraries/base/ring/src/vhdl/ring_info.vhd
@@ -38,6 +38,10 @@ USE common_lib.common_field_pkg.ALL;
 USE work.ring_pkg.ALL;
 
 ENTITY ring_info IS
+  GENERIC (
+    -- Actual ring_info.O_rn field width can be less than a byte
+    g_ring_info_O_rn_w : NATURAL := c_byte_w
+  );
   PORT (
     -- Clocks and reset
     mm_rst     : IN  STD_LOGIC;   -- reset synchronous with mm_clk
@@ -58,6 +62,8 @@ ARCHITECTURE str OF ring_info IS
 
   SIGNAL mm_fields_out : STD_LOGIC_VECTOR(field_slv_out_len(c_ring_info_field_arr)-1 DOWNTO 0);
 
+  SIGNAL O_rn : STD_LOGIC_VECTOR(c_byte_w-1 DOWNTO 0);
+
 BEGIN
 
   u_mm_fields: ENTITY mm_lib.mm_fields
@@ -81,10 +87,14 @@ BEGIN
   );
 
   -- get "RW" fields from mm_fields
-  ring_info.O_rn                     <= mm_fields_out(field_hi(c_ring_info_field_arr, "O_rn") DOWNTO field_lo(c_ring_info_field_arr, "O_rn"));
-  ring_info.N_rn                     <= mm_fields_out(field_hi(c_ring_info_field_arr, "N_rn") DOWNTO field_lo(c_ring_info_field_arr, "N_rn"));
+  O_rn <= mm_fields_out(field_hi(c_ring_info_field_arr, "O_rn") DOWNTO field_lo(c_ring_info_field_arr, "O_rn"));
+
+  ring_info.O_rn <= RESIZE_UVEC(O_rn(g_ring_info_O_rn_w-1 DOWNTO 0), c_byte_w);
+  ring_info.N_rn <= mm_fields_out(field_hi(c_ring_info_field_arr, "N_rn") DOWNTO field_lo(c_ring_info_field_arr, "N_rn"));
+
   ring_info.use_cable_to_previous_rn <= sl(mm_fields_out(field_hi(c_ring_info_field_arr, "use_cable_to_previous_rn") DOWNTO field_lo(c_ring_info_field_arr, "use_cable_to_previous_rn")));
   ring_info.use_cable_to_next_rn     <= sl(mm_fields_out(field_hi(c_ring_info_field_arr, "use_cable_to_next_rn") DOWNTO field_lo(c_ring_info_field_arr, "use_cable_to_next_rn")));
+
 END str;