diff --git a/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl.vhd b/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl.vhd
index 6af5fab043102e74303bf063f837676da6f99846..ef794a959189c434e132772f00fd16c772b5f3c9 100644
--- a/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl.vhd
+++ b/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl.vhd
@@ -87,6 +87,7 @@ ARCHITECTURE str OF ddrctrl IS
   CONSTANT  c_io_ddr_data_w     : NATURAL                                   := func_tech_ddr_ctlr_data_w( g_tech_ddr );       -- 576
   CONSTANT  c_wr_fifo_depth     : NATURAL                                   := 256;                                           -- defined at DDR side of the FIFO, >=16 and independent of wr burst size, default >= 256 because 32b*256 fits in 1 M9K so c_ctlr_data_w=256b will require 8 M9K
   CONSTANT  c_rd_fifo_depth     : NATURAL                                   := 256;                                           -- defined at DDR side of the FIFO, >=16 AND > max number of rd burst sizes (so > c_rd_fifo_af_margin), default >= 256 because 32b*256 fits in 1 M9K so c_ctlr_data_w=256b will require 8 M9K
+  CONSTANT  c_wr_fifo_uw_w      : NATURAL                                   := ceil_log2(c_wr_fifo_depth*(func_tech_ddr_ctlr_data_w(g_tech_ddr)/c_io_ddr_data_w));
   CONSTANT  c_rd_fifo_uw_w      : NATURAL                                   := ceil_log2(c_rd_fifo_depth*(func_tech_ddr_ctlr_data_w(g_tech_ddr)/c_io_ddr_data_w));
 
   CONSTANT  c_adr_w             : NATURAL                                   := func_tech_ddr_ctlr_address_w(g_tech_ddr);      -- the lengt of the address vector, for simulation this is smaller, otherwise the simulation would take to long, 27
@@ -122,10 +123,11 @@ ARCHITECTURE str OF ddrctrl IS
   SIGNAL    rd_siso           : t_dp_siso                                   := c_dp_siso_rst;
   SIGNAL    rd_sosi           : t_dp_sosi                                   := c_dp_sosi_init;
   SIGNAL    stop              : STD_LOGIC;
+  SIGNAL    wr_fifo_usedw     : STD_LOGIC_VECTOR(c_wr_fifo_uw_w-1 DOWNTO 0);
   SIGNAL    rd_fifo_usedw     : STD_LOGIC_VECTOR(c_rd_fifo_uw_w-1 DOWNTO 0);
   SIGNAL    rd_ready          : STD_LOGIC;
   SIGNAL    inp_bsn_adr       : NATURAL;
-  SIGNAL    outp_bsn          : STD_LOGIC_VECTOR(c_dp_stream_bsn_w-1 DOWNTO 0);
+  SIGNAL    bsn_co            : STD_LOGIC_VECTOR(c_dp_stream_bsn_w-1 DOWNTO 0);
   SIGNAL    data_stopped      : STD_LOGIC;
 
 BEGIN
@@ -203,7 +205,7 @@ BEGIN
     wr_clk                    => clk,
     wr_rst                    => rst,
 
-    wr_fifo_usedw             => open,
+    wr_fifo_usedw             => wr_fifo_usedw,
     wr_sosi                   => wr_sosi,
     wr_siso                   => open,
   
@@ -244,6 +246,7 @@ BEGIN
     rst                       => rst,
 
     in_sosi                   => rd_sosi,
+    in_bsn                    => bsn_co,
 
     out_sosi_arr              => out_sosi_arr,
     out_ready                 => rd_ready
@@ -260,6 +263,7 @@ BEGIN
     g_rd_fifo_depth           => c_rd_fifo_depth,
     g_rd_data_w               => c_io_ddr_data_w,
     g_block_size              => g_block_size,
+    g_wr_fifo_uw_w            => c_wr_fifo_uw_w,
     g_rd_fifo_uw_w            => c_rd_fifo_uw_w,
     g_max_adr                 => c_nof_adr,
     g_burstsize               => g_burstsize,
@@ -283,8 +287,12 @@ BEGIN
     dvr_mosi                  => dvr_mosi,
     dvr_miso                  => dvr_miso,
     wr_sosi                   => wr_sosi,
+    wr_fifo_usedw             => wr_fifo_usedw,
     rd_fifo_usedw             => rd_fifo_usedw,
 
