diff --git a/libraries/base/mm/src/vhdl/mm_bus.vhd b/libraries/base/mm/src/vhdl/mm_bus.vhd
index f87ae906eba7d56abf134ab27ac92c16efe0f8ca..75e5fdb98f91ec73e48e377923e3873a22a784dd 100644
--- a/libraries/base/mm/src/vhdl/mm_bus.vhd
+++ b/libraries/base/mm/src/vhdl/mm_bus.vhd
@@ -22,74 +22,17 @@
 -- 
 -- Author: E. Kooistra
 -- Purpose: Connect a single MM master interface to a list of MM slave
---          interfaces
+--          interfaces using mm_bus_pipe.
 -- Description:
--- * MM bus
---   The mm_bus creates a memory mapped (MM) bus that connects read
---   and write accesses from the master interface to the addressed slave
---   interface. There is one master that controls the bus and there are
---   g_nof_slaves on the bus. Per slave the start address and address span
---   have to be specified via g_base_arr and g_width_arr.
---
--- * Slave allocation
---   The slaves have to be located on the bus such that the MSbits of the 
---   global address can be used to select the slave and the LSbits of the
---   global address can directly be used to select the address within the 
---   slave. Therefore:
---   . The width of a slave is the power of 2 that fits the address range of
---     the slave.
---   . The span of a slave is 2**width.
---   . The base address of a slave has to be a power of 2 multiple of the
---     slave span.
---
--- * The mm_clk is only used when there is a slave with read latency > 0 or
---   when the MM bus uses pipelining.
+--   In addition to mm_bus_pipe this mm_bus takes care of:
+--   - not connected slaves
+--   - slaves that do not need flow control
+-- 
+--   * MM bus --> see mm_bus_comb
+--   * Slave allocation --> see mm_bus_comb
+--   * Read latency --> see mm_bus_comb
+--   * Pipelining --> see mm_bus_pipe
 --
--- * Read latency
---   For read accesses a slave will typically have a read latency > 0, which
---   means that when the rd and address are active, then it takes read
---   latency number of clock cycles until the rddata becomes available. The
---   read latency can be specified per slave via g_rd_latency_arr.
---   The index_pipeline is used to support that a new wr access or rd access
---   can already start, while a current rd access still has to finish with
---   a rdval. Without the index_pipeline the master would have to wait with
---   a new rd or wr access to another slave until the read response from the
---   current slave has finished.
---                                          ________
---                                          | pipe |
---   master_mosi.address[h:w] = index --+-->| line |--\
---                                      |   |______|  |
---                                      |             |
---                                      v             |
---    master_mosi --> slave_mosi_arr.wr[ ]----------------> slave_mosi_arr
---                                   rd               |
---                                                    v
---    master_miso <--------------------slave_miso_arr[ ]<-- slave_miso_arr
---   
--- * Pipelining
---   Default the common_mm_bus is combinatorial, so there is no pipelining
---   between the master interface and the slave interfaces. If possible do not
---   use pipelining of mosi and miso to avoid increasing the read latency and
---   achieve timing closure by lower clock rate for the MM bus. Pipelining the
---   MM bus can be necessary to achieve timing closure:
---   . g_pipeline_mosi
---     Pipelining mosi write accesses introduces an extra latency from master
---     to slave, which is typically not a problem. Pipelining mosi read
---     accesses increases the read latency between accessing the slave and
---     getting the rddata. Using a different pipelining for the wr and the rd
---     pulse would yield a different pipelining of the address for write and
---     for read, which is akward. Therefore assume that both mosi write and
---     mosi read have the same pipelining.
---   . g_pipeline_miso_rdval
---     Pipelining the miso read data increases the read latency.
---   . g_pipeline_miso_wait
---     Pipelining the miso waitrequest increases the write and read latency
---     for slaves that need MM flow control.
---   The total write latency from master to slave is c_pipeline_mosi.
---   The total read latency from master via slave back to master is
---   c_pipeline_mosi + g_rd_latency_arr of the selected slave + 
---   c_pipeline_miso_rdval. 
---     
 -- Usage:
 --   The ascii drawing shows how this mm_bus can be used in combination
 --   with other MM bus components to create an memory mapped bus:
