diff --git a/libraries/base/dp/src/vhdl/dp_bsn_align_v2.vhd b/libraries/base/dp/src/vhdl/dp_bsn_align_v2.vhd
index 93503fa074181dcf3aa1a2f39d57e8dbc1646a05..30a2b58a1cd3f2906dd338ab6c9804660ee00ea2 100644
--- a/libraries/base/dp/src/vhdl/dp_bsn_align_v2.vhd
+++ b/libraries/base/dp/src/vhdl/dp_bsn_align_v2.vhd
@@ -125,7 +125,8 @@ ARCHITECTURE rtl OF dp_bsn_align_v2 IS
     rd_pointer        : INTEGER;  -- use integer to detect need to wrap to natural
     rd_offset         : STD_LOGIC_VECTOR(c_mem_ram.adr_w-1 DOWNTO 0);
     rd_copi           : t_mem_copi;
-    out_sosi_arr      : t_dp_sosi_arr(g_nof_streams-1 DOWNTO 0);  -- used to hold bsn, otherwise combinatorial
+    fill_cipo_arr     : t_mem_cipo_arr(g_nof_streams-1 DOWNTO 0);  -- used combinatorial to contain rd_cipo_arr from buffer or filler data
+    out_bsn           : STD_LOGIC_VECTOR(g_bsn_w-1 DOWNTO 0);  -- hold BSN for streaming output
   END RECORD;
 
   CONSTANT c_reg_rst  : t_reg := (0,
@@ -138,7 +139,8 @@ ARCHITECTURE rtl OF dp_bsn_align_v2 IS
                                   0,
                                   (OTHERS=>'0'),
                                   c_mem_copi_rst,
-                                  (OTHERS=>c_dp_sosi_rst));
+                                  (OTHERS=>c_mem_cipo_rst),
+                                  (OTHERS=>'0'));
 
   -- State registers
   SIGNAL r             : t_reg;
@@ -179,13 +181,15 @@ BEGIN
     VARIABLE v_pointer_slv       : STD_LOGIC_VECTOR(c_blk_pointer_w-1 DOWNTO 0);
     VARIABLE v_product_slv       : STD_LOGIC_VECTOR(c_product_w-1 DOWNTO 0);
     VARIABLE v_filler_flag       : STD_LOGIC;
-    VARIABLE v_rd_cipo_arr       : t_mem_cipo_arr(g_nof_streams-1 DOWNTO 0);
+    VARIABLE v_out_sosi_arr      : t_dp_sosi_arr(g_nof_streams-1 DOWNTO 0);
   BEGIN
     v := r;
     v.mm_sosi := func_dp_stream_reset_control(r.mm_sosi);
     v.wr_copi_arr := RESET_MEM_COPI_CTRL(r.wr_copi_arr);
 
+    ----------------------------------------------------------------------------
     -- p_write_arr
+    ----------------------------------------------------------------------------
     FOR I IN 0 TO g_nof_streams-1 LOOP
       -- p_write
       IF in_sosi_arr_p(I).valid = '1' THEN
@@ -206,7 +210,9 @@ BEGIN
       END IF;
     END LOOP;
 
+    ----------------------------------------------------------------------------
     -- p_control, all at sop of local reference input 0
+    ----------------------------------------------------------------------------
     v_ref_sosi := in_sosi_arr_p(0);
     IF v_ref_sosi.sop = '1' THEN
       -- . write sync & bsn buffer
@@ -257,25 +263,36 @@ BEGIN
       END LOOP;
     END IF;
 
+    ----------------------------------------------------------------------------
     -- p_read
-    -- . prepare the rd data
-    v_rd_cipo_arr := rd_cipo_arr;  -- default use input data
+    ----------------------------------------------------------------------------
+
+    -- Read the data from the buffer, or replace a block by filler data
+    -- . default use input data from the circular buffer
+    v.fill_cipo_arr := rd_cipo_arr;
+    -- . if necessary, replace a stream by filler data
     FOR I IN 0 TO g_nof_streams-1 LOOP
       IF r.use_filler_data(I) = '1' THEN
-        v_rd_cipo_arr(I).rddata := TO_MEM_SDATA(g_filler_value);  -- replace by filler data
+        v.fill_cipo_arr(I).rddata := TO_MEM_SDATA(g_filler_value);
       END IF;
     END LOOP;
 
     IF g_use_mm_output THEN
