diff --git a/applications/lofar2/designs/lofar2_unb2c_sdp_station/revisions/lofar2_unb2c_sdp_station_tbuf_one/tb_lofar2_unb2c_sdp_station_tbuf_one.vhd b/applications/lofar2/designs/lofar2_unb2c_sdp_station/revisions/lofar2_unb2c_sdp_station_tbuf_one/tb_lofar2_unb2c_sdp_station_tbuf_one.vhd
index 404004d0091ca87287f1c409b95b746f5f5a37ff..338e89fe3f66208679f904ea46de9d3e151545f1 100644
--- a/applications/lofar2/designs/lofar2_unb2c_sdp_station/revisions/lofar2_unb2c_sdp_station_tbuf_one/tb_lofar2_unb2c_sdp_station_tbuf_one.vhd
+++ b/applications/lofar2/designs/lofar2_unb2c_sdp_station/revisions/lofar2_unb2c_sdp_station_tbuf_one/tb_lofar2_unb2c_sdp_station_tbuf_one.vhd
@@ -97,9 +97,10 @@ entity tb_lofar2_unb2c_sdp_station_tbuf_one is
     g_rs_record_nof_block      : natural := 10;
     g_rs_nof_periods_per_block : real := 1.17;  -- number of WG periods per rs_block for WG in g_sp
     g_dump_inter_packet_gap    : natural := 0;
