diff --git a/libraries/base/dp/tb/vhdl/tb_dp_bsn_align_v2.vhd b/libraries/base/dp/tb/vhdl/tb_dp_bsn_align_v2.vhd
index 4e62f1ceba00e9d1ddd859c1ef6ed081bfb85ec4..355167812161085aa5c38ebbf8fd878049ac0264 100644
--- a/libraries/base/dp/tb/vhdl/tb_dp_bsn_align_v2.vhd
+++ b/libraries/base/dp/tb/vhdl/tb_dp_bsn_align_v2.vhd
@@ -19,6 +19,14 @@
 -- Author: Eric Kooistra, 3 Sept 2021
 -- Purpose: Verify dp_bsn_align_v2
 -- Description:
+--   The tb verifies:
+--   . DUT alignment of g_nof_streams
+--   . DUT restart via g_tb_nof_restart > 1
+--   . gaps or no gaps between blocks via g_block_period >= g_block_size
+--   . g_bsn_latency_max in combination with g_tb_diff_delay_max
+--   . g_use_mm_output using DUT MM to DP or external MM to DP in tb
+--   . g_replacement_value for a remote g_disable_stream (one is enough
+--     to verify), the local stream cannot be disabled.
 -- Usage:
 -- > as 10
 -- > run -all
@@ -45,6 +53,7 @@ ENTITY tb_dp_bsn_align_v2 IS
     g_bsn_w                : NATURAL := c_dp_stream_bsn_w;  -- number of bits in sosi BSN
     g_data_w               : NATURAL := 16;     -- number of bits in sosi data
     g_replacement_value    : INTEGER := 17;      -- output sosi data replacement value for missing input blocks
+    g_disable_stream       : NATURAL := 1;      -- default 0 to enable all streams, > 0 selects stream that will be disabled
     g_use_mm_output        : BOOLEAN := FALSE;   -- output via MM or via streaming DP
     g_pipeline_input       : NATURAL := 1;      -- >= 0, choose 0 for wires, choose 1 to ease timing closure
     g_rd_latency           : NATURAL := 2;      -- 1 or 2, choose 2 to ease timing closure
@@ -96,14 +105,16 @@ ARCHITECTURE tb OF tb_dp_bsn_align_v2 IS
   SIGNAL tb_end                : STD_LOGIC;
   SIGNAL clk                   : STD_LOGIC := '1';
   SIGNAL rst                   : STD_LOGIC := '1';
+  SIGNAL sl1                   : STD_LOGIC := '1';
 
   SIGNAL node_index            : NATURAL := 0;
 
   SIGNAL stream_en_arr         : STD_LOGIC_VECTOR(g_nof_streams-1 DOWNTO 0) := (OTHERS => '1');  -- default all streams are enabled
 
   SIGNAL ref_siso_arr          : t_dp_siso_arr(g_nof_streams-1 DOWNTO 0) := (OTHERS => c_dp_siso_rdy);
-  SIGNAL ref_sosi_arr          : t_dp_sosi_arr(g_nof_streams-1 DOWNTO 0);
-  SIGNAL in_sosi_arr           : t_dp_sosi_arr(g_nof_streams-1 DOWNTO 0) := (OTHERS => c_dp_sosi_rst);
+  SIGNAL ref_sosi_arr          : t_dp_sosi_arr(g_nof_streams-1 DOWNTO 0);                               -- generated stimuli
+  SIGNAL rx_sosi_arr           : t_dp_sosi_arr(g_nof_streams-1 DOWNTO 0) := (OTHERS => c_dp_sosi_rst);  -- received stimuli
+  SIGNAL in_sosi_arr           : t_dp_sosi_arr(g_nof_streams-1 DOWNTO 0) := (OTHERS => c_dp_sosi_rst);  -- input stimuli
 
   SIGNAL in_sync_arr           : STD_LOGIC_VECTOR(g_nof_streams-1 DOWNTO 0);
   SIGNAL in_sop_arr            : STD_LOGIC_VECTOR(g_nof_streams-1 DOWNTO 0);
@@ -189,12 +200,9 @@ BEGIN
       -- Begin of stimuli
       FOR S IN 0 TO g_tb_nof_restart-1 LOOP
         v_bsn := c_bsn_init;
-        IF S = 2 THEN
-          stream_en_arr(1) <= '0';
-        END IF;
         FOR R IN 0 TO g_tb_nof_blocks-1 LOOP
           v_sync := sel_a_b(v_bsn MOD c_sync_period = c_sync_offset, '1', '0');
-          proc_dp_gen_block_data(c_rl, TRUE, c_data_w, c_data_w, v_data, 0, 0, g_block_size, v_channel, v_err, v_sync, TO_UVEC(v_bsn, c_bsn_w), clk, stream_en_arr(I), ref_siso_arr(I), ref_sosi_arr(I));
+          proc_dp_gen_block_data(c_rl, TRUE, c_data_w, c_data_w, v_data, 0, 0, g_block_size, v_channel, v_err, v_sync, TO_UVEC(v_bsn, c_bsn_w), clk, sl1, ref_siso_arr(I), ref_sosi_arr(I));
           v_bsn  := v_bsn + 1;
           v_data := v_data + g_block_size;
           proc_common_wait_some_cycles(clk, c_gap_size);  -- create gap between frames
@@ -206,7 +214,11 @@ BEGIN
       -- End of stimuli, g_bsn_latency_max blocks remain in DUT buffer
       expected_out_bsn_arr(I) <= TO_UVEC(v_bsn-1 - c_align_latency_nof_blocks, c_bsn_w);
       expected_out_data_arr(I) <= TO_UVEC(v_data-1 - c_align_latency_nof_valid, c_data_w);