@@ -122,36 +65,15 @@
 --     based on a set of MM slave ports described in YAML configuration
 --     files.
 -- 
--- Limitations:
--- * A limitation is that if one slave has a read latency of 2 and another
---   slave has a read latency of 1 then it is not possible to access them
---   without a gap of 1 mm_clk cycle, because the rdval will then be active
---   simultaneously from both slaves. Therefore the master can only use
---   random read access between slaves if all slaves have the same read
---   latency. For slaves that have larger read latency the master must
---   insert an gap, before it can read a slave that has less read latency.
---   An alternative workaround would be to use the same read latency for all
---   slaves on the bus, by pipelining the miso.rd, rddata for MM slaves that
---   have a smaller read latency.
--- * No support yet for g_pipeline_miso_wait = TRUE. This requires an MM
---   latency adapter for the mosi dependent on the miso.waitrequest.
+-- Limitations --> see mm_bus_comb
 --
 -- Todo:
 -- * The mm_bus assumes that the MM slave will pull miso.waitrequest low.
 --   To avoid that the MM bus accesss will stall, a MM slave port that uses
---   mosi flow control should also support an waitrequest timeout mechanism.
+--   mosi flow control should also support a waitrequest timeout mechanism.
 --   The master can then be informed about the failing mosi access using
---   the miso.response field of the Avalon bus.
---
--- Remarks:
--- . The mm_bus resembles common_mem_mux, but the difference is that
---   with common_mem_mux all slaves have the same address range and are
---   spaced without address gaps. It is possible to use common_mem_mux in
---   series with mm_bus to provide hierarchy by reprensenting an array
---   of slave ports via a single slave port on the MM bus.
--- . In simulation selecting an unused element address will cause a simulation
---   failure. Therefore the element index is only accepted when it is in the
---   0 TO g_nof_slaves-1 range.
+--   the miso.response field of the Avalon bus. Such a timeout mechanism
+--   could also be supported via mm_slave_enable.
 --
 -------------------------------------------------------------------------------
 
@@ -167,11 +89,13 @@ ENTITY mm_bus IS
     g_base_arr            : t_nat_natural_arr;  -- Address base per slave
     g_width_arr           : t_nat_natural_arr;  -- Address width per slave
     g_rd_latency_arr      : t_nat_natural_arr;  -- Read latency per slave
+    g_waitrequest_arr     : t_nat_boolean_arr;  -- Enable waitrequest flow control per slave, else fixed '0'
     g_pipeline_mosi       : BOOLEAN := FALSE;   -- Pipeline MM access (wr, rd)
     g_pipeline_miso_rdval : BOOLEAN := FALSE;   -- Pipeline MM read (rdval)
     g_pipeline_miso_wait  : BOOLEAN := FALSE    -- Pipeline MM access flow control (waitrequest)
   );
   PORT (
+    mm_rst         : IN  STD_LOGIC := '0';
     mm_clk         : IN  STD_LOGIC := '0';
     master_mosi    : IN  t_mem_mosi;
     master_miso    : OUT t_mem_miso;
@@ -180,117 +104,53 @@ ENTITY mm_bus IS
   );
 END mm_bus;
 
-ARCHITECTURE rtl OF mm_bus IS
-  
-  -- Determine the address range of all slaves on the MM bus.
-  FUNCTION func_derive_mm_bus_addr_w(g_base_arr, g_width_arr : t_nat_natural_arr) RETURN NATURAL IS
-    VARIABLE v_base            : NATURAL := 0;
-    VARIABLE v_width           : NATURAL;
-    VARIABLE v_mm_bus_addr_max : NATURAL;
-  BEGIN
-    FOR I IN g_base_arr'RANGE LOOP
-      IF g_base_arr(I) > v_base THEN
-        v_base  := g_base_arr(I);
-        v_width := g_width_arr(I);
-      END IF;
-    END LOOP;
-    -- Largest base address + the width of the slave at this address - 1. The
-    -- -1 is because the addresses count from 0 to N-1.
-    v_mm_bus_addr_max := v_base + 2**v_width - 1;
-    -- Return number of bits to represent the largest address that will be used
-    -- on the MM bus
-    RETURN ceil_log2(v_mm_bus_addr_max);
-  END;
+ARCHITECTURE str OF mm_bus IS
   