-    g_dump_page_offset         : natural := 0;  -- offset relative to recorded_first_page
-    g_dump_nof_pages           : natural := 2;  -- <= c_nof_pages_in_buffer
-    g_dump_enables             : std_logic_vector(c_sdp_A_pn - 1 downto 0) := "000001"
+    g_dump_page_offset         : natural := 1;  -- offset relative to recorded_first_page
+    g_dump_nof_pages           : natural := 1;  -- g_dump_page_offset + g_dump_nof_pages <= c_nof_pages_in_buffer, else
+                                                -- there will occur read RSN errors for pages that are not available
+    g_dump_enables             : std_logic_vector(c_sdp_A_pn - 1 downto 0) := "100010"
   );
   port (
     tb_end : out std_logic
@@ -157,9 +158,10 @@ architecture tb of tb_lofar2_unb2c_sdp_station_tbuf_one is
   constant c_page_meta_size         : natural := func_sdp_tbuf_calculate_page_meta_size(g_rs_block_size);
   constant c_page_size              : natural := c_page_data_size + c_page_meta_size;
   constant c_nof_pages_in_buffer    : natural := func_sdp_tbuf_calculate_nof_pages(c_ddr_buffer_size, c_page_size);
-  constant c_dump_nof_pages         : natural := smallest(g_dump_nof_pages, c_nof_pages_in_buffer);
+  constant c_dump_nof_pages_rw      : natural := g_dump_nof_pages;
+  constant c_dump_nof_pages_actual  : natural := smallest(g_dump_nof_pages, c_nof_pages_in_buffer);
   constant c_bs_start_latency       : natural := c_bs_block_size * 2;
-  constant c_record_min_nof_pages   : natural := g_dump_page_offset + c_dump_nof_pages;
+  constant c_record_min_nof_pages   : natural := g_dump_page_offset + c_dump_nof_pages_rw;
   constant c_record_min_nof_clk     : natural := c_bs_start_latency + g_rs_block_size * c_record_min_nof_pages;
 
   constant c_exp_read_rate_Gbps     : real := func_sdp_tbuf_dump_rate_bps(g_rs_block_size, g_dump_inter_packet_gap) /
@@ -169,8 +171,8 @@ architecture tb of tb_lofar2_unb2c_sdp_station_tbuf_one is
 
   constant c_dump_nof_ai             : natural := vector_sum(g_dump_enables);
   constant c_dump_ai_indices         : t_nat_integer_arr(g_dump_enables'range) := vector_one_indices(g_dump_enables);
-  constant c_read_nof_packets_per_ai : natural := c_dump_nof_pages;
-  constant c_read_total_nof_packets  : natural := c_dump_nof_ai * c_dump_nof_pages;
+  constant c_read_nof_packets_per_ai : natural := c_dump_nof_pages_actual;
+  constant c_read_total_nof_packets  : natural := c_dump_nof_ai * c_dump_nof_pages_actual;
   constant c_read_nof_crc_errors     : natural := sel_a_b(g_verify_crc_error, c_read_total_nof_packets, 0);
   constant c_read_nof_rsn_errors     : natural := sel_a_b(c_verify_err, c_read_total_nof_packets, 0);
   constant c_dump_nof_packets_per_ai : natural := sel_a_b(c_verify_err, 0, c_read_nof_packets_per_ai);
@@ -893,13 +895,15 @@ begin
     variable v_End                : natural;
     variable v_Period             : real := 0.0;
     variable v_dump_rate_Gbps     : real := 0.0;
+    variable v_dump_start_page    : natural;
+    variable v_dump_start_rsn     : std_logic_vector(c_sdp_W_rsn - 1 downto 0);
   begin
     -- Init tbuf_registers_wr record
     tbuf_registers_wr.record_all            <= '1';                      -- 2
     tbuf_registers_wr.record_enable         <= '1';                      -- 3
     tbuf_registers_wr.dump_inter_packet_gap <= g_dump_inter_packet_gap;  -- 11
     tbuf_registers_wr.dump_start_page       <= 0;                        -- 12
-    tbuf_registers_wr.dump_nof_pages        <= c_dump_nof_pages;         -- 13
+    tbuf_registers_wr.dump_nof_pages        <= c_dump_nof_pages_rw;      -- 13
     tbuf_registers_wr.dump_start_rsn        <= (others => 'X');          -- 14
     tbuf_registers_wr.dump_enables          <= (others => '0');          -- 16
 
@@ -970,7 +974,7 @@ begin
     -- Read TBuf state
     mmf_mm_bus_rd(c_mm_file_reg_tbuf, 19, rd_data_state, tb_clk);
     proc_common_wait_some_cycles(tb_clk, 1);
-    v_bool := func_sdp_tbuf_print_state(rd_data_state);
+    v_bool := func_sdp_tbuf_print_state(c_tb_str, rd_data_state);
 
     -- Recording
     proc_common_wait_some_cycles(ext_clk, g_rs_block_size * g_rs_record_nof_block);
@@ -1125,14 +1129,22 @@ begin
         c_mm_clk_period, c_ext_clk_period, c_common_cross_clock_domain_latency * 2);
 
     -- Set dump interval and antenna inputs
-    -- . when g_verify_crc_error then read from last g_dump_nof_pages in the buffer. These pages still contain 0
+    -- . when g_verify_crc_error then read from last c_dump_nof_pages_rw in the buffer. These pages still contain 0,
     --   because they have not been recorded, so these will yield a CRC error (and also a RSN error) for each page.
+    v_dump_start_page := tbuf_registers_ro.recorded_first_page + g_dump_page_offset;
+    if v_dump_start_page >= c_nof_pages_in_buffer then
+      -- Wrap from begin of buffer when v_dump_start_page is just beyond the end of buffer. Do not use modulo
+      -- c_nof_pages_in_buffer to be able to simulate effect of a much to large v_dump_start_page due to
+      -- g_dump_page_offset >= c_nof_pages_in_buffer
+      v_dump_start_page := v_dump_start_page - c_nof_pages_in_buffer;
+    end if;
     tbuf_registers_wr.dump_start_page <= sel_a_b(g_verify_crc_error,
-                                                 c_nof_pages_in_buffer - g_dump_nof_pages,
-                                                 tbuf_registers_ro.recorded_first_page + g_dump_page_offset);
+                                                 c_nof_pages_in_buffer - c_dump_nof_pages_rw,
+                                                 v_dump_start_page);
     -- . when g_verify_rsn_error then write a wrong dump_start_rsn.
