diff --git a/modules/wishbone/wb_spi/wb_spi.vhd b/modules/wishbone/wb_spi/wb_spi.vhd
index 03b168c8295bc79f6a366267ea37524a105e174a..3aa6d1a05d1ce8a085265a5ef6b9092032b83837 100644
--- a/modules/wishbone/wb_spi/wb_spi.vhd
+++ b/modules/wishbone/wb_spi/wb_spi.vhd
@@ -4,21 +4,25 @@ use ieee.std_logic_1164.all;
 use work.wishbone_pkg.all;
 
 entity wb_spi is
-
+  generic (
+    g_interface_mode      : t_wishbone_interface_mode      := CLASSIC;
+    g_address_granularity : t_wishbone_address_granularity := WORD
+    );
   port(
     clk_sys_i : in std_logic;
     rst_n_i   : in std_logic;
 
-    wb_adr_i : in  std_logic_vector(2 downto 0);
-    wb_dat_i : in  std_logic_vector(31 downto 0);
-    wb_dat_o : out std_logic_vector(31 downto 0);
-    wb_sel_i : in  std_logic_vector(3 downto 0);
-    wb_stb_i : in  std_logic;
-    wb_cyc_i : in  std_logic;
-    wb_we_i  : in  std_logic;
-    wb_ack_o : out std_logic;
-    wb_err_o : out std_logic;
-    wb_int_o : out std_logic;
+    wb_adr_i   : in  std_logic_vector(4 downto 0);
+    wb_dat_i   : in  std_logic_vector(31 downto 0);
+    wb_dat_o   : out std_logic_vector(31 downto 0);
+    wb_sel_i   : in  std_logic_vector(3 downto 0);
+    wb_stb_i   : in  std_logic;
+    wb_cyc_i   : in  std_logic;
+    wb_we_i    : in  std_logic;
+    wb_ack_o   : out std_logic;
+    wb_err_o   : out std_logic;
+    wb_int_o   : out std_logic;
+    wb_stall_o : out std_logic;
 
     pad_cs_o   : out std_logic_vector(7 downto 0);
     pad_sclk_o : out std_logic;
@@ -51,28 +55,59 @@ architecture rtl of wb_spi is
       miso_pad_i : in  std_logic);
   end component;
 
-  signal wb_rst : std_logic;
-  signal core_addr : std_logic_vector(4 downto 0);
-begin  -- rtl
+  signal rst : std_logic;
 
-  wb_rst <= not rst_n_i;
+  signal wb_in  : t_wishbone_slave_in;
+  signal wb_out : t_wishbone_slave_out;
 
-  core_addr <= wb_adr_i & "00";
+  signal resized_addr : std_logic_vector(c_wishbone_address_width-1 downto 0);
+
+begin
   
