diff --git a/applications/lofar2/designs/lofar2_unb2b_sdp_station/revisions/lofar2_unb2b_sdp_station_xsub_one/tb_lofar2_unb2b_sdp_station_xsub_one_xst_offload.vhd b/applications/lofar2/designs/lofar2_unb2b_sdp_station/revisions/lofar2_unb2b_sdp_station_xsub_one/tb_lofar2_unb2b_sdp_station_xsub_one_xst_offload.vhd
index 79ddb76d29827419df36a485a4d9312be53887f8..a3a44d2dc0893d3abfd2d7b6f3c4b426ca1fb190 100644
--- a/applications/lofar2/designs/lofar2_unb2b_sdp_station/revisions/lofar2_unb2b_sdp_station_xsub_one/tb_lofar2_unb2b_sdp_station_xsub_one_xst_offload.vhd
+++ b/applications/lofar2/designs/lofar2_unb2b_sdp_station/revisions/lofar2_unb2b_sdp_station_xsub_one/tb_lofar2_unb2b_sdp_station_xsub_one_xst_offload.vhd
@@ -91,7 +91,7 @@ ARCHITECTURE tb OF tb_lofar2_unb2b_sdp_station_xsub_one_xst_offload IS
   CONSTANT c_eth_check_nof_packets        : NATURAL := 1; -- received packets in 1 sync period
   CONSTANT c_eth_header_size              : NATURAL := 19; -- words
   CONSTANT c_eth_crc_size                 : NATURAL := 1; -- word
-  CONSTANT c_eth_packet_size              : NATURAL := c_eth_header_size + c_eth_crc_size + (c_sdp_W_statistic / c_word_w) * c_sdp_S_pn * c_sdp_S_pn; -- 20 + 2 * 12 * 12 = 308 
+  CONSTANT c_eth_packet_size              : NATURAL := c_eth_header_size + c_eth_crc_size + (c_sdp_W_statistic / c_word_w) * c_sdp_S_pn * c_sdp_S_pn * c_nof_complex; -- 20 + 2 * 12 * 12 * 2 = 596 
   CONSTANT c_eth_check_nof_valid          : NATURAL := c_eth_check_nof_packets * c_eth_packet_size;  
   CONSTANT c_eth_runtime_timeout          : TIME := 2 * c_nof_clk_per_sync * c_ext_clk_period;  -- eth statistics should be done at the second sync interval
   
diff --git a/applications/lofar2/libraries/sdp/hdllib.cfg b/applications/lofar2/libraries/sdp/hdllib.cfg
index 7068a9f4104a54a404540a09e830491c0ded6074..c4922d48959a7f833f7a037362781c0d9727b380 100644
--- a/applications/lofar2/libraries/sdp/hdllib.cfg
+++ b/applications/lofar2/libraries/sdp/hdllib.cfg
@@ -23,11 +23,13 @@ synth_files =
 test_bench_files =
     tb/vhdl/tb_sdp_info.vhd 
     tb/vhdl/tb_sdp_statistics_offload.vhd
+    tb/vhdl/tb_tb_sdp_statistics_offload.vhd
     tb/vhdl/tb_sdp_crosslets_subband_select.vhd 
 
 regression_test_vhdl = 
     tb/vhdl/tb_sdp_info.vhd
     tb/vhdl/tb_sdp_statistics_offload.vhd 
+    tb/vhdl/tb_tb_sdp_statistics_offload.vhd
     tb/vhdl/tb_sdp_crosslets_subband_select.vhd 
 
 [modelsim_project_file]
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 4b600fa39e7bf008d5eb54321e3ec511585141c0..287331749627f658af4d5ffdb785c249e7f54fb2 100644
--- a/applications/lofar2/libraries/sdp/src/vhdl/sdp_statistics_offload.vhd
+++ b/applications/lofar2/libraries/sdp/src/vhdl/sdp_statistics_offload.vhd
@@ -276,7 +276,7 @@ BEGIN
     g_data_size          => c_data_size,
     g_step_size          => c_step_size,
     g_nof_data           => c_nof_data,
