diff --git a/applications/arts/designs/arts_unb2b_sc3/hdllib.cfg b/applications/arts/designs/arts_unb2b_sc3/hdllib.cfg
index 24f68530081ec61d996122c231d8a0f73bc545d6..70dac29e928b2a32d5090f6a0ca5e93b6bec7c9e 100644
--- a/applications/arts/designs/arts_unb2b_sc3/hdllib.cfg
+++ b/applications/arts/designs/arts_unb2b_sc3/hdllib.cfg
@@ -42,6 +42,7 @@ synth_files =
 test_bench_files = 
 #    tb/vhdl/tb_arts_unb2b_sc3.vhd
     tb/vhdl/tb_arts_unb2b_sc3_processing.vhd
+    tb/vhdl/tb_arts_unb2b_sc3_output.vhd
 
 [modelsim_project_file]
 modelsim_copy_files =
diff --git a/applications/arts/designs/arts_unb2b_sc3/tb/vhdl/tb_arts_unb2b_sc3_output.vhd b/applications/arts/designs/arts_unb2b_sc3/tb/vhdl/tb_arts_unb2b_sc3_output.vhd
new file mode 100644
index 0000000000000000000000000000000000000000..11c8cee856d0d0ccb2634f2fb4506d72895bc508
--- /dev/null
+++ b/applications/arts/designs/arts_unb2b_sc3/tb/vhdl/tb_arts_unb2b_sc3_output.vhd
@@ -0,0 +1,280 @@
+-------------------------------------------------------------------------------
+--
+-- Copyright (C) 2016
+-- ASTRON (Netherlands Institute for Radio Astronomy) <http://www.astron.nl/>
+-- JIVE (Joint Institute for VLBI in Europe) <http://www.jive.nl/>
+-- P.O.Box 2, 7990 AA Dwingeloo, The Netherlands
+--
+-- This program is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program.  If not, see <http://www.gnu.org/licenses/>.
+--
+-------------------------------------------------------------------------------
+
+-- Purpose: 
+--   Simulate the output stage of the ARTS SC3 design separately for speed 
+-- Description:
+--   Derived from the SC4 output testbench, but with 9 TABs and 120 beamlets (6 bit mode)
+--   Testbench generates stimuli to represent the four frequency channel inputs from the processing stage
+-- Usage (ModelSim) :
+-- . lp arts_unb2b_sc3
+-- . mk compile (all)
+-- . (double click tb_arts_unb2a_sc3_output)
+-- . do wave_*.do (optional ready made wave configuration)
+-- . run -a
+
+LIBRARY IEEE, common_lib, unb2b_board_lib, i2c_lib, dp_lib, diag_lib;
+USE IEEE.std_logic_1164.ALL;
+USE IEEE.numeric_std.ALL;
+USE common_lib.common_pkg.ALL;
+USE common_lib.common_mem_pkg.ALL;
+USE dp_lib.dp_stream_pkg.ALL;
+USE unb2b_board_lib.unb2_board_pkg.ALL;   
+USE common_lib.tb_common_pkg.ALL;
+
+ENTITY tb_arts_unb2b_sc3_output IS
+END tb_arts_unb2b_sc3_output;
+
+ARCHITECTURE tb OF tb_arts_unb2b_sc3_output IS
+
+  ----------------------------------------------------------------------------
+  -- Clocks & reset, general setup
+  ----------------------------------------------------------------------------
+  CONSTANT c_sim                       : BOOLEAN := TRUE;
+  CONSTANT c_nof_cbsets                : NATURAL := 1;
+  CONSTANT c_nof_tabs                  : NATURAL := 9; 
+  CONSTANT c_nof_bytes_per_iquv_packet : NATURAL := 8000;
+  CONSTANT c_nof_bytes_per_i_packet    : NATURAL := 6250;
+  CONSTANT c_nof_beamlets              : NATURAL := 120; -- 88 for eight bit mode
+  CONSTANT c_nof_seq                   : NATURAL := 2; --4; -- 2 for halfrate
+  CONSTANT c_nof_timesamples           : NATURAL := 6250*c_nof_seq;
+  CONSTANT c_nof_subbands              : NATURAL := 24;
+  CONSTANT c_nof_channels              : NATURAL := 4;
+  CONSTANT c_channel_int               : NATURAL := 8;
+  CONSTANT c_stokes_int                : NATURAL := 2;
+  CONSTANT c_iquv_data_w_out           : NATURAL := 8;   -- 8b Stokes parameters
+
+  CONSTANT c_dp_clk_period             : TIME := 5 ns; 
+  CONSTANT c_mm_clk_period             : TIME := 20 ns; 
+
+  SIGNAL valid_cycle_count             : NATURAL;
+
+  SIGNAL dp_clk                        : STD_LOGIC := '0';
+  SIGNAL dp_rst                        : STD_LOGIC := '1';
+  SIGNAL dp_pps                        : STD_LOGIC := '0';
+  SIGNAL mm_clk                        : STD_LOGIC := '0';
+  SIGNAL mm_rst                        : STD_LOGIC := '1';
+
+  -------------------------------------------------------------------------------
+  -- arts_unb2b_sc3_output
+  -------------------------------------------------------------------------------
+  SIGNAL arts_unb2b_sc3_processing_src_out_2arr_9 : t_dp_sosi_2arr_9(c_nof_cbsets-1 DOWNTO 0) := (OTHERS => (OTHERS => c_dp_sosi_rst)); -- 8 CB sets * 9 TABs
+  SIGNAL arts_unb2b_sc3_stimulus           : t_dp_sosi; 
+  SIGNAL arts_unb2b_sc3_output_src_out_arr : t_dp_sosi_arr(c_nof_cbsets-1 DOWNTO 0); --8 CB sets, 1 CB set per output 10GbE fiber
+  SIGNAL arts_unb2b_sc3_output_src_in_arr  : t_dp_siso_arr(c_nof_cbsets-1 DOWNTO 0);
+  SIGNAL tab_src_in                        : t_dp_siso; 
+
+
+  SIGNAL reg_dp_offload_tx_iab_i_hdr_dat_mosi : t_mem_mosi;
+  SIGNAL reg_dp_xonoff_iab_i_mosi             : t_mem_mosi;
+
+  SIGNAL general_bsn                          : STD_LOGIC_VECTOR(63 DOWNTO 0);
+  SIGNAL general_bsn_arr                      : t_slv_64_arr(c_nof_cbsets-1 DOWNTO 0);
+
+  ----------------------------------------------------------------------------
+  -- dp_statistics
+  ----------------------------------------------------------------------------
+  CONSTANT c_dp_statistics_check_nof_packets : NATURAL := 8-1; --FIXME Why is the 1st burst only 3 packets (hence -1)
+  CONSTANT c_dp_statistics_packet_size       : NATURAL := c_nof_bytes_per_i_packet/4+24; --24 word header
+  CONSTANT c_dp_statistics_data_rate         : NATURAL := 62; -- We expect 70MBps in 8b mode (88 beamlets). Account for 'missing' packet (7/8 data rate)
+
+  SIGNAL tb_end                              : STD_LOGIC := '0';
+
+BEGIN
+
+  ----------------------------------------------------------------------------
+  -- System setup
+  ----------------------------------------------------------------------------
+  dp_rst     <= '0' AFTER 1 us;
+  mm_rst     <= '0' AFTER 1 us;
+  dp_clk     <= NOT dp_clk     OR tb_end AFTER c_dp_clk_period/2;       
+  mm_clk     <= NOT mm_clk     OR tb_end AFTER c_mm_clk_period/2;      
+                        
+  p_pps : PROCESS
+  BEGIN
+    WAIT UNTIL dp_rst='0';
+    WAIT FOR 1 us;
+    WAIT UNTIL rising_edge(dp_clk);
+    dp_pps <= '1';
+    WAIT UNTIL rising_edge(dp_clk);
+    dp_pps <= '0';
+  END PROCESS;
+
+
+  p_stimuli : PROCESS
+  VARIABLE v_bsn : NATURAL := 43;
+  BEGIN
+    WAIT UNTIL dp_rst='0';
+    WAIT FOR 10 us;                 -- start with the default gain setting of 1
+    arts_unb2b_sc3_stimulus.valid <= '0';
+    arts_unb2b_sc3_stimulus.data  <= (others => '0');
+    valid_cycle_count <= 0;
+    WAIT UNTIL rising_edge(dp_clk);
+    WHILE TRUE LOOP
+      general_bsn <= TO_UVEC(v_bsn, 64);
+      v_bsn := v_bsn + 800000;
+      FOR i IN 0 TO c_nof_beamlets LOOP         -- 5 cb x 24 sb in 6b mode
+        FOR j IN 0 TO c_nof_timesamples-1  LOOP -- time seqence of 4 x 6250 byte packets
+          FOR k IN 0 TO c_nof_channels-1 LOOP   -- 4 channels
+            FOR l IN 0 TO c_channel_int-1 LOOP  -- 8 clocks per integration
+              FOR m IN 0 TO c_stokes_int-1 LOOP -- Data rate is reduced by half (X,Y pol -> Stokes value)
+                IF l = 7 AND m = 1 THEN
+                  arts_unb2b_sc3_stimulus.valid <= '1';
+                  arts_unb2b_sc3_stimulus.data(7 downto 0)  <= TO_UVEC(k+1,8);
+                  valid_cycle_count <= valid_cycle_count+1;                
+                ELSE
+                  arts_unb2b_sc3_stimulus.valid <= '0';
+                  arts_unb2b_sc3_stimulus.data(7 downto 0)  <= (others => '0');
+                  -- Our valid ratio  is c_nof_beamlets/128
+                  IF valid_cycle_count rem c_nof_beamlets = 0 THEN
+                    valid_cycle_count <= 0;
+                    WAIT FOR (128-c_nof_beamlets)*c_dp_clk_period; --Introduce the correct gap
+                  END IF;
+                END IF;
+                WAIT UNTIL rising_edge(dp_clk); -- End of this (valid or invalid) clk cycle.
+              END LOOP;
+            END LOOP;
+          END LOOP;
+        END LOOP;
+      END LOOP;
+    END LOOP;
+    WAIT FOR 10 us;                 -- run on for a bit 
+  END PROCESS;
+
+  p_mmctrl : PROCESS
+  BEGIN
+    WAIT UNTIL mm_rst='0';
+    WAIT FOR 1 us;
+    WAIT UNTIL rising_edge(mm_clk);
+    reg_dp_xonoff_iab_i_mosi.address <= TO_UVEC(0,c_mem_address_w);
+    reg_dp_xonoff_iab_i_mosi.wr      <= '1';
+    reg_dp_xonoff_iab_i_mosi.wrdata  <= TO_UVEC(1,c_mem_data_w);
+    WAIT UNTIL rising_edge(dp_clk);
+    reg_dp_xonoff_iab_i_mosi.wr      <= '0';
+  END PROCESS;
+
+
+  p_sink_ready : PROCESS
+    VARIABLE sink_ready_count : NATURAL := 0;
+  BEGIN
+    WAIT UNTIL dp_rst='0';
+    tab_src_in.ready <= '0';
+    tab_src_in.xon <= '0';
+    WAIT FOR 1 us;
+    WAIT UNTIL rising_edge(dp_clk);
+    tab_src_in.ready <= '1';
+    tab_src_in.xon <= '1';
+    WHILE TRUE LOOP
+      IF sink_ready_count = 3 THEN
+        sink_ready_count := 0;
+        tab_src_in.ready <= '0';
+      ELSE
+        sink_ready_count := sink_ready_count + 1;
+        tab_src_in.ready <= '1';
+      END IF;
+      WAIT UNTIL rising_edge(dp_clk);
+    END LOOP;
+  END PROCESS;
+
+  p_assign_inputs : PROCESS (arts_unb2b_sc3_stimulus)
+  BEGIN
+    FOR i IN 0 TO c_nof_cbsets-1 LOOP
+      arts_unb2b_sc3_output_src_in_arr(0) <= tab_src_in;
+      IF i = 0 THEN
+        arts_unb2b_sc3_processing_src_out_2arr_9(i) <= (others => arts_unb2b_sc3_stimulus);
+      ELSE
+        arts_unb2b_sc3_processing_src_out_2arr_9(i) <= (others => c_dp_sosi_rst);
+      END IF;
+    END LOOP;
+  END PROCESS;
+
+  gen_general_bsn : FOR i IN 0 TO c_nof_cbsets-1 GENERATE
+    general_bsn_arr(i) <= general_bsn;
+  END GENERATE;
+
+
+  ------------------------------------------------------------------------------
+  -- The DUT - ARTS SC3 output module
+  ------------------------------------------------------------------------------
+
+  u_arts_unb2b_sc3_output : ENTITY work.arts_unb2b_sc3_output
+  GENERIC MAP (
+    g_sim                 => c_sim,
+    g_nof_cbsets          => c_nof_cbsets,
+    g_nof_beamlets        => c_nof_beamlets,
+    g_nof_subbands_per_cb => c_nof_subbands,
+    g_nof_channels        => c_nof_channels,
+    g_nof_tabs            => c_nof_tabs,
+    g_iquv_data_w_out     => c_iquv_data_w_out
+  )
+  PORT MAP (
+    dp_clk                                  => dp_clk,
+    dp_rst                                  => dp_rst,
+
+    mm_clk                                  => mm_clk,    
+    mm_rst                                  => mm_rst,
+
+    snk_in_2arr_9                           => arts_unb2b_sc3_processing_src_out_2arr_9,
+    general_bsn_arr                         => general_bsn_arr,
+
+    src_out_arr                             => arts_unb2b_sc3_output_src_out_arr,
+    src_in_arr                              => arts_unb2b_sc3_output_src_in_arr,
+
+    reg_dp_offload_tx_tab_iquv_hdr_dat_mosi => c_mem_mosi_rst, 
+    reg_dp_offload_tx_tab_iquv_hdr_dat_miso => OPEN, 
+    reg_dp_xonoff_tab_iquv_mosi             => c_mem_mosi_rst, 
+    reg_dp_xonoff_tab_iquv_miso             => OPEN, 
+    reg_dp_offload_tx_tab_i_hdr_dat_mosi    => c_mem_mosi_rst, 
+    reg_dp_offload_tx_tab_i_hdr_dat_miso    => OPEN, 
+    reg_tab_dest_ip_mosi                    => c_mem_mosi_rst, 
+    reg_tab_dest_ip_miso                    => OPEN, 
+    reg_tab_dest_mac_mosi                   => c_mem_mosi_rst, 
+    reg_tab_dest_mac_miso                   => OPEN, 
+    reg_dp_xonoff_tab_i_mosi                => c_mem_mosi_rst, 
+    reg_dp_xonoff_tab_i_miso                => OPEN, 
+
+    ID                                      => "00000000"
+  );
+
+  ------------------------------------------------------------------------------
+  -- Verify proper DUT output using DP packet statistics
+  ------------------------------------------------------------------------------
+  u_dp_statistics : ENTITY dp_lib.dp_statistics
+    GENERIC MAP (
+      g_runtime_nof_packets      => c_dp_statistics_check_nof_packets,
+      g_runtime_timeout          => 20000000 ns,
+      g_check_nof_valid          => TRUE,
+      g_check_nof_valid_ref      => c_dp_statistics_check_nof_packets*c_dp_statistics_packet_size,
+      g_check_data_rate_mbps     => TRUE,
+      g_check_data_rate_mbps_ref => c_dp_statistics_data_rate
+    )
+  PORT MAP (  
+    dp_clk => dp_clk,
+    dp_rst => dp_rst,    
+
+    snk_in => arts_unb2b_sc3_output_src_out_arr(0),
+
+    tb_end => tb_end
+    --tb_end => open
+  );
+
+END tb;