diff --git a/modules/wishbone/wb_bus_fanout/xwb_bus_fanout.vhd b/modules/wishbone/wb_bus_fanout/xwb_bus_fanout.vhd
index 785b3b81c9648777872340080e8faf17d9a34e52..8560a6c07b8338da5f7342b223b13ac2f221f9c8 100644
--- a/modules/wishbone/wb_bus_fanout/xwb_bus_fanout.vhd
+++ b/modules/wishbone/wb_bus_fanout/xwb_bus_fanout.vhd
@@ -7,17 +7,19 @@ use work.wishbone_pkg.all;
 entity xwb_bus_fanout is
   
   generic (
-    g_num_outputs    : natural;
-    g_bits_per_slave : integer := 14);
+    g_num_outputs          : natural;
+    g_bits_per_slave       : integer := 14;
+    g_address_granularity  : t_wishbone_address_granularity;
+    g_slave_interface_mode : t_wishbone_interface_mode);
 
   port (
     clk_sys_i : in std_logic;
     rst_n_i   : in std_logic;
 
-    slave_i : in t_wishbone_slave_in;
+    slave_i : in  t_wishbone_slave_in;
     slave_o : out t_wishbone_slave_out;
 
-    master_i : in t_wishbone_master_in_array(0 to g_num_outputs-1);
+    master_i : in  t_wishbone_master_in_array(0 to g_num_outputs-1);
     master_o : out t_wishbone_master_out_array(0 to g_num_outputs-1)
     );
 
@@ -26,7 +28,7 @@ end xwb_bus_fanout;
 architecture rtl of xwb_bus_fanout is
 
   constant c_periph_addr_bits : integer := 3;
-  
+
   signal periph_addr     : std_logic_vector(c_periph_addr_bits - 1 downto 0);
   signal periph_addr_reg : std_logic_vector(c_periph_addr_bits - 1 downto 0);
 
@@ -37,11 +39,30 @@ architecture rtl of xwb_bus_fanout is
   signal data_in_muxed : std_logic_vector(31 downto 0);
 
   signal cycle_in_progress : std_logic;
-  signal ack_prev : std_logic;
-  
+  signal ack_prev          : std_logic;
+
+  signal adp_in  : t_wishbone_master_in;
+  signal adp_out : t_wishbone_master_out;
 begin  -- rtl
 
-  periph_addr <= slave_i.adr(g_bits_per_slave+c_periph_addr_bits-1 downto g_bits_per_slave);
+
+  U_Slave_Adapter : wb_slave_adapter
+    generic map (
+      g_master_use_struct  => true,
+      g_master_mode        => CLASSIC,
+      g_master_granularity => g_address_granularity,
+      g_slave_use_struct   => true,
+      g_slave_mode         => g_slave_interface_mode,
+      g_slave_granularity  => g_address_granularity)
+    port map (
+      clk_sys_i => clk_sys_i,
+      rst_n_i   => rst_n_i,
+      slave_i   => slave_i,
+      slave_o   => slave_o,
+      master_i  => adp_in,
+      master_o  => adp_out);
+
+  periph_addr <= adp_out.adr(g_bits_per_slave+c_periph_addr_bits-1 downto g_bits_per_slave);
 
   onehot_decode : process (periph_addr)  -- periph_sel <= onehot_decode(periph_addr)
     variable temp1 : std_logic_vector (periph_sel'high downto 0);
@@ -80,28 +101,35 @@ begin  -- rtl
     end if;
   end process;
 
-
   p_arbitrate : process(clk_sys_i)
   begin
     if rising_edge(clk_sys_i) then
       if rst_n_i = '0' then
         cycle_in_progress <= '0';
-        ack_prev <= '0';
-        periph_addr_reg <= (others => '0');
-        periph_sel_reg <= (others => '0');
+        ack_prev          <= '0';
+        periph_addr_reg   <= (others => '0');
+        periph_sel_reg    <= (others => '0');
+        adp_in.dat <= (others => '0');
+        adp_in.ack <= '0';
       else
         periph_sel_reg  <= periph_sel;
         periph_addr_reg <= periph_addr;
 
         if(cycle_in_progress = '0') then
-          if(slave_i.cyc = '1') then
+          if(adp_out.cyc = '1' and adp_in.ack = '0') then
             cycle_in_progress <= '1';
           end if;
           ack_prev <= '0';
+          adp_in.ack<='0';
         else
-          slave_o.dat <= data_in_muxed;
---          ack <= ack_muxed;
-          ack_prev <= ack_muxed;
+          adp_in.dat <= data_in_muxed;
+          ack_prev   <= ack_muxed;
+          if(ack_prev = '0' and ack_muxed = '1') then
+            adp_in.ack <= '1';
+          else
+            adp_in.ack <= '0';
+          end if;
+          
           if(ack_muxed = '1') then
             cycle_in_progress <= '0';
           end if;
@@ -110,20 +138,19 @@ begin  -- rtl
     end if;
   end process;
 
-  slave_o.ack <= ack_prev and slave_i.stb;
-  
+--  adp_in.ack <= ack_prev and adp_out.stb;
+
   gen_outputs : for i in 0 to g_num_outputs-1 generate
-    master_o(i).cyc <= slave_i.cyc and periph_sel(i);
-    master_o(i).adr <= slave_i.adr;
-    master_o(i).dat <= slave_i.dat;
-    master_o(i).stb <= slave_i.stb and not (not cycle_in_progress and ack_prev);
-    master_o(i).we  <= slave_i.we;
-    master_o(i).sel <= slave_i.sel;
+    master_o(i).cyc <= adp_out.cyc and periph_sel(i);
+    master_o(i).adr <= adp_out.adr;
+    master_o(i).dat <= adp_out.dat;
+    master_o(i).stb <= adp_out.stb and not (not cycle_in_progress and ack_prev);
+    master_o(i).we  <= adp_out.we;
+    master_o(i).sel <= adp_out.sel;
   end generate gen_outputs;
 
-
-  slave_o.err   <= '0';
-  slave_o.stall <= '0';
-  slave_o.rty   <= '0';
+  adp_in.err   <= '0';
+  adp_in.stall <= '0';
+  adp_in.rty   <= '0';
   
 end rtl;