diff --git a/applications/lofar2/designs/lofar2_unb2b_sdp_station/src/vhdl/lofar2_unb2b_sdp_station.vhd b/applications/lofar2/designs/lofar2_unb2b_sdp_station/src/vhdl/lofar2_unb2b_sdp_station.vhd
index 55d56fe1992e4da559138d298c64ed381341b902..fbf9ce2279aa5af719e15361e456580e09cd5deb 100644
--- a/applications/lofar2/designs/lofar2_unb2b_sdp_station/src/vhdl/lofar2_unb2b_sdp_station.vhd
+++ b/applications/lofar2/designs/lofar2_unb2b_sdp_station/src/vhdl/lofar2_unb2b_sdp_station.vhd
@@ -393,6 +393,8 @@ ARCHITECTURE str OF lofar2_unb2b_sdp_station IS
   SIGNAL ait_sosi_arr                      : t_dp_sosi_arr(c_sdp_S_pn-1 DOWNTO 0);         
   SIGNAL pfb_sosi_arr                      : t_dp_sosi_arr(c_sdp_P_pfb-1 DOWNTO 0);         
   SIGNAL fsub_sosi_arr                     : t_dp_sosi_arr(c_sdp_P_pfb-1 DOWNTO 0);        
+  
+  SIGNAL dp_bsn_source_restart             : STD_LOGIC;
  
   SIGNAL bf_udp_sosi_arr                   : t_dp_sosi_arr(c_sdp_N_beamsets-1 DOWNTO 0);         
   SIGNAL bf_udp_siso_arr                   : t_dp_siso_arr(c_sdp_N_beamsets-1 DOWNTO 0);    
@@ -792,7 +794,8 @@ BEGIN
     jesd204b_sync_n            => JESD204B_SYNC_N,   
  
     -- Streaming data output
-    out_sosi_arr               => ait_sosi_arr        
+    out_sosi_arr               => ait_sosi_arr,
+    dp_bsn_source_restart      => dp_bsn_source_restart        
   );
 
   -----------------------------------------------------------------------------
@@ -806,40 +809,41 @@ BEGIN
       g_scope_selected_subband => g_scope_selected_subband
     )
     PORT MAP(
-      dp_clk             => dp_clk, 
-      dp_rst             => dp_rst, 
-                                              
-      in_sosi_arr        => ait_sosi_arr,    
-      pfb_sosi_arr       => pfb_sosi_arr,
-      fsub_sosi_arr      => fsub_sosi_arr,
-
-      sst_udp_sosi       => udp_tx_sosi_arr(0),
-      sst_udp_siso       => udp_tx_siso_arr(0),
-                                              
-      mm_rst             => mm_rst, 
-      mm_clk             => mm_clk, 
-                                              
-      reg_si_mosi        => reg_si_mosi, 
-      reg_si_miso        => reg_si_miso, 
-      ram_st_sst_mosi    => ram_st_sst_mosi,  
-      ram_st_sst_miso    => ram_st_sst_miso, 
-      ram_fil_coefs_mosi => ram_fil_coefs_mosi,  
-      ram_fil_coefs_miso => ram_fil_coefs_miso,
-      ram_gains_mosi     => ram_equalizer_gains_mosi,     
-      ram_gains_miso     => ram_equalizer_gains_miso,     
-      reg_selector_mosi  => reg_dp_selector_mosi,  
-      reg_selector_miso  => reg_dp_selector_miso,
-
-      reg_enable_mosi    => reg_stat_enable_sst_mosi,
-      reg_enable_miso    => reg_stat_enable_sst_miso,
-      reg_hdr_dat_mosi   => reg_stat_hdr_dat_sst_mosi,
-      reg_hdr_dat_miso   => reg_stat_hdr_dat_sst_miso,
+      dp_clk                => dp_clk, 
+      dp_rst                => dp_rst, 
+                                                 
+      in_sosi_arr           => ait_sosi_arr,    
+      pfb_sosi_arr          => pfb_sosi_arr,
+      fsub_sosi_arr         => fsub_sosi_arr,
+      dp_bsn_source_restart => dp_bsn_source_restart,
+
+      sst_udp_sosi          => udp_tx_sosi_arr(0),
+      sst_udp_siso          => udp_tx_siso_arr(0),
+                                                 
+      mm_rst                => mm_rst, 
+      mm_clk                => mm_clk, 
+                                                 
+      reg_si_mosi           => reg_si_mosi, 
+      reg_si_miso           => reg_si_miso, 
+      ram_st_sst_mosi       => ram_st_sst_mosi,  
+      ram_st_sst_miso       => ram_st_sst_miso, 
+      ram_fil_coefs_mosi    => ram_fil_coefs_mosi,  
+      ram_fil_coefs_miso    => ram_fil_coefs_miso,
+      ram_gains_mosi        => ram_equalizer_gains_mosi,     
+      ram_gains_miso        => ram_equalizer_gains_miso,     
+      reg_selector_mosi     => reg_dp_selector_mosi,  
+      reg_selector_miso     => reg_dp_selector_miso,
+
+      reg_enable_mosi       => reg_stat_enable_sst_mosi,
+      reg_enable_miso       => reg_stat_enable_sst_miso,
+      reg_hdr_dat_mosi      => reg_stat_hdr_dat_sst_mosi,
+      reg_hdr_dat_miso      => reg_stat_hdr_dat_sst_miso,
   
-      sdp_info           => sdp_info,
-      gn_id              => gn_id,
-      eth_src_mac        => stat_eth_src_mac,
-      ip_src_addr        => stat_ip_src_addr,
-      udp_src_port       => sst_udp_src_port
+      sdp_info              => sdp_info,
+      gn_id                 => gn_id,
+      eth_src_mac           => stat_eth_src_mac,
+      ip_src_addr           => stat_ip_src_addr,
+      udp_src_port          => sst_udp_src_port
     );
   END GENERATE;
 
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 11e331a80e0267d8ef97720e36756d7f188a7426..92adf989878c9f462af2685dabddd2ecc16ef357 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
@@ -99,7 +99,8 @@ ENTITY node_sdp_adc_input_and_timing IS
     jesd204b_sync_n                : OUT   STD_LOGIC_VECTOR(c_sdp_S_pn-1 DOWNTO 0);
 
     -- Streaming data output
