diff --git a/applications/lofar2/libraries/sdp/hdllib.cfg b/applications/lofar2/libraries/sdp/hdllib.cfg
index 24415a8291ea288a2f86dcf333670bffd4153ab7..6e7ad9ac344bfb31412ec917035554d5013d8ca7 100644
--- a/applications/lofar2/libraries/sdp/hdllib.cfg
+++ b/applications/lofar2/libraries/sdp/hdllib.cfg
@@ -7,6 +7,7 @@ hdl_lib_technology =
 synth_files =
     src/vhdl/sdp_pkg.vhd
     src/vhdl/sdp_scope.vhd
+    src/vhdl/sdp_adc_input_and_timing.vhd
     src/vhdl/sdp_subband_weights.vhd
     src/vhdl/sdp_subband_equalizer.vhd
     src/vhdl/sdp_bf_weights.vhd
diff --git a/applications/lofar2/libraries/sdp/src/vhdl/node_sdp_adc_input_and_timing.vhd b/applications/lofar2/libraries/sdp/src/vhdl/node_sdp_adc_input_and_timing.vhd
index 107e1a05883b173a0ea9f423426ca1eb60511687..313614906f588e1bfc13c89ab8c4a70147d68ce5 100644
--- a/applications/lofar2/libraries/sdp/src/vhdl/node_sdp_adc_input_and_timing.vhd
+++ b/applications/lofar2/libraries/sdp/src/vhdl/node_sdp_adc_input_and_timing.vhd
@@ -110,6 +110,9 @@ entity node_sdp_adc_input_and_timing is
 end node_sdp_adc_input_and_timing;
 
 architecture str of node_sdp_adc_input_and_timing is
+  -- Use jesd v1 with tech_jesd204b and FIFO in ait or v2 with FIFO in tech_jesd204b_v2
+  constant c_use_tech_jesd204b_v2   : boolean := false;
+
   -- Waveform Generator
   constant c_wg_buf_directory       : string := "data/";
   constant c_wg_buf_dat_w           : natural := 18;  -- default value of WG that fits 14 bits of ADC data
@@ -117,449 +120,358 @@ architecture str of node_sdp_adc_input_and_timing is
   signal trigger_wg                 : std_logic;
 
   -- Frame parameters
-  constant c_bs_sync_timeout        : natural := g_bsn_nof_clk_per_sync + g_bsn_nof_clk_per_sync / 10;  -- +10% margin
   constant c_bs_bsn_w               : natural := 64;  -- > 51;
   constant c_bs_aux_w               : natural := 2;
-  constant c_bs_block_size          : natural := c_sdp_N_fft;  -- =1024;
   constant c_dp_fifo_dc_size        : natural := 64;
 
+  signal dp_sysref                  : std_logic;
+
   -- JESD signals
   signal rx_clk                     : std_logic;  -- formerly jesd204b_frame_clk
   signal rx_rst                     : std_logic;
   signal rx_sysref                  : std_logic;
 
-  signal rx_bsn_source_restart      : std_logic;
-  signal rx_bsn_source_new_interval : std_logic;
-  signal rx_bsn_source_nof_clk_per_sync : std_logic_vector(c_word_w - 1 downto 0);
-  signal rx_aux                     : std_logic_vector(c_bs_aux_w - 1 downto 0);
-  signal dp_aux                     : std_logic_vector(c_bs_aux_w - 1 downto 0);
+  signal mm_rst_jesd                : std_logic;
+  signal mm_jesd_ctrl_reg_wr        : std_logic_vector(c_word_w - 1 downto 0);
+  signal mm_jesd_ctrl_reg_rd        : std_logic_vector(c_word_w - 1 downto 0);
+  signal jesd204b_disable_arr       : std_logic_vector(c_sdp_S_pn - 1 downto 0);
+  signal jesd204b_reset_request     : std_logic := '0';
 
-  -- Sosis and sosi arrays
+  -- AIT processing
   signal rx_sosi_arr                : t_dp_sosi_arr(c_sdp_S_pn - 1 downto 0) := (others => c_dp_sosi_rst);
   signal dp_shiftram_snk_in_arr     : t_dp_sosi_arr(c_sdp_S_pn - 1 downto 0) := (others => c_dp_sosi_rst);
   signal ant_sosi_arr               : t_dp_sosi_arr(c_sdp_S_pn - 1 downto 0) := (others => c_dp_sosi_rst);
   signal bs_sosi                    : t_dp_sosi := c_dp_sosi_rst;
+  signal bs_sosi_valid              : std_logic;
   signal wg_sosi_arr                : t_dp_sosi_arr(c_sdp_S_pn - 1 downto 0) := (others => c_dp_sosi_rst);
   signal mux_sosi_arr               : t_dp_sosi_arr(c_sdp_S_pn - 1 downto 0) := (others => c_dp_sosi_rst);
   signal nxt_mux_sosi_arr           : t_dp_sosi_arr(c_sdp_S_pn - 1 downto 0) := (others => c_dp_sosi_rst);
   signal st_sosi_arr                : t_dp_sosi_arr(c_sdp_S_pn - 1 downto 0) := (others => c_dp_sosi_rst);
 
-  signal mm_rst_jesd                : std_logic;
-  signal mm_jesd_ctrl_reg_wr        : std_logic_vector(c_word_w - 1 downto 0);
-  signal mm_jesd_ctrl_reg_rd        : std_logic_vector(c_word_w - 1 downto 0);
-  signal jesd204b_disable_arr       : std_logic_vector(c_sdp_S_pn - 1 downto 0);
-  signal jesd204b_reset_request     : std_logic := '0';
+  signal rx_bsn_source_restart          : std_logic;
+  signal rx_bsn_source_new_interval     : std_logic;
+  signal rx_bsn_source_nof_clk_per_sync : std_logic_vector(c_word_w - 1 downto 0);
+  signal rx_aux                         : std_logic_vector(c_bs_aux_w - 1 downto 0);
+  signal dp_aux                         : std_logic_vector(c_bs_aux_w - 1 downto 0);
 begin
   gen_no_jesd : if g_no_jesd = true generate
-    rx_clk <= dp_clk;
-    rx_rst <= dp_rst;
-    rx_sysref <= dp_pps;
-  end generate;
-
-  -- The node AIT is reset at power up by mm_rst and under software control by mm_rst_jesd.
-  -- The mm_rst_jesd will cause a reset on the rx_rst by the reset sequencer in the u_jesd204b.
-  -- The mm_rst_jesd is intended for node AIT resynchronisation tests of the u_jesd204b.
-  -- The mm_rst_jesd should not be applied in an active SDP application, because this will cause
-  -- a disturbance in the block timing of the out_sosi_arr(i).sync,bsn,sop,eop. The other logic
-  -- in an SDP application assumes that the block timing of the out_sosi_arr(i) only contains
-  -- complete blocks, so from sop to eop. Therefore, first mms_dp_bsn_source_v2 should be
-  -- disabled to stop and flush the block processing, before applying mm_rst_jesd.
-
-  -- Only accept JESD204B IP reset when the processing is disabled (indicated by bs_sosi.valid
-  -- = '0'), to avoid corrupt bs_sosi blocks entering the subsequent processing due to that a
-  -- JESD204B IP reset causes that the rx_clk stops.
-  mm_rst_jesd <= mm_rst or jesd204b_reset_request;
-
-  jesd204b_disable_arr <= mm_jesd_ctrl_reg_wr(c_sdp_S_pn - 1 downto 0);
-  jesd204b_reset_request <= mm_jesd_ctrl_reg_wr(c_sdp_jesd_ctrl_reset_bi) and not bs_sosi.valid;
-
-  p_mm_jesd_ctrl_reg_rd : process(mm_jesd_ctrl_reg_wr, jesd204b_reset_request)
-  begin
-    -- default readback what was written
-    mm_jesd_ctrl_reg_rd <= mm_jesd_ctrl_reg_wr;
-    -- report actual JESD204B reset status
-    mm_jesd_ctrl_reg_rd(c_sdp_jesd_ctrl_reset_bi) <= jesd204b_reset_request;
-  end process;
+    dp_sysref <= dp_pps;
+
+    jesd204b_miso <= c_mem_miso_rst;
+    jesd_ctrl_miso <= c_mem_miso_rst;
+  end generate;  -- gen_no_jesd
 
   gen_jesd : if g_no_jesd = false generate
     -----------------------------------------------------------------------------