-  Wrapped_SPI : spi_top
+  resized_addr(4 downto 0)                          <= wb_adr_i;
+  resized_addr(c_wishbone_address_width-1 downto 5) <= (others => '0');
+
+  U_Adapter : wb_slave_adapter
+    generic map (
+      g_master_use_struct  => true,
+      g_master_mode        => CLASSIC,
+      g_master_granularity => BYTE,
+      g_slave_use_struct   => false,
+      g_slave_mode         => g_interface_mode,
+      g_slave_granularity  => g_address_granularity)
+    port map (
+      clk_sys_i  => clk_sys_i,
+      rst_n_i    => rst_n_i,
+      master_i   => wb_out,
+      master_o   => wb_in,
+      sl_adr_i   => resized_addr,
+      sl_dat_i   => wb_dat_i,
+      sl_sel_i   => wb_sel_i,
+      sl_cyc_i   => wb_cyc_i,
+      sl_stb_i   => wb_stb_i,
+      sl_we_i    => wb_we_i,
+      sl_dat_o   => wb_dat_o,
+      sl_ack_o   => wb_ack_o,
+      sl_stall_o => wb_stall_o,
+      sl_int_o   => wb_int_o,
+      sl_err_o   => wb_err_o);
+
+  rst <= not rst_n_i;
+
+  Wrapped_SPI : spi_top                 -- byte-aligned
     port map (
       wb_clk_i   => clk_sys_i,
-      wb_rst_i   => wb_rst,
-      wb_adr_i   => core_addr,
-      wb_dat_i   => wb_dat_i,
-      wb_dat_o   => wb_dat_o,
-      wb_sel_i   => wb_sel_i,
-      wb_stb_i   => wb_stb_i,
-      wb_cyc_i   => wb_cyc_i,
-      wb_we_i    => wb_we_i,
-      wb_ack_o   => wb_ack_o,
-      wb_err_o   => wb_err_o,
-      wb_int_o   => wb_int_o,
+      wb_rst_i   => rst,
+      wb_adr_i   => wb_in.adr(4 downto 0),
+      wb_dat_i   => wb_in.dat,
+      wb_dat_o   => wb_out.dat,
+      wb_sel_i   => wb_in.sel,
+      wb_stb_i   => wb_in.stb,
+      wb_cyc_i   => wb_in.cyc,
+      wb_we_i    => wb_in.we,
+      wb_ack_o   => wb_out.ack,
+      wb_err_o   => wb_out.err,
+      wb_int_o   => wb_out.int,
       ss_pad_o   => pad_cs_o,
       sclk_pad_o => pad_sclk_o,
       mosi_pad_o => pad_mosi_o,
diff --git a/modules/wishbone/wb_spi/xwb_spi.vhd b/modules/wishbone/wb_spi/xwb_spi.vhd
index a2a74ebb60e44e74934af86b3042d7ce0a37f67f..26c2193351a568b76284b21b8d74c084b3692978 100644
--- a/modules/wishbone/wb_spi/xwb_spi.vhd
+++ b/modules/wishbone/wb_spi/xwb_spi.vhd
@@ -5,7 +5,8 @@ use work.wishbone_pkg.all;
 
 entity xwb_spi is
   generic(
-    g_interface_mode : t_wishbone_interface_mode := CLASSIC
+    g_interface_mode      : t_wishbone_interface_mode      := CLASSIC;
+    g_address_granularity : t_wishbone_address_granularity := WORD
     );
 
   port(
@@ -27,60 +28,53 @@ end xwb_spi;
 
 architecture rtl of xwb_spi is
 
-  component spi_top
+  component wb_spi
+    generic (
+      g_interface_mode      : t_wishbone_interface_mode;
+      g_address_granularity : t_wishbone_address_granularity);
     port (
-      wb_clk_i : in  std_logic;
-      wb_rst_i : in  std_logic;
-      wb_adr_i : in  std_logic_vector(4 downto 0);
-      wb_dat_i : in  std_logic_vector(31 downto 0);
-      wb_dat_o : out std_logic_vector(31 downto 0);
-      wb_sel_i : in  std_logic_vector(3 downto 0);
-      wb_stb_i : in  std_logic;
-      wb_cyc_i : in  std_logic;
-      wb_we_i  : in  std_logic;
-      wb_ack_o : out std_logic;
-      wb_err_o : out std_logic;
-      wb_int_o : out std_logic;
-
-      ss_pad_o   : out std_logic_vector(7 downto 0);
-      sclk_pad_o : out std_logic;
-      mosi_pad_o : out std_logic;
-      miso_pad_i : in  std_logic);
+      clk_sys_i  : in  std_logic;
+      rst_n_i    : in  std_logic;
+      wb_adr_i   : in  std_logic_vector(4 downto 0);
+      wb_dat_i   : in  std_logic_vector(31 downto 0);
+      wb_dat_o   : out std_logic_vector(31 downto 0);
+      wb_sel_i   : in  std_logic_vector(3 downto 0);
+      wb_stb_i   : in  std_logic;
+      wb_cyc_i   : in  std_logic;
+      wb_we_i    : in  std_logic;
+      wb_ack_o   : out std_logic;
+      wb_err_o   : out std_logic;
+      wb_int_o   : out std_logic;
+      wb_stall_o : out std_logic;
+      pad_cs_o   : out std_logic_vector(7 downto 0);
+      pad_sclk_o : out std_logic;
+      pad_mosi_o : out std_logic;
+      pad_miso_i : in  std_logic);
   end component;
-
-  signal wb_rst    : std_logic;
-  signal core_addr : std_logic_vector(4 downto 0);
   
-begin  -- rtl
-
-  gen_test_mode : if(g_interface_mode /= CLASSIC) generate
-    assert false report "xwb_spi: this module can only work with CLASSIC wishbone interface" severity failure;
-  end generate gen_test_mode;
-
-  wb_rst <= not rst_n_i;
+begin
 
-  core_addr <= slave_i.adr(2 downto 0) & "00";
-
-  Wrapped_SPI : spi_top
+  U_Wrapped_SPI: wb_spi
+    generic map (
+      g_interface_mode      => g_interface_mode,
+      g_address_granularity => g_address_granularity)
     port map (
-      wb_clk_i   => clk_sys_i,
-      wb_rst_i   => wb_rst,
-      wb_adr_i   => core_addr,
-      wb_dat_i   => slave_i.dat(31 downto 0),
-      wb_dat_o   => slave_o.dat(31 downto 0),
-      wb_sel_i   => slave_i.sel(3 downto 0),
+      clk_sys_i  => clk_sys_i,
+      rst_n_i    => rst_n_i,
+      wb_adr_i   => slave_i.adr(4 downto 0),
+      wb_dat_i   => slave_i.dat,
+      wb_dat_o   => slave_o.dat,
+      wb_sel_i   => slave_i.sel,
       wb_stb_i   => slave_i.stb,
       wb_cyc_i   => slave_i.cyc,
       wb_we_i    => slave_i.we,
       wb_ack_o   => slave_o.ack,
       wb_err_o   => slave_o.err,
       wb_int_o   => slave_o.int,
-      ss_pad_o   => pad_cs_o,
-      sclk_pad_o => pad_sclk_o,
-      mosi_pad_o => pad_mosi_o,
-      miso_pad_i => pad_miso_i);
-
-  slave_o.rty   <= '0';
-  slave_o.stall <= '0';
-
+      wb_stall_o => slave_o.stall,
+      pad_cs_o   => pad_cs_o,
+      pad_sclk_o => pad_sclk_o,
+      pad_mosi_o => pad_mosi_o,
+      pad_miso_i => pad_miso_i);
+  
 end rtl;