+    -- ddrctrl_output
+    outp_bsn                  => bsn_co,
+
     -- ddrctrl_controller
     stop_in                   => stop_in,
     stop_out                  => stop
diff --git a/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_controller.vhd b/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_controller.vhd
index 3a2b66fd63d8e87508770d7d5902ebff4ec8ae7b..6bb5a508908316af7538db8337fb7635f5522069 100644
--- a/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_controller.vhd
+++ b/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_controller.vhd
@@ -46,6 +46,7 @@ ENTITY ddrctrl_controller IS
     g_rd_fifo_depth           : NATURAL;    -- 256
     g_rd_data_w               : NATURAL;    -- 256
     g_block_size              : NATURAL;    -- 1024
+    g_wr_fifo_uw_w            : NATURAL;    -- 8
     g_rd_fifo_uw_w            : NATURAL;    -- 8
     g_max_adr                 : NATURAL;    -- 16128
     g_burstsize               : NATURAL;    -- 64
@@ -69,6 +70,7 @@ ENTITY ddrctrl_controller IS
     dvr_mosi                  : OUT t_mem_ctlr_mosi;
     dvr_miso                  : IN  t_mem_ctlr_miso;
     wr_sosi                   : OUT t_dp_sosi;
+    wr_fifo_usedw             : IN  STD_LOGIC_VECTOR(g_wr_fifo_uw_w-1 DOWNTO 0);
     rd_fifo_usedw             : IN  STD_LOGIC_VECTOR(g_rd_fifo_uw_w-1 DOWNTO 0);
 
     -- ddrctrl_output
@@ -93,11 +95,10 @@ ARCHITECTURE rtl OF ddrctrl_controller IS
 
   CONSTANT  c_rd_data_w       : NATURAL                                     := g_nof_streams*g_out_data_w;                    -- 168
   CONSTANT  c_rest            : NATURAL                                     := c_rd_data_w-(g_wr_data_w mod c_rd_data_w);     -- 96
-  CONSTANT  c_max_read_cnt    : NATURAL                                     := (g_max_adr+1)/g_burstsize;                     -- 256
   CONSTANT  c_io_ddr_data_w   : NATURAL                                     := func_tech_ddr_ctlr_data_w(g_tech_ddr);         -- 576
 
   -- type for statemachine
-  TYPE t_state IS (RESET, WRITING, SET_STOP, STOP_WRITING, LAST_WRITE_BURST, START_READING, READING, STOP_READING, IDLE);
+  TYPE t_state IS (RESET, WAIT_FOR_SOP, START_WRITING, WRITING, SET_STOP, STOP_WRITING, LAST_WRITE_BURST, START_READING, READING, STOP_READING, IDLE);
 
   -- record for readability
   TYPE t_reg IS RECORD
@@ -114,11 +115,11 @@ ARCHITECTURE rtl OF ddrctrl_controller IS
   rst_ddrctrl_input           : STD_LOGIC;
 
   -- writing signals
-  need_burst                  : STD_LOGIC;
+  wr_burst_en                 : STD_LOGIC;
 
   -- reading signals
   outp_bsn                    : STD_LOGIC_VECTOR(c_dp_stream_bsn_w-1 DOWNTO 0);
-  read_cnt                    : NATURAL;
+  read_adr                    : NATURAL;
   rd_burst_en                 : STD_LOGIC;
 
   -- output
@@ -146,7 +147,8 @@ BEGIN
 
   BEGIN
 
-    v := q_reg;
+    v         := q_reg;
+    v.wr_sosi := inp_sosi;
 
 
     CASE q_reg.state IS
