diff --git a/applications/lofar2/libraries/ddrctrl/hdllib.cfg b/applications/lofar2/libraries/ddrctrl/hdllib.cfg
index ba8457f096cdfc6b3e1bbefff4d1fedc16d69766..53fe5f5958c0cf866e1870d4ed11367b023c7df5 100644
--- a/applications/lofar2/libraries/ddrctrl/hdllib.cfg
+++ b/applications/lofar2/libraries/ddrctrl/hdllib.cfg
@@ -9,6 +9,7 @@ synth_files =
     src/vhdl/ddrctrl_input_pack.vhd
     src/vhdl/ddrctrl_input_repack.vhd
     src/vhdl/ddrctrl_input.vhd
+    src/vhdl/ddrctrl_controller.vhd
     src/vhdl/ddrctrl.vhd
 
 test_bench_files =
diff --git a/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl.vhd b/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl.vhd
index 30daea0b17a4df52370db092ee7762949c0de007..e24344df83a4fc634179dea7d83932802c79b93f 100644
--- a/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl.vhd
+++ b/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl.vhd
@@ -59,8 +59,7 @@ ENTITY ddrctrl IS
     mm_rst            : IN  STD_LOGIC                                       := '0';
     in_sosi_arr       : IN  t_dp_sosi_arr;                                                                                    -- input data
     wr_not_rd         : IN  STD_LOGIC                                       := '0';
-    out_of            : OUT NATURAL;                                                                                          -- amount of internal overflow this output
-    out_adr           : OUT NATURAL;
+    stop_in           : IN  STD_LOGIC                                       := '0';
 
 
     term_ctrl_out     : OUT   t_tech_ddr3_phy_terminationcontrol;
@@ -87,12 +86,14 @@ ARCHITECTURE str OF ddrctrl IS
   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
 
   -- signals for connecting the components
-  SIGNAL    adr          : NATURAL                                          := 0;
   SIGNAL    ctrl_clk     : STD_LOGIC;
   SIGNAL    ctrl_rst     : STD_LOGIC;
+  SIGNAL    out_of       : NATURAL                                          := 0;
+  SIGNAL    out_sosi     : t_dp_sosi                                        := c_dp_sosi_init;
+  SIGNAL    out_adr      : NATURAL                                          := 0;
+  SIGNAL    dvr_mosi     : t_mem_ctlr_mosi                                  := c_mem_ctlr_mosi_rst;
   SIGNAL    wr_sosi      : t_dp_sosi                                        := c_dp_sosi_init;
   SIGNAL    rd_siso      : t_dp_siso                                        := c_dp_siso_rst;
-  SIGNAL    dvr_mosi     : t_mem_ctlr_mosi;
 
 
 BEGIN
@@ -111,8 +112,8 @@ BEGIN
     rst                       => rst,
     in_sosi_arr               => in_sosi_arr,
     out_of                    => out_of,
-    out_sosi                  => wr_sosi,
-    out_adr                   => adr
+    out_sosi                  => out_sosi,
+    out_adr                   => out_adr
   );
 
   -- functions as a fifo buffer for input data into the sdram stick. also manages input to sdram stick.
@@ -189,4 +190,24 @@ BEGIN
     phy4_ou                   => phy4_ou
   );
 
+  -- controller of ddrctrl
+  u_ddrctrl_controller : ENTITY work.ddrctrl_controller
+  GENERIC MAP(
+    g_tech_ddr                => g_tech_ddr
+  )
+  PORT MAP(
+  clk                         => clk,
+  rst                         => rst,
+  
+  out_of                      => out_of,
+  out_sosi                    => out_sosi,
+  out_adr                     => out_adr,
+
+  dvr_mosi                    => dvr_mosi,
+  wr_sosi                     => wr_sosi,
+  rd_siso                     => rd_siso,
+
+  stop_in                     => stop_in
+  );
+
 END str;
diff --git a/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_controller.vhd b/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_controller.vhd
index b517bdf4d2029d3ac159b409c4e708c054ac1f8f..4a86d593bc4239b8c62c08551e5fcae927eead35 100644
--- a/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_controller.vhd
+++ b/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_controller.vhd
@@ -27,15 +27,18 @@
 --  https://support.astron.nl/confluence/display/SBe/VHDL+design+patterns+for+RTL+coding
 --  
 
-LIBRARY IEEE, dp_lib;
+LIBRARY IEEE, dp_lib, common_lib, tech_ddr_lib;
 USE IEEE.std_logic_1164.ALL;
 USE IEEE.numeric_std.ALL;
 USE dp_lib.dp_stream_pkg.ALL;
+USE common_lib.common_mem_pkg.ALL;
+USE common_lib.common_pkg.ALL;
+USE tech_ddr_lib.tech_ddr_pkg.ALL;
 
 
 ENTITY ddrctrl_controller IS
   GENERIC (
-    g_max_adr	: NATURAL;
+    g_tech_ddr  : t_c_tech_ddr
   );
   PORT (
     clk	     	  : IN  STD_LOGIC;
@@ -52,7 +55,7 @@ ENTITY ddrctrl_controller IS
     rd_siso     : OUT t_dp_siso;
 
     -- ddrctrl
-    stop_in	    : IN  STD_LOGIC;
+    stop_in	    : IN  STD_LOGIC
   );
 END ddrctrl_controller;
 
@@ -69,13 +72,20 @@ ARCHITECTURE rtl OF ddrctrl_controller IS
 
   -- record for readability
   TYPE t_reg IS RECORD
