diff --git a/libraries/base/dp/src/vhdl/dp_switch.vhd b/libraries/base/dp/src/vhdl/dp_switch.vhd
index 1ddb92f94a76d9b73f5cc1dbf3ff7844f3d99bd2..b8d911cb6444176f33313e348faa5dff911075d5 100644
--- a/libraries/base/dp/src/vhdl/dp_switch.vhd
+++ b/libraries/base/dp/src/vhdl/dp_switch.vhd
@@ -66,7 +66,10 @@ ENTITY dp_switch IS
     mm_rst      : IN  STD_LOGIC;
 
     snk_in_arr  : IN  t_dp_sosi_arr(g_nof_inputs-1 DOWNTO 0);
+    snk_out_arr : OUT t_dp_siso_arr(g_nof_inputs-1 DOWNTO 0);
+
     src_out     : OUT t_dp_sosi;
+    src_in      : IN  t_dp_siso := c_dp_siso_rdy;
 
     reg_mosi    : IN  t_mem_mosi;
     reg_miso    : OUT t_mem_miso
@@ -82,8 +85,8 @@ ARCHITECTURE str OF dp_switch IS
   SIGNAL dp_mux_sel_ctrl_req : NATURAL;
   SIGNAL dp_mux_sel_ctrl     : NATURAL;
 
-  SIGNAL xonoff_snk_in_arr   : t_dp_sosi_arr(g_nof_inputs-1 DOWNTO 0);
-  SIGNAL xonoff_snk_out_arr  : t_dp_siso_arr(g_nof_inputs-1 DOWNTO 0);
+  SIGNAL xonoff_src_out_arr  : t_dp_sosi_arr(g_nof_inputs-1 DOWNTO 0);
+  SIGNAL xonoff_src_in_arr   : t_dp_siso_arr(g_nof_inputs-1 DOWNTO 0);
 
   SIGNAL inverted_snk_in_arr : t_dp_sosi_arr(0 TO g_nof_inputs-1);
   SIGNAL inverted_snk_out_arr: t_dp_siso_arr(0 TO g_nof_inputs-1);
@@ -120,9 +123,10 @@ BEGIN
       rst         => dp_rst,
       -- Frame in
       in_sosi     => snk_in_arr(i),
+      in_siso     => snk_out_arr(i),
       -- Frame out
-      out_siso    => xonoff_snk_out_arr(i),     -- flush control done by dp_mux.snk_out_arr
-      out_sosi    => xonoff_snk_in_arr(i) 
+      out_siso    => xonoff_src_in_arr(i),     -- flush control done by dp_mux.snk_out_arr
+      out_sosi    => xonoff_src_out_arr(i) 
     );
   END GENERATE;
 
@@ -130,8 +134,8 @@ BEGIN
   -- invert snk_in_arr, dp_mux uses a TO array. 
   ------------------------------------------------------------------------------
   gen_dp_switch_snk_in_arr : FOR i IN 0 TO g_nof_inputs-1 GENERATE
-    inverted_snk_in_arr(i) <= xonoff_snk_in_arr(i);
-    xonoff_snk_out_arr(i) <= inverted_snk_out_arr(i);
+    inverted_snk_in_arr(i) <= xonoff_src_out_arr(i);
+    xonoff_src_in_arr(i) <= inverted_snk_out_arr(i);
   END GENERATE;
 
   ------------------------------------------------------------------------------
@@ -174,7 +178,7 @@ BEGIN
     snk_out_arr => inverted_snk_out_arr,
 
     src_out     => src_out,
-    src_in      => c_dp_siso_rdy
+    src_in      => src_in
   );  
 
 END str;
diff --git a/libraries/base/dp/tb/vhdl/tb_dp_switch.vhd b/libraries/base/dp/tb/vhdl/tb_dp_switch.vhd
index 1a7ca6ad141e08a5b7c5ef847dbae8377e2600d0..3270695e9b8be573d57334b0429ce1f339cd9d37 100644
--- a/libraries/base/dp/tb/vhdl/tb_dp_switch.vhd
+++ b/libraries/base/dp/tb/vhdl/tb_dp_switch.vhd
@@ -29,6 +29,7 @@ LIBRARY IEEE, common_lib;
 USE IEEE.std_logic_1164.ALL;
 USE IEEE.numeric_std.ALL;
 USE common_lib.common_pkg.ALL;
+USE common_lib.common_str_pkg.ALL;
 USE common_lib.common_mem_pkg.ALL;
 USE common_lib.tb_common_pkg.ALL;
 USE common_lib.tb_common_mem_pkg.ALL;
@@ -61,12 +62,15 @@ ARCHITECTURE tb OF tb_dp_switch IS
   SIGNAL mm_rst                          : STD_LOGIC;
 
   SIGNAL dp_gen_block_data_in_en         : STD_LOGIC := '1';
-  SIGNAL dp_gen_block_data_src_in        : t_dp_siso := c_dp_siso_rdy;
 
+  SIGNAL dp_gen_block_data_src_in_arr    : t_dp_siso_arr(c_nof_inputs-1 DOWNTO 0);
   SIGNAL dp_gen_block_data_src_out_arr   : t_dp_sosi_arr(c_nof_inputs-1 DOWNTO 0);
 
   SIGNAL dp_switch_snk_in_arr            : t_dp_sosi_arr(c_nof_inputs-1 DOWNTO 0);