-    tbuf_registers_wr.dump_start_rsn <= incr_uvec(tbuf_registers_ro.recorded_first_rsn,
-                                                  g_dump_page_offset * g_rs_block_size + to_int(g_verify_rsn_error));
+    v_dump_start_rsn := incr_uvec(tbuf_registers_ro.recorded_first_rsn, g_dump_page_offset * g_rs_block_size);
+    v_dump_start_rsn := incr_uvec(v_dump_start_rsn, to_int(g_verify_rsn_error));
+    tbuf_registers_wr.dump_start_rsn <= v_dump_start_rsn;
     tbuf_registers_wr.dump_enables <= g_dump_enables;
     proc_common_wait_some_cycles(tb_clk, 1);
     mmf_mm_bus_wr(c_mm_file_reg_tbuf, 12, tbuf_registers_wr.dump_start_page, tb_clk);
@@ -1142,50 +1154,52 @@ begin
     proc_common_wait_cross_clock_domain_latency(
         c_mm_clk_period, c_ext_clk_period, c_common_cross_clock_domain_latency * 2);
 
-    -- Time dump begin
-    read_busy <= '1';
-    v_Begin := NOW / c_1ns;
-    proc_common_wait_some_cycles(tb_clk, 1);
-
-    -- Read back enabled dump
-    mmf_mm_bus_rd(c_mm_file_reg_tbuf, 16, rd_data_control, tb_clk);
-    tbuf_registers_rd.dump_enables <= rd_data_control(c_sdp_A_pn - 1 downto 0);
-    proc_common_wait_some_cycles(tb_clk, 1);
-    assert to_uint(tbuf_registers_rd.dump_enables) = to_uint(tbuf_registers_wr.dump_enables)
-      report c_tb_str & "Wrong tbuf_registers_rd.dump_enables enabled"
-      severity ERROR;
-    print_str(c_tb_str & "tbuf_registers_rd.dump_enables = " & slv_to_str(tbuf_registers_rd.dump_enables));
-
-    -- Read DDR4 read FIFO status
-    proc_common_wait_some_cycles(ext_clk, 10);
-    proc_read_ddr4_rd_fifo_status(tb_clk, rd_data_fifo, ddr_rd_fifo_used, ddr_rd_fifo_full);
-
-    ----------------------------------------------------------------------------
-    -- Wait until dump is done
-    ----------------------------------------------------------------------------
-    mmf_mm_wait_until_value(
-        c_mm_file_reg_tbuf, 17,  -- read dump_done
-        "UNSIGNED", rd_data_dump_done, "=", 1,  -- this is the wait until condition
-        c_T_rd_interval, ext_clk);
-    tbuf_registers_ro.dump_done <= rd_data_dump_done(0);
-    proc_common_wait_some_cycles(tb_clk, 1);
+    if g_dump_nof_pages > 0 then
+      -- Time dump begin
+      read_busy <= '1';
+      v_Begin := NOW / c_1ns;
+      proc_common_wait_some_cycles(tb_clk, 1);
 
-    -- Time dump end
-    read_busy <= '0';
-    v_End := NOW / c_1ns;
-    v_Period := real(v_End - v_Begin);  -- dump time in ns
-    v_dump_rate_Gbps := real(c_dump_total_nof_packets * c_sdp_W_ant * g_rs_block_size) / v_Period;
-    dump_rate_Gbps <= v_dump_rate_Gbps;
-
-    -- Verify dump rate over sufficient number of packets
-    if c_dump_total_nof_packets > 5 and g_ddr_access_rate_pct = 100 then
-      -- . use almost_equal(a/b, 1.0, max_ratio) to verify that a and b differ less than max_ratio/100 percent
-      assert almost_equal(v_dump_rate_Gbps / c_exp_dump_rate_Gbps, 1.0, c_dump_rate_delta)
-        report c_tb_str & "Wrong dump rate"
+      -- Read back enabled dump
+      mmf_mm_bus_rd(c_mm_file_reg_tbuf, 16, rd_data_control, tb_clk);
+      tbuf_registers_rd.dump_enables <= rd_data_control(c_sdp_A_pn - 1 downto 0);
+      proc_common_wait_some_cycles(tb_clk, 1);
+      assert to_uint(tbuf_registers_rd.dump_enables) = to_uint(tbuf_registers_wr.dump_enables)
+        report c_tb_str & "Wrong tbuf_registers_rd.dump_enables enabled"
         severity ERROR;