-    -- JESD204B IP (ADC Handler)
+    -- JESD Control register
     -----------------------------------------------------------------------------
+    -- The node AIT is reset at power up by mm_rst and under software control by mm_rst_jesd.
+    -- The mm_rst_jesd will cause a reset on the rx_rst by the reset sequencer in the u_jesd204b.
+    -- The mm_rst_jesd is intended for node AIT resynchronisation tests of the u_jesd204b.
+    -- The mm_rst_jesd should not be applied in an active SDP application, because this will cause
+    -- a disturbance in the block timing of the out_sosi_arr(i).sync,bsn,sop,eop. The other logic
+    -- in an SDP application assumes that the block timing of the out_sosi_arr(i) only contains
+    -- complete blocks, so from sop to eop. Therefore, first mms_dp_bsn_source_v2 should be
+    -- disabled to stop and flush the block processing, before applying mm_rst_jesd.
+
+    -- Only accept JESD204B IP reset when the processing is disabled (indicated by bs_sosi_valid
+    -- = '0'), to avoid corrupt bs_sosi blocks entering the subsequent processing due to that a
+    -- JESD204B IP reset causes that the rx_clk stops.
+    mm_rst_jesd <= mm_rst or jesd204b_reset_request;
+
+    jesd204b_disable_arr <= mm_jesd_ctrl_reg_wr(c_sdp_S_pn - 1 downto 0);
+    jesd204b_reset_request <= mm_jesd_ctrl_reg_wr(c_sdp_jesd_ctrl_reset_bi) and not bs_sosi_valid;
+
+    p_mm_jesd_ctrl_reg_rd : process(mm_jesd_ctrl_reg_wr, jesd204b_reset_request)
+    begin
+      -- default readback what was written
+      mm_jesd_ctrl_reg_rd <= mm_jesd_ctrl_reg_wr;
+      -- report actual JESD204B reset status
+      mm_jesd_ctrl_reg_rd(c_sdp_jesd_ctrl_reset_bi) <= jesd204b_reset_request;
+    end process;
 
