diff --git a/libraries/base/common/hdllib.cfg b/libraries/base/common/hdllib.cfg
index c7c3d8323ed975947cecfff9b124f78a0391aa0a..b8178c2f191ea6d0b50e74e57a2595f43f04ab54 100644
--- a/libraries/base/common/hdllib.cfg
+++ b/libraries/base/common/hdllib.cfg
@@ -128,6 +128,9 @@ synth_files =
     src/vhdl/common_bit_delay.vhd
     src/vhdl/common_delay.vhd
     src/vhdl/common_shiftram.vhd
+
+    src/vhdl/common_variable_delay.vhd
+    src/vhdl/mms_common_variable_delay.vhd
     
     src/vhdl/mms_common_reg.vhd
     src/vhdl/mms_common_stable_monitor.vhd
@@ -186,6 +189,8 @@ test_bench_files =
     tb/vhdl/tb_common_transpose.vhd
     tb/vhdl/tb_common_transpose_symbol.vhd
     tb/vhdl/tb_common_zip.vhd
+    tb/vhdl/tb_common_variable_delay.vhd
+    tb/vhdl/tb_mms_common_variable_delay.vhd
     tb/vhdl/tb_requantize.vhd
     tb/vhdl/tb_resize.vhd
     tb/vhdl/tb_round.vhd
@@ -212,6 +217,7 @@ regression_test_vhdl =
     tb/vhdl/tb_common_shiftram.vhd
     tb/vhdl/tb_common_shiftreg.vhd
     tb/vhdl/tb_common_transpose_symbol.vhd
+    tb/vhdl/tb_common_variable_delay.vhd
     tb/vhdl/tb_resize.vhd
     #tb/vhdl/tb_round.vhd           -- has no self verification yet
     tb/vhdl/tb_requantize.vhd