-  CONSTANT c_mm_bus_addr_w       : NATURAL := func_derive_mm_bus_addr_w(g_base_arr, g_width_arr);
-  CONSTANT c_pipeline_mosi       : NATURAL := sel_a_b(g_pipeline_mosi, 1, 0);
-  CONSTANT c_pipeline_miso_rdval : NATURAL := sel_a_b(g_pipeline_miso_rdval, 1, 0);
-  CONSTANT c_pipeline_miso_wait  : NATURAL := sel_a_b(g_pipeline_miso_wait, 1, 0);
-  CONSTANT c_index_latency_max   : NATURAL := c_pipeline_mosi + largest(g_rd_latency_arr);
-
-  SIGNAL index_pipeline      : t_nat_natural_arr(0 TO c_index_latency_max) := (OTHERS=>0);
-  SIGNAL slave_mosi_arr_comb : t_mem_mosi_arr(0 TO g_nof_slaves-1) := (OTHERS=>c_mem_mosi_rst);
-  SIGNAL slave_mosi_arr_reg  : t_mem_mosi_arr(0 TO g_nof_slaves-1) := (OTHERS=>c_mem_mosi_rst);
-  SIGNAL master_miso_comb    : t_mem_miso := c_mem_miso_rst;
-  SIGNAL master_miso_reg     : t_mem_miso := c_mem_miso_rst;
+  SIGNAL bus_mosi_arr   : t_mem_mosi_arr(0 TO g_nof_slaves-1); 
+  SIGNAL bus_miso_arr   : t_mem_miso_arr(0 TO g_nof_slaves-1);
 
 BEGIN
 
-  gen_single : IF g_nof_slaves=1 GENERATE 
-    slave_mosi_arr(0) <= master_mosi;
-    master_miso       <= slave_miso_arr(0);
+  -- MM bus
+  u_mm_bus_pipe : ENTITY work.mm_bus_pipe
+  GENERIC MAP (
+    g_nof_slaves          => g_nof_slaves,
+    g_base_arr            => g_base_arr,
+    g_width_arr           => g_width_arr,
+    g_rd_latency_arr      => g_rd_latency_arr,
+    g_waitrequest_arr     => g_waitrequest_arr,
+    g_pipeline_mosi       => g_pipeline_mosi,
+    g_pipeline_miso_rdval => g_pipeline_miso_rdval,
+    g_pipeline_miso_wait  => g_pipeline_miso_wait
+  )
+  PORT MAP (
+    mm_rst         => mm_rst,
+    mm_clk         => mm_clk,
+    master_mosi    => master_mosi,
+    master_miso    => master_miso,
+    slave_mosi_arr => bus_mosi_arr,
+    slave_miso_arr => bus_miso_arr
+  );
+  
+  -- The MM bus interface with the MM slaves
+  gen_slave_ports : FOR I IN 0 TO g_nof_slaves-1 GENERATE
+    -- Rewire not connected slaves and slave that do not need mosi flow control via miso.waitrequest
+    u_slave_enable : ENTITY work.mm_slave_enable
+    GENERIC MAP (
+      g_enable       => TRUE,
+      g_waitrequest  => g_waitrequest_arr(I),
+      g_rd_latency   => g_rd_latency_arr(I)
+    )
+    PORT MAP (
+      mm_rst        => mm_rst,
+      mm_clk        => mm_clk,
+      -- MM input RL = 1
+      in_mosi       => bus_mosi_arr(I),
+      in_miso       => bus_miso_arr(I),
+      -- MM output RL = 0
+      out_mosi      => slave_mosi_arr(I),
+      out_miso      => slave_miso_arr(I)
+    );
   END GENERATE;