-      
+      IF I > 0 AND I = g_disable_stream THEN
+        -- Expected stream disable replacement value
+        expected_out_data_arr(I) <= TO_UVEC(g_replacement_value, c_data_w);
+      END IF;
+
       proc_common_wait_some_cycles(clk, 100);
       verify_done_arr(I) <= '1';
       proc_common_wait_some_cycles(clk, 1);
@@ -217,6 +229,9 @@ BEGIN
     END PROCESS;
   END GENERATE;
 
+  -- Model remote input stream enable/disable
+  stream_en_arr(g_disable_stream) <= '0' WHEN g_disable_stream > 0;
+
   -- Use tb_state to view tb progress in Wave window
   restart_cnt <= restart_cnt_arr(0);
 
@@ -228,11 +243,13 @@ BEGIN
     IF restart_cnt > 1 THEN tb_state <= s_restart; END IF;
   END PROCESS;
 
-  -- Create latency misalignment between the input streams
-  gen_in_sosi_arr : FOR I IN g_nof_streams-1 DOWNTO 0 GENERATE
-    in_sosi_arr(I) <= TRANSPORT ref_sosi_arr(I) AFTER func_input_delay(I) * clk_period;
+  -- Model misalignment latency between the input streams
+  gen_rx_sosi_arr : FOR I IN g_nof_streams-1 DOWNTO 0 GENERATE
+    rx_sosi_arr(I) <= TRANSPORT ref_sosi_arr(I) AFTER func_input_delay(I) * clk_period;
   END GENERATE;
 
+  -- Model lost input
+  in_sosi_arr <= rx_sosi_arr;
 
   tb_end <= vector_and(tb_end_arr);
   
diff --git a/libraries/base/dp/tb/vhdl/tb_tb_dp_bsn_align_v2.vhd b/libraries/base/dp/tb/vhdl/tb_tb_dp_bsn_align_v2.vhd
index f47d2acf82d36d526f01bd4df781fd3e733b094f..3805e23c5ed32f624e1e10cef3b1d0863a6a4536 100644
--- a/libraries/base/dp/tb/vhdl/tb_tb_dp_bsn_align_v2.vhd
+++ b/libraries/base/dp/tb/vhdl/tb_tb_dp_bsn_align_v2.vhd
@@ -52,6 +52,7 @@ BEGIN
   -- g_bsn_w                      : NATURAL := c_dp_stream_bsn_w;  -- number of bits in sosi BSN
   -- g_data_w                     : NATURAL := 16;     -- number of bits in sosi data
   -- c_replacement_value          : INTEGER := 0;      -- output sosi data replacement value for missing input blocks
+  -- g_disable_stream             : NATURAL := 0;      -- default 0 to enable all streams, > 0 selects stream that will be disabled
   -- g_use_mm_output              : BOOLEAN := FALSE;  -- output via MM or via streaming DP
   -- g_pipeline_input             : NATURAL := 1;      -- >= 0, choose 0 for wires, choose 1 to ease timing closure
   -- g_rd_latency                 : NATURAL := 2;      -- 1 or 2, choose 2 to ease timing closure
@@ -61,10 +62,11 @@ BEGIN
   -- g_tb_nof_restart       : NATURAL := 1;       -- number of times to restart the input stimuli
   -- g_tb_nof_blocks        : NATURAL := 10       -- number of input blocks per restart
 
-  u_mm_output          : ENTITY work.tb_dp_bsn_align_v2 GENERIC MAP (2, c_bsn_latency_max, 1, c_block, c_period, 32, 16, 17,  TRUE, 0, 1,                0, 1, 50);
-  u_dp_output          : ENTITY work.tb_dp_bsn_align_v2 GENERIC MAP (2, c_bsn_latency_max, 1, c_block, c_period, 32, 16, 17, FALSE, 0, 1,                0, 1, 50);
+  u_mm_output          : ENTITY work.tb_dp_bsn_align_v2 GENERIC MAP (2, c_bsn_latency_max, 1, c_block, c_period, 32, 16, 17, 0,  TRUE, 0, 1,                0, 1, 50);
+  u_dp_output          : ENTITY work.tb_dp_bsn_align_v2 GENERIC MAP (2, c_bsn_latency_max, 1, c_block, c_period, 32, 16, 17, 0, FALSE, 0, 1,                0, 1, 50);
+  u_dp_disable         : ENTITY work.tb_dp_bsn_align_v2 GENERIC MAP (4, c_bsn_latency_max, 1, c_block, c_period, 32, 16, 17, 2, FALSE, 0, 1,                0, 1, 50);
 
-  u_diff_delay_no_loss : ENTITY work.tb_dp_bsn_align_v2 GENERIC MAP (2, c_bsn_latency_max, 1, c_block, c_period, 32, 16, 17, FALSE, 0, 1,      c_delay_max, 1, 50);
-  --u_loss_replacement   : ENTITY work.tb_dp_bsn_align_v2 GENERIC MAP (2, c_bsn_latency_max, 1, c_block, c_period, 32, 16, 17, FALSE, 0, 1, 40 + c_delay_max, 1, 50);
+  u_diff_delay_no_loss : ENTITY work.tb_dp_bsn_align_v2 GENERIC MAP (2, c_bsn_latency_max, 1, c_block, c_period, 32, 16, 17, 0, FALSE, 0, 1,      c_delay_max, 1, 50);
+  --u_loss_replacement   : ENTITY work.tb_dp_bsn_align_v2 GENERIC MAP (2, c_bsn_latency_max, 1, c_block, c_period, 32, 16, 17, 0, FALSE, 0, 1, 40 + c_delay_max, 1, 50);
 
 END tb;