diff --git a/applications/lofar2/designs/lofar2_unb2b_sdp_station/revisions/lofar2_unb2b_sdp_station_adc/tb_lofar2_unb2b_sdp_station_adc.vhd b/applications/lofar2/designs/lofar2_unb2b_sdp_station/revisions/lofar2_unb2b_sdp_station_adc/tb_lofar2_unb2b_sdp_station_adc.vhd
index b2652e604002332fd31a9dabaa98ae864aa812fc..8857119f97f65eb7d8f28db300a5fa1e060c2a50 100644
--- a/applications/lofar2/designs/lofar2_unb2b_sdp_station/revisions/lofar2_unb2b_sdp_station_adc/tb_lofar2_unb2b_sdp_station_adc.vhd
+++ b/applications/lofar2/designs/lofar2_unb2b_sdp_station/revisions/lofar2_unb2b_sdp_station_adc/tb_lofar2_unb2b_sdp_station_adc.vhd
@@ -85,13 +85,10 @@ ARCHITECTURE tb OF tb_lofar2_unb2b_sdp_station_adc IS
   CONSTANT c_hi_factor           : REAL := 1.0 + c_percentage;  -- higher boundary
 
   -- WG
-  CONSTANT c_full_scale_ampl      : REAL := REAL(2**(14-1)-1);  -- = full scale of WG
   CONSTANT c_bsn_start_wg         : NATURAL := 2;  -- start WG at this BSN to instead of some BSN, to avoid mismatches in exact expected data values
-  CONSTANT c_ampl_sp_0            : NATURAL := 2**(c_sdp_W_adc-1)/2;  -- in number of lsb
-  CONSTANT c_wg_subband_freq_unit : REAL := c_diag_wg_freq_unit/REAL(c_sdp_N_fft);  -- subband freq = Fs/1024 = 200 MSps/1024 = 195312.5 Hz sinus
+  CONSTANT c_ampl_sp_0            : NATURAL := c_sdp_FS_adc/2;  -- = 0.5 * FS, so in number of lsb
   CONSTANT c_wg_freq_offset       : REAL := 0.0/11.0; -- in freq_unit
   CONSTANT c_subband_sp_0         : REAL := 102.0;  -- Select subband at index 102 = 102/1024 * 200MHz = 19.921875 MHz 
-  CONSTANT c_wg_ampl_lsb          : REAL := c_diag_wg_ampl_unit / c_full_scale_ampl;  -- amplitude in number of LSbit resolution steps
   CONSTANT c_exp_wg_power_sp_0    : REAL := REAL(c_ampl_sp_0**2)/2.0 * REAL(c_nof_clk_per_sync);
 
   -- ADUH
@@ -253,8 +250,8 @@ BEGIN
     --   3 : ampl[16:0]
     mmf_mm_bus_wr(c_mm_file_reg_diag_wg, 0, 1024*2**16 + 1, tb_clk);  -- nof_samples, mode calc
     mmf_mm_bus_wr(c_mm_file_reg_diag_wg, 1, INTEGER(  0.0 * c_diag_wg_phase_unit), tb_clk);  -- phase offset in degrees
-    mmf_mm_bus_wr(c_mm_file_reg_diag_wg, 2, INTEGER((c_subband_sp_0+c_wg_freq_offset) * c_wg_subband_freq_unit), tb_clk);  -- freq
-    mmf_mm_bus_wr(c_mm_file_reg_diag_wg, 3, INTEGER(REAL(c_ampl_sp_0) * c_wg_ampl_lsb), tb_clk);  -- ampl
+    mmf_mm_bus_wr(c_mm_file_reg_diag_wg, 2, INTEGER((c_subband_sp_0+c_wg_freq_offset) * c_sdp_wg_subband_freq_unit), tb_clk);  -- freq
+    mmf_mm_bus_wr(c_mm_file_reg_diag_wg, 3, INTEGER(REAL(c_ampl_sp_0) * c_sdp_wg_ampl_lsb), tb_clk);  -- ampl
 
     -- Read current BSN
     mmf_mm_bus_rd(c_mm_file_reg_bsn_scheduler_wg, 0, current_bsn_wg(31 DOWNTO  0), tb_clk);
diff --git a/applications/lofar2/designs/lofar2_unb2b_sdp_station/revisions/lofar2_unb2b_sdp_station_bf/tb_lofar2_unb2b_sdp_station_bf.vhd b/applications/lofar2/designs/lofar2_unb2b_sdp_station/revisions/lofar2_unb2b_sdp_station_bf/tb_lofar2_unb2b_sdp_station_bf.vhd
index e8ce4aa58bc61676155d7925d19b2a7891079c50..db72ccae4fc97d40718982ba01b4fa0b1862757f 100644
--- a/applications/lofar2/designs/lofar2_unb2b_sdp_station/revisions/lofar2_unb2b_sdp_station_bf/tb_lofar2_unb2b_sdp_station_bf.vhd
+++ b/applications/lofar2/designs/lofar2_unb2b_sdp_station/revisions/lofar2_unb2b_sdp_station_bf/tb_lofar2_unb2b_sdp_station_bf.vhd
@@ -153,9 +153,7 @@ ARCHITECTURE tb OF tb_lofar2_unb2b_sdp_station_bf IS
   -- WG
   CONSTANT c_bsn_start_wg         : NATURAL := c_init_bsn + 2;  -- start WG at this BSN to instead of some BSN, to avoid mismatches in exact expected data values
   -- .ampl
-  CONSTANT c_wg_ampl_full_scale   : NATURAL := 2**(c_sdp_W_adc-1);  -- full scale (FS) of WG, will just cause clipping of +FS to +FS-1
-  CONSTANT c_wg_ampl_lsb          : REAL := c_diag_wg_ampl_unit / REAL(c_wg_ampl_full_scale);  -- amplitude in number of LSbit resolution steps
-  CONSTANT c_wg_ampl              : NATURAL := NATURAL(g_wg_ampl * REAL(c_wg_ampl_full_scale));  -- in number of lsb
+  CONSTANT c_wg_ampl              : NATURAL := NATURAL(g_wg_ampl * REAL(c_sdp_FS_adc));  -- in number of lsb
   CONSTANT c_exp_sp_power         : REAL := REAL(c_wg_ampl**2) / 2.0;
   CONSTANT c_exp_sp_ast           : REAL := c_exp_sp_power * REAL(c_nof_clk_per_sync);
   -- . phase
@@ -164,8 +162,6 @@ ARCHITECTURE tb OF tb_lofar2_unb2b_sdp_station_bf IS
   CONSTANT c_wg_latency           : INTEGER := c_diag_wg_latency - 0;  -- -0 to account for BSN scheduler start trigger latency
   CONSTANT c_wg_phase_offset      : REAL := 360.0 * REAL(c_wg_latency) * c_subband_freq;  -- c_diag_wg_latency is in dp_clk cycles
   CONSTANT c_wg_phase             : REAL := c_subband_phase + c_wg_phase_offset;  -- WG phase in degrees
-  -- . freq
-  CONSTANT c_wg_subband_freq_unit : REAL := c_diag_wg_freq_unit/REAL(c_sdp_N_fft);  -- subband freq = Fs/1024 = 200 MSps/1024 = 195312.5 Hz sinus
 
   -- WPFB
   CONSTANT c_pol_index                      : NATURAL := g_sp MOD c_sdp_Q_fft;
@@ -173,8 +169,7 @@ ARCHITECTURE tb OF tb_lofar2_unb2b_sdp_station_bf IS
   CONSTANT c_subband_phase_offset           : REAL := -90.0;  -- WG with zero phase sinues yields subband with -90 degrees phase (negative Im, zero Re)
   CONSTANT c_subband_weight_gain            : REAL := 1.0;  -- use default unit subband weights
   CONSTANT c_subband_weight_phase           : REAL := 0.0;  -- use default unit subband weights
-  CONSTANT c_exp_subband_sp_ampl_ratio      : REAL := 7.96;  -- ~= 8 for unit FIR DC gain, depends on internal WPFB quantization and FIR coefficients
-  CONSTANT c_exp_subband_ampl               : REAL := REAL(c_wg_ampl) * c_exp_subband_sp_ampl_ratio * c_subband_weight_gain;
+  CONSTANT c_exp_subband_ampl               : REAL := REAL(c_wg_ampl) * c_sdp_wpfb_subband_sp_ampl_ratio * c_subband_weight_gain;
   CONSTANT c_exp_subband_power              : REAL := c_exp_subband_ampl**2.0;  -- complex, so no divide by 2
   CONSTANT c_exp_subband_sst                : REAL := c_exp_subband_power * REAL(c_nof_block_per_sync);
 
@@ -604,7 +599,7 @@ BEGIN
       --   9   "sdp_source_info_gn_id"              ), "RW",  5, field_default(0) ),
       --
       --   7   "sdp_reserved"                       ), "RW", 40, field_default(0) ),
-      --   6   "sdp_beamlet_scale"                  ), "RW", 16, field_default(c_sdp_beamlet_scale_default) ),
+      --   6   "sdp_beamlet_scale"                  ), "RW", 16, field_default(c_sdp_unit_beamlet_scale) ),
       --   5   "sdp_beamlet_index"                  ), "RW", 16, field_default(0) ),
       --   4   "sdp_nof_blocks_per_packet"          ), "RW",  8, field_default(c_sdp_cep_nof_blocks_per_packet) ),
       --   3   "sdp_nof_beamlets_per_block"         ), "RW", 16, field_default(c_sdp_cep_nof_beamlets_per_block) ),
@@ -657,8 +652,8 @@ BEGIN
     v_offset := g_sp * c_mm_span_reg_diag_wg;
     mmf_mm_bus_wr(c_mm_file_reg_diag_wg, v_offset + 0, 1024*2**16 + 1, tb_clk);  -- nof_samples, mode calc
     mmf_mm_bus_wr(c_mm_file_reg_diag_wg, v_offset + 1, INTEGER(c_wg_phase * c_diag_wg_phase_unit), tb_clk);  -- phase offset in degrees
-    mmf_mm_bus_wr(c_mm_file_reg_diag_wg, v_offset + 2, INTEGER(REAL(g_subband) * c_wg_subband_freq_unit), tb_clk);  -- freq
-    mmf_mm_bus_wr(c_mm_file_reg_diag_wg, v_offset + 3, INTEGER(REAL(c_wg_ampl) * c_wg_ampl_lsb), tb_clk);  -- ampl
+    mmf_mm_bus_wr(c_mm_file_reg_diag_wg, v_offset + 2, INTEGER(REAL(g_subband) * c_sdp_wg_subband_freq_unit), tb_clk);  -- freq
+    mmf_mm_bus_wr(c_mm_file_reg_diag_wg, v_offset + 3, INTEGER(REAL(c_wg_ampl) * c_sdp_wg_ampl_lsb), tb_clk);  -- ampl
 
     -- Read current BSN
     mmf_mm_bus_rd(c_mm_file_reg_bsn_scheduler_wg, 0, current_bsn_wg(31 DOWNTO  0), tb_clk);
diff --git a/applications/lofar2/designs/lofar2_unb2b_sdp_station/revisions/lofar2_unb2b_sdp_station_fsub/tb_lofar2_unb2b_sdp_station_fsub.vhd b/applications/lofar2/designs/lofar2_unb2b_sdp_station/revisions/lofar2_unb2b_sdp_station_fsub/tb_lofar2_unb2b_sdp_station_fsub.vhd
index b48c8064f8144cc4d7172729ef1bd6dd6aa82d98..a3955762ff3b7e47a03cb1ae08290e80e24fd54b 100644
--- a/applications/lofar2/designs/lofar2_unb2b_sdp_station/revisions/lofar2_unb2b_sdp_station_fsub/tb_lofar2_unb2b_sdp_station_fsub.vhd
+++ b/applications/lofar2/designs/lofar2_unb2b_sdp_station/revisions/lofar2_unb2b_sdp_station_fsub/tb_lofar2_unb2b_sdp_station_fsub.vhd
@@ -114,9 +114,7 @@ ARCHITECTURE tb OF tb_lofar2_unb2b_sdp_station_fsub IS
   -- WG
   CONSTANT c_bsn_start_wg         : NATURAL := c_init_bsn + 2;  -- start WG at this BSN to instead of some BSN, to avoid mismatches in exact expected data values
   -- .ampl
-  CONSTANT c_wg_ampl_full_scale   : NATURAL := 2**(c_sdp_W_adc-1);  -- full scale (FS) of WG, will just cause clipping of +FS to +FS-1
-  CONSTANT c_wg_ampl_lsb          : REAL := c_diag_wg_ampl_unit / REAL(c_wg_ampl_full_scale);  -- amplitude in number of LSbit resolution steps
-  CONSTANT c_wg_ampl              : NATURAL := NATURAL(g_wg_ampl * REAL(c_wg_ampl_full_scale));  -- in number of lsb
+  CONSTANT c_wg_ampl              : NATURAL := NATURAL(g_wg_ampl * REAL(c_sdp_FS_adc));  -- in number of lsb
   CONSTANT c_exp_sp_power         : REAL := REAL(c_wg_ampl**2) / 2.0;
   CONSTANT c_exp_sp_ast           : REAL := c_exp_sp_power * REAL(c_nof_clk_per_sync);
   -- . phase
@@ -125,15 +123,12 @@ ARCHITECTURE tb OF tb_lofar2_unb2b_sdp_station_fsub IS
   CONSTANT c_wg_latency           : INTEGER := c_diag_wg_latency - 0;  -- -0 to account for BSN scheduler start trigger latency
   CONSTANT c_wg_phase_offset      : REAL := 360.0 * REAL(c_wg_latency) * c_subband_freq;  -- c_diag_wg_latency is in dp_clk cycles
   CONSTANT c_wg_phase             : REAL := c_subband_phase + c_wg_phase_offset;  -- WG phase in degrees
-  -- . freq
-  CONSTANT c_wg_subband_freq_unit : REAL := c_diag_wg_freq_unit/REAL(c_sdp_N_fft);  -- subband freq = Fs/1024 = 200 MSps/1024 = 195312.5 Hz sinus
 
   -- FSUB
   -- . WPFB
   CONSTANT c_pol_index                      : NATURAL := g_sp MOD c_sdp_Q_fft;
   CONSTANT c_pfb_index                      : NATURAL := g_sp / c_sdp_Q_fft;  -- only read used WPFB unit out of range(c_sdp_P_pfb = 6)
-  CONSTANT c_exp_subband_sp_ampl_ratio      : REAL := 7.96;  -- ~= 8 for unit FIR DC gain, depends on internal WPFB quantization and FIR coefficients
-  CONSTANT c_exp_subband_ampl_raw           : REAL := REAL(c_wg_ampl) * c_exp_subband_sp_ampl_ratio;
+  CONSTANT c_exp_subband_ampl_raw           : REAL := REAL(c_wg_ampl) * c_sdp_wpfb_subband_sp_ampl_ratio;
   CONSTANT c_exp_subband_ampl_weighted      : REAL := c_exp_subband_ampl_raw * g_subband_weight_gain;
   CONSTANT c_exp_subband_power_raw          : REAL := c_exp_subband_ampl_raw**2.0;  -- complex, so no divide by 2
   CONSTANT c_exp_subband_power_weighted     : REAL := c_exp_subband_ampl_weighted**2.0;  -- complex, so no divide by 2
@@ -353,8 +348,8 @@ BEGIN
     v_offset := g_sp * c_mm_span_reg_diag_wg;
     mmf_mm_bus_wr(c_mm_file_reg_diag_wg, v_offset + 0, 1024*2**16 + 1, tb_clk);  -- nof_samples, mode calc
     mmf_mm_bus_wr(c_mm_file_reg_diag_wg, v_offset + 1, INTEGER(c_wg_phase * c_diag_wg_phase_unit), tb_clk);  -- phase offset in degrees
-    mmf_mm_bus_wr(c_mm_file_reg_diag_wg, v_offset + 2, INTEGER(REAL(g_subband) * c_wg_subband_freq_unit), tb_clk);  -- freq
-    mmf_mm_bus_wr(c_mm_file_reg_diag_wg, v_offset + 3, INTEGER(REAL(c_wg_ampl) * c_wg_ampl_lsb), tb_clk);  -- ampl
+    mmf_mm_bus_wr(c_mm_file_reg_diag_wg, v_offset + 2, INTEGER(REAL(g_subband) * c_sdp_wg_subband_freq_unit), tb_clk);  -- freq
+    mmf_mm_bus_wr(c_mm_file_reg_diag_wg, v_offset + 3, INTEGER(REAL(c_wg_ampl) * c_sdp_wg_ampl_lsb), tb_clk);  -- ampl
 
     -- Read current BSN
     mmf_mm_bus_rd(c_mm_file_reg_bsn_scheduler_wg, 0, current_bsn_wg(31 DOWNTO  0), tb_clk);
diff --git a/applications/lofar2/designs/lofar2_unb2b_sdp_station/revisions/lofar2_unb2b_sdp_station_xsub_one/tb_lofar2_unb2b_sdp_station_xsub_one.vhd b/applications/lofar2/designs/lofar2_unb2b_sdp_station/revisions/lofar2_unb2b_sdp_station_xsub_one/tb_lofar2_unb2b_sdp_station_xsub_one.vhd
index 6bdaf12e935afa0b47dd0cb70c4a7b7bfb70434a..6f9806c00c2dfa97f4523b4b7b23aad145bc0f30 100644
--- a/applications/lofar2/designs/lofar2_unb2b_sdp_station/revisions/lofar2_unb2b_sdp_station_xsub_one/tb_lofar2_unb2b_sdp_station_xsub_one.vhd
+++ b/applications/lofar2/designs/lofar2_unb2b_sdp_station/revisions/lofar2_unb2b_sdp_station_xsub_one/tb_lofar2_unb2b_sdp_station_xsub_one.vhd
@@ -89,13 +89,10 @@ ARCHITECTURE tb OF tb_lofar2_unb2b_sdp_station_xsub_one IS
   CONSTANT c_hi_factor           : REAL := 1.0 + c_percentage;  -- higher boundary
 
   -- WG
-  CONSTANT c_FS_adc               : REAL := REAL(c_sdp_FS_adc);  -- = full scale of WG
   CONSTANT c_bsn_start_wg         : NATURAL := 2;  -- start WG at this BSN to instead of some BSN, to avoid mismatches in exact expected data values
   CONSTANT c_ampl_sp_0            : NATURAL := c_sdp_FS_adc/2;  -- = 0.5 * FS, so in number of lsb
-  CONSTANT c_wg_subband_freq_unit : REAL := c_diag_wg_freq_unit/REAL(c_sdp_N_fft);  -- subband freq = Fs/1024 = 200 MSps/1024 = 195312.5 Hz sinus
   CONSTANT c_wg_freq_offset       : REAL := 0.0/11.0; -- in freq_unit
   CONSTANT c_subband_sp_0         : REAL := 102.0;  -- Select subband at index 102 = 102/1024 * 200MHz = 19.921875 MHz 
-  CONSTANT c_wg_ampl_lsb          : REAL := c_diag_wg_ampl_unit / c_FS_adc;  -- amplitude in number of LSbit resolution steps
   CONSTANT c_exp_wg_power_sp_0    : REAL := REAL(c_ampl_sp_0**2)/2.0 * REAL(c_nof_clk_per_sync);
 
   -- WPFB
@@ -273,8 +270,8 @@ BEGIN
     FOR I IN 0 TO c_sdp_S_pn-1 LOOP
       mmf_mm_bus_wr(c_mm_file_reg_diag_wg, I*4 + 0, 1024*2**16 + 1, tb_clk);  -- nof_samples, mode calc
       mmf_mm_bus_wr(c_mm_file_reg_diag_wg, I*4 + 1, INTEGER(  0.0 * c_diag_wg_phase_unit), tb_clk);  -- phase offset in degrees