-    u_jesd204b: entity tech_jesd204b_lib.tech_jesd204b
-    generic map(
-      g_sim                => false,  -- do not use g_sim, because JESD204B IP does support mm_clk in sim
-      g_nof_streams        => c_sdp_S_pn,
-      g_nof_sync_n         => c_sdp_N_sync_jesd,
-      g_jesd_freq          => c_sdp_jesd204b_freq
+    u_mm_jesd_ctrl_reg : entity common_lib.common_reg_r_w
+    generic map (
+      g_reg       => c_sdp_mm_jesd_ctrl_reg,
+      g_init_reg  => (others => '0')
     )
-    port map(
-      jesd204b_refclk      => JESD204B_REFCLK,
-      jesd204b_sysref      => JESD204B_SYSREF,
-      jesd204b_sync_n_arr  => jesd204b_sync_n,
-
-      rx_sosi_arr          => rx_sosi_arr,
-      rx_clk               => rx_clk,
-      rx_rst               => rx_rst,
-      rx_sysref            => rx_sysref,
-
-      jesd204b_disable_arr  => jesd204b_disable_arr,
-
-      -- MM
-      mm_clk               => mm_clk,
-      mm_rst               => mm_rst_jesd,
-
-      jesd204b_mosi        => jesd204b_mosi,
-      jesd204b_miso        => jesd204b_miso,
-
-       -- Serial
-      serial_tx_arr        => open,
-      serial_rx_arr        => JESD204B_SERIAL_DATA(c_sdp_S_pn - 1 downto 0)
+    port map (
+      rst       => mm_rst,
+      clk       => mm_clk,
+      -- control side
+      wr_en     => jesd_ctrl_mosi.wr,
+      wr_adr    => jesd_ctrl_mosi.address(c_sdp_mm_jesd_ctrl_reg.adr_w - 1 downto 0),
+      wr_dat    => jesd_ctrl_mosi.wrdata(c_sdp_mm_jesd_ctrl_reg.dat_w - 1 downto 0),
+      rd_en     => jesd_ctrl_mosi.rd,
+      rd_adr    => jesd_ctrl_mosi.address(c_sdp_mm_jesd_ctrl_reg.adr_w - 1 downto 0),
+      rd_dat    => jesd_ctrl_miso.rddata(c_sdp_mm_jesd_ctrl_reg.dat_w - 1 downto 0),
+      rd_val    => OPEN,
+      -- data side
+      out_reg   => mm_jesd_ctrl_reg_wr,
+      in_reg    => mm_jesd_ctrl_reg_rd
     );
 
     -----------------------------------------------------------------------------
-    -- Time delay: dp_shiftram
-    -- . copied from unb1_bn_capture_input (apertif)
-    --   Array range reversal is not done because everything is DOWNTO
-    -- . the input valid is always '1', even when there is no data
+    -- JESD204B IP (ADC Handler)
     -----------------------------------------------------------------------------
-
-    p_dp_shiftram_snk_in_arr : process(rx_sosi_arr)
-    begin
-      dp_shiftram_snk_in_arr <= rx_sosi_arr;
-      for I in 0 to c_sdp_S_pn - 1 loop
-        -- ADC data is stored in the upper 14 bits of the jesd rx_sosi.
-        dp_shiftram_snk_in_arr(I).data <= RESIZE_DP_SDATA(rx_sosi_arr(I).data(c_sdp_W_adc_jesd - 1 downto (c_sdp_W_adc_jesd - c_sdp_W_adc) ));
-        -- Force valid.
-        dp_shiftram_snk_in_arr(I).valid <= '1';
-      end loop;
-    end process;
-
-    u_dp_shiftram : entity dp_lib.dp_shiftram
+    gen_jesd204b_v1 : if c_use_tech_jesd204b_v2 = false generate
+      u_jesd204b_v1 : entity tech_jesd204b_lib.tech_jesd204b
+      generic map(
+        g_sim                => false,  -- do not use g_sim, because JESD204B IP does support mm_clk in sim
+        g_nof_streams        => c_sdp_S_pn,
+        g_nof_sync_n         => c_sdp_N_sync_jesd,
+        g_jesd_freq          => c_sdp_jesd204b_freq
+      )
+      port map(
+        jesd204b_refclk      => JESD204B_REFCLK,
+        jesd204b_sysref      => JESD204B_SYSREF,
+        jesd204b_sync_n_arr  => jesd204b_sync_n,
+
+        rx_sosi_arr          => rx_sosi_arr,
+        rx_clk               => rx_clk,
+        rx_rst               => rx_rst,
+        rx_sysref            => rx_sysref,
+
+        jesd204b_disable_arr => jesd204b_disable_arr,
+
+        -- MM
+        mm_clk               => mm_clk,
+        mm_rst               => mm_rst_jesd,
+
+        jesd204b_mosi        => jesd204b_mosi,
+        jesd204b_miso        => jesd204b_miso,
+
+         -- Serial
+        serial_tx_arr        => open,
+        serial_rx_arr        => JESD204B_SERIAL_DATA(c_sdp_S_pn - 1 downto 0)
+      );
+    end generate;
+
+    gen_jesd204b_v2 : if c_use_tech_jesd204b_v2 = true generate
+      u_jesd204b_v2: entity tech_jesd204b_lib.tech_jesd204b_v2
+      generic map(
+        g_sim                => false,  -- do not use g_sim, because JESD204B IP does support mm_clk in sim
+        g_nof_streams        => c_sdp_S_pn,
+        g_nof_sync_n         => c_sdp_N_sync_jesd,
+        g_jesd_freq          => c_sdp_jesd204b_freq
+      )
+      port map(
+        jesd204b_refclk      => JESD204B_REFCLK,
+        jesd204b_sysref      => JESD204B_SYSREF,
+        jesd204b_sync_n_arr  => jesd204b_sync_n,
+
+        dp_clk               => dp_clk,
+        dp_rst               => dp_rst,
+        dp_sysref            => dp_sysref,
+        dp_sosi_arr          => rx_sosi_arr,
+
+        jesd204b_disable_arr => jesd204b_disable_arr,
+
+        -- MM
+        mm_clk               => mm_clk,
+        mm_rst               => mm_rst_jesd,
+
+        jesd204b_mosi        => jesd204b_mosi,
+        jesd204b_miso        => jesd204b_miso,
+
+         -- Serial
+        serial_tx_arr        => open,
+        serial_rx_arr        => JESD204B_SERIAL_DATA(c_sdp_S_pn - 1 downto 0)
+      );
+    end generate;
+  end generate;  -- gen_jesd
+
+  -- Wire rx_clk from tech_jesd204b to AIT
+  gen_rx_ait : if g_no_jesd = false and c_use_tech_jesd204b_v2 = false generate
+    u_rx_ait : entity work.sdp_adc_input_and_timing
     generic map (
-      g_nof_streams => c_sdp_S_pn,
-      g_nof_words   => c_sdp_V_sample_delay,
-      g_data_w      => c_sdp_W_adc,
-      g_use_sync_in => true
+      g_no_rx                   => g_no_jesd,  -- when false use Rx and WG, else only use WG
+      g_buf_nof_data            => g_buf_nof_data,
+      g_bsn_nof_clk_per_sync    => g_bsn_nof_clk_per_sync,  -- Default 200M, overide for short simulation
+      g_sim                     => g_sim
     )
     port map (
-      dp_rst   => rx_rst,
-      dp_clk   => rx_clk,
-
-      mm_rst   => mm_rst,
-      mm_clk   => mm_clk,
-
-      sync_in  => bs_sosi.sync,
-
-      reg_mosi => reg_dp_shiftram_mosi,
-      reg_miso => reg_dp_shiftram_miso,
-
-      snk_in_arr => dp_shiftram_snk_in_arr,
-
-      src_out_arr => ant_sosi_arr
+      -- clocks and resets
+      mm_clk                         => mm_clk,
+      mm_rst                         => mm_rst,
+      rx_clk                         => rx_clk,
+      rx_rst                         => rx_rst,
+      rx_sysref                      => rx_sysref,
+
+      -- input samples
+      rx_sosi_arr                    => rx_sosi_arr,
+
+      -- processing status
+      bs_sosi_valid                  => bs_sosi_valid,
+      -- MM control buses
+      -- Shiftram (applies per-antenna delay)
+      reg_dp_shiftram_mosi           => reg_dp_shiftram_mosi,
+      reg_dp_shiftram_miso           => reg_dp_shiftram_miso,
+
+      -- bsn source
+      reg_bsn_source_v2_mosi         => reg_bsn_source_v2_mosi,
+      reg_bsn_source_v2_miso         => reg_bsn_source_v2_miso,
+
+      -- bsn scheduler
+      reg_bsn_scheduler_wg_mosi      => reg_bsn_scheduler_wg_mosi,
+      reg_bsn_scheduler_wg_miso      => reg_bsn_scheduler_wg_miso,
+
+      -- WG
+      reg_wg_mosi                    => reg_wg_mosi,
+      reg_wg_miso                    => reg_wg_miso,
+      ram_wg_mosi                    => ram_wg_mosi,
+      ram_wg_miso                    => ram_wg_miso,
+
+      -- BSN MONITOR
+      reg_bsn_monitor_input_mosi     => reg_bsn_monitor_input_mosi,
+      reg_bsn_monitor_input_miso     => reg_bsn_monitor_input_miso,
+
+      -- Data buffer for framed samples (variable depth)
+      ram_diag_data_buf_bsn_mosi     => ram_diag_data_buf_bsn_mosi,
+      ram_diag_data_buf_bsn_miso     => ram_diag_data_buf_bsn_miso,
+      reg_diag_data_buf_bsn_mosi     => reg_diag_data_buf_bsn_mosi,
+      reg_diag_data_buf_bsn_miso     => reg_diag_data_buf_bsn_miso,
+
+      -- ST Histogram
+      ram_st_histogram_mosi          => ram_st_histogram_mosi,
+      ram_st_histogram_miso          => ram_st_histogram_miso,
+
+      -- Aduh (statistics) monitor
+      reg_aduh_monitor_mosi          => reg_aduh_monitor_mosi,
+      reg_aduh_monitor_miso          => reg_aduh_monitor_miso,
+
+      -- JESD control
+      jesd_ctrl_mosi                 => jesd_ctrl_mosi,
+      jesd_ctrl_miso                 => jesd_ctrl_miso,
+
+      -- Streaming data output
+      out_sosi_arr                   => st_sosi_arr,
+      rx_bsn_source_restart          => rx_bsn_source_restart,
+      rx_bsn_source_new_interval     => rx_bsn_source_new_interval,
+      rx_bsn_source_nof_clk_per_sync => rx_bsn_source_nof_clk_per_sync
     );
-  end generate;
-
-  -----------------------------------------------------------------------------
-  -- Timestamp
-  -----------------------------------------------------------------------------
-  u_bsn_source_v2 : entity dp_lib.mms_dp_bsn_source_v2
-  generic map (
-    g_cross_clock_domain     => true,
-    g_block_size             => c_bs_block_size,
-    g_nof_clk_per_sync       => g_bsn_nof_clk_per_sync,
-    g_bsn_w                  => c_bs_bsn_w
-  )
-  port map (
-    -- Clocks and reset
-    mm_rst            => mm_rst,
-    mm_clk            => mm_clk,
-    dp_rst            => rx_rst,
-    dp_clk            => rx_clk,
-    dp_pps            => rx_sysref,
-
-    -- Memory-mapped clock domain
-    reg_mosi          => reg_bsn_source_v2_mosi,
-    reg_miso          => reg_bsn_source_v2_miso,
-
-    -- Streaming clock domain
-    bs_sosi           => bs_sosi,
-
-    bs_restart        => rx_bsn_source_restart,
-    bs_new_interval   => rx_bsn_source_new_interval,
-    bs_nof_clk_per_sync => rx_bsn_source_nof_clk_per_sync
-  );
-
-  u_bsn_trigger_wg : entity dp_lib.mms_dp_bsn_scheduler
-  generic map (
-    g_cross_clock_domain => true,
-    g_bsn_w              => c_bs_bsn_w
-  )
-  port map (
-    -- Memory-mapped clock domain
-    mm_rst      => mm_rst,
-    mm_clk      => mm_clk,
-
-    reg_mosi    => reg_bsn_scheduler_wg_mosi,
-    reg_miso    => reg_bsn_scheduler_wg_miso,
-
-    -- Streaming clock domain
-    dp_rst      => rx_rst,
-    dp_clk      => rx_clk,
-
-    snk_in      => bs_sosi,  -- only uses eop (= block sync), bsn[]
-    trigger_out => trigger_wg
-  );
-
-  -----------------------------------------------------------------------------
-  -- WG (Test Signal Generator)
-  -----------------------------------------------------------------------------
-
-  u_wg_arr : entity diag_lib.mms_diag_wg_wideband_arr
-  generic map (
-    g_nof_streams        => c_sdp_S_pn,
-    g_cross_clock_domain => true,
-    g_buf_dir            => c_wg_buf_directory,
-
-    -- Wideband parameters
-    g_wideband_factor    => 1,
-
-    -- Basic WG parameters, see diag_wg.vhd for their meaning
-    g_buf_dat_w          => c_wg_buf_dat_w,
-    g_buf_addr_w         => c_wg_buf_addr_w,
-    g_calc_support       => true,
-    g_calc_gain_w        => 1,
-    g_calc_dat_w         => c_sdp_W_adc
-  )
-  port map (
-    -- Memory-mapped clock domain
-    mm_rst              => mm_rst,
-    mm_clk              => mm_clk,
-
-    reg_mosi            => reg_wg_mosi,
-    reg_miso            => reg_wg_miso,
-
-    buf_mosi            => ram_wg_mosi,
-    buf_miso            => ram_wg_miso,
-
-    -- Streaming clock domain
-    st_rst              => rx_rst,
-    st_clk              => rx_clk,
-    st_restart          => trigger_wg,
-
-    out_sosi_arr        => wg_sosi_arr
-  );
-
-  -----------------------------------------------------------------------------
-  -- ADC/WG Mux (Input Select)
-  -----------------------------------------------------------------------------
-
-  gen_mux : for I in 0 to c_sdp_S_pn - 1 generate
-    p_sosi : process(ant_sosi_arr(I), wg_sosi_arr(I))
-    begin
-      -- Default use the ADC data
-      nxt_mux_sosi_arr(I).data  <= ant_sosi_arr(I).data;
-      if wg_sosi_arr(I).valid = '1' then
-        -- Valid WG data overrules ADC data
-        nxt_mux_sosi_arr(I).data <= wg_sosi_arr(I).data;
-      end if;
-    end process;
-  end generate;
-
-  mux_sosi_arr  <= nxt_mux_sosi_arr when rising_edge(rx_clk);
-
-  -----------------------------------------------------------------------------
-  -- Concatenate muxed data streams with bsn framing
-  -----------------------------------------------------------------------------
-
-  gen_concat : for I in 0 to c_sdp_S_pn - 1 generate
-    p_sosi : process(mux_sosi_arr(I), bs_sosi)
-    begin
-      st_sosi_arr(I)       <= bs_sosi;
-      st_sosi_arr(I).data  <= mux_sosi_arr(I).data;
-    end process;
-  end generate;
-
-  ---------------------------------------------------------------------------------------
-  -- Diagnostics on the bsn-framed data
-  --   . BSN Monitor (ToDo: can be removed as not part of the spec)
-  --   . Aduh monitor
-  --   . Data Buffer (variable depth from 1k-128k)
-  ---------------------------------------------------------------------------------------
-
-  ---------------------------------------------------------------------------------------
-  -- BSN monitor (Block Checker)
-  ---------------------------------------------------------------------------------------
-  u_bsn_monitor : entity dp_lib.mms_dp_bsn_monitor
-  generic map (
-    g_nof_streams        => 1,  -- They're all the same
-    g_sync_timeout       => c_bs_sync_timeout,
-    g_bsn_w              => c_bs_bsn_w,
-    g_log_first_bsn      => false
-  )
-  port map (
-    -- Memory-mapped clock domain
-    mm_rst      => mm_rst,
-    mm_clk      => mm_clk,
-    reg_mosi    => reg_bsn_monitor_input_mosi,
-    reg_miso    => reg_bsn_monitor_input_miso,
-
-    -- Streaming clock domain
-    dp_rst      => rx_rst,
-    dp_clk      => rx_clk,
-    in_sosi_arr => st_sosi_arr(0 downto 0)
-  );
 
-  -----------------------------------------------------------------------------
-  -- Monitor ADU/WG output
-  -----------------------------------------------------------------------------
-  u_aduh_monitor : entity aduh_lib.mms_aduh_monitor_arr
-  generic map (
-    g_cross_clock_domain   => true,
-    g_nof_streams          => c_sdp_S_pn,
-    g_symbol_w             => c_sdp_W_adc,
-    g_nof_symbols_per_data => 1,  -- Wideband factor is 1
-    g_nof_accumulations    => g_bsn_nof_clk_per_sync
-  )
-  port map (
-    -- Memory-mapped clock domain
-    mm_rst         => mm_rst,
-    mm_clk         => mm_clk,
-
-    reg_mosi       => reg_aduh_monitor_mosi,  -- read only access to the signal path data mean sum and power sum registers
-    reg_miso       => reg_aduh_monitor_miso,
-    buf_mosi       => c_mem_mosi_rst,  -- Unused
-    buf_miso       => OPEN,
-
-    -- Streaming clock domain
-    st_rst         => rx_rst,
-    st_clk         => rx_clk,
-
-    in_sosi_arr    => st_sosi_arr
-  );
-
-  -----------------------------------------------------------------------------
-  -- Diagnostic Data Buffer
-  -----------------------------------------------------------------------------
-
-  u_diag_data_buffer_bsn : entity diag_lib.mms_diag_data_buffer
-  generic map (
-    g_nof_streams  => c_sdp_S_pn,
-    g_data_w       => c_sdp_W_adc,
-    g_buf_nof_data => g_buf_nof_data,
-    g_buf_use_sync => true  -- when TRUE start filling the buffer at the in_sync, else after the last word was read
-  )
-  port map (
-    mm_rst            => mm_rst,
-    mm_clk            => mm_clk,
-    dp_rst            => rx_rst,
-    dp_clk            => rx_clk,
-
-    ram_data_buf_mosi => ram_diag_data_buf_bsn_mosi,
-    ram_data_buf_miso => ram_diag_data_buf_bsn_miso,
-    reg_data_buf_mosi => reg_diag_data_buf_bsn_mosi,
-    reg_data_buf_miso => reg_diag_data_buf_bsn_miso,
-
-    in_sosi_arr       => st_sosi_arr,
-    in_sync           => st_sosi_arr(0).sync
-  );
-
-  -----------------------------------------------------------------------------
-  -- ST Histogram
-  -----------------------------------------------------------------------------
-  u_st_histogram : entity st_lib.mmp_st_histogram
-  generic map (
-    g_nof_instances          => c_sdp_S_pn,
-    g_data_w                 => c_sdp_W_adc,
-    g_nof_bins               => c_sdp_V_si_histogram,
-    g_nof_data_per_sync      => g_bsn_nof_clk_per_sync,
-    g_nof_data_per_sync_diff => c_sdp_N_fft / 2
-  )
-  port map (
-    mm_rst            => mm_rst,
-    mm_clk            => mm_clk,
-    dp_rst            => rx_rst,
-    dp_clk            => rx_clk,
-
-    ram_copi          => ram_st_histogram_mosi,
-    ram_cipo          => ram_st_histogram_miso,
-
-    snk_in_arr        => st_sosi_arr
-  );
-
-  -----------------------------------------------------------------------------
-  -- Output Stage
-  --   . Thin dual clock fifo to cross from jesd frame clock (rx_clk) to dp_clk domain
-  -----------------------------------------------------------------------------
-
-  -- rx_aux is synchronous with st_sosi_arr
-  rx_aux(0) <= rx_bsn_source_restart;
-  rx_aux(1) <= rx_bsn_source_new_interval;
-
-  -- dp_aux is synchronous with out_sosi_arr
-  dp_bsn_source_restart      <= dp_aux(0);
-  dp_bsn_source_new_interval <= dp_aux(1);
+    -----------------------------------------------------------------------------
+    -- Output rx_clk to dp_clk clock domain crossing
+    -----------------------------------------------------------------------------
+    -- rx_aux is synchronous with st_sosi_arr
+    rx_aux(0) <= rx_bsn_source_restart;
+    rx_aux(1) <= rx_bsn_source_new_interval;
+
+    -- dp_aux is synchronous with out_sosi_arr
+    dp_bsn_source_restart      <= dp_aux(0);
+    dp_bsn_source_new_interval <= dp_aux(1);
+
+    -- Thin dual clock fifo to cross from jesd frame clock (rx_clk) to dp_clk domain
+    u_dp_fifo_dc_arr : entity dp_lib.dp_fifo_dc_arr
+      generic map (
+        g_nof_streams    => c_sdp_S_pn,
+        g_data_w         => c_sdp_W_adc,
+        g_data_signed    => true,
+        g_bsn_w          => c_bs_bsn_w,
+        g_aux_w          => c_bs_aux_w,
+        g_use_empty      => false,
+        g_use_ctrl       => true,
+        g_use_sync       => true,
+        g_use_bsn        => true,
+        g_use_aux        => true,
+        g_fifo_size      => c_dp_fifo_dc_size
+      )
+      port map (
+        wr_rst           => rx_rst,
+        wr_clk           => rx_clk,
+        rd_rst           => dp_rst,
+        rd_clk           => dp_clk,
+        snk_in_arr       => st_sosi_arr,
+        src_out_arr      => out_sosi_arr,
+        in_aux           => rx_aux,
+        out_aux          => dp_aux
+      );
+
+    -- MM write of rx_bsn_source_nof_clk_per_sync occurs with sufficient margin before it
+    -- is used. Still use common_reg_cross_domain nonetheless to get from mm_clk to rx_clk
+    -- in mms_dp_bsn_monitor, and from rx_clk to dp_clk here. No need to go via
+    -- u_dp_fifo_dc_arr, use common_reg_cross_domain instead to save logic and/or RAM.
+    u_dp_nof_block_per_sync : entity common_lib.common_reg_cross_domain
+    port map (
+      in_rst      => rx_rst,
+      in_clk      => rx_clk,
+      in_dat      => rx_bsn_source_nof_clk_per_sync,
+      out_rst     => dp_rst,
+      out_clk     => dp_clk,
+      out_dat     => dp_bsn_source_nof_clk_per_sync
+    );
+  end generate;  -- gen_rx_ait
 
-  u_dp_fifo_dc_arr : entity dp_lib.dp_fifo_dc_arr
+  -- Wire dp_clk to AIT when jesd is not used or when jesd IP tech_jesd204b_v2 is used
+  gen_dp_ait : if g_no_jesd = true or (g_no_jesd = false and c_use_tech_jesd204b_v2 = true) generate
+    u_dp_ait : entity work.sdp_adc_input_and_timing
     generic map (
-      g_nof_streams    => c_sdp_S_pn,
-      g_data_w         => c_sdp_W_adc,
-      g_data_signed    => true,
-      g_bsn_w          => c_bs_bsn_w,
-      g_aux_w          => c_bs_aux_w,
-      g_use_empty      => false,
-      g_use_ctrl       => true,
-      g_use_sync       => true,
-      g_use_bsn        => true,
-      g_use_aux        => true,
-      g_fifo_size      => c_dp_fifo_dc_size
+      g_no_rx                   => g_no_jesd,  -- when false use Rx and WG, else only use WG
+      g_buf_nof_data            => g_buf_nof_data,
+      g_bsn_nof_clk_per_sync    => g_bsn_nof_clk_per_sync,  -- Default 200M, overide for short simulation
+      g_sim                     => g_sim
     )
     port map (
-      wr_rst           => rx_rst,
-      wr_clk           => rx_clk,
-      rd_rst           => dp_rst,
-      rd_clk           => dp_clk,
-      snk_in_arr       => st_sosi_arr,
-      src_out_arr      => out_sosi_arr,
-      in_aux           => rx_aux,
-      out_aux          => dp_aux
+      -- clocks and resets
+      mm_clk                         => mm_clk,
+      mm_rst                         => mm_rst,
+      rx_clk                         => dp_clk,
+      rx_rst                         => dp_rst,
+      rx_sysref                      => dp_sysref,
+
+      -- input samples
+      rx_sosi_arr                    => rx_sosi_arr,
+
+       -- processing status
+      bs_sosi_valid                  => bs_sosi_valid,
+
+      -- MM control buses
+      -- Shiftram (applies per-antenna delay)
+      reg_dp_shiftram_mosi           => reg_dp_shiftram_mosi,
+      reg_dp_shiftram_miso           => reg_dp_shiftram_miso,
+
+      -- bsn source
+      reg_bsn_source_v2_mosi         => reg_bsn_source_v2_mosi,
+      reg_bsn_source_v2_miso         => reg_bsn_source_v2_miso,
+
+      -- bsn scheduler
+      reg_bsn_scheduler_wg_mosi      => reg_bsn_scheduler_wg_mosi,
+      reg_bsn_scheduler_wg_miso      => reg_bsn_scheduler_wg_miso,
+
+      -- WG
+      reg_wg_mosi                    => reg_wg_mosi,
+      reg_wg_miso                    => reg_wg_miso,
+      ram_wg_mosi                    => ram_wg_mosi,
+      ram_wg_miso                    => ram_wg_miso,
+
+      -- BSN MONITOR
+      reg_bsn_monitor_input_mosi     => reg_bsn_monitor_input_mosi,
+      reg_bsn_monitor_input_miso     => reg_bsn_monitor_input_miso,
+
+      -- Data buffer for framed samples (variable depth)
+      ram_diag_data_buf_bsn_mosi     => ram_diag_data_buf_bsn_mosi,
+      ram_diag_data_buf_bsn_miso     => ram_diag_data_buf_bsn_miso,
+      reg_diag_data_buf_bsn_mosi     => reg_diag_data_buf_bsn_mosi,
+      reg_diag_data_buf_bsn_miso     => reg_diag_data_buf_bsn_miso,
+
+      -- ST Histogram
+      ram_st_histogram_mosi          => ram_st_histogram_mosi,
+      ram_st_histogram_miso          => ram_st_histogram_miso,
+
+      -- Aduh (statistics) monitor
+      reg_aduh_monitor_mosi          => reg_aduh_monitor_mosi,
+      reg_aduh_monitor_miso          => reg_aduh_monitor_miso,
+
+      -- JESD control
+      jesd_ctrl_mosi                 => jesd_ctrl_mosi,
+      jesd_ctrl_miso                 => jesd_ctrl_miso,
+
+      -- Streaming data output
+      out_sosi_arr                   => out_sosi_arr,
+      rx_bsn_source_restart          => dp_bsn_source_restart,
+      rx_bsn_source_new_interval     => dp_bsn_source_new_interval,
+      rx_bsn_source_nof_clk_per_sync => dp_bsn_source_nof_clk_per_sync
     );
-
-  -- MM write of rx_bsn_source_nof_clk_per_sync occurs with sufficient margin before it
-  -- is used. Still use common_reg_cross_domain nonetheless to get from mm_clk to rx_clk
-  -- in mms_dp_bsn_monitor, and from rx_clk to dp_clk here. No need to go via
-  -- u_dp_fifo_dc_arr, use common_reg_cross_domain instead to save logic and/or RAM.
-  u_dp_nof_block_per_sync : entity common_lib.common_reg_cross_domain
-  port map (
-    in_rst      => rx_rst,
-    in_clk      => rx_clk,
-    in_dat      => rx_bsn_source_nof_clk_per_sync,
-    out_rst     => dp_rst,
-    out_clk     => dp_clk,
-    out_dat     => dp_bsn_source_nof_clk_per_sync
-  );
-
-  -----------------------------------------------------------------------------
-  -- JESD Control register
-  -----------------------------------------------------------------------------
-  u_mm_jesd_ctrl_reg : entity common_lib.common_reg_r_w
-  generic map (
-    g_reg       => c_sdp_mm_jesd_ctrl_reg,
-    g_init_reg  => (others => '0')
-  )
-  port map (
-    rst       => mm_rst,
-    clk       => mm_clk,
-    -- control side
-    wr_en     => jesd_ctrl_mosi.wr,
-    wr_adr    => jesd_ctrl_mosi.address(c_sdp_mm_jesd_ctrl_reg.adr_w - 1 downto 0),
-    wr_dat    => jesd_ctrl_mosi.wrdata(c_sdp_mm_jesd_ctrl_reg.dat_w - 1 downto 0),
-    rd_en     => jesd_ctrl_mosi.rd,
-    rd_adr    => jesd_ctrl_mosi.address(c_sdp_mm_jesd_ctrl_reg.adr_w - 1 downto 0),
-    rd_dat    => jesd_ctrl_miso.rddata(c_sdp_mm_jesd_ctrl_reg.dat_w - 1 downto 0),
-    rd_val    => OPEN,
-    -- data side
-    out_reg   => mm_jesd_ctrl_reg_wr,
-    in_reg    => mm_jesd_ctrl_reg_rd
-  );
+  end generate;  -- gen_rx_ait
 end str;
diff --git a/applications/lofar2/libraries/sdp/src/vhdl/sdp_adc_input_and_timing.vhd b/applications/lofar2/libraries/sdp/src/vhdl/sdp_adc_input_and_timing.vhd
new file mode 100644
index 0000000000000000000000000000000000000000..8eaf5365b902aac734c1832bde3bc60834b14859
--- /dev/null
+++ b/applications/lofar2/libraries/sdp/src/vhdl/sdp_adc_input_and_timing.vhd
@@ -0,0 +1,401 @@
+-------------------------------------------------------------------------------
+--
+-- Copyright 2024
+-- ASTRON (Netherlands Institute for Radio Astronomy) <http://www.astron.nl/>
+-- P.O.Box 2, 7990 AA Dwingeloo, The Netherlands
+--
+-- Licensed under the Apache License, Version 2.0 (the "License");
+-- you may not use this file except in compliance with the License.
+-- You may obtain a copy of the License at
+--
+--     http://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing, software
+-- distributed under the License is distributed on an "AS IS" BASIS,
+-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+-- See the License for the specific language governing permissions and
+-- limitations under the License.
+--
+-------------------------------------------------------------------------------
+
+-- Authors : J Hargreaves, L Hiemstra, R van der Walle, E. Kooistra
+-- Purpose:
+--   AIT - ADC / WG input, timing and associated diagnostic blocks
+-- Description:
+--   Contains all the signal processing blocks to receive and time the ADC input data
+--   See https://support.astron.nl/confluence/display/STAT/L5+SDPFW+DD%3A+ADC+data+input+and+timestamp
+
+library IEEE, common_lib, diag_lib, aduh_lib, dp_lib, tech_jesd204b_lib, st_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 diag_lib.diag_pkg.all;
+use dp_lib.dp_stream_pkg.all;
+use work.sdp_pkg.all;
+
+entity sdp_adc_input_and_timing is
+  generic (
+    g_no_rx                   : boolean := false;  -- when false use Rx and WG, else use only WG
+    g_buf_nof_data            : natural := c_sdp_V_si_db;
+    g_bsn_nof_clk_per_sync    : natural := c_sdp_N_clk_per_sync;  -- Default 200M, overide for short simulation
+    g_sim                     : boolean := false
+  );
+  port (
+    -- clocks and resets
+    mm_clk                         : in std_logic;
+    mm_rst                         : in std_logic;
+    rx_clk                         : in std_logic;
+    rx_rst                         : in std_logic;
+    rx_sysref                      : in std_logic;
+
+    -- input samples
+    rx_sosi_arr                    : in t_dp_sosi_arr(c_sdp_S_pn - 1 downto 0) := (others => c_dp_sosi_rst);
+
+    -- processing status
+    bs_sosi_valid                  : out std_logic;
+
+    -- MM control buses
+    -- Shiftram (applies per-antenna delay)
+    reg_dp_shiftram_mosi           : in  t_mem_mosi := c_mem_mosi_rst;
+    reg_dp_shiftram_miso           : out t_mem_miso := c_mem_miso_rst;
+
+    -- bsn source
+    reg_bsn_source_v2_mosi         : in  t_mem_mosi := c_mem_mosi_rst;
+    reg_bsn_source_v2_miso         : out t_mem_miso := c_mem_miso_rst;
+
+    -- bsn scheduler
+    reg_bsn_scheduler_wg_mosi      : in  t_mem_mosi := c_mem_mosi_rst;
+    reg_bsn_scheduler_wg_miso      : out t_mem_miso := c_mem_miso_rst;
+
+    -- WG
+    reg_wg_mosi                    : in  t_mem_mosi := c_mem_mosi_rst;
+    reg_wg_miso                    : out t_mem_miso := c_mem_miso_rst;
+    ram_wg_mosi                    : in  t_mem_mosi := c_mem_mosi_rst;
+    ram_wg_miso                    : out t_mem_miso := c_mem_miso_rst;
+
+    -- BSN MONITOR
+    reg_bsn_monitor_input_mosi     : in  t_mem_mosi;
+    reg_bsn_monitor_input_miso     : out t_mem_miso;
+
+    -- Data buffer for framed samples (variable depth)
+    ram_diag_data_buf_bsn_mosi     : in  t_mem_mosi;
+    ram_diag_data_buf_bsn_miso     : out t_mem_miso;
+    reg_diag_data_buf_bsn_mosi     : in  t_mem_mosi;
+    reg_diag_data_buf_bsn_miso     : out t_mem_miso;
+
+    -- ST Histogram
+    ram_st_histogram_mosi          : in  t_mem_mosi;
+    ram_st_histogram_miso          : out t_mem_miso;
+
+    -- Aduh (statistics) monitor
+    reg_aduh_monitor_mosi          : in  t_mem_mosi;
+    reg_aduh_monitor_miso          : out t_mem_miso;
+
+    -- JESD control
+    jesd_ctrl_mosi                 : in  t_mem_mosi;
+    jesd_ctrl_miso                 : out t_mem_miso;
+
+    -- Streaming data output
+    out_sosi_arr                   : out t_dp_sosi_arr(c_sdp_S_pn - 1 downto 0);
+    rx_bsn_source_restart          : out std_logic;  -- for dp_sync_recover in WPFB
+    rx_bsn_source_new_interval     : out std_logic;  -- for SST and BST statistics offload, XST uses new_interval based on xst_processing_enable
+    rx_bsn_source_nof_clk_per_sync : out std_logic_vector(c_word_w - 1 downto 0)  -- for RSN source in transient buffer
+  );
+end sdp_adc_input_and_timing;
+
+architecture str of sdp_adc_input_and_timing is
+  -- Waveform Generator
+  constant c_wg_buf_directory       : string := "data/";
+  constant c_wg_buf_dat_w           : natural := 18;  -- default value of WG that fits 14 bits of ADC data
+  constant c_wg_buf_addr_w          : natural := 10;  -- default value of WG for 1024 samples;
+  signal trigger_wg                 : std_logic;
+
+  -- Frame parameters
+  constant c_bs_sync_timeout        : natural := g_bsn_nof_clk_per_sync + g_bsn_nof_clk_per_sync / 10;  -- +10% margin
+  constant c_bs_bsn_w               : natural := 64;  -- > 51;
+  constant c_bs_aux_w               : natural := 2;
+  constant c_bs_block_size          : natural := c_sdp_N_fft;  -- =1024;
+  constant c_dp_fifo_dc_size        : natural := 64;
+
+  -- Sosis and sosi arrays
+  signal dp_shiftram_snk_in_arr     : t_dp_sosi_arr(c_sdp_S_pn - 1 downto 0) := (others => c_dp_sosi_rst);
+  signal ant_sosi_arr               : t_dp_sosi_arr(c_sdp_S_pn - 1 downto 0) := (others => c_dp_sosi_rst);
+  signal bs_sosi                    : t_dp_sosi := c_dp_sosi_rst;
+  signal wg_sosi_arr                : t_dp_sosi_arr(c_sdp_S_pn - 1 downto 0) := (others => c_dp_sosi_rst);
+  signal mux_sosi_arr               : t_dp_sosi_arr(c_sdp_S_pn - 1 downto 0) := (others => c_dp_sosi_rst);
+  signal nxt_mux_sosi_arr           : t_dp_sosi_arr(c_sdp_S_pn - 1 downto 0) := (others => c_dp_sosi_rst);
+  signal st_sosi_arr                : t_dp_sosi_arr(c_sdp_S_pn - 1 downto 0) := (others => c_dp_sosi_rst);
+begin
+  gen_rx : if g_no_rx = false generate
+     -----------------------------------------------------------------------------
+    -- Time delay: dp_shiftram
+    -- . copied from unb1_bn_capture_input (apertif)
+    --   Array range reversal is not done because everything is DOWNTO
+    -- . the input valid is always '1', even when there is no data
+    -----------------------------------------------------------------------------
+    p_dp_shiftram_snk_in_arr : process(rx_sosi_arr)
+    begin
+      dp_shiftram_snk_in_arr <= rx_sosi_arr;
+      for I in 0 to c_sdp_S_pn - 1 loop
+        -- ADC data is stored in the upper 14 bits of the jesd rx_sosi.
+        dp_shiftram_snk_in_arr(I).data <= RESIZE_DP_SDATA(rx_sosi_arr(I).data(c_sdp_W_adc_jesd - 1 downto (c_sdp_W_adc_jesd - c_sdp_W_adc) ));
+        -- Force valid.
+        dp_shiftram_snk_in_arr(I).valid <= '1';
+      end loop;
+    end process;
+
+    u_dp_shiftram : entity dp_lib.dp_shiftram
+    generic map (
+      g_nof_streams => c_sdp_S_pn,
+      g_nof_words   => c_sdp_V_sample_delay,
+      g_data_w      => c_sdp_W_adc,
+      g_use_sync_in => true
+    )
+    port map (
+      dp_rst   => rx_rst,
+      dp_clk   => rx_clk,
+
+      mm_rst   => mm_rst,
+      mm_clk   => mm_clk,
+
+      sync_in  => bs_sosi.sync,
+
+      reg_mosi => reg_dp_shiftram_mosi,
+      reg_miso => reg_dp_shiftram_miso,
+
+      snk_in_arr => dp_shiftram_snk_in_arr,
+
+      src_out_arr => ant_sosi_arr
+    );
+  end generate;
+
+  -----------------------------------------------------------------------------
+  -- Timestamp
+  -----------------------------------------------------------------------------
+  u_bsn_source_v2 : entity dp_lib.mms_dp_bsn_source_v2
+  generic map (
+    g_cross_clock_domain     => true,
+    g_block_size             => c_bs_block_size,
+    g_nof_clk_per_sync       => g_bsn_nof_clk_per_sync,
+    g_bsn_w                  => c_bs_bsn_w
+  )
+  port map (
+    -- Clocks and reset
+    mm_rst            => mm_rst,
+    mm_clk            => mm_clk,
+    dp_rst            => rx_rst,
+    dp_clk            => rx_clk,
+    dp_pps            => rx_sysref,
+
+    -- Memory-mapped clock domain
+    reg_mosi          => reg_bsn_source_v2_mosi,
+    reg_miso          => reg_bsn_source_v2_miso,
+
+    -- Streaming clock domain
+    bs_sosi           => bs_sosi,
+
+    bs_restart        => rx_bsn_source_restart,
+    bs_new_interval   => rx_bsn_source_new_interval,
+    bs_nof_clk_per_sync => rx_bsn_source_nof_clk_per_sync
+  );
+
+  bs_sosi_valid <= bs_sosi.valid;
+
+  u_bsn_trigger_wg : entity dp_lib.mms_dp_bsn_scheduler
+  generic map (
+    g_cross_clock_domain => true,
+    g_bsn_w              => c_bs_bsn_w
+  )
+  port map (
+    -- Memory-mapped clock domain
+    mm_rst      => mm_rst,
+    mm_clk      => mm_clk,
+
+    reg_mosi    => reg_bsn_scheduler_wg_mosi,
+    reg_miso    => reg_bsn_scheduler_wg_miso,
+
+    -- Streaming clock domain
+    dp_rst      => rx_rst,
+    dp_clk      => rx_clk,
+
+    snk_in      => bs_sosi,  -- only uses eop (= block sync), bsn[]
+    trigger_out => trigger_wg
+  );
+
+  -----------------------------------------------------------------------------
+  -- WG (Test Signal Generator)
+  -----------------------------------------------------------------------------
+
+  u_wg_arr : entity diag_lib.mms_diag_wg_wideband_arr
+  generic map (
+    g_nof_streams        => c_sdp_S_pn,
+    g_cross_clock_domain => true,
+    g_buf_dir            => c_wg_buf_directory,
+
+    -- Wideband parameters
+    g_wideband_factor    => 1,
+
+    -- Basic WG parameters, see diag_wg.vhd for their meaning
+    g_buf_dat_w          => c_wg_buf_dat_w,
+    g_buf_addr_w         => c_wg_buf_addr_w,
+    g_calc_support       => true,
+    g_calc_gain_w        => 1,
+    g_calc_dat_w         => c_sdp_W_adc
+  )
+  port map (
+    -- Memory-mapped clock domain
+    mm_rst              => mm_rst,
+    mm_clk              => mm_clk,
+
+    reg_mosi            => reg_wg_mosi,
+    reg_miso            => reg_wg_miso,
+
+    buf_mosi            => ram_wg_mosi,
+    buf_miso            => ram_wg_miso,
+
+    -- Streaming clock domain
+    st_rst              => rx_rst,
+    st_clk              => rx_clk,
+    st_restart          => trigger_wg,
+
+    out_sosi_arr        => wg_sosi_arr
+  );
+
+  -----------------------------------------------------------------------------
+  -- ADC/WG Mux (Input Select)
+  -----------------------------------------------------------------------------
+
+  gen_mux : for I in 0 to c_sdp_S_pn - 1 generate
+    p_sosi : process(ant_sosi_arr(I), wg_sosi_arr(I))
+    begin
+      -- Default use the ADC data
+      nxt_mux_sosi_arr(I).data  <= ant_sosi_arr(I).data;
+      if wg_sosi_arr(I).valid = '1' then
+        -- Valid WG data overrules ADC data
+        nxt_mux_sosi_arr(I).data <= wg_sosi_arr(I).data;
+      end if;
+    end process;
+  end generate;
+
+  mux_sosi_arr  <= nxt_mux_sosi_arr when rising_edge(rx_clk);
+
+  -----------------------------------------------------------------------------
+  -- Concatenate muxed data streams with bsn framing
+  -----------------------------------------------------------------------------
+
+  gen_concat : for I in 0 to c_sdp_S_pn - 1 generate
+    p_sosi : process(mux_sosi_arr(I), bs_sosi)
+    begin
+      st_sosi_arr(I)       <= bs_sosi;
+      st_sosi_arr(I).data  <= mux_sosi_arr(I).data;
+    end process;
+  end generate;
+
+  ---------------------------------------------------------------------------------------
+  -- Diagnostics on the bsn-framed data
+  --   . BSN Monitor (ToDo: can be removed as not part of the spec)
+  --   . Aduh monitor
+  --   . Data Buffer (variable depth from 1k-128k)
+  ---------------------------------------------------------------------------------------
+
+  ---------------------------------------------------------------------------------------
+  -- BSN monitor (Block Checker)
+  ---------------------------------------------------------------------------------------
+  u_bsn_monitor : entity dp_lib.mms_dp_bsn_monitor
+  generic map (
+    g_nof_streams        => 1,  -- They're all the same
+    g_sync_timeout       => c_bs_sync_timeout,
+    g_bsn_w              => c_bs_bsn_w,
+    g_log_first_bsn      => false
+  )
+  port map (
+    -- Memory-mapped clock domain
+    mm_rst      => mm_rst,
+    mm_clk      => mm_clk,
+    reg_mosi    => reg_bsn_monitor_input_mosi,
+    reg_miso    => reg_bsn_monitor_input_miso,
+
+    -- Streaming clock domain
+    dp_rst      => rx_rst,
+    dp_clk      => rx_clk,
+    in_sosi_arr => st_sosi_arr(0 downto 0)
+  );
+
+  -----------------------------------------------------------------------------
+  -- Monitor ADU/WG output
+  -----------------------------------------------------------------------------
+  u_aduh_monitor : entity aduh_lib.mms_aduh_monitor_arr
+  generic map (
+    g_cross_clock_domain   => true,
+    g_nof_streams          => c_sdp_S_pn,
+    g_symbol_w             => c_sdp_W_adc,
+    g_nof_symbols_per_data => 1,  -- Wideband factor is 1
+    g_nof_accumulations    => g_bsn_nof_clk_per_sync
+  )
+  port map (
+    -- Memory-mapped clock domain
+    mm_rst         => mm_rst,
+    mm_clk         => mm_clk,
+
+    reg_mosi       => reg_aduh_monitor_mosi,  -- read only access to the signal path data mean sum and power sum registers
+    reg_miso       => reg_aduh_monitor_miso,
+    buf_mosi       => c_mem_mosi_rst,  -- Unused
+    buf_miso       => OPEN,
+
+    -- Streaming clock domain
+    st_rst         => rx_rst,
+    st_clk         => rx_clk,
+
+    in_sosi_arr    => st_sosi_arr
+  );
+
+  -----------------------------------------------------------------------------
+  -- Diagnostic Data Buffer
+  -----------------------------------------------------------------------------
+
+  u_diag_data_buffer_bsn : entity diag_lib.mms_diag_data_buffer
+  generic map (
+    g_nof_streams  => c_sdp_S_pn,
+    g_data_w       => c_sdp_W_adc,
+    g_buf_nof_data => g_buf_nof_data,
+    g_buf_use_sync => true  -- when TRUE start filling the buffer at the in_sync, else after the last word was read
+  )
+  port map (
+    mm_rst            => mm_rst,
+    mm_clk            => mm_clk,
+    dp_rst            => rx_rst,
+    dp_clk            => rx_clk,
+
+    ram_data_buf_mosi => ram_diag_data_buf_bsn_mosi,
+    ram_data_buf_miso => ram_diag_data_buf_bsn_miso,
+    reg_data_buf_mosi => reg_diag_data_buf_bsn_mosi,
+    reg_data_buf_miso => reg_diag_data_buf_bsn_miso,
+
+    in_sosi_arr       => st_sosi_arr,
+    in_sync           => st_sosi_arr(0).sync
+  );
+
+  -----------------------------------------------------------------------------
+  -- ST Histogram
+  -----------------------------------------------------------------------------
+  u_st_histogram : entity st_lib.mmp_st_histogram
+  generic map (
+    g_nof_instances          => c_sdp_S_pn,
+    g_data_w                 => c_sdp_W_adc,
+    g_nof_bins               => c_sdp_V_si_histogram,
+    g_nof_data_per_sync      => g_bsn_nof_clk_per_sync,
+    g_nof_data_per_sync_diff => c_sdp_N_fft / 2
+  )
+  port map (
+    mm_rst            => mm_rst,
+    mm_clk            => mm_clk,
+    dp_rst            => rx_rst,
+    dp_clk            => rx_clk,
+
+    ram_copi          => ram_st_histogram_mosi,
+    ram_cipo          => ram_st_histogram_miso,
+
+    snk_in_arr        => st_sosi_arr
+  );
+end str;