-    
-  gen_multiple : IF g_nof_slaves>1 GENERATE 
-    -- Detect which slave in the array is addressed
-    p_index : PROCESS(master_mosi)
-      VARIABLE v_base : NATURAL;
-    BEGIN
-      index_pipeline(0) <= g_nof_slaves;   -- default index of none existing slave
-      FOR I IN 0 TO g_nof_slaves-1 LOOP
-        v_base := TO_UINT(master_mosi.address(c_mm_bus_addr_w-1 DOWNTO g_width_arr(I)));
-        ASSERT g_base_arr(I) MOD 2**g_width_arr(I) = 0 REPORT "Slave base address must be a multiple of the slave width." SEVERITY FAILURE;
-        IF v_base = g_base_arr(I) / 2**g_width_arr(I) THEN
-          index_pipeline(0) <= I;   -- return index of addressed slave
-          EXIT;
-        END IF;
-      END LOOP;
-    END PROCESS;
-    
-    index_pipeline(1 TO c_index_latency_max) <= index_pipeline(0 TO c_index_latency_max-1) WHEN rising_edge(mm_clk);
-        
-    -- Master access, can be write or read
-    p_slave_mosi_arr : PROCESS(master_mosi, index_pipeline)
-    BEGIN
-      slave_mosi_arr_comb <= (OTHERS=>master_mosi);  -- default assign to all, to avoid latches
-      FOR I IN 0 TO g_nof_slaves-1 LOOP
-        slave_mosi_arr_comb(I).rd <= '0';
-        slave_mosi_arr_comb(I).wr <= '0';
-        IF I = index_pipeline(0) THEN   -- check index for read or write access
-          slave_mosi_arr_comb(I).rd <= master_mosi.rd;
-          slave_mosi_arr_comb(I).wr <= master_mosi.wr;
-        END IF;
-      END LOOP;
-    END PROCESS;
 