+  SIGNAL dp_switch_snk_out_arr           : t_dp_siso_arr(c_nof_inputs-1 DOWNTO 0);
+
   SIGNAL dp_switch_src_out               : t_dp_sosi;
+  SIGNAL dp_switch_src_in                : t_dp_siso := c_dp_siso_rdy;
 
   SIGNAL reg_dp_switch_mosi              : t_mem_mosi := c_mem_mosi_rst;
   SIGNAL reg_dp_switch_miso              : t_mem_miso;
@@ -82,41 +86,72 @@ BEGIN
   mm_clk <= NOT mm_clk OR tb_end AFTER c_mm_clk_period/2;
   mm_rst <= '1', '0' AFTER c_mm_clk_period*7;
 
+
   -----------------------------------------------------------------------------
-  -- Generate packet streams
+  -- Generate continuous packet streams, with and without gaps
   -----------------------------------------------------------------------------
+  dp_gen_block_data_src_in_arr <= dp_switch_snk_out_arr;
+  
   gen_generate_packets : FOR i IN 0 TO c_nof_inputs-1 GENERATE
     p_generate_packets : PROCESS
     BEGIN
       dp_gen_block_data_src_out_arr(i) <= c_dp_sosi_rst;
+       
   
       proc_common_wait_until_low(dp_clk, dp_rst);
       --proc_common_wait_some_cycles(dp_clk, 4);
   
       -- Generate single packet
-      proc_dp_gen_block_data(c_data_w, i*1000, c_packet_len, 0, 0, '0', "0", dp_clk, dp_gen_block_data_in_en, dp_gen_block_data_src_in, dp_gen_block_data_src_out_arr(i)); 
+      proc_dp_gen_block_data(c_data_w, i*1000, c_packet_len, 0, 0, '0', "0", dp_clk, dp_gen_block_data_in_en, dp_gen_block_data_src_in_arr(i), dp_gen_block_data_src_out_arr(i)); 
   
-      -- Insert optional gap between the packets
+      -- Insert optional gap between the packets, (0 .. c_nof_inputs-1) gaps
       proc_common_wait_some_cycles(dp_clk, i);
       WAIT FOR 0 ns;
     END PROCESS;
   END GENERATE;
 
   -----------------------------------------------------------------------------
-  -- MM write different input selections
+  -- MM write different input selections and check output
   -----------------------------------------------------------------------------
-  p_switch_inputs : PROCESS
+  p_switch_input_stimulus : PROCESS
   BEGIN
     proc_common_wait_until_low(mm_clk, mm_rst);
     reg_dp_switch_mosi <= c_mem_mosi_rst;
     proc_common_wait_some_cycles(mm_clk, 1);
     FOR I IN 0 TO c_nof_switch_runs-1 LOOP
       FOR J IN 0 TO c_nof_inputs-1 LOOP
+        -- write new input selection to mm bus and wait some time
         proc_mem_mm_bus_wr(0, J, mm_clk, reg_dp_switch_mosi);
-        proc_common_wait_some_cycles(mm_clk, 100);
-
+        proc_common_wait_some_cycles(mm_clk, 50);
+
+        -- check if channel number in src_out is the same as requested (J)
+        ASSERT J = TO_UINT(dp_switch_src_out.channel) 
+          REPORT "Wrong src_out channel" &
+                 ", expected=" & int_to_str(J) & 
+                 ", readback=" & int_to_str(INTEGER(TO_UINT(dp_switch_src_out.channel)))
+          SEVERITY ERROR;
+
+        -- check if data value in src_out is in the expected value window (J*1000 <= data < (J+1)*1000))
+        ASSERT TO_UINT(dp_switch_src_out.data) >= J*1000 and TO_UINT(dp_switch_src_out.data) < (J+1)*1000 
+          REPORT "Wrong src_out data" &
+                 ", expected between=" & int_to_str(J*1000) & " and " & int_to_str((J+1)*1000) & 
+                 ", readback=" & int_to_str(INTEGER(TO_UINT(dp_switch_src_out.data)))
+          SEVERITY ERROR;
       END LOOP;
     END LOOP;
+
+    -- check if output data is stopped if output send hold signal
+    dp_switch_src_in <= c_dp_siso_hold;
+    proc_common_wait_some_cycles(mm_clk, 50);
+    ASSERT dp_switch_src_out.valid = '0' 
+      REPORT "Still data on output after setting hold command" SEVERITY ERROR;
+    
+    -- check if output data flows again if output send flush signal
+    dp_switch_src_in <= c_dp_siso_rdy;
+    proc_common_wait_some_cycles(mm_clk, 50);
+    ASSERT dp_switch_src_out.valid = '1' 
+      REPORT "No data on output after setting flush command" SEVERITY ERROR;
+    
     tb_end <= '1';      
     WAIT;
   END PROCESS;
@@ -142,7 +177,10 @@ BEGIN
     mm_rst      => mm_rst,
 
     snk_in_arr  => dp_switch_snk_in_arr,
+    snk_out_arr => dp_switch_snk_out_arr,
+
     src_out     => dp_switch_src_out,
+    src_in      => dp_switch_src_in,
 
     reg_mosi    => reg_dp_switch_mosi,
     reg_miso    => reg_dp_switch_miso