+      print_str(c_tb_str & "tbuf_registers_rd.dump_enables = " & slv_to_str(tbuf_registers_rd.dump_enables));
+
+      -- Read DDR4 read FIFO status
+      proc_common_wait_some_cycles(ext_clk, 10);
+      proc_read_ddr4_rd_fifo_status(tb_clk, rd_data_fifo, ddr_rd_fifo_used, ddr_rd_fifo_full);
+
+      ----------------------------------------------------------------------------
+      -- Wait until dump is done
+      ----------------------------------------------------------------------------
+      mmf_mm_wait_until_value(
+          c_mm_file_reg_tbuf, 17,  -- read dump_done
+          "UNSIGNED", rd_data_dump_done, "=", 1,  -- this is the wait until condition
+          c_T_rd_interval, ext_clk);
+      tbuf_registers_ro.dump_done <= rd_data_dump_done(0);
+      proc_common_wait_some_cycles(tb_clk, 1);
+
+      -- Time dump end
+      read_busy <= '0';
+      v_End := NOW / c_1ns;
+      v_Period := real(v_End - v_Begin);  -- dump time in ns
+      v_dump_rate_Gbps := real(c_dump_total_nof_packets * c_sdp_W_ant * g_rs_block_size) / v_Period;
+      dump_rate_Gbps <= v_dump_rate_Gbps;
+
+      -- Verify dump rate over sufficient number of packets
+      if c_dump_total_nof_packets > 5 and g_ddr_access_rate_pct = 100 then
+        -- . use almost_equal(a/b, 1.0, max_ratio) to verify that a and b differ less than max_ratio/100 percent
+        assert almost_equal(v_dump_rate_Gbps / c_exp_dump_rate_Gbps, 1.0, c_dump_rate_delta)
+          report c_tb_str & "Wrong dump rate"
+          severity ERROR;
+      end if;
+      print_str(c_tb_str & "Dump rate = " & real_to_str(v_dump_rate_Gbps, 4, 2) & " Gbps" &
+                " (Expected " & real_to_str(c_exp_dump_rate_Gbps, 4, 2) & " Gbps)");
     end if;
-    print_str(c_tb_str & "Dump rate = " & real_to_str(v_dump_rate_Gbps, 4, 2) & " Gbps" &
-              " (Expected " & real_to_str(c_exp_dump_rate_Gbps, 4, 2) & " Gbps)");
 
     -- Wait some time for latency in sdp_tbuf_output and 10GbE Tx - Rx network
     proc_common_wait_some_cycles(ext_clk, g_rs_block_size * 4);
@@ -1315,26 +1329,33 @@ begin
     variable v_bool       : boolean;
   begin
     wait until rising_edge(ext_clk);
-    -- Count rx_dump_sosi packets at sop
-    if rx_dump_sosi.sop = '1' then
-      rx_dump_packet_cnt <= rx_dump_packet_cnt + 1;
-
-      -- Determine expected antenna_input_index assuming c_dump_nof_packets_per_ai per ai
-      v_dump_index := rx_dump_packet_cnt / c_dump_nof_packets_per_ai;
-      v_ai_local := c_dump_ai_indices(v_dump_index);
-      exp_dump_ai <= c_ai_offset + v_ai_local;
-
-      -- Determine expected RSN assuming c_dump_nof_packets_per_ai per ai
-      v_time_index := rx_dump_packet_cnt mod c_dump_nof_packets_per_ai;
-      exp_dp_rsn <= to_uint(tbuf_registers_wr.dump_start_rsn) + v_time_index * g_rs_block_size;
-    end if;
-    -- Verify header at eop
-    if rx_dump_sosi.eop = '1' then
-      v_bool := func_sdp_tbuf_verify_cep_header(rx_dump_header, exp_dump_header);
+    if c_dump_nof_packets_per_ai > 0 then
+      -- Count rx_dump_sosi packets at sop
+      if rx_dump_sosi.sop = '1' then
+        rx_dump_packet_cnt <= rx_dump_packet_cnt + 1;
+
+        -- Determine expected antenna_input_index assuming c_dump_nof_packets_per_ai per ai
+        v_dump_index := rx_dump_packet_cnt / c_dump_nof_packets_per_ai;
+        v_ai_local := c_dump_ai_indices(v_dump_index);
+        exp_dump_ai <= c_ai_offset + v_ai_local;
+
+        -- Determine expected RSN assuming c_dump_nof_packets_per_ai per ai
+        v_time_index := rx_dump_packet_cnt mod c_dump_nof_packets_per_ai;
+        exp_dp_rsn <= to_uint(tbuf_registers_wr.dump_start_rsn) + v_time_index * g_rs_block_size;
+      end if;
+      -- Verify header at eop
+      if rx_dump_sosi.eop = '1' then
+        v_bool := func_sdp_tbuf_verify_cep_header(rx_dump_header, exp_dump_header);
+      end if;
+      -- View variables in Wave Window
+      dump_index <= v_dump_index;
+      time_index <= v_time_index;
+    else
+      -- Expect no dump packets when g_dump_nof_pages = 0
+      assert rx_dump_sosi.sop = '0'
+        report c_tb_str & "Wrong unexpected rx_dump_sosi packet for g_dump_nof_pages = 0"
+        severity ERROR;
     end if;
