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 e3e4d130f10382b080aa703cbceec5b9d3d43a11..674b8baa1e4234ad4fb5d16bb92dd012d7a63276 100644
--- a/applications/lofar2/libraries/sdp/src/vhdl/sdp_statistics_offload.vhd
+++ b/applications/lofar2/libraries/sdp/src/vhdl/sdp_statistics_offload.vhd
@@ -106,7 +106,7 @@ ARCHITECTURE str OF sdp_statistics_offload IS
   CONSTANT c_beamlet_id                : NATURAL := g_beamset_id * c_sdp_S_sub_bf;
 
   -- MM access settings per packet for u_dp_block_from_mm_dc
-  CONSTANT c_mm_user_size              : NATURAL := func_sdp_get_stat_from_mm_data_size(g_statistics_type);
+  CONSTANT c_mm_user_size              : NATURAL := c_sdp_W_statistic_sz;
   CONSTANT c_mm_data_size              : NATURAL := func_sdp_get_stat_from_mm_data_size(g_statistics_type);
   CONSTANT c_mm_step_size              : NATURAL := func_sdp_get_stat_from_mm_step_size(g_statistics_type);
   CONSTANT c_mm_nof_data               : NATURAL := func_sdp_get_stat_from_mm_nof_data(g_statistics_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 c36f8e1ac4b5e6dc3933d580b2c0aabefa2fa854..433f50839f8cd26b48eb43b0d41ec6387d20027b 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
@@ -32,7 +32,8 @@
 -- Usage:
 -- > as 8
 -- > run -a
--- e.g. view test_offload_sosi and the rx_sdp_stat_header.app fields
+-- . for header: view test_offload_sosi and the rx_sdp_stat_header.app fields
+-- . for payload: view rx_val, rx_data and exp_data
 -------------------------------------------------------------------------------
 
 LIBRARY IEEE, common_lib, dp_lib, ring_lib;
@@ -53,7 +54,7 @@ USE work.tb_sdp_pkg.ALL;
 ENTITY tb_sdp_statistics_offload IS
   GENERIC (
     -- All
-    g_statistics_type          : STRING := "XST";
+    g_statistics_type          : STRING := "SST";
     g_offload_time             : NATURAL := 50;
     g_reverse_word_order       : BOOLEAN := TRUE;  -- when TRUE then stream LSB word after MSB word.
     g_gn_index                 : NATURAL := 5;  -- global node (GN) index, must be in range(O_rn, O_rn + N_rn), use > 0 to see effect of g_offload_time
@@ -113,11 +114,15 @@ ARCHITECTURE tb OF tb_sdp_statistics_offload IS
 
   -- RAM dimensions
   -- . nof_statistics_per_packet = c_mm_nof_data * c_mm_data_size / c_sdp_W_statistic_sz
+  CONSTANT c_mm_user_size              : NATURAL := c_sdp_W_statistic_sz;
   CONSTANT c_mm_data_size              : NATURAL := func_sdp_get_stat_from_mm_data_size(g_statistics_type);
   CONSTANT c_mm_step_size              : NATURAL := func_sdp_get_stat_from_mm_step_size(g_statistics_type);
   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;  -- = c_ram_size
 
+  CONSTANT c_mm_nof_step   : NATURAL := c_mm_step_size / c_mm_data_size;
+  CONSTANT c_mm_Xsq_span   : NATURAL := 2**ceil_log2(c_sdp_N_crosslets_max * c_packet_size);  -- XST: 2**ceil_log2(7 * 576) = 4096
+
   -- Define block timing.
   CONSTANT c_bsn_init            : NATURAL := 0;
   -- Sufficient c_nof_block_per_sync to fit more than c_nof_packets_max offload packets per sync interval.
@@ -222,10 +227,13 @@ ARCHITECTURE tb OF tb_sdp_statistics_offload IS
   SIGNAL dbg_c_nof_packets_max           : NATURAL := c_nof_packets_max;
   SIGNAL dbg_c_beamlet_index             : NATURAL := c_beamlet_index;
   SIGNAL dbg_c_packet_size               : NATURAL := c_packet_size;
+  SIGNAL dbg_c_mm_user_size              : NATURAL := c_mm_user_size;
   SIGNAL dbg_c_mm_data_size              : NATURAL := c_mm_data_size;
   SIGNAL dbg_c_mm_step_size              : NATURAL := c_mm_step_size;
   SIGNAL dbg_c_mm_nof_data               : NATURAL := c_mm_nof_data;
   SIGNAL dbg_c_mm_ram_size               : NATURAL := c_mm_ram_size;
+  SIGNAL dbg_c_mm_nof_step               : NATURAL := c_mm_nof_step;
+  SIGNAL dbg_c_mm_Xsq_span               : NATURAL := c_mm_Xsq_span;
   SIGNAL dbg_c_ram_size                  : NATURAL := c_ram_size;
   SIGNAL dbg_c_crosslets_info_rec        : t_sdp_crosslets_info := c_crosslets_info_rec;
   SIGNAL dbg_c_crosslets_info_slv        : STD_LOGIC_VECTOR(c_sdp_crosslets_info_reg_w-1 DOWNTO 0) := c_crosslets_info_slv;
@@ -470,7 +478,6 @@ BEGIN
   END PROCESS;
 
   p_verify_payload : PROCESS(dp_clk)
-    CONSTANT c_nof_step   : NATURAL := c_mm_step_size / c_mm_data_size;
     VARIABLE W            : NATURAL;  -- 32bit Words
     VARIABLE D            : NATURAL;  -- Data values of c_mm_data_size
     VARIABLE S            : NATURAL;  -- Statistic values of c_sdp_W_statistic_sz
@@ -487,20 +494,20 @@ BEGIN
       v_rx_data := TO_UINT(test_offload_sosi.data);
       IF test_offload_sosi.valid = '1' THEN
         IF g_statistics_type = "SST" THEN
-          --     Indices:
-          --          W:    0     1      2     3      4     5 ...  1022  1023
-          --  U = D = S:    0            1            2             511
-          --          I:    0     1      0     1      0     1 ...     0     1
-          --     P: J: Words values:
-          --     0  0       0     1      4     5      8     9 ...  2044  2045
-          --     1  1       2     3      6     7     10    11 ...  2046  2047
-          --     2  0    2048  2049   2052  2053   2056  2057 ...  4092  4093
-          --     3  1    2050  2051   2054  2055   2058  2059 ...  4094  4095
-          --    ...                                           ...
-          --    11  1   10242 10243  10246 10247  10250 10251 ... 12286 12287
+          --        Indices:
+          --         W:    0     1      2     3      4     5 ...  1022  1023
+          -- U = D = S:    0            1            2             511
+          --         I:    0     1      0     1      0     1 ...     0     1
+          --    P: J: Words values:
+          --    0  0       0     1      4     5      8     9 ...  2044  2045
+          --    1  1       2     3      6     7     10    11 ...  2046  2047
+          --    2  0    2048  2049   2052  2053   2056  2057 ...  4092  4093
+          --    3  1    2050  2051   2054  2055   2058  2059 ...  4094  4095
+          --   ...                                           ...
+          --   11  1   10242 10243  10246 10247  10250 10251 ... 12286 12287
           --
-          -- g_reverse_word_order = TRUE: swaps odd and even W columns,
-          --                              because c_sdp_W_statistic_sz = 2
+          -- g_reverse_word_order = TRUE: swaps odd and even W columns, because
+          --   c_mm_user_size = c_sdp_W_statistic_sz = 2
 
           W := rx_valid_cnt;                -- range c_packet_size = 1024 32bit Words
           S := W / c_sdp_W_statistic_sz;    -- range c_nof_statistics_per_packet = 512 Statistic values
@@ -509,51 +516,50 @@ BEGIN
           U := S;                           -- range c_sdp_N_sub = 512 SST values
           I := W MOD c_sdp_W_statistic_sz;  -- range c_sdp_W_statistic_sz = 2 words
           P := rx_packet_cnt;               -- range c_nof_packets_max = 12 = c_sdp_S_pn Packets
-          J := P MOD c_nof_step;            -- range c_nof_step = 2 = c_sdp_Q_fft
+          J := P MOD c_mm_nof_step;         -- range c_mm_nof_step = 2 = c_sdp_Q_fft
 
           v_exp_data := S * 4;  -- due to c_mm_step_size = 4 = c_sdp_W_statistic_sz * c_sdp_Q_fft;
           IF I = sel_a_b(g_reverse_word_order, 0, 1) THEN
-            v_exp_data := v_exp_data + 1;  -- due to odd, even of c_sdp_W_statistic_sz = 2
+            v_exp_data := v_exp_data + 1;  -- due to c_mm_user_size = c_sdp_W_statistic_sz = 2
           END IF;
           IF J = 1 THEN
-            v_exp_data := v_exp_data + 2;  -- due to c_sdp_W_statistic_sz = 2 and c_nof_step = 2 > 1
+            v_exp_data := v_exp_data + 2;  -- due to c_sdp_W_statistic_sz = 2 and c_mm_nof_step = 2 > 1
           END IF;
-          v_exp_data := v_exp_data + (P/2) * 2048;  -- due to c_packet_size = 1024 and c_nof_step = 2 > 1
+          v_exp_data := v_exp_data + (P/2) * 2048;  -- due to c_packet_size = 1024 and c_mm_nof_step = 2 > 1
           ASSERT v_exp_data = v_rx_data REPORT "Wrong SST payload data Rx" SEVERITY ERROR;
 
         ELSIF g_statistics_type = "BST" THEN
-          --     Indices:
-          --      W:    0     1      2     3      4     5 ...  1948  1949   1950  1951
-          --      S:    0            1            2       ...   974          975
-          --  B = D:    0                         1       ...   487
-          --      I:    0     1      2     3      0       ...     0     1      2     3
-          --   P:  Words values:
-          --   0        0     1      2     3      4     5 ...  1948  1949   1950  1951
-
-          -- g_reverse_word_order = TRUE: swaps every c_mm_data_size = 4 D columns.
-          -- g_reverse_word_order occurs per c_mm_data_size = 4 words, so the
-          -- c_sdp_N_pol_bf = 2 beam polarizations also get swapped.
+          --    Indices:
+          --     W:    0     1      2     3      4     5 ...  1948  1949   1950  1951
+          --     S:    0            1            2       ...   974          975
+          -- B = D:    0                         1       ...   487
+          --     I:    0     1      2     3      0       ...     0     1      2     3
+          --  P:  Words values:
+          --  0        0     1      2     3      4     5 ...  1948  1949   1950  1951
+          --
+          -- g_reverse_word_order = TRUE: swaps odd and even W columns, because
+          --   c_mm_user_size = c_sdp_W_statistic_sz = 2
 
           W := rx_valid_cnt;                -- range c_packet_size = 1952
           S := W / c_sdp_W_statistic_sz;    -- range c_nof_statistics_per_packet = 976 Statistic values
           D := S / c_sdp_N_pol_bf;          -- range c_mm_nof_data = 488 Data values, because
                                             -- c_mm_data_size / c_sdp_W_statistic_sz = 2 = c_sdp_N_pol_bf
           B := D;                           -- range c_sdp_S_sub_bf = 488 dual polarization BST values
-          I := W MOD c_mm_data_size;        -- range c_mm_data_size = 4 = c_sdp_W_statistic_sz  * c_sdp_N_pol_bf
+          I := W MOD c_sdp_W_statistic_sz;  -- range c_sdp_W_statistic_sz = 2 words
           P := rx_packet_cnt;               -- range c_nof_packets_max = 1
 
-          v_exp_data := B * c_mm_data_size;
+          v_exp_data := S * c_sdp_W_statistic_sz;
           IF g_reverse_word_order = FALSE THEN
             v_exp_data := v_exp_data + I;
           ELSE
-            v_exp_data := v_exp_data - I + c_mm_data_size-1;
+            v_exp_data := v_exp_data - I + c_mm_user_size-1;  -- c_mm_user_size = c_sdp_W_statistic_sz = 2
           END IF;
           ASSERT v_exp_data = v_rx_data REPORT "Wrong BST payload data Rx" SEVERITY ERROR;
 
         ELSIF g_statistics_type = "XST" THEN
-          --  . g_P_sq = 4
-          --  . g_nof_crosslets = 3
-          --  . c_sdp_N_crosslets_max = 7 --> 2**ceil_log2(7 * 576) = 4096
+          -- . g_P_sq = 4
+          -- . g_nof_crosslets = 3
+          -- . c_sdp_N_crosslets_max = 7 --> c_mm_Xsq_span = 2**ceil_log2(7 * 576) = 4096
           --
           --      W:        0     1      2     3      4     5 ...   572   573   574   575
           --      S:        0            1            2       ...   286         287
@@ -571,29 +577,28 @@ BEGIN
           --   9  0  3  12288                                 ...
           --  10  1     12864                                 ...
           --  11  2     13436                                 ...
-
-          -- g_reverse_word_order = TRUE: swaps every c_mm_data_size = 4 D columns.
-          -- g_reverse_word_order occurs per c_mm_data_size = 4 words, so the
-          -- c_nof_complex = 2 parts also get swapped.
+          --
+          -- g_reverse_word_order = TRUE: swaps odd and even W columns, because
+          --   c_mm_user_size = c_sdp_W_statistic_sz = 2
 
           W := rx_valid_cnt;                -- range c_packet_size = 576
           S := W / c_sdp_W_statistic_sz;    -- range c_nof_statistics_per_packet = 288 Statistic values
           D := S / c_nof_complex;           -- range c_mm_nof_data = 144 Data values, because
                                             -- c_mm_data_size / c_sdp_W_statistic_sz = 2 = c_nof_complex
           X := D;                           -- range c_sdp_X_sq = 144 complex XST values
-          I := W MOD c_mm_data_size;        -- range c_mm_data_size = 4 = c_sdp_W_statistic_sz * c_nof_complex
+          I := W MOD c_sdp_W_statistic_sz;  -- range c_sdp_W_statistic_sz = 2 words
           P := rx_packet_cnt;               -- range c_mm_nof_packets
           J := P MOD g_nof_crosslets;       -- range g_nof_crosslets
           K := P / g_nof_crosslets;         -- range g_P_sq
 
-          v_exp_data := X * c_mm_data_size;
+          v_exp_data := S * c_sdp_W_statistic_sz;
           IF g_reverse_word_order = FALSE THEN
             v_exp_data := v_exp_data + I;
           ELSE
-            v_exp_data := v_exp_data - I + c_mm_data_size-1;
+            v_exp_data := v_exp_data - I + c_mm_user_size-1;  -- c_mm_user_size = c_sdp_W_statistic_sz = 2
           END IF;
-          v_exp_data := v_exp_data + J * 576;
-          v_exp_data := v_exp_data + K * 4096;
+          v_exp_data := v_exp_data + J * c_packet_size;  -- c_packet_size = 576
+          v_exp_data := v_exp_data + K * c_mm_Xsq_span;  -- c_mm_Xsq_span = 4096
           ASSERT v_exp_data = v_rx_data REPORT "Wrong XST payload data Rx" SEVERITY ERROR;
 
         END IF;