-      -- . adjust the rd address
-      v.rd_copi := mm_copi;  -- do output via MM interface
+      --------------------------------------------------------------------------
+      -- Do the output via the MM interface
+      --------------------------------------------------------------------------
+      -- . adjust the rd address to the current buffer output block
+      v.rd_copi := mm_copi;
       v.rd_copi.address := RESIZE_MEM_ADDRESS(ADD_UVEC(r.rd_offset, mm_copi.address));  -- sum yields c_mem_ram.adr_w bits, because left operand determines width
 
-      -- output via MM interface
-      mm_cipo_arr <= v_rd_cipo_arr;
+      -- . output via MM interface
+      mm_cipo_arr <= v.fill_cipo_arr;
     ELSE
+      --------------------------------------------------------------------------
+      -- Do the output via the DP streaming interface
+      --------------------------------------------------------------------------
       -- . adjust the rd address
-      v.rd_copi := dp_copi;  -- do output via DP streaming interface
+      v.rd_copi := dp_copi;
       v.rd_copi.address := RESIZE_MEM_ADDRESS(ADD_UVEC(r.rd_offset, dp_copi.address));  -- sum yields c_mem_ram.adr_w bits, because left operand determines width
 
       -- . hold mm_sosi.sync, bsn
@@ -283,23 +300,24 @@ BEGIN
         dp_sosi <= r.mm_sosi;
       END IF;
 
-      -- apply mm_sosi.sync, bsn at sop to all streams in out_sosi_arr
-      v.out_sosi_arr := rd_sosi_arr;
+      -- apply mm_sosi.sync and bsn at sop to all streams in out_sosi_arr
+      v_out_sosi_arr := rd_sosi_arr;  -- the input data from the buffer or filler data (= v.fill_cipo_arr in streaming format)
       IF rd_sosi_arr(0).sop = '1' THEN
-        v.out_sosi_arr := func_dp_stream_arr_set(v.out_sosi_arr, dp_sosi.sync, "SYNC");
-        v.out_sosi_arr := func_dp_stream_arr_set(v.out_sosi_arr, dp_sosi.bsn, "BSN");
+        v_out_sosi_arr := func_dp_stream_arr_set(v_out_sosi_arr, dp_sosi.sync, "SYNC");
+        v_out_sosi_arr := func_dp_stream_arr_set(v_out_sosi_arr, dp_sosi.bsn, "BSN");
+        v.out_bsn := dp_sosi.bsn(g_bsn_w-1 DOWNTO 0);  -- hold BSN until next sop, to ease view in wave window
       ELSE
-        -- hold sosi.bsn until next sop, to easy view in wave window
-        FOR I IN 0 TO g_nof_streams-1 LOOP
-          v.out_sosi_arr(I).bsn := r.out_sosi_arr(I).bsn;
-        END LOOP;
+        -- hold BSN until next sop, to ease view in wave window
+        v_out_sosi_arr := func_dp_stream_arr_set(v_out_sosi_arr, r.out_bsn, "BSN");
       END IF;
 
-      -- output via DP streaming interface
-      out_sosi_arr <= v.out_sosi_arr;
+      -- . output via DP streaming interface
+      out_sosi_arr <= v_out_sosi_arr;
     END IF;
 
+    ----------------------------------------------------------------------------
     -- next state
+    ----------------------------------------------------------------------------
     nxt_r <= v;
   END PROCESS;
 
@@ -328,9 +346,6 @@ BEGIN
   ------------------------------------------------------------------------------
   -- MM to streaming DP
   ------------------------------------------------------------------------------
-  gen_use_mm_output : IF g_use_mm_output GENERATE
-
-  END GENERATE;
 
   gen_streaming_output : IF NOT g_use_mm_output GENERATE
     dp_copi <= dp_copi_arr(0);
@@ -353,12 +368,11 @@ BEGIN
         start_address => 0,
         mm_done       => dp_done_arr(I),
         mm_mosi       => dp_copi_arr(I),
-        mm_miso       => rd_cipo_arr(I),
+        mm_miso       => nxt_r.fill_cipo_arr(I),
         out_sosi      => rd_sosi_arr(I),
         out_siso      => c_dp_siso_rdy
       );
     END GENERATE;
-
   END GENERATE;