diff --git a/libraries/base/common/src/vhdl/common_variable_delay.vhd b/libraries/base/common/src/vhdl/common_variable_delay.vhd
new file mode 100644
index 0000000000000000000000000000000000000000..847bb54e531d2bc300783c1f2431f25fcef1b97f
--- /dev/null
+++ b/libraries/base/common/src/vhdl/common_variable_delay.vhd
@@ -0,0 +1,92 @@
+-- --------------------------------------------------------------------------
+-- Copyright 2020
+-- 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:
+-- . Pieter Donker
+-- Purpose:
+-- . Delay input pulse by number of given delay cycles
+-- Description:
+-- . delay input pulse by delay number of cycles
+-- . output pulse is derived from low-high transition of input pulse.
+-- . the actual pulse delay will be delay + 1, due to implementation latency of 1 clk cycle
+-- --------------------------------------------------------------------------
+
+LIBRARY IEEE, technology_lib;
+USE IEEE.STD_LOGIC_1164.ALL;
+USE work.common_pkg.ALL;
+
+ENTITY common_variable_delay IS
+  GENERIC (
+    g_max_delay : NATURAL := 200 * 10**6
+  );
+  PORT (
+    rst        : IN  STD_LOGIC;
+    clk        : IN  STD_LOGIC;
+
+    delay      : IN  NATURAL RANGE 0 TO g_max_delay := 0;
+    enable     : IN  STD_LOGIC := '0';
+    in_val     : IN  STD_LOGIC;
+    out_val    : OUT STD_LOGIC
+  );
+END common_variable_delay;
+
+ARCHITECTURE rtl OF common_variable_delay IS
+
+  SIGNAL i_out_val       : STD_LOGIC;
+  SIGNAL nxt_out_val     : STD_LOGIC;
+  SIGNAL delay_cnt       : NATURAL;
+  SIGNAL nxt_delay_cnt   : NATURAL;
+  SIGNAL prev_in_val     : STD_LOGIC;
+
+BEGIN
+  out_val <= i_out_val;
+  
+  p_delay: PROCESS(enable, in_val, prev_in_val, delay, delay_cnt)
+  BEGIN
+    nxt_out_val   <= '0';
+    nxt_delay_cnt <= 0; 
+    
+    IF enable = '1' THEN
+      IF in_val = '1' AND prev_in_val = '0' THEN  -- detect rising edge of in_val
+        IF delay = 0 THEN
+          nxt_out_val <= '1';
+        END IF;
+      ELSE
+        nxt_delay_cnt <= delay_cnt + 1;
+        IF delay_cnt+1 = delay THEN
+          nxt_out_val <= '1';
+        END IF;
+      END IF;  
+    END IF;
+  END PROCESS; 
+
+  p_clk : PROCESS(rst, clk)
+  BEGIN
+    IF rst = '1' THEN
+      i_out_val   <= '0';
+      delay_cnt   <= 0;
+      prev_in_val <= '0';
+    ELSIF rising_edge(clk) THEN
+      i_out_val   <= nxt_out_val;
+      delay_cnt   <= nxt_delay_cnt;
+      prev_in_val <= in_val;
+    END IF;
+  END PROCESS;
+
+END rtl;
diff --git a/libraries/base/common/src/vhdl/mms_common_variable_delay.vhd b/libraries/base/common/src/vhdl/mms_common_variable_delay.vhd
new file mode 100644
index 0000000000000000000000000000000000000000..ed05567afea3e20e1cc29ab8bb00c9f48a765e50
--- /dev/null
+++ b/libraries/base/common/src/vhdl/mms_common_variable_delay.vhd
@@ -0,0 +1,92 @@
+-- --------------------------------------------------------------------------
+-- Copyright 2020
+-- 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:
+-- . Pieter Donker
+-- Purpose:
+-- . mm interface for common_variable_delay.vhd to enable output
+-- Description:
+-- . see common_variable_delay.vhd
+-- --------------------------------------------------------------------------
+
+LIBRARY IEEE;
+USE IEEE.std_logic_1164.ALL;
+USE IEEE.numeric_std.ALL;
+USE work.common_pkg.ALL;
+USE work.common_mem_pkg.ALL;
+
+ENTITY mms_common_variable_delay IS
+  PORT (
+    mm_rst          : IN  STD_LOGIC;
+    mm_clk          : IN  STD_LOGIC;
+    dp_rst          : IN  STD_LOGIC := '0';
+    dp_clk          : IN  STD_LOGIC;
+
+    -- MM interface
+    reg_enable_mosi : IN  t_mem_mosi := c_mem_mosi_rst;
+    reg_enable_miso : OUT t_mem_miso;
+
+    delay           : IN  NATURAL := 0;
+    trigger         : IN  STD_LOGIC := '0';
+    trigger_dly     : OUT STD_LOGIC
+  );
+END mms_common_variable_delay;
+
+
+ARCHITECTURE rtl OF mms_common_variable_delay IS
+  
+  CONSTANT c_enable_mem_reg : t_c_mem := (c_mem_reg_rd_latency, 1, 1, 1, '0');
+  
+  SIGNAL enable_reg : STD_LOGIC_VECTOR(c_enable_mem_reg.dat_w*c_enable_mem_reg.nof_dat-1 DOWNTO 0);
+
+  SIGNAL enable : STD_LOGIC := '0';
+
+BEGIN
+  enable <= sl(enable_reg);
+  
+  -- device under test
+  u_dut : ENTITY work.common_variable_delay
+  PORT MAP (
+    rst     => dp_rst,
+    clk     => dp_clk,
+
+    delay   => delay,
+    enable  => enable,
+    in_val  => trigger,
+    out_val => trigger_dly
+  );
+
+  u_mms_common_reg : ENTITY work.mms_common_reg
+  GENERIC MAP (
+    g_mm_reg       => c_enable_mem_reg
+  )
+  PORT MAP (
+    mm_rst         => mm_rst,
+    mm_clk         => mm_clk,
+    st_rst         => dp_rst,
+    st_clk         => dp_clk,
+
+    reg_mosi       => reg_enable_mosi,
+    reg_miso       => reg_enable_miso,
+
+    in_reg         => enable_reg,
+    out_reg        => enable_reg   
+  );
+
+END;
\ No newline at end of file
diff --git a/libraries/base/common/tb/vhdl/tb_common_variable_delay.vhd b/libraries/base/common/tb/vhdl/tb_common_variable_delay.vhd
new file mode 100644
index 0000000000000000000000000000000000000000..8e91b07b721c6b83b4b9ecf236eb27fa77624b20
--- /dev/null
+++ b/libraries/base/common/tb/vhdl/tb_common_variable_delay.vhd
@@ -0,0 +1,112 @@
+-- --------------------------------------------------------------------------
+-- Copyright 2020
+-- 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:
+-- . Pieter Donker
+-- Purpose:
+-- . test bench for common_variable_delay.vhd
+-- Description:
+-- . see common_variable_delay
+-- --------------------------------------------------------------------------
+
+
+LIBRARY IEEE;
+USE IEEE.std_logic_1164.ALL;
+USE IEEE.numeric_std.ALL;
+USE work.common_pkg.ALL;
+USE work.common_str_pkg.ALL;
+USE work.tb_common_pkg.ALL;
+
+ENTITY tb_common_variable_delay IS
+END tb_common_variable_delay;
+
+ARCHITECTURE tb OF tb_common_variable_delay IS
+
+  CONSTANT c_clk_period       : TIME    := 10 ns;
+  CONSTANT c_trigger_interval : NATURAL := 40;  -- in clk's
+  CONSTANT c_trigger_latency  : NATURAL := 1;  -- in clk's
+  CONSTANT c_delay_arr        : t_natural_arr(0 TO 3) := (0, 1, 3, 12);
+  
+  SIGNAL tb_end : STD_LOGIC := '0';
+  SIGNAL rst    : STD_LOGIC;
+  SIGNAL clk    : STD_LOGIC := '0';
+  
+  SIGNAL delay       : NATURAL   := 0;
+  SIGNAL enable      : STD_LOGIC := '0';
+  SIGNAL trigger     : STD_LOGIC := '0';
+  SIGNAL trigger_dly : STD_LOGIC := '0';
+BEGIN
+
+  clk <= (NOT clk) OR tb_end AFTER c_clk_period/2;
+  rst <= '1', '0' AFTER c_clk_period*4;
+
+  -- generate trigger signal
+  proc_common_gen_pulse(c_trigger_interval/2, c_trigger_interval, '1', rst, clk, trigger);
+
+  p_in_stimuli : PROCESS
+  VARIABLE clk_cnt : NATURAL := 0;
+  BEGIN
+    delay  <= 0;
+    enable <= '0';
+    
+    WAIT UNTIL rst = '0';
+    WAIT UNTIL rising_edge(clk);
+    
+    -- If enable = 0, no trigger_dly is expected, see wave-window
+    proc_common_wait_some_cycles(clk, 50);
+
+    
+    enable <= '1';
+    -- enable trigger output and count clk's between trigger lo-hi and trigger_dly lo-hi
+    -- check if counted clk's = c_trigger_latency + delay 
+    FOR i IN c_delay_arr'RANGE LOOP
+      delay <= c_delay_arr(i);
+      clk_cnt := 0;
+      proc_common_wait_until_lo_hi(clk, trigger);
+      WHILE trigger_dly = '0' LOOP
+        clk_cnt := clk_cnt + 1;
+        proc_common_wait_some_cycles(clk, 1);
+      END LOOP;
+      ASSERT clk_cnt = c_trigger_latency + delay REPORT "delay failure, got " & int_to_str(clk_cnt) & ", expect " & int_to_str(c_trigger_latency+delay) SEVERITY ERROR; 
+      proc_common_wait_some_cycles(clk, 10);
+    END LOOP;
+    
+    enable <= '0';
+    proc_common_wait_some_cycles(clk, 10);
+
+
+    tb_end <= '1';    
+    WAIT;
+  END PROCESS;
+
+  -- device under test
+  u_dut : ENTITY work.common_variable_delay
+  PORT MAP (
+    rst     => rst,
+    clk     => clk,
+
+    delay   => delay,
+    enable  => enable,
+    in_val  => trigger,
+    out_val => trigger_dly
+  );
+      
+END tb;
+
+
diff --git a/libraries/base/common/tb/vhdl/tb_mms_common_variable_delay.vhd b/libraries/base/common/tb/vhdl/tb_mms_common_variable_delay.vhd
new file mode 100644
index 0000000000000000000000000000000000000000..39d08e87c644510a4d667ccc4a25de279487df3a
--- /dev/null
+++ b/libraries/base/common/tb/vhdl/tb_mms_common_variable_delay.vhd
@@ -0,0 +1,111 @@
+-- --------------------------------------------------------------------------
+-- Copyright 2020
+-- 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:
+-- . Pieter Donker
+-- Purpose:
+-- . test bench for mms_common_variable_delay.vhd to test enable by signal mm interface
+-- Description:
+-- . see common_variable_delay.vhd
+-- . Only verifies mm control of enable.
+-- . Detailde verification of trigger has been done already in tb_common_variable_delay.vhd.
+-- . Here it is sufficient to use Wave window to view effect of enable on trigger.
+-- --------------------------------------------------------------------------
+
+LIBRARY IEEE;
+USE IEEE.std_logic_1164.ALL;
+USE IEEE.numeric_std.ALL;
+USE work.common_pkg.ALL;
+USE work.common_str_pkg.ALL;
+USE work.tb_common_pkg.ALL;
+USE work.common_mem_pkg.ALL;
+USE work.tb_common_mem_pkg.ALL; 
+
+ENTITY tb_mms_common_variable_delay IS
+END tb_mms_common_variable_delay;
+
+ARCHITECTURE tb OF tb_mms_common_variable_delay IS
+  CONSTANT c_clk_period       : TIME    := 10 ns;
+  CONSTANT c_trigger_interval : NATURAL := 40;  -- in clk's
+  CONSTANT c_mm_addr_enable   : NATURAL := 0;
+  CONSTANT c_cross_clock_domain_latency : NATURAL := 40;
+  
+  SIGNAL tb_end : STD_LOGIC := '0';
+  SIGNAL rst    : STD_LOGIC;
+  SIGNAL clk    : STD_LOGIC := '0';
+  
+  SIGNAL delay       : NATURAL   := 0;
+  SIGNAL trigger     : STD_LOGIC := '0';
+  SIGNAL trigger_dly : STD_LOGIC := '0';
+
+  SIGNAL mm_mosi     : t_mem_mosi := c_mem_mosi_rst;
+  SIGNAL mm_miso     : t_mem_miso;
+
+  SIGNAL enable      : NATURAL;
+BEGIN
+  clk <= (NOT clk) OR tb_end AFTER c_clk_period/2;
+  rst <= '1', '0' AFTER c_clk_period*4;
+
+  p_mm_stimuli : PROCESS
+  BEGIN
+    WAIT UNTIL rst='0';
+    proc_common_wait_some_cycles(clk, 10);
+     
+    proc_mem_mm_bus_wr(c_mm_addr_enable, 1, clk, mm_miso, mm_mosi);
+    proc_common_wait_some_cycles(clk, c_cross_clock_domain_latency);
+    proc_mem_mm_bus_rd(c_mm_addr_enable, clk, mm_miso, mm_mosi);
+    proc_mem_mm_bus_rd_latency(1, clk);
+    enable <= TO_UINT(mm_miso.rddata(1 DOWNTO 0));
+    proc_common_wait_some_cycles(clk, 1);
+    ASSERT enable = 1 REPORT "enable not on" SEVERITY ERROR;
+
+    proc_mem_mm_bus_wr(c_mm_addr_enable, 0, clk, mm_miso, mm_mosi);
+    proc_common_wait_some_cycles(clk, c_cross_clock_domain_latency);
+    proc_mem_mm_bus_rd(c_mm_addr_enable, clk, mm_miso, mm_mosi);
+    proc_mem_mm_bus_rd_latency(1, clk);
+    enable <= TO_UINT(mm_miso.rddata(0 DOWNTO 0));
+    proc_common_wait_some_cycles(clk, 1);
+    ASSERT enable = 0 REPORT "enable not off" SEVERITY ERROR;
+
+    proc_common_wait_some_cycles(clk, 100);
+    tb_end <= '1';
+    WAIT;
+  END PROCESS;
+
+  -- generate trigger signal
+  proc_common_gen_pulse(c_trigger_interval/2, c_trigger_interval, '1', rst, clk, trigger);
+
+  -- device under test
+  u_dut : ENTITY work.mms_common_variable_delay
+  PORT MAP (
+    mm_rst     => rst,
+    mm_clk     => clk,
+    dp_rst     => rst,
+    dp_clk     => clk,
+
+    reg_enable_mosi => mm_mosi,
+    reg_enable_miso => mm_miso,
+
+    delay       => delay,
+    trigger     => trigger,
+    trigger_dly => trigger_dly
+  );
+      
+END tb;
+