-    -- View variables in Wave Window
-    dump_index <= v_dump_index;
-    time_index <= v_time_index;
   end process;
 
   -----------------------------------------------------------------------------
diff --git a/applications/lofar2/designs/lofar2_unb2c_sdp_station/revisions/lofar2_unb2c_sdp_station_tbuf_one/tb_tb_lofar2_unb2c_sdp_station_tbuf_one.vhd b/applications/lofar2/designs/lofar2_unb2c_sdp_station/revisions/lofar2_unb2c_sdp_station_tbuf_one/tb_tb_lofar2_unb2c_sdp_station_tbuf_one.vhd
index 3b95d29feaf5e351d65f25f947ec55d72968420e..6d65f8569b394b554f2792145fb7ca0199c85491 100644
--- a/applications/lofar2/designs/lofar2_unb2c_sdp_station/revisions/lofar2_unb2c_sdp_station_tbuf_one/tb_tb_lofar2_unb2c_sdp_station_tbuf_one.vhd
+++ b/applications/lofar2/designs/lofar2_unb2c_sdp_station/revisions/lofar2_unb2c_sdp_station_tbuf_one/tb_tb_lofar2_unb2c_sdp_station_tbuf_one.vhd
@@ -20,8 +20,11 @@
 -- Purpose: Regression multi tb for tb_lofar2_unb2c_sdp_station_tbuf_one
 -- Description:
 -- Usage:
--- > as 4
--- > run -all
+-- . Modelsim:
+--   > as 4
+--   > run -all
+-- . Terminal:
+--   > cat transcript | grep Error:
 
 library IEEE, common_lib;
 use IEEE.std_logic_1164.all;
@@ -32,7 +35,7 @@ end tb_tb_lofar2_unb2c_sdp_station_tbuf_one;
 
 architecture tb of tb_tb_lofar2_unb2c_sdp_station_tbuf_one is
   -- Multi tb
-  constant c_tb_w       : natural := 10;  -- sufficiently long to fit all tb instances
+  constant c_tb_w       : natural := 11;  -- sufficiently long to fit all tb instances
   constant c_tb_end_vec : std_logic_vector(c_tb_w - 1 downto 0) := (others => '1');
 
   signal tb_end_vec   : std_logic_vector(c_tb_w - 1 downto 0) := c_tb_end_vec;  -- best view as hex in Wave Window
@@ -96,6 +99,20 @@ begin
       generic map(false, 7, false, false, false, false, 3, 100, 4096, 2000, 3, 1.17, 50, 0, 1, "000011")
       port map (tb_end_vec(7));
 
