diff --git a/libraries/base/common/src/vhdl/common_areset.vhd b/libraries/base/common/src/vhdl/common_areset.vhd
index 13c3a2454c660456b76f0b0f3bfc1d6da2f559bb..f6620174e910b77ef095531abae41abfffac06a1 100644
--- a/libraries/base/common/src/vhdl/common_areset.vhd
+++ b/libraries/base/common/src/vhdl/common_areset.vhd
@@ -23,7 +23,8 @@
 -- Purpose: Immediately apply reset and synchronously release it at rising clk
 -- Description:
 --   When in_rst gets asserted, then the out_rst gets asserted immediately (= asynchronous reset apply).
---   When in_rst gets de-assered, then out_rst gets de-asserted after g_delay_len cycles (= synchronous reset release).
+--   When in_rst gets de-assered, then out_rst gets de-asserted after g_delay_len cycles (= synchronous
+--   reset release) + g_tree_len cycles (synchronous reset tree).
 --
 --   The in_rst assert level is set by g_in_rst_level.
 --   The out_rst assert level is set by c_out_rst_level = g_rst_level.
@@ -40,7 +41,8 @@ entity common_areset is
     g_in_rst_level : std_logic := '1';  -- = in_rst level
     g_rst_level    : std_logic := '1';  -- = out_rst level (keep original generic
                                         --   name for backward compatibility)
-    g_delay_len    : natural   := c_meta_delay_len
+    g_delay_len    : natural := c_meta_delay_len;
+    g_tree_len     : natural := c_tree_delay_len
   );
   port (
     in_rst    : in  std_logic;
@@ -50,13 +52,18 @@ entity common_areset is
 end;
 
 architecture str of common_areset is
+  constant c_out_rst_value   : natural   := to_int(g_rst_level);
   constant c_out_rst_level   : std_logic := g_rst_level;
   constant c_out_rst_level_n : std_logic := not g_rst_level;
 
   signal i_rst               : std_logic;
+  signal o_rst               : std_logic;
 begin
   i_rst <= in_rst when g_in_rst_level = '1' else not in_rst;
 
+  -- 2009
+  -- Capture asynchronous reset assertion, to also support i_rst when there is
+  -- no clk.
   u_async : entity work.common_async
   generic map (
     g_rst_level => c_out_rst_level,
@@ -66,6 +73,24 @@ begin
     rst  => i_rst,
     clk  => clk,
     din  => c_out_rst_level_n,
-    dout => out_rst
+    dout => o_rst
+  );
+
+  -- 2024
+  -- Pass on synchronized reset with sufficient g_tree_len to ease timing
+  -- closure by FF duplication in out_rst tree. Keep rst = '0' to break
+  -- combinatorial path with in_rst to ease timing closure in the reset tree
+  -- network. Use g_tree_len = 0 for wire out_rst <= 0_rst, so no reset tree
+  -- as in 2009.
+  u_pipe : entity work.common_pipeline_sl
+  generic map (
+    g_pipeline    => g_tree_len,
+    g_reset_value => c_out_rst_value
+  )
+  port map (
+    rst     => '0',
+    clk     => clk,
+    in_dat  => o_rst,
+    out_dat => out_rst
   );
 end str;