-      mmf_mm_bus_wr(c_mm_file_reg_diag_wg, I*4 + 2, INTEGER((c_subband_sp_0+c_wg_freq_offset) * c_wg_subband_freq_unit), tb_clk);  -- freq
-      mmf_mm_bus_wr(c_mm_file_reg_diag_wg, I*4 + 3, INTEGER(REAL(c_ampl_sp_0) * c_wg_ampl_lsb), tb_clk);  -- ampl
+      mmf_mm_bus_wr(c_mm_file_reg_diag_wg, I*4 + 2, INTEGER((c_subband_sp_0 + c_wg_freq_offset) * c_sdp_wg_subband_freq_unit), tb_clk);  -- freq
+      mmf_mm_bus_wr(c_mm_file_reg_diag_wg, I*4 + 3, INTEGER(REAL(c_ampl_sp_0) * c_sdp_wg_ampl_lsb), tb_clk);  -- ampl
     END LOOP;
 
     -- Read current BSN
diff --git a/applications/lofar2/designs/lofar2_unb2b_sdp_station/revisions/lofar2_unb2b_sdp_station_xsub_ring/tb_lofar2_unb2b_sdp_station_xsub_ring.vhd b/applications/lofar2/designs/lofar2_unb2b_sdp_station/revisions/lofar2_unb2b_sdp_station_xsub_ring/tb_lofar2_unb2b_sdp_station_xsub_ring.vhd
index cc9fab9fcd06ae09302aee6c241b78a2968c75e3..bae28377a194b0945c99117ea90ea8485bdc6276 100644
--- a/applications/lofar2/designs/lofar2_unb2b_sdp_station/revisions/lofar2_unb2b_sdp_station_xsub_ring/tb_lofar2_unb2b_sdp_station_xsub_ring.vhd
+++ b/applications/lofar2/designs/lofar2_unb2b_sdp_station/revisions/lofar2_unb2b_sdp_station_xsub_ring/tb_lofar2_unb2b_sdp_station_xsub_ring.vhd
@@ -94,13 +94,10 @@ ARCHITECTURE tb OF tb_lofar2_unb2b_sdp_station_xsub_ring IS
   CONSTANT c_nof_lanes           : NATURAL := 1;
 
   -- WG
-  CONSTANT c_FS_adc               : REAL := REAL(c_sdp_FS_adc);  -- = full scale of WG
   CONSTANT c_bsn_start_wg         : NATURAL := 2;  -- start WG at this BSN to instead of some BSN, to avoid mismatches in exact expected data values
   CONSTANT c_ampl_sp_0            : NATURAL := c_sdp_FS_adc/2;  -- = 0.5 * FS, so in number of lsb
-  CONSTANT c_wg_subband_freq_unit : REAL := c_diag_wg_freq_unit/REAL(c_sdp_N_fft);  -- subband freq = Fs/1024 = 200 MSps/1024 = 195312.5 Hz sinus
   CONSTANT c_wg_freq_offset       : REAL := 0.0/11.0; -- in freq_unit
   CONSTANT c_subband_sp_0         : REAL := 102.0;  -- Select subband at index 102 = 102/1024 * 200MHz = 19.921875 MHz 
-  CONSTANT c_wg_ampl_lsb          : REAL := c_diag_wg_ampl_unit / c_FS_adc;  -- amplitude in number of LSbit resolution steps
   CONSTANT c_exp_wg_power_sp_0    : REAL := REAL(c_ampl_sp_0**2)/2.0 * REAL(c_nof_clk_per_sync);
 
   -- WPFB
@@ -350,8 +347,8 @@ BEGIN
       FOR I IN 0 TO c_sdp_S_pn-1 LOOP
         mmf_mm_bus_wr(mmf_unb_file_prefix(c_unb_nr + (RN / c_quad), RN MOD c_quad) & "REG_WG", I*4 + 0, 1024*2**16 + 1, tb_clk);  -- nof_samples, mode calc
         mmf_mm_bus_wr(mmf_unb_file_prefix(c_unb_nr + (RN / c_quad), RN MOD c_quad) & "REG_WG", I*4 + 1, INTEGER(  0.0 * c_diag_wg_phase_unit), tb_clk);  -- phase offset in degrees
-        mmf_mm_bus_wr(mmf_unb_file_prefix(c_unb_nr + (RN / c_quad), RN MOD c_quad) & "REG_WG", I*4 + 2, INTEGER((c_subband_sp_0+c_wg_freq_offset) * c_wg_subband_freq_unit), tb_clk);  -- freq
-        mmf_mm_bus_wr(mmf_unb_file_prefix(c_unb_nr + (RN / c_quad), RN MOD c_quad) & "REG_WG", I*4 + 3, INTEGER(REAL(c_ampl_sp_0) * c_wg_ampl_lsb), tb_clk);  -- ampl
+        mmf_mm_bus_wr(mmf_unb_file_prefix(c_unb_nr + (RN / c_quad), RN MOD c_quad) & "REG_WG", I*4 + 2, INTEGER((c_subband_sp_0 + c_wg_freq_offset) * c_sdp_wg_subband_freq_unit), tb_clk);  -- freq
+        mmf_mm_bus_wr(mmf_unb_file_prefix(c_unb_nr + (RN / c_quad), RN MOD c_quad) & "REG_WG", I*4 + 3, INTEGER(REAL(c_ampl_sp_0) * c_sdp_wg_ampl_lsb), tb_clk);  -- ampl
       END LOOP;
     END LOOP;
 
diff --git a/applications/lofar2/designs/lofar2_unb2b_sdp_station/tb/vhdl/tb_lofar2_unb2b_sdp_station.vhd b/applications/lofar2/designs/lofar2_unb2b_sdp_station/tb/vhdl/tb_lofar2_unb2b_sdp_station.vhd
index 3c63f38cd1b46e389ec71d96f70af019f539ee1f..cf7b09358cc248615adbb96566840e7c822fcc4e 100644
--- a/applications/lofar2/designs/lofar2_unb2b_sdp_station/tb/vhdl/tb_lofar2_unb2b_sdp_station.vhd
+++ b/applications/lofar2/designs/lofar2_unb2b_sdp_station/tb/vhdl/tb_lofar2_unb2b_sdp_station.vhd
@@ -69,13 +69,9 @@ ARCHITECTURE tb OF tb_lofar2_unb2b_sdp_station IS
   CONSTANT c_wpfb_sim                     : t_wpfb := func_wpfb_set_nof_block_per_sync(c_sdp_wpfb_subbands, c_nof_block_per_sync);
    
   -- WG
-  CONSTANT c_full_scale_ampl              : REAL := REAL(2**(18-1) - 1);  -- = full scale of WG
   CONSTANT c_bsn_start_wg                 : NATURAL := 2;  -- start WG at this BSN to instead of some BSN, to avoid mismatches in exact expected data values
-  CONSTANT c_ampl_sp_0                    : NATURAL := 2**(c_sdp_W_adc-1) / 2;  -- in number of lsb
-  CONSTANT c_wg_subband_freq_unit         : REAL := c_diag_wg_freq_unit / REAL(c_sdp_N_fft);  -- subband freq = Fs/1024 = 200 MSps/1024 = 195312.5 Hz sinus
-  CONSTANT c_wg_freq_offset               : REAL := 0.0 / 11.0; -- in freq_unit
+  CONSTANT c_ampl_sp_0                    : NATURAL := c_sdp_FS_adc/2;  -- = 0.5 * FS, so in number of lsb
   CONSTANT c_subband_sp_0                 : REAL := 102.0;  -- Select subband at index 102 = 102/1024 * 200MHz = 19.921875 MHz
-  CONSTANT c_wg_ampl_lsb                  : REAL := c_diag_wg_ampl_unit / c_full_scale_ampl;  -- amplitude in number of LSbit resolution steps
 
 -- . 1GbE output
   CONSTANT c_eth_check_nof_packets        : NATURAL := 1;
@@ -219,10 +215,10 @@ BEGIN
     --   1 : phase[15:0]
     --   2 : freq[30:0]
     --   3 : ampl[16:0]
-    mmf_mm_bus_wr(c_mm_file_reg_diag_wg, 0,                                                      1024 * 2**16 + 1, tb_clk);  -- nof_samples, mode calc
-    mmf_mm_bus_wr(c_mm_file_reg_diag_wg, 1,                                 INTEGER(  0.0 * c_diag_wg_phase_unit), tb_clk);  -- phase offset in degrees
-    mmf_mm_bus_wr(c_mm_file_reg_diag_wg, 2, INTEGER((c_subband_sp_0 + c_wg_freq_offset) * c_wg_subband_freq_unit), tb_clk);  -- freq
-    mmf_mm_bus_wr(c_mm_file_reg_diag_wg, 3,                            INTEGER(REAL(c_ampl_sp_0) * c_wg_ampl_lsb), tb_clk);  -- ampl
+    mmf_mm_bus_wr(c_mm_file_reg_diag_wg, 0,                                     1024 * 2**16 + 1, tb_clk);  -- nof_samples, mode calc
+    mmf_mm_bus_wr(c_mm_file_reg_diag_wg, 1,                INTEGER(  0.0 * c_diag_wg_phase_unit), tb_clk);  -- phase offset in degrees
+    mmf_mm_bus_wr(c_mm_file_reg_diag_wg, 2, INTEGER(c_subband_sp_0 * c_sdp_wg_subband_freq_unit), tb_clk);  -- freq
+    mmf_mm_bus_wr(c_mm_file_reg_diag_wg, 3,       INTEGER(REAL(c_ampl_sp_0) * c_sdp_wg_ampl_lsb), tb_clk);  -- ampl
 
     -- Read current BSN
     mmf_mm_bus_rd(c_mm_file_reg_bsn_scheduler_wg, 0, current_bsn_wg(31 DOWNTO  0), tb_clk);
diff --git a/applications/lofar2/designs/lofar2_unb2c_sdp_station/revisions/lofar2_unb2c_sdp_station_adc/tb_lofar2_unb2c_sdp_station_adc.vhd b/applications/lofar2/designs/lofar2_unb2c_sdp_station/revisions/lofar2_unb2c_sdp_station_adc/tb_lofar2_unb2c_sdp_station_adc.vhd
index 6f191077675c51968fbc4bfc36c193b6f2aaf07e..70cc4fc665584d56982fa5701e5e15ce49fc0492 100644
--- a/applications/lofar2/designs/lofar2_unb2c_sdp_station/revisions/lofar2_unb2c_sdp_station_adc/tb_lofar2_unb2c_sdp_station_adc.vhd
+++ b/applications/lofar2/designs/lofar2_unb2c_sdp_station/revisions/lofar2_unb2c_sdp_station_adc/tb_lofar2_unb2c_sdp_station_adc.vhd
@@ -85,13 +85,10 @@ ARCHITECTURE tb OF tb_lofar2_unb2c_sdp_station_adc IS
   CONSTANT c_hi_factor           : REAL := 1.0 + c_percentage;  -- higher boundary
 
   -- WG
-  CONSTANT c_full_scale_ampl      : REAL := REAL(2**(14-1)-1);  -- = full scale of WG
   CONSTANT c_bsn_start_wg         : NATURAL := 2;  -- start WG at this BSN to instead of some BSN, to avoid mismatches in exact expected data values
-  CONSTANT c_ampl_sp_0            : NATURAL := 2**(c_sdp_W_adc-1)/2;  -- in number of lsb
-  CONSTANT c_wg_subband_freq_unit : REAL := c_diag_wg_freq_unit/REAL(c_sdp_N_fft);  -- subband freq = Fs/1024 = 200 MSps/1024 = 195312.5 Hz sinus
+  CONSTANT c_ampl_sp_0            : NATURAL := c_sdp_FS_adc/2;  -- = 0.5 * FS, so in number of lsb
   CONSTANT c_wg_freq_offset       : REAL := 0.0/11.0; -- in freq_unit
   CONSTANT c_subband_sp_0         : REAL := 102.0;  -- Select subband at index 102 = 102/1024 * 200MHz = 19.921875 MHz 
-  CONSTANT c_wg_ampl_lsb          : REAL := c_diag_wg_ampl_unit / c_full_scale_ampl;  -- amplitude in number of LSbit resolution steps
   CONSTANT c_exp_wg_power_sp_0    : REAL := REAL(c_ampl_sp_0**2)/2.0 * REAL(c_nof_clk_per_sync);
 
   -- ADUH
@@ -235,8 +232,8 @@ BEGIN
     --   3 : ampl[16:0]
     mmf_mm_bus_wr(c_mm_file_reg_diag_wg, 0, 1024*2**16 + 1, tb_clk);  -- nof_samples, mode calc
     mmf_mm_bus_wr(c_mm_file_reg_diag_wg, 1, INTEGER(  0.0 * c_diag_wg_phase_unit), tb_clk);  -- phase offset in degrees
-    mmf_mm_bus_wr(c_mm_file_reg_diag_wg, 2, INTEGER((c_subband_sp_0+c_wg_freq_offset) * c_wg_subband_freq_unit), tb_clk);  -- freq
-    mmf_mm_bus_wr(c_mm_file_reg_diag_wg, 3, INTEGER(REAL(c_ampl_sp_0) * c_wg_ampl_lsb), tb_clk);  -- ampl
+    mmf_mm_bus_wr(c_mm_file_reg_diag_wg, 2, INTEGER((c_subband_sp_0 + c_wg_freq_offset) * c_sdp_wg_subband_freq_unit), tb_clk);  -- freq
+    mmf_mm_bus_wr(c_mm_file_reg_diag_wg, 3, INTEGER(REAL(c_ampl_sp_0) * c_sdp_wg_ampl_lsb), tb_clk);  -- ampl
 
     -- Read current BSN
     mmf_mm_bus_rd(c_mm_file_reg_bsn_scheduler_wg, 0, current_bsn_wg(31 DOWNTO  0), tb_clk);
diff --git a/applications/lofar2/designs/lofar2_unb2c_sdp_station/revisions/lofar2_unb2c_sdp_station_bf/tb_lofar2_unb2c_sdp_station_bf.vhd b/applications/lofar2/designs/lofar2_unb2c_sdp_station/revisions/lofar2_unb2c_sdp_station_bf/tb_lofar2_unb2c_sdp_station_bf.vhd
index c641685358e7fcb63c7f01ad40ca2c14c3c4dc69..c995e931644467a19e890a769c8ec7b395c4a7f6 100644
--- a/applications/lofar2/designs/lofar2_unb2c_sdp_station/revisions/lofar2_unb2c_sdp_station_bf/tb_lofar2_unb2c_sdp_station_bf.vhd
+++ b/applications/lofar2/designs/lofar2_unb2c_sdp_station/revisions/lofar2_unb2c_sdp_station_bf/tb_lofar2_unb2c_sdp_station_bf.vhd
@@ -225,10 +225,8 @@ ARCHITECTURE tb OF tb_lofar2_unb2c_sdp_station_bf IS
   -- WG
   CONSTANT c_bsn_start_wg         : NATURAL := c_init_bsn + 2;  -- start WG at this BSN to instead of some BSN, to avoid mismatches in exact expected data values
   -- .ampl
-  CONSTANT c_wg_ampl_full_scale   : NATURAL := 2**(c_sdp_W_adc-1);  -- full scale (FS) of WG, will just cause clipping of +FS to +FS-1
-  CONSTANT c_wg_ampl_lsb          : REAL := c_diag_wg_ampl_unit / REAL(c_wg_ampl_full_scale);  -- amplitude in number of LSbit resolution steps
-  CONSTANT c_wg_ampl              : NATURAL := NATURAL(g_sp_ampl * REAL(c_wg_ampl_full_scale));  -- in number of lsb
-  CONSTANT c_wg_remnant_ampl      : NATURAL := NATURAL(g_sp_remnant_ampl * REAL(c_wg_ampl_full_scale));  -- in number of lsb
+  CONSTANT c_wg_ampl              : NATURAL := NATURAL(g_sp_ampl * REAL(c_sdp_FS_adc));  -- in number of lsb
+  CONSTANT c_wg_remnant_ampl      : NATURAL := NATURAL(g_sp_remnant_ampl * REAL(c_sdp_FS_adc));  -- in number of lsb
   CONSTANT c_exp_sp_power         : REAL := REAL(c_wg_ampl**2) / 2.0;
   CONSTANT c_exp_sp_ast           : REAL := c_exp_sp_power * REAL(c_nof_clk_per_sync);
   -- . phase
@@ -237,8 +235,6 @@ ARCHITECTURE tb OF tb_lofar2_unb2c_sdp_station_bf IS
   CONSTANT c_wg_phase_offset      : REAL := 360.0 * REAL(c_wg_latency) * c_subband_freq;  -- c_diag_wg_latency is in dp_clk cycles
   CONSTANT c_wg_phase             : REAL := g_sp_phase + c_wg_phase_offset;  -- WG phase in degrees
   CONSTANT c_wg_remnant_phase     : REAL := g_sp_remnant_phase + c_wg_phase_offset;  -- WG phase in degrees
-  -- . freq
-  CONSTANT c_wg_subband_freq_unit : REAL := c_diag_wg_freq_unit/REAL(c_sdp_N_fft);  -- subband freq = Fs/1024 = 200 MSps/1024 = 195312.5 Hz sinus
 
   -- WPFB
   CONSTANT c_pol_index                    : NATURAL := g_sp MOD c_sdp_Q_fft;
@@ -760,7 +756,7 @@ BEGIN
       --   9   "sdp_source_info_gn_id"              ), "RW",  5, field_default(0) ),
       --
       --   7   "sdp_reserved"                       ), "RW", 40, field_default(0) ),
-      --   6   "sdp_beamlet_scale"                  ), "RW", 16, field_default(c_sdp_beamlet_scale_default) ),
+      --   6   "sdp_beamlet_scale"                  ), "RW", 16, field_default(c_sdp_unit_beamlet_scale) ),
       --   5   "sdp_beamlet_index"                  ), "RW", 16, field_default(0) ),
       --   4   "sdp_nof_blocks_per_packet"          ), "RW",  8, field_default(c_sdp_cep_nof_blocks_per_packet) ),
       --   3   "sdp_nof_beamlets_per_block"         ), "RW", 16, field_default(c_sdp_cep_nof_beamlets_per_block) ),
@@ -815,13 +811,13 @@ BEGIN
       IF s = g_sp THEN
         mmf_mm_bus_wr(c_mm_file_reg_diag_wg, v_offset + 0, 1024*2**16 + 1, tb_clk);  -- nof_samples, mode calc
         mmf_mm_bus_wr(c_mm_file_reg_diag_wg, v_offset + 1, INTEGER(c_wg_phase * c_diag_wg_phase_unit), tb_clk);  -- phase offset in degrees
-        mmf_mm_bus_wr(c_mm_file_reg_diag_wg, v_offset + 2, INTEGER(REAL(g_subband) * c_wg_subband_freq_unit), tb_clk);  -- freq
-        mmf_mm_bus_wr(c_mm_file_reg_diag_wg, v_offset + 3, INTEGER(REAL(c_wg_ampl) * c_wg_ampl_lsb), tb_clk);  -- ampl
+        mmf_mm_bus_wr(c_mm_file_reg_diag_wg, v_offset + 2, INTEGER(REAL(g_subband) * c_sdp_wg_subband_freq_unit), tb_clk);  -- freq
+        mmf_mm_bus_wr(c_mm_file_reg_diag_wg, v_offset + 3, INTEGER(REAL(c_wg_ampl) * c_sdp_wg_ampl_lsb), tb_clk);  -- ampl
       ELSE
         mmf_mm_bus_wr(c_mm_file_reg_diag_wg, v_offset + 0, 1024*2**16 + 1, tb_clk);  -- nof_samples, mode calc
         mmf_mm_bus_wr(c_mm_file_reg_diag_wg, v_offset + 1, INTEGER(c_wg_remnant_phase * c_diag_wg_phase_unit), tb_clk);  -- phase offset in degrees
-        mmf_mm_bus_wr(c_mm_file_reg_diag_wg, v_offset + 2, INTEGER(REAL(g_subband) * c_wg_subband_freq_unit), tb_clk);  -- freq
-        mmf_mm_bus_wr(c_mm_file_reg_diag_wg, v_offset + 3, INTEGER(REAL(c_wg_remnant_ampl) * c_wg_ampl_lsb), tb_clk);  -- ampl
+        mmf_mm_bus_wr(c_mm_file_reg_diag_wg, v_offset + 2, INTEGER(REAL(g_subband) * c_sdp_wg_subband_freq_unit), tb_clk);  -- freq
+        mmf_mm_bus_wr(c_mm_file_reg_diag_wg, v_offset + 3, INTEGER(REAL(c_wg_remnant_ampl) * c_sdp_wg_ampl_lsb), tb_clk);  -- ampl
       END IF;
     END LOOP;
 