+  -- g_dump_nof_pages = 10 > c_nof_pages_in_buffer = 7
+  u_dump_nof_pages_limit : entity work.tb_lofar2_unb2c_sdp_station_tbuf_one
+      generic map(false, 8, false, false, false, false, 3, 100, 256, 100, 10, 1.17, 0, 0, 10, "000010")
+      port map (tb_end_vec(8));
+
+  -- g_dump_page_offset + g_dump_nof_pages = 6 + 1 = c_nof_pages_in_buffer = 7
+  u_dump_page_offset_limit : entity work.tb_lofar2_unb2c_sdp_station_tbuf_one
+      generic map(false, 9, false, false, false, false, 3, 100, 256, 100, 10, 1.17, 0, 6, 1, "000010")
+      port map (tb_end_vec(9));
+
+  u_dump_zero_pages : entity work.tb_lofar2_unb2c_sdp_station_tbuf_one
+      generic map(false, 10, false, false, false, false, 3, 100, 256, 102, 10, 1.0, 0, 1, 0, "100010")
+      port map (tb_end_vec(10));
+
   tb_end <= '1' after 1 us when tb_end_vec = c_tb_end_vec else '0';
   proc_common_stop_simulation(tb_end);
 end tb;
diff --git a/applications/lofar2/libraries/sdp/src/vhdl/sdp_tbuf_pkg.vhd b/applications/lofar2/libraries/sdp/src/vhdl/sdp_tbuf_pkg.vhd
index 368e2f54e923c61d6eddddaf726931149f81a23f..8a50fed7d6945bba5c6ca11997eeff18937c76d1 100644
--- a/applications/lofar2/libraries/sdp/src/vhdl/sdp_tbuf_pkg.vhd
+++ b/applications/lofar2/libraries/sdp/src/vhdl/sdp_tbuf_pkg.vhd
@@ -141,28 +141,28 @@ package sdp_tbuf_pkg is
 
   -- 'to' order as in document [1] to ease view in wave window
   -- . RW control registers
-  type t_sdp_tbuf_registers_rw is record                                -- word index
-    record_all            : std_logic;                                  -- 2
-    record_enable         : std_logic;                                  -- 3
-    dump_inter_packet_gap : natural;                                    -- 11
-    dump_start_page       : natural;                                    -- 12
-    dump_nof_pages        : natural;                                    -- 13
-    dump_start_rsn        : std_logic_vector(63 downto 0);              -- 14
-    dump_enables          : std_logic_vector(c_sdp_A_pn - 1 downto 0);  -- 16
+  type t_sdp_tbuf_registers_rw is record                                 -- word index
+    record_all            : std_logic;                                   -- 2
+    record_enable         : std_logic;                                   -- 3
+    dump_inter_packet_gap : natural;                                     -- 11
+    dump_start_page       : natural;                                     -- 12
+    dump_nof_pages        : natural;                                     -- 13
+    dump_start_rsn        : std_logic_vector(c_sdp_W_rsn - 1 downto 0);  -- 14
+    dump_enables          : std_logic_vector(c_sdp_A_pn - 1 downto 0);   -- 16
   end record;
 
   -- . RO monitoring registers
-  type t_sdp_tbuf_registers_ro is record                                -- word index
-    nof_samples_per_block : natural;                                    -- 0
-    nof_pages_in_buffer   : natural;                                    -- 1
-    recorded_nof_pages    : natural;                                    -- 4
-    recorded_first_page   : natural;                                    -- 5
-    recorded_last_page    : natural;                                    -- 6
-    recorded_first_rsn    : std_logic_vector(63 downto 0);              -- 7
-    recorded_last_rsn     : std_logic_vector(63 downto 0);              -- 9
-    dump_done             : std_logic;                                  -- 17
-    record_busy           : std_logic;                                  -- 18
-    state                 : std_logic_vector(31 downto 0);              -- 19
+  type t_sdp_tbuf_registers_ro is record                                 -- word index
+    nof_samples_per_block : natural;                                     -- 0
+    nof_pages_in_buffer   : natural;                                     -- 1
+    recorded_nof_pages    : natural;                                     -- 4
+    recorded_first_page   : natural;                                     -- 5
+    recorded_last_page    : natural;                                     -- 6
+    recorded_first_rsn    : std_logic_vector(c_sdp_W_rsn - 1 downto 0);  -- 7
+    recorded_last_rsn     : std_logic_vector(c_sdp_W_rsn - 1 downto 0);  -- 9
+    dump_done             : std_logic;                                   -- 17
+    record_busy           : std_logic;                                   -- 18
+    state                 : std_logic_vector(31 downto 0);               -- 19
   end record;
 
   constant c_sdp_tbuf_registers_rw_rst :t_sdp_tbuf_registers_rw :=