@@ -155,18 +157,49 @@ BEGIN
       v.dvr_mosi.burstbegin                                       := '1';
       v.dvr_mosi.burstsize(dvr_mosi.burstsize'length-1 DOWNTO 0)  := (OTHERS => '0');
       v.dvr_mosi.wr                                               := '1';
+      v.wr_sosi.valid                                             := '1';
 
 
+    WHEN WAIT_FOR_SOP =>
+    v.rst_ddrctrl_input := '0';
+    IF q_reg.started = '0' AND inp_sosi.eop = '1' THEN
+      v.wr_sosi.valid := '1';
+    ELSIF inp_sosi.sop = '1' THEN
+      v.state := WRITING; --START_WRITING;
+    ELSE
+      v.wr_sosi.valid := '0';
+      v.state := WAIT_FOR_SOP;
+    END IF;
+
+
+
+    WHEN START_WRITING =>
+      IF TO_UINT(wr_fifo_usedw) > g_burstsize AND dvr_miso.done = '1' AND v.wr_burst_en = '1' AND q_reg.dvr_mosi.burstbegin = '0' THEN
+        v.dvr_mosi.address(c_adr_w-1 DOWNTO 0) := TO_UVEC(TO_UINT(q_reg.last_adr_to_write_to(c_adr_w-1 DOWNTO 0))+q_reg.stop_burstsize, c_adr_w);
+        v.dvr_mosi.wr         := '1';
+        v.dvr_mosi.rd         := '0';
+        v.dvr_mosi.burstbegin := '1';
+        v.dvr_mosi.burstsize(dvr_mosi.burstsize'length-1 DOWNTO 0) := TO_UVEC(g_burstsize-q_reg.stop_burstsize, dvr_mosi.burstsize'length);
+        v.wr_burst_en         := '0';
+      ELSE
+        v.dvr_mosi.burstbegin := '0';
+      END IF;
+
+      -- makes sure the fifo is filled before asking for another rd request. to prevent 4 rd burst to happend directly after one another.
+      IF dvr_miso.done = '0' AND q_reg.wr_burst_en = '0' THEN
+        v.wr_burst_en := '1';
+        v.state       := WRITING;
+      ELSE
+        v.state       := START_WRITING;
+      END IF;
+
 
     WHEN WRITING =>
       -- if adr mod g_burstsize = 0
       -- this makes sure that only ones every 64 writes a writeburst is started.
-      IF TO_UVEC(inp_adr, c_adr_w)(c_bitshift_w-1 DOWNTO 0) = c_zeros AND q_reg.dvr_mosi.burstbegin = '0'THEN
-        v.need_burst            := '1';
-      END IF;
-      IF dvr_miso.done = '1' AND q_reg.need_burst = '1' THEN
+      IF TO_UINT(wr_fifo_usedw) > g_burstsize AND dvr_miso.done = '1' AND q_reg.wr_burst_en = '1' AND q_reg.dvr_mosi.burstbegin = '0' THEN
         v.dvr_mosi.burstbegin   := '1';
-        v.need_burst            := '0';
+        v.wr_burst_en           := '0';
         IF inp_adr < g_burstsize-1 THEN
           v.dvr_mosi.address    := TO_UVEC(g_max_adr-g_last_burstsize, dvr_mosi.address'length);
           v.dvr_mosi.burstsize  := TO_UVEC(g_last_burstsize, dvr_mosi.burstsize'length);
@@ -180,7 +213,22 @@ BEGIN
       END IF;
       v.dvr_mosi.wr             := '1';
       v.dvr_mosi.rd             := '0';
-      v.wr_sosi                 := inp_sosi;
+
+      IF TO_UVEC(inp_adr, c_adr_w)(c_bitshift_w-1 DOWNTO 0) = c_zeros AND q_reg.dvr_mosi.burstbegin = '0'THEN
+        v.wr_burst_en            := '1';
+      END IF;
+
+      IF stop_in = '1' THEN
+        v.ready_for_set_stop := '1';
+      END IF;
+
+      IF q_reg.ready_for_set_stop = '1' AND inp_sosi.eop = '1' THEN
+        v.state := SET_STOP;
+      ELSIF q_reg.stop_adr = TO_UVEC(inp_adr, c_adr_w) AND q_reg.stopped = '0' THEN
+        v.state := STOP_WRITING;        
+      ELSE
+        v.state := WRITING;
+      END IF;
 
 
     WHEN SET_STOP =>
@@ -190,20 +238,20 @@ BEGIN
       ELSE
         v.stop_adr(c_adr_w-1 DOWNTO 0) := TO_UVEC(inp_adr+c_pof_ma, c_adr_w)(c_adr_w-1 DOWNTO 0);
       END IF;
-      v.ready_for_set_stop                                            := '0';
+      v.ready_for_set_stop                                        := '0';
       v.last_adr_to_write_to(c_adr_w-1 DOWNTO c_bitshift_w)       := v.stop_adr(c_adr_w-1 DOWNTO c_bitshift_w);
       v.last_adr_to_write_to(c_bitshift_w-1 DOWNTO 0)             := (OTHERS => '0');
-      v.stop_burstsize                                            := TO_UINT(v.stop_adr(c_adr_w-1 DOWNTO 0))-TO_UINT(v.last_adr_to_write_to);
+      v.stop_burstsize                                            := TO_UINT(v.stop_adr(c_adr_w-1 DOWNTO 0))-TO_UINT(v.last_adr_to_write_to)+1;
 
       -- still a write cyle
       -- if adr mod g_burstsize = 0
       -- this makes sure that only ones every 64 writes a writeburst is started.
       IF TO_UVEC(inp_adr, c_adr_w)(c_bitshift_w-1 DOWNTO 0) = c_zeros AND q_reg.dvr_mosi.burstbegin = '0'THEN
-        v.need_burst            := '1';
+        v.wr_burst_en            := '1';
       END IF;
-      IF dvr_miso.done = '1' AND q_reg.need_burst = '1' THEN
+      IF dvr_miso.done = '1' AND q_reg.wr_burst_en = '1' THEN
         v.dvr_mosi.burstbegin   := '1';
-        v.need_burst            := '0';
+        v.wr_burst_en            := '0';
         IF inp_adr < g_burstsize-1 THEN
           v.dvr_mosi.address    := TO_UVEC(g_max_adr-g_last_burstsize, dvr_mosi.address'length);
           v.dvr_mosi.burstsize  := TO_UVEC(g_last_burstsize, dvr_mosi.burstsize'length);
@@ -217,20 +265,26 @@ BEGIN
       END IF;
       v.dvr_mosi.wr             := '1';
       v.dvr_mosi.rd             := '0';
-      v.wr_sosi                 := inp_sosi;
+
+      IF q_reg.stop_adr = TO_UVEC(inp_adr, c_adr_w) AND q_reg.stopped = '0' THEN
+        v.state := STOP_WRITING;        
+      ELSE
+        v.state := WRITING;
+      END IF;
+
 
 
     WHEN STOP_WRITING =>
+      v.wr_sosi.valid       := '0';
       v.dvr_mosi.burstbegin := '0';
       v.stopped             := '1';
       -- wait until the write burst is finished
       IF inp_data_stopped = '0' THEN
         v.state := STOP_WRITING;
-      ELSIF dvr_miso.done = '1' AND q_reg.dvr_mosi.burstbegin = '0' AND q_reg.need_burst = '0' THEN
-        v.wr_sosi.valid                         := '0';
-        v.state                                 := LAST_WRITE_BURST;
+      ELSIF dvr_miso.done = '1' AND q_reg.dvr_mosi.burstbegin = '0' AND q_reg.wr_burst_en = '0' THEN
+        v.state := LAST_WRITE_BURST;
       ELSE
-        v.state                                 := STOP_WRITING;
+        v.state := STOP_WRITING;
       END IF;
 
 
@@ -238,11 +292,11 @@ BEGIN
       -- if adr mod g_burstsize = 0
       -- this makes sure that only ones every 64 writes a writeburst is started.
       IF TO_UVEC(inp_adr, c_adr_w)(c_bitshift_w-1 DOWNTO 0) = c_zeros AND q_reg.dvr_mosi.burstbegin = '0'THEN
-        v.need_burst            := '1';
+        v.wr_burst_en            := '1';
       END IF;
-      IF dvr_miso.done = '1' AND q_reg.need_burst = '1' THEN
+      IF dvr_miso.done = '1' AND q_reg.wr_burst_en = '1' THEN
         v.dvr_mosi.burstbegin   := '1';
-        v.need_burst            := '0';
+        v.wr_burst_en            := '0';
         IF inp_adr < g_burstsize-1 THEN
           v.dvr_mosi.address    := TO_UVEC(g_max_adr-g_last_burstsize, dvr_mosi.address'length);
           v.dvr_mosi.burstsize  := TO_UVEC(g_last_burstsize, dvr_mosi.burstsize'length);
@@ -256,7 +310,6 @@ BEGIN
       END IF;
       v.dvr_mosi.wr             := '1';
       v.dvr_mosi.rd             := '0';
-      v.wr_sosi                 := inp_sosi;
 
 
     WHEN LAST_WRITE_BURST =>
@@ -266,6 +319,7 @@ BEGIN
         v.dvr_mosi.address(c_adr_w-1 DOWNTO 0)  := q_reg.last_adr_to_write_to(c_adr_w-1 DOWNTO 0);
         v.dvr_mosi.burstsize    := TO_UVEC(q_reg.stop_burstsize, dvr_mosi.burstsize'length);
         v.state                 := START_READING;
+        v.rd_burst_en           := '1';
       ELSE
         v.dvr_mosi.burstbegin   := '0';
         v.state                 := LAST_WRITE_BURST;
@@ -277,27 +331,43 @@ BEGIN
 
     WHEN START_READING =>
       v.dvr_mosi.burstbegin     := '0';
-      v.rd_burst_en             := '1';
-      v.read_cnt                := 0;
       v.outp_bsn                := TO_UVEC(TO_UINT(inp_sosi.bsn)-g_bim, c_dp_stream_bsn_w);
-      v.state                   := READING;
+
+      IF dvr_miso.done = '1' AND v.rd_burst_en = '1' AND q_reg.dvr_mosi.burstbegin = '0' THEN
+        v.dvr_mosi.burstbegin := '1';
+        v.dvr_mosi.burstsize(dvr_mosi.burstsize'length-1 DOWNTO 0) := TO_UVEC(g_burstsize-q_reg.stop_burstsize, dvr_mosi.burstsize'length);
+        v.dvr_mosi.wr         := '0';
+        v.dvr_mosi.rd         := '1';
+        v.dvr_mosi.address(c_adr_w-1 DOWNTO 0) := TO_UVEC(TO_UINT(q_reg.last_adr_to_write_to(c_adr_w-1 DOWNTO 0))+q_reg.stop_burstsize, c_adr_w);
+        v.rd_burst_en         := '0';
+        v.read_adr            := TO_UINT(q_reg.last_adr_to_write_to(c_adr_w-1 DOWNTO 0))+g_burstsize;
+      END IF;
+
+      -- makes sure the fifo is filled before asking for another rd request. to prevent 4 rd burst to happend directly after one another.
+      IF dvr_miso.done = '0' AND q_reg.rd_burst_en = '0' THEN
+        v.rd_burst_en := '1';
+        v.state       := READING;
+      ELSE
+        v.state       := START_READING;
+      END IF;
 
 
     WHEN READING =>
       -- rd_fifo needs a refil after rd_fifo_usedw <= 10 because of delays, if you wait until rd_fifo_usedw = 0 then you get an empty fifo which results in your outputs sosi.valid not being constatly valid.
       IF TO_UINT(rd_fifo_usedw) <= g_burstsize AND dvr_miso.done = '1' AND q_reg.rd_burst_en = '1' THEN
-        v.dvr_mosi.burstbegin     := '0';
-        v.dvr_mosi.burstsize(dvr_mosi.burstsize'length-1 DOWNTO 0)  := TO_UVEC(g_burstsize, dvr_mosi.burstsize'length);
-        v.dvr_mosi.wr             := '0';
-        v.dvr_mosi.rd             := '1';
-        IF TO_UINT(q_reg.stop_adr(c_adr_w-1 DOWNTO 0))+g_burstsize*q_reg.read_cnt >= g_max_adr THEN
-          v.dvr_mosi.address(c_adr_w-1 DOWNTO 0)  := TO_UVEC((TO_UINT(q_reg.stop_adr(c_adr_w-1 DOWNTO 0))+g_burstsize*q_reg.read_cnt)-g_max_adr-1, c_adr_w);
+        v.dvr_mosi.wr         := '0';
+        v.dvr_mosi.rd         := '1';
+        v.dvr_mosi.burstbegin := '1';
+        v.rd_burst_en         := '0';
+        IF q_reg.read_adr > g_max_adr-g_burstsize THEN
+          v.dvr_mosi.address    := TO_UVEC(q_reg.read_adr, dvr_mosi.address'length);
+          v.dvr_mosi.burstsize  := TO_UVEC(g_last_burstsize, dvr_mosi.burstsize'length);
+          v.read_adr            := 0;
         ELSE
-          v.dvr_mosi.address(c_adr_w-1 DOWNTO 0)  := TO_UVEC(TO_UINT(q_reg.stop_adr(c_adr_w-1 DOWNTO 0))+g_burstsize*q_reg.read_cnt, c_adr_w);
+          v.dvr_mosi.address    := TO_UVEC(q_reg.read_adr, dvr_mosi.address'length);
+          v.dvr_mosi.burstsize  := TO_UVEC(g_burstsize, dvr_mosi.burstsize'length);
+          v.read_adr            := q_reg.read_adr+g_burstsize;
         END IF;
-        v.dvr_mosi.burstbegin := '1';
-        v.read_cnt := v.read_cnt+1;
-        v.rd_burst_en := '0';
       ELSE
         v.dvr_mosi.burstbegin := '0';
       END IF;
@@ -307,7 +377,8 @@ BEGIN
         v.rd_burst_en := '1';
       END IF;
 
-      IF q_reg.read_cnt >= c_max_read_cnt THEN
+      -- goes to STOP_reading when this read burst was from the burstblock before q_reg.stop_adr
+      IF q_reg.last_adr_to_write_to(c_adr_w-1 DOWNTO 0) = TO_UVEC(q_reg.read_adr, c_adr_w) THEN
         v.state := STOP_READING;
       ELSE
         v.state := READING;
@@ -316,19 +387,33 @@ BEGIN
 
 
     WHEN STOP_READING =>
-    IF dvr_miso.done = '1' THEN
-      v.rst_ddrctrl_input := '0';
-      v.stopped := '0';
-      v.state := IDLE;
-    ELSE
-      v.state := STOP_READING;
-    END IF;
 
+      IF TO_UINT(rd_fifo_usedw) <= g_burstsize AND dvr_miso.done = '1' AND q_reg.rd_burst_en = '1' THEN
+        v.dvr_mosi.burstbegin   := '1';
+        v.dvr_mosi.address(c_adr_w-1 DOWNTO 0)  := q_reg.last_adr_to_write_to(c_adr_w-1 DOWNTO 0);
+        v.dvr_mosi.burstsize    := TO_UVEC(q_reg.stop_burstsize, dvr_mosi.burstsize'length);
+        v.stopped               := '0';
+        v.wr_sosi.valid         := '0';
+        v.state                 := WAIT_FOR_SOP;
+        v.wr_burst_en           := '1';
+        v.rst_ddrctrl_input     := '1';
+      ELSE
+        v.dvr_mosi.burstbegin   := '0';
+        v.state                 := STOP_READING;
+      END IF;
+      v.dvr_mosi.wr             := '0';
+      v.dvr_mosi.rd             := '1';
+
+      IF dvr_miso.done = '0' THEN
+        v.rd_burst_en := '1';
+      END IF;
 
 
 
     WHEN IDLE =>
-      v.wr_sosi.valid := '0';
+      IF q_reg.started = '0' THEN
+        v.wr_sosi.valid := '0';
+      END IF;
       -- the statemachine goes to Idle when its finished or when its waiting on other components.
 
     WHEN OTHERS =>
@@ -338,16 +423,17 @@ BEGIN
     END CASE;
 
 
-    IF q_reg.state = RESET OR q_reg.state = WRITING OR q_reg.state = SET_STOP OR q_reg.state = IDLE THEN
+    IF q_reg.state = RESET OR q_reg.state = IDLE THEN
       IF stop_in = '1' THEN
         v.ready_for_set_stop := '1';
       ELSIF q_reg.ready_for_set_stop = '1' AND inp_sosi.eop = '1' THEN
         v.state := SET_STOP;
-      ELSIF v.stop_adr = TO_UVEC(inp_adr, c_adr_w) AND q_reg.stopped = '0' THEN
+      ELSIF q_reg.stop_adr = TO_UVEC(inp_adr, c_adr_w) AND q_reg.stopped = '0' THEN
         v.state := STOP_WRITING;
-      ELSIF v.stopped = '0' AND inp_sosi.valid = '1'  AND q_reg.started = '1' THEN
+      --ELSIF v.stopped = '0' AND inp_sosi.sop = '1' AND q_reg.started = '1'  THEN
+        --v.state := START_WRITING;
+      ELSIF v.stopped = '0' AND inp_sosi.valid = '1' AND q_reg.started = '1' THEN
         v.state := WRITING;
-        v.wr_sosi := inp_sosi;
       ELSIF q_reg.stopped = '1' THEN
         v.state := STOP_READING;
       ELSE
@@ -362,7 +448,6 @@ BEGIN
 
     IF inp_sosi.eop = '1' THEN
       v.started := '1';
-      v.wr_sosi.valid := '1';
     END IF;
 
     d_reg     <= v;
diff --git a/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_input_address_counter.vhd b/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_input_address_counter.vhd
index 1fa66ab59c981b7249f3568a099cde1d3d4c1ba4..874e81e5ea1a12a4dd40c0247d77818f41208549 100644
--- a/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_input_address_counter.vhd
+++ b/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_input_address_counter.vhd
@@ -105,7 +105,7 @@ BEGIN
 
     CASE q_reg.state IS
     WHEN RESET =>
-      v.s_adr := 0;
+      v := c_t_reg_init;
 
       IF q_reg.s_in_sosi.sop = '1' THEN
         v.out_bsn_adr := v.s_adr;
@@ -130,7 +130,7 @@ BEGIN
 
     WHEN IDLE =>
     -- after a reset skip the first data block so the ddr memory can initialize.
-    IF NOT(q_reg.s_in_sosi.bsn(c_dp_stream_bsn_w-1 DOWNTO 0) = in_sosi.bsn(c_dp_stream_bsn_w-1 DOWNTO 0)) THEN
+    IF in_sosi.sop = '1' THEN
       v.bsn_passed := '1';
     END IF;
 
diff --git a/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_input_repack.vhd b/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_input_repack.vhd
index 0a429f473357cbb9bc9b43743d335455e1427949..402f27165fff715b993311c756b8a338b95ab917 100644
--- a/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_input_repack.vhd
+++ b/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_input_repack.vhd
@@ -122,7 +122,7 @@ BEGIN
         v.state := FILL_VECTOR;
       END IF;
 
-      IF NOT (q_reg.q_bsn(c_dp_stream_bsn_w-1 DOWNTO 0) = in_sosi.bsn(c_dp_stream_bsn_w-1 DOWNTO 0)) THEN
+      IF in_sosi.sop = '1' THEN
         v.s_input_cnt := 0;
         v.state := BSN;
       END IF;
@@ -151,7 +151,7 @@ BEGIN
         v.state := FILL_VECTOR;
       END IF;
 
-      IF NOT (q_reg.q_bsn(c_dp_stream_bsn_w-1 DOWNTO 0) = in_sosi.bsn(c_dp_stream_bsn_w-1 DOWNTO 0)) THEN
+      IF in_sosi.sop = '1' THEN
         v.s_input_cnt := 0;
         v.state := BSN;
       END IF;
@@ -182,7 +182,7 @@ BEGIN
         v.state := FILL_VECTOR;
       END IF;
 
-      IF NOT (q_reg.q_bsn(c_dp_stream_bsn_w-1 DOWNTO 0) = in_sosi.bsn(c_dp_stream_bsn_w-1 DOWNTO 0)) THEN
+      IF in_sosi.sop = '1' THEN
         v.s_input_cnt := 0;
         v.state := BSN;
       END IF;
diff --git a/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_output.vhd b/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_output.vhd
index edc789a36a3372b9f4a910beb8ecad45f95ef6d2..5bef382784b11c0051abe598b9f594191e3fbab2 100644
--- a/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_output.vhd
+++ b/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_output.vhd
@@ -52,6 +52,7 @@ ENTITY ddrctrl_output IS
     clk               : IN  STD_LOGIC                               := '0';
     rst               : IN  STD_LOGIC;
     in_sosi           : IN  t_dp_sosi                               := c_dp_sosi_init;              -- input data
+    in_bsn            : IN  STD_LOGIC_VECTOR(c_dp_stream_bsn_w-1 DOWNTO 0);
     out_sosi_arr      : OUT t_dp_sosi_arr(g_nof_streams-1 DOWNTO 0) := (OTHERS => c_dp_sosi_init);  -- output data
     out_ready         : OUT STD_LOGIC
   );
@@ -80,6 +81,7 @@ BEGIN
     clk               => clk,
     rst               => rst,
     in_sosi           => in_sosi,                                                                   -- input data
+    in_bsn            => in_bsn,
     out_sosi          => sosi,                                                                      -- output data
     out_ready         => out_ready
   );
diff --git a/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_output_repack.vhd b/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_output_repack.vhd
index 9c8555f3ea8561de24a5de65de0aeaf88bd57c69..fd2a2c43425cc68e36961da24a6ec62f21b62065 100644
--- a/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_output_repack.vhd
+++ b/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_output_repack.vhd
@@ -50,9 +50,11 @@ BEGIN
 
   -- putting the data from the stream into different streams.
   gen_repack_data : FOR I IN 0 TO g_nof_streams-1 GENERATE
-    out_sosi_arr(I).data(g_data_w-1 DOWNTO 0)          <= in_sosi.data(g_data_w*(I+1)-1 DOWNTO g_data_w*I);
-    out_sosi_arr(I).bsn(c_dp_stream_bsn_w-1 DOWNTO 0)  <= in_sosi.bsn(c_dp_stream_bsn_w-1 DOWNTO 0);
-    out_sosi_arr(I).valid                              <= in_sosi.valid;
+    out_sosi_arr(I).data(g_data_w-1 DOWNTO 0)           <= in_sosi.data(g_data_w*(I+1)-1 DOWNTO g_data_w*I);
+    out_sosi_arr(I).bsn(c_dp_stream_bsn_w-1 DOWNTO 0)   <= in_sosi.bsn(c_dp_stream_bsn_w-1 DOWNTO 0);
+    out_sosi_arr(I).valid                               <= in_sosi.valid;
+    out_sosi_arr(I).sop                                 <= in_sosi.sop;
+    out_sosi_arr(I).eop                                 <= in_sosi.eop;
   END GENERATE;
 
 END rtl;
diff --git a/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_output_unpack.vhd b/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_output_unpack.vhd
index 0951666e6b72fe130b415f6a4226727c7b74df60..64d6caf13618fb20bde78e16fbb0157b899eec0a 100644
--- a/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_output_unpack.vhd
+++ b/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_output_unpack.vhd
@@ -48,6 +48,7 @@ ENTITY ddrctrl_output_unpack IS
     clk             : IN  STD_LOGIC;
     rst             : IN  STD_LOGIC;
     in_sosi         : IN  t_dp_sosi   := c_dp_sosi_init;
+    in_bsn          : IN  STD_LOGIC_VECTOR(c_dp_stream_bsn_w-1 DOWNTO 0);
     out_sosi        : OUT t_dp_sosi   := c_dp_sosi_init;
     out_ready       : OUT STD_LOGIC   := '0'
   );
@@ -163,7 +164,7 @@ BEGIN
       v.dd_fresh := '0';
       v.out_sosi.data(g_out_data_w-1 DOWNTO 0) := v.c_v(g_out_data_w+v.a_of-1 DOWNTO v.a_of);
       v.out_sosi.valid := '1';
-      v.out_sosi.bsn(c_dp_stream_bsn_w-1 DOWNTO 0) := in_sosi.bsn(c_dp_stream_bsn_w-1 DOWNTO 0);
+      v.out_sosi.bsn(c_dp_stream_bsn_w-1 DOWNTO 0) := in_bsn(c_dp_stream_bsn_w-1 DOWNTO 0);
 
       IF in_sosi.valid = '1' THEN
         v.delay_data(g_in_data_w-1 DOWNTO 0) := in_sosi.data(g_in_data_w-1 DOWNTO 0);
diff --git a/applications/lofar2/libraries/ddrctrl/tb/vhdl/tb_ddrctrl.vhd b/applications/lofar2/libraries/ddrctrl/tb/vhdl/tb_ddrctrl.vhd
index 9c0675b7390f6d6e061a3cfd3804a8ad65f9a817..130720661eb7da7403696fe2eeb2bb5e3bfa62c7 100644
--- a/applications/lofar2/libraries/ddrctrl/tb/vhdl/tb_ddrctrl.vhd
+++ b/applications/lofar2/libraries/ddrctrl/tb/vhdl/tb_ddrctrl.vhd
@@ -176,7 +176,7 @@ BEGIN
     -- wr fifo has delay of 4 clockcylces after reset
 
     -- filling the input data vectors with the corresponding numbers
-    run_multiple_times : FOR K in 0 TO 1 LOOP
+    run_multiple_times : FOR K in 0 TO 2 LOOP
       make_data : FOR J IN 0 TO c_bim*g_block_size-1 LOOP
         in_data_cnt     <= in_data_cnt+1;
         fill_in_sosi_arr : FOR I IN 0 TO g_nof_streams-1 LOOP