-    out_sosi_arr                   : OUT t_dp_sosi_arr(c_sdp_S_pn-1 DOWNTO 0)        
+    out_sosi_arr                   : OUT t_dp_sosi_arr(c_sdp_S_pn-1 DOWNTO 0);        
+    dp_bsn_source_restart          : OUT STD_LOGIC
 
   );
 END node_sdp_adc_input_and_timing;
@@ -123,6 +124,9 @@ ARCHITECTURE str OF node_sdp_adc_input_and_timing IS
   SIGNAL rx_rst                     : STD_LOGIC; 
   SIGNAL rx_sysref                  : STD_LOGIC; 
 
+  SIGNAL arst                       : STD_LOGIC;
+  SIGNAL i_dp_bsn_source_restart    : STD_LOGIC;
+
   -- Sosis and sosi arrays
   SIGNAL rx_sosi_arr                : t_dp_sosi_arr(c_sdp_S_pn-1 DOWNTO 0);         
   SIGNAL dp_shiftram_snk_in_arr     : t_dp_sosi_arr(c_sdp_S_pn-1 DOWNTO 0);         
@@ -252,7 +256,9 @@ BEGIN
     reg_miso          => reg_bsn_source_v2_miso,
     
     -- Streaming clock domain
-    bs_sosi           => bs_sosi
+    bs_sosi           => bs_sosi,
+
+    restart           => i_dp_bsn_source_restart
   );
 
   u_bsn_trigger_wg : ENTITY dp_lib.mms_dp_bsn_scheduler
@@ -463,6 +469,24 @@ BEGIN
       );
   END GENERATE;
 
+  -- use common dc fifo for restart signal
+  u_common_fifo_dc_restart : ENTITY common_lib.common_fifo_dc
+  GENERIC MAP (
+    g_dat_w     => 1,
+    g_nof_words => c_dp_fifo_dc_size
+  )
+  PORT MAP (
+    rst     => arst,
+    wr_clk  => rx_clk,
+    wr_dat(0)  => i_dp_bsn_source_restart,
+    wr_req  => bs_sosi.valid,
+    rd_clk  => dp_clk,
+    rd_dat(0)  => dp_bsn_source_restart,
+    rd_req  => '1'
+  );
+
+  arst <= rx_rst OR dp_rst;
+
   -----------------------------------------------------------------------------
   -- JESD Control register
   -----------------------------------------------------------------------------
diff --git a/applications/lofar2/libraries/sdp/src/vhdl/node_sdp_filterbank.vhd b/applications/lofar2/libraries/sdp/src/vhdl/node_sdp_filterbank.vhd
index 51de3371d0576e1947962dd91cc07a744f23160a..7085d702651396f33fe946787bcdf3799c5004a6 100644
--- a/applications/lofar2/libraries/sdp/src/vhdl/node_sdp_filterbank.vhd
+++ b/applications/lofar2/libraries/sdp/src/vhdl/node_sdp_filterbank.vhd
@@ -63,8 +63,10 @@ ENTITY node_sdp_filterbank IS
     sst_udp_sosi  : OUT t_dp_sosi;
     sst_udp_siso  : IN  t_dp_siso := c_dp_siso_rst;
 
-    mm_rst        : IN  STD_LOGIC;
-    mm_clk        : IN  STD_LOGIC;
+    dp_bsn_source_restart : IN STD_LOGIC;
+
+    mm_rst             : IN  STD_LOGIC;
+    mm_clk             : IN  STD_LOGIC;
 
     reg_si_mosi        : IN  t_mem_mosi := c_mem_mosi_rst;
     reg_si_miso        : OUT t_mem_miso;    
@@ -99,6 +101,8 @@ ARCHITECTURE str OF node_sdp_filterbank IS
 
   CONSTANT c_nof_masters : POSITIVE := 2;
 