diff --git a/applications/lofar2/libraries/sdp/src/vhdl/sdp_tbuf_reader.vhd b/applications/lofar2/libraries/sdp/src/vhdl/sdp_tbuf_reader.vhd
index f417a36f52f4e4493850fdaacaeaf90365b8c0df..5bc156427f2de7e582c80ad8784f7755e094bc80 100644
--- a/applications/lofar2/libraries/sdp/src/vhdl/sdp_tbuf_reader.vhd
+++ b/applications/lofar2/libraries/sdp/src/vhdl/sdp_tbuf_reader.vhd
@@ -336,11 +336,17 @@ begin
         v.dump_done := '0';
         v.dump_start_rsn := reg_dump_start_rsn_rw;
         v.dump_start_page := reg_dump_start_page_rw;
+        v.dump_nof_pages := reg_dump_nof_pages_rw;
         if v.dump_start_page >= c_nof_pages_in_buffer then
+          -- Start page not in buffer range, cannot do dump.
           v.dump_start_page := 0;
+          v.dump_nof_pages := 0;
         end if;
-        v.dump_nof_pages := reg_dump_nof_pages_rw;
-        if dump_en = '1' then
+        if v.dump_nof_pages >= c_nof_pages_in_buffer then
+          -- Limit nof pages to buffer size
+          v.dump_nof_pages := c_nof_pages_in_buffer;
+        end if;
+        if dump_en = '1' and r.dump_nof_pages > 0 then
           v.latency_cnt := c_start_latency;
           v.fsm := s_dump_start;
         end if;
diff --git a/applications/lofar2/libraries/sdp/tb/vhdl/tb_sdp_tbuf_pkg.vhd b/applications/lofar2/libraries/sdp/tb/vhdl/tb_sdp_tbuf_pkg.vhd
index 2b8cbab7709419dad1de68c172d1d5a1f783b444..7be2601fd9294a70e849e1eb1aae5ec0ae66ce0d 100644
--- a/applications/lofar2/libraries/sdp/tb/vhdl/tb_sdp_tbuf_pkg.vhd
+++ b/applications/lofar2/libraries/sdp/tb/vhdl/tb_sdp_tbuf_pkg.vhd
@@ -42,8 +42,8 @@ package tb_sdp_tbuf_pkg is
   function func_sdp_tbuf_fsm_arbiter_str(fsm_arbiter : natural) return string;
   function func_sdp_tbuf_fsm_writer_str(fsm_writer : natural) return string;
   function func_sdp_tbuf_fsm_reader_str(fsm_reader : natural) return string;