-    g_reverse_word_order => FALSE -- default word order is MSB after LSB, we need to stream LSB after MSB.
+    g_reverse_word_order => TRUE -- default word order is MSB after LSB, we need to stream LSB after MSB.
   ) 
   PORT MAP(
     dp_rst        => dp_rst,
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 4ef9345bff9b94039db3d69fa3c588b873bd1a8c..42f947700310ff1af936a0e5aa16a945c31765b9 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
@@ -49,8 +49,9 @@ USE work.sdp_pkg.ALL;
 ENTITY tb_sdp_statistics_offload IS
   GENERIC (
     g_statistics_type          : STRING := "SST";
-    g_nof_signal_inputs_per_pn : NATURAL := 12;
-    g_offload_time             : NATURAL := 500
+    g_offload_time             : NATURAL := 500;
+    g_beamset_id               : NATURAL := 0;
+    g_P_sq                     : NATURAL := c_sdp_P_sq
   );
 END tb_sdp_statistics_offload;
 
@@ -82,14 +83,20 @@ ARCHITECTURE tb OF tb_sdp_statistics_offload IS
   CONSTANT c_nof_data                  : NATURAL := sel_a_b(g_statistics_type="BST",  c_sdp_N_pol * c_sdp_S_sub_bf,
                                                     sel_a_b(g_statistics_type="XST",  c_sdp_S_pn * c_sdp_S_pn * c_nof_complex, 
                                                                                       c_sdp_N_sub));  -- SST
-  -- Define SST RAM size for g_nof_signal_inputs_per_pn.
-  CONSTANT c_ram_size  : NATURAL := c_nof_data * c_data_size * g_nof_signal_inputs_per_pn;
+
+  CONSTANT c_nof_packets               : NATURAL := sel_a_b(g_statistics_type="BST", 1,
+                                                    sel_a_b(g_statistics_type="XST", g_P_sq,
+                                                                                     c_sdp_S_pn));  -- SST
+
+
+  -- Define SST RAM size for c_nof_packets.
+  CONSTANT c_ram_size  : NATURAL := c_nof_data * c_data_size * c_nof_packets;
   CONSTANT c_ram_w     : NATURAL := ceil_log2(c_ram_size);
   --CONSTANT c_ram_buf   : t_c_mem := (c_mem_ram_rd_latency, c_ram_w,  32, 2**c_ram_w, 'X');
   CONSTANT c_ram_buf   : t_c_mem := (1, c_ram_w,  32, 2**c_ram_w, 'X');
 
   -- Define block timing.
-  CONSTANT c_nof_block_per_sync : NATURAL := 80;  -- Sufficient to fit more than g_nof_signal_inputs_per_pn offload packets per sync interval.
+  CONSTANT c_nof_block_per_sync : NATURAL := 80;  -- Sufficient to fit more than c_nof_packets offload packets per sync interval.
   CONSTANT c_nof_clk_per_block  : NATURAL := c_nof_data * c_data_size;
 
   -- Based on g_statistics_type: 'S'=0x53="SST", 'B'=0x42="BST", 'X'=0x58="XST".
@@ -101,10 +108,12 @@ ARCHITECTURE tb OF tb_sdp_statistics_offload IS
                                                     sel_a_b(g_statistics_type="XST", c_sdp_S_pn,
                                                                                      1));  -- SST
 
-  CONSTANT c_nof_statistics_per_packet : NATURAL := sel_a_b(g_statistics_type="BST",  c_sdp_S_sub_bf,
+  CONSTANT c_nof_statistics_per_packet : NATURAL := sel_a_b(g_statistics_type="BST",  c_sdp_N_pol * c_sdp_S_sub_bf,
                                                     sel_a_b(g_statistics_type="XST", (c_sdp_S_pn * c_sdp_S_pn * c_nof_complex),
                                                                                       c_sdp_N_sub));  -- SST
 
+  CONSTANT c_beamlet_id                : NATURAL := g_beamset_id * c_sdp_S_sub_bf;
+
   CONSTANT c_nof_valid_per_block : NATURAL := c_nof_data * c_data_size;
   CONSTANT c_nof_sync            : NATURAL := 5;
   CONSTANT c_nof_clk_per_sync    : NATURAL := c_nof_block_per_sync * c_nof_clk_per_block;
@@ -314,8 +323,14 @@ BEGIN
         REPORT "wrong sdp_block_period" SEVERITY ERROR;
       
       -- Check variable header info.
-      ASSERT rx_hdr_fields_raw(field_hi(c_sdp_stat_hdr_field_arr, "sdp_data_id") DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "sdp_data_id")) = TO_UVEC(rx_block_cnt + c_sdp_S_pn * gn_index, 32)
-        REPORT "wrong block count number, received data_id not same as counted blocks" SEVERITY ERROR;
+      IF g_statistics_type = "SST" THEN
+        ASSERT rx_hdr_fields_raw(field_hi(c_sdp_stat_hdr_field_arr, "sdp_data_id") DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "sdp_data_id")) = TO_UVEC(rx_block_cnt + c_sdp_S_pn * gn_index, 32)
+                REPORT "wront SST sdp_data_id" SEVERITY ERROR;
+      ELSIF g_statistics_type = "BST" THEN
+        ASSERT rx_hdr_fields_raw(field_hi(c_sdp_stat_hdr_field_arr, "sdp_data_id") DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "sdp_data_id")) = TO_UVEC(c_beamlet_id, 32)
+                REPORT "wront BST sdp_data_id" SEVERITY ERROR;
+      --ELSIF g_statistics_type = "XST" THEN --TODO: RW define check
+      END IF;
     END IF;
   END PROCESS;
 