diff --git a/applications/lofar2/designs/lofar2_unb2c_sdp_station/revisions/lofar2_unb2c_sdp_station_bf_ring/tb_lofar2_unb2c_sdp_station_bf_ring.vhd b/applications/lofar2/designs/lofar2_unb2c_sdp_station/revisions/lofar2_unb2c_sdp_station_bf_ring/tb_lofar2_unb2c_sdp_station_bf_ring.vhd
index d1efebdef031e01550a6d3853bfcfaa6b94f3f10..8199b260fc08ad707a490e6a16076d1d4c074d34 100644
--- a/applications/lofar2/designs/lofar2_unb2c_sdp_station/revisions/lofar2_unb2c_sdp_station_bf_ring/tb_lofar2_unb2c_sdp_station_bf_ring.vhd
+++ b/applications/lofar2/designs/lofar2_unb2c_sdp_station/revisions/lofar2_unb2c_sdp_station_bf_ring/tb_lofar2_unb2c_sdp_station_bf_ring.vhd
@@ -227,10 +227,8 @@ ARCHITECTURE tb OF tb_lofar2_unb2c_sdp_station_bf_ring IS
   -- WG
   CONSTANT c_bsn_start_wg         : NATURAL := c_init_bsn + 2;  -- start WG at this BSN to instead of some BSN, to avoid mismatches in exact expected data values
   -- .ampl
-  CONSTANT c_wg_ampl_full_scale   : NATURAL := 2**(c_sdp_W_adc-1);  -- full scale (FS) of WG, will just cause clipping of +FS to +FS-1
-  CONSTANT c_wg_ampl_lsb          : REAL := c_diag_wg_ampl_unit / REAL(c_wg_ampl_full_scale);  -- amplitude in number of LSbit resolution steps
-  CONSTANT c_wg_ampl              : NATURAL := NATURAL(g_sp_ampl * REAL(c_wg_ampl_full_scale));  -- in number of lsb
-  CONSTANT c_wg_remnant_ampl      : NATURAL := NATURAL(g_sp_remnant_ampl * REAL(c_wg_ampl_full_scale));  -- in number of lsb
+  CONSTANT c_wg_ampl              : NATURAL := NATURAL(g_sp_ampl * REAL(c_sdp_FS_adc));  -- in number of lsb
+  CONSTANT c_wg_remnant_ampl      : NATURAL := NATURAL(g_sp_remnant_ampl * REAL(c_sdp_FS_adc));  -- in number of lsb
   CONSTANT c_exp_sp_power         : REAL := REAL(c_wg_ampl**2) / 2.0;
   CONSTANT c_exp_sp_ast           : REAL := c_exp_sp_power * REAL(c_nof_clk_per_sync);
   -- . phase
@@ -239,8 +237,6 @@ ARCHITECTURE tb OF tb_lofar2_unb2c_sdp_station_bf_ring IS
   CONSTANT c_wg_phase_offset      : REAL := 360.0 * REAL(c_wg_latency) * c_subband_freq;  -- c_diag_wg_latency is in dp_clk cycles
   CONSTANT c_wg_phase             : REAL := g_sp_phase + c_wg_phase_offset;  -- WG phase in degrees
   CONSTANT c_wg_remnant_phase     : REAL := g_sp_remnant_phase + c_wg_phase_offset;  -- WG phase in degrees
-  -- . freq
-  CONSTANT c_wg_subband_freq_unit : REAL := c_diag_wg_freq_unit/REAL(c_sdp_N_fft);  -- subband freq = Fs/1024 = 200 MSps/1024 = 195312.5 Hz sinus
 
   -- WPFB
   CONSTANT c_pol_index                    : NATURAL := g_sp MOD c_sdp_Q_fft;
@@ -800,7 +796,7 @@ BEGIN
       --   9   "sdp_source_info_gn_id"              ), "RW",  5, field_default(0) ),
       --
       --   7   "sdp_reserved"                       ), "RW", 40, field_default(0) ),
-      --   6   "sdp_beamlet_scale"                  ), "RW", 16, field_default(c_sdp_beamlet_scale_default) ),
+      --   6   "sdp_beamlet_scale"                  ), "RW", 16, field_default(c_sdp_unit_beamlet_scale) ),
       --   5   "sdp_beamlet_index"                  ), "RW", 16, field_default(0) ),
       --   4   "sdp_nof_blocks_per_packet"          ), "RW",  8, field_default(c_sdp_cep_nof_blocks_per_packet) ),
       --   3   "sdp_nof_beamlets_per_block"         ), "RW", 16, field_default(c_sdp_cep_nof_beamlets_per_block) ),
@@ -888,13 +884,13 @@ BEGIN
         IF RN * c_sdp_S_pn + I = g_sp THEN
           mmf_mm_bus_wr(mmf_unb_file_prefix(c_unb_nr + (RN / c_quad), RN MOD c_quad) & "REG_WG", I*4 + 0, 1024*2**16 + 1, tb_clk);  -- nof_samples, mode calc
           mmf_mm_bus_wr(mmf_unb_file_prefix(c_unb_nr + (RN / c_quad), RN MOD c_quad) & "REG_WG", I*4 + 1, INTEGER(c_wg_phase * c_diag_wg_phase_unit), tb_clk);  -- phase offset in degrees
-          mmf_mm_bus_wr(mmf_unb_file_prefix(c_unb_nr + (RN / c_quad), RN MOD c_quad) & "REG_WG", I*4 + 2, INTEGER(REAL(g_subband) * c_wg_subband_freq_unit), tb_clk);  -- freq
-          mmf_mm_bus_wr(mmf_unb_file_prefix(c_unb_nr + (RN / c_quad), RN MOD c_quad) & "REG_WG", I*4 + 3, INTEGER(REAL(c_wg_ampl) * c_wg_ampl_lsb), tb_clk);  -- ampl
+          mmf_mm_bus_wr(mmf_unb_file_prefix(c_unb_nr + (RN / c_quad), RN MOD c_quad) & "REG_WG", I*4 + 2, INTEGER(REAL(g_subband) * c_sdp_wg_subband_freq_unit), tb_clk);  -- freq
+          mmf_mm_bus_wr(mmf_unb_file_prefix(c_unb_nr + (RN / c_quad), RN MOD c_quad) & "REG_WG", I*4 + 3, INTEGER(REAL(c_wg_ampl) * c_sdp_wg_ampl_lsb), tb_clk);  -- ampl
         ELSE
           mmf_mm_bus_wr(mmf_unb_file_prefix(c_unb_nr + (RN / c_quad), RN MOD c_quad) & "REG_WG", I*4 + 0, 1024*2**16 + 1, tb_clk);  -- nof_samples, mode calc
           mmf_mm_bus_wr(mmf_unb_file_prefix(c_unb_nr + (RN / c_quad), RN MOD c_quad) & "REG_WG", I*4 + 1, INTEGER(c_wg_remnant_phase * c_diag_wg_phase_unit), tb_clk);  -- phase offset in degrees
-          mmf_mm_bus_wr(mmf_unb_file_prefix(c_unb_nr + (RN / c_quad), RN MOD c_quad) & "REG_WG", I*4 + 2, INTEGER(REAL(g_subband) * c_wg_subband_freq_unit), tb_clk);  -- freq
-          mmf_mm_bus_wr(mmf_unb_file_prefix(c_unb_nr + (RN / c_quad), RN MOD c_quad) & "REG_WG", I*4 + 3, INTEGER(REAL(c_wg_remnant_ampl) * c_wg_ampl_lsb), tb_clk);  -- ampl
+          mmf_mm_bus_wr(mmf_unb_file_prefix(c_unb_nr + (RN / c_quad), RN MOD c_quad) & "REG_WG", I*4 + 2, INTEGER(REAL(g_subband) * c_sdp_wg_subband_freq_unit), tb_clk);  -- freq
+          mmf_mm_bus_wr(mmf_unb_file_prefix(c_unb_nr + (RN / c_quad), RN MOD c_quad) & "REG_WG", I*4 + 3, INTEGER(REAL(c_wg_remnant_ampl) * c_sdp_wg_ampl_lsb), tb_clk);  -- ampl
         END IF;
       END LOOP;
     END LOOP;
diff --git a/applications/lofar2/designs/lofar2_unb2c_sdp_station/revisions/lofar2_unb2c_sdp_station_fsub/tb_lofar2_unb2c_sdp_station_fsub.vhd b/applications/lofar2/designs/lofar2_unb2c_sdp_station/revisions/lofar2_unb2c_sdp_station_fsub/tb_lofar2_unb2c_sdp_station_fsub.vhd
index 1896e85d9447a378aff1e97882eda23696324c4e..4d70659aa31bd72e71412a6e52368cb376123312 100644
--- a/applications/lofar2/designs/lofar2_unb2c_sdp_station/revisions/lofar2_unb2c_sdp_station_fsub/tb_lofar2_unb2c_sdp_station_fsub.vhd
+++ b/applications/lofar2/designs/lofar2_unb2c_sdp_station/revisions/lofar2_unb2c_sdp_station_fsub/tb_lofar2_unb2c_sdp_station_fsub.vhd
@@ -114,9 +114,7 @@ ARCHITECTURE tb OF tb_lofar2_unb2c_sdp_station_fsub IS
   -- WG
   CONSTANT c_bsn_start_wg         : NATURAL := c_init_bsn + 2;  -- start WG at this BSN to instead of some BSN, to avoid mismatches in exact expected data values
   -- .ampl
-  CONSTANT c_wg_ampl_full_scale   : NATURAL := 2**(c_sdp_W_adc-1);  -- full scale (FS) of WG, will just cause clipping of +FS to +FS-1
-  CONSTANT c_wg_ampl_lsb          : REAL := c_diag_wg_ampl_unit / REAL(c_wg_ampl_full_scale);  -- amplitude in number of LSbit resolution steps
-  CONSTANT c_wg_ampl              : NATURAL := NATURAL(g_wg_ampl * REAL(c_wg_ampl_full_scale));  -- in number of lsb
+  CONSTANT c_wg_ampl              : NATURAL := NATURAL(g_wg_ampl * REAL(c_sdp_FS_adc));  -- in number of lsb
   CONSTANT c_exp_sp_power         : REAL := REAL(c_wg_ampl**2) / 2.0;
   CONSTANT c_exp_sp_ast           : REAL := c_exp_sp_power * REAL(c_nof_clk_per_sync);
   -- . phase
@@ -125,15 +123,12 @@ ARCHITECTURE tb OF tb_lofar2_unb2c_sdp_station_fsub IS
   CONSTANT c_wg_latency           : INTEGER := c_diag_wg_latency - 0;  -- -0 to account for BSN scheduler start trigger latency
   CONSTANT c_wg_phase_offset      : REAL := 360.0 * REAL(c_wg_latency) * c_subband_freq;  -- c_diag_wg_latency is in dp_clk cycles
   CONSTANT c_wg_phase             : REAL := c_subband_phase + c_wg_phase_offset;  -- WG phase in degrees
-  -- . freq
-  CONSTANT c_wg_subband_freq_unit : REAL := c_diag_wg_freq_unit/REAL(c_sdp_N_fft);  -- subband freq = Fs/1024 = 200 MSps/1024 = 195312.5 Hz sinus
 
   -- FSUB
   -- . WPFB
   CONSTANT c_pol_index                      : NATURAL := g_sp MOD c_sdp_Q_fft;
   CONSTANT c_pfb_index                      : NATURAL := g_sp / c_sdp_Q_fft;  -- only read used WPFB unit out of range(c_sdp_P_pfb = 6)
-  CONSTANT c_exp_subband_sp_ampl_ratio      : REAL := 7.96;  -- ~= 8 for unit FIR DC gain, depends on internal WPFB quantization and FIR coefficients
-  CONSTANT c_exp_subband_ampl_raw           : REAL := REAL(c_wg_ampl) * c_exp_subband_sp_ampl_ratio;
+  CONSTANT c_exp_subband_ampl_raw           : REAL := REAL(c_wg_ampl) * c_sdp_wpfb_subband_sp_ampl_ratio;
   CONSTANT c_exp_subband_ampl_weighted      : REAL := c_exp_subband_ampl_raw * g_subband_weight_gain;
   CONSTANT c_exp_subband_power_raw          : REAL := c_exp_subband_ampl_raw**2.0;  -- complex, so no divide by 2
   CONSTANT c_exp_subband_power_weighted     : REAL := c_exp_subband_ampl_weighted**2.0;  -- complex, so no divide by 2
@@ -335,8 +330,8 @@ BEGIN
     v_offset := g_sp * c_mm_span_reg_diag_wg;
     mmf_mm_bus_wr(c_mm_file_reg_diag_wg, v_offset + 0, 1024*2**16 + 1, tb_clk);  -- nof_samples, mode calc
     mmf_mm_bus_wr(c_mm_file_reg_diag_wg, v_offset + 1, INTEGER(c_wg_phase * c_diag_wg_phase_unit), tb_clk);  -- phase offset in degrees
-    mmf_mm_bus_wr(c_mm_file_reg_diag_wg, v_offset + 2, INTEGER(REAL(g_subband) * c_wg_subband_freq_unit), tb_clk);  -- freq
-    mmf_mm_bus_wr(c_mm_file_reg_diag_wg, v_offset + 3, INTEGER(REAL(c_wg_ampl) * c_wg_ampl_lsb), tb_clk);  -- ampl
+    mmf_mm_bus_wr(c_mm_file_reg_diag_wg, v_offset + 2, INTEGER(REAL(g_subband) * c_sdp_wg_subband_freq_unit), tb_clk);  -- freq
+    mmf_mm_bus_wr(c_mm_file_reg_diag_wg, v_offset + 3, INTEGER(REAL(c_wg_ampl) * c_sdp_wg_ampl_lsb), tb_clk);  -- ampl
 
     -- Read current BSN
     mmf_mm_bus_rd(c_mm_file_reg_bsn_scheduler_wg, 0, current_bsn_wg(31 DOWNTO  0), tb_clk);
diff --git a/applications/lofar2/designs/lofar2_unb2c_sdp_station/revisions/lofar2_unb2c_sdp_station_xsub_one/tb_lofar2_unb2c_sdp_station_xsub_one.vhd b/applications/lofar2/designs/lofar2_unb2c_sdp_station/revisions/lofar2_unb2c_sdp_station_xsub_one/tb_lofar2_unb2c_sdp_station_xsub_one.vhd
index 3b8c5cb0fe2672726f3b078aaed54afd41b55d73..2774f8ae02240508d9aa2160f8986d5fb38e46d8 100644
--- a/applications/lofar2/designs/lofar2_unb2c_sdp_station/revisions/lofar2_unb2c_sdp_station_xsub_one/tb_lofar2_unb2c_sdp_station_xsub_one.vhd
+++ b/applications/lofar2/designs/lofar2_unb2c_sdp_station/revisions/lofar2_unb2c_sdp_station_xsub_one/tb_lofar2_unb2c_sdp_station_xsub_one.vhd
@@ -34,15 +34,16 @@
 --      to trigger start of WG at BSN.
 --     
 --   3) Read crosslets statistics (XST) via ram_st_xsq and verify that the values
---      are as expected. This is done by comparing the values in the outgoing square
---      correlation matrix.
---         
+--      are as expected. This is done by:
+--      . comparing the values in the outgoing square correlation matrix, they
+--        should all be almost equal because all signal inputs use same WG
+--      . comparing with expected XST value c_exp_subband_xst
 --
 -- Usage:
 --   > as 7    # default
 --   > as 12   # for detailed debugging
 --   > run -a  
---   Takes about 40 m
+--   Takes about 45 m
 --
 -------------------------------------------------------------------------------
 LIBRARY IEEE, common_lib, unb2c_board_lib, i2c_lib, mm_lib, dp_lib, diag_lib, lofar2_sdp_lib, wpfb_lib, lofar2_unb2c_sdp_station_lib;
@@ -78,34 +79,28 @@ ARCHITECTURE tb OF tb_lofar2_unb2c_sdp_station_xsub_one IS
 
   CONSTANT c_tb_clk_period       : TIME := 100 ps; -- use fast tb_clk to speed up M&C
 
-  CONSTANT c_nof_block_per_sync  : NATURAL := 24;
+  CONSTANT c_nof_block_per_sync  : NATURAL := 20;
   CONSTANT c_nof_clk_per_sync    : NATURAL := c_nof_block_per_sync*c_sdp_N_fft; 
   CONSTANT c_pps_period          : NATURAL := c_nof_clk_per_sync;
   CONSTANT c_wpfb_sim            : t_wpfb := func_wpfb_set_nof_block_per_sync(c_sdp_wpfb_subbands, c_nof_block_per_sync);
   CONSTANT c_ctrl_interval_size  : NATURAL := c_nof_clk_per_sync;
 
-  CONSTANT c_percentage          : REAL := 0.05;  -- percentage that actual value may differ from expected value
-  CONSTANT c_lo_factor           : REAL := 1.0 - c_percentage;  -- lower boundary  
-  CONSTANT c_hi_factor           : REAL := 1.0 + c_percentage;  -- higher boundary
+  CONSTANT c_max_ratio           : REAL := 0.0001;  -- ratio that actual value may differ from expected value
 
   -- WG
-  CONSTANT c_FS_adc               : REAL := REAL(c_sdp_FS_adc);  -- = full scale of WG
   CONSTANT c_bsn_start_wg         : NATURAL := 2;  -- start WG at this BSN to instead of some BSN, to avoid mismatches in exact expected data values
-  CONSTANT c_ampl_sp_0            : NATURAL := c_sdp_FS_adc/2;  -- = 0.5 * FS, so in number of lsb
-  CONSTANT c_wg_subband_freq_unit : REAL := c_diag_wg_freq_unit/REAL(c_sdp_N_fft);  -- subband freq = Fs/1024 = 200 MSps/1024 = 195312.5 Hz sinus
+  CONSTANT c_sp_ampl              : REAL := 0.5;   -- WG normalized amplitude, 1.0 = FS (full scale), use <= 0.5 to avoid XST overflow
+  CONSTANT c_wg_ampl              : NATURAL := NATURAL(c_sp_ampl * REAL(c_sdp_FS_adc));  -- in number of lsb
   CONSTANT c_wg_freq_offset       : REAL := 0.0/11.0; -- in freq_unit
-  CONSTANT c_subband_sp_0         : REAL := 102.0;  -- Select subband at index 102 = 102/1024 * 200MHz = 19.921875 MHz 
-  CONSTANT c_wg_ampl_lsb          : REAL := c_diag_wg_ampl_unit / c_FS_adc;  -- amplitude in number of LSbit resolution steps
-  CONSTANT c_exp_wg_power_sp_0    : REAL := REAL(c_ampl_sp_0**2)/2.0 * REAL(c_nof_clk_per_sync);
+  CONSTANT c_subband_sp           : REAL := 102.0;  -- Select subband at index 102 = 102/1024 * 200MHz = 19.921875 MHz
 
   -- WPFB
-  CONSTANT c_nof_pfb                        : NATURAL := 1; -- Verifying 1 of c_sdp_P_pfb = 6 pfb to speed up simulation.
-  CONSTANT c_wb_leakage_bin                 : NATURAL := c_wpfb_sim.nof_points / c_wpfb_sim.wb_factor;   -- = 256, leakage will occur in this bin if FIR wb_factor is reversed 
-  CONSTANT c_exp_sp_subband_power_ratio     : REAL := 1.0/8.0;   -- depends on internal WPFB quantization and FIR coefficients
-  CONSTANT c_exp_sp_subband_power_sum_ratio : REAL := c_exp_sp_subband_power_ratio;   -- because all sinus power is expected in one subband
-  CONSTANT c_exp_subband_power_sp_0         : REAL := c_exp_wg_power_sp_0 * c_exp_sp_subband_power_ratio;
+  CONSTANT c_exp_subband_ampl     : REAL := REAL(c_wg_ampl) * c_sdp_wpfb_subband_sp_ampl_ratio;
+  CONSTANT c_exp_subband_power    : REAL := c_exp_subband_ampl**2.0;  -- complex, so no divide by 2
+  CONSTANT c_exp_subband_sst      : REAL := c_exp_subband_power * REAL(c_nof_block_per_sync);
+  CONSTANT c_exp_subband_xst      : REAL := c_exp_subband_sst;  -- all signal inputs use same WG, and auto correlation XST = SST
 
