diff --git a/libraries/base/dp/tb/vhdl/tb_dp_bsn_source_v2.vhd b/libraries/base/dp/tb/vhdl/tb_dp_bsn_source_v2.vhd
index 669522d47e037d52d3ec6f18bfedf652f93fc080..c3ccfaac5de706539f24db523b09c9c2d4d5042a 100644
--- a/libraries/base/dp/tb/vhdl/tb_dp_bsn_source_v2.vhd
+++ b/libraries/base/dp/tb/vhdl/tb_dp_bsn_source_v2.vhd
@@ -1,6 +1,6 @@
 -------------------------------------------------------------------------------
 --
--- Copyright (C) 2011
+-- Copyright (C) 2020
 -- ASTRON (Netherlands Institute for Radio Astronomy) <http://www.astron.nl/>
 -- P.O.Box 2, 7990 AA Dwingeloo, The Netherlands
 --
@@ -25,9 +25,9 @@
 --          [1].
 -- Decsription:
 -- * Start/Stop BSN source tests:
---   1) test 1x asynchronously (dp_on_pps='0') without automatic check, check
+--   1) test once asynchronously (dp_on_pps='0') without automatic check, check
 --      visualy in wave window.
---   2) test 3x synchronously (dp_on_pps='1') with automatic check.
+--   2) test c_nof_repeat synchronously (dp_on_pps='1') with automatic check.
 -- . Verify if bs_sosi.eop and bs_sosi.sop come in pairs
 -- . Verify that bs_sosi.sync is at bs_sosi.sop
 -- . Verify that bs_sosi has fixed latency with respect to ref_grid
@@ -37,7 +37,7 @@
 -- [2] https://support.astron.nl/confluence/display/L2M/L6+FWLIB+Design+Document%3A+BSN+source+with+offset
 --
 -- Usage:
--- > as 10
+-- > as 8, e.g. view bs_sosi, exp_grid and unexpected_bs_sync
 -- > run -all
 -- . sop, eop are verified automatically
 -- . sync and bsn are verified automatically using the ref_grid
@@ -52,15 +52,22 @@ USE dp_lib.tb_dp_pkg.ALL;
 
 ENTITY tb_dp_bsn_source_v2 IS
   GENERIC (
-    g_nof_pps      : NATURAL := 10;
-    g_pps_interval : NATURAL := 10; --101;
-    g_block_size   : NATURAL := 7 --23
+    g_pps_interval : NATURAL := 16; --101;
+    g_block_size   : NATURAL := 5 --23
   );
 END tb_dp_bsn_source_v2;
 
 ARCHITECTURE tb OF tb_dp_bsn_source_v2 IS
 
-  CONSTANT c_nof_repeat        : NATURAL := 3;
+  CONSTANT c_gcd               : NATURAL := gcd(g_pps_interval, g_block_size);
+  CONSTANT c_min_nof_interval  : NATURAL := g_block_size / c_gcd;
+
+  -- choose c_nof_pps and c_nof_repeat > c_min_nof_interval, because the
+  -- fractional sync pattern will repeat every c_min_nof_interval number
+  -- of g_pps_intervals.
+  CONSTANT c_factor            : NATURAL := 3;
+  CONSTANT c_nof_pps           : NATURAL := c_min_nof_interval * c_factor;
+  CONSTANT c_nof_repeat        : NATURAL := c_min_nof_interval * c_factor;
 
   CONSTANT c_clk_period        : TIME    := 10 ns;
   CONSTANT c_bsn_w             : NATURAL := 31;
@@ -119,6 +126,9 @@ ARCHITECTURE tb OF tb_dp_bsn_source_v2 IS
   SIGNAL prev_bs_valid      : STD_LOGIC;
   SIGNAL bs_starts_cnt      : NATURAL := 0;
 
+  SIGNAL dbg_c_nof_pps      : NATURAL := c_nof_pps;
+  SIGNAL dbg_c_nof_repeat   : NATURAL := c_nof_repeat;
+
   SIGNAL dbg_nof_blk        : NATURAL;
   SIGNAL dbg_accumulate     : NATURAL;
   SIGNAL dbg_expected_bsn   : NATURAL;
@@ -181,7 +191,7 @@ BEGIN
     tb_state <= s_dp_on;
     dp_on_pps <= '0';
     dp_on <= '1';
-    proc_common_wait_some_cycles(clk, g_nof_pps*g_pps_interval);
+    proc_common_wait_some_cycles(clk, c_nof_pps*g_pps_interval);
     tb_state <= s_disable;
     dp_on <= '0';
     dp_on_pps <= '0';