+  CONSTANT c_si_pipeline : NATURAL := 1;
+
   SIGNAL ram_st_sst_mosi_arr : t_mem_mosi_arr(c_sdp_P_pfb-1 DOWNTO 0) := (OTHERS => c_mem_mosi_rst);
   SIGNAL ram_st_sst_miso_arr : t_mem_miso_arr(c_sdp_P_pfb-1 DOWNTO 0) := (OTHERS => c_mem_miso_rst);
 
@@ -121,6 +125,7 @@ ARCHITECTURE str OF node_sdp_filterbank IS
   
   SIGNAL selector_en             : STD_LOGIC;
   SIGNAL subband_calibrated_flag : STD_LOGIC;
+  SIGNAL i_dp_bsn_source_restart : STD_LOGIC;
 BEGIN
   ---------------------------------------------------------------
   -- SPECTRAL INVERSION 
@@ -128,7 +133,7 @@ BEGIN
   u_si_arr : ENTITY si_lib.si_arr
   GENERIC MAP (
     g_nof_streams => c_sdp_S_pn, 
-    g_pipeline    => 1,  
+    g_pipeline    => c_si_pipeline,  
     g_dat_w       => c_sdp_W_adc 
   )
   PORT MAP(
@@ -156,7 +161,21 @@ BEGIN
       wpfb_unit_in_sosi_arr(I).im <= RESIZE_DP_DSP_DATA(si_sosi_arr(2*I+1).data);
     END LOOP;
   END PROCESS;
- 
+
+  -- pipeline bsn restart signal
+  u_common_pipeline : ENTITY common_lib.common_pipeline
+  GENERIC MAP (
+    g_pipeline  => c_si_pipeline,
+    g_in_dat_w  => 1,
+    g_out_dat_w => 1
+  )
+  PORT MAP (
+    rst        => dp_rst,
+    clk        => dp_clk,
+    in_dat(0)  => dp_bsn_source_restart,
+    out_dat(0) => i_dp_bsn_source_restart
+  ); 
+
   -- PFB 
   u_wpfb_unit_dev : ENTITY wpfb_lib.wpfb_unit_dev
   GENERIC MAP (
@@ -177,7 +196,9 @@ BEGIN
 
     in_sosi_arr        => wpfb_unit_in_sosi_arr, 
     fil_sosi_arr       => wpfb_unit_fil_sosi_arr, 
-    out_sosi_arr       => wpfb_unit_out_sosi_arr 
+    out_sosi_arr       => wpfb_unit_out_sosi_arr,
+ 
+    dp_bsn_source_restart => i_dp_bsn_source_restart
   );
   
   -- Output PFB streams
diff --git a/libraries/base/dp/hdllib.cfg b/libraries/base/dp/hdllib.cfg
index 07fb20fc3763feb3845b327bf748ccf5e033f7d4..35eb45f99ba31ed7867ddb948437b64012e445f1 100644
--- a/libraries/base/dp/hdllib.cfg
+++ b/libraries/base/dp/hdllib.cfg
@@ -256,6 +256,7 @@ test_bench_files =
     tb/vhdl/tb_dp_xonoff_reg_timeout.vhd
     tb/vhdl/tb_dp_sync_insert.vhd
     tb/vhdl/tb_dp_sync_insert_v2.vhd
+    tb/vhdl/tb_dp_sync_recover.vhd
     tb/vhdl/tb_dp_folder.vhd
     tb/vhdl/tb_dp_switch.vhd
     tb/vhdl/tb_dp_counter_func.vhd
@@ -308,6 +309,7 @@ test_bench_files =
     tb/vhdl/tb_tb_dp_sync_checker.vhd
     tb/vhdl/tb_tb_dp_sync_insert.vhd
     tb/vhdl/tb_tb_dp_sync_insert_v2.vhd
+    tb/vhdl/tb_tb_dp_sync_recover.vhd
     tb/vhdl/tb_tb_mms_dp_force_data_parallel_arr.vhd
     tb/vhdl/tb_tb_mms_dp_force_data_serial_arr.vhd
     tb/vhdl/tb_tb_mms_dp_gain_arr.vhd
@@ -370,6 +372,7 @@ regression_test_vhdl =
     tb/vhdl/tb_mms_dp_sync_checker.vhd
     tb/vhdl/tb_tb_dp_sync_insert.vhd
     tb/vhdl/tb_tb_dp_sync_insert_v2.vhd
+    tb/vhdl/tb_tb_dp_sync_recover.vhd
     tb/vhdl/tb_dp_counter_func.vhd
     tb/vhdl/tb_tb_dp_counter.vhd
     tb/vhdl/tb_tb_mms_dp_force_data_parallel_arr.vhd
diff --git a/libraries/base/dp/src/vhdl/dp_bsn_source_v2.vhd b/libraries/base/dp/src/vhdl/dp_bsn_source_v2.vhd
index f73edbf022860bb34582210adf067f6f0e8fab46..3a5c02ea9e615ac926af0cfab9248a73f1763ad9 100644
--- a/libraries/base/dp/src/vhdl/dp_bsn_source_v2.vhd
+++ b/libraries/base/dp/src/vhdl/dp_bsn_source_v2.vhd
@@ -58,6 +58,7 @@ ENTITY dp_bsn_source_v2 IS
     dp_on_pps               : IN  STD_LOGIC;
 
     dp_on_status            : OUT STD_LOGIC;
+    restart                 : OUT STD_LOGIC;
  
     nof_clk_per_sync        : IN  STD_LOGIC_VECTOR(c_word_w-1 DOWNTO 0) := TO_UVEC(g_nof_clk_per_sync, c_word_w);
     bsn_init                : IN  STD_LOGIC_VECTOR(g_bsn_w-1 DOWNTO 0) := (OTHERS=>'0');
@@ -102,6 +103,7 @@ ARCHITECTURE rtl OF dp_bsn_source_v2 IS
  
   SIGNAL i_dp_on_status     : STD_LOGIC;
   SIGNAL nxt_dp_on_status   : STD_LOGIC;
+  SIGNAL nxt_restart        : STD_LOGIC;
 
   SIGNAL nxt_bsn_time_offset_cnt : STD_LOGIC_VECTOR(g_bsn_time_offset_w-1 DOWNTO 0);
   SIGNAL bsn_time_offset_cnt     : STD_LOGIC_VECTOR(g_bsn_time_offset_w-1 DOWNTO 0);
@@ -132,6 +134,7 @@ BEGIN
     nxt_clk_cnt                 <= INCR_UVEC(clk_cnt, 1);
     nxt_sync                    <= sync;
     nxt_dp_on_status            <= i_dp_on_status;
+    nxt_restart                 <= '0';
     nxt_bsn_time_offset_cnt     <= bsn_time_offset_cnt;
     nxt_current_bsn_time_offset <= bsn_time_offset;
 
@@ -187,6 +190,9 @@ BEGIN
           nxt_src_out.sync <= '1';
           nxt_sync <= '0';
         END IF;
+        IF i_dp_on_status = '0' THEN -- transition from 0 to 1 is a (re)start
+          nxt_restart <= '1';
+        END IF;
 
       WHEN s_dp_on =>
         nxt_src_out.valid  <= '1';
@@ -221,6 +227,7 @@ BEGIN
       sync           <= '0'; 
       block_size_cnt <= (OTHERS=>'0');
       i_dp_on_status <= '0';
+      restart        <= '0';
       bsn_time_offset_cnt <= (OTHERS=>'0');
     ELSIF rising_edge(clk) THEN
       prev_state     <= state;
@@ -230,6 +237,7 @@ BEGIN
       sync           <= nxt_sync;
       block_size_cnt <= nxt_block_size_cnt;
       i_dp_on_status <= nxt_dp_on_status;
+      restart        <= nxt_restart;
       bsn_time_offset_cnt <= nxt_bsn_time_offset_cnt;
       i_current_bsn_time_offset <= nxt_current_bsn_time_offset;
     END IF;
diff --git a/libraries/base/dp/src/vhdl/dp_sync_recover.vhd b/libraries/base/dp/src/vhdl/dp_sync_recover.vhd
index 5ad7ffb05520724abe162317f91bf9ea86793f2d..6aa801b3e968e613953d59a92897e4b1fd89dea6 100644
--- a/libraries/base/dp/src/vhdl/dp_sync_recover.vhd
+++ b/libraries/base/dp/src/vhdl/dp_sync_recover.vhd
@@ -29,7 +29,6 @@
 -- Remarks:
 --  . The val input signal should be connected to the desired valid of the output. It determines when 
 --    the first block will start.
---  . g_initial_bsn can be used to start with a non-zero bsn
 -------------------------------------------------------------------------------
 
 LIBRARY IEEE, common_lib;
@@ -41,7 +40,6 @@ USE work.dp_stream_pkg.ALL;
 
 ENTITY dp_sync_recover IS
   GENERIC (
-    g_initial_bsn : STD_LOGIC_VECTOR(c_dp_stream_bsn_w -1 DOWNTO 0) := (OTHERS => '0');
     g_nof_data_per_block : POSITIVE := 1
   );
   PORT (    
@@ -52,6 +50,7 @@ ENTITY dp_sync_recover IS
     
     in_sosi    : IN  t_dp_sosi := c_dp_sosi_rst;
     val        : IN  STD_LOGIC; -- valid at the output
+    restart    : IN  STD_LOGIC := '0'; -- pulse to restart bsn counter
     -- Streaming source
     out_sosi   : OUT t_dp_sosi
   );
@@ -67,7 +66,7 @@ ARCHITECTURE rtl OF dp_sync_recover IS
     out_sosi    : t_dp_sosi;
   END RECORD;
 
-  CONSTANT c_reg_rst  : t_reg := ( (OTHERS => '0'), 0, g_initial_bsn, c_dp_sosi_rst);  
+  CONSTANT c_reg_rst  : t_reg := ( (OTHERS => '0'), 0, (OTHERS => '0'), c_dp_sosi_rst);  
 
   -- Define the local registers in t_reg record
   SIGNAL r         : t_reg;
@@ -94,9 +93,15 @@ BEGIN
     v.out_sosi.valid := val;
     v.out_sosi.bsn   := r.out_sosi.bsn;
 
+    IF restart = '1' THEN -- set initial BSN
+      v.out_bsn  := in_sosi.bsn;
+      v.data_cnt := c_reg_rst.data_cnt;
+    END IF;
+
     IF in_sosi.sync = '1' THEN
-      v.bsn_at_sync  := in_sosi.bsn;        
+      v.bsn_at_sync  := in_sosi.bsn; 
     END IF;
+
     IF val = '1' THEN
       v.data_cnt := r.data_cnt + 1;
       IF r.data_cnt = 0 THEN
@@ -104,17 +109,13 @@ BEGIN
         v.out_bsn := STD_LOGIC_VECTOR(UNSIGNED(r.out_bsn) + 1);
         v.out_sosi.bsn := r.out_bsn;
         IF r.out_bsn = r.bsn_at_sync THEN
-        v.out_sosi.sync := '1';
+          v.out_sosi.sync := '1';
         END IF;
       END IF;
       IF r.data_cnt = g_nof_data_per_block-1 THEN
         v.data_cnt := 0;
         v.out_sosi.eop := '1';
       END IF;
-    ELSE
-      v.out_sosi := c_reg_rst.out_sosi;
-      v.out_bsn  := c_reg_rst.out_bsn;
-      v.data_cnt := c_reg_rst.data_cnt;
     END IF;
  
     nxt_r <= v;
diff --git a/libraries/base/dp/src/vhdl/mms_dp_bsn_source_v2.vhd b/libraries/base/dp/src/vhdl/mms_dp_bsn_source_v2.vhd
index 9d096d2a96a0c3943ce7a037d5565206d7e823bf..e79af9f0aebc58f1455709900ffe95c241bf5d83 100644
--- a/libraries/base/dp/src/vhdl/mms_dp_bsn_source_v2.vhd
+++ b/libraries/base/dp/src/vhdl/mms_dp_bsn_source_v2.vhd
@@ -50,7 +50,9 @@ ENTITY mms_dp_bsn_source_v2 IS
     reg_miso          : OUT t_mem_miso;  -- actual ranges defined by c_mm_reg
     
     -- Streaming clock domain
-    bs_sosi           : OUT t_dp_sosi
+    bs_sosi           : OUT t_dp_sosi;
+
+    restart           : OUT STD_LOGIC  -- pulse to indicate if the bsn_source has restarted
   );
 END mms_dp_bsn_source_v2;
 