-  function func_sdp_tbuf_print_state(state_rec : t_sdp_tbuf_state) return boolean;
-  function func_sdp_tbuf_print_state(state_slv : std_logic_vector) return boolean;
+  function func_sdp_tbuf_print_state(prefix : string; state_rec : t_sdp_tbuf_state) return boolean;
+  function func_sdp_tbuf_print_state(prefix : string; state_slv : std_logic_vector) return boolean;
 
   -- Transient raw data output via 10GbE to CEP (= central processor)
   function func_sdp_tbuf_compose_cep_header(ip_src_addr             : std_logic_vector;
@@ -120,7 +120,7 @@ package body tb_sdp_tbuf_pkg is
     end case;
   end func_sdp_tbuf_fsm_reader_str;
 
-  function func_sdp_tbuf_print_state(state_rec : t_sdp_tbuf_state) return boolean is
+  function func_sdp_tbuf_print_state(prefix : string; state_rec : t_sdp_tbuf_state) return boolean is
     constant c_fsm_arbiter_str : string := func_sdp_tbuf_fsm_arbiter_str(
                                            to_uint(func_sdp_tbuf_fsm_arbiter_to_slv(state_rec.fsm_arbiter)));
     constant c_fsm_writer_str  : string := func_sdp_tbuf_fsm_writer_str(
@@ -128,29 +128,30 @@ package body tb_sdp_tbuf_pkg is
     constant c_fsm_reader_str  : string := func_sdp_tbuf_fsm_reader_str(
                                            to_uint(func_sdp_tbuf_fsm_reader_to_slv(state_rec.fsm_reader)));
   begin
-    print_str("tbuf_state:");
-    print_str(". ddr4_I_cal_ok           = " & sl_to_str(state_rec.ddr4_I_cal_ok));
-    print_str(". dvr_done                = " & sl_to_str(state_rec.dvr_done));
-    print_str(". fsm_arbiter             = " & c_fsm_arbiter_str);
-    print_str(". fsm_writer              = " & c_fsm_writer_str);
-    print_str("    record_enable         = " & sl_to_str(state_rec.record_enable));
-    print_str("    record_busy           = " & sl_to_str(state_rec.record_busy));
-    print_str("    record_all            = " & sl_to_str(state_rec.record_all));
-    print_str("    record_buf_full       = " & sl_to_str(state_rec.record_buf_full));
-    print_str("    record_sop_fifo_usedw = " & int_to_str(to_uint(state_rec.record_sop_fifo_usedw)));
-    print_str(". fsm_reader              = " & c_fsm_reader_str);
-    print_str("    dump_enables          = b" & slv_to_str(state_rec.dump_enables));
-    print_str("    dump_en               = " & sl_to_str(state_rec.dump_en));
-    print_str("    dump_busy             = " & sl_to_str(state_rec.dump_busy));
-    print_str("    dump_done             = " & sl_to_str(state_rec.dump_done));
-    print_str("    dump_ai               = " & int_to_str(state_rec.dump_ai));
+    print_str(prefix & "tbuf_state:");
+    print_str(prefix & ". ddr4_I_cal_ok           = " & sl_to_str(state_rec.ddr4_I_cal_ok));
+    print_str(prefix & ". dvr_done                = " & sl_to_str(state_rec.dvr_done));
+    print_str(prefix & ". fsm_arbiter             = " & c_fsm_arbiter_str);
+    print_str(prefix & ". fsm_writer              = " & c_fsm_writer_str);
+    print_str(prefix & "    record_enable         = " & sl_to_str(state_rec.record_enable));
+    print_str(prefix & "    record_busy           = " & sl_to_str(state_rec.record_busy));
+    print_str(prefix & "    record_all            = " & sl_to_str(state_rec.record_all));
+    print_str(prefix & "    record_buf_full       = " & sl_to_str(state_rec.record_buf_full));
+    print_str(prefix & "    record_sop_fifo_usedw = " & int_to_str(to_uint(state_rec.record_sop_fifo_usedw)));
+    print_str(prefix & ". fsm_reader              = " & c_fsm_reader_str);
+    print_str(prefix & "    dump_enables          = b" & slv_to_str(state_rec.dump_enables));
+    print_str(prefix & "    dump_en               = " & sl_to_str(state_rec.dump_en));
+    print_str(prefix & "    dump_busy             = " & sl_to_str(state_rec.dump_busy));
+    print_str(prefix & "    dump_done             = " & sl_to_str(state_rec.dump_done));
+    print_str(prefix & "    dump_ai               = " & int_to_str(state_rec.dump_ai));
+    print_str("");
     return true;
   end func_sdp_tbuf_print_state;
 
-  function func_sdp_tbuf_print_state(state_slv : std_logic_vector) return boolean is
+  function func_sdp_tbuf_print_state(prefix : string; state_slv : std_logic_vector) return boolean is
     constant c_state_rec : t_sdp_tbuf_state := func_sdp_tbuf_map_state(state_slv);
   begin
-    return func_sdp_tbuf_print_state(c_state_rec);
+    return func_sdp_tbuf_print_state(prefix, c_state_rec);
   end func_sdp_tbuf_print_state;
 
   function func_sdp_tbuf_compose_cep_header(ip_src_addr             : std_logic_vector;