-  TYPE t_real_arr IS ARRAY (INTEGER RANGE <>) OF REAL; 
+  TYPE t_real_arr IS ARRAY (INTEGER RANGE <>) OF REAL;
 
   -- MM  
   CONSTANT c_mm_file_reg_bsn_source_v2           : STRING := mmf_unb_file_prefix(c_unb_nr, c_node_nr) & "REG_BSN_SOURCE_V2";
@@ -182,7 +177,7 @@ BEGIN
     g_sim_node_nr            => c_node_nr,
     g_wpfb                   => c_wpfb_sim,
     g_bsn_nof_clk_per_sync   => c_nof_clk_per_sync,
-    g_scope_selected_subband => NATURAL(c_subband_sp_0)
+    g_scope_selected_subband => NATURAL(c_subband_sp)
   )
   PORT MAP (
     -- GENERAL
@@ -242,8 +237,8 @@ BEGIN
     ----------------------------------------------------------------------------
     -- Crosslets Info
     ----------------------------------------------------------------------------  
-    mmf_mm_bus_wr(c_mm_file_reg_crosslets_info, 0,  INTEGER(c_subband_sp_0), tb_clk); -- offset
-    mmf_mm_bus_wr(c_mm_file_reg_crosslets_info, 15, 0                      , tb_clk); -- stepsize
+    mmf_mm_bus_wr(c_mm_file_reg_crosslets_info, 0,  INTEGER(c_subband_sp), tb_clk); -- offset
+    mmf_mm_bus_wr(c_mm_file_reg_crosslets_info, 15, 0                    , tb_clk); -- stepsize
 
     ----------------------------------------------------------------------------
     -- Enable WG
@@ -255,9 +250,9 @@ BEGIN
     --   3 : ampl[16:0]
     FOR I IN 0 TO c_sdp_S_pn-1 LOOP
       mmf_mm_bus_wr(c_mm_file_reg_diag_wg, I*4 + 0, 1024*2**16 + 1, tb_clk);  -- nof_samples, mode calc
-      mmf_mm_bus_wr(c_mm_file_reg_diag_wg, I*4 + 1, INTEGER(  0.0 * c_diag_wg_phase_unit), tb_clk);  -- phase offset in degrees
-      mmf_mm_bus_wr(c_mm_file_reg_diag_wg, I*4 + 2, INTEGER((c_subband_sp_0+c_wg_freq_offset) * c_wg_subband_freq_unit), tb_clk);  -- freq
-      mmf_mm_bus_wr(c_mm_file_reg_diag_wg, I*4 + 3, INTEGER(REAL(c_ampl_sp_0) * c_wg_ampl_lsb), tb_clk);  -- ampl
+      mmf_mm_bus_wr(c_mm_file_reg_diag_wg, I*4 + 1, INTEGER(0.0 * c_diag_wg_phase_unit), tb_clk);  -- phase offset in degrees
+      mmf_mm_bus_wr(c_mm_file_reg_diag_wg, I*4 + 2, INTEGER((c_subband_sp + c_wg_freq_offset) * c_sdp_wg_subband_freq_unit), tb_clk);  -- freq
+      mmf_mm_bus_wr(c_mm_file_reg_diag_wg, I*4 + 3, INTEGER(REAL(c_wg_ampl) * c_sdp_wg_ampl_lsb), tb_clk);  -- ampl
     END LOOP;
 
     -- Read current BSN
@@ -279,7 +274,7 @@ BEGIN
 
     -- Wait for enough WG data and start of sync interval
     mmf_mm_wait_until_value(c_mm_file_reg_bsn_scheduler_wg, 0,                    -- read BSN low
-                            "UNSIGNED", rd_data, ">=", c_nof_block_per_sync * 2,  -- this is the wait until condition
+                            "UNSIGNED", rd_data, ">=", c_nof_block_per_sync * 3,  -- this is the wait until condition
                             c_sdp_T_sub, tb_clk);
 
     ---------------------------------------------------------------------------
@@ -343,7 +338,17 @@ BEGIN
 
       -- Check if values are > 0
       IF v_C=0 THEN ASSERT (SIGNED(xsub_stats_arr(I)) > TO_SIGNED(0, c_longword_w)) REPORT "correlation is 0 which is unexpected! at I = " & int_to_str(I) SEVERITY ERROR; END IF;
-    END LOOP; 
+
+      -- All XST values (almost) equal, because they use the same WG setting.
+      -- therefore also verify the expected XST value for all XST.
+      IF I MOD c_nof_complex = 0 THEN
+        -- real part
+        ASSERT almost_equal(TO_SREAL(xsub_stats_arr(I)) / c_exp_subband_xst, 1.0, c_max_ratio) REPORT "Wrong XST real value at I = " & int_to_str(I) SEVERITY ERROR;
+      ELSE
+        -- imag part
+        ASSERT almost_zero(TO_SREAL(xsub_stats_arr(I)) / c_exp_subband_xst, c_max_ratio) REPORT "Wrong XST imag value at I = " & int_to_str(I) SEVERITY ERROR;
+      END IF;
+    END LOOP;
  
     ---------------------------------------------------------------------------
     -- End Simulation 
diff --git a/applications/lofar2/designs/lofar2_unb2c_sdp_station/tb/vhdl/tb_lofar2_unb2c_sdp_station.vhd b/applications/lofar2/designs/lofar2_unb2c_sdp_station/tb/vhdl/tb_lofar2_unb2c_sdp_station.vhd
index 2129d701d1eddfa82e247b8c4ae31ef9a225cbf3..aff3d655da014f566d15bc51e966bf13c20635a6 100644
--- a/applications/lofar2/designs/lofar2_unb2c_sdp_station/tb/vhdl/tb_lofar2_unb2c_sdp_station.vhd
+++ b/applications/lofar2/designs/lofar2_unb2c_sdp_station/tb/vhdl/tb_lofar2_unb2c_sdp_station.vhd
@@ -69,15 +69,11 @@ ARCHITECTURE tb OF tb_lofar2_unb2c_sdp_station IS
   CONSTANT c_wpfb_sim                     : t_wpfb := func_wpfb_set_nof_block_per_sync(c_sdp_wpfb_subbands, c_nof_block_per_sync);
    
   -- WG
-  CONSTANT c_full_scale_ampl              : REAL := REAL(2**(18-1) - 1);  -- = full scale of WG
   CONSTANT c_bsn_start_wg                 : NATURAL := 2;  -- start WG at this BSN to instead of some BSN, to avoid mismatches in exact expected data values
   CONSTANT c_ampl_sp_0                    : NATURAL := 2**(c_sdp_W_adc-1) / 2;  -- in number of lsb
-  CONSTANT c_wg_subband_freq_unit         : REAL := c_diag_wg_freq_unit / REAL(c_sdp_N_fft);  -- subband freq = Fs/1024 = 200 MSps/1024 = 195312.5 Hz sinus
-  CONSTANT c_wg_freq_offset               : REAL := 0.0 / 11.0; -- in freq_unit
   CONSTANT c_subband_sp_0                 : REAL := 102.0;  -- Select subband at index 102 = 102/1024 * 200MHz = 19.921875 MHz
-  CONSTANT c_wg_ampl_lsb                  : REAL := c_diag_wg_ampl_unit / c_full_scale_ampl;  -- amplitude in number of LSbit resolution steps
 
--- . 1GbE output
+  -- 1GbE output
   CONSTANT c_eth_check_nof_packets        : NATURAL := 1;
   CONSTANT c_eth_runtime_timeout          : TIME := 300 us;
   
@@ -206,10 +202,10 @@ BEGIN
     --   1 : phase[15:0]
     --   2 : freq[30:0]
     --   3 : ampl[16:0]
-    mmf_mm_bus_wr(c_mm_file_reg_diag_wg, 0,                                                      1024 * 2**16 + 1, tb_clk);  -- nof_samples, mode calc
-    mmf_mm_bus_wr(c_mm_file_reg_diag_wg, 1,                                 INTEGER(  0.0 * c_diag_wg_phase_unit), tb_clk);  -- phase offset in degrees
-    mmf_mm_bus_wr(c_mm_file_reg_diag_wg, 2, INTEGER((c_subband_sp_0 + c_wg_freq_offset) * c_wg_subband_freq_unit), tb_clk);  -- freq
-    mmf_mm_bus_wr(c_mm_file_reg_diag_wg, 3,                            INTEGER(REAL(c_ampl_sp_0) * c_wg_ampl_lsb), tb_clk);  -- ampl
+    mmf_mm_bus_wr(c_mm_file_reg_diag_wg, 0,                                     1024 * 2**16 + 1, tb_clk);  -- nof_samples, mode calc
+    mmf_mm_bus_wr(c_mm_file_reg_diag_wg, 1,                INTEGER(  0.0 * c_diag_wg_phase_unit), tb_clk);  -- phase offset in degrees
+    mmf_mm_bus_wr(c_mm_file_reg_diag_wg, 2, INTEGER(c_subband_sp_0 * c_sdp_wg_subband_freq_unit), tb_clk);  -- freq
+    mmf_mm_bus_wr(c_mm_file_reg_diag_wg, 3,       INTEGER(REAL(c_ampl_sp_0) * c_sdp_wg_ampl_lsb), tb_clk);  -- ampl
 
     -- Read current BSN
     mmf_mm_bus_rd(c_mm_file_reg_bsn_scheduler_wg, 0, current_bsn_wg(31 DOWNTO  0), tb_clk);
diff --git a/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl.vhd b/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl.vhd
index 38214e72d7c3202a66b85fe2fed3e064fda6f004..6a102999a4b198ff37643cf257c9fe066758d4d1 100644
--- a/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl.vhd
+++ b/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl.vhd
@@ -52,8 +52,7 @@ ENTITY ddrctrl IS
     g_nof_streams     : NATURAL                                             := 12;                                            -- number of input streams
     g_data_w          : NATURAL                                             := 14;                                            -- data with of input data vectors
     g_stop_percentage : NATURAL                                             := 50;
-    g_block_size      : NATURAL                                             := 1024;
-    g_burstsize       : NATURAL                                             := 64
+    g_block_size      : NATURAL                                             := 1024
   );
   PORT (
     clk               : IN  STD_LOGIC                                       := '0';
@@ -87,8 +86,10 @@ ARCHITECTURE str OF ddrctrl IS
   CONSTANT  c_io_ddr_data_w     : NATURAL                                   := func_tech_ddr_ctlr_data_w( g_tech_ddr );       -- 576
   CONSTANT  c_wr_fifo_depth     : NATURAL                                   := 256;                                           -- defined at DDR side of the FIFO, >=16 and independent of wr burst size, default >= 256 because 32b*256 fits in 1 M9K so c_ctlr_data_w=256b will require 8 M9K
   CONSTANT  c_rd_fifo_depth     : NATURAL                                   := 256;                                           -- defined at DDR side of the FIFO, >=16 AND > max number of rd burst sizes (so > c_rd_fifo_af_margin), default >= 256 because 32b*256 fits in 1 M9K so c_ctlr_data_w=256b will require 8 M9K
+  CONSTANT  c_wr_fifo_uw_w      : NATURAL                                   := ceil_log2(c_wr_fifo_depth*(func_tech_ddr_ctlr_data_w(g_tech_ddr)/c_io_ddr_data_w));
   CONSTANT  c_rd_fifo_uw_w      : NATURAL                                   := ceil_log2(c_rd_fifo_depth*(func_tech_ddr_ctlr_data_w(g_tech_ddr)/c_io_ddr_data_w));
 
+  CONSTANT  c_burstsize         : NATURAL                                   := g_tech_ddr.maxburstsize;
   CONSTANT  c_adr_w             : NATURAL                                   := func_tech_ddr_ctlr_address_w(g_tech_ddr);      -- the lengt of the address vector, for simulation this is smaller, otherwise the simulation would take to long, 27
   CONSTANT  c_max_adr           : NATURAL                                   := 2**(c_adr_w)-1;                                -- the maximal address that is possible within the vector length of the address
   CONSTANT  c_bim               : NATURAL                                   := (c_max_adr*c_io_ddr_data_w)/(g_block_size*g_nof_streams*g_data_w);   -- the amount of whole blocks that fit in memory.
@@ -104,8 +105,8 @@ ARCHITECTURE str OF ddrctrl IS
   -- the amount of overflow after one block is written
   CONSTANT  c_of_pb             : NATURAL                                   := (g_block_size*g_nof_streams*g_data_w)-(((g_block_size*g_nof_streams*g_data_w)/c_io_ddr_data_w)*c_io_ddr_data_w); -- amount of overflow after one block is written to memory
 
-  CONSTANT  c_aof_full_burst    : NATURAL                                   := c_nof_adr/g_burstsize;
-  CONSTANT  c_last_burstsize    : NATURAL                                   := c_nof_adr-(c_aof_full_burst*g_burstsize);
+  CONSTANT  c_aof_full_burst    : NATURAL                                   := c_nof_adr/c_burstsize;
+  CONSTANT  c_last_burstsize    : NATURAL                                   := c_nof_adr-(c_aof_full_burst*c_burstsize);
 
   SIGNAL    s_last_burstsize    : NATURAL                                   := c_last_burstsize;
 
@@ -122,12 +123,11 @@ ARCHITECTURE str OF ddrctrl IS
   SIGNAL    rd_siso           : t_dp_siso                                   := c_dp_siso_rst;
   SIGNAL    rd_sosi           : t_dp_sosi                                   := c_dp_sosi_init;
   SIGNAL    stop              : STD_LOGIC;
+  SIGNAL    wr_fifo_usedw     : STD_LOGIC_VECTOR(c_wr_fifo_uw_w-1 DOWNTO 0);
   SIGNAL    rd_fifo_usedw     : STD_LOGIC_VECTOR(c_rd_fifo_uw_w-1 DOWNTO 0);
   SIGNAL    rd_ready          : STD_LOGIC;
-  SIGNAL    inp_ds            : NATURAL;
   SIGNAL    inp_bsn_adr       : NATURAL;
-  SIGNAL    outp_ds           : NATURAL;
-  SIGNAL    outp_bsn          : STD_LOGIC_VECTOR(c_dp_stream_bsn_w-1 DOWNTO 0);
+  SIGNAL    bsn_co            : STD_LOGIC_VECTOR(c_dp_stream_bsn_w-1 DOWNTO 0);
   SIGNAL    data_stopped      : STD_LOGIC;
 
 BEGIN
@@ -153,7 +153,6 @@ BEGIN
     in_stop                   => stop,
     out_sosi                  => out_sosi,
     out_adr                   => out_adr,
-    out_bsn_ds                => inp_ds,
     out_bsn_adr               => inp_bsn_adr,
     out_data_stopped          => data_stopped
   );
@@ -206,7 +205,7 @@ BEGIN
     wr_clk                    => clk,
     wr_rst                    => rst,
 
-    wr_fifo_usedw             => open,
+    wr_fifo_usedw             => wr_fifo_usedw,
     wr_sosi                   => wr_sosi,
     wr_siso                   => open,
   
@@ -240,15 +239,15 @@ BEGIN
     g_in_data_w               => c_io_ddr_data_w,
     g_nof_streams             => g_nof_streams,
     g_data_w                  => g_data_w,