@@ -115,6 +117,7 @@ BEGIN
     dp_on                   => dp_on,
     dp_on_pps               => dp_on_pps,
     dp_on_status            => dp_on_status,
+    restart                 => restart,
     bsn_init                => bsn_init,
     nof_clk_per_sync        => nof_clk_per_sync,
     bsn_time_offset         => bsn_time_offset,
diff --git a/libraries/base/dp/tb/vhdl/tb_dp_sync_recover.vhd b/libraries/base/dp/tb/vhdl/tb_dp_sync_recover.vhd
new file mode 100644
index 0000000000000000000000000000000000000000..59dc24775ba4e3e08c126cdaf7395b0786f808f0
--- /dev/null
+++ b/libraries/base/dp/tb/vhdl/tb_dp_sync_recover.vhd
@@ -0,0 +1,229 @@
+-------------------------------------------------------------------------------
+--
+-- Copyright 2021
+-- 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.
+--
+-------------------------------------------------------------------------------
+
+-------------------------------------------------------------------------------
+-- Author : R vd Walle
+-- Purpose: Verify dp_sync_recover
+-- Description: The tb verifies:
+--  . data valid gaps between blocks
+--  . data valid gaps within blocks
+--  . output sop, eop, valid, bsn and sync 
+-- Usage:
+-- > as 8
+-- > run -all
+--
+-- * The tb is self stopping because tb_end will stop the simulation by
+--   stopping the clk and thus all toggling.
+-------------------------------------------------------------------------------
+  
+LIBRARY IEEE, common_lib, dp_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 common_lib.common_lfsr_sequences_pkg.ALL;
+USE common_lib.tb_common_pkg.ALL;
+USE dp_lib.dp_stream_pkg.ALL;
+USE dp_lib.tb_dp_pkg.ALL;
+
+
+ENTITY tb_dp_sync_recover IS
+  GENERIC (
+    g_nof_data_per_block     : NATURAL := 16; 
+    g_nof_blk_per_sync       : NATURAL := 8;
+    g_gap_size_during_block  : NATURAL := 0;
+    g_gap_size_between_block : NATURAL := 0;
+    g_init_bsn               : NATURAL := 23;
+    g_rep_at_restart         : NATURAL := 3;
+    g_nof_repeat             : NATURAL := 14
+  );
+END tb_dp_sync_recover;
+
+
+ARCHITECTURE tb OF tb_dp_sync_recover IS
+
+  CONSTANT c_dut_latency         : NATURAL := 5;
+  
+  CONSTANT c_dp_clk_period       : TIME := 5 ns;
+
+  SIGNAL tb_end                    : STD_LOGIC := '0';
+  SIGNAL dp_clk                    : STD_LOGIC := '1';
+  SIGNAL rst                       : STD_LOGIC := '1';
+    
+  -- DUT
+  SIGNAL ref_sosi                  : t_dp_sosi := c_dp_sosi_rst;
+  SIGNAL out_sosi                  : t_dp_sosi;
+  SIGNAL restart                   : STD_LOGIC := '0';
+
+  -- Verification
+  SIGNAL dly_valid_arr             : STD_LOGIC_VECTOR(0 TO c_dut_latency) := (OTHERS=>'0');
+  SIGNAL dly_ref_sosi_arr          : t_dp_sosi_arr(0 TO c_dut_latency) := (OTHERS => c_dp_sosi_rst);
+  SIGNAL exp_sync                  : STD_LOGIC := '0';
+  SIGNAL out_hold_sop              : STD_LOGIC := '0';
+  SIGNAL exp_size                  : NATURAL := g_nof_data_per_block;
+  SIGNAL cnt_size                  : NATURAL;
+  
+BEGIN
+
+  dp_clk <= (NOT dp_clk) OR tb_end AFTER c_dp_clk_period/2;
+  rst <= '1', '0' AFTER c_dp_clk_period*7;
+
+  ------------------------------------------------------------------------------
+  -- STIMULI
+  ------------------------------------------------------------------------------
+  
+  p_stimuli : PROCESS
+  BEGIN
+    proc_common_wait_until_low(dp_clk, rst);
+    proc_common_wait_some_cycles(dp_clk, 5);
+
+    FOR I IN 0 TO g_nof_repeat-1 LOOP
+      -- Generate first block with sync
+      ref_sosi.sync  <= '1';
+      ref_sosi.sop   <= '1';
+      ref_sosi.valid <= '1';
+      IF I = 0 OR I = g_rep_at_restart THEN
+        ref_sosi.bsn   <= TO_DP_BSN(g_init_bsn);
+        restart <= '1';
+      ELSIF I > g_rep_at_restart THEN
+        ref_sosi.bsn   <= TO_DP_BSN(g_init_bsn + (I - g_rep_at_restart) * g_nof_blk_per_sync);
+      ELSE
+        ref_sosi.bsn   <= TO_DP_BSN(g_init_bsn + I * g_nof_blk_per_sync);
+      END IF;
+      proc_common_wait_some_cycles(dp_clk, 1);
+      ref_sosi.sync  <= '0';
+      ref_sosi.sop   <= '0';
+      restart        <= '0'; 
+      
+      -- Optionally apply valid='0' during block of data
+      ref_sosi.valid <= '0';
+      proc_common_wait_some_cycles(dp_clk, g_gap_size_during_block);
+      ref_sosi.valid <= '1';
+      
+      proc_common_wait_some_cycles(dp_clk, g_nof_data_per_block-2);
+      ref_sosi.eop   <= '1';
+      proc_common_wait_some_cycles(dp_clk, 1);
+      ref_sosi.eop   <= '0';
+      ref_sosi.valid <= '0';
+
+      -- Optionally apply valid='0' between block of data
+      proc_common_wait_some_cycles(dp_clk, g_gap_size_between_block);
+      
+      -- Generate next blocks after sync
+      FOR J IN 0 TO g_nof_blk_per_sync-2 LOOP
+        ref_sosi.sop   <= '1';
+        ref_sosi.valid <= '1';
+        IF I >= g_rep_at_restart THEN
+          ref_sosi.bsn   <= TO_DP_BSN(g_init_bsn + (I - g_rep_at_restart) * g_nof_blk_per_sync + J + 1);
+        ELSE
+          ref_sosi.bsn   <= TO_DP_BSN(g_init_bsn + I * g_nof_blk_per_sync + J + 1);
+        END IF;
+        proc_common_wait_some_cycles(dp_clk, 1);
+        ref_sosi.sync  <= '0';
+        ref_sosi.sop   <= '0';
+
+        -- Optionally apply valid='0' during block of data
+        ref_sosi.valid <= '0';
+        proc_common_wait_some_cycles(dp_clk, g_gap_size_during_block);
+        ref_sosi.valid <= '1';
+
+        proc_common_wait_some_cycles(dp_clk, g_nof_data_per_block-2);
+        ref_sosi.eop   <= '1';
+        proc_common_wait_some_cycles(dp_clk, 1);
+        ref_sosi.eop   <= '0';
+        ref_sosi.valid <= '0';
+        
+        -- Optionally apply valid='0' between block of data
+        proc_common_wait_some_cycles(dp_clk, g_gap_size_between_block);
+      END LOOP;
+    END LOOP; 
+    
+    -- End of stimuli
+    proc_common_wait_some_cycles(dp_clk, 100);
+    tb_end <= '1';
+    WAIT;
+  END PROCESS;
+  
+  ref_sosi.data  <= INCR_UVEC(ref_sosi.data, 1) WHEN rising_edge(dp_clk);
+  ref_sosi.re    <= INCR_UVEC(ref_sosi.re,   2) WHEN rising_edge(dp_clk);
+  ref_sosi.im    <= INCR_UVEC(ref_sosi.im,   3) WHEN rising_edge(dp_clk);
+
+  ------------------------------------------------------------------------------
+  -- DUT
+  ------------------------------------------------------------------------------
+  u_dut: ENTITY work.dp_sync_recover
+  GENERIC MAP (
+    g_nof_data_per_block => g_nof_data_per_block
+  )
+  PORT MAP (
+    dp_rst        => rst,
+    dp_clk        => dp_clk,
+
+    -- Streaming sink
+    in_sosi       => ref_sosi,
+    val           => dly_ref_sosi_arr(c_dut_latency).valid,
+    restart       => restart,
+    -- Streaming source
+    out_sosi      => out_sosi
+  );
+  
+  ------------------------------------------------------------------------------
+  -- Verification
+  -- . use some DUT specific verification
+  -- . use some general Verification means from tb_dp_pkg.vhd, dp_stream_verify.vhd
+  ------------------------------------------------------------------------------
+  dly_ref_sosi_arr(0)                  <= ref_sosi;
+  dly_ref_sosi_arr(1 TO c_dut_latency) <= dly_ref_sosi_arr(0 TO c_dut_latency-1) WHEN rising_edge(dp_clk);
+
+  p_exp_sync : PROCESS(dp_clk)
+    VARIABLE blk_cnt : NATURAL := 0;
+  BEGIN
+    IF rising_edge(dp_clk) THEN
+      exp_sync <= '0'; 
+      IF dly_ref_sosi_arr(c_dut_latency-1).sop = '1' THEN
+        IF dly_ref_sosi_arr(c_dut_latency-1).sync = '1' OR blk_cnt >= g_nof_blk_per_sync-1 THEN
+          blk_cnt := 0;
+          exp_sync <= '1';
+        ELSE
+          blk_cnt := blk_cnt+1;
+        END IF;
+      END IF;
+    END IF;
+  END PROCESS;
+
+  p_verify_out_sosi : PROCESS(dp_clk)
+  BEGIN
+    IF rising_edge(dp_clk) THEN
+      ASSERT out_sosi.valid = dly_ref_sosi_arr(c_dut_latency).valid REPORT "Wrong out_sosi.valid" SEVERITY ERROR;
+      ASSERT out_sosi.sop   = dly_ref_sosi_arr(c_dut_latency).sop   REPORT "Wrong out_sosi.sop"   SEVERITY ERROR;
+      ASSERT out_sosi.eop   = dly_ref_sosi_arr(c_dut_latency).eop   REPORT "Wrong out_sosi.eop"   SEVERITY ERROR;
+      ASSERT out_sosi.bsn   = dly_ref_sosi_arr(c_dut_latency).bsn   REPORT "Wrong out_sosi.bsn"   SEVERITY ERROR;
+      ASSERT out_sosi.sync  = dly_ref_sosi_arr(c_dut_latency).sync  REPORT "Wrong out_sosi.sync"  SEVERITY ERROR;
+    END IF;
+  END PROCESS;
+  
+  -- Verify output packet ctrl
+  proc_dp_verify_sop_and_eop(dp_clk, out_sosi.valid, out_sosi.sop, out_sosi.eop, out_hold_sop);
+  -- Verify output packet block size
+  proc_dp_verify_block_size(exp_size, dp_clk, out_sosi.valid, out_sosi.sop, out_sosi.eop, cnt_size);
+  
+
+      
+END tb;
diff --git a/libraries/base/dp/tb/vhdl/tb_tb_dp_sync_recover.vhd b/libraries/base/dp/tb/vhdl/tb_tb_dp_sync_recover.vhd
new file mode 100644
index 0000000000000000000000000000000000000000..e790f7ef80ae97dc064e8bf460c345e00727116c
--- /dev/null
+++ b/libraries/base/dp/tb/vhdl/tb_tb_dp_sync_recover.vhd
@@ -0,0 +1,51 @@
+-------------------------------------------------------------------------------
+--
+-- Copyright 2021
+-- 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.
+--
+-------------------------------------------------------------------------------
+
+-------------------------------------------------------------------------------
+-- Author : R vd Walle
+-- Purpose: Verify multiple variations of tb_dp_sync_recover
+-- Description:
+-- Usage:
+-- > as 3
+-- > run -all
+-------------------------------------------------------------------------------
+
+LIBRARY IEEE;
+USE IEEE.std_logic_1164.ALL;
+
+ENTITY tb_tb_dp_sync_recover IS
+END tb_tb_dp_sync_recover;
+
+ARCHITECTURE tb OF tb_tb_dp_sync_recover IS
+  SIGNAL tb_end : STD_LOGIC := '0';  -- declare tb_end to avoid 'No objects found' error on 'when -label tb_end'
+BEGIN
+
+--    g_nof_data_per_block     : NATURAL := 16; 
+--    g_nof_blk_per_sync       : NATURAL := 8;
+--    g_gap_size_during_block  : NATURAL := 0;
+--    g_gap_size_between_block : NATURAL := 0;
+--    g_init_bsn               : NATURAL := 23;
+--    g_rep_at_restart         : NATURAL := 3;
+--    g_nof_repeat             : NATURAL := 14
+
+  u_no_gaps            : ENTITY work.tb_dp_sync_recover GENERIC MAP(16, 32, 0, 0, 8, 3, 14);
+  u_gap                : ENTITY work.tb_dp_sync_recover GENERIC MAP(16, 32, 1, 3, 8, 3, 14);
+  
+END tb;
diff --git a/libraries/dsp/wpfb/src/vhdl/wpfb_unit_dev.vhd b/libraries/dsp/wpfb/src/vhdl/wpfb_unit_dev.vhd
index 071a6785a0266c3da24ea15d4c09cd7ffcf9f831..32b4568068ebfb0eaf12b22282acbbe316da245d 100644
--- a/libraries/dsp/wpfb/src/vhdl/wpfb_unit_dev.vhd
+++ b/libraries/dsp/wpfb/src/vhdl/wpfb_unit_dev.vhd
@@ -368,21 +368,22 @@ entity wpfb_unit_dev is
     g_coefs_file_prefix : string            := "data/coefs_wide" -- File prefix for the coefficients files.
    );
   port (
-    dp_rst             : in  std_logic := '0';
-    dp_clk             : in  std_logic;
-    mm_rst             : in  std_logic;
-    mm_clk             : in  std_logic;
-    ram_fil_coefs_mosi : in  t_mem_mosi := c_mem_mosi_rst;
-    ram_fil_coefs_miso : out t_mem_miso;
-    ram_st_sst_mosi    : in  t_mem_mosi := c_mem_mosi_rst;  -- Subband statistics registers
-    ram_st_sst_miso    : out t_mem_miso;
-    reg_bg_ctrl_mosi   : in  t_mem_mosi := c_mem_mosi_rst;
-    reg_bg_ctrl_miso   : out t_mem_miso;
-    ram_bg_data_mosi   : in  t_mem_mosi := c_mem_mosi_rst;
-    ram_bg_data_miso   : out t_mem_miso;
-    in_sosi_arr        : in  t_dp_sosi_arr(g_wpfb.nof_wb_streams*g_wpfb.wb_factor-1 downto 0);
-    fil_sosi_arr       : out t_dp_sosi_arr(g_wpfb.nof_wb_streams*g_wpfb.wb_factor-1 downto 0);
-    out_sosi_arr       : out t_dp_sosi_arr(g_wpfb.nof_wb_streams*g_wpfb.wb_factor-1 downto 0)
+    dp_rst                : in  std_logic := '0';
+    dp_clk                : in  std_logic;
+    mm_rst                : in  std_logic;
+    mm_clk                : in  std_logic;
+    ram_fil_coefs_mosi    : in  t_mem_mosi := c_mem_mosi_rst;
+    ram_fil_coefs_miso    : out t_mem_miso;
+    ram_st_sst_mosi       : in  t_mem_mosi := c_mem_mosi_rst;  -- Subband statistics registers
+    ram_st_sst_miso       : out t_mem_miso;
+    reg_bg_ctrl_mosi      : in  t_mem_mosi := c_mem_mosi_rst;
+    reg_bg_ctrl_miso      : out t_mem_miso;
+    ram_bg_data_mosi      : in  t_mem_mosi := c_mem_mosi_rst;
+    ram_bg_data_miso      : out t_mem_miso;
+    in_sosi_arr           : in  t_dp_sosi_arr(g_wpfb.nof_wb_streams*g_wpfb.wb_factor-1 downto 0);
+    fil_sosi_arr          : out t_dp_sosi_arr(g_wpfb.nof_wb_streams*g_wpfb.wb_factor-1 downto 0);
+    out_sosi_arr          : out t_dp_sosi_arr(g_wpfb.nof_wb_streams*g_wpfb.wb_factor-1 downto 0);
+    dp_bsn_source_restart : in  std_logic
   );
 end entity wpfb_unit_dev;
 
@@ -455,6 +456,7 @@ architecture str of wpfb_unit_dev is
   
   type reg_type is record
     in_sosi_arr : t_dp_sosi_arr(g_wpfb.nof_wb_streams*g_wpfb.wb_factor-1 downto 0);
+    bsn_source_restart : STD_LOGIC;
   end record;
 
   signal r, rin : reg_type;
@@ -465,9 +467,10 @@ begin
   comb : process(r, in_sosi_arr)
     variable v : reg_type;
   begin
-    v             := r;
-    v.in_sosi_arr := in_sosi_arr;
-    rin           <= v;
+    v                    := r;
+    v.in_sosi_arr        := in_sosi_arr;
+    v.bsn_source_restart := dp_bsn_source_restart;
+    rin                  <= v;
   end process comb;
 
   regs : process(dp_clk)
@@ -633,9 +636,9 @@ begin
       dp_rst => dp_rst,
       dp_clk => dp_clk,
 
-      in_sosi => fft_out_sosi,
-      val     => fft_out_sosi.valid,
-
+      in_sosi  => fft_out_sosi,
+      val      => fft_out_sosi.valid,
+      restart  => r.bsn_source_restart,
       out_sosi => ctrl_pfb_out_sosi
     );