@@ -212,7 +222,7 @@ BEGIN
       tb_state  <= s_dp_on_pps;
       dp_on_pps <= '1';
       dp_on <= '1';
-      proc_common_wait_some_cycles(clk, g_nof_pps*g_pps_interval);
+      proc_common_wait_some_cycles(clk, c_nof_pps*g_pps_interval);
       tb_state <= s_disable;
       dp_on <= '0';
       dp_on_pps <= '0';
@@ -238,7 +248,8 @@ BEGIN
   --proc_dp_verify_sync(clk, verify_sync, bs_sosi.sync, exp_grid.sop, exp_grid.sync);  -- Verify sync at sop and at expected_sync
 
   -- Verify sync at sop and at expected_sync
-  proc_dp_verify_sync(g_pps_interval,
+  proc_dp_verify_sync(0,  -- start bsn of PPS grid and BSN grid is 0, see [1]
+                      g_pps_interval,
                       g_block_size,
                       clk,
                       verify_en,
@@ -267,10 +278,20 @@ BEGIN
     END IF;
   END PROCESS;
 
-  -- Verify that bs_sosi.valid = '1' did happen after dp_on
+  -- Verify that bs_sosi.valid = '1' did happen after dp_on by verifying bs_start
   prev_bs_valid <= bs_sosi.valid WHEN rising_edge(clk);
   bs_starts_cnt <= bs_starts_cnt + 1 WHEN rising_edge(clk) AND bs_sosi.valid = '1' AND prev_bs_valid = '0';
 
+  p_verify_bs_restart : PROCESS(clk)
+  BEGIN
+    IF rising_edge(clk) THEN
+      IF bs_restart = '1' THEN
+        ASSERT bs_sosi.sync = '1' REPORT "Unexpected bs_start while bs_sosi.sync /= 1" SEVERITY ERROR;
+        ASSERT prev_bs_valid = '0' REPORT "Unexpected bs_start while prev_bs_valid /= 0" SEVERITY ERROR;
+      END IF;
+    END IF;
+  END PROCESS;
+
   -----------------------------------------------------------------------------
   -- DUT: dp_bsn_source_v2
   -----------------------------------------------------------------------------
diff --git a/libraries/base/dp/tb/vhdl/tb_tb_dp_bsn_source_v2.vhd b/libraries/base/dp/tb/vhdl/tb_tb_dp_bsn_source_v2.vhd
index b893581245a4262daf58758174bb4fd8ba9558fd..63a5385422a3adbef497d38fbdd597664134d926 100644
--- a/libraries/base/dp/tb/vhdl/tb_tb_dp_bsn_source_v2.vhd
+++ b/libraries/base/dp/tb/vhdl/tb_tb_dp_bsn_source_v2.vhd
@@ -25,7 +25,7 @@ USE IEEE.std_logic_1164.ALL;
 USE work.tb_dp_pkg.ALL;
 
 
--- > as 2
+-- > as 4
 -- > run -all --> OK
 
 ENTITY tb_tb_dp_bsn_source_v2 IS
@@ -33,30 +33,44 @@ END tb_tb_dp_bsn_source_v2;
 
 
 ARCHITECTURE tb OF tb_tb_dp_bsn_source_v2 IS
-  SIGNAL tb_end : STD_LOGIC := '0';  -- declare tb_end to avoid 'No objects found' error on 'when -label tb_end'
 
-  CONSTANT c_nof_pps : NATURAL := 50;  -- choose > g_block_size, because the fractional sync pattern will repeat
-                                       -- within g_block_size number of g_pps_interval's
+  SIGNAL tb_end : STD_LOGIC := '0';  -- declare tb_end to avoid 'No objects found' error on 'when -label tb_end'
 
 BEGIN
   -- from tb_dp_bsn_source_v2.vhd
   --
-  -- g_nof_pps      : NATURAL := 20;
   -- g_pps_interval : NATURAL := 240
-  -- g_block_size   : NATURAL := 32  
+  -- g_block_size   : NATURAL := 32
+
+  -- test integer case
+  u_20_10  : ENTITY work.tb_dp_bsn_source_v2 GENERIC MAP (20, 10);  -- 20 // 10 = 2, 20 MOD 10 = 0, 20/10 = 2 block/sync
+  u_22_11  : ENTITY work.tb_dp_bsn_source_v2 GENERIC MAP (22, 11);  -- 22 // 11 = 2, 22 MOD 11 = 0, 22/11 = 2 block/sync
+  u_39_13  : ENTITY work.tb_dp_bsn_source_v2 GENERIC MAP (39, 13);  -- 39 // 13 = 3, 39 MOD 13 = 0, 39/13 = 3 block/sync
+
+  -- test smallest nof block per sync
+  u_10_10  : ENTITY work.tb_dp_bsn_source_v2 GENERIC MAP (10, 10);  -- 1 block/sync
+  u_5_5    : ENTITY work.tb_dp_bsn_source_v2 GENERIC MAP (5, 5);    -- 1 block/sync
+
+  -- test smallest g_block_size case
+  u_3_3    : ENTITY work.tb_dp_bsn_source_v2 GENERIC MAP (3, 3);  -- 3 // 3 = 1, 3 MOD 3 = 0, 3/3 = 1 block/sync
+  u_6_3    : ENTITY work.tb_dp_bsn_source_v2 GENERIC MAP (6, 3);  -- 6 // 3 = 2, 6 MOD 3 = 0, 6/3 = 2 block/sync
+  u_7_3    : ENTITY work.tb_dp_bsn_source_v2 GENERIC MAP (7, 3);  -- 7 // 3 = 2, 7 MOD 3 = 1, 7/3 = 2.33 block/sync
 
-  -- test different clk_per_sync
-  u_230_32_div_7_mod_6  : ENTITY work.tb_dp_bsn_source_v2 GENERIC MAP (c_nof_pps, 230, 32);  -- 230 / 32 = 7, 230 MOD 32 = 6
-  u_240_32_div_7_mod_16 : ENTITY work.tb_dp_bsn_source_v2 GENERIC MAP (c_nof_pps, 240, 32);  -- 240 / 32 = 7, 240 MOD 32 = 16
-  u_248_32_div_7_mod_24 : ENTITY work.tb_dp_bsn_source_v2 GENERIC MAP (c_nof_pps, 248, 32);  -- 248 / 32 = 7, 248 MOD 32 = 24
+  -- test lofar case with 0.5 fraction in average nof block/sync
+  u_20_8   : ENTITY work.tb_dp_bsn_source_v2 GENERIC MAP (20, 8);  -- 20 // 8 = 2, 20 MOD 8 = 4, 20/8 = 2.5 block/sync
 
-  -- test different block_size's
-  u_240_27_div_8_mod_24 : ENTITY work.tb_dp_bsn_source_v2 GENERIC MAP (c_nof_pps, 240, 27);  -- 240 / 27 = 8, 240 MOD 27 = 24
-  u_240_30_div_8_mod_0  : ENTITY work.tb_dp_bsn_source_v2 GENERIC MAP (c_nof_pps, 240, 30);  -- 240 / 30 = 8, 240 MOD 30 = 0
+  -- test fractional (corner) cases
+  u_18_9   : ENTITY work.tb_dp_bsn_source_v2 GENERIC MAP (18, 9);  -- 18 MOD 9 = 0
+  u_17_9   : ENTITY work.tb_dp_bsn_source_v2 GENERIC MAP (17, 9);  -- 17 MOD 9 = 8 = g_block_size - 1
+  u_19_9   : ENTITY work.tb_dp_bsn_source_v2 GENERIC MAP (19, 9);  -- 19 MOD 9 = 1
+  u_20_9   : ENTITY work.tb_dp_bsn_source_v2 GENERIC MAP (20, 9);  -- 20 MOD 9 = 2
+  u_25_9   : ENTITY work.tb_dp_bsn_source_v2 GENERIC MAP (25, 9);  -- 25 MOD 9 = 7
+  u_26_9   : ENTITY work.tb_dp_bsn_source_v2 GENERIC MAP (26, 9);  -- 26 MOD 9 = 8 = g_block_size - 1
+  u_27_9   : ENTITY work.tb_dp_bsn_source_v2 GENERIC MAP (27, 9);  -- 27 MOD 9 = 0
 
   -- test some prime values
-  u_101_17_div_5_mod_16  : ENTITY work.tb_dp_bsn_source_v2 GENERIC MAP (c_nof_pps, 101, 17);  -- 101 / 17 = 5, 101 MOD 17 = 16
-  u_101_23_div_4_mod_9   : ENTITY work.tb_dp_bsn_source_v2 GENERIC MAP (c_nof_pps, 101, 23);  -- 101 / 23 = 4, 101 MOD 23 = 9
+  u_17_3   : ENTITY work.tb_dp_bsn_source_v2 GENERIC MAP (17, 3);    -- 17 // 3 = 5, 17 MOD 3 = 2, 17/3 = 5.66 block/sync
+  u_101_17 : ENTITY work.tb_dp_bsn_source_v2 GENERIC MAP (101, 17);  -- 101 // 17 = 5, 101 MOD 17 = 16, 101/17 = 5.9411 block/sync
 
 END tb;