-    g_block_size              => g_block_size
+    g_block_size              => g_block_size,
+    g_bim                     => c_bim
   )
   PORT MAP(
     clk                       => clk,
     rst                       => rst,
 
     in_sosi                   => rd_sosi,
-    in_ds                     => outp_ds,
-    in_bsn                    => outp_bsn,
+    in_bsn                    => bsn_co,
 
     out_sosi_arr              => out_sosi_arr,
     out_ready                 => rd_ready
@@ -265,11 +264,13 @@ BEGIN
     g_rd_fifo_depth           => c_rd_fifo_depth,
     g_rd_data_w               => c_io_ddr_data_w,
     g_block_size              => g_block_size,
+    g_wr_fifo_uw_w            => c_wr_fifo_uw_w,
     g_rd_fifo_uw_w            => c_rd_fifo_uw_w,
     g_max_adr                 => c_nof_adr,
-    g_burstsize               => g_burstsize,
+    g_burstsize               => c_burstsize,
     g_last_burstsize          => c_last_burstsize,
-    g_adr_per_b               => c_adr_per_b
+    g_adr_per_b               => c_adr_per_b,
+    g_bim                     => c_bim
   )
   PORT MAP(
     clk                       => clk,
@@ -279,7 +280,6 @@ BEGIN
     inp_of                    => out_of,
     inp_sosi                  => out_sosi,
     inp_adr                   => out_adr,
-    inp_ds                    => inp_ds,
     inp_bsn_adr               => inp_bsn_adr,
     inp_data_stopped          => data_stopped,
     rst_ddrctrl_input         => rst_ddrctrl_input,
@@ -288,11 +288,11 @@ BEGIN
     dvr_mosi                  => dvr_mosi,
     dvr_miso                  => dvr_miso,
     wr_sosi                   => wr_sosi,
+    wr_fifo_usedw             => wr_fifo_usedw,
     rd_fifo_usedw             => rd_fifo_usedw,
 
     -- ddrctrl_output
-    outp_ds                   => outp_ds,
-    outp_bsn                  => outp_bsn,
+    outp_bsn                  => bsn_co,
 
     -- ddrctrl_controller
     stop_in                   => stop_in,
diff --git a/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_controller.vhd b/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_controller.vhd
index 3f4cab12b7d991c5abd15ddc3fe2030bb5ff222e..8a91295a14c756bef34e5da15016791a507e2340 100644
--- a/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_controller.vhd
+++ b/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_controller.vhd
@@ -46,11 +46,13 @@ ENTITY ddrctrl_controller IS
     g_rd_fifo_depth           : NATURAL;    -- 256
     g_rd_data_w               : NATURAL;    -- 256
     g_block_size              : NATURAL;    -- 1024
+    g_wr_fifo_uw_w            : NATURAL;    -- 8
     g_rd_fifo_uw_w            : NATURAL;    -- 8
     g_max_adr                 : NATURAL;    -- 16128
     g_burstsize               : NATURAL;    -- 64
     g_last_burstsize          : NATURAL;    -- 18
-    g_adr_per_b               : NATURAL     -- 299
+    g_adr_per_b               : NATURAL;    -- 299
+    g_bim                     : NATURAL     -- 54
   );
   PORT (
     clk                       : IN  STD_LOGIC;
@@ -60,7 +62,6 @@ ENTITY ddrctrl_controller IS
     inp_of                    : IN  NATURAL;
     inp_sosi                  : IN  t_dp_sosi;
     inp_adr                   : IN  NATURAL;
-    inp_ds                    : IN  NATURAL;
     inp_bsn_adr               : IN  NATURAL;
     inp_data_stopped          : IN  STD_LOGIC;
     rst_ddrctrl_input         : OUT STD_LOGIC;
@@ -69,10 +70,10 @@ ENTITY ddrctrl_controller IS
     dvr_mosi                  : OUT t_mem_ctlr_mosi;
     dvr_miso                  : IN  t_mem_ctlr_miso;
     wr_sosi                   : OUT t_dp_sosi;
+    wr_fifo_usedw             : IN  STD_LOGIC_VECTOR(g_wr_fifo_uw_w-1 DOWNTO 0);
     rd_fifo_usedw             : IN  STD_LOGIC_VECTOR(g_rd_fifo_uw_w-1 DOWNTO 0);
 
     -- ddrctrl_output
-    outp_ds                   : OUT NATURAL;
     outp_bsn                  : OUT STD_LOGIC_VECTOR(c_dp_stream_bsn_w-1 DOWNTO 0)  := (OTHERS => '0');
 
     -- ddrctrl_controller
@@ -94,12 +95,10 @@ ARCHITECTURE rtl OF ddrctrl_controller IS
 
   CONSTANT  c_rd_data_w       : NATURAL                                     := g_nof_streams*g_out_data_w;                    -- 168
   CONSTANT  c_rest            : NATURAL                                     := c_rd_data_w-(g_wr_data_w mod c_rd_data_w);     -- 96
-  CONSTANT  c_max_read_cnt    : NATURAL                                     := (g_max_adr+1)/g_burstsize;                     -- 256
   CONSTANT  c_io_ddr_data_w   : NATURAL                                     := func_tech_ddr_ctlr_data_w(g_tech_ddr);         -- 576
-  CONSTANT  c_proportion      : NATURAL                                     := (c_io_ddr_data_w/c_rd_data_w)+1;
 
   -- type for statemachine
-  TYPE t_state IS (RESET, WRITING, SET_STOP, STOP_WRITING, LAST_WRITE_BURST, START_READING, READING, STOP_READING, IDLE);
+  TYPE t_state IS (RESET, WAIT_FOR_SOP, START_WRITING, WRITING, SET_STOP, STOP_WRITING, LAST_WRITE_BURST, START_READING, READING, STOP_READING, IDLE);
 
   -- record for readability
   TYPE t_reg IS RECORD
@@ -116,12 +115,11 @@ ARCHITECTURE rtl OF ddrctrl_controller IS
   rst_ddrctrl_input           : STD_LOGIC;
 
   -- writing signals
-  need_burst                  : STD_LOGIC;
+  wr_burst_en                 : STD_LOGIC;
 
   -- reading signals
-  outp_ds                     : NATURAL;
   outp_bsn                    : STD_LOGIC_VECTOR(c_dp_stream_bsn_w-1 DOWNTO 0);
-  read_cnt                    : NATURAL;
+  read_adr                    : NATURAL;
   rd_burst_en                 : STD_LOGIC;
 
   -- output
@@ -129,45 +127,74 @@ ARCHITECTURE rtl OF ddrctrl_controller IS
   wr_sosi                     : t_dp_sosi;
   END RECORD;
 
-  CONSTANT c_t_reg_init       : t_reg         := (RESET, '0', '0', TO_UVEC(g_max_adr, c_adr_w), (OTHERS => '0'), 0, '1', '1', '0', 0, (OTHERS => '0'), 0, '0', c_mem_ctlr_mosi_rst, c_dp_sosi_init);
+  CONSTANT c_t_reg_init       : t_reg         := (RESET, '0', '0', TO_UVEC(g_max_adr, c_adr_w), (OTHERS => '0'), 0, '1', '1', '0', (OTHERS => '0'), 0, '0', c_mem_ctlr_mosi_rst, c_dp_sosi_init);
 
 
   -- signals for readability
   SIGNAL d_reg                : t_reg         := c_t_reg_init;
   SIGNAL q_reg                : t_reg         := c_t_reg_init;
 
+
 BEGIN
 
   q_reg <= d_reg WHEN rising_edge(clk);
 
   -- put the input data into c_v and fill the output vector from c_v
-  p_state : PROCESS(q_reg, rst, inp_of, inp_sosi, inp_adr, inp_ds, inp_bsn_adr, inp_data_stopped, dvr_miso, rd_fifo_usedw, stop_in)
+  p_state : PROCESS(q_reg, rst, inp_of, inp_sosi, inp_adr, inp_bsn_adr, inp_data_stopped, dvr_miso, rd_fifo_usedw, stop_in)
 
     VARIABLE v                : t_reg         := c_t_reg_init;
 
   BEGIN
 
-    v := q_reg;
+    v         := q_reg;
+    v.wr_sosi := inp_sosi;
 
 
     CASE q_reg.state IS
     WHEN RESET =>
-      v := c_t_reg_init;
-      v.dvr_mosi.burstbegin := '1';
-      v.dvr_mosi.burstsize(dvr_mosi.burstsize'length-1 DOWNTO 0) := (OTHERS => '0');
-      v.dvr_mosi.wr         := '1';
+      v                                                           := c_t_reg_init;
+      v.dvr_mosi.burstbegin                                       := '1';
+      v.dvr_mosi.burstsize(dvr_mosi.burstsize'length-1 DOWNTO 0)  := (OTHERS => '0');
+      v.dvr_mosi.wr                                               := '1';
+      v.wr_sosi.valid                                             := '1';
 
 
+    WHEN WAIT_FOR_SOP =>
+    v.dvr_mosi.burstbegin := '0';
+    v.rst_ddrctrl_input := '0';
+    IF q_reg.started = '0' AND inp_sosi.eop = '1' THEN
+      v.wr_sosi.valid := '1';
+    ELSIF inp_sosi.sop = '1' THEN
+      v.state := WRITING; --START_WRITING;
+    ELSE
+      v.wr_sosi.valid := '0';
+      v.state := WAIT_FOR_SOP;
+    END IF;
 
-    WHEN WRITING =>
-      -- if adr mod g_burstsize = 0
-      -- this makes sure that only ones every 64 writes a writeburst is started.
-      IF TO_UVEC(inp_adr, c_adr_w)(c_bitshift_w-1 DOWNTO 0) = c_zeros AND q_reg.dvr_mosi.burstbegin = '0'THEN
-        v.need_burst            := '1';
+
+
+    WHEN START_WRITING =>
+      -- this state generates the first write burst.
+      IF TO_UINT(wr_fifo_usedw) > g_burstsize AND dvr_miso.done = '1' AND v.wr_burst_en = '1' AND q_reg.dvr_mosi.burstbegin = '0' THEN
+        v.dvr_mosi.address(c_adr_w-1 DOWNTO 0) := TO_UVEC(TO_UINT(q_reg.last_adr_to_write_to(c_adr_w-1 DOWNTO 0))+q_reg.stop_burstsize, c_adr_w);
+        v.dvr_mosi.wr         := '1';
+        v.dvr_mosi.rd         := '0';
+        v.dvr_mosi.burstbegin := '1';
+        v.dvr_mosi.burstsize(dvr_mosi.burstsize'length-1 DOWNTO 0) := TO_UVEC(g_burstsize-q_reg.stop_burstsize, dvr_mosi.burstsize'length);
+        v.wr_burst_en         := '0';
+        v.wr_burst_en         := '1';
+        v.state               := WRITING;
+      ELSE
+        v.dvr_mosi.burstbegin := '0';
+        v.state               := START_WRITING;
       END IF;
-      IF dvr_miso.done = '1' AND q_reg.need_burst = '1' THEN
+
+
+    WHEN WRITING =>
+      -- this state generates the rest of the write bursts, it also checks if there is a stop signal or if it needs to stop writing.
+      IF TO_UINT(wr_fifo_usedw) > g_burstsize AND dvr_miso.done = '1' AND q_reg.wr_burst_en = '1' AND q_reg.dvr_mosi.burstbegin = '0' THEN
         v.dvr_mosi.burstbegin   := '1';
-        v.need_burst            := '0';
+        v.wr_burst_en           := '0';
         IF inp_adr < g_burstsize-1 THEN
           v.dvr_mosi.address    := TO_UVEC(g_max_adr-g_last_burstsize, dvr_mosi.address'length);
           v.dvr_mosi.burstsize  := TO_UVEC(g_last_burstsize, dvr_mosi.burstsize'length);
@@ -181,30 +208,45 @@ BEGIN
       END IF;
       v.dvr_mosi.wr             := '1';
       v.dvr_mosi.rd             := '0';
-      v.wr_sosi                 := inp_sosi;
+
+      IF TO_UVEC(inp_adr, c_adr_w)(c_bitshift_w-1 DOWNTO 0) = c_zeros AND q_reg.dvr_mosi.burstbegin = '0'THEN
+        v.wr_burst_en            := '1';
+      END IF;
+
+      IF stop_in = '1' THEN
+        v.ready_for_set_stop := '1';
+      END IF;
+
+      IF q_reg.ready_for_set_stop = '1' AND inp_sosi.eop = '1' THEN
+        v.state := SET_STOP;
+      ELSIF q_reg.stop_adr = TO_UVEC(inp_adr, c_adr_w) AND q_reg.stopped = '0' THEN
+        v.state := STOP_WRITING;        
+      ELSE
+        v.state := WRITING;
+      END IF;
 
 
     WHEN SET_STOP =>
-      --setting a stop address dependend on the g_stop_percentage
+      -- this state sets a stop address dependend on the g_stop_percentage.
       IF inp_adr+c_pof_ma >= g_max_adr THEN
         v.stop_adr(c_adr_w-1 DOWNTO 0) := TO_UVEC(inp_adr-c_pof_ma, c_adr_w)(c_adr_w-1 DOWNTO 0);
       ELSE
         v.stop_adr(c_adr_w-1 DOWNTO 0) := TO_UVEC(inp_adr+c_pof_ma, c_adr_w)(c_adr_w-1 DOWNTO 0);
       END IF;
-      v.ready_for_set_stop                                            := '0';
+      v.ready_for_set_stop                                        := '0';
       v.last_adr_to_write_to(c_adr_w-1 DOWNTO c_bitshift_w)       := v.stop_adr(c_adr_w-1 DOWNTO c_bitshift_w);
       v.last_adr_to_write_to(c_bitshift_w-1 DOWNTO 0)             := (OTHERS => '0');
-      v.stop_burstsize                                            := TO_UINT(v.stop_adr(c_adr_w-1 DOWNTO 0))-TO_UINT(v.last_adr_to_write_to);
+      v.stop_burstsize                                            := TO_UINT(v.stop_adr(c_adr_w-1 DOWNTO 0))-TO_UINT(v.last_adr_to_write_to)+1;
 
       -- still a write cyle
       -- if adr mod g_burstsize = 0
       -- this makes sure that only ones every 64 writes a writeburst is started.
       IF TO_UVEC(inp_adr, c_adr_w)(c_bitshift_w-1 DOWNTO 0) = c_zeros AND q_reg.dvr_mosi.burstbegin = '0'THEN
-        v.need_burst            := '1';
+        v.wr_burst_en            := '1';
       END IF;
-      IF dvr_miso.done = '1' AND q_reg.need_burst = '1' THEN
+      IF dvr_miso.done = '1' AND q_reg.wr_burst_en = '1' THEN
         v.dvr_mosi.burstbegin   := '1';
-        v.need_burst            := '0';
+        v.wr_burst_en            := '0';
         IF inp_adr < g_burstsize-1 THEN
           v.dvr_mosi.address    := TO_UVEC(g_max_adr-g_last_burstsize, dvr_mosi.address'length);
           v.dvr_mosi.burstsize  := TO_UVEC(g_last_burstsize, dvr_mosi.burstsize'length);
@@ -218,20 +260,28 @@ BEGIN
       END IF;
       v.dvr_mosi.wr             := '1';
       v.dvr_mosi.rd             := '0';
-      v.wr_sosi                 := inp_sosi;
+
+      IF q_reg.stop_adr = TO_UVEC(inp_adr, c_adr_w) AND q_reg.stopped = '0' THEN
+        v.state := STOP_WRITING;        
+      ELSE
+        v.state := WRITING;
+      END IF;
+
 
 
     WHEN STOP_WRITING =>
+      -- this state stops the writing by generatign one last whole write burst which almost empties wr_fifo.
+      v.wr_sosi.valid       := '0';
       v.dvr_mosi.burstbegin := '0';
       v.stopped             := '1';
+      v.stop_adr            := TO_UVEC(g_max_adr, c_adr_w);
       -- wait until the write burst is finished
       IF inp_data_stopped = '0' THEN
         v.state := STOP_WRITING;
-      ELSIF dvr_miso.done = '1' AND q_reg.dvr_mosi.burstbegin = '0' AND q_reg.need_burst = '0' THEN
-        v.wr_sosi.valid                         := '0';
-        v.state                                 := LAST_WRITE_BURST;
+      ELSIF dvr_miso.done = '1' AND q_reg.dvr_mosi.burstbegin = '0' AND q_reg.wr_burst_en = '0' THEN
+        v.state := LAST_WRITE_BURST;
       ELSE
-        v.state                                 := STOP_WRITING;
+        v.state := STOP_WRITING;
       END IF;
 
 
@@ -239,11 +289,11 @@ BEGIN
       -- if adr mod g_burstsize = 0
       -- this makes sure that only ones every 64 writes a writeburst is started.
       IF TO_UVEC(inp_adr, c_adr_w)(c_bitshift_w-1 DOWNTO 0) = c_zeros AND q_reg.dvr_mosi.burstbegin = '0'THEN
-        v.need_burst            := '1';
+        v.wr_burst_en            := '1';
       END IF;
-      IF dvr_miso.done = '1' AND q_reg.need_burst = '1' THEN
+      IF dvr_miso.done = '1' AND q_reg.wr_burst_en = '1' THEN
         v.dvr_mosi.burstbegin   := '1';
-        v.need_burst            := '0';
+        v.wr_burst_en            := '0';
         IF inp_adr < g_burstsize-1 THEN
           v.dvr_mosi.address    := TO_UVEC(g_max_adr-g_last_burstsize, dvr_mosi.address'length);
           v.dvr_mosi.burstsize  := TO_UVEC(g_last_burstsize, dvr_mosi.burstsize'length);
@@ -257,16 +307,16 @@ BEGIN
       END IF;
       v.dvr_mosi.wr             := '1';
       v.dvr_mosi.rd             := '0';
-      v.wr_sosi                 := inp_sosi;
 
 
     WHEN LAST_WRITE_BURST =>
-
+     -- this state stops the writing by generatign one last write burst which empties wr_fifo.
      IF dvr_miso.done = '1' THEN
         v.dvr_mosi.burstbegin   := '1';
         v.dvr_mosi.address(c_adr_w-1 DOWNTO 0)  := q_reg.last_adr_to_write_to(c_adr_w-1 DOWNTO 0);
         v.dvr_mosi.burstsize    := TO_UVEC(q_reg.stop_burstsize, dvr_mosi.burstsize'length);
         v.state                 := START_READING;
+        v.rd_burst_en           := '1';
       ELSE
         v.dvr_mosi.burstbegin   := '0';
         v.state                 := LAST_WRITE_BURST;
@@ -277,48 +327,56 @@ BEGIN
 
 
     WHEN START_READING =>
+      -- this state generates the first read burst, the size of this burst is dependend on the size of the last write burst.
       v.dvr_mosi.burstbegin     := '0';
-      v.rd_burst_en             := '1';
-      v.outp_ds                 :=  inp_ds;
-      v.read_cnt                := 0;
+      v.outp_bsn                := TO_UVEC(TO_UINT(inp_sosi.bsn)-g_bim, c_dp_stream_bsn_w);
 
-      FOR I IN 0 TO inp_bsn_adr+(g_max_adr-TO_UINT(q_reg.stop_adr)) LOOP     -- takes a while  WRONG, wil be fixed after L2SDP-705, 706 and 70
-        IF v.outp_ds-c_rest <= 0 THEN
-          v.outp_ds := v.outp_ds+c_rd_data_w-c_rest;
-        ELSE
-          v.outp_ds := v.outp_ds-c_rest;
-        END IF;
-      END LOOP;
-      v.outp_bsn := TO_UVEC(TO_UINT(inp_sosi.bsn), c_dp_stream_bsn_w); -- WRONG, wil be fixed after L2SDP-705, 706 and 707
-      v.state := READING;
+      IF dvr_miso.done = '1' AND v.rd_burst_en = '1' AND q_reg.dvr_mosi.burstbegin = '0' THEN
+        v.dvr_mosi.burstbegin   := '1';
+        v.dvr_mosi.burstsize(dvr_mosi.burstsize'length-1 DOWNTO 0) := TO_UVEC(g_burstsize-q_reg.stop_burstsize, dvr_mosi.burstsize'length);
+        v.dvr_mosi.wr           := '0';
+        v.dvr_mosi.rd           := '1';
+        v.dvr_mosi.address(c_adr_w-1 DOWNTO 0) := TO_UVEC(TO_UINT(q_reg.last_adr_to_write_to(c_adr_w-1 DOWNTO 0))+q_reg.stop_burstsize, c_adr_w);
+        v.rd_burst_en           := '0';
+        v.read_adr              := TO_UINT(q_reg.last_adr_to_write_to(c_adr_w-1 DOWNTO 0))+g_burstsize;
+      END IF;
+
+      -- makes sure the fifo is filled before asking for another rd request. to prevent 4 rd burst to happend directly after one another.
+      IF dvr_miso.done = '0' AND q_reg.rd_burst_en = '0' THEN
+        v.rd_burst_en := '1';
+        v.state       := READING;
+      ELSE
+        v.state       := START_READING;
+      END IF;
 
 
     WHEN READING =>
       -- rd_fifo needs a refil after rd_fifo_usedw <= 10 because of delays, if you wait until rd_fifo_usedw = 0 then you get an empty fifo which results in your outputs sosi.valid not being constatly valid.
-      IF TO_UINT(rd_fifo_usedw) <= 10 AND dvr_miso.done = '1' AND q_reg.rd_burst_en = '1' AND dvr_miso.done = '1' THEN
-        v.dvr_mosi.burstbegin     := '0';
-        v.dvr_mosi.burstsize(dvr_mosi.burstsize'length-1 DOWNTO 0)  := TO_UVEC(g_burstsize, dvr_mosi.burstsize'length);
-        v.dvr_mosi.wr             := '0';
-        v.dvr_mosi.rd             := '1';
-        v.outp_ds                 := inp_ds;
-        IF TO_UINT(q_reg.stop_adr(c_adr_w-1 DOWNTO 0))+g_burstsize*q_reg.read_cnt >= g_max_adr THEN
-          v.dvr_mosi.address(c_adr_w-1 DOWNTO 0)  := TO_UVEC((TO_UINT(q_reg.stop_adr(c_adr_w-1 DOWNTO 0))+g_burstsize*q_reg.read_cnt)-g_max_adr-1, c_adr_w);
+      IF TO_UINT(rd_fifo_usedw) <= g_burstsize AND dvr_miso.done = '1' AND q_reg.rd_burst_en = '1' THEN
+        v.dvr_mosi.wr         := '0';
+        v.dvr_mosi.rd         := '1';
+        v.dvr_mosi.burstbegin := '1';
+        v.rd_burst_en         := '0';
+        IF q_reg.read_adr > g_max_adr-g_burstsize THEN
+          v.dvr_mosi.address    := TO_UVEC(q_reg.read_adr, dvr_mosi.address'length);
+          v.dvr_mosi.burstsize  := TO_UVEC(g_last_burstsize, dvr_mosi.burstsize'length);
+          v.read_adr            := 0;
         ELSE
-          v.dvr_mosi.address(c_adr_w-1 DOWNTO 0)  := TO_UVEC(TO_UINT(q_reg.stop_adr(c_adr_w-1 DOWNTO 0))+g_burstsize*q_reg.read_cnt, c_adr_w);
+          v.dvr_mosi.address    := TO_UVEC(q_reg.read_adr, dvr_mosi.address'length);
+          v.dvr_mosi.burstsize  := TO_UVEC(g_burstsize, dvr_mosi.burstsize'length);
+          v.read_adr            := q_reg.read_adr+g_burstsize;
         END IF;
-        v.dvr_mosi.burstbegin := '1';
-        v.read_cnt := v.read_cnt+1;
-        v.rd_burst_en := '0';
       ELSE
         v.dvr_mosi.burstbegin := '0';
       END IF;
 
       -- makes sure the fifo is filled before asking for another rd request. to prevent 4 rd burst to happend directly after one another.
-      IF TO_UINT(rd_fifo_usedw) = 11 THEN
+      IF dvr_miso.done = '0' THEN
         v.rd_burst_en := '1';
       END IF;
 
-      IF q_reg.read_cnt >= c_max_read_cnt THEN
+      -- goes to STOP_reading when this read burst was from the burstblock before q_reg.stop_adr
+      IF q_reg.last_adr_to_write_to(c_adr_w-1 DOWNTO 0) = TO_UVEC(q_reg.read_adr, c_adr_w) THEN
         v.state := STOP_READING;
       ELSE
         v.state := READING;
@@ -327,19 +385,33 @@ BEGIN
 
 
     WHEN STOP_READING =>
-    IF dvr_miso.done = '1' THEN
-      v.rst_ddrctrl_input := '0';
-      v.stopped := '0';
-      v.state := IDLE;
-    ELSE
-      v.state := STOP_READING;
-    END IF;
+      -- this is the last read burst, this make sure every data containing word in the memory has been read.
+      IF TO_UINT(rd_fifo_usedw) <= g_burstsize AND dvr_miso.done = '1' AND q_reg.rd_burst_en = '1' THEN
+        v.dvr_mosi.burstbegin   := '1';
+        v.dvr_mosi.address(c_adr_w-1 DOWNTO 0)  := q_reg.last_adr_to_write_to(c_adr_w-1 DOWNTO 0);
+        v.dvr_mosi.burstsize    := TO_UVEC(q_reg.stop_burstsize, dvr_mosi.burstsize'length);
+        v.stopped               := '0';
+        v.wr_sosi.valid         := '0';
+        v.state                 := WAIT_FOR_SOP;
+        v.wr_burst_en           := '1';
+        v.rst_ddrctrl_input     := '1';
+      ELSE
+        v.dvr_mosi.burstbegin   := '0';
+        v.state                 := STOP_READING;
+      END IF;
+      v.dvr_mosi.wr             := '0';
+      v.dvr_mosi.rd             := '1';
 
+      IF dvr_miso.done = '0' THEN
+        v.rd_burst_en := '1';
+      END IF;
 
 
 
     WHEN IDLE =>
-      v.wr_sosi.valid := '0';
+      IF q_reg.started = '0' THEN
+        v.wr_sosi.valid := '0';
+      END IF;
       -- the statemachine goes to Idle when its finished or when its waiting on other components.
 
     WHEN OTHERS =>
@@ -349,16 +421,15 @@ BEGIN
     END CASE;
 
 
-    IF q_reg.state = RESET OR q_reg.state = WRITING OR q_reg.state = SET_STOP OR q_reg.state = IDLE THEN
+    IF q_reg.state = RESET OR q_reg.state = IDLE THEN
       IF stop_in = '1' THEN
         v.ready_for_set_stop := '1';
       ELSIF q_reg.ready_for_set_stop = '1' AND inp_sosi.eop = '1' THEN
         v.state := SET_STOP;
-      ELSIF v.stop_adr = TO_UVEC(inp_adr, c_adr_w) AND q_reg.stopped = '0' THEN
+      ELSIF q_reg.stop_adr = TO_UVEC(inp_adr, c_adr_w) AND q_reg.stopped = '0' THEN
         v.state := STOP_WRITING;
-      ELSIF v.stopped = '0' AND inp_sosi.valid = '1'  AND q_reg.started = '1' THEN
+      ELSIF v.stopped = '0' AND inp_sosi.valid = '1' AND q_reg.started = '1' THEN
         v.state := WRITING;
-        v.wr_sosi := inp_sosi;
       ELSIF q_reg.stopped = '1' THEN
         v.state := STOP_READING;
       ELSE
@@ -373,7 +444,6 @@ BEGIN
 
     IF inp_sosi.eop = '1' THEN
       v.started := '1';
-      v.wr_sosi.valid := '1';
     END IF;
 
     d_reg     <= v;
@@ -385,7 +455,6 @@ BEGIN
   wr_sosi           <= q_reg.wr_sosi;
   stop_out          <= q_reg.stopped;
   outp_bsn          <= q_reg.outp_bsn;
-  outp_ds           <= q_reg.outp_ds;
   rst_ddrctrl_input <= q_reg.rst_ddrctrl_input OR rst;
 
 END rtl;
diff --git a/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_input.vhd b/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_input.vhd
index 208780472a0e4df9cfc607de8f8f3e87e0ffb783..c27c54acd3401cc8996d26e5dcebcd664ab65fb3 100644
--- a/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_input.vhd
+++ b/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_input.vhd
@@ -59,7 +59,6 @@ ENTITY ddrctrl_input IS
     in_stop           : IN  STD_LOGIC;
     out_sosi          : OUT t_dp_sosi;                                  -- output data
     out_adr           : OUT NATURAL;
-    out_bsn_ds        : OUT NATURAL;
     out_bsn_adr       : OUT NATURAL;
     out_data_stopped  : OUT STD_LOGIC
   );
@@ -76,7 +75,6 @@ ARCHITECTURE str OF ddrctrl_input IS
   SIGNAL    sosi_p_rp           : t_dp_sosi   := c_dp_sosi_init;
   SIGNAL    sosi_rp_ac          : t_dp_sosi   := c_dp_sosi_init;
   SIGNAL    adr                 : NATURAL     := 0;
-  SIGNAL    bsn_ds              : NATURAL     := 0;
   SIGNAL    valid               : STD_LOGIC   := '0';
   SIGNAL    data_stopped_rp_ac  : STD_LOGIC   := '0';
 
@@ -110,7 +108,6 @@ BEGIN
     in_sosi           => sosi_p_rp,                                     -- input data
     in_stop           => in_stop,
     out_sosi          => sosi_rp_ac,                                    -- output data
-    out_bsn_ds        => bsn_ds,                                        -- amount of bits between adr [0] and sosi_arr[0][0] where bsn is assigned to
     out_data_stopped  => data_stopped_rp_ac
   );
 
@@ -124,12 +121,10 @@ BEGIN
     clk               => clk,
     rst               => rst,
     in_sosi           => sosi_rp_ac,                                    -- input data
-    in_bsn_ds         => bsn_ds,
     in_data_stopped   => data_stopped_rp_ac,
     out_sosi          => out_sosi,                                      -- output data
     out_adr           => adr,
     out_bsn_adr       => out_bsn_adr,
-    out_bsn_ds        => out_bsn_ds,
     out_data_stopped  => out_data_stopped
   );
 
diff --git a/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_input_address_counter.vhd b/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_input_address_counter.vhd
index 916bbb2a18196a555303ca81f99dc0f79b188292..874e81e5ea1a12a4dd40c0247d77818f41208549 100644
--- a/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_input_address_counter.vhd
+++ b/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_input_address_counter.vhd
@@ -48,12 +48,10 @@ ENTITY ddrctrl_input_address_counter IS
     clk                   : IN  STD_LOGIC;
     rst                   : IN  STD_LOGIC;
     in_sosi               : IN  t_dp_sosi;                                                                                                -- input data
-    in_bsn_ds             : IN  NATURAL;
     in_data_stopped       : IN  STD_LOGIC;
     out_sosi              : OUT t_dp_sosi                         := c_dp_sosi_init;                                                      -- output data
     out_adr               : OUT NATURAL;
     out_bsn_adr           : OUT NATURAL;
-    out_bsn_ds            : OUT NATURAL;
     out_data_stopped      : OUT STD_LOGIC
   );
 END ddrctrl_input_address_counter;
@@ -73,15 +71,13 @@ ARCHITECTURE rtl OF ddrctrl_input_address_counter IS
   bsn_passed              : STD_LOGIC;
   out_sosi                : t_dp_sosi;
   out_bsn_adr             : NATURAL;
-  out_bsn_ds              : NATURAL;
   out_data_stopped        : STD_LOGIC;
   s_in_sosi               : t_dp_sosi;
-  s_in_bsn_ds             : NATURAL;
   s_in_data_stopped       : STD_LOGIC;
   s_adr                   : NATURAL;
   END RECORD;
 
-  CONSTANT  c_t_reg_init  : t_reg                                 := (RESET, '0', c_dp_sosi_init, 0, 0, '0', c_dp_sosi_init, 0, '0', 0);
+  CONSTANT  c_t_reg_init  : t_reg                                 := (RESET, '0', c_dp_sosi_init, 0, '0', c_dp_sosi_init, '0', 0);
 
 
   -- signals for readability
@@ -93,7 +89,7 @@ BEGIN
   q_reg <= d_reg WHEN rising_edge(clk);
 
   -- Increments the address each time in_sosi.valid = '1', if address = g_max_adr the address is reset to 0.
-  p_adr : PROCESS(rst, in_sosi, in_bsn_ds, in_data_stopped, q_reg)
+  p_adr : PROCESS(rst, in_sosi, in_data_stopped, q_reg)
 
   VARIABLE v              : t_reg;
 
@@ -102,16 +98,14 @@ BEGIN
 
     -- compensate for delay in ddrctrl_input_address_counter
     v.out_sosi                                                    := q_reg.s_in_sosi;
-    v.out_bsn_ds                                                  := q_reg.s_in_bsn_ds;
     v.out_data_stopped                                            := q_reg.s_in_data_stopped;
     v.s_in_sosi                                                   := in_sosi;
-    v.s_in_bsn_ds                                                 := in_bsn_ds;
     v.s_in_data_stopped                                           := in_data_stopped;
 
 
     CASE q_reg.state IS
     WHEN RESET =>
-      v.s_adr := 0;
+      v := c_t_reg_init;
 
       IF q_reg.s_in_sosi.sop = '1' THEN
         v.out_bsn_adr := v.s_adr;
@@ -136,7 +130,7 @@ BEGIN
 
     WHEN IDLE =>
     -- after a reset skip the first data block so the ddr memory can initialize.
-    IF NOT(q_reg.s_in_sosi.bsn(c_dp_stream_bsn_w-1 DOWNTO 0) = in_sosi.bsn(c_dp_stream_bsn_w-1 DOWNTO 0)) THEN
+    IF in_sosi.sop = '1' THEN
       v.bsn_passed := '1';
     END IF;
 
@@ -160,7 +154,6 @@ BEGIN
   out_sosi          <= q_reg.out_sosi;
   out_adr           <= q_reg.s_adr;
   out_bsn_adr       <= q_reg.out_bsn_adr;
-  out_bsn_ds        <= q_reg.out_bsn_ds;
   out_sosi.bsn      <= q_reg.out_sosi.bsn;
   out_data_stopped  <= q_reg.out_data_stopped;
 
diff --git a/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_input_repack.vhd b/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_input_repack.vhd
index 7b7a3ed0d98c5229929b4d25982b3aa41910a258..f85f1b201e9f30497302d8b684c47f73647325c9 100644
--- a/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_input_repack.vhd
+++ b/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_input_repack.vhd
@@ -48,7 +48,6 @@ ENTITY ddrctrl_input_repack IS
     in_sosi                 : IN  t_dp_sosi;                                                                                                  -- input data
     in_stop                 : IN  STD_LOGIC := '0';
     out_sosi                : OUT t_dp_sosi := c_dp_sosi_init;                                                                                -- output data
-    out_bsn_ds              : OUT NATURAL   := 0;
     out_bsn_wr              : OUT STD_LOGIC := '0';
     out_data_stopped        : OUT STD_LOGIC := '0'
   );
@@ -69,19 +68,16 @@ ARCHITECTURE rtl OF ddrctrl_input_repack IS
   state                     : t_state;                                                                                                        -- the state the process is currently in;
   c_v                       : STD_LOGIC_VECTOR(k_c_v_w-1 DOWNTO 0);                                                                           -- the vector that stores the input data until the data is put into the output data vector
   c_v_count                 : NATURAL;                                                                                                        -- the amount of times the c_v vector received data from the input since the last time it was filled completely
-  a_of                      : NATURAL;                                                                                                        -- this is the amount of bits that the first data word(168) is shifted from the first bit in the data word(576)
   q_bsn                     : STD_LOGIC_VECTOR(c_dp_stream_bsn_w-1 DOWNTO 0);
-  q_sop         : STD_LOGIC;
-  q_out_bsn_ds              : NATURAL;
+  q_sop                     : STD_LOGIC;
   s_input_cnt               : NATURAL;
   out_of                    : NATURAL;
   out_data_count            : STD_LOGIC;                                                                                                      -- the amount of times the output data vector has been filled since the last time c_v was filled completely
   out_sosi                  : t_dp_sosi;                                                                                                      -- this is the sosi stream that contains the data
-  out_bsn_ds                : NATURAL;                                                                                                        -- this is the amount of bits that the data corresponding to out_bsn is shifted from the first bit in that data word
   out_data_stopped          : STD_LOGIC;                                                                                                      -- this signal is '1' when there is no more data comming form ddrctrl_input_pack
   END RECORD;
 
-  CONSTANT c_t_reg_init     : t_reg         := (RESET, (OTHERS => '0'), 0, 0, (OTHERS => '0'), '0', 0, 0, 0, '0', c_dp_sosi_init, 0, '0');
+  CONSTANT c_t_reg_init     : t_reg         := (RESET, (OTHERS => '0'), 0, (OTHERS => '0'), '0', 0, 0, '0', c_dp_sosi_init, '0');
 
 
   -- signals for readability
@@ -125,7 +121,7 @@ BEGIN
         v.state := FILL_VECTOR;
       END IF;
 
-      IF NOT (q_reg.q_bsn(c_dp_stream_bsn_w-1 DOWNTO 0) = in_sosi.bsn(c_dp_stream_bsn_w-1 DOWNTO 0)) THEN
+      IF in_sosi.eop = '1' THEN
         v.s_input_cnt := 0;
         v.state := BSN;
       END IF;
@@ -139,7 +135,6 @@ BEGIN
       v.out_data_count := '1';                                                                                                                -- increase the counter of out_sosi.data with 1
       v.s_input_cnt := q_reg.s_input_cnt+1;
       v.out_sosi.bsn(c_dp_stream_bsn_w-1 DOWNTO 0)  := q_reg.q_bsn(c_dp_stream_bsn_w-1 DOWNTO 0);
-      v.out_bsn_ds                                  := q_reg.q_out_bsn_ds;
       v.out_sosi.sop                                := q_reg.q_sop;
       v.out_sosi.eop                                := '0';
       v.out_data_stopped                            := '0';
@@ -155,7 +150,7 @@ BEGIN
         v.state := FILL_VECTOR;
       END IF;
 
-      IF NOT (q_reg.q_bsn(c_dp_stream_bsn_w-1 DOWNTO 0) = in_sosi.bsn(c_dp_stream_bsn_w-1 DOWNTO 0)) THEN
+      IF in_sosi.eop = '1' THEN
         v.s_input_cnt := 0;
         v.state := BSN;
       END IF;
@@ -186,7 +181,7 @@ BEGIN
         v.state := FILL_VECTOR;
       END IF;
 
-      IF NOT (q_reg.q_bsn(c_dp_stream_bsn_w-1 DOWNTO 0) = in_sosi.bsn(c_dp_stream_bsn_w-1 DOWNTO 0)) THEN
+      IF in_sosi.eop = '1' THEN
         v.s_input_cnt := 0;
         v.state := BSN;
       END IF;
@@ -195,23 +190,18 @@ BEGIN
     WHEN BSN =>
 
       v.c_v(k_c_v_w-1 DOWNTO ((g_in_data_w*q_reg.c_v_count)+q_reg.out_of)) := (OTHERS =>'0');
+      v.out_of            := 0;
       IF ((g_in_data_w*q_reg.c_v_count)+q_reg.out_of < c_out_data_w*1) THEN
         v.out_sosi.data(c_out_data_w-1 DOWNTO 0) := v.c_v(c_out_data_w-1 DOWNTO 0);                                                           -- fill out_sosi.data with 1st part of c_v
-        v.out_sosi.valid := '1';                                                                                                              -- out_sosi.valid 1
+        v.out_sosi.valid  := '1';                                                                                                              -- out_sosi.valid 1
       ELSE
         v.out_sosi.data(c_out_data_w-1 DOWNTO 0) := v.c_v(k_c_v_w-1 DOWNTO c_out_data_w);                                                     -- fill out_sosi.data with 2nd part of c_v
-        v.out_sosi.valid := '1';                                                                                                              -- out_sosi.valid 1
+        v.out_sosi.valid  := '1';                                                                                                              -- out_sosi.valid 1
       END IF;
 
       -- BSN_INPUT
       v.q_bsn             := in_sosi.bsn;                                                                                                       -- a bsn number is saved when the bsn changes
-      IF g_in_data_w*q_reg.c_v_count+q_reg.out_of >= c_out_data_w THEN
-        v.q_out_bsn_ds  := g_in_data_w*q_reg.c_v_count+q_reg.out_of-c_out_data_w;                                                           -- the amount of bits between word[0] and data[0] where data is the data with the bsn
-      ELSE
-        v.q_out_bsn_ds  := g_in_data_w*q_reg.c_v_count+q_reg.out_of;                                                                        -- the amount of bits between word[0] and data[0] where data is the data with the bsn
-      END IF;
       v.q_sop             := '1';                                                                                                               -- a signal which indicates that a bsn is written in this word(576) so the address counter can save the corresponinding address. (there are delay in address counter so in_adr is not the same as the address of the word the data from the bsn is written to)
-      v.a_of              := 0;
       v.c_v(g_in_data_w-1 DOWNTO 0) := in_sosi.data(g_in_data_w-1 DOWNTO 0);                                                                  -- fill c_v
       v.c_v_count         := 1;                                                                                                                       -- increase the counter of c_v with 1
       v.out_data_count    := '0';
@@ -270,7 +260,6 @@ BEGIN
 
   -- fill outputs
   out_sosi          <= q_reg.out_sosi;
-  out_bsn_ds        <= q_reg.out_bsn_ds;
   out_data_stopped  <= q_reg.out_data_stopped;
 
 END rtl;
diff --git a/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_output.vhd b/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_output.vhd
index 7896dad2a2c726a34178cab7509d3d598e2ccbf0..2e48f3e4d7861b920a159cc8343f0283e10ef3ea 100644
--- a/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_output.vhd
+++ b/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_output.vhd
@@ -46,14 +46,14 @@ ENTITY ddrctrl_output IS
     g_in_data_w       : NATURAL                                     := 576;
     g_nof_streams     : NATURAL                                     := 12;                          -- number of input streams
     g_data_w          : NATURAL                                     := 14;                          -- data with of input data vectors
-    g_block_size      : NATURAL                                     := 1024
+    g_block_size      : NATURAL                                     := 1024;
+    g_bim             : NATURAL                                     := 54
   );
   PORT (
     clk               : IN  STD_LOGIC                               := '0';
     rst               : IN  STD_LOGIC;
     in_sosi           : IN  t_dp_sosi                               := c_dp_sosi_init;              -- input data
-    in_ds             : IN  NATURAL;                                                                -- amount of internal overflow this output
-    in_bsn            : IN  STD_LOGIC_VECTOR(c_dp_stream_bsn_w-1 DOWNTO 0);                         -- bsn corresponding to the data at in_data[in_of]
+    in_bsn            : IN  STD_LOGIC_VECTOR(c_dp_stream_bsn_w-1 DOWNTO 0);
     out_sosi_arr      : OUT t_dp_sosi_arr(g_nof_streams-1 DOWNTO 0) := (OTHERS => c_dp_sosi_init);  -- output data
     out_ready         : OUT STD_LOGIC
   );
@@ -76,13 +76,13 @@ BEGIN
     g_tech_ddr        => g_tech_ddr,
     g_in_data_w       => g_in_data_w,
     g_out_data_w      => c_out_data_w,
-    g_block_size      => g_block_size
+    g_block_size      => g_block_size,
+    g_bim             => g_bim
   )
   PORT MAP(
     clk               => clk,
     rst               => rst,
     in_sosi           => in_sosi,                                                                   -- input data
-    in_ds             => in_ds,
     in_bsn            => in_bsn,
     out_sosi          => sosi,                                                                      -- output data
     out_ready         => out_ready
diff --git a/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_output_repack.vhd b/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_output_repack.vhd
index 9c8555f3ea8561de24a5de65de0aeaf88bd57c69..fd2a2c43425cc68e36961da24a6ec62f21b62065 100644
--- a/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_output_repack.vhd
+++ b/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_output_repack.vhd
@@ -50,9 +50,11 @@ BEGIN
 
   -- putting the data from the stream into different streams.
   gen_repack_data : FOR I IN 0 TO g_nof_streams-1 GENERATE
-    out_sosi_arr(I).data(g_data_w-1 DOWNTO 0)          <= in_sosi.data(g_data_w*(I+1)-1 DOWNTO g_data_w*I);
-    out_sosi_arr(I).bsn(c_dp_stream_bsn_w-1 DOWNTO 0)  <= in_sosi.bsn(c_dp_stream_bsn_w-1 DOWNTO 0);
-    out_sosi_arr(I).valid                              <= in_sosi.valid;
+    out_sosi_arr(I).data(g_data_w-1 DOWNTO 0)           <= in_sosi.data(g_data_w*(I+1)-1 DOWNTO g_data_w*I);
+    out_sosi_arr(I).bsn(c_dp_stream_bsn_w-1 DOWNTO 0)   <= in_sosi.bsn(c_dp_stream_bsn_w-1 DOWNTO 0);
+    out_sosi_arr(I).valid                               <= in_sosi.valid;
+    out_sosi_arr(I).sop                                 <= in_sosi.sop;
+    out_sosi_arr(I).eop                                 <= in_sosi.eop;
   END GENERATE;
 
 END rtl;
diff --git a/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_output_unpack.vhd b/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_output_unpack.vhd
index 823f5e3ec6ae6e3ad0d25bafedd34b46b25af57e..5f92f62557d7b530caf860856400fba7bef66338 100644
--- a/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_output_unpack.vhd
+++ b/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_output_unpack.vhd
@@ -42,13 +42,13 @@ ENTITY ddrctrl_output_unpack IS
     g_tech_ddr      : t_c_tech_ddr;
     g_in_data_w     : NATURAL;
     g_out_data_w    : NATURAL;
-    g_block_size    : NATURAL
+    g_block_size    : NATURAL;
+    g_bim           : NATURAL
   );
   PORT (
     clk             : IN  STD_LOGIC;
     rst             : IN  STD_LOGIC;
     in_sosi         : IN  t_dp_sosi   := c_dp_sosi_init;
-    in_ds           : IN  NATURAL;
     in_bsn          : IN  STD_LOGIC_VECTOR(c_dp_stream_bsn_w-1 DOWNTO 0);
     out_sosi        : OUT t_dp_sosi   := c_dp_sosi_init;
     out_ready       : OUT STD_LOGIC   := '0'
@@ -58,8 +58,10 @@ END ddrctrl_output_unpack;
 
 ARCHITECTURE rtl OF ddrctrl_output_unpack IS
 
+  CONSTANT c_v_w  : NATURAL := g_in_data_w*2;
+
   -- type for statemachine
-  TYPE t_state IS ( READING, FIRST_READ, SECOND_READ, OVER_HALF, RESET, IDLE, OFF);
+  TYPE t_state IS ( READING, FIRST_READ, OVER_HALF, BSN, RESET, IDLE, OFF);
 
   -- record for readability
   TYPE t_reg IS RECORD
@@ -68,15 +70,14 @@ ARCHITECTURE rtl OF ddrctrl_output_unpack IS
   op_data_cnt     : NATURAL;
   delay_data      : STD_LOGIC_VECTOR(g_in_data_w-1 DOWNTO 0);
   dd_fresh        : STD_LOGIC;
-  c_v             : STD_LOGIC_VECTOR(g_in_data_w*2-1 DOWNTO 0);
-  sr_done         : STD_LOGIC;
+  valid_data      : STD_LOGIC;
+  c_v             : STD_LOGIC_VECTOR(c_v_w-1 DOWNTO 0);
   bsn_cnt         : NATURAL;
   out_sosi        : t_dp_sosi;
   out_ready       : STD_LOGIC;
   END RECORD;
 
-  CONSTANT c_t_reg_init   : t_reg     := (RESET, 0, 0, (OTHERS => '0'), '0', (OTHERS => '0'), '0', 0, c_dp_sosi_init, '0');
-
+  CONSTANT c_t_reg_init   : t_reg     := (RESET, 0, 0, (OTHERS => '0'), '0', '0', (OTHERS => '0'), 0, c_dp_sosi_init, '0');
 
   -- signals for readability
   SIGNAL d_reg            : t_reg     := c_t_reg_init;
@@ -87,7 +88,7 @@ BEGIN
   q_reg <= d_reg WHEN rising_edge(clk);
 
   -- put the input data into c_v and fill the output vector from c_v
-  p_state : PROCESS(q_reg, rst, in_sosi, in_ds, in_bsn)
+  p_state : PROCESS(q_reg, rst, in_sosi)
 
     VARIABLE v            : t_reg;
 
@@ -104,107 +105,205 @@ BEGIN
       v.bsn_cnt := q_reg.bsn_cnt+1;
       v.op_data_cnt := q_reg.op_data_cnt+1;
 
-      IF q_reg.bsn_cnt = g_block_size-1 THEN
-        v.out_sosi.bsn(c_dp_stream_bsn_w-1 DOWNTO 0) := INCR_UVEC(q_reg.out_sosi.bsn, 1);
-        v.bsn_cnt := 0;
+      IF q_reg.dd_fresh = '1' AND q_reg.valid_data = '0' THEN
+        -- put the delay data into the second half of c_v beceause these are now zeros
+        v.c_v(c_v_w-1 DOWNTO g_in_data_w) := q_reg.delay_data(g_in_data_w-1 DOWNTO 0);
+        v.dd_fresh      := '0';
+        v.valid_data    := '1';
       END IF;
-
       IF in_sosi.valid = '1' THEN
         v.delay_data(g_in_data_w-1 DOWNTO 0) := in_sosi.data(g_in_data_w-1 DOWNTO 0);
         v.dd_fresh := '1';
       END IF;
 
 
-      IF (g_out_data_w*(v.op_data_cnt+1))+q_reg.a_of >= g_in_data_w AND v.dd_fresh = '1' THEN
+      IF (g_out_data_w*(v.op_data_cnt+1))+q_reg.a_of >= g_in_data_w AND (v.dd_fresh = '1' OR v.valid_data = '1')THEN
         v.state := OVER_HALF;
-      ELSIF (g_out_data_w*(v.op_data_cnt+1))+q_reg.a_of >= g_in_data_w AND v.dd_fresh = '0' THEN
+      ELSIF (g_out_data_w*(v.op_data_cnt+1))+q_reg.a_of >= g_in_data_w AND v.dd_fresh = '0' AND v.valid_data = '0' THEN
         v.state := IDLE;
       ELSE
         v.state := READING;
       END IF;
 
 
+      IF q_reg.out_sosi.eop = '1' THEN
+        v.out_sosi.bsn(c_dp_stream_bsn_w-1 DOWNTO 0) := INCR_UVEC(q_reg.out_sosi.bsn, 1);
+        v.out_sosi.eop  := '0';
+        v.out_sosi.sop  := '1';
+        v.bsn_cnt       := 0;
+      ELSIF q_reg.out_sosi.sop = '1' THEN
+        v.out_sosi.sop  := '0';
+      END IF;
+
+      IF q_reg.bsn_cnt = g_block_size-3 THEN
+        v.state         := BSN;
+        v.out_ready     := '1';
+      END IF;
+
+
 
     WHEN OVER_HALF =>
       -- generating output data from c_v but past the halfway point of c_v so there needs to be new data added
-      v.out_ready := '1';
-      v.out_sosi.data(g_out_data_w-1 DOWNTO 0) := q_reg.c_v((g_out_data_w*(q_reg.op_data_cnt+1))+q_reg.a_of-1 DOWNTO (g_out_data_w*q_reg.op_data_cnt)+q_reg.a_of);
-      v.out_sosi.valid := '1';
-      v.bsn_cnt := q_reg.bsn_cnt+1;
-      v.c_v(g_in_data_w-1 DOWNTO 0) := q_reg.c_v(g_in_data_w*2-1 DOWNTO g_in_data_w);
-      v.c_v(g_in_data_w*2-1 DOWNTO g_in_data_w) := q_reg.delay_data(g_in_data_w-1 DOWNTO 0);
-      v.dd_fresh := '0';
-      v.a_of := (g_out_data_w*(q_reg.op_data_cnt+1))+q_reg.a_of-g_in_data_w;
-      v.op_data_cnt := 0;
-
-      IF q_reg.bsn_cnt = g_block_size-1 THEN
-        v.out_sosi.bsn(c_dp_stream_bsn_w-1 DOWNTO 0) := INCR_UVEC(q_reg.out_sosi.bsn, 1);
-        v.bsn_cnt := 0;
+      IF q_reg.dd_fresh = '1' AND q_reg.valid_data = '1' THEN
+        v.out_ready       := '1';
+        -- generate output from the middle of c_v
+        v.out_sosi.data(g_out_data_w-1 DOWNTO 0) := q_reg.c_v((g_out_data_w*(q_reg.op_data_cnt+1))+q_reg.a_of-1 DOWNTO (g_out_data_w*q_reg.op_data_cnt)+q_reg.a_of);
+        v.out_sosi.valid  := '1';
+        v.bsn_cnt         := q_reg.bsn_cnt+1;
+        -- put the second half of c_v into the first half of c_v
+        v.c_v(g_in_data_w-1 DOWNTO 0) := q_reg.c_v(c_v_w-1 DOWNTO g_in_data_w);
+        -- put the delay data into the first half of c_v
+        v.c_v(c_v_w-1 DOWNTO g_in_data_w) := q_reg.delay_data(g_in_data_w-1 DOWNTO 0);
+        v.dd_fresh        := '0';
+        v.a_of            := ((g_out_data_w*(q_reg.op_data_cnt+1))+q_reg.a_of)-g_in_data_w;
+        v.op_data_cnt     := 0;
+      ELSIF q_reg.dd_fresh = '0' AND q_reg.valid_data = '1' THEN
+        v.out_ready       := '1';
+        -- generate output from the middle of c_v
+        v.out_sosi.data(g_out_data_w-1 DOWNTO 0) := q_reg.c_v((g_out_data_w*(q_reg.op_data_cnt+1))+q_reg.a_of-1 DOWNTO (g_out_data_w*q_reg.op_data_cnt)+q_reg.a_of);
+        v.out_sosi.valid  := '1';
+        v.bsn_cnt         := q_reg.bsn_cnt+1;
+        -- put the second half of c_v into the first half of c_v
+        v.c_v(g_in_data_w-1 DOWNTO 0) := q_reg.c_v(c_v_w-1 DOWNTO g_in_data_w);
+        -- put zeros into the second half of c_v beceause dd_fresh is '0'
+        v.c_v(c_v_w-1 DOWNTO g_in_data_w) := (OTHERS => '0');
+        v.a_of            := ((g_out_data_w*(q_reg.op_data_cnt+1))+q_reg.a_of)-g_in_data_w;
+        v.op_data_cnt     := 0;
+        v.valid_data      := '0';
+      ELSIF q_reg.dd_fresh = '1' AND q_reg.valid_data = '0' THEN
+        v.out_ready       := '1';
+        -- put the delay data into the second half of c_v beceause these are now zeros
+        v.c_v(c_v_w-1 DOWNTO g_in_data_w) := q_reg.delay_data(g_in_data_w-1 DOWNTO 0);
+        -- generate output from the middle of c_v
+        v.out_sosi.data(g_out_data_w-1 DOWNTO 0) := v.c_v((g_out_data_w*(q_reg.op_data_cnt+1))+q_reg.a_of-1 DOWNTO (g_out_data_w*q_reg.op_data_cnt)+q_reg.a_of);
+        -- put the second half of c_v into the first half of c_v
+        v.c_v(g_in_data_w-1 DOWNTO 0) := q_reg.c_v(c_v_w-1 DOWNTO g_in_data_w);
+        v.out_sosi.valid  := '1';
+        v.bsn_cnt         := q_reg.bsn_cnt+1;
+        v.dd_fresh        := '0';
+        v.a_of            := ((g_out_data_w*(q_reg.op_data_cnt+1))+q_reg.a_of)-g_in_data_w;
+        v.op_data_cnt     := 0;
       END IF;
 
+
+ 
+
       IF in_sosi.valid = '1' THEN
         v.delay_data(g_in_data_w-1 DOWNTO 0) := in_sosi.data(g_in_data_w-1 DOWNTO 0);
-        v.dd_fresh := '1';
+        v.dd_fresh      := '1';
       END IF;
 
-
-      IF (g_out_data_w*(v.op_data_cnt+1))+q_reg.a_of >= g_in_data_w AND v.dd_fresh = '1' THEN
-        v.state := OVER_HALF;
-      ELSIF (g_out_data_w*(v.op_data_cnt+1))+q_reg.a_of >= g_in_data_w AND v.dd_fresh = '0' THEN
-        v.state := IDLE;
+      IF (g_out_data_w*(v.op_data_cnt+1))+v.a_of >= g_in_data_w AND (v.dd_fresh = '1' OR v.valid_data = '1') THEN
+        v.state         := OVER_HALF;
+      ELSIF q_reg.dd_fresh = '0' AND q_reg.valid_data = '0' THEN
+        v.state         := IDLE;
       ELSE
-        v.state := READING;
+        v.state         := READING;
+      END IF;
+
+      IF q_reg.out_sosi.sop = '1' THEN
+        v.out_sosi.sop  := '0';
       END IF;
 
+      IF q_reg.bsn_cnt = g_block_size-3 THEN
+        v.state         := BSN;
+        v.dd_fresh      := '1';
+      END IF;
 
 
     WHEN FIRST_READ =>
-      -- fills the first half of c_v and generates a output from it.
-      v.out_ready := '0';
+      -- fills the first half of c_v and generates output from it.
+      v.out_ready       := '0';
+      v.c_v(c_v_w-1 DOWNTO 0)       := (OTHERS => '0');
       v.c_v(g_in_data_w-1 DOWNTO 0) := q_reg.delay_data(g_in_data_w-1 DOWNTO 0);
-      v.dd_fresh := '0';
+      v.dd_fresh        := '0';
       v.out_sosi.data(g_out_data_w-1 DOWNTO 0) := v.c_v(g_out_data_w+v.a_of-1 DOWNTO v.a_of);
-      v.out_sosi.valid := '1';
+      v.out_sosi.valid  := '0';
       v.out_sosi.bsn(c_dp_stream_bsn_w-1 DOWNTO 0) := in_bsn(c_dp_stream_bsn_w-1 DOWNTO 0);
-
+      v.out_sosi.sop    := '1';
+      v.out_sosi.eop    := '0';
+      v.bsn_cnt         := 0;
+      v.op_data_cnt     := q_reg.op_data_cnt+1;
+
+      IF v.dd_fresh = '1' AND v.valid_data = '0' THEN
+        -- put the delay data into the second half of c_v beceause these are now zeros
+        v.c_v(c_v_w-1 DOWNTO g_in_data_w) := q_reg.delay_data(g_in_data_w-1 DOWNTO 0);
+        v.dd_fresh      := '0';
+        v.valid_data    := '1';
+      END IF;
       IF in_sosi.valid = '1' THEN
         v.delay_data(g_in_data_w-1 DOWNTO 0) := in_sosi.data(g_in_data_w-1 DOWNTO 0);
-        v.dd_fresh := '1';
+        v.dd_fresh      := '1';
       END IF;
 
 
-      IF v.dd_fresh = '1' THEN
-        v.state := SECOND_READ;
-      ELSE
-        v.state := IDLE;
+      v.state         := READING;
+
+    WHEN BSN =>
+      -- generating output data from c_v but past the halfway point of c_v so there needs to be new data added also increases the bsn output
+      v.out_sosi.valid := '0';
+      IF q_reg.dd_fresh = '1' AND q_reg.valid_data = '1' THEN
+        -- generate output from the middle of c_v
+        v.out_sosi.data(g_out_data_w-1 DOWNTO 0) := q_reg.c_v((g_out_data_w*(q_reg.op_data_cnt+1))+q_reg.a_of-1 DOWNTO (g_out_data_w*q_reg.op_data_cnt)+q_reg.a_of);
+        v.out_sosi.valid  := '1';
+        v.bsn_cnt         := q_reg.bsn_cnt+1;
+        -- put the second half of c_v into the first half of c_v
+        v.c_v(g_in_data_w-1 DOWNTO 0) := q_reg.c_v(c_v_w-1 DOWNTO g_in_data_w);
+        -- put the delay data into the first half of c_v
+        v.c_v(c_v_w-1 DOWNTO g_in_data_w) := q_reg.delay_data(g_in_data_w-1 DOWNTO 0);
+        v.dd_fresh        := '0';
+        v.op_data_cnt     := 0;
+      ELSIF q_reg.dd_fresh = '0' AND q_reg.valid_data = '1' THEN
+        -- generate output from the middle of c_v
+        v.out_sosi.data(g_out_data_w-1 DOWNTO 0) := q_reg.c_v((g_out_data_w*(q_reg.op_data_cnt+1))+q_reg.a_of-1 DOWNTO (g_out_data_w*q_reg.op_data_cnt)+q_reg.a_of);
+        v.out_sosi.valid  := '1';
+        v.bsn_cnt         := q_reg.bsn_cnt+1;
+        -- put the second half of c_v into the first half of c_v
+        v.c_v(g_in_data_w-1 DOWNTO 0) := q_reg.c_v(c_v_w-1 DOWNTO g_in_data_w);
+        -- put zeros into the second half of c_v beceause dd_fresh is '0'
+        v.c_v(c_v_w-1 DOWNTO g_in_data_w) := (OTHERS => '0');
+        v.op_data_cnt     := 0;
+        v.valid_data      := '0';
+      ELSIF q_reg.dd_fresh = '1' AND q_reg.valid_data = '0' THEN
+        -- put the delay data into the second half of c_v beceause these are now zeros
+        v.c_v(c_v_w-1 DOWNTO g_in_data_w) := q_reg.delay_data(g_in_data_w-1 DOWNTO 0);
+        -- generate output from the middle of c_v
+        v.out_sosi.data(g_out_data_w-1 DOWNTO 0) := v.c_v((g_out_data_w*(q_reg.op_data_cnt+1))+q_reg.a_of-1 DOWNTO (g_out_data_w*q_reg.op_data_cnt)+q_reg.a_of);
+        -- put the second half of c_v into the first half of c_v
+        v.c_v(g_in_data_w-1 DOWNTO 0) := q_reg.c_v(c_v_w-1 DOWNTO g_in_data_w);
+        v.out_sosi.valid  := '1';
+        v.bsn_cnt         := q_reg.bsn_cnt+1;
+        v.dd_fresh        := '0';
+        v.op_data_cnt     := 0;
+      ELSIF q_reg.dd_fresh = '0' AND q_reg.valid_data = '0' AND (g_out_data_w*(v.op_data_cnt+1))+q_reg.a_of < g_in_data_w THEN
+        -- generate output from the middle of c_v
+        v.out_sosi.data(g_out_data_w-1 DOWNTO 0) := q_reg.c_v((g_out_data_w*(q_reg.op_data_cnt+1))+q_reg.a_of-1 DOWNTO (g_out_data_w*q_reg.op_data_cnt)+q_reg.a_of);
+        v.out_sosi.valid  := '1';
+        v.bsn_cnt         := q_reg.bsn_cnt+1;        
       END IF;
 
-    WHEN SECOND_READ =>
-      -- fills the second half of c_v and generates a output from it.
-      v.out_ready       := '0';
-      v.c_v(g_in_data_w*2-1 DOWNTO g_in_data_w) := q_reg.delay_data(g_in_data_w-1 DOWNTO 0);
-      v.dd_fresh        := '0';
-      v.out_sosi.data(g_out_data_w-1 DOWNTO 0) := v.c_v(g_out_data_w*2+q_reg.a_of-1 DOWNTO g_out_data_w+q_reg.a_of);
-      v.out_sosi.valid  := '1';
-      v.bsn_cnt         := 1;
-      v.op_data_cnt     := 2;
-      v.sr_done         := '1';
+      v.out_ready         := '0';
+      v.out_sosi.eop      := '1';
+      v.a_of              := 0;
+      v.bsn_cnt           := q_reg.bsn_cnt+1;
 
+      IF v.dd_fresh = '1' AND v.valid_data = '0' THEN
+        -- put the delay data into the second half of c_v beceause these are now zeros
+        v.c_v(c_v_w-1 DOWNTO g_in_data_w) := q_reg.delay_data(g_in_data_w-1 DOWNTO 0);
+        v.dd_fresh        := '0';
+        v.valid_data      := '1';
+      END IF;
       IF in_sosi.valid = '1' THEN
         v.delay_data(g_in_data_w-1 DOWNTO 0) := in_sosi.data(g_in_data_w-1 DOWNTO 0);
-        v.dd_fresh := '1';
+        v.dd_fresh        := '1';
       END IF;
 
-
-      IF (g_out_data_w*(v.op_data_cnt+1))+q_reg.a_of >= g_in_data_w AND v.dd_fresh = '1' THEN
-        v.state := OVER_HALF;
-      ELSIF (g_out_data_w*(v.op_data_cnt+1))+q_reg.a_of >= g_in_data_w AND v.dd_fresh = '0' THEN
-        v.state := IDLE;
+      IF g_bim+TO_UINT(in_bsn)-1 = TO_UINT(v.out_sosi.bsn) THEN
+        v.state           := OFF;
       ELSE
-        v.state := READING;
+        v.state           := READING;
       END IF;
 
-
     WHEN RESET =>
       v := c_t_reg_init;
 
@@ -220,16 +319,20 @@ BEGIN
       v.out_ready := '1';
       v.out_sosi.valid := '0';
 
+      IF q_reg.dd_fresh = '1' AND q_reg.valid_data = '0' THEN
+        -- put the delay data into the second half of c_v beceause these are now zeros
+        v.c_v(c_v_w-1 DOWNTO g_in_data_w) := q_reg.delay_data(g_in_data_w-1 DOWNTO 0);
+        v.dd_fresh      := '0';
+        v.valid_data    := '1';
+      END IF;
       IF in_sosi.valid = '1' THEN
         v.delay_data(g_in_data_w-1 DOWNTO 0) := in_sosi.data(g_in_data_w-1 DOWNTO 0);
         v.dd_fresh := '1';
       END IF;
 
 
-      IF (g_out_data_w*(v.op_data_cnt+1))+q_reg.a_of >= g_in_data_w AND v.dd_fresh = '1' AND q_reg.sr_done = '1' THEN
+      IF (g_out_data_w*(v.op_data_cnt+1))+q_reg.a_of >= g_in_data_w AND v.dd_fresh = '1'THEN
         v.state := OVER_HALF;
-      ELSIF (g_out_data_w*(v.op_data_cnt+1))+q_reg.a_of >= g_in_data_w AND v.dd_fresh = '1' AND q_reg.sr_done = '0' THEN
-        v.state := SECOND_READ;
       ELSE
         v.state := IDLE;
       END IF;
@@ -240,7 +343,7 @@ BEGIN
       -- the stamachine has a state off so it knows when to go to first read, it can't go to first read from IDLE
       v.out_ready := '1';
       v.delay_data(g_in_data_w-1 DOWNTO 0) := in_sosi.data(g_in_data_w-1 DOWNTO 0);
-
+      v.out_sosi  := c_dp_sosi_init;
 
       IF in_sosi.valid = '1' THEN
         v.state := FIRST_READ;
diff --git a/applications/lofar2/libraries/ddrctrl/tb/vhdl/tb_ddrctrl.vhd b/applications/lofar2/libraries/ddrctrl/tb/vhdl/tb_ddrctrl.vhd
index 422c72f091f333e4dc5d57da568da322917e21c5..881d039d0bfc8bbea512fcebfc74ac169d3b9801 100644
--- a/applications/lofar2/libraries/ddrctrl/tb/vhdl/tb_ddrctrl.vhd
+++ b/applications/lofar2/libraries/ddrctrl/tb/vhdl/tb_ddrctrl.vhd
@@ -1,3 +1,4 @@
+
 -------------------------------------------------------------------------------
 --
 -- Copyright 2022
@@ -59,7 +60,7 @@ ARCHITECTURE tb OF tb_ddrctrl IS
 
   -- constants for readability
   CONSTANT  c_ctrl_data_w       : NATURAL                                               := func_tech_ddr_ctlr_data_w(c_tech_ddr);   -- 576
-  CONSTANT  c_in_data_w         : NATURAL                                               := g_nof_streams * g_data_w;                -- output data with, 168
+  CONSTANT  c_in_data_w         : NATURAL                                               := g_nof_streams*g_data_w;                -- output data with, 168
 
   -- constants for testbench
   CONSTANT  c_clk_freq          : NATURAL                                               := 200;                                     -- clock frequency in MHz
@@ -128,7 +129,6 @@ ARCHITECTURE tb OF tb_ddrctrl IS
   SIGNAL    mm_rst            : STD_LOGIC                                             := '0';
   SIGNAL    in_sosi_arr       : t_dp_sosi_arr(g_nof_streams-1 DOWNTO 0)               := (OTHERS => c_dp_sosi_init);              -- input data signal for ddrctrl_pack.vhd 
   SIGNAL    stop_in           : STD_LOGIC                                             := '0';
-  SIGNAL    bsn               : STD_LOGIC_VECTOR(c_dp_stream_bsn_w-1 DOWNTO 0)        := (OTHERS => '0');
   SIGNAL    out_sosi_arr      : t_dp_sosi_arr(g_nof_streams-1 DOWNTO 0)               := (OTHERS => c_dp_sosi_init);
 
   -- testbench signal
@@ -158,6 +158,9 @@ BEGIN
 
   -- excecuting test
   p_test : PROCESS
+
+
+
   BEGIN
 
     -- start the test
@@ -180,29 +183,26 @@ BEGIN
       make_data : FOR J IN 0 TO c_bim*g_block_size-1 LOOP
         in_data_cnt     <= in_data_cnt+1;
         fill_in_sosi_arr : FOR I IN 0 TO g_nof_streams-1 LOOP
-          in_sosi_arr(I).data(g_data_w-1 DOWNTO 0)   <= c_total_vector(g_data_w*(I+1)+J*c_in_data_w-1 DOWNTO g_data_w*I+J*c_in_data_w);
-          in_sosi_arr(I).valid <= '1';
-          in_sosi_arr(I).bsn(c_dp_stream_bsn_w-1 DOWNTO 0) <= bsn(c_dp_stream_bsn_w-1 DOWNTO 0);
           IF bsn_cnt = g_block_size-1 THEN
-            bsn_cnt <= 0;
-            FOR I IN 0 TO g_nof_streams-1 LOOP
-              in_sosi_arr(I).sop <= '1';
-              in_sosi_arr(I).eop <= '0';
-            END LOOP;
-            bsn <= INCR_UVEC(bsn, 1);
+            IF I = 0 THEN
+              bsn_cnt <= 0;
+            END IF;
+            in_sosi_arr(I).sop <= '1';
+            in_sosi_arr(I).eop <= '0';
+            in_sosi_arr(I).bsn <= INCR_UVEC(in_sosi_arr(I).bsn, 1);
           ELSE
-            bsn_cnt <= bsn_cnt + 1;
-            FOR I IN 0 TO g_nof_streams-1 LOOP
-              in_sosi_arr(I).sop <= '0';
-            END LOOP;
+            IF I = 0 THEN
+              bsn_cnt <= bsn_cnt + 1;
+            END IF;
+            in_sosi_arr(I).sop <= '0';
           END IF;
           IF bsn_cnt = g_block_size-2 THEN
-            FOR I IN 0 TO g_nof_streams-1 LOOP
-              in_sosi_arr(I).eop <= '1';
-            END LOOP;
+            in_sosi_arr(I).eop <= '1';
           END IF;
+          in_sosi_arr(I).data(g_data_w-1 DOWNTO 0)   <= c_total_vector(g_data_w*(I+1)+J*c_in_data_w-1 DOWNTO g_data_w*I+J*c_in_data_w);
+          in_sosi_arr(I).valid <= '1';
         END LOOP;
-        IF K = 1 AND J = c_bim*g_block_size-1 THEN
+        IF K = 0 AND J = c_bim*g_block_size-1 THEN
           stop_in <= '1';
         ELSE
           stop_in <= '0';
diff --git a/applications/lofar2/libraries/sdp/src/vhdl/sdp_pkg.vhd b/applications/lofar2/libraries/sdp/src/vhdl/sdp_pkg.vhd
index e9e7f6c3ad9dc6ddb43161bb98e7862d677bed61..294fbe0f43ca72b0086a13d98e67469fb971ce98 100644
--- a/applications/lofar2/libraries/sdp/src/vhdl/sdp_pkg.vhd
+++ b/applications/lofar2/libraries/sdp/src/vhdl/sdp_pkg.vhd
@@ -23,18 +23,18 @@
 -- Author: R. van der Walle, E. Kooistra
 -- Purpose: 
 -- . This package contains sdp specific constants.
--- Description:
--- Remark:
--- . See Document: L3 SDP Decision: SDP Parameter definitions.
---   https://support.astron.nl/confluence/display/L2M/L3+SDP+Decision%3A+SDP+Parameter+definitions
+-- Description: See [1]
+-- References:
+-- . [1] https://support.astron.nl/confluence/display/L2M/L3+SDP+Decision%3A+SDP+Parameter+definitions
 -------------------------------------------------------------------------------
-LIBRARY IEEE, common_lib, rTwoSDF_lib, fft_lib, filter_lib, wpfb_lib;
+LIBRARY IEEE, common_lib, rTwoSDF_lib, fft_lib, filter_lib, wpfb_lib, diag_lib;
 USE IEEE.std_logic_1164.ALL;
 USE IEEE.math_real.ALL;
 USE common_lib.common_pkg.ALL;
 USE common_lib.common_mem_pkg.ALL;
 USE common_lib.common_field_pkg.ALL;
 USE common_lib.common_network_layers_pkg.ALL;
+USE diag_lib.diag_pkg.ALL;
 USE rTwoSDF_lib.rTwoSDFPkg.ALL;
 USE fft_lib.fft_pkg.ALL; 
 USE filter_lib.fil_pkg.ALL; 
@@ -62,8 +62,7 @@ PACKAGE sdp_pkg is
         (OTHERS => '0') );  
 
   -------------------------------------------------
-  -- SDP specific parameters as defined in:
-  --  L3 SDP Decision: SDP Parameter definitions 
+  -- SDP specific parameters as defined in [1]
   CONSTANT c_sdp_f_adc_MHz                 : NATURAL := 200;
   CONSTANT c_sdp_N_beamsets                : NATURAL := 2;  -- = N_beamsets_sdp in doc
   CONSTANT c_sdp_N_cross_sets_sdp          : NATURAL := 1;
@@ -110,24 +109,25 @@ PACKAGE sdp_pkg is
   CONSTANT c_sdp_N_ring_nof_mac10g         : NATURAL := 3; -- for sdp_station_xsub_ring design.
 
   -- Derived constants
-  CONSTANT c_sdp_FS_adc             : NATURAL := 2**(c_sdp_W_adc - 1); -- full scale FS corresponds to amplitude 1.0
-  CONSTANT c_sdp_N_clk_per_sync     : NATURAL := c_sdp_f_adc_MHz*10**6;  -- Default 200M clock cycles per second
-  CONSTANT c_sdp_N_clk_sync_timeout : NATURAL := c_sdp_f_adc_MHz*10**6 + c_sdp_f_adc_MHz*10**5;  -- 10% margin.
-  CONSTANT c_sdp_N_sync_jesd        : NATURAL := c_sdp_S_pn * c_sdp_N_sync_rcu / c_sdp_S_rcu; -- = 4, nof JESD IP sync outputs per PN
-  CONSTANT c_sdp_A_pn               : NATURAL := c_sdp_S_pn / c_sdp_N_pol;  -- = 6 dual pol antenna per PN, is 6 signal input pairs
-  CONSTANT c_sdp_P_pfb              : NATURAL := c_sdp_S_pn / c_sdp_Q_fft;  -- = 6 PFB units, for 6 signal input pairs
-  CONSTANT c_sdp_T_adc              : TIME    := (10**6 / c_sdp_f_adc_MHz) * 1 ps;  -- = 5 ns @ 200MHz
-  CONSTANT c_sdp_T_sub              : TIME    := c_sdp_N_fft * c_sdp_T_adc;  -- = 5.12 us @ 200MHz
-  CONSTANT c_sdp_W_bf_product       : NATURAL := c_sdp_W_subband + c_sdp_W_bf_weight -1;
-  CONSTANT c_sdp_X_sq               : NATURAL := c_sdp_S_pn * c_sdp_S_pn;  -- = 144
-  CONSTANT c_sdp_block_period       : NATURAL := c_sdp_N_fft * 1000 / c_sdp_f_adc_MHz;  -- = 5120 [ns]
-  CONSTANT c_sdp_N_beamlets_sdp     : NATURAL := c_sdp_N_beamsets * c_sdp_S_sub_bf;  -- = 976
-  CONSTANT c_sdp_unit_sub_weight    : NATURAL := 2**c_sdp_W_sub_weight_fraction;  -- 2**13, so range +-4.0 for 16 bit signed weight
-  CONSTANT c_sdp_unit_bf_weight     : NATURAL := 2**c_sdp_W_bf_weight_fraction;  -- 2**14, so range +-2.0 for 16 bit signed weight
-  CONSTANT c_sdp_unit_beamlet_scale : NATURAL := 2**c_sdp_W_beamlet_scale_fraction;  -- 2**15, so range +-1.0 for 16 bit signed weight
-
-  -- Default / tb values
-  CONSTANT c_sdp_beamlet_scale_default   : NATURAL := 2**15;
+  CONSTANT c_sdp_FS_adc               : NATURAL := 2**(c_sdp_W_adc - 1); -- full scale FS corresponds to amplitude 1.0, will just cause clipping of +FS to +FS-1
+  CONSTANT c_sdp_wg_ampl_lsb          : REAL := c_diag_wg_ampl_unit / REAL(c_sdp_FS_adc);  -- WG amplitude in number of LSbit resolution steps
+  CONSTANT c_sdp_wg_subband_freq_unit : REAL := c_diag_wg_freq_unit/REAL(c_sdp_N_fft);  -- subband freq = Fs/1024 = 200 MSps/1024 = 195312.5 Hz sinus
+  CONSTANT c_sdp_N_clk_per_sync       : NATURAL := c_sdp_f_adc_MHz*10**6;  -- Default 200M clock cycles per second
+  CONSTANT c_sdp_N_clk_sync_timeout   : NATURAL := c_sdp_f_adc_MHz*10**6 + c_sdp_f_adc_MHz*10**5;  -- 10% margin.
+  CONSTANT c_sdp_N_sync_jesd          : NATURAL := c_sdp_S_pn * c_sdp_N_sync_rcu / c_sdp_S_rcu; -- = 4, nof JESD IP sync outputs per PN
+  CONSTANT c_sdp_A_pn                 : NATURAL := c_sdp_S_pn / c_sdp_N_pol;  -- = 6 dual pol antenna per PN, is 6 signal input pairs
+  CONSTANT c_sdp_P_pfb                : NATURAL := c_sdp_S_pn / c_sdp_Q_fft;  -- = 6 PFB units, for 6 signal input pairs
+  CONSTANT c_sdp_T_adc                : TIME    := (10**6 / c_sdp_f_adc_MHz) * 1 ps;  -- = 5 ns @ 200MHz
+  CONSTANT c_sdp_T_sub                : TIME    := c_sdp_N_fft * c_sdp_T_adc;  -- = 5.12 us @ 200MHz
+  CONSTANT c_sdp_W_bf_product         : NATURAL := c_sdp_W_subband + c_sdp_W_bf_weight -1;
+  CONSTANT c_sdp_X_sq                 : NATURAL := c_sdp_S_pn * c_sdp_S_pn;  -- = 144
+  CONSTANT c_sdp_block_period         : NATURAL := c_sdp_N_fft * 1000 / c_sdp_f_adc_MHz;  -- = 5120 [ns]
+  CONSTANT c_sdp_N_beamlets_sdp       : NATURAL := c_sdp_N_beamsets * c_sdp_S_sub_bf;  -- = 976
+
+  -- . unit weights
+  CONSTANT c_sdp_unit_sub_weight      : NATURAL := 2**c_sdp_W_sub_weight_fraction;  -- 2**13, so range +-4.0 for 16 bit signed weight
+  CONSTANT c_sdp_unit_bf_weight       : NATURAL := 2**c_sdp_W_bf_weight_fraction;  -- 2**14, so range +-2.0 for 16 bit signed weight
+  CONSTANT c_sdp_unit_beamlet_scale   : NATURAL := 2**c_sdp_W_beamlet_scale_fraction;  -- 2**15, so range +-1.0 for 16 bit signed weight
 
   -----------------------------------------------------------------------------
   -- PFB
@@ -366,7 +366,7 @@ PACKAGE sdp_pkg is
       ( field_name_pad("sdp_source_info_gn_id"              ), "RW",  5, field_default(0) ),
 
       ( field_name_pad("sdp_reserved"                       ), "RW", 40, field_default(0) ),
-      ( field_name_pad("sdp_beamlet_scale"                  ), "RW", 16, field_default(c_sdp_beamlet_scale_default) ),
+      ( field_name_pad("sdp_beamlet_scale"                  ), "RW", 16, field_default(c_sdp_unit_beamlet_scale) ),
       ( field_name_pad("sdp_beamlet_index"                  ), "RW", 16, field_default(0) ),
       ( field_name_pad("sdp_nof_blocks_per_packet"          ), "RW",  8, field_default(c_sdp_cep_nof_blocks_per_packet) ),
       ( field_name_pad("sdp_nof_beamlets_per_block"         ), "RW", 16, field_default(c_sdp_cep_nof_beamlets_per_block) ),
diff --git a/doc/erko_howto_tools.txt b/doc/erko_howto_tools.txt
index 3da862a891f2babd981d398dfe9ad1169de2ea42..f1eff095dee90cfb466a4ac0b68bd37a8aef4cbd 100755
--- a/doc/erko_howto_tools.txt
+++ b/doc/erko_howto_tools.txt
@@ -21,6 +21,7 @@
 * Jupyter
 * Graphana
 * Zenodo DOI
+* SDPTR
 
 
 
@@ -491,8 +492,23 @@ Host dop421
 
 * Remote access to regression test machine dop349:
 ssh -X kooistra@portal.astron.nl
-ssh -X regtest@dop349
 
+# Ipv via portal.astron.nl nu via bastion.astron.nl (195.169.155.27) mbv step client
+# zie: https://support.astron.nl/confluence/pages/viewpage.action?spaceKey=IN&title=SSH+access+to+the+ASTRON+network
+
+/home/kooistra/.ssh/config
+/home/kooistra/.step/ssh/config
+/home/kooistra/.step/ssh/known_hosts
+
+ssh -J bastion.astron.nl regtest@dop349.astron.nl
+You won't be asked for a (bastion) password. The certificate you've just generated will last for twelve hours. Once it's elapsed, the only step from the above you need to perform again is
+
+$ step ssh login kooistra@astron.nl --provisioner "keycloak"
+
+Whereupon you'll be good for another twelve hours. The above command is a great candidate for a shell alias.
+
+
+# On dop349
 crontab -l  # shows scheduled cron jobs
 crontab -e  # edit schedule
 
@@ -919,3 +935,16 @@ Reading package lists... Done
 
 > sudo apt-get install openscad
 Gelukt !
+
+
+*******************************************************************************
+* SDPTR
+*******************************************************************************
+
+sudo pip3 install setuptools-rust
+sudo pip3 install asyncua
+
+:kooistra@dop466:/dop466_0/kooistra/git/sdptr/test/py/control$ ./sdp_rw.py --host dop421 -l
+:kooistra@dop466:/dop466_0/kooistra/git/sdptr/test/py/control$ ./sdp_rw.py --host dop421 -r firmware_version
+
+
diff --git a/libraries/base/common/src/vhdl/common_pkg.vhd b/libraries/base/common/src/vhdl/common_pkg.vhd
index d57813bc9a4de02174e449cce1cf367fc7049baa..ef84bffe9d09ed520781e7108c6212dddc026d18 100644
--- a/libraries/base/common/src/vhdl/common_pkg.vhd
+++ b/libraries/base/common/src/vhdl/common_pkg.vhd
@@ -193,7 +193,9 @@ PACKAGE common_pkg IS
   
   FUNCTION ratio( n, d : NATURAL) RETURN NATURAL;  -- return n/d when n MOD d = 0 else return 0, so ratio * d = n only when integer ratio > 0
   FUNCTION ratio2(n, m : NATURAL) RETURN NATURAL;  -- return integer ratio of n/m or m/n, whichever is the largest
- 
+
+  -- use almost_equal(a/b, 1.0, max_ratio) to verify that a and b differ less than max_ratio/100 percent
+  -- use almost_zero(a/b, max_ratio) to verify that a is less than max_ratio/100 percent of b, so almost zero
   FUNCTION almost_equal(a, b, delta : REAL) RETURN BOOLEAN;  -- return TRUE when abs(a - b) < abs(delta), else return FALSE
   FUNCTION almost_zero(a, delta : REAL) RETURN BOOLEAN;      -- return TRUE when abs(a)     < abs(delta), else return FALSE