-  state                     : t_state;                                                                                                        -- the state the process is currently in;
+  -- state of program
+  state                     : t_state;
+
+  -- signals
+  stop_adr                  : NATURAL;
+  stopped                   : STD_LOGIC;
+
+  -- output
   dvr_mosi                  : t_mem_ctlr_mosi;
   wr_sosi                   : t_dp_sosi;
   rd_siso                   : t_dp_siso;
   END RECORD;
 
-  CONSTANT c_t_reg_init     : t_reg         := (RESET, c_mem_ctlr_mosi_init, c_dp_sosi_init, c_dp_siso_rst);
+  CONSTANT c_t_reg_init     : t_reg         := (RESET, 0, '0', c_mem_ctlr_mosi_rst, c_dp_sosi_init, c_dp_siso_rst);
 
 
   -- signals for readability
@@ -87,77 +97,67 @@ BEGIN
   q_reg <= d_reg WHEN rising_edge(clk);
 
   -- put the input data into c_v and fill the output vector from c_v
-  p_state : PROCESS(q_reg, rst)
+  p_state : PROCESS(q_reg, rst, out_of, out_sosi, out_adr)
 
     VARIABLE v                : t_reg;
 
   BEGIN
 
     v := q_reg;
-
     CASE q_reg.state IS
-    WHEN RESET =>
-      v := c_t_reg_init;
-
-    WHEN 
-
-    END CASE;
-
-
-
-
-
-
-
-
-
-
 
 
 
+    WHEN RESET =>
+      v := c_t_reg_init;
 
 
 
-  p_burst : PROCESS(adr)
-  BEGIN
-    IF TO_UVEC(adr, c_adr_w)(c_bitshift_adr-1 DOWNTO 0) = c_zeros THEN
-      dvr_mosi.burstbegin <= '1';
-      IF adr = 0 THEN
-        dvr_mosi.address    <= TO_UVEC(c_max_adr-c_burstsize, dvr_mosi.address'length);
+    WHEN WRITING =>
+      IF TO_UVEC(out_adr, c_adr_w)(c_bitshift_adr-1 DOWNTO 0) = c_zeros THEN                        -- if adr mod 64 = 0
+        v.dvr_mosi.burstbegin := '1';
+        IF out_adr = 0 THEN
+          v.dvr_mosi.address    := TO_UVEC(c_max_adr-c_burstsize, dvr_mosi.address'length);
+        ELSE
+          v.dvr_mosi.address    := TO_UVEC(out_adr-c_burstsize, dvr_mosi.address'length);
+        END IF;
       ELSE
-        dvr_mosi.address    <= TO_UVEC(adr-c_burstsize, dvr_mosi.address'length);
+        v.dvr_mosi.burstbegin := '0';
       END IF;
-    ELSE
-      dvr_mosi.burstbegin <= '0';
-    END IF;
-  END PROCESS;
-
-  dvr_mosi.burstsize  <= TO_UVEC(c_burstsize, dvr_mosi.burstsize'length);
-  dvr_mosi.wr         <= wr_not_rd;
-  dvr_mosi.rd         <= NOT wr_not_rd;
-
+    v.dvr_mosi.burstsize  := TO_UVEC(c_burstsize, dvr_mosi.burstsize'length);
+    v.dvr_mosi.wr         := '1';
+    v.dvr_mosi.rd         := '0';
 
 
 
+    WHEN STOP_WRITING =>
+      IF (out_adr + (c_max_adr / 2)  >= c_max_adr) THEN
+        v.stop_adr := out_adr - (c_max_adr / 2);
+      ELSE
+        v.stop_adr := out_adr + (c_max_adr / 2);
+      END IF;
+      IF (stop_in = '1' AND out_adr = v.stop_adr) THEN
+        --stop_out <= '1';
+        v.dvr_mosi.address := TO_UVEC(out_adr, dvr_mosi.address'length);
+      ELSE
+        --stop_out <= '0';
+      END IF;
 
 
 
+    WHEN OTHERS =>
+      v := c_t_reg_init;
 
 
-  IF rising_edge(stop_in) THEN
-    IF (current_adr + (g_max_adr / 2)  >= g_max_adr)
-      adr <= current_adr - (g_max_adr / 2);
-    ELSE
-      adr <= current_adr + (g_max_adr / 2);
 
-  current_adr : PROCESS(current_adr)
-  BEGIN
+    END CASE;
 
-    IF (stop_in = '1' AND current_adr = adr) THEN
-      stop_out <= '1';
-      adr_out = current_adr;
+    IF rst = '1' THEN
+      v.state := RESET;
+    ELSIF stop_in = '1' THEN
+      v.state := STOP_WRITING;
     ELSE
-      stop_out <= '0';
+      v.state := WRITING;
     END IF;
   END PROCESS;
 END rtl;
diff --git a/applications/lofar2/libraries/ddrctrl/tb/vhdl/tb_ddrctrl.vhd b/applications/lofar2/libraries/ddrctrl/tb/vhdl/tb_ddrctrl.vhd
index 6c13daed698e9128bda0ace8391784f9a6d14d8d..1c0f45653e7e0d4613a98d6b8509b6ab06c08d4a 100644
--- a/applications/lofar2/libraries/ddrctrl/tb/vhdl/tb_ddrctrl.vhd
+++ b/applications/lofar2/libraries/ddrctrl/tb/vhdl/tb_ddrctrl.vhd
@@ -170,8 +170,6 @@ BEGIN
     mm_rst            => mm_rst,
     in_sosi_arr       => in_sosi_arr,
     wr_not_rd         => wr_not_rd,
-    out_of            => open,
-    out_adr           => open,
 
     --PHY
     phy3_io           => phy3_io,