diff --git a/libraries/technology/mac_10g/tb_tech_mac_10g_pkg.vhd b/libraries/technology/mac_10g/tb_tech_mac_10g_pkg.vhd
index bcf7bcb336f04ca6d178e8290dbe30c38ded18d5..44841b83ea909e6ece0c310b9ff30d6257483eb0 100644
--- a/libraries/technology/mac_10g/tb_tech_mac_10g_pkg.vhd
+++ b/libraries/technology/mac_10g/tb_tech_mac_10g_pkg.vhd
@@ -47,6 +47,13 @@ PACKAGE tb_tech_mac_10g_pkg IS
   FUNCTION func_tech_mac_10g_header_size(data_type : NATURAL) RETURN NATURAL;  -- raw ethernet: 4 header words, protocol ethernet: 11 header words
   
   -- Configure the 10G MAC
+  PROCEDURE proc_tech_mac_10g_setup(CONSTANT c_technology        : IN  NATURAL;
+                                    CONSTANT src_mac             : IN  STD_LOGIC_VECTOR(c_network_eth_mac_slv'RANGE);
+                                    CONSTANT mm_offset           : IN  NATURAL;
+                                    SIGNAL   mm_clk              : IN  STD_LOGIC;
+                                    SIGNAL   mm_miso             : IN  t_mem_miso;
+                                    SIGNAL   mm_mosi             : OUT t_mem_mosi);
+                                    
   PROCEDURE proc_tech_mac_10g_setup(CONSTANT c_technology        : IN  NATURAL;
                                     CONSTANT src_mac             : IN  STD_LOGIC_VECTOR(c_network_eth_mac_slv'RANGE);
                                     SIGNAL   mm_clk              : IN  STD_LOGIC;
@@ -54,11 +61,13 @@ PACKAGE tb_tech_mac_10g_pkg IS
                                     SIGNAL   mm_mosi             : OUT t_mem_mosi);
   
   PROCEDURE proc_tech_mac_10g_setup_stratixiv(CONSTANT src_mac             : IN  STD_LOGIC_VECTOR(c_network_eth_mac_slv'RANGE);
+                                              CONSTANT mm_offset           : IN  NATURAL;
                                               SIGNAL   mm_clk              : IN  STD_LOGIC;
                                               SIGNAL   mm_miso             : IN  t_mem_miso;
                                               SIGNAL   mm_mosi             : OUT t_mem_mosi);
                                                                               
   PROCEDURE proc_tech_mac_10g_setup_arria10(CONSTANT src_mac             : IN  STD_LOGIC_VECTOR(c_network_eth_mac_slv'RANGE);
+                                            CONSTANT mm_offset           : IN  NATURAL;
                                             SIGNAL   mm_clk              : IN  STD_LOGIC;
                                             SIGNAL   mm_miso             : IN  t_mem_miso;
                                             SIGNAL   mm_mosi             : OUT t_mem_mosi);
@@ -108,22 +117,34 @@ PACKAGE BODY tb_tech_mac_10g_pkg IS
   END func_tech_mac_10g_header_size;
   
   
-  -- Configure the 10G MAC
+  -- Configure the 10G MAC  
   PROCEDURE proc_tech_mac_10g_setup(CONSTANT c_technology        : IN  NATURAL;
                                     CONSTANT src_mac             : IN  STD_LOGIC_VECTOR(c_network_eth_mac_slv'RANGE);
+                                    CONSTANT mm_offset           : IN  NATURAL;
                                     SIGNAL   mm_clk              : IN  STD_LOGIC;
                                     SIGNAL   mm_miso             : IN  t_mem_miso;
                                     SIGNAL   mm_mosi             : OUT t_mem_mosi) IS
   BEGIN
     CASE c_technology IS
-      WHEN c_tech_stratixiv => proc_tech_mac_10g_setup_stratixiv(src_mac, mm_clk, mm_miso, mm_mosi);
-      WHEN c_tech_arria10   => proc_tech_mac_10g_setup_arria10(  src_mac, mm_clk, mm_miso, mm_mosi);
-      WHEN OTHERS           => proc_tech_mac_10g_setup_stratixiv(src_mac, mm_clk, mm_miso, mm_mosi);  -- default to c_tech_stratixiv  
+      WHEN c_tech_stratixiv => proc_tech_mac_10g_setup_stratixiv(src_mac, mm_offset, mm_clk, mm_miso, mm_mosi);
+      WHEN c_tech_arria10   => proc_tech_mac_10g_setup_arria10(  src_mac, mm_offset, mm_clk, mm_miso, mm_mosi);
+      WHEN OTHERS           => proc_tech_mac_10g_setup_stratixiv(src_mac, mm_offset, mm_clk, mm_miso, mm_mosi);  -- default to c_tech_stratixiv  
     END CASE;
   END proc_tech_mac_10g_setup;
   
+  PROCEDURE proc_tech_mac_10g_setup(CONSTANT c_technology        : IN  NATURAL;
+                                    CONSTANT src_mac             : IN  STD_LOGIC_VECTOR(c_network_eth_mac_slv'RANGE);
+                                    SIGNAL   mm_clk              : IN  STD_LOGIC;
+                                    SIGNAL   mm_miso             : IN  t_mem_miso;
+                                    SIGNAL   mm_mosi             : OUT t_mem_mosi) IS
+  BEGIN
+    proc_tech_mac_10g_setup(c_technology, src_mac, 0, mm_clk, mm_miso, mm_mosi);
+  END proc_tech_mac_10g_setup;
+  
+  
   -- . The src_mac[47:0] = 0x123456789ABC for MAC address 12-34-56-78-9A-BC
   PROCEDURE proc_tech_mac_10g_setup_stratixiv(CONSTANT src_mac             : IN  STD_LOGIC_VECTOR(c_network_eth_mac_slv'RANGE);
+                                              CONSTANT mm_offset           : IN  NATURAL;
                                               SIGNAL   mm_clk              : IN  STD_LOGIC;
                                               SIGNAL   mm_miso             : IN  t_mem_miso;
                                               SIGNAL   mm_mosi             : OUT t_mem_mosi) IS
@@ -134,48 +155,49 @@ PACKAGE BODY tb_tech_mac_10g_pkg IS
   BEGIN
     -- MAC control
     -- . rx read
-    proc_mem_mm_bus_rd(16#0040#,               mm_clk, mm_miso, mm_mosi);  -- RW, rx_padcrc_control = 0x1, remove CRC (use 0x3 to also remove padding)
-    proc_mem_mm_bus_rd(16#0080#,               mm_clk, mm_miso, mm_mosi);  -- RW, rx_padcheck_control = 0x2, check CRC
-    proc_mem_mm_bus_rd(16#0800#,               mm_clk, mm_miso, mm_mosi);  -- RW, rx_frame_control = 0x3, for promiscuous (transparent) mode
-                                                                           --     [0] = 0 only receive SRC_MAC, 1 accept all unicast
-                                                                           --     [1] = 0 drop multi cast, 1 to accept all multicast
-    proc_mem_mm_bus_rd(16#0801#,               mm_clk, mm_miso, mm_mosi);  -- RW, rx_frame_maxlength = 1518 = 0x5EE
-    proc_mem_mm_bus_rd(16#0802#,               mm_clk, mm_miso, mm_mosi);  -- RW, rx_frame_addr0 = 0, e.g. 0x56789ABC,
-    proc_mem_mm_bus_rd(16#0803#,               mm_clk, mm_miso, mm_mosi);  -- RW, rx_frame_addr1 = 0, e.g. 0x1234, for primary SRC_MAC = 12-34-56-78-9A-BC
+    proc_mem_mm_bus_rd(mm_offset+16#0040#,               mm_clk, mm_miso, mm_mosi);  -- RW, rx_padcrc_control = 0x1, remove CRC (use 0x3 to also remove padding)
+    proc_mem_mm_bus_rd(mm_offset+16#0080#,               mm_clk, mm_miso, mm_mosi);  -- RW, rx_padcheck_control = 0x2, check CRC
+    proc_mem_mm_bus_rd(mm_offset+16#0800#,               mm_clk, mm_miso, mm_mosi);  -- RW, rx_frame_control = 0x3, for promiscuous (transparent) mode
+                                                                                     --     [0] = 0 only receive SRC_MAC, 1 accept all unicast
+                                                                                     --     [1] = 0 drop multi cast, 1 to accept all multicast
+    proc_mem_mm_bus_rd(mm_offset+16#0801#,               mm_clk, mm_miso, mm_mosi);  -- RW, rx_frame_maxlength = 1518 = 0x5EE
+    proc_mem_mm_bus_rd(mm_offset+16#0802#,               mm_clk, mm_miso, mm_mosi);  -- RW, rx_frame_addr0 = 0, e.g. 0x56789ABC,
+    proc_mem_mm_bus_rd(mm_offset+16#0803#,               mm_clk, mm_miso, mm_mosi);  -- RW, rx_frame_addr1 = 0, e.g. 0x1234, for primary SRC_MAC = 12-34-56-78-9A-BC
     proc_common_wait_some_cycles(mm_clk, 10);
     
     -- . tx read
-    proc_mem_mm_bus_rd(16#1040#,               mm_clk, mm_miso, mm_mosi);  -- RW, tx_padins_control = 1, insert padding to ensure 64 bytes including CRC
-    proc_mem_mm_bus_rd(16#1080#,               mm_clk, mm_miso, mm_mosi);  -- RW, tx_crcins_control = 3, compute and insert CRC
-    proc_mem_mm_bus_rd(16#1120#,               mm_clk, mm_miso, mm_mosi);  -- RW, tx_unidir_control = 0, use 0x1 to enable unidirectional mode
-    proc_mem_mm_bus_rd(16#1200#,               mm_clk, mm_miso, mm_mosi);  -- RW, tx_addrins_control = 0, use 0x1 to overwrite frame SRC_MAC with tx_addrins_macaddr0,1
-    proc_mem_mm_bus_rd(16#1201#,               mm_clk, mm_miso, mm_mosi);  -- RW, tx_addrins_macaddr0 = 0, e.g. 0x56789ABC,
-    proc_mem_mm_bus_rd(16#1202#,               mm_clk, mm_miso, mm_mosi);  -- RW, tx_addrins_macaddr1 = 0, e.g. 0x1234, for frame SRC_MAC = 12-34-56-78-9A-BC
-    proc_mem_mm_bus_rd(16#1801#,               mm_clk, mm_miso, mm_mosi);  -- RW, tx_frame_maxlength = 1518 = 0x5EE
+    proc_mem_mm_bus_rd(mm_offset+16#1040#,               mm_clk, mm_miso, mm_mosi);  -- RW, tx_padins_control = 1, insert padding to ensure 64 bytes including CRC
+    proc_mem_mm_bus_rd(mm_offset+16#1080#,               mm_clk, mm_miso, mm_mosi);  -- RW, tx_crcins_control = 3, compute and insert CRC
+    proc_mem_mm_bus_rd(mm_offset+16#1120#,               mm_clk, mm_miso, mm_mosi);  -- RW, tx_unidir_control = 0, use 0x1 to enable unidirectional mode
+    proc_mem_mm_bus_rd(mm_offset+16#1200#,               mm_clk, mm_miso, mm_mosi);  -- RW, tx_addrins_control = 0, use 0x1 to overwrite frame SRC_MAC with tx_addrins_macaddr0,1
+    proc_mem_mm_bus_rd(mm_offset+16#1201#,               mm_clk, mm_miso, mm_mosi);  -- RW, tx_addrins_macaddr0 = 0, e.g. 0x56789ABC,
+    proc_mem_mm_bus_rd(mm_offset+16#1202#,               mm_clk, mm_miso, mm_mosi);  -- RW, tx_addrins_macaddr1 = 0, e.g. 0x1234, for frame SRC_MAC = 12-34-56-78-9A-BC
+    proc_mem_mm_bus_rd(mm_offset+16#1801#,               mm_clk, mm_miso, mm_mosi);  -- RW, tx_frame_maxlength = 1518 = 0x5EE
     proc_common_wait_some_cycles(mm_clk, 10);
     
     ---- . rx set primary SRC_MAC
-    --proc_mem_mm_bus_wr(16#0802#,       c_mac0, mm_clk, mm_miso, mm_mosi);  -- src_mac(31 DOWNTO  0)
-    --proc_mem_mm_bus_wr(16#0803#,       c_mac1, mm_clk, mm_miso, mm_mosi);  -- src_mac(47 DOWNTO 32) <-- primary SRC_MAC = 12-34-56-78-9A-BC
-    --proc_mem_mm_bus_rd(16#0802#,               mm_clk, mm_miso, mm_mosi);  -- src_mac(31 DOWNTO  0)
-    --proc_mem_mm_bus_rd(16#0803#,               mm_clk, mm_miso, mm_mosi);  -- src_mac(47 DOWNTO 32)
+    --proc_mem_mm_bus_wr(mm_offset+16#0802#,       c_mac0, mm_clk, mm_miso, mm_mosi);  -- src_mac(31 DOWNTO  0)
+    --proc_mem_mm_bus_wr(mm_offset+16#0803#,       c_mac1, mm_clk, mm_miso, mm_mosi);  -- src_mac(47 DOWNTO 32) <-- primary SRC_MAC = 12-34-56-78-9A-BC
+    --proc_mem_mm_bus_rd(mm_offset+16#0802#,               mm_clk, mm_miso, mm_mosi);  -- src_mac(31 DOWNTO  0)
+    --proc_mem_mm_bus_rd(mm_offset+16#0803#,               mm_clk, mm_miso, mm_mosi);  -- src_mac(47 DOWNTO 32)
     --proc_common_wait_some_cycles(mm_clk, 10);
     --
     ---- . tx insert frame SRC_MAC
-    --proc_mem_mm_bus_wr(16#1200#,            1, mm_clk, mm_miso, mm_mosi);  -- RW, tx_addrins_control = 1 to overwrite frame SRC_MAC with tx_addrins_macaddr0,1
-    --proc_mem_mm_bus_wr(16#1201#,       c_mac0, mm_clk, mm_miso, mm_mosi);  -- src_mac(31 DOWNTO  0)
-    --proc_mem_mm_bus_wr(16#1202#,       c_mac1, mm_clk, mm_miso, mm_mosi);  -- src_mac(47 DOWNTO 32) <-- frame SRC_MAC = 12-34-56-78-9A-BC
+    --proc_mem_mm_bus_wr(mm_offset+16#1200#,            1, mm_clk, mm_miso, mm_mosi);  -- RW, tx_addrins_control = 1 to overwrite frame SRC_MAC with tx_addrins_macaddr0,1
+    --proc_mem_mm_bus_wr(mm_offset+16#1201#,       c_mac0, mm_clk, mm_miso, mm_mosi);  -- src_mac(31 DOWNTO  0)
+    --proc_mem_mm_bus_wr(mm_offset+16#1202#,       c_mac1, mm_clk, mm_miso, mm_mosi);  -- src_mac(47 DOWNTO 32) <-- frame SRC_MAC = 12-34-56-78-9A-BC
     --proc_common_wait_some_cycles(mm_clk, 10);
     
     WAIT UNTIL rising_edge(mm_clk);
   END proc_tech_mac_10g_setup_stratixiv;
 
   PROCEDURE proc_tech_mac_10g_setup_arria10(CONSTANT src_mac             : IN  STD_LOGIC_VECTOR(c_network_eth_mac_slv'RANGE);
+                                            CONSTANT mm_offset           : IN  NATURAL;
                                             SIGNAL   mm_clk              : IN  STD_LOGIC;
                                             SIGNAL   mm_miso             : IN  t_mem_miso;
                                             SIGNAL   mm_mosi             : OUT t_mem_mosi) IS
   BEGIN
-    proc_tech_mac_10g_setup_stratixiv(src_mac, mm_clk, mm_miso, mm_mosi);
+    proc_tech_mac_10g_setup_stratixiv(src_mac, mm_offset, mm_clk, mm_miso, mm_mosi);
   END proc_tech_mac_10g_setup_arria10;
   
   -- Transmit user packet
diff --git a/libraries/technology/mac_10g/tb_tech_mac_10g_setup.vhd b/libraries/technology/mac_10g/tb_tech_mac_10g_setup.vhd
index eb0369b9e41b3e5b801b646ce139ab2fa6a84c76..52b16a336298c4e59b54557a77b55b2e21d98c24 100644
--- a/libraries/technology/mac_10g/tb_tech_mac_10g_setup.vhd
+++ b/libraries/technology/mac_10g/tb_tech_mac_10g_setup.vhd
@@ -30,21 +30,23 @@ USE common_lib.common_network_layers_pkg.ALL;
 USE common_lib.tb_common_pkg.ALL;
 USE technology_lib.technology_pkg.ALL;
 USE technology_lib.technology_select_pkg.ALL;
-USE WORK.tb_tech_mac_10g_pkg.ALL;
+USE work.tb_tech_mac_10g_pkg.ALL;
+USE work.tech_mac_10g_component_pkg.ALL;
 
 
 ENTITY tb_tech_mac_10g_setup IS
   GENERIC (
     g_technology    : NATURAL := c_tech_select_default;
+    g_nof_macs      : POSITIVE := 1;
     g_src_mac       : STD_LOGIC_VECTOR(c_network_eth_mac_slv'RANGE) := X"123456789ABC"  -- = 12-34-56-78-9A-BC
   );
   PORT (
-    tb_end     : IN  STD_LOGIC := '0';
-    mm_clk     : OUT STD_LOGIC;
-    mm_rst     : OUT STD_LOGIC;
-    mm_init    : OUT STD_LOGIC;
-    mm_mosi    : OUT t_mem_mosi;
-    mm_miso    : IN  t_mem_miso
+    tb_end    : IN  STD_LOGIC := '0';
+    mm_clk    : OUT STD_LOGIC;
+    mm_rst    : OUT STD_LOGIC;
+    mm_init   : OUT STD_LOGIC;
+    mac_mosi  : OUT t_mem_mosi;
+    mac_miso  : IN  t_mem_miso
   );
 END tb_tech_mac_10g_setup;
 
@@ -66,18 +68,23 @@ BEGIN
   i_mm_rst <= '1', '0' AFTER mm_clk_period*10;
 
   p_mm_setup : PROCESS
+    VARIABLE v_mm_offset : NATURAL;
   BEGIN
     mm_init  <= '1';
-    mm_mosi.wr <= '0';
-    mm_mosi.rd <= '0';
+    mac_mosi.wr <= '0';
+    mac_mosi.rd <= '0';
 
     -- wait until after reset release
     proc_common_wait_until_low(i_mm_clk, i_mm_rst);
     proc_common_wait_some_cycles(i_mm_clk, 10);
 
-    proc_tech_mac_10g_setup(g_technology,
-                            g_src_mac,
-                            i_mm_clk, mm_miso, mm_mosi);
+    FOR I IN 0 TO g_nof_macs-1 LOOP
+      v_mm_offset := I * 2**func_tech_mac_10g_csr_addr_w(g_technology);
+      proc_tech_mac_10g_setup(g_technology,
+                              g_src_mac,
+                              v_mm_offset,
+                              i_mm_clk, mac_miso, mac_mosi);
+    END LOOP;
     mm_init <= '0';
     WAIT;
   END PROCESS;