diff --git a/libraries/dsp/correlator/src/vhdl/corr_output_framer.vhd b/libraries/dsp/correlator/src/vhdl/corr_output_framer.vhd
index 1438e1e18791106b01d1839f74ccebf348d8944f..7db3f00098b616e1fa6c64a3ba1abe23702b8e31 100644
--- a/libraries/dsp/correlator/src/vhdl/corr_output_framer.vhd
+++ b/libraries/dsp/correlator/src/vhdl/corr_output_framer.vhd
@@ -28,8 +28,15 @@ USE dp_lib.dp_stream_pkg.ALL;
 -- Purpose:
 -- . Add SOP, EOP, BSN, SYNC and CHANNEL fields to correlator output.
 -- Description:
--- . dp_block_gen generates the SOP, EOP, BSN and SYNC
--- . A clocked process adds the correct channel.
+-- . Frame length        : g_nof_words_per_frame tagged by SOP..EOP.
+-- . Sync period         : g_nof_channels * g_nof_words_per_frame
+-- . Channel index range : 0..g_nof_channels-1
+-- . BSN increment       : Once every g_nof_channels
+-- . The above is implemented as follows:
+--   . dp_block_gen_sop_eop_sync generates the SOP, EOP and Sync
+--   . A clocked process adds:
+--     . channel based on SOP.
+--     . the BSN based on Sync.
 
 ENTITY corr_output_framer IS
   GENERIC (
@@ -50,17 +57,19 @@ END corr_output_framer;
 
 ARCHITECTURE str OF corr_output_framer IS
 
-  SIGNAL dp_block_gen_src_out_arr : t_dp_sosi_arr(g_nof_inputs-1 DOWNTO 0);
-  SIGNAL channel_src_out_arr      : t_dp_sosi_arr(g_nof_inputs-1 DOWNTO 0);
-  SIGNAL nxt_channel_src_out_arr  : t_dp_sosi_arr(g_nof_inputs-1 DOWNTO 0);
+  SIGNAL dp_block_gen_src_out_arr     : t_dp_sosi_arr(g_nof_inputs-1 DOWNTO 0);
+  SIGNAL reg_dp_block_gen_src_out_arr : t_dp_sosi_arr(g_nof_inputs-1 DOWNTO 0);
+
+  SIGNAL channel_bsn_src_out_arr      : t_dp_sosi_arr(g_nof_inputs-1 DOWNTO 0);
+  SIGNAL nxt_channel_bsn_src_out_arr  : t_dp_sosi_arr(g_nof_inputs-1 DOWNTO 0);
 
 BEGIN
 
   -----------------------------------------------------------------------------
-  -- Add SOP and EOP to mux output
+  -- dp_block_gen to create correc SOP,EOP and Sync
   -----------------------------------------------------------------------------
-  gen_dp_block_gen : FOR i IN 0 TO g_nof_inputs-1 GENERATE
-    u_dp_block_gen: ENTITY dp_lib.dp_block_gen
+  gen_dp_block_gen_sop_eop_sync : FOR i IN 0 TO g_nof_inputs-1 GENERATE
+    u_dp_block_gen_sop_eop_sync: ENTITY dp_lib.dp_block_gen
     GENERIC MAP (
       g_use_src_in         => FALSE,
       g_nof_data           => g_nof_words_per_frame,
@@ -77,40 +86,53 @@ BEGIN
   END GENERATE;
 
   -----------------------------------------------------------------------------
-  -- Assign the channel field
+  -- Create channel (based on SOP) and BSN (based on Sync)
   -----------------------------------------------------------------------------
-  p_channel : PROCESS(dp_block_gen_src_out_arr)
+  p_channel_bsn : PROCESS(dp_block_gen_src_out_arr)
   BEGIN
     FOR i IN 0 TO g_nof_inputs-1 LOOP
-      nxt_channel_src_out_arr(i).channel <= channel_src_out_arr(i).channel;
-      IF dp_block_gen_src_out_arr(i).eop='1' THEN
-        IF channel_src_out_arr(i).channel = TO_DP_CHANNEL(g_nof_channels-1) THEN
-          nxt_channel_src_out_arr(i).channel <= TO_DP_CHANNEL(0);
+      nxt_channel_bsn_src_out_arr(i).channel <= channel_bsn_src_out_arr(i).channel;
+      nxt_channel_bsn_src_out_arr(i).bsn     <= channel_bsn_src_out_arr(i).bsn;
+      -- Channel
+      IF dp_block_gen_src_out_arr(i).sop='1' THEN
+        IF channel_bsn_src_out_arr(i).channel = TO_DP_CHANNEL(g_nof_channels-1) THEN
+          nxt_channel_bsn_src_out_arr(i).channel <= TO_DP_CHANNEL(0);
         ELSE
-          nxt_channel_src_out_arr(i).channel <= INCR_UVEC(channel_src_out_arr(i).channel, 1);
+          nxt_channel_bsn_src_out_arr(i).channel <= INCR_UVEC(channel_bsn_src_out_arr(i).channel, 1);
         END IF;
       END IF;
+      -- BSN
+      IF dp_block_gen_src_out_arr(i).sync='1' THEN
+        nxt_channel_bsn_src_out_arr(i).bsn <= INCR_UVEC(channel_bsn_src_out_arr(i).bsn, 1);
+      END IF;
     END LOOP;
   END PROCESS;
 
-  -- Registers
+  -- Registers: also register dp_block_gen_src_out_arr to align it with p_channel_bsn outputs
   p_clk: PROCESS(clk, rst)
   BEGIN
     IF rst='1' THEN
-      channel_src_out_arr <= (OTHERS=>c_dp_sosi_rst);
+      channel_bsn_src_out_arr      <= (OTHERS=>c_dp_sosi_rst);
+      reg_dp_block_gen_src_out_arr <= (OTHERS=>c_dp_sosi_rst);
+      FOR i IN 0 TO g_nof_inputs-1 LOOP
+        channel_bsn_src_out_arr(i).channel <= X"FFFFFFFF";          -- Wrap to 0 on first increment
+        channel_bsn_src_out_arr(i).bsn     <= X"FFFFFFFF_FFFFFFFF"; -- Wrap to 0 on first increment
+      END LOOP;
     ELSIF rising_edge(clk) THEN
-      channel_src_out_arr <= nxt_channel_src_out_arr;
+      channel_bsn_src_out_arr      <= nxt_channel_bsn_src_out_arr;
+      reg_dp_block_gen_src_out_arr <= dp_block_gen_src_out_arr;
     END IF;
   END PROCESS;
 
   -----------------------------------------------------------------------------
-  -- Add channel field to dp_block_gen_src_out_arr and forward to snk_out_arr
+  -- Add channel,bsn fields to reg_dp_block_gen_src_out_arr and forward to src_out_arr
   -----------------------------------------------------------------------------
-  p_wires : PROCESS(dp_block_gen_src_out_arr, channel_src_out_arr)
+  p_wires : PROCESS(reg_dp_block_gen_src_out_arr, channel_bsn_src_out_arr)
   BEGIN
-    src_out_arr <= dp_block_gen_src_out_arr;
+    src_out_arr <= reg_dp_block_gen_src_out_arr;
     FOR i IN 0 TO g_nof_inputs-1 LOOP
-      src_out_arr(i).channel <= channel_src_out_arr(i).channel;
+      src_out_arr(i).channel <= channel_bsn_src_out_arr(i).channel;
+      src_out_arr(i).bsn     <= channel_bsn_src_out_arr(i).bsn;
     END LOOP;
   END PROCESS;