-    -- FIX ME: g_pipeline_mosi in combination with g_pipeline_miso_wait 
-    slave_mosi_arr_reg <= slave_mosi_arr_comb WHEN rising_edge(mm_clk);
-    
-    slave_mosi_arr <= slave_mosi_arr_comb WHEN g_pipeline_mosi = FALSE ELSE slave_mosi_arr_reg;
-    
-    
-    -- Slave response to read access after read latency mm_clk cycles
-    p_master_miso_comb : PROCESS(slave_miso_arr, index_pipeline)
-      VARIABLE v_rd_latency : NATURAL;
-    BEGIN
-      master_miso_comb <= c_mem_miso_rst;   -- default clear, to avoid latches
-      FOR I IN 0 TO g_nof_slaves-1 LOOP
-        v_rd_latency := c_pipeline_mosi + g_rd_latency_arr(I);
-        IF I = index_pipeline(v_rd_latency) THEN  -- check index for read response
-          master_miso_comb <= slave_miso_arr(I);
-        END IF;
-      END LOOP;
-      FOR I IN 0 TO g_nof_slaves-1 LOOP
-        IF I = index_pipeline(0) THEN  -- check index for waitrequest
-          master_miso_comb.waitrequest <= slave_miso_arr(I).waitrequest;
-        END IF;
-      END LOOP;
-    END PROCESS;
-
-    master_miso_reg <= master_miso_comb WHEN rising_edge(mm_clk);
-    
-    p_master_miso : PROCESS(master_miso_comb, master_miso_reg)
-    BEGIN
-      master_miso <= master_miso_comb;  -- default no miso pipelining
-      IF g_pipeline_miso_rdval THEN
-        master_miso.rddata <= master_miso_reg.rddata;
-        master_miso.rdval  <= master_miso_reg.rdval;
-      END IF;
-      IF g_pipeline_miso_wait THEN
-        master_miso.waitrequest <= master_miso_reg.waitrequest;
-      END IF;
-    END PROCESS;
-    
-  END GENERATE; 
-  
-END rtl;
+END str;
diff --git a/libraries/base/mm/tb/vhdl/tb_mm_bus.vhd b/libraries/base/mm/tb/vhdl/tb_mm_bus.vhd
index 0f2004618996296869492ed7badca472b843b59a..45028964164cbee349a948af00b4e3baaf046640 100644
--- a/libraries/base/mm/tb/vhdl/tb_mm_bus.vhd
+++ b/libraries/base/mm/tb/vhdl/tb_mm_bus.vhd
@@ -54,7 +54,7 @@ USE common_lib.tb_common_mem_pkg.ALL;
 
 ENTITY tb_mm_bus IS
  GENERIC (
-    g_nof_slaves          : POSITIVE := 2;       -- Number of slave memory interfaces on the MM bus array.
+    g_nof_slaves          : POSITIVE := 1;       -- Number of slave memory interfaces on the MM bus array.
     g_base_offset         : NATURAL := 0;        -- Address of first slave on the MM bus
     g_width_w             : POSITIVE := 4;       -- Address width of each slave memory in the MM bus array.
     g_rd_latency          : NATURAL := 1;        -- Read latency of the slaves
@@ -79,14 +79,13 @@ ARCHITECTURE tb OF tb_mm_bus IS
   CONSTANT c_base_arr        : t_nat_natural_arr := array_init(g_base_offset, g_nof_slaves, c_slave_span);  -- Address base per slave
   CONSTANT c_width_arr       : t_nat_natural_arr := array_init(    g_width_w, g_nof_slaves);                -- Address width per slave
   CONSTANT c_rd_latency_arr  : t_nat_natural_arr := array_init( g_rd_latency, g_nof_slaves);                -- Read latency per slave
+  CONSTANT c_waitrequest_arr : t_nat_boolean_arr := array_init(g_waitrequest, g_nof_slaves);                -- Flow control per slave
   
   CONSTANT c_bus_pipelining      : BOOLEAN := g_pipeline_mosi OR g_pipeline_miso_rdval OR g_pipeline_miso_wait;
   CONSTANT c_pipeline_mosi       : NATURAL := sel_a_b(g_pipeline_mosi, 1, 0);
   CONSTANT c_pipeline_miso_rdval : NATURAL := sel_a_b(g_pipeline_miso_rdval, 1, 0);
   CONSTANT c_pipeline_miso_wait  : NATURAL := sel_a_b(g_pipeline_miso_wait, 1, 0);
   CONSTANT c_read_latency        : NATURAL := c_pipeline_mosi + g_rd_latency + c_pipeline_miso_rdval;
-  
-  CONSTANT c_adapt_waitrequest   : BOOLEAN := g_waitrequest AND g_pipeline_miso_wait;
 
   CONSTANT c_data_w     : NATURAL := 32;
   CONSTANT c_test_ram   : t_c_mem := (latency  => g_rd_latency,
@@ -98,15 +97,12 @@ ARCHITECTURE tb OF tb_mm_bus IS
   SIGNAL mm_clk   : STD_LOGIC := '1';
   SIGNAL tb_end   : STD_LOGIC;
 
+  SIGNAL cnt_rd    : NATURAL := 0;
+  SIGNAL cnt_rdval : NATURAL := 0;
+  
   -- MM bus
   SIGNAL master_mosi      : t_mem_mosi := c_mem_mosi_rst;
   SIGNAL master_miso      : t_mem_miso := c_mem_miso_rst;
-  SIGNAL bus_mosi_arr     : t_mem_mosi_arr(0 TO g_nof_slaves-1) := (OTHERS=>c_mem_mosi_rst);
-  SIGNAL bus_miso_arr     : t_mem_miso_arr(0 TO g_nof_slaves-1) := (OTHERS=>c_mem_miso_rst);
-  -- MM slaves with waitrequest latency adapters for ports that have pipelined flow control
-  SIGNAL busw_mosi_arr    : t_mem_mosi_arr(0 TO g_nof_slaves-1) := (OTHERS=>c_mem_mosi_rst);
-  SIGNAL busw_miso_arr    : t_mem_miso_arr(0 TO g_nof_slaves-1) := (OTHERS=>c_mem_miso_rst);
-  -- MM slaves with waitrequest for ports that are enabled and NC for ports that are not connected
   SIGNAL slave_mosi_arr   : t_mem_mosi_arr(0 TO g_nof_slaves-1) := (OTHERS=>c_mem_mosi_rst);
   SIGNAL slave_miso_arr   : t_mem_miso_arr(0 TO g_nof_slaves-1) := (OTHERS=>c_mem_miso_rst);
   SIGNAL ram_mosi_arr     : t_mem_mosi_arr(0 TO g_nof_slaves-1) := (OTHERS=>c_mem_mosi_rst);
@@ -119,8 +115,6 @@ ARCHITECTURE tb OF tb_mm_bus IS
   
 BEGIN
 
-  ASSERT NOT(g_nof_slaves=1 AND c_bus_pipelining=TRUE) REPORT "No support for MM bus pipelining with g_nof_slaves=1, because then the mm_bus reduces to wires." SEVERITY FAILURE;
-
   mm_clk <= NOT mm_clk OR tb_end AFTER mm_clk_period/2;
   mm_rst <= '1', '0' AFTER mm_clk_period*5;
 
@@ -131,7 +125,7 @@ BEGIN
     VARIABLE v_wrdata  : INTEGER;  -- write data
   BEGIN
     tb_end <= '0';
-    master_mosi   <= c_mem_mosi_rst;
+    master_mosi <= c_mem_mosi_rst;
     
     -- Wait until reset is released
     proc_common_wait_until_low(mm_clk, mm_rst);
@@ -154,12 +148,18 @@ BEGIN
         FOR vJ IN 0 TO c_slave_span-1 LOOP
           proc_mem_mm_bus_rd(g_base_offset + vI*c_slave_span + vJ, mm_clk, master_miso, master_mosi);
           --proc_common_wait_some_cycles(mm_clk, c_read_latency);  -- not needed, see p_verify
+          cnt_rd <= cnt_rd + 1;
         END LOOP;
         proc_common_wait_some_cycles(mm_clk, 10);
       END LOOP;
     END LOOP;
 
     proc_common_wait_some_cycles(mm_clk, 10);
+    
+    -- Verify that test has indeed ran
+    WAIT FOR 1 ns;  -- wait 1 ns to ensure that assert report appears at end of transcript log
+    ASSERT cnt_rdval = cnt_rd AND cnt_rdval > 0 REPORT "Wrong number of rdval" SEVERITY ERROR;
+    
     tb_end <= '1';
     WAIT;
   END PROCESS;
@@ -176,6 +176,7 @@ BEGIN
   BEGIN
     WAIT UNTIL rising_edge(mm_clk);
     IF master_miso.rdval = '1' THEN
+      cnt_rdval <= cnt_rdval + 1;
       v_rddata := TO_UINT(master_miso.rddata(c_data_w-1 DOWNTO 0));
       IF v_rddata /= v_expdata THEN
         REPORT "Error! Readvalue is not as expected" SEVERITY ERROR;
@@ -184,7 +185,6 @@ BEGIN
     END IF;
   END PROCESS;
 
-
   -----------------------------------------------------------------------------
   -- The MM bus 
   -----------------------------------------------------------------------------
@@ -194,57 +194,20 @@ BEGIN
     g_base_arr            => c_base_arr,
     g_width_arr           => c_width_arr,
     g_rd_latency_arr      => c_rd_latency_arr,
+    g_waitrequest_arr     => c_waitrequest_arr,
     g_pipeline_mosi       => g_pipeline_mosi,
     g_pipeline_miso_rdval => g_pipeline_miso_rdval,
     g_pipeline_miso_wait  => g_pipeline_miso_wait
   )
   PORT MAP (
+    mm_rst         => mm_rst,
     mm_clk         => mm_clk,
     master_mosi    => master_mosi,
     master_miso    => master_miso,
-    slave_mosi_arr => bus_mosi_arr,
-    slave_miso_arr => bus_miso_arr
+    slave_mosi_arr => slave_mosi_arr,
+    slave_miso_arr => slave_miso_arr
   );
 
-  -----------------------------------------------------------------------------
-  -- The MM bus interface with the MM slaves
-  -----------------------------------------------------------------------------
-  gen_slave_ports : FOR I IN 0 TO g_nof_slaves-1 GENERATE
-    -- Adapt the miso.waitrequest for slaves that use mosi flow control if the miso.waitrequest is pipelined in the mm_bus
-    u_slave_latency_adapter : ENTITY work.mm_latency_adapter
-    GENERIC MAP (
-      g_adapt       => c_adapt_waitrequest
-    )
-    PORT MAP (
-      mm_rst        => mm_rst,
-      mm_clk        => mm_clk,
-      -- MM input RL = 1
-      in_mosi       => bus_mosi_arr(I),
-      in_miso       => bus_miso_arr(I),
-      -- MM output RL = 0
-      out_mosi      => busw_mosi_arr(I),
-      out_miso      => busw_miso_arr(I)
-    );
-
-    -- Rewire not connected slaves and slave that do not need mosi flow control via miso.waitrequest
-    u_slave_enable : ENTITY work.mm_slave_enable
-    GENERIC MAP (
-      g_enable       => TRUE,
-      g_waitrequest  => g_waitrequest,
-      g_rd_latency   => c_rd_latency_arr(I)
-    )
-    PORT MAP (
-      mm_rst        => mm_rst,
-      mm_clk        => mm_clk,
-      -- MM input RL = 1
-      in_mosi       => busw_mosi_arr(I),
-      in_miso       => busw_miso_arr(I),
-      -- MM output RL = 0
-      out_mosi      => slave_mosi_arr(I),
-      out_miso      => slave_miso_arr(I)
-    );
-  END GENERATE;
-
   -----------------------------------------------------------------------------
   -- Model the MM slaves
   -----------------------------------------------------------------------------
diff --git a/libraries/base/mm/tb/vhdl/tb_mm_master_mux.vhd b/libraries/base/mm/tb/vhdl/tb_mm_master_mux.vhd
index 5902094761e95e346e6fcdcf7d52886ff9cd4e12..a741aeaba467b45c61398b85083c9211c75157ff 100644
--- a/libraries/base/mm/tb/vhdl/tb_mm_master_mux.vhd
+++ b/libraries/base/mm/tb/vhdl/tb_mm_master_mux.vhd
@@ -77,6 +77,7 @@ ARCHITECTURE tb OF tb_mm_master_mux IS
   CONSTANT c_bus_pipeline_miso_wait  : NATURAL := sel_a_b(g_pipeline_bus_miso_wait, 1, 0);
   CONSTANT c_ram_rd_latency          : NATURAL := 1; 
   CONSTANT c_ram_rd_latency_arr      : t_nat_natural_arr := array_init(c_ram_rd_latency, g_nof_masters);
+  CONSTANT c_waitrequest_arr         : t_nat_boolean_arr := array_init(g_waitrequest, g_nof_masters);
   
   CONSTANT c_read_latency    : NATURAL := c_bus_pipeline_mosi + c_ram_rd_latency + c_bus_pipeline_miso_rdval;
 
@@ -161,6 +162,7 @@ BEGIN
     g_base_arr            => g_base_arr,
     g_width_arr           => g_width_arr,
     g_rd_latency_arr      => c_ram_rd_latency_arr,
+    g_waitrequest_arr     => c_waitrequest_arr,
     g_pipeline_mosi       => g_pipeline_bus_mosi,
     g_pipeline_miso_rdval => g_pipeline_bus_miso_rdval,
     g_pipeline_miso_wait  => g_pipeline_bus_miso_wait
diff --git a/libraries/base/mm/tb/vhdl/tb_tb_mm_bus.vhd b/libraries/base/mm/tb/vhdl/tb_tb_mm_bus.vhd
index 9e40c5da110607506f608ff4cef1dabe609dafae..9614cff4f5f2cf9a0a0caeaba7c769c13d1ed39f 100644
--- a/libraries/base/mm/tb/vhdl/tb_tb_mm_bus.vhd
+++ b/libraries/base/mm/tb/vhdl/tb_tb_mm_bus.vhd
@@ -48,17 +48,17 @@ BEGIN
   -- g_pipeline_miso_rdval : BOOLEAN := TRUE;
   -- g_pipeline_miso_wait  : BOOLEAN := FALSE
     
-  u_no_pipe                        : ENTITY work.tb_mm_bus GENERIC MAP (16,      0, 3, 1, FALSE, FALSE, FALSE, FALSE);
-  u_no_pipe_base_offset            : ENTITY work.tb_mm_bus GENERIC MAP (16, 3*2**4, 4, 1, FALSE, FALSE, FALSE, FALSE);
-  u_pipe_mosi                      : ENTITY work.tb_mm_bus GENERIC MAP ( 3,      0, 4, 1, FALSE,  TRUE, FALSE, FALSE);
-  u_pipe_mosi_miso_rdval           : ENTITY work.tb_mm_bus GENERIC MAP ( 3,      0, 4, 1, FALSE,  TRUE,  TRUE, FALSE);
-  u_waitrequest_no_pipe            : ENTITY work.tb_mm_bus GENERIC MAP ( 3,      0, 4, 1,  TRUE, FALSE, FALSE, FALSE);
-  u_waitrequest_pipe_miso_rdval    : ENTITY work.tb_mm_bus GENERIC MAP ( 3,      0, 4, 1,  TRUE, FALSE,  TRUE, FALSE);
-  u_waitrequest_pipe_miso_rdval2   : ENTITY work.tb_mm_bus GENERIC MAP ( 3,      0, 4, 2,  TRUE, FALSE,  TRUE, FALSE);  
-  u_waitrequest_pipe_miso_wait     : ENTITY work.tb_mm_bus GENERIC MAP ( 2,      0, 4, 1,  TRUE, FALSE, FALSE,  TRUE);
+  --u_no_pipe                        : ENTITY work.tb_mm_bus GENERIC MAP (16,      0, 3, 1, FALSE, FALSE, FALSE, FALSE);
+  --u_no_pipe_base_offset            : ENTITY work.tb_mm_bus GENERIC MAP (16, 3*2**4, 4, 1, FALSE, FALSE, FALSE, FALSE);
+  --u_pipe_mosi                      : ENTITY work.tb_mm_bus GENERIC MAP ( 3,      0, 4, 1, FALSE,  TRUE, FALSE, FALSE);
+  --u_pipe_mosi_miso_rdval           : ENTITY work.tb_mm_bus GENERIC MAP ( 3,      0, 4, 1, FALSE,  TRUE,  TRUE, FALSE);
+  --u_waitrequest_no_pipe            : ENTITY work.tb_mm_bus GENERIC MAP ( 3,      0, 4, 1,  TRUE, FALSE, FALSE, FALSE);
+  --u_waitrequest_pipe_miso_rdval    : ENTITY work.tb_mm_bus GENERIC MAP ( 3,      0, 4, 1,  TRUE, FALSE,  TRUE, FALSE);
+  --u_waitrequest_pipe_miso_rdval2   : ENTITY work.tb_mm_bus GENERIC MAP ( 3,      0, 4, 2,  TRUE, FALSE,  TRUE, FALSE);  
+  --u_waitrequest_pipe_miso_wait     : ENTITY work.tb_mm_bus GENERIC MAP ( 2,      0, 4, 1,  TRUE, FALSE, FALSE,  TRUE);
 
   -- To do:
-  -- . supporting waitrequest with pipelined mosi may require a component similar to dp_pipeline
+  u_waitrequest_pipe_mosi            : ENTITY work.tb_mm_bus GENERIC MAP ( 1,      0, 4, 1,  TRUE,  TRUE, FALSE, FALSE);
   --u_waitrequest_pipe_mosi            : ENTITY work.tb_mm_bus GENERIC MAP ( 2,      0, 4, 1,  TRUE,  TRUE, FALSE, FALSE);
   --u_waitrequest_pipe_mosi_miso_rdval : ENTITY work.tb_mm_bus GENERIC MAP ( 2,      0, 4, 1,  TRUE,  TRUE,  TRUE, FALSE);
   --u_waitrequest_pipe_mosi_miso_wait  : ENTITY work.tb_mm_bus GENERIC MAP ( 2,      0, 4, 1,  TRUE,  TRUE, FALSE,  TRUE);