@@ -351,7 +366,7 @@ BEGIN
       IF init_ram_done = '1' THEN
         
         IF in_sosi.sync = '1' AND rx_block_cnt > 0 THEN
-          ASSERT rx_block_cnt = g_nof_signal_inputs_per_pn-1 REPORT "wrong number of blocks between 2 sync" SEVERITY ERROR;
+          ASSERT rx_block_cnt = c_nof_packets-1 REPORT "wrong number of blocks between 2 sync" SEVERITY ERROR;
         END IF;
         
         -- rx_prev_bsn > 0 is needed for the first time, when there is no previous BSN.
@@ -453,9 +468,10 @@ BEGIN
   -- SDP info
   u_dut: ENTITY work.sdp_statistics_offload
   GENERIC MAP (
-    g_statistics_type => "SST",
+    g_statistics_type => g_statistics_type,
     g_offload_time    => g_offload_time,
-    g_beamset_id      => 0
+    g_beamset_id      => g_beamset_id,
+    g_P_sq            => g_P_sq
   )
   PORT MAP (
     mm_clk    => mm_clk,
diff --git a/applications/lofar2/libraries/sdp/tb/vhdl/tb_tb_sdp_statistics_offload.vhd b/applications/lofar2/libraries/sdp/tb/vhdl/tb_tb_sdp_statistics_offload.vhd
new file mode 100644
index 0000000000000000000000000000000000000000..e0506591d517a9df01f03904a3c1bec1c98a1c28
--- /dev/null
+++ b/applications/lofar2/libraries/sdp/tb/vhdl/tb_tb_sdp_statistics_offload.vhd
@@ -0,0 +1,51 @@
+-------------------------------------------------------------------------------
+--
+-- 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 vd Walle
+-- Purpose: Verify multiple variations of tb_sdp_statistics_offload
+-- Description:
+-- Usage:
+-- > as 3
+-- > run -all
+-------------------------------------------------------------------------------
+
+LIBRARY IEEE;
+USE IEEE.std_logic_1164.ALL;
+
+ENTITY tb_tb_sdp_statistics_offload IS
+END tb_tb_sdp_statistics_offload;
+
+ARCHITECTURE tb OF tb_tb_sdp_statistics_offload IS
+  SIGNAL tb_end : STD_LOGIC := '0';  -- declare tb_end to avoid 'No objects found' error on 'when -label tb_end'
+BEGIN
+
+--    g_statistics_type          : STRING := "SST";
+--    g_offload_time             : NATURAL := 500;
+--    g_beamset_id               : NATURAL := 0;
+--    g_P_sq                     : NATURAL := c_sdp_P_sq
+
+  u_sst      : ENTITY work.tb_sdp_statistics_offload GENERIC MAP("SST");
+  u_bst_0    : ENTITY work.tb_sdp_statistics_offload GENERIC MAP("BST");
+  u_bst_1    : ENTITY work.tb_sdp_statistics_offload GENERIC MAP("BST", 500, 1);
+  u_xst_1    : ENTITY work.tb_sdp_statistics_offload GENERIC MAP("XST", 500, 0, 1);
+  u_xst_P_sq : ENTITY work.tb_sdp_statistics_offload GENERIC MAP("XST");
+  
+END tb;
diff --git a/libraries/dsp/st/src/vhdl/st_xsq.vhd b/libraries/dsp/st/src/vhdl/st_xsq.vhd
index 997e13c1b253434c103dca1bc505447b0bfa37ab..4378a4c7507b12ec38b0467b1f2ac923b9c2f998 100644
--- a/libraries/dsp/st/src/vhdl/st_xsq.vhd
+++ b/libraries/dsp/st/src/vhdl/st_xsq.vhd
@@ -185,9 +185,11 @@ BEGIN
   u_mem_mux_select : entity common_lib.common_mem_mux
   generic map (    
     g_nof_mosi    => c_nof_complex,
-    g_mult_addr_w => c_nof_word_w
+    g_mult_addr_w => c_nof_word_w,
+    g_rd_latency  => 1
   )
   port map (
+    clk      => mm_clk,
     mosi     => remapped_ram_st_xsq_mosi,
     miso     => ram_st_xsq_miso,
     mosi_arr => ram_st_xsq_mosi_arr,