diff --git a/libraries/io/eth/src/vhdl/eth.vhd b/libraries/io/eth/src/vhdl/eth.vhd
index 41199495c1cfd74b367837908891f8ff212ad539..c1f1c6f62b8623744cb693ee12a8ceb9f0170687 100644
--- a/libraries/io/eth/src/vhdl/eth.vhd
+++ b/libraries/io/eth/src/vhdl/eth.vhd
@@ -24,8 +24,8 @@ LIBRARY IEEE, common_lib, dp_lib, tech_tse_lib, technology_lib;
 USE IEEE.std_logic_1164.ALL;
 USE common_lib.common_pkg.ALL;
 USE common_lib.common_mem_pkg.ALL;
+USE common_lib.common_network_total_header_pkg.ALL;
 USE dp_lib.dp_stream_pkg.ALL;
-USE common_lib.common_network_layers_pkg.ALL;
 USE tech_tse_lib.tech_tse_pkg.ALL;
 USE work.eth_pkg.ALL;
 USE technology_lib.technology_select_pkg.ALL;
@@ -133,14 +133,14 @@ ARCHITECTURE str OF eth IS
   SIGNAL eth_rx_siso          : t_dp_siso;
   SIGNAL eth_rx_sosi          : t_dp_sosi;
   
-  SIGNAL rx_frame_rd          : STD_LOGIC;
-  SIGNAL rx_frame_ack         : STD_LOGIC;
-  SIGNAL rx_frame_done        : STD_LOGIC;
-  SIGNAL rx_frame_sosi        : t_dp_sosi;
-  SIGNAL rx_frame_hdr_words   : t_eth_total_header_arr;
-  SIGNAL rx_frame_hdr_fields  : t_eth_total_header;
-  SIGNAL rx_frame_hdr_status  : t_eth_hdr_status;
-  SIGNAL rx_frame_crc_word    : STD_LOGIC_VECTOR(c_eth_data_w-1 DOWNTO 0);
+  SIGNAL rx_frame_rd            : STD_LOGIC;
+  SIGNAL rx_frame_ack           : STD_LOGIC;
+  SIGNAL rx_frame_done          : STD_LOGIC;
+  SIGNAL rx_frame_sosi          : t_dp_sosi;
+  SIGNAL rx_frame_hdr_words_arr : t_network_total_header_32b_arr;
+  SIGNAL rx_frame_hdr_fields    : t_network_total_header;
+  SIGNAL rx_frame_hdr_status    : t_eth_hdr_status;
+  SIGNAL rx_frame_crc_word      : STD_LOGIC_VECTOR(c_eth_data_w-1 DOWNTO 0);
   
   -- ETH Tx
   SIGNAL eth_tx_siso          : t_dp_siso;
@@ -434,7 +434,7 @@ BEGIN
     snk_in          => rx_frame_sosi,
     
     -- Header info
-    hdr_words       => rx_frame_hdr_words,
+    hdr_words_arr   => rx_frame_hdr_words_arr,
     hdr_fields      => rx_frame_hdr_fields,
     hdr_status      => rx_frame_hdr_status
   );
@@ -492,7 +492,7 @@ BEGIN
     rcv_ack           => rx_frame_ack,
     rcv_done          => rx_frame_done,
     rcv_in            => rx_frame_sosi,
-    rcv_hdr_words     => rx_frame_hdr_words,
+    rcv_hdr_words_arr => rx_frame_hdr_words_arr,
     rcv_hdr_status    => rx_frame_hdr_status,
 
     -- Streaming source Tx frame
diff --git a/libraries/io/eth/src/vhdl/eth_control.vhd b/libraries/io/eth/src/vhdl/eth_control.vhd
index 1f42b2725b711a4c364bfe55fa188455e1598f28..c9f05abf52f6ac95e75079241ce81108207231b5 100644
--- a/libraries/io/eth/src/vhdl/eth_control.vhd
+++ b/libraries/io/eth/src/vhdl/eth_control.vhd
@@ -25,8 +25,8 @@ USE IEEE.std_logic_1164.ALL;
 USE IEEE.numeric_std.ALL;
 USE common_lib.common_pkg.ALL;
 USE common_lib.common_mem_pkg.ALL;
+USE common_lib.common_network_total_header_pkg.ALL;
 USE dp_lib.dp_stream_pkg.ALL;
-USE common_lib.common_network_layers_pkg.ALL;
 USE work.eth_pkg.ALL;
 
 ENTITY eth_control IS
@@ -48,7 +48,7 @@ ENTITY eth_control IS
     rcv_ack           : IN  STD_LOGIC;
     rcv_done          : IN  STD_LOGIC;
     rcv_in            : IN  t_dp_sosi;  -- packet memory is always ready for packet data
-    rcv_hdr_words     : IN  t_eth_total_header_arr;
+    rcv_hdr_words_arr : IN  t_network_total_header_32b_arr;
     rcv_hdr_status    : IN  t_eth_hdr_status;
     
     -- Streaming source Tx frame
@@ -77,54 +77,54 @@ ARCHITECTURE rtl OF eth_control IS
     s_tx_done
   );
   
-  SIGNAL nxt_rcv_rd           : STD_LOGIC;
-  SIGNAL rcv_in_eop_dly       : STD_LOGIC;
+  SIGNAL nxt_rcv_rd               : STD_LOGIC;
+  SIGNAL rcv_in_eop_dly           : STD_LOGIC;
   
-  SIGNAL hdr_response         : t_eth_total_header_arr;
-  SIGNAL nxt_hdr_response     : t_eth_total_header_arr;
-  SIGNAL hdr_word_cnt         : NATURAL RANGE 0 TO c_eth_total_header_nof_words := c_eth_total_header_nof_words;
-  SIGNAL nxt_hdr_word_cnt     : NATURAL;
-  SIGNAL hdr_en               : STD_LOGIC;
-  SIGNAL nxt_hdr_en           : STD_LOGIC;
-  SIGNAL hdr_done             : STD_LOGIC;
-  SIGNAL nxt_hdr_done         : STD_LOGIC;
+  SIGNAL hdr_response_arr         : t_network_total_header_32b_arr;
+  SIGNAL nxt_hdr_response_arr     : t_network_total_header_32b_arr;
+  SIGNAL hdr_word_cnt             : NATURAL RANGE 0 TO c_network_total_header_32b_nof_words := c_network_total_header_32b_nof_words;
+  SIGNAL nxt_hdr_word_cnt         : NATURAL;
+  SIGNAL hdr_en                   : STD_LOGIC;
+  SIGNAL nxt_hdr_en               : STD_LOGIC;
+  SIGNAL hdr_done                 : STD_LOGIC;
+  SIGNAL nxt_hdr_done             : STD_LOGIC;
   
-  SIGNAL tx_insert            : STD_LOGIC;
-  SIGNAL nxt_tx_insert        : STD_LOGIC;
+  SIGNAL tx_insert                : STD_LOGIC;
+  SIGNAL nxt_tx_insert            : STD_LOGIC;
   
-  SIGNAL i_reg_status         : t_eth_mm_reg_status;
-  SIGNAL nxt_reg_status       : t_eth_mm_reg_status;
+  SIGNAL i_reg_status             : t_eth_mm_reg_status;
+  SIGNAL nxt_reg_status           : t_eth_mm_reg_status;
   
-  SIGNAL xmt_start            : STD_LOGIC;
-  SIGNAL nxt_xmt_start        : STD_LOGIC;
-  SIGNAL xmt_en               : STD_LOGIC;
-  SIGNAL nxt_xmt_en           : STD_LOGIC;
-  SIGNAL xmt_done             : STD_LOGIC;
-  SIGNAL nxt_xmt_done         : STD_LOGIC;
-  SIGNAL xmt_word_cnt         : NATURAL RANGE 0 TO c_eth_frame_nof_words;
-  SIGNAL nxt_xmt_word_cnt     : NATURAL;
-  SIGNAL tx_nof_words         : STD_LOGIC_VECTOR(c_eth_frame_nof_words_w-1 DOWNTO 0);
-  SIGNAL nxt_tx_nof_words     : STD_LOGIC_VECTOR(c_eth_frame_nof_words_w-1 DOWNTO 0);
-  SIGNAL tx_empty             : STD_LOGIC_VECTOR(c_eth_empty_w-1 DOWNTO 0);
-  SIGNAL nxt_tx_empty         : STD_LOGIC_VECTOR(c_eth_empty_w-1 DOWNTO 0);
+  SIGNAL xmt_start                : STD_LOGIC;
+  SIGNAL nxt_xmt_start            : STD_LOGIC;
+  SIGNAL xmt_en                   : STD_LOGIC;
+  SIGNAL nxt_xmt_en               : STD_LOGIC;
+  SIGNAL xmt_done                 : STD_LOGIC;
+  SIGNAL nxt_xmt_done             : STD_LOGIC;
+  SIGNAL xmt_word_cnt             : NATURAL RANGE 0 TO c_eth_frame_nof_words;
+  SIGNAL nxt_xmt_word_cnt         : NATURAL;
+  SIGNAL tx_nof_words             : STD_LOGIC_VECTOR(c_eth_frame_nof_words_w-1 DOWNTO 0);
+  SIGNAL nxt_tx_nof_words         : STD_LOGIC_VECTOR(c_eth_frame_nof_words_w-1 DOWNTO 0);
+  SIGNAL tx_empty                 : STD_LOGIC_VECTOR(c_eth_empty_w-1 DOWNTO 0);
+  SIGNAL nxt_tx_empty             : STD_LOGIC_VECTOR(c_eth_empty_w-1 DOWNTO 0);
   
-  SIGNAL i_mem_in             : t_mem_mosi;
-  SIGNAL nxt_mem_in           : t_mem_mosi;
-  SIGNAL rd_val               : STD_LOGIC_VECTOR(0 TO c_mem_ram_rd_latency);  -- use [0] to combinatorially store rd (= rd_en)
-  SIGNAL nxt_rd_val           : STD_LOGIC_VECTOR(1 TO c_mem_ram_rd_latency);
-  SIGNAL rd_sop               : STD_LOGIC_VECTOR(    rd_val'RANGE);
-  SIGNAL nxt_rd_sop           : STD_LOGIC_VECTOR(nxt_rd_val'RANGE);
-  SIGNAL rd_eop               : STD_LOGIC_VECTOR(    rd_val'RANGE);
-  SIGNAL nxt_rd_eop           : STD_LOGIC_VECTOR(nxt_rd_val'RANGE);
+  SIGNAL i_mem_in                 : t_mem_mosi;
+  SIGNAL nxt_mem_in               : t_mem_mosi;
+  SIGNAL rd_val                   : STD_LOGIC_VECTOR(0 TO c_mem_ram_rd_latency);  -- use [0] to combinatorially store rd (= rd_en)
+  SIGNAL nxt_rd_val               : STD_LOGIC_VECTOR(1 TO c_mem_ram_rd_latency);
+  SIGNAL rd_sop                   : STD_LOGIC_VECTOR(    rd_val'RANGE);
+  SIGNAL nxt_rd_sop               : STD_LOGIC_VECTOR(nxt_rd_val'RANGE);
+  SIGNAL rd_eop                   : STD_LOGIC_VECTOR(    rd_val'RANGE);
+  SIGNAL nxt_rd_eop               : STD_LOGIC_VECTOR(nxt_rd_val'RANGE);
   
-  SIGNAL xmt_siso             : t_dp_siso;
-  SIGNAL xmt_sosi             : t_dp_sosi;
+  SIGNAL xmt_siso                 : t_dp_siso;
+  SIGNAL xmt_sosi                 : t_dp_sosi;
   
-  SIGNAL i_xmt_out            : t_dp_sosi;
+  SIGNAL i_xmt_out                : t_dp_sosi;
     
   -- ST->MM state machine
-  SIGNAL state                : t_state_enum;
-  SIGNAL nxt_state            : t_state_enum;
+  SIGNAL state                    : t_state_enum;
+  SIGNAL nxt_state                : t_state_enum;
   
 BEGIN
 
@@ -137,7 +137,7 @@ BEGIN
     IF rst='1' THEN
       rcv_rd                   <= '0';
       rcv_in_eop_dly           <= '0';
-      hdr_word_cnt             <= c_eth_total_header_nof_words;
+      hdr_word_cnt             <= c_network_total_header_32b_nof_words;
       hdr_en                   <= '0';
       hdr_done                 <= '0';
       tx_insert                <= '0';
@@ -156,7 +156,7 @@ BEGIN
     ELSIF rising_edge(clk) THEN
       rcv_rd                   <= nxt_rcv_rd;
       rcv_in_eop_dly           <= rcv_in.eop;
-      hdr_response             <= nxt_hdr_response;
+      hdr_response_arr         <= nxt_hdr_response_arr;
       hdr_word_cnt             <= nxt_hdr_word_cnt;
       hdr_en                   <= nxt_hdr_en;
       hdr_done                 <= nxt_hdr_done;
@@ -180,18 +180,18 @@ BEGIN
   -- Response header
   ------------------------------------------------------------------------------
   
-  p_hdr_response : PROCESS(rcv_hdr_words, rcv_hdr_status, reg_config)
+  p_hdr_response_arr : PROCESS(rcv_hdr_words_arr, rcv_hdr_status, reg_config)
   BEGIN
-    nxt_hdr_response   <= func_eth_response_header(     rcv_hdr_words, reg_config.mac_address);
+    nxt_hdr_response_arr   <= func_network_total_header_response_eth(     rcv_hdr_words_arr, reg_config.mac_address);
     IF rcv_hdr_status.is_arp='1' THEN
-      nxt_hdr_response <= func_eth_arp_response_header( rcv_hdr_words, reg_config.mac_address, reg_config.ip_address);
+      nxt_hdr_response_arr <= func_network_total_header_response_arp( rcv_hdr_words_arr, reg_config.mac_address, reg_config.ip_address);
     ELSIF rcv_hdr_status.is_icmp='1' THEN
-      nxt_hdr_response <= func_eth_icmp_response_header(rcv_hdr_words, reg_config.mac_address);
+      nxt_hdr_response_arr <= func_network_total_header_response_icmp(rcv_hdr_words_arr, reg_config.mac_address);
     ELSIF rcv_hdr_status.is_udp='1' THEN
-      nxt_hdr_response <= func_eth_udp_response_header( rcv_hdr_words, reg_config.mac_address);
+      nxt_hdr_response_arr <= func_network_total_header_response_udp( rcv_hdr_words_arr, reg_config.mac_address);
     ELSIF rcv_hdr_status.is_ip='1' THEN
       -- If it is another protocol over IP than ICMP or UDP, then prepare only IP response
-      nxt_hdr_response <= func_eth_ip_response_header(  rcv_hdr_words, reg_config.mac_address);
+      nxt_hdr_response_arr <= func_network_total_header_response_ip(  rcv_hdr_words_arr, reg_config.mac_address);
     END IF;
   END PROCESS;
   
@@ -199,7 +199,7 @@ BEGIN
   -- Frame memory access
   ------------------------------------------------------------------------------
   
-  p_mem_access : PROCESS(i_mem_in, rcv_in, hdr_en, hdr_word_cnt, hdr_response, xmt_en, xmt_siso, xmt_word_cnt)
+  p_mem_access : PROCESS(i_mem_in, rcv_in, hdr_en, hdr_word_cnt, hdr_response_arr, xmt_en, xmt_siso, xmt_word_cnt)
   BEGIN
     nxt_mem_in.address <= i_mem_in.address;
     nxt_mem_in.wrdata  <= i_mem_in.wrdata;
@@ -219,7 +219,7 @@ BEGIN
     -- Prepare the Tx header
     IF hdr_en='1' THEN                                               -- tx buffer starts at address 380
       nxt_mem_in.address <= TO_MEM_ADDRESS(c_eth_ram_tx_offset + hdr_word_cnt);
-      nxt_mem_in.wrdata  <= RESIZE_MEM_DATA(hdr_response(hdr_word_cnt));
+      nxt_mem_in.wrdata  <= RESIZE_MEM_DATA(hdr_response_arr(hdr_word_cnt));
       nxt_mem_in.wr      <= '1';
       nxt_hdr_word_cnt   <= hdr_word_cnt+1;
     END IF;
@@ -335,7 +335,7 @@ BEGIN
           nxt_state <= s_hdr_response;
         END IF;
       WHEN s_hdr_response =>                -- prepare tx header for rx response
-        IF hdr_word_cnt < c_eth_total_header_nof_words-1 THEN
+        IF hdr_word_cnt < c_network_total_header_32b_nof_words-1 THEN
           nxt_hdr_en <= '1';
         ELSE
           nxt_hdr_done <= '1';              -- new frame received and response prepared
diff --git a/libraries/io/eth/src/vhdl/eth_hdr.vhd b/libraries/io/eth/src/vhdl/eth_hdr.vhd
index 1cfb2aea159bd484ed6bbb2b11634f788ea20625..12336bef2e5b74f9311bc80ba558b3ee1cbed1ef 100644
--- a/libraries/io/eth/src/vhdl/eth_hdr.vhd
+++ b/libraries/io/eth/src/vhdl/eth_hdr.vhd
@@ -24,8 +24,8 @@ LIBRARY IEEE, common_lib, dp_lib;
 USE IEEE.std_logic_1164.ALL;
 USE IEEE.numeric_std.ALL;
 USE common_lib.common_pkg.ALL;
+USE common_lib.common_network_total_header_pkg.ALL;
 USE dp_lib.dp_stream_pkg.ALL;
-USE common_lib.common_network_layers_pkg.ALL;
 USE work.eth_pkg.ALL;
 
 -- Description:
@@ -43,28 +43,28 @@ ENTITY eth_hdr IS
   );
   PORT (
     -- Clocks and reset
-    rst             : IN  STD_LOGIC;  -- reset synchronous with clk
-    clk             : IN  STD_LOGIC;  -- packet stream clock
+    rst               : IN  STD_LOGIC;  -- reset synchronous with clk
+    clk               : IN  STD_LOGIC;  -- packet stream clock
     
     -- Streaming Sink
-    snk_in          : IN  t_dp_sosi;
-    snk_out         : OUT t_dp_siso;
+    snk_in            : IN  t_dp_sosi;
+    snk_out           : OUT t_dp_siso;
     
     -- Streaming Source
-    src_in          : IN  t_dp_siso := c_dp_siso_rdy;
-    src_out         : OUT t_dp_sosi;
+    src_in            : IN  t_dp_siso := c_dp_siso_rdy;
+    src_out           : OUT t_dp_sosi;
     
     -- Frame control
-    frm_discard     : IN  STD_LOGIC := '0';
+    frm_discard       : IN  STD_LOGIC := '0';
     
     -- Header info
-    hdr_words       : OUT t_eth_total_header_arr;
-    hdr_words_val   : OUT STD_LOGIC_VECTOR(0 TO c_eth_total_header_nof_words-1);    
-    hdr_fields      : OUT t_eth_total_header;
-    hdr_fields_val  : OUT STD_LOGIC_VECTOR(0 TO c_eth_total_header_nof_words-1);    
-    hdr_data        : OUT STD_LOGIC_VECTOR(c_word_w-1 DOWNTO 0);
-    hdr_data_val    : OUT STD_LOGIC;
-    hdr_status      : OUT t_eth_hdr_status
+    hdr_words_arr     : OUT t_network_total_header_32b_arr;
+    hdr_words_arr_val : OUT STD_LOGIC_VECTOR(0 TO c_network_total_header_32b_nof_words-1);    
+    hdr_fields        : OUT t_network_total_header;
+    hdr_fields_val    : OUT STD_LOGIC_VECTOR(0 TO c_network_total_header_32b_nof_words-1);    
+    hdr_data          : OUT STD_LOGIC_VECTOR(c_word_w-1 DOWNTO 0);
+    hdr_data_val      : OUT STD_LOGIC;
+    hdr_status        : OUT t_eth_hdr_status
   );
 END eth_hdr;
 
@@ -75,13 +75,13 @@ ARCHITECTURE str OF eth_hdr IS
   CONSTANT c_this_snk_latency : NATURAL := 1;
   CONSTANT c_this_src_latency : NATURAL := 1;
     
-  SIGNAL snk_in_word_cnt     : NATURAL RANGE 0 TO c_eth_total_header_nof_words;
+  SIGNAL snk_in_word_cnt     : NATURAL RANGE 0 TO c_network_total_header_32b_nof_words;
   
   -- Extract total header
-  SIGNAL i_hdr_words         : t_eth_total_header_arr;
-  SIGNAL i_hdr_words_val     : STD_LOGIC_VECTOR(0 TO c_eth_total_header_nof_words-1);    
-  SIGNAL i_hdr_fields        : t_eth_total_header;
-  SIGNAL i_hdr_fields_val    : STD_LOGIC_VECTOR(0 TO c_eth_total_header_nof_words-1);    
+  SIGNAL i_hdr_words_arr     : t_network_total_header_32b_arr;
+  SIGNAL i_hdr_words_arr_val : STD_LOGIC_VECTOR(0 TO c_network_total_header_32b_nof_words-1);    
+  SIGNAL i_hdr_fields        : t_network_total_header;
+  SIGNAL i_hdr_fields_val    : STD_LOGIC_VECTOR(0 TO c_network_total_header_32b_nof_words-1);    
   SIGNAL i_hdr_data          : STD_LOGIC_VECTOR(c_word_w-1 DOWNTO 0);
   SIGNAL i_hdr_data_val      : STD_LOGIC;
   SIGNAL i_hdr_status        : t_eth_hdr_status;
@@ -89,13 +89,13 @@ ARCHITECTURE str OF eth_hdr IS
 BEGIN
 
   -- Make all header info available
-  hdr_words      <= i_hdr_words;
-  hdr_words_val  <= i_hdr_words_val ;
-  hdr_fields     <= i_hdr_fields;
-  hdr_fields_val <= i_hdr_fields_val;
-  hdr_data       <= i_hdr_data;
-  hdr_data_val   <= i_hdr_data_val;
-  hdr_status     <= i_hdr_status;
+  hdr_words_arr     <= i_hdr_words_arr;
+  hdr_words_arr_val <= i_hdr_words_arr_val ;
+  hdr_fields        <= i_hdr_fields;
+  hdr_fields_val    <= i_hdr_fields_val;
+  hdr_data          <= i_hdr_data;
+  hdr_data_val      <= i_hdr_data_val;
+  hdr_status        <= i_hdr_status;
   
   ------------------------------------------------------------------------------
   -- IP header checksum control
@@ -110,7 +110,7 @@ BEGIN
       clk             => clk,
       
       -- Stored header
-      hdr_words       => i_hdr_words,
+      hdr_words_arr   => i_hdr_words_arr,
       hdr_status      => i_hdr_status,
       
       -- ST interface
@@ -135,18 +135,18 @@ BEGIN
   -- Store 11 header words
   u_hdr_store : ENTITY work.eth_hdr_store
   PORT MAP (
-    rst             => rst,
-    clk             => clk,
+    rst               => rst,
+    clk               => clk,
     -- Streaming Sink
-    snk_in          => snk_in,
-    snk_in_word_cnt => snk_in_word_cnt,
+    snk_in            => snk_in,
+    snk_in_word_cnt   => snk_in_word_cnt,
     -- Total header
-    hdr_words       => i_hdr_words,
-    hdr_words_val   => i_hdr_words_val,
-    hdr_fields      => i_hdr_fields,
-    hdr_fields_val  => i_hdr_fields_val,
-    hdr_data        => i_hdr_data,
-    hdr_data_val    => i_hdr_data_val
+    hdr_words_arr     => i_hdr_words_arr,
+    hdr_words_arr_val => i_hdr_words_arr_val,
+    hdr_fields        => i_hdr_fields,
+    hdr_fields_val    => i_hdr_fields_val,
+    hdr_data          => i_hdr_data,
+    hdr_data_val      => i_hdr_data_val
   );
 
   -- Determine header status
@@ -155,17 +155,17 @@ BEGIN
     g_ip_header_checksum_calculate => g_ip_header_checksum_calculate
   )
   PORT MAP (
-    rst            => rst,
-    clk            => clk,
+    rst               => rst,
+    clk               => clk,
     -- Total header
-    hdr_words      => i_hdr_words,
-    hdr_words_val  => i_hdr_words_val,
-    hdr_fields     => i_hdr_fields,
-    hdr_fields_val => i_hdr_fields_val,
-    hdr_data       => i_hdr_data,
-    hdr_data_val   => i_hdr_data_val,
+    hdr_words_arr     => i_hdr_words_arr,
+    hdr_words_arr_val => i_hdr_words_arr_val,
+    hdr_fields        => i_hdr_fields,
+    hdr_fields_val    => i_hdr_fields_val,
+    hdr_data          => i_hdr_data,
+    hdr_data_val      => i_hdr_data_val,
     -- Header status
-    hdr_status     => i_hdr_status
+    hdr_status        => i_hdr_status
   );
     
 END str;
diff --git a/libraries/io/eth/src/vhdl/eth_hdr_ctrl.vhd b/libraries/io/eth/src/vhdl/eth_hdr_ctrl.vhd
index 721f5a77e4f852a6f82284713df7c3bee32427f9..34757f8cc455d05ed4a3c1e6f055e88628a74b26 100644
--- a/libraries/io/eth/src/vhdl/eth_hdr_ctrl.vhd
+++ b/libraries/io/eth/src/vhdl/eth_hdr_ctrl.vhd
@@ -24,13 +24,14 @@ LIBRARY IEEE, common_lib, dp_lib;
 USE IEEE.std_logic_1164.ALL;
 USE IEEE.numeric_std.ALL;
 USE common_lib.common_pkg.ALL;
-USE dp_lib.dp_stream_pkg.ALL;
 USE common_lib.common_network_layers_pkg.ALL;
+USE common_lib.common_network_total_header_pkg.ALL;
+USE dp_lib.dp_stream_pkg.ALL;
 USE work.eth_pkg.ALL;
 
 -- Description:
 -- . for IP frames replace IP header checksum with the calculated value
--- . discard frames shorter than 11 words
+-- . discard frames shorter than c_network_total_header_32b_nof_words = 11 words
 -- . frame discard input to optionally discard a frame based on some header criteria
 
 ENTITY eth_hdr_ctrl IS
@@ -40,13 +41,13 @@ ENTITY eth_hdr_ctrl IS
     clk             : IN  STD_LOGIC;
     
     -- Stored header
-    hdr_words       : IN  t_eth_total_header_arr;
+    hdr_words_arr   : IN  t_network_total_header_32b_arr;
     hdr_status      : IN  t_eth_hdr_status;
     
     frm_discard     : IN  STD_LOGIC := '0';
     
     -- ST interface
-    snk_in_word_cnt : IN  NATURAL RANGE 0 TO c_eth_total_header_nof_words;  -- snk_in hdr word count
+    snk_in_word_cnt : IN  NATURAL RANGE 0 TO c_network_total_header_32b_nof_words;  -- snk_in hdr word count
     snk_in          : IN  t_dp_sosi;
     snk_out         : OUT t_dp_siso;
     src_in          : IN  t_dp_siso;
@@ -80,7 +81,7 @@ ARCHITECTURE rtl OF eth_hdr_ctrl IS
   SIGNAL next_src_out        : t_dp_sosi;
   SIGNAL i_src_out           : t_dp_sosi;
   SIGNAL nxt_src_out         : t_dp_sosi;
-  SIGNAL src_word_cnt        : NATURAL RANGE 0 TO c_eth_total_header_nof_words;
+  SIGNAL src_word_cnt        : NATURAL RANGE 0 TO c_network_total_header_32b_nof_words;
   SIGNAL nxt_src_word_cnt    : NATURAL;
   
 BEGIN
@@ -130,7 +131,7 @@ BEGIN
   nxt_snk_in_eop_hold <= '0' WHEN snk_in.sop='1' ELSE
                          '1' WHEN snk_in.eop='1' ELSE snk_in_eop_hold;
   
-  p_state : PROCESS(state, src_word_cnt, i_src_out, snk_in, snk_in_word_cnt, frm_discard, src_in, hdr_words, hdr_status, snk_in_eop_hold, next_src_out)
+  p_state : PROCESS(state, src_word_cnt, i_src_out, snk_in, snk_in_word_cnt, frm_discard, src_in, hdr_words_arr, hdr_status, snk_in_eop_hold, next_src_out)
   BEGIN
     snk_out.ready     <= '1';           -- default accept sink input
     nxt_state         <= state;
@@ -148,7 +149,7 @@ BEGIN
         END IF;
       WHEN s_store_header =>
         -- stop the sink when the whole header has arrived or when a eop has arrived
-        IF snk_in.valid='1' AND snk_in_word_cnt=c_eth_total_header_nof_words-1 THEN
+        IF snk_in.valid='1' AND snk_in_word_cnt=c_network_total_header_32b_nof_words-1 THEN
           snk_out.ready <= '0';
           nxt_state <= s_src_header_sop;
         ELSIF snk_in.eop='1' THEN
@@ -163,7 +164,7 @@ BEGIN
           -- discard this frame because of optional external reasons
           nxt_state <= s_idle;
         ELSIF src_in.ready='1' THEN
-          nxt_src_out.data  <= RESIZE_DP_DATA(hdr_words(src_word_cnt));
+          nxt_src_out.data  <= RESIZE_DP_DATA(hdr_words_arr(src_word_cnt));
           nxt_src_out.valid <= '1';
           nxt_src_out.sop   <= '1';
           nxt_src_out.eop   <= '0';
@@ -174,7 +175,7 @@ BEGIN
         -- stop the input and output the rest of the (modified) header
         snk_out.ready <= '0';
         IF src_in.ready='1' THEN
-          nxt_src_out.data  <= RESIZE_DP_DATA(hdr_words(src_word_cnt));
+          nxt_src_out.data  <= RESIZE_DP_DATA(hdr_words_arr(src_word_cnt));
           nxt_src_out.valid <= '1';
           nxt_src_out.sop   <= '0';
           nxt_src_out.eop   <= '0';
@@ -182,10 +183,10 @@ BEGIN
           -- Replace IP header checksum with the calculated checksum from hdr_status.ip_checksum:
           -- . for Rx: the verified checksum, so will be 0 when OK or != when the received frame has an IP header error.
           -- . for Tx: the calculated checksum for the Tx IP header.
-          IF hdr_status.is_ip='1' AND src_word_cnt=c_ip_header_checksum_wi THEN
-            nxt_src_out.data(c_ip_header_checksum_w-1 DOWNTO 0) <= hdr_status.ip_checksum;
+          IF hdr_status.is_ip='1' AND src_word_cnt=c_network_total_header_32b_ip_header_checksum_wi THEN
+            nxt_src_out.data(c_network_ip_header_checksum_w-1 DOWNTO 0) <= hdr_status.ip_checksum;
           END IF;
-          IF src_word_cnt=c_eth_total_header_nof_words-1 THEN
+          IF src_word_cnt=c_network_total_header_32b_nof_words-1 THEN
             IF snk_in_eop_hold='1' THEN
               -- header only packet
               nxt_src_out.eop <= '1';
diff --git a/libraries/io/eth/src/vhdl/eth_hdr_status.vhd b/libraries/io/eth/src/vhdl/eth_hdr_status.vhd
index 841a1ddbc4bb341d6aca9b6534b2c9e0f0b489a5..55ae50640f6c1d16d9c75688a75baa171399a226 100644
--- a/libraries/io/eth/src/vhdl/eth_hdr_status.vhd
+++ b/libraries/io/eth/src/vhdl/eth_hdr_status.vhd
@@ -24,8 +24,9 @@ LIBRARY IEEE, common_lib, dp_lib;
 USE IEEE.std_logic_1164.ALL;
 USE IEEE.numeric_std.ALL;
 USE common_lib.common_pkg.ALL;
-USE dp_lib.dp_stream_pkg.ALL;
 USE common_lib.common_network_layers_pkg.ALL;
+USE common_lib.common_network_total_header_pkg.ALL;
+USE dp_lib.dp_stream_pkg.ALL;
 USE work.eth_pkg.ALL;
 
 -- Purpose:
@@ -43,19 +44,19 @@ ENTITY eth_hdr_status IS
     g_ip_header_checksum_calculate : BOOLEAN := TRUE
   );
   PORT (
-    rst            : IN  STD_LOGIC;
-    clk            : IN  STD_LOGIC;
+    rst               : IN  STD_LOGIC;
+    clk               : IN  STD_LOGIC;
     
     -- Total header
-    hdr_words      : IN  t_eth_total_header_arr;
-    hdr_words_val  : IN  STD_LOGIC_VECTOR(0 TO c_eth_total_header_nof_words-1);
-    hdr_fields     : IN  t_eth_total_header;
-    hdr_fields_val : IN  STD_LOGIC_VECTOR(0 TO c_eth_total_header_nof_words-1);
-    hdr_data       : IN  STD_LOGIC_VECTOR(c_word_w-1 DOWNTO 0);
-    hdr_data_val   : IN  STD_LOGIC;
+    hdr_words_arr     : IN  t_network_total_header_32b_arr;
+    hdr_words_arr_val : IN  STD_LOGIC_VECTOR(0 TO c_network_total_header_32b_nof_words-1);
+    hdr_fields        : IN  t_network_total_header;
+    hdr_fields_val    : IN  STD_LOGIC_VECTOR(0 TO c_network_total_header_32b_nof_words-1);
+    hdr_data          : IN  STD_LOGIC_VECTOR(c_word_w-1 DOWNTO 0);
+    hdr_data_val      : IN  STD_LOGIC;
     
     -- Header status
-    hdr_status     : OUT t_eth_hdr_status
+    hdr_status        : OUT t_eth_hdr_status
   );
 END eth_hdr_status;
 
@@ -86,18 +87,18 @@ BEGIN
   
   ------------------------------------------------------------------------------
   -- Packet type
-  nxt_hdr_status.is_arp  <= '1' WHEN UNSIGNED(hdr_fields.eth.eth_type)=c_eth_type_arp     AND hdr_fields_val(c_eth_type_wi)='1' ELSE '0';
-  nxt_hdr_status.is_ip   <= '1' WHEN UNSIGNED(hdr_fields.eth.eth_type)=c_eth_type_ip      AND hdr_fields_val(c_eth_type_wi)='1' ELSE '0';
-  nxt_hdr_status.is_icmp <= '1' WHEN UNSIGNED(hdr_fields.ip.protocol)=c_ip_protocol_icmp  AND hdr_fields_val(c_ip_protocol_wi)='1'  AND i_hdr_status.is_ip='1'  ELSE '0';
-  nxt_hdr_status.is_udp  <= '1' WHEN UNSIGNED(hdr_fields.ip.protocol)=c_ip_protocol_udp   AND hdr_fields_val(c_ip_protocol_wi)='1'  AND i_hdr_status.is_ip='1'  ELSE '0';
-  nxt_hdr_status.is_dhcp <= '1' WHEN UNSIGNED(hdr_fields.udp.dst_port)=c_udp_port_dhcp_in AND hdr_fields_val(c_udp_dst_port_wi)='1' AND i_hdr_status.is_udp='1' ELSE '0';
+  nxt_hdr_status.is_arp  <= '1' WHEN UNSIGNED(hdr_fields.eth.eth_type)=c_network_eth_type_arp     AND hdr_fields_val(c_network_total_header_32b_eth_type_wi)='1' ELSE '0';
+  nxt_hdr_status.is_ip   <= '1' WHEN UNSIGNED(hdr_fields.eth.eth_type)=c_network_eth_type_ip      AND hdr_fields_val(c_network_total_header_32b_eth_type_wi)='1' ELSE '0';
+  nxt_hdr_status.is_icmp <= '1' WHEN UNSIGNED(hdr_fields.ip.protocol)=c_network_ip_protocol_icmp  AND hdr_fields_val(c_network_total_header_32b_ip_protocol_wi)='1'  AND i_hdr_status.is_ip='1'  ELSE '0';
+  nxt_hdr_status.is_udp  <= '1' WHEN UNSIGNED(hdr_fields.ip.protocol)=c_network_ip_protocol_udp   AND hdr_fields_val(c_network_total_header_32b_ip_protocol_wi)='1'  AND i_hdr_status.is_ip='1'  ELSE '0';
+  nxt_hdr_status.is_dhcp <= '1' WHEN UNSIGNED(hdr_fields.udp.dst_port)=c_network_udp_port_dhcp_in AND hdr_fields_val(c_network_total_header_32b_udp_dst_port_wi)='1' AND i_hdr_status.is_udp='1' ELSE '0';
   
   ------------------------------------------------------------------------------
   -- IP Header checksum
   ip_header.data  <= RESIZE_dp_data(hdr_data);
-  ip_header.valid <= '1' WHEN UNSIGNED(hdr_words_val(c_ip_lo_wi TO c_ip_hi_wi))/=0 ELSE '0';
-  ip_header.sop   <= hdr_words_val(c_ip_lo_wi);
-  ip_header.eop   <= hdr_words_val(c_ip_hi_wi);
+  ip_header.valid <= '1' WHEN UNSIGNED(hdr_words_arr_val(c_network_total_header_32b_ip_lo_wi TO c_network_total_header_32b_ip_hi_wi))/=0 ELSE '0';
+  ip_header.sop   <= hdr_words_arr_val(c_network_total_header_32b_ip_lo_wi);
+  ip_header.eop   <= hdr_words_arr_val(c_network_total_header_32b_ip_hi_wi);
   ip_header.empty <= (OTHERS=>'0');
   
   -- Calculate the IP header checksum for the packet header
diff --git a/libraries/io/eth/src/vhdl/eth_hdr_store.vhd b/libraries/io/eth/src/vhdl/eth_hdr_store.vhd
index ea5c60da95f4ac22abc1cb4cb3100395306f565a..777146d4ac340bfb9f6fcb12ba9126f7d7f9a6e6 100644
--- a/libraries/io/eth/src/vhdl/eth_hdr_store.vhd
+++ b/libraries/io/eth/src/vhdl/eth_hdr_store.vhd
@@ -23,17 +23,17 @@
 LIBRARY IEEE, common_lib, dp_lib;
 USE IEEE.std_logic_1164.ALL;
 USE common_lib.common_pkg.ALL;
+USE common_lib.common_network_total_header_pkg.ALL;
 USE dp_lib.dp_stream_pkg.ALL;
-USE common_lib.common_network_layers_pkg.ALL;
 USE work.eth_pkg.ALL;
 
 -- Purpose:
 --   Provide the total Ethernet header information for the user to decide upon.
 -- Description:
---   Extract the first c_eth_total_header_nof_words = 11 words from an Ethernet
---   packet and make them available via as a word array and as records fields.
---   The component has three output formats:
---   1) hdr_words, the 11 word header store
+--   Extract the first c_network_total_header_32b_nof_words=11 words from an
+--   Ethernet packet and make them available via as a word array and as records
+--   fields. The component has three output formats:
+--   1) hdr_words_arr, the 11 word header store
 --   2) hdr_data, the currently active header word
 --   3) hdr_fields, combinatorial mapping of the 11 word header store to 
 --      various Ethernet packet header fields.
@@ -45,55 +45,55 @@ USE work.eth_pkg.ALL;
 -- Remarks:
 -- . This component acts as a stream monitor, therefore it does not output a
 --   snk_out.ready.
--- . The word indices from eth_pkg together with hdr_words_val[] can be used
---   to determine which word of the Ethernet header words is valid.
+-- . The word indices from eth_pkg together with hdr_words_arr_val[] can be
+--   used to determine which word of the Ethernet header words is valid.
 -- . The word indices from eth_pkg together with hdr_fields_val[] can be used
 --   to determine which fields of the Ethernet header records are valid. The
---   difference with hdr_words_val is that hdr_words_val is a single cycle 
---   pulse, whereas hdr_fields_val keeps its state until the next sop.
+--   difference with hdr_words_arr_val is that hdr_words_arr_val is a single
+--   cycle pulse, whereas hdr_fields_val keeps its state until the next sop.
 --
 
 ENTITY eth_hdr_store IS
   PORT (
-    rst            : IN  STD_LOGIC;
-    clk            : IN  STD_LOGIC;
+    rst               : IN  STD_LOGIC;
+    clk               : IN  STD_LOGIC;
     
     -- Streaming Sink
-    snk_in          : IN  t_dp_sosi;
-    snk_in_word_cnt : OUT NATURAL RANGE 0 TO c_eth_total_header_nof_words;
+    snk_in            : IN  t_dp_sosi;
+    snk_in_word_cnt   : OUT NATURAL RANGE 0 TO c_network_total_header_32b_nof_words;
     
     -- Total header
-    hdr_words      : OUT t_eth_total_header_arr;
-    hdr_words_val  : OUT STD_LOGIC_VECTOR(0 TO c_eth_total_header_nof_words-1);
+    hdr_words_arr     : OUT t_network_total_header_32b_arr;
+    hdr_words_arr_val : OUT STD_LOGIC_VECTOR(0 TO c_network_total_header_32b_nof_words-1);
     -- Combinatorial map of the 11 header words on to the Ethernet header records
-    hdr_fields     : OUT t_eth_total_header;
-    hdr_fields_val : OUT STD_LOGIC_VECTOR(0 TO c_eth_total_header_nof_words-1);
+    hdr_fields        : OUT t_network_total_header;
+    hdr_fields_val    : OUT STD_LOGIC_VECTOR(0 TO c_network_total_header_32b_nof_words-1);
     -- Support also outputting only the currently valid header data
-    hdr_data       : OUT STD_LOGIC_VECTOR(c_word_w-1 DOWNTO 0);
-    hdr_data_val   : OUT STD_LOGIC
+    hdr_data          : OUT STD_LOGIC_VECTOR(c_word_w-1 DOWNTO 0);
+    hdr_data_val      : OUT STD_LOGIC
   );
 END eth_hdr_store;
 
 
 ARCHITECTURE rtl OF eth_hdr_store IS
 
-  SIGNAL word_cnt           : NATURAL RANGE 0 TO c_eth_total_header_nof_words;
-  SIGNAL nxt_word_cnt       : NATURAL;
+  SIGNAL word_cnt              : NATURAL RANGE 0 TO c_network_total_header_32b_nof_words;
+  SIGNAL nxt_word_cnt          : NATURAL;
   
-  SIGNAL i_hdr_words        : t_eth_total_header_arr := (OTHERS=>(OTHERS=>'0'));  -- init to avoid numeric_std warning, no need to rst
-  SIGNAL nxt_hdr_words      : t_eth_total_header_arr;
-  SIGNAL nxt_hdr_words_val  : STD_LOGIC_VECTOR(hdr_fields_val'RANGE);
-  SIGNAL i_hdr_fields_val   : STD_LOGIC_VECTOR(hdr_fields_val'RANGE);
-  SIGNAL nxt_hdr_fields_val : STD_LOGIC_VECTOR(hdr_fields_val'RANGE);
-  SIGNAL i_hdr_data         : STD_LOGIC_VECTOR(c_word_w-1 DOWNTO 0) := (OTHERS=>'0');  -- init to avoid numeric_std warning, no need to rst
-  SIGNAL nxt_hdr_data       : STD_LOGIC_VECTOR(c_word_w-1 DOWNTO 0);
-  SIGNAL nxt_hdr_data_val   : STD_LOGIC;
+  SIGNAL i_hdr_words_arr       : t_network_total_header_32b_arr := (OTHERS=>(OTHERS=>'0'));  -- init to avoid numeric_std warning, no need to rst
+  SIGNAL nxt_hdr_words_arr     : t_network_total_header_32b_arr;
+  SIGNAL nxt_hdr_words_arr_val : STD_LOGIC_VECTOR(hdr_fields_val'RANGE);
+  SIGNAL i_hdr_fields_val      : STD_LOGIC_VECTOR(hdr_fields_val'RANGE);
+  SIGNAL nxt_hdr_fields_val    : STD_LOGIC_VECTOR(hdr_fields_val'RANGE);
+  SIGNAL i_hdr_data            : STD_LOGIC_VECTOR(c_word_w-1 DOWNTO 0) := (OTHERS=>'0');  -- init to avoid numeric_std warning, no need to rst
+  SIGNAL nxt_hdr_data          : STD_LOGIC_VECTOR(c_word_w-1 DOWNTO 0);
+  SIGNAL nxt_hdr_data_val      : STD_LOGIC;
   
 BEGIN
 
   snk_in_word_cnt <= word_cnt;
   
-  hdr_words      <= i_hdr_words;
+  hdr_words_arr  <= i_hdr_words_arr;
   hdr_fields_val <= i_hdr_fields_val;
   hdr_data       <= i_hdr_data;
   
@@ -102,44 +102,44 @@ BEGIN
     IF rst='1' THEN
       -- input
       -- internal
-      word_cnt         <= 0;
+      word_cnt          <= 0;
       -- output
-      hdr_words_val    <= (OTHERS=>'0');
-      i_hdr_fields_val <= (OTHERS=>'0');
-      hdr_data_val     <= '0';
+      hdr_words_arr_val <= (OTHERS=>'0');
+      i_hdr_fields_val  <= (OTHERS=>'0');
+      hdr_data_val      <= '0';
     ELSIF rising_edge(clk) THEN
       -- input
       -- internal
-      word_cnt         <= nxt_word_cnt;
+      word_cnt          <= nxt_word_cnt;
       -- output
-      i_hdr_words      <= nxt_hdr_words;      -- stored array of 11 words
-      hdr_words_val    <= nxt_hdr_words_val;
-      i_hdr_fields_val <= nxt_hdr_fields_val;
-      i_hdr_data       <= nxt_hdr_data;       -- current word
-      hdr_data_val     <= nxt_hdr_data_val;
+      i_hdr_words_arr   <= nxt_hdr_words_arr;      -- stored array of 11 words
+      hdr_words_arr_val <= nxt_hdr_words_arr_val;
+      i_hdr_fields_val  <= nxt_hdr_fields_val;
+      i_hdr_data        <= nxt_hdr_data;       -- current word
+      hdr_data_val      <= nxt_hdr_data_val;
     END IF;
   END PROCESS;
   
   -- Extract the 11 words from the Ethernet header
-  p_words : PROCESS(word_cnt, i_hdr_words, i_hdr_fields_val, i_hdr_data, snk_in)
+  p_words : PROCESS(word_cnt, i_hdr_words_arr, i_hdr_fields_val, i_hdr_data, snk_in)
   BEGIN
-    nxt_word_cnt       <= word_cnt;
-    nxt_hdr_words      <= i_hdr_words;
-    nxt_hdr_words_val  <= (OTHERS=>'0');
-    nxt_hdr_fields_val <= i_hdr_fields_val;
-    nxt_hdr_data       <= i_hdr_data;
-    nxt_hdr_data_val   <= '0';
+    nxt_word_cnt          <= word_cnt;
+    nxt_hdr_words_arr     <= i_hdr_words_arr;
+    nxt_hdr_words_arr_val <= (OTHERS=>'0');
+    nxt_hdr_fields_val    <= i_hdr_fields_val;
+    nxt_hdr_data          <= i_hdr_data;
+    nxt_hdr_data_val      <= '0';
     IF snk_in.sop='1' THEN
       nxt_hdr_fields_val <= (OTHERS=>'0');
     END IF;
-    IF snk_in.valid='1' AND word_cnt < c_eth_total_header_nof_words THEN
+    IF snk_in.valid='1' AND word_cnt < c_network_total_header_32b_nof_words THEN
       -- new Ethernet header is arriving
-      nxt_word_cnt                 <= word_cnt + 1;
-      nxt_hdr_words(     word_cnt) <= snk_in.data(c_eth_data_w-1 DOWNTO 0);
-      nxt_hdr_words_val( word_cnt) <= '1';
-      nxt_hdr_fields_val(word_cnt) <= '1';
-      nxt_hdr_data                 <= snk_in.data(c_eth_data_w-1 DOWNTO 0);
-      nxt_hdr_data_val             <= '1';
+      nxt_word_cnt                     <= word_cnt + 1;
+      nxt_hdr_words_arr(     word_cnt) <= snk_in.data(c_eth_data_w-1 DOWNTO 0);
+      nxt_hdr_words_arr_val( word_cnt) <= '1';
+      nxt_hdr_fields_val(word_cnt)     <= '1';
+      nxt_hdr_data                     <= snk_in.data(c_eth_data_w-1 DOWNTO 0);
+      nxt_hdr_data_val                 <= '1';
     END IF;
     IF snk_in.eop='1' THEN
       nxt_word_cnt <= 0;
@@ -147,10 +147,10 @@ BEGIN
   END PROCESS;
   
   -- Combinatorial map of the total header on to the Ethernet header records
-  hdr_fields.eth  <= func_eth_map_eth_header( i_hdr_words);
-  hdr_fields.arp  <= func_eth_map_arp_packet( i_hdr_words);
-  hdr_fields.ip   <= func_eth_map_ip_header(  i_hdr_words);
-  hdr_fields.icmp <= func_eth_map_icmp_header(i_hdr_words);
-  hdr_fields.udp  <= func_eth_map_udp_header( i_hdr_words);
+  hdr_fields.eth  <= func_network_total_header_extract_eth( i_hdr_words_arr);
+  hdr_fields.arp  <= func_network_total_header_extract_arp( i_hdr_words_arr);
+  hdr_fields.ip   <= func_network_total_header_extract_ip(  i_hdr_words_arr);
+  hdr_fields.icmp <= func_network_total_header_extract_icmp(i_hdr_words_arr);
+  hdr_fields.udp  <= func_network_total_header_extract_udp( i_hdr_words_arr);
   
 END rtl;
diff --git a/libraries/io/eth/src/vhdl/eth_ihl_to_20.vhd b/libraries/io/eth/src/vhdl/eth_ihl_to_20.vhd
index facba955de5297860015c3d65f6b1c4b003b370e..6cc81235533a942371dbe752392b227419641a5d 100644
--- a/libraries/io/eth/src/vhdl/eth_ihl_to_20.vhd
+++ b/libraries/io/eth/src/vhdl/eth_ihl_to_20.vhd
@@ -24,8 +24,8 @@ LIBRARY IEEE, common_lib, dp_lib;
 USE IEEE.std_logic_1164.ALL;
 USE IEEE.numeric_std.ALL;
 USE common_lib.common_pkg.ALL;
-USE dp_lib.dp_stream_pkg.ALL;
 USE common_lib.common_network_layers_pkg.ALL;
+USE dp_lib.dp_stream_pkg.ALL;
 USE work.eth_pkg.ALL;
 
 -- Purpose:
@@ -84,7 +84,7 @@ ARCHITECTURE rtl OF eth_ihl_to_20 IS
   TYPE state_type IS (Idle, Eth_DestMAC0, Eth_DestMAC1, Eth_SrcMAC0, Eth_SrcMAC1, IPv4_lengths, IPv4_ID, IPv4_TTL, IPv4_SrcIP, IPv4_DestIP, IPv4_Options, IPv4_Payload);
   SIGNAL state   : state_type;
   
-  SIGNAL ihl : unsigned(c_ip_header_length_w-1 downto 0);
+  SIGNAL ihl : unsigned(c_network_ip_header_length_w-1 downto 0);
   
 BEGIN
 
@@ -115,70 +115,60 @@ BEGIN
           IF snk_in.valid = '1' THEN 
             state <= Eth_DestMAC1;
           END IF;
-          
         
         WHEN Eth_DestMAC1  =>
           IF snk_in.valid = '1' THEN 
             state <= Eth_SrcMAC0;
           END IF;
-          
         
         WHEN Eth_SrcMAC0  =>
           IF snk_in.valid = '1' THEN 
-            IF snk_in.data(c_eth_type_slv'RANGE) = TO_UVEC(c_eth_type_ip,c_eth_type_w) THEN -- if IPv4 frame
+            IF snk_in.data(c_network_eth_type_slv'RANGE) = TO_UVEC(c_network_eth_type_ip, c_network_eth_type_w) THEN -- if IPv4 frame
               state <= Eth_SrcMAC1;
             ELSE
               state <= Idle;
             END IF;
           END IF;
           
-        
         WHEN Eth_SrcMAC1  =>
           IF snk_in.valid = '1' THEN
-            IF snk_in.data(27 downto 24) = TO_UVEC(c_ip_header_length,c_ip_header_length_w) THEN  -- if ihl = 20, nothing to do
+            IF snk_in.data(27 downto 24) = TO_UVEC(c_network_ip_header_length, c_network_ip_header_length_w) THEN  -- if ihl = 5 words = 20 bytes, nothing to do
               state <= Idle;
             ELSE
               state <= IPv4_lengths;
-              i_src_out.data(27 downto 24) <= TO_UVEC(c_ip_header_length ,c_ip_header_length_w);  -- make IHL = 20
-              i_src_out.data(c_ip_total_length_w-1 downto 0) <= std_logic_vector(unsigned(snk_in.data(c_ip_total_length_w-1 downto 0))
-                                                                                 - ((unsigned(snk_in.data(27 downto 24))
-                                                                                    - to_unsigned(c_ip_header_length ,c_ip_header_length_w)
-                                                                                    ) & "00"
-                                                                                   )
-                                                                                );                -- correct Total Length
-              ihl <= unsigned(snk_in.data(27 downto 24));  -- save IHL
+              i_src_out.data(27 downto 24) <= TO_UVEC(c_network_ip_header_length, c_network_ip_header_length_w);  -- make IHL = 5 words = 20 bytes
+              i_src_out.data(c_network_ip_total_length_w-1 downto 0) <= std_logic_vector(
+                                             unsigned(snk_in.data(c_network_ip_total_length_w-1 downto 0)) -
+                                           ((unsigned(snk_in.data(27 downto 24)) - to_unsigned(c_network_ip_header_length, c_network_ip_header_length_w)) & "00")
+                                                                                        );                        -- correct Total Length = input Total Length - (input IHL - fixed IHL),
+              ihl <= unsigned(snk_in.data(27 downto 24));  -- save input IHL
             END IF;
           END IF;
         
-        
         WHEN IPv4_lengths  =>
           IF snk_in.valid = '1' THEN
             state <= IPv4_ID;
             ihl <= ihl - 1;
           END IF;
       
-      
         WHEN IPv4_ID  =>
           IF snk_in.valid = '1' THEN
             state <= IPv4_TTL;
-            i_src_out.data(c_ip_header_checksum_w-1 downto 0) <= TO_UVEC(0,c_ip_header_checksum_w);
+            i_src_out.data(c_network_ip_header_checksum_w-1 downto 0) <= TO_UVEC(0, c_network_ip_header_checksum_w);
             ihl <= ihl - 1;
           END IF;
-          
         
         WHEN IPv4_TTL  =>
           IF snk_in.valid = '1' THEN
             state <= IPv4_SrcIP;
             ihl <= ihl - 1;
           END IF;
-          
         
         WHEN IPv4_SrcIP  =>
           IF snk_in.valid = '1' THEN
             state <= IPv4_DestIP;
             ihl <= ihl - 1;
-          END IF;
-          
+          END IF;          
         
         WHEN IPv4_DestIP  =>
           IF snk_in.valid = '1' THEN
@@ -199,7 +189,6 @@ BEGIN
             END IF;
           END IF;
           
-        
         WHEN IPv4_Payload =>
           IF snk_in.eop = '1' and snk_in.valid = '1' THEN
             state <= Idle;
@@ -209,8 +198,6 @@ BEGIN
           state <= Idle;
       END CASE;
     END IF;
-  end PROCESS    ;
-
+  end PROCESS;
   
-
 END rtl;
diff --git a/libraries/io/eth/src/vhdl/eth_mm_reg_frame.vhd b/libraries/io/eth/src/vhdl/eth_mm_reg_frame.vhd
index cbf329ade11a989aca897d26e7be66cbeed42d26..73172c2a83d5d75a90b231dff393a9331ba1bc14 100644
--- a/libraries/io/eth/src/vhdl/eth_mm_reg_frame.vhd
+++ b/libraries/io/eth/src/vhdl/eth_mm_reg_frame.vhd
@@ -24,7 +24,7 @@ LIBRARY IEEE, common_lib;
 USE IEEE.std_logic_1164.ALL;
 USE IEEE.numeric_std.ALL;
 USE common_lib.common_pkg.ALL;
-USE common_lib.common_network_layers_pkg.ALL;
+USE common_lib.common_network_total_header_pkg.ALL;
 USE work.eth_pkg.ALL;
 
 ENTITY eth_mm_reg_frame IS
@@ -34,7 +34,7 @@ ENTITY eth_mm_reg_frame IS
     clk             : IN  STD_LOGIC;  -- packet stream clock
     
     -- Inputs need for the frame register
-    hdr_fields      : IN  t_eth_total_header;                         -- Header info
+    hdr_fields      : IN  t_network_total_header;                     -- Header info
     hdr_status      : IN  t_eth_hdr_status;                           -- Header info
     erc_word        : IN  STD_LOGIC_VECTOR(c_eth_data_w-1 DOWNTO 0);  -- Extracted CRC word (enumerate: 0=OK, >0 AND odd = Error)
     reg_config      : IN  t_eth_mm_reg_config;                        -- Config setting
diff --git a/libraries/io/eth/src/vhdl/eth_pkg.vhd b/libraries/io/eth/src/vhdl/eth_pkg.vhd
index c4f2ffa4cc1079bdb14bc0ed6eb244a979a855fb..de2a60c0718e73c78efc22f9004d4f4f1cfa618e 100644
--- a/libraries/io/eth/src/vhdl/eth_pkg.vhd
+++ b/libraries/io/eth/src/vhdl/eth_pkg.vhd
@@ -24,8 +24,8 @@ LIBRARY IEEE, common_lib, dp_lib, tech_tse_lib;
 USE IEEE.std_logic_1164.ALL;
 USE IEEE.numeric_std.ALL;
 USE common_lib.common_pkg.ALL;
-USE dp_lib.dp_stream_pkg.ALL;
 USE common_lib.common_network_layers_pkg.ALL;
+USE dp_lib.dp_stream_pkg.ALL;
 USE tech_tse_lib.tech_tse_pkg.ALL;
 
 
@@ -70,7 +70,7 @@ PACKAGE eth_pkg IS
     ip_checksum       : STD_LOGIC_VECTOR(c_halfword_w-1 DOWNTO 0);
     ip_checksum_val   : STD_LOGIC;
     ip_checksum_is_ok : STD_LOGIC;
-    udp_port          : STD_LOGIC_VECTOR(c_udp_port_slv'RANGE);
+    udp_port          : STD_LOGIC_VECTOR(c_network_udp_port_slv'RANGE);
     is_dhcp           : STD_LOGIC;
   END RECORD;
   
@@ -104,16 +104,16 @@ PACKAGE eth_pkg IS
   CONSTANT c_eth_reg_continue_wi        : NATURAL := c_eth_reg_status_wi  + c_eth_reg_status_nof_words;
 
   -- . write/read back registers
-  TYPE t_eth_demux_ports_arr IS ARRAY(1 TO c_eth_nof_udp_ports) OF STD_LOGIC_VECTOR(c_udp_port_w-1 DOWNTO 0);
+  TYPE t_eth_demux_ports_arr IS ARRAY(1 TO c_eth_nof_udp_ports) OF STD_LOGIC_VECTOR(c_network_udp_port_w-1 DOWNTO 0);
   TYPE t_eth_mm_reg_demux IS RECORD
     udp_ports_en : STD_LOGIC_VECTOR(1 TO c_eth_nof_udp_ports);  -- [16]
-    udp_ports    : t_eth_demux_ports_arr;                             -- [15:0]
+    udp_ports    : t_eth_demux_ports_arr;                       -- [15:0]
   END RECORD;
 
   TYPE t_eth_mm_reg_config IS RECORD
-    udp_port             : STD_LOGIC_VECTOR(c_udp_port_w-1 DOWNTO 0);       -- [15:0]
-    ip_address           : STD_LOGIC_VECTOR(c_ip_addr_w-1 DOWNTO 0);        -- [31:0]
-    mac_address          : STD_LOGIC_VECTOR(c_eth_mac_addr_w-1 DOWNTO 0);   -- [15:0], [31:0]
+    udp_port             : STD_LOGIC_VECTOR(c_network_udp_port_w-1 DOWNTO 0);       -- [15:0]
+    ip_address           : STD_LOGIC_VECTOR(c_network_ip_addr_w-1 DOWNTO 0);        -- [31:0]
+    mac_address          : STD_LOGIC_VECTOR(c_network_eth_mac_addr_w-1 DOWNTO 0);   -- [15:0], [31:0]
   END RECORD;
   
   TYPE t_eth_mm_reg_control IS RECORD
@@ -228,8 +228,8 @@ PACKAGE BODY eth_pkg IS
   BEGIN
     -- Demux UDP MM registers
     FOR I IN 1 TO c_eth_nof_udp_ports LOOP
-      v_reg.udp_ports_en(I) := mm_reg(c_udp_port_w   + (I-1)*c_word_w);                        -- [16]   = UDP port enable
-      v_reg.udp_ports(I)    := mm_reg(c_udp_port_w-1 + (I-1)*c_word_w DOWNTO (I-1)*c_word_w);  -- [15:0] = UDP port number
+      v_reg.udp_ports_en(I) := mm_reg(c_network_udp_port_w   + (I-1)*c_word_w);                        -- [16]   = UDP port enable
+      v_reg.udp_ports(I)    := mm_reg(c_network_udp_port_w-1 + (I-1)*c_word_w DOWNTO (I-1)*c_word_w);  -- [15:0] = UDP port number
     END LOOP;
     RETURN v_reg;
   END func_eth_mm_reg_demux;
@@ -237,10 +237,10 @@ PACKAGE BODY eth_pkg IS
   FUNCTION func_eth_mm_reg_demux(mm_reg : t_eth_mm_reg_demux) RETURN STD_LOGIC_VECTOR IS
     VARIABLE v_reg : STD_LOGIC_VECTOR(c_eth_reg_demux_nof_words*c_word_w-1 DOWNTO 0);
   BEGIN
-    v_reg                                                          := (OTHERS=>'0');           -- rsvd
+    v_reg := (OTHERS=>'0');                                                                            -- rsvd
     FOR I IN 1 TO c_eth_nof_udp_ports LOOP
-      v_reg(c_udp_port_w   + (I-1)*c_word_w)                       := mm_reg.udp_ports_en(I);  -- [16]   = UDP port enable
-      v_reg(c_udp_port_w-1 + (I-1)*c_word_w DOWNTO (I-1)*c_word_w) := mm_reg.udp_ports(I);     -- [15:0] = UDP port number
+      v_reg(c_network_udp_port_w   + (I-1)*c_word_w)                       := mm_reg.udp_ports_en(I);  -- [16]   = UDP port enable
+      v_reg(c_network_udp_port_w-1 + (I-1)*c_word_w DOWNTO (I-1)*c_word_w) := mm_reg.udp_ports(I);     -- [15:0] = UDP port number
     END LOOP;
     RETURN v_reg;
   END func_eth_mm_reg_demux;
@@ -249,9 +249,9 @@ PACKAGE BODY eth_pkg IS
   FUNCTION func_eth_mm_reg_config(mm_reg : STD_LOGIC_VECTOR) RETURN t_eth_mm_reg_config IS
     VARIABLE v_reg : t_eth_mm_reg_config;
   BEGIN
-    v_reg.udp_port                        := mm_reg(c_udp_port_w+3*c_word_w-1 DOWNTO 3*c_word_w);  -- [15:0]  = control UDP port number
-    v_reg.ip_address                      := mm_reg(             3*c_word_w-1 DOWNTO 2*c_word_w);  -- [31:0]  = this node IP address
-    v_reg.mac_address(47 DOWNTO 32)       := mm_reg(  c_halfword_w+c_word_w-1 DOWNTO   c_word_w);  -- [47:32] = this node MAC address
+    v_reg.udp_port                        := mm_reg(c_network_udp_port_w+3*c_word_w-1 DOWNTO 3*c_word_w);  -- [15:0]  = control UDP port number
+    v_reg.ip_address                      := mm_reg(                     3*c_word_w-1 DOWNTO 2*c_word_w);  -- [31:0]  = this node IP address
+    v_reg.mac_address(47 DOWNTO 32)       := mm_reg(        c_halfword_w+  c_word_w-1 DOWNTO   c_word_w);  -- [47:32] = this node MAC address
     v_reg.mac_address(31 DOWNTO 0)        := mm_reg(               c_word_w-1 DOWNTO   0);         -- [31:0]  = this node MAC address
     RETURN v_reg;
   END func_eth_mm_reg_config;
@@ -259,11 +259,11 @@ PACKAGE BODY eth_pkg IS
   FUNCTION func_eth_mm_reg_config(mm_reg : t_eth_mm_reg_config) RETURN STD_LOGIC_VECTOR IS
     VARIABLE v_reg : STD_LOGIC_VECTOR(c_eth_reg_config_nof_words*c_word_w-1 DOWNTO 0);
   BEGIN
-    v_reg                                              := (OTHERS=>'0');                            -- rsvd
-    v_reg(c_udp_port_w+3*c_word_w-1 DOWNTO 3*c_word_w) := mm_reg.udp_port;                          -- [15:0]  = control UDP port number
-    v_reg(             3*c_word_w-1 DOWNTO 2*c_word_w) := mm_reg.ip_address;                        -- [31:0]  = this node IP address
-    v_reg(  c_halfword_w+c_word_w-1 DOWNTO   c_word_w) := mm_reg.mac_address(47 DOWNTO 32);         -- [47:32] = this node MAC address
-    v_reg(               c_word_w-1 DOWNTO   0)        := mm_reg.mac_address(31 DOWNTO 0);          -- [31:0]  = this node MAC address
+    v_reg                                                      := (OTHERS=>'0');                     -- rsvd
+    v_reg(c_network_udp_port_w+3*c_word_w-1 DOWNTO 3*c_word_w) := mm_reg.udp_port;                   -- [15:0]  = control UDP port number
+    v_reg(                     3*c_word_w-1 DOWNTO 2*c_word_w) := mm_reg.ip_address;                 -- [31:0]  = this node IP address
+    v_reg(        c_halfword_w+  c_word_w-1 DOWNTO   c_word_w) := mm_reg.mac_address(47 DOWNTO 32);  -- [47:32] = this node MAC address
+    v_reg(                       c_word_w-1 DOWNTO   0)        := mm_reg.mac_address(31 DOWNTO 0);   -- [31:0]  = this node MAC address
     RETURN v_reg;
   END func_eth_mm_reg_config;
     
@@ -282,7 +282,7 @@ PACKAGE BODY eth_pkg IS
   FUNCTION func_eth_mm_reg_control(mm_reg : t_eth_mm_reg_control) RETURN STD_LOGIC_VECTOR IS
     VARIABLE v_reg : STD_LOGIC_VECTOR(c_eth_reg_control_nof_words*c_word_w-1 DOWNTO 0);
   BEGIN
-    v_reg                                                                     := (OTHERS=>'0');        -- rsvd
+    v_reg                                                                         := (OTHERS=>'0');        -- rsvd
     v_reg(c_eth_max_frame_nof_words_w+c_eth_empty_w+16-1 DOWNTO c_eth_empty_w+16) := mm_reg.tx_nof_words;  -- [29:18]
     v_reg(                            c_eth_empty_w+16-1 DOWNTO               16) := mm_reg.tx_empty;      -- [17:16]
     v_reg(                                                                     2) := mm_reg.tx_request;    -- [2]
@@ -340,7 +340,7 @@ PACKAGE BODY eth_pkg IS
   FUNCTION func_eth_mm_reg_status(mm_reg : t_eth_mm_reg_status) RETURN STD_LOGIC_VECTOR IS
     VARIABLE v_reg : STD_LOGIC_VECTOR(c_eth_reg_status_nof_words*c_word_w-1 DOWNTO 0);
   BEGIN
-    v_reg                                                                     := (OTHERS=>'0');        -- rsvd
+    v_reg                                                                         := (OTHERS=>'0');        -- rsvd
     v_reg(c_eth_max_frame_nof_words_w+c_eth_empty_w+16-1 DOWNTO c_eth_empty_w+16) := mm_reg.rx_nof_words;  -- [29:18]
     v_reg(                            c_eth_empty_w+16-1 DOWNTO               16) := mm_reg.rx_empty;      -- [17:16]
     v_reg(                                                                     2) := mm_reg.tx_avail;      -- [2]
diff --git a/libraries/io/eth/tb/vhdl/tb_eth.vhd b/libraries/io/eth/tb/vhdl/tb_eth.vhd
index 8c4833a5137445fbc59e8ec5ff8ab220381b359b..ff9df48eb92f05536e970a51b682f168e58c9f80 100644
--- a/libraries/io/eth/tb/vhdl/tb_eth.vhd
+++ b/libraries/io/eth/tb/vhdl/tb_eth.vhd
@@ -46,8 +46,9 @@ USE IEEE.numeric_std.ALL;
 USE common_lib.common_pkg.ALL;
 USE common_lib.common_mem_pkg.ALL;
 USE common_lib.tb_common_mem_pkg.ALL;
-USE dp_lib.dp_stream_pkg.ALL;
 USE common_lib.common_network_layers_pkg.ALL;
+USE common_lib.common_network_total_header_pkg.ALL;
+USE dp_lib.dp_stream_pkg.ALL;
 USE WORK.eth_pkg.ALL;
 USE tech_tse_lib.tech_tse_pkg.ALL;
 USE tech_tse_lib.tb_tech_tse_pkg.ALL;
@@ -82,99 +83,89 @@ ARCHITECTURE tb OF tb_eth IS
   
   -- Payload user data
   CONSTANT c_tb_nof_data        : NATURAL := 0;  -- nof UDP user data, nof ping padding data
-  CONSTANT c_tb_ip_nof_data     : NATURAL := c_udp_header_len + c_tb_nof_data; -- nof IP data,
-                                          -- also suits ICMP, because c_icmp_header_len = c_udp_header_len
+  CONSTANT c_tb_ip_nof_data     : NATURAL := c_network_udp_header_len + c_tb_nof_data; -- nof IP data,
+                                          -- also suits ICMP, because c_network_icmp_header_len = c_network_udp_header_len
   CONSTANT c_tb_reply_payload   : BOOLEAN := TRUE;  -- TRUE copy rx payload into response payload, else header only (e.g. for ARP)
 
   -- Packet headers
   -- . Ethernet header
-  CONSTANT c_word_align         : STD_LOGIC_VECTOR(c_eth_word_align_w-1 DOWNTO 0) := TO_UVEC(c_eth_word_align, c_eth_word_align_w);
-  CONSTANT c_lcu_src_mac        : STD_LOGIC_VECTOR(c_eth_mac_slv'RANGE) := X"10FA01020300";
-  CONSTANT c_dut_src_mac        : STD_LOGIC_VECTOR(c_eth_mac_slv'RANGE) := X"123456789ABC";  -- = 12-34-56-78-9A-BC
-  CONSTANT c_dut_src_mac_hi     : NATURAL := TO_UINT(c_dut_src_mac(c_eth_mac_addr_w-1 DOWNTO c_word_w));
-  CONSTANT c_dut_src_mac_lo     : NATURAL := TO_UINT(c_dut_src_mac(        c_word_w-1 DOWNTO        0));
+  CONSTANT c_lcu_src_mac        : STD_LOGIC_VECTOR(c_network_eth_mac_slv'RANGE) := X"10FA01020300";
+  CONSTANT c_dut_src_mac        : STD_LOGIC_VECTOR(c_network_eth_mac_slv'RANGE) := X"123456789ABC";  -- = 12-34-56-78-9A-BC
+  CONSTANT c_dut_src_mac_hi     : NATURAL := TO_UINT(c_dut_src_mac(c_network_eth_mac_addr_w-1 DOWNTO c_word_w));
+  CONSTANT c_dut_src_mac_lo     : NATURAL := TO_UINT(c_dut_src_mac(                c_word_w-1 DOWNTO        0));
                                 -- support only ARP and IPv4 over ETH
-  CONSTANT c_dut_ethertype      : NATURAL := sel_a_b(g_data_type-c_tb_tse_data_type_arp, c_eth_type_ip, c_eth_type_arp);
-  CONSTANT c_tx_eth_header      : t_eth_header := (word_align => c_word_align,
-                                                   dst_mac    => c_dut_src_mac,
-                                                   src_mac    => c_lcu_src_mac,
-                                                   eth_type   => TO_UVEC(c_dut_ethertype, c_eth_type_w));
-  CONSTANT c_exp_eth_header     : t_eth_header := (word_align => c_tx_eth_header.word_align, -- =
-                                                   dst_mac    => c_tx_eth_header.src_mac,    -- \/
-                                                   src_mac    => c_tx_eth_header.dst_mac,    -- /\
-                                                   eth_type   => c_tx_eth_header.eth_type);  -- =
+  CONSTANT c_dut_ethertype      : NATURAL := sel_a_b(g_data_type-c_tb_tse_data_type_arp, c_network_eth_type_ip, c_network_eth_type_arp);
+  CONSTANT c_tx_eth_header      : t_network_eth_header := (dst_mac    => c_dut_src_mac,
+                                                           src_mac    => c_lcu_src_mac,
+                                                           eth_type   => TO_UVEC(c_dut_ethertype, c_network_eth_type_w));
+  CONSTANT c_exp_eth_header     : t_network_eth_header := (dst_mac    => c_tx_eth_header.src_mac,    -- \/
+                                                           src_mac    => c_tx_eth_header.dst_mac,    -- /\
+                                                           eth_type   => c_tx_eth_header.eth_type);  -- =
                                                    
   -- . IP header
   CONSTANT c_lcu_ip_addr        : NATURAL := 16#05060708#;  -- = 05:06:07:08
   CONSTANT c_dut_ip_addr        : NATURAL := 16#01020304#;
-  CONSTANT c_tb_ip_total_length : NATURAL := c_ip_total_length + c_tb_ip_nof_data;
-                                             -- support only ping protocol or UDP protocol over IP
-  CONSTANT c_tb_ip_protocol     : NATURAL := sel_a_b(g_data_type-c_tb_tse_data_type_ping, c_ip_protocol_udp, c_ip_protocol_icmp);
+  CONSTANT c_tb_ip_total_length : NATURAL := c_network_ip_total_length + c_tb_ip_nof_data;
+  CONSTANT c_tb_ip_protocol     : NATURAL := sel_a_b(g_data_type-c_tb_tse_data_type_ping, c_network_ip_protocol_udp, c_network_ip_protocol_icmp);  -- support only ping protocol or UDP protocol over IP
   
-  CONSTANT c_tx_ip_header       : t_ip_header := (version         => TO_UVEC(c_ip_version,         c_ip_version_w),
-                                                  header_length   => TO_UVEC(c_ip_header_length,   c_ip_header_length_w),
-                                                  services        => TO_UVEC(c_ip_services,        c_ip_services_w),
-                                                  total_length    => TO_UVEC(c_tb_ip_total_length, c_ip_total_length_w),
-                                                  identification  => TO_UVEC(c_ip_identification,  c_ip_identification_w),
-                                                  flags           => TO_UVEC(c_ip_flags,           c_ip_flags_w),
-                                                  fragment_offset => TO_UVEC(c_ip_fragment_offset, c_ip_fragment_offset_w),
-                                                  time_to_live    => TO_UVEC(c_ip_time_to_live,    c_ip_time_to_live_w),
-                                                  protocol        => TO_UVEC(c_tb_ip_protocol,     c_ip_protocol_w),
-                                                  header_checksum => TO_UVEC(c_ip_header_checksum, c_ip_header_checksum_w),  -- init value (or try 0xEBBD = 60349)
-                                                  src_ip_addr     => TO_UVEC(c_lcu_ip_addr,        c_ip_addr_w),
-                                                  dst_ip_addr     => TO_UVEC(c_dut_ip_addr,        c_ip_addr_w));
+  CONSTANT c_tx_ip_header       : t_network_ip_header := (version         => TO_UVEC(c_network_ip_version,         c_network_ip_version_w),
+                                                          header_length   => TO_UVEC(c_network_ip_header_length,   c_network_ip_header_length_w),
+                                                          services        => TO_UVEC(c_network_ip_services,        c_network_ip_services_w),
+                                                          total_length    => TO_UVEC(c_tb_ip_total_length,         c_network_ip_total_length_w),
+                                                          identification  => TO_UVEC(c_network_ip_identification,  c_network_ip_identification_w),
+                                                          flags           => TO_UVEC(c_network_ip_flags,           c_network_ip_flags_w),
+                                                          fragment_offset => TO_UVEC(c_network_ip_fragment_offset, c_network_ip_fragment_offset_w),
+                                                          time_to_live    => TO_UVEC(c_network_ip_time_to_live,    c_network_ip_time_to_live_w),
+                                                          protocol        => TO_UVEC(c_tb_ip_protocol,             c_network_ip_protocol_w),
+                                                          header_checksum => TO_UVEC(c_network_ip_header_checksum, c_network_ip_header_checksum_w),  -- init value (or try 0xEBBD = 60349)
+                                                          src_ip_addr     => TO_UVEC(c_lcu_ip_addr,                c_network_ip_addr_w),
+                                                          dst_ip_addr     => TO_UVEC(c_dut_ip_addr,                c_network_ip_addr_w));
                                                   
-  CONSTANT c_exp_ip_header      : t_ip_header := (version         => c_tx_ip_header.version,          -- =
-                                                  header_length   => c_tx_ip_header.header_length,    -- =
-                                                  services        => c_tx_ip_header.services,         -- =
-                                                  total_length    => c_tx_ip_header.total_length,     -- =
-                                                  identification  => c_tx_ip_header.identification,   -- =
-                                                  flags           => c_tx_ip_header.flags,            -- =
-                                                  fragment_offset => c_tx_ip_header.fragment_offset,  -- =
-                                                  time_to_live    => c_tx_ip_header.time_to_live,     -- =
-                                                  protocol        => c_tx_ip_header.protocol,         -- =
-                                                  header_checksum => c_tx_ip_header.header_checksum,  -- init value
-                                                  src_ip_addr     => c_tx_ip_header.dst_ip_addr,      -- \/
-                                                  dst_ip_addr     => c_tx_ip_header.src_ip_addr);     -- /\
+  CONSTANT c_exp_ip_header      : t_network_ip_header := (version         => c_tx_ip_header.version,          -- =
+                                                          header_length   => c_tx_ip_header.header_length,    -- =
+                                                          services        => c_tx_ip_header.services,         -- =
+                                                          total_length    => c_tx_ip_header.total_length,     -- =
+                                                          identification  => c_tx_ip_header.identification,   -- =
+                                                          flags           => c_tx_ip_header.flags,            -- =
+                                                          fragment_offset => c_tx_ip_header.fragment_offset,  -- =
+                                                          time_to_live    => c_tx_ip_header.time_to_live,     -- =
+                                                          protocol        => c_tx_ip_header.protocol,         -- =
+                                                          header_checksum => c_tx_ip_header.header_checksum,  -- init value
+                                                          src_ip_addr     => c_tx_ip_header.dst_ip_addr,      -- \/
+                                                          dst_ip_addr     => c_tx_ip_header.src_ip_addr);     -- /\
                                                   
   -- . ARP packet
-  CONSTANT c_tx_arp_packet      : t_arp_packet := (htype => TO_UVEC(c_arp_htype,        c_arp_htype_w),
-                                                   ptype => TO_UVEC(c_arp_ptype,        c_arp_ptype_w),
-                                                   hlen  => TO_UVEC(c_arp_hlen,         c_arp_hlen_w),
-                                                   plen  => TO_UVEC(c_arp_plen,         c_arp_plen_w),
-                                                   oper  => TO_UVEC(c_arp_oper_request, c_arp_oper_w),
-                                                   sha   => c_lcu_src_mac,
-                                                   spa   => TO_UVEC(c_lcu_ip_addr,      c_ip_addr_w),
-                                                   tha   => c_dut_src_mac,
-                                                   tpa   => TO_UVEC(c_dut_ip_addr,      c_ip_addr_w));
+  CONSTANT c_tx_arp_packet      : t_network_arp_packet := (htype => TO_UVEC(c_network_arp_htype,        c_network_arp_htype_w),
+                                                           ptype => TO_UVEC(c_network_arp_ptype,        c_network_arp_ptype_w),
+                                                           hlen  => TO_UVEC(c_network_arp_hlen,         c_network_arp_hlen_w),
+                                                           plen  => TO_UVEC(c_network_arp_plen,         c_network_arp_plen_w),
+                                                           oper  => TO_UVEC(c_network_arp_oper_request, c_network_arp_oper_w),
+                                                           sha   => c_lcu_src_mac,
+                                                           spa   => TO_UVEC(c_lcu_ip_addr,              c_network_ip_addr_w),
+                                                           tha   => c_dut_src_mac,
+                                                           tpa   => TO_UVEC(c_dut_ip_addr,              c_network_ip_addr_w));
 
-  CONSTANT c_exp_arp_packet     : t_arp_packet := (htype => c_tx_arp_packet.htype,
-                                                   ptype => c_tx_arp_packet.ptype,
-                                                   hlen  => c_tx_arp_packet.hlen,
-                                                   plen  => c_tx_arp_packet.plen,
-                                                   oper  => TO_UVEC(c_arp_oper_reply, c_arp_oper_w),  -- reply
-                                                   sha   => c_tx_arp_packet.tha,                      --  \/
-                                                   spa   => c_tx_arp_packet.tpa,                      --  /\  \/
-                                                   tha   => c_tx_arp_packet.sha,                      -- /  \ /\ 
-                                                   tpa   => c_tx_arp_packet.spa);                     --     /  \
+  CONSTANT c_exp_arp_packet     : t_network_arp_packet := (htype => c_tx_arp_packet.htype,
+                                                           ptype => c_tx_arp_packet.ptype,
+                                                           hlen  => c_tx_arp_packet.hlen,
+                                                           plen  => c_tx_arp_packet.plen,
+                                                           oper  => TO_UVEC(c_network_arp_oper_reply, c_network_arp_oper_w),  -- reply
+                                                           sha   => c_tx_arp_packet.tha,                      --  \/
+                                                           spa   => c_tx_arp_packet.tpa,                      --  /\  \/
+                                                           tha   => c_tx_arp_packet.sha,                      -- /  \ /\ 
+                                                           tpa   => c_tx_arp_packet.spa);                     --     /  \
                                                    
-  CONSTANT c_arp_htype              : NATURAL := 1;                   -- Hardware type, 1=ethernet
-  CONSTANT c_arp_ptype              : NATURAL := c_eth_type_ip;       -- Protocol type, do ARP for IPv4
-  CONSTANT c_arp_hlen               : NATURAL := c_eth_mac_addr_len;  -- Hardware length = 6
-  CONSTANT c_arp_plen               : NATURAL := c_ip_addr_len;       -- Protocol length = 4
-  CONSTANT c_arp_oper               : NATURAL := 1;                   -- Operator, 1=request, (2=reply)
- 
   -- . ICMP header
-  CONSTANT c_tx_icmp_header      : t_icmp_header := (msg_type => TO_UVEC(c_icmp_msg_type_request, c_icmp_msg_type_w),  -- ping request
-                                                     code     => TO_UVEC(c_icmp_code,     c_icmp_code_w),
-                                                     checksum => TO_UVEC(c_icmp_checksum, c_icmp_checksum_w),          -- init value
-                                                     id       => TO_UVEC(c_icmp_id,       c_icmp_id_w),
-                                                     sequence => TO_UVEC(c_icmp_sequence, c_icmp_sequence_w));
-  CONSTANT c_exp_icmp_header     : t_icmp_header := (msg_type => TO_UVEC(c_icmp_msg_type_reply, c_icmp_msg_type_w), -- ping reply
-                                                     code     => c_tx_icmp_header.code,
-                                                     checksum => c_tx_icmp_header.checksum,                         -- init value
-                                                     id       => c_tx_icmp_header.id,
-                                                     sequence => c_tx_icmp_header.sequence);
+  CONSTANT c_tx_icmp_header      : t_network_icmp_header := (msg_type => TO_UVEC(c_network_icmp_msg_type_request, c_network_icmp_msg_type_w),  -- ping request
+                                                             code     => TO_UVEC(c_network_icmp_code,             c_network_icmp_code_w),
+                                                             checksum => TO_UVEC(c_network_icmp_checksum,         c_network_icmp_checksum_w),  -- init value
+                                                             id       => TO_UVEC(c_network_icmp_id,               c_network_icmp_id_w),
+                                                             sequence => TO_UVEC(c_network_icmp_sequence,         c_network_icmp_sequence_w));
+  CONSTANT c_exp_icmp_header     : t_network_icmp_header := (msg_type => TO_UVEC(c_network_icmp_msg_type_reply,   c_network_icmp_msg_type_w),  -- ping reply
+                                                             code     => c_tx_icmp_header.code,
+                                                             checksum => c_tx_icmp_header.checksum,          -- init value
+                                                             id       => c_tx_icmp_header.id,
+                                                             sequence => c_tx_icmp_header.sequence);
   
   -- . UDP header
   CONSTANT c_dut_udp_port_ctrl   : NATURAL := 11;                  -- ETH demux UDP for control
@@ -184,19 +175,19 @@ ARCHITECTURE tb OF tb_eth IS
   CONSTANT c_dut_udp_port_en     : NATURAL := 16#10000#;           -- ETH demux UDP port enable bit 16
   CONSTANT c_lcu_udp_port        : NATURAL := 10;                  -- UDP port used for src_port
   CONSTANT c_dut_udp_port_st     : NATURAL := c_dut_udp_port_st0;  -- UDP port used for dst_port
-  CONSTANT c_tb_udp_total_length : NATURAL := c_udp_total_length + c_tb_nof_data;
-  CONSTANT c_tx_udp_header       : t_udp_header := (src_port     => TO_UVEC(c_lcu_udp_port,        c_udp_port_w),
-                                                    dst_port     => TO_UVEC(c_dut_udp_port_ctrl,   c_udp_port_w),       -- or use c_dut_udp_port_st#
-                                                    total_length => TO_UVEC(c_tb_udp_total_length, c_udp_total_length_w),
-                                                    checksum     => TO_UVEC(c_udp_checksum,        c_udp_checksum_w));  -- init value
+  CONSTANT c_tb_udp_total_length : NATURAL := c_network_udp_total_length + c_tb_nof_data;
+  CONSTANT c_tx_udp_header       : t_network_udp_header := (src_port     => TO_UVEC(c_lcu_udp_port,         c_network_udp_port_w),
+                                                            dst_port     => TO_UVEC(c_dut_udp_port_ctrl,    c_network_udp_port_w),       -- or use c_dut_udp_port_st#
+                                                            total_length => TO_UVEC(c_tb_udp_total_length,  c_network_udp_total_length_w),
+                                                            checksum     => TO_UVEC(c_network_udp_checksum, c_network_udp_checksum_w));  -- init value
 
-  CONSTANT c_exp_udp_header      : t_udp_header := (src_port     => c_tx_udp_header.dst_port,      -- \/
-                                                    dst_port     => c_tx_udp_header.src_port,      -- /\
-                                                    total_length => c_tx_udp_header.total_length,  -- =
-                                                    checksum     => c_tx_udp_header.checksum);     -- init value
+  CONSTANT c_exp_udp_header      : t_network_udp_header := (src_port     => c_tx_udp_header.dst_port,      -- \/
+                                                            dst_port     => c_tx_udp_header.src_port,      -- /\
+                                                            total_length => c_tx_udp_header.total_length,  -- =
+                                                            checksum     => c_tx_udp_header.checksum);     -- init value
 
-  SIGNAL tx_total_header     : t_eth_total_header;  -- transmitted packet header
-  SIGNAL exp_total_header    : t_eth_total_header;  -- expected received packet header
+  SIGNAL tx_total_header     : t_network_total_header;  -- transmitted packet header
+  SIGNAL exp_total_header    : t_network_total_header;  -- expected received packet header
   
   -- ETH control
   CONSTANT c_dut_control_rx_en   : NATURAL := 2**c_eth_mm_reg_control_bi.rx_en;
@@ -367,7 +358,7 @@ BEGIN
           eth_mm_reg_control.tx_nof_words <= INCR_UVEC(eth_mm_reg_status.rx_nof_words, -1);  -- -1 to skip the CRC word for the response
           eth_mm_reg_control.tx_empty     <= eth_mm_reg_status.rx_empty;
         ELSE
-          eth_mm_reg_control.tx_nof_words <= TO_UVEC(c_eth_total_header_nof_words, c_eth_max_frame_nof_words_w);
+          eth_mm_reg_control.tx_nof_words <= TO_UVEC(c_network_total_header_32b_nof_words, c_eth_max_frame_nof_words_w);
           eth_mm_reg_control.tx_empty     <= TO_UVEC(0, c_eth_empty_w);
         END IF;
         eth_mm_reg_control.tx_en <= '1';
diff --git a/libraries/io/eth/tb/vhdl/tb_eth_ihl_to_20.vhd b/libraries/io/eth/tb/vhdl/tb_eth_ihl_to_20.vhd
index 965e42b78e9d39703569f110450c33a6cbd76243..da91b51968bf737650b16ba24f5eb2feded2e8ce 100644
--- a/libraries/io/eth/tb/vhdl/tb_eth_ihl_to_20.vhd
+++ b/libraries/io/eth/tb/vhdl/tb_eth_ihl_to_20.vhd
@@ -77,9 +77,9 @@ ARCHITECTURE tb OF tb_eth_IHL_to_20 IS
     snk_in.data  <= RESIZE_DP_DATA(X"00000800");
     WAIT UNTIL rising_edge(clk);
     snk_in.data  <= RESIZE_DP_DATA(X"4" &        -- IPv4 header 
-                                   TO_UVEC(IHL,c_ip_header_length_w) &
+                                   TO_UVEC(IHL,c_network_ip_header_length_w) &
                                    X"00" &
-                                   TO_UVEC((IHL+UDP_payload_len+2)*4,c_ip_total_length_w));
+                                   TO_UVEC((IHL+UDP_payload_len+2)*4,c_network_ip_total_length_w));
     WAIT UNTIL rising_edge(clk);
     snk_in.data  <= RESIZE_DP_DATA(X"00004000");
     WAIT UNTIL rising_edge(clk);
@@ -91,13 +91,13 @@ ARCHITECTURE tb OF tb_eth_IHL_to_20 IS
     WAIT UNTIL rising_edge(clk);
 
     FOR I IN 6 TO IHL LOOP
-      snk_in.data  <= RESIZE_DP_DATA(X"BAD000" & TO_UVEC(I,c_ip_header_length_w));  -- optionnal option word
+      snk_in.data  <= RESIZE_DP_DATA(X"BAD000" & TO_UVEC(I,c_network_ip_header_length_w));  -- optionnal option word
       WAIT UNTIL rising_edge(clk);
     END LOOP;
     
     snk_in.data  <= RESIZE_DP_DATA(X"10FA10FA");  -- UDP header
     WAIT UNTIL rising_edge(clk);
-    snk_in.data  <= RESIZE_DP_DATA(TO_UVEC((UDP_payload_len+2)*4,c_udp_total_length_w) & X"0000");
+    snk_in.data  <= RESIZE_DP_DATA(TO_UVEC((UDP_payload_len+2)*4,c_network_udp_total_length_w) & X"0000");
     WAIT UNTIL rising_edge(clk);
     
     FOR I IN 0 TO UDP_payload_len-1 LOOP                  -- UDP payload
@@ -134,9 +134,9 @@ ARCHITECTURE tb OF tb_eth_IHL_to_20 IS
     -- IPv4 header
     WAIT UNTIL falling_edge(clk) and src_out.valid = '1';
     ASSERT src_out.data(31 downto 0) = X"4" &
-                                       TO_UVEC(c_IHL,c_ip_header_length_w) &
+                                       TO_UVEC(c_IHL,c_network_ip_header_length_w) &
                                        X"00" &
-                                       TO_UVEC((c_IHL+UDP_payload_len+2)*4,c_ip_total_length_w)
+                                       TO_UVEC((c_IHL+UDP_payload_len+2)*4,c_network_ip_total_length_w)
                                                    REPORT "Wrong Version / IHL / Total Length"         SEVERITY FAILURE;
     
     WAIT UNTIL falling_edge(clk) and src_out.valid = '1';
@@ -153,7 +153,7 @@ ARCHITECTURE tb OF tb_eth_IHL_to_20 IS
     WAIT UNTIL falling_edge(clk) and src_out.valid = '1';                                                                 
     ASSERT src_out.data(31 downto 0) = X"10FA10FA" REPORT "Wrong UDP ports"                            SEVERITY FAILURE;
     WAIT UNTIL falling_edge(clk) and src_out.valid = '1';
-    ASSERT src_out.data(31 downto 0) = TO_UVEC((UDP_payload_len+2)*4,c_udp_total_length_w) &
+    ASSERT src_out.data(31 downto 0) = TO_UVEC((UDP_payload_len+2)*4,c_network_udp_total_length_w) &
                                        X"0000" 
                                                    REPORT "Wrong UDP length / CRC"                     SEVERITY FAILURE;
     -- UDP payload
diff --git a/libraries/io/eth/tb/vhdl/tb_eth_udp_offload.vhd b/libraries/io/eth/tb/vhdl/tb_eth_udp_offload.vhd
index 4f82a69c10095264b771fc03a1fa5a5f2965cc48..c2063d4e3c2e687ecd82b9a0afcc038f68ddabbd 100644
--- a/libraries/io/eth/tb/vhdl/tb_eth_udp_offload.vhd
+++ b/libraries/io/eth/tb/vhdl/tb_eth_udp_offload.vhd
@@ -28,12 +28,13 @@ USE common_lib.common_mem_pkg.ALL;
 USE common_lib.tb_common_mem_pkg.ALL;
 USE common_lib.common_str_pkg.ALL;
 USE common_lib.common_lfsr_sequences_pkg.ALL;
+USE common_lib.common_network_layers_pkg.ALL;
+USE common_lib.common_network_total_header_pkg.ALL;
 USE common_lib.tb_common_pkg.ALL;
 USE dp_lib.dp_stream_pkg.ALL;
 USE dp_lib.tb_dp_pkg.ALL;
 USE tech_tse_lib.tech_tse_pkg.ALL;
 USE tech_tse_lib.tb_tech_tse_pkg.ALL;
-USE common_lib.common_network_layers_pkg.ALL;
 USE WORK.eth_pkg.ALL;
 
 ENTITY tb_eth_udp_offload IS
@@ -71,39 +72,36 @@ ARCHITECTURE tb OF tb_eth_udp_offload IS
 
   -- Payload user data
   CONSTANT c_tb_nof_data        : NATURAL := 1440;  -- nof UDP user data, nof ping padding data. NOTE: non-multiples of g_data_w/g_symbol_w not supported as dp_packet_enc/dec do not support encoding/decoding empty
-  CONSTANT c_tb_ip_nof_data     : NATURAL := c_udp_header_len + c_tb_nof_data; -- nof IP data,
+  CONSTANT c_tb_ip_nof_data     : NATURAL := c_network_udp_header_len + c_tb_nof_data; -- nof IP data,
 
   -- Headers
   -- . Ethernet header
-  CONSTANT c_word_align         : STD_LOGIC_VECTOR(c_eth_word_align_w-1 DOWNTO 0) := TO_UVEC(c_eth_word_align, c_eth_word_align_w);
-  CONSTANT c_lcu_src_mac        : STD_LOGIC_VECTOR(c_eth_mac_slv'RANGE) := X"10FA01020300";
-  CONSTANT c_dut_src_mac        : STD_LOGIC_VECTOR(c_eth_mac_slv'RANGE) := X"123456789ABC";  -- = 12-34-56-78-9A-BC
-  CONSTANT c_dut_src_mac_hi     : NATURAL := TO_UINT(c_dut_src_mac(c_eth_mac_addr_w-1 DOWNTO c_word_w));
-  CONSTANT c_dut_src_mac_lo     : NATURAL := TO_UINT(c_dut_src_mac(        c_word_w-1 DOWNTO        0));
+  CONSTANT c_lcu_src_mac        : STD_LOGIC_VECTOR(c_network_eth_mac_slv'RANGE) := X"10FA01020300";
+  CONSTANT c_dut_src_mac        : STD_LOGIC_VECTOR(c_network_eth_mac_slv'RANGE) := X"123456789ABC";  -- = 12-34-56-78-9A-BC
+  CONSTANT c_dut_src_mac_hi     : NATURAL := TO_UINT(c_dut_src_mac(c_network_eth_mac_addr_w-1 DOWNTO c_word_w));
+  CONSTANT c_dut_src_mac_lo     : NATURAL := TO_UINT(c_dut_src_mac(                c_word_w-1 DOWNTO        0));
    
-  CONSTANT c_tx_eth_header      : t_eth_header := (word_align => c_word_align,
-                                                   dst_mac    => c_dut_src_mac,
-                                                   src_mac    => c_lcu_src_mac,
-                                                   eth_type   => TO_UVEC(c_eth_type_ip, c_eth_type_w)); --TO_UVEC(c_dut_ethertype, c_eth_type_w));
+  CONSTANT c_tx_eth_header      : t_network_eth_header := (dst_mac    => c_dut_src_mac,
+                                                           src_mac    => c_lcu_src_mac,
+                                                           eth_type   => TO_UVEC(c_network_eth_type_ip, c_network_eth_type_w)); --TO_UVEC(c_dut_ethertype, c_network_eth_type_w));
   -- . IP header
   CONSTANT c_lcu_ip_addr        : NATURAL := 16#05060708#;  -- = 05:06:07:08
   CONSTANT c_dut_ip_addr        : NATURAL := 16#01020304#;
-  CONSTANT c_tb_ip_total_length : NATURAL := c_ip_total_length + c_tb_ip_nof_data;
-                                             -- support only ping protocol or UDP protocol over IP
-  CONSTANT c_tb_ip_protocol     : NATURAL := c_ip_protocol_udp; --sel_a_b(g_data_type-c_tb_tse_data_type_ping, c_ip_protocol_udp, c_ip_protocol_icmp);
+  CONSTANT c_tb_ip_total_length : NATURAL := c_network_ip_total_length + c_tb_ip_nof_data;
+  CONSTANT c_tb_ip_protocol     : NATURAL := c_network_ip_protocol_udp; --sel_a_b(g_data_type-c_tb_tse_data_type_ping, c_network_ip_protocol_udp, c_network_ip_protocol_icmp);  -- support only ping protocol or UDP protocol over IP
   
-  CONSTANT c_tx_ip_header       : t_ip_header := (version         => TO_UVEC(c_ip_version,         c_ip_version_w),
-                                                  header_length   => TO_UVEC(c_ip_header_length,   c_ip_header_length_w),
-                                                  services        => TO_UVEC(c_ip_services,        c_ip_services_w),
-                                                  total_length    => TO_UVEC(c_tb_ip_total_length, c_ip_total_length_w),
-                                                  identification  => TO_UVEC(c_ip_identification,  c_ip_identification_w),
-                                                  flags           => TO_UVEC(c_ip_flags,           c_ip_flags_w),
-                                                  fragment_offset => TO_UVEC(c_ip_fragment_offset, c_ip_fragment_offset_w),
-                                                  time_to_live    => TO_UVEC(c_ip_time_to_live,    c_ip_time_to_live_w),
-                                                  protocol        => TO_UVEC(c_tb_ip_protocol,     c_ip_protocol_w),
-                                                  header_checksum => TO_UVEC(c_ip_header_checksum, c_ip_header_checksum_w),  -- init value (or try 0xEBBD = 60349)
-                                                  src_ip_addr     => TO_UVEC(c_lcu_ip_addr,        c_ip_addr_w),
-                                                  dst_ip_addr     => TO_UVEC(c_dut_ip_addr,        c_ip_addr_w));
+  CONSTANT c_tx_ip_header       : t_network_ip_header := (version         => TO_UVEC(c_network_ip_version,         c_network_ip_version_w),
+                                                          header_length   => TO_UVEC(c_network_ip_header_length,   c_network_ip_header_length_w),
+                                                          services        => TO_UVEC(c_network_ip_services,        c_network_ip_services_w),
+                                                          total_length    => TO_UVEC(c_tb_ip_total_length,         c_network_ip_total_length_w),
+                                                          identification  => TO_UVEC(c_network_ip_identification,  c_network_ip_identification_w),
+                                                          flags           => TO_UVEC(c_network_ip_flags,           c_network_ip_flags_w),
+                                                          fragment_offset => TO_UVEC(c_network_ip_fragment_offset, c_network_ip_fragment_offset_w),
+                                                          time_to_live    => TO_UVEC(c_network_ip_time_to_live,    c_network_ip_time_to_live_w),
+                                                          protocol        => TO_UVEC(c_tb_ip_protocol,             c_network_ip_protocol_w),
+                                                          header_checksum => TO_UVEC(c_network_ip_header_checksum, c_network_ip_header_checksum_w),  -- init value (or try 0xEBBD = 60349)
+                                                          src_ip_addr     => TO_UVEC(c_lcu_ip_addr,                c_network_ip_addr_w),
+                                                          dst_ip_addr     => TO_UVEC(c_dut_ip_addr,                c_network_ip_addr_w));
 
   -- . UDP header
   CONSTANT c_dut_udp_port_ctrl   : NATURAL := 11;                  -- ETH demux UDP for control
@@ -113,32 +111,33 @@ ARCHITECTURE tb OF tb_eth_udp_offload IS
   CONSTANT c_dut_udp_port_en     : NATURAL := 16#10000#;           -- ETH demux UDP port enable bit 16
   CONSTANT c_lcu_udp_port        : NATURAL := 10;                  -- UDP port used for src_port
   CONSTANT c_dut_udp_port_st     : NATURAL := c_dut_udp_port_st0;  -- UDP port used for dst_port
-  CONSTANT c_tb_udp_total_length : NATURAL := c_udp_total_length + c_tb_nof_data;
-  CONSTANT c_tx_udp_header       : t_udp_header := (src_port     => TO_UVEC(c_lcu_udp_port,        c_udp_port_w),
-                                                    dst_port     => TO_UVEC(c_dut_udp_port_st,   c_udp_port_w),       -- or use c_dut_udp_port_ctrl
-                                                    total_length => TO_UVEC(c_tb_udp_total_length, c_udp_total_length_w),
-                                                    checksum     => TO_UVEC(c_udp_checksum,        c_udp_checksum_w));  -- init value
+  CONSTANT c_tb_udp_total_length : NATURAL := c_network_udp_total_length + c_tb_nof_data;
+  CONSTANT c_tx_udp_header       : t_network_udp_header := (src_port     => TO_UVEC(c_lcu_udp_port,         c_network_udp_port_w),
+                                                            dst_port     => TO_UVEC(c_dut_udp_port_st,      c_network_udp_port_w),       -- or use c_dut_udp_port_ctrl
+                                                            total_length => TO_UVEC(c_tb_udp_total_length,  c_network_udp_total_length_w),
+                                                            checksum     => TO_UVEC(c_network_udp_checksum, c_network_udp_checksum_w));  -- init value
  
-  CONSTANT c_total_hdr_slv       : STD_LOGIC_VECTOR(c_eth_total_header_nof_words*c_word_w-1 DOWNTO 0) := c_tx_eth_header.word_align     &
-                                                                                                         c_tx_eth_header.dst_mac        &
-                                                                                                         c_tx_eth_header.src_mac        &
-                                                                                                         c_tx_eth_header.eth_type       &
-                                                                                                         c_tx_ip_header.version         &
-                                                                                                         c_tx_ip_header.header_length   &
-                                                                                                         c_tx_ip_header.services        &
-                                                                                                         c_tx_ip_header.total_length    &
-                                                                                                         c_tx_ip_header.identification  &
-                                                                                                         c_tx_ip_header.flags           &
-                                                                                                         c_tx_ip_header.fragment_offset &
-                                                                                                         c_tx_ip_header.time_to_live    &
-                                                                                                         c_tx_ip_header.protocol        &
-                                                                                                         c_tx_ip_header.header_checksum &
-                                                                                                         c_tx_ip_header.src_ip_addr     &
-                                                                                                         c_tx_ip_header.dst_ip_addr     &
-                                                                                                         c_tx_udp_header.src_port       & 
-                                                                                                         c_tx_udp_header.dst_port       &
-                                                                                                         c_tx_udp_header.total_length   &
-                                                                                                         c_tx_udp_header.checksum;
+  CONSTANT c_word_align          : STD_LOGIC_VECTOR(c_network_total_header_32b_align_w-1 DOWNTO 0) := (OTHERS=>'0');
+  CONSTANT c_total_hdr_slv       : STD_LOGIC_VECTOR(c_network_total_header_32b_nof_words*c_word_w-1 DOWNTO 0) := c_word_align                   &
+                                                                                                                 c_tx_eth_header.dst_mac        &
+                                                                                                                 c_tx_eth_header.src_mac        &
+                                                                                                                 c_tx_eth_header.eth_type       &
+                                                                                                                 c_tx_ip_header.version         &
+                                                                                                                 c_tx_ip_header.header_length   &
+                                                                                                                 c_tx_ip_header.services        &
+                                                                                                                 c_tx_ip_header.total_length    &
+                                                                                                                 c_tx_ip_header.identification  &
+                                                                                                                 c_tx_ip_header.flags           &
+                                                                                                                 c_tx_ip_header.fragment_offset &
+                                                                                                                 c_tx_ip_header.time_to_live    &
+                                                                                                                 c_tx_ip_header.protocol        &
+                                                                                                                 c_tx_ip_header.header_checksum &
+                                                                                                                 c_tx_ip_header.src_ip_addr     &
+                                                                                                                 c_tx_ip_header.dst_ip_addr     &
+                                                                                                                 c_tx_udp_header.src_port       & 
+                                                                                                                 c_tx_udp_header.dst_port       &
+                                                                                                                 c_tx_udp_header.total_length   &
+                                                                                                                 c_tx_udp_header.checksum;
 
   -- ===========================================================================================================================================================
 
@@ -152,9 +151,9 @@ ARCHITECTURE tb OF tb_eth_udp_offload IS
   -- ETH TSE interface
   SIGNAL eth_psc_access      : STD_LOGIC;
 
-  SIGNAL tb_eth_hdr           : t_eth_header := c_tx_eth_header;
-  SIGNAL tb_ip_hdr            : t_ip_header  := c_tx_ip_header;
-  SIGNAL tb_udp_hdr           : t_udp_header := c_tx_udp_header;
+  SIGNAL tb_eth_hdr           : t_network_eth_header := c_tx_eth_header;
+  SIGNAL tb_ip_hdr            : t_network_ip_header  := c_tx_ip_header;
+  SIGNAL tb_udp_hdr           : t_network_udp_header := c_tx_udp_header;
 
   SIGNAL eth_clk              : STD_LOGIC := '0';  -- tse reference clock
   SIGNAL mm_clk               : STD_LOGIC := '0';
@@ -307,13 +306,13 @@ BEGIN
     dut_eth_init <= '0';
 
     -- MM Stimuli: write HEADER to RAM
-    FOR i IN c_eth_total_header_nof_words DOWNTO 1 LOOP
+    FOR i IN c_network_total_header_32b_nof_words DOWNTO 1 LOOP
       -- Extract words from SLV from left to right
       v_mm_wr_hdr := c_total_hdr_slv(i*c_word_w-1 DOWNTO i*c_word_w - c_word_w);
       proc_mem_mm_bus_wr(v_mm_wr_addr, v_mm_wr_hdr, mm_clk, ram_hdr_mosi);
       proc_common_wait_some_cycles(mm_clk, 5);
 
-      IF v_mm_wr_addr<c_eth_total_header_nof_words-1 THEN
+      IF v_mm_wr_addr<c_network_total_header_32b_nof_words-1 THEN
         v_mm_wr_addr := v_mm_wr_addr + 1;
       END IF;
     END LOOP;
@@ -345,7 +344,7 @@ BEGIN
 
     -- Read the stripped header via MM bus and print it in the transcript window
     print_str("Reading stripped header from RAM:");
-    FOR i IN 0 TO c_eth_total_header_nof_words-1 LOOP
+    FOR i IN 0 TO c_network_total_header_32b_nof_words-1 LOOP
       proc_mem_mm_bus_rd(i, mm_clk, ram_hdr_mosi);
       proc_mem_mm_bus_rd_latency(c_mem_reg_rd_latency, mm_clk);
       print_str("[" & time_to_str(now) & "] 0x" & slv_to_hex(ram_hdr_miso.rddata(c_word_w-1 DOWNTO 0)));
@@ -421,7 +420,7 @@ BEGIN
   GENERIC MAP (
     g_data_w        => g_data_w,
     g_symbol_w      => g_symbol_w,
-    g_hdr_nof_words => c_eth_total_header_nof_words
+    g_hdr_nof_words => c_network_total_header_32b_nof_words
   )
   PORT MAP (
     mm_rst      => mm_rst,
@@ -459,8 +458,8 @@ BEGIN
   GENERIC MAP (            
     g_data_w        => g_data_w,
     g_symbol_w      => g_symbol_w,
-    g_hdr_nof_words => c_eth_total_header_nof_words,
-    g_tail_nof_words=> (c_eth_crc_len * g_symbol_w) / c_word_w
+    g_hdr_nof_words => c_network_total_header_32b_nof_words,
+    g_tail_nof_words=> (c_network_eth_crc_len * g_symbol_w) / c_word_w
   )                        
   PORT MAP (               
     mm_rst      => mm_rst, 
diff --git a/libraries/technology/tse/tb_tech_tse.vhd b/libraries/technology/tse/tb_tech_tse.vhd
index d8ef19e2d5b29a2facaa83304ef6556d52d3b0ef..e000c9d7dea0f1b21df16b65896bbe40d58b79e7 100644
--- a/libraries/technology/tse/tb_tech_tse.vhd
+++ b/libraries/technology/tse/tb_tech_tse.vhd
@@ -36,6 +36,7 @@ USE common_lib.common_pkg.ALL;
 USE common_lib.common_mem_pkg.ALL;
 USE dp_lib.dp_stream_pkg.ALL;
 USE common_lib.common_network_layers_pkg.ALL;
+USE common_lib.common_network_total_header_pkg.ALL;
 USE WORK.tech_tse_pkg.ALL;
 USE WORK.tb_tech_tse_pkg.ALL;
 
@@ -63,18 +64,17 @@ ARCHITECTURE tb OF tb_tech_tse IS
   CONSTANT c_tx_ready_latency   : NATURAL := c_tse_tx_ready_latency;  -- 0, 1 are supported, must match TSE MAC c_tse_tx_ready_latency
   CONSTANT c_nof_tx_not_valid   : NATURAL := 0;  -- when > 0 then pull tx valid low for c_nof_tx_not_valid beats during tx
 
-  CONSTANT c_word_align         : STD_LOGIC_VECTOR(c_eth_word_align_w-1 DOWNTO 0) := TO_UVEC(c_eth_word_align, c_eth_word_align_w);
-  CONSTANT c_dst_mac            : STD_LOGIC_VECTOR(c_eth_mac_slv'RANGE) := X"10FA01020300";
-  CONSTANT c_src_mac            : STD_LOGIC_VECTOR(c_eth_mac_slv'RANGE) := X"123456789ABC";  -- = 12-34-56-78-9A-BC
-  CONSTANT c_ethertype          : STD_LOGIC_VECTOR(c_eth_type_slv'RANGE) := X"10FA";
-  CONSTANT c_etherlen           : STD_LOGIC_VECTOR(c_eth_type_slv'RANGE) := "0000000000010000";
+  CONSTANT c_dst_mac            : STD_LOGIC_VECTOR(c_network_eth_mac_slv'RANGE) := X"10FA01020300";
+  CONSTANT c_src_mac            : STD_LOGIC_VECTOR(c_network_eth_mac_slv'RANGE) := X"123456789ABC";  -- = 12-34-56-78-9A-BC
+  CONSTANT c_ethertype          : STD_LOGIC_VECTOR(c_network_eth_type_slv'RANGE) := X"10FA";
+  CONSTANT c_etherlen           : STD_LOGIC_VECTOR(c_network_eth_type_slv'RANGE) := "0000000000010000";
 
   -- Packet headers
-  CONSTANT c_eth_header_loopback : t_eth_header := (c_word_align, c_src_mac, c_src_mac, c_ethertype);
-  CONSTANT c_eth_header_etherlen : t_eth_header := (c_word_align, c_src_mac, c_src_mac, c_etherlen);
+  CONSTANT c_eth_header_loopback : t_network_eth_header := (c_src_mac, c_src_mac, c_ethertype);
+  CONSTANT c_eth_header_etherlen : t_network_eth_header := (c_src_mac, c_src_mac, c_etherlen);
   
-  SIGNAL total_header_loopback   : t_eth_total_header;
-  SIGNAL total_header_etherlen   : t_eth_total_header;
+  SIGNAL total_header_loopback   : t_network_total_header;
+  SIGNAL total_header_etherlen   : t_network_total_header;
   
   -- Clocks and reset
   SIGNAL tb_end            : STD_LOGIC := '0';
diff --git a/libraries/technology/tse/tb_tech_tse_pkg.vhd b/libraries/technology/tse/tb_tech_tse_pkg.vhd
index ee503fe27b5800c70d1d41dba05dd6d23b8ac39e..26a153f9cf475cde2dd18ac231bbacbaf1ef2d3d 100644
--- a/libraries/technology/tse/tb_tech_tse_pkg.vhd
+++ b/libraries/technology/tse/tb_tech_tse_pkg.vhd
@@ -29,6 +29,7 @@ USE common_lib.tb_common_mem_pkg.ALL;
 USE dp_lib.dp_stream_pkg.ALL;
 USE dp_lib.tb_dp_pkg.ALL;
 USE common_lib.common_network_layers_pkg.ALL;
+USE common_lib.common_network_total_header_pkg.ALL;
 USE WORK.tech_tse_pkg.ALL;
 
 
@@ -48,13 +49,13 @@ PACKAGE tb_tech_tse_pkg IS
                            CONSTANT c_tse_tx_fifo_depth : IN  NATURAL;
                            CONSTANT c_tse_rx_fifo_depth : IN  NATURAL;
                            CONSTANT c_tx_ready_latency  : IN  NATURAL;
-                           CONSTANT src_mac             : IN  STD_LOGIC_VECTOR(c_eth_mac_slv'RANGE);
+                           CONSTANT src_mac             : IN  STD_LOGIC_VECTOR(c_network_eth_mac_slv'RANGE);
                            SIGNAL   psc_access          : OUT STD_LOGIC;
                            SIGNAL   mm_clk              : IN  STD_LOGIC;
                            SIGNAL   mm_miso             : IN  t_mem_miso;
                            SIGNAL   mm_mosi             : OUT t_mem_mosi);
   
-  PROCEDURE proc_tse_tx_packet(CONSTANT total_header    : IN  t_eth_total_header;
+  PROCEDURE proc_tse_tx_packet(CONSTANT total_header    : IN  t_network_total_header;
                                CONSTANT data_len        : IN  NATURAL;  -- in symbols = octets = bytes
                                CONSTANT c_data_type     : IN  NATURAL;  -- c_tb_tse_data_type_*
                                CONSTANT c_ready_latency : IN  NATURAL;  -- 0, 1 are supported by proc_dp_stream_ready_latency()
@@ -65,7 +66,7 @@ PACKAGE tb_tech_tse_pkg IS
                                SIGNAL   ff_src_out      : OUT t_dp_sosi);
 
   -- Receive and verify packet from the TSE MAC
-  PROCEDURE proc_tse_rx_packet(CONSTANT total_header : IN  t_eth_total_header;
+  PROCEDURE proc_tse_rx_packet(CONSTANT total_header : IN  t_network_total_header;
                                CONSTANT c_data_type  : IN  NATURAL;  -- c_tb_tse_data_type_*
                                SIGNAL   ff_clk       : IN  STD_LOGIC;
                                SIGNAL   ff_snk_in    : IN  t_dp_sosi;
@@ -77,8 +78,8 @@ END tb_tech_tse_pkg;
 PACKAGE BODY tb_tech_tse_pkg IS
 
   -- LOCAL ITEMS ---------------------------------------------------------------
-  CONSTANT c_nof_eth_beats  : NATURAL := c_eth_nof_words;               -- nof words in eth part of the header
-  CONSTANT c_nof_hdr_beats  : NATURAL := c_eth_total_header_nof_words;  -- nof words in the total header
+  CONSTANT c_nof_eth_beats  : NATURAL := c_network_total_header_32b_eth_nof_words;  -- nof words in eth part of the header
+  CONSTANT c_nof_hdr_beats  : NATURAL := c_network_total_header_32b_nof_words;      -- nof words in the total header
 
   
   -- GLOBAL ITEMS --------------------------------------------------------------
@@ -86,11 +87,11 @@ PACKAGE BODY tb_tech_tse_pkg IS
   FUNCTION func_tb_tse_header_size(data_type : NATURAL) RETURN NATURAL IS
   BEGIN
     CASE data_type IS
-      WHEN c_tb_tse_data_type_symbols => RETURN c_eth_nof_words;
-      WHEN c_tb_tse_data_type_counter => RETURN c_eth_nof_words;
+      WHEN c_tb_tse_data_type_symbols => RETURN c_network_total_header_32b_eth_nof_words;
+      WHEN c_tb_tse_data_type_counter => RETURN c_network_total_header_32b_eth_nof_words;
       WHEN OTHERS => NULL;
     END CASE;
-    RETURN c_eth_total_header_nof_words;
+    RETURN c_network_total_header_32b_nof_words;
   END func_tb_tse_header_size;
   
   ------------------------------------------------------------------------------
@@ -115,7 +116,7 @@ PACKAGE BODY tb_tech_tse_pkg IS
                            CONSTANT c_tse_tx_fifo_depth : IN  NATURAL;
                            CONSTANT c_tse_rx_fifo_depth : IN  NATURAL;
                            CONSTANT c_tx_ready_latency  : IN  NATURAL;
-                           CONSTANT src_mac             : IN  STD_LOGIC_VECTOR(c_eth_mac_slv'RANGE);
+                           CONSTANT src_mac             : IN  STD_LOGIC_VECTOR(c_network_eth_mac_slv'RANGE);
                            SIGNAL   psc_access          : OUT STD_LOGIC;
                            SIGNAL   mm_clk              : IN  STD_LOGIC;
                            SIGNAL   mm_miso             : IN  t_mem_miso;
@@ -216,7 +217,7 @@ PACKAGE BODY tb_tech_tse_pkg IS
   -- . Use word aligned payload data, so with half word inserted before the 14 byte header
   -- . Packets can be send immediately after eachother so new sop directly after last eop
   -- . The word rate is controlled by respecting ready from the MAC
-  PROCEDURE proc_tse_tx_packet(CONSTANT total_header    : IN  t_eth_total_header;
+  PROCEDURE proc_tse_tx_packet(CONSTANT total_header    : IN  t_network_total_header;
                                CONSTANT data_len        : IN  NATURAL;  -- in symbols = octets = bytes
                                CONSTANT c_data_type     : IN  NATURAL;  -- c_tb_tse_data_type_*
                                CONSTANT c_ready_latency : IN  NATURAL;  -- 0, 1 are supported by proc_dp_stream_ready_latency()
@@ -225,10 +226,10 @@ PACKAGE BODY tb_tech_tse_pkg IS
                                SIGNAL   ff_en           : IN  STD_LOGIC;  -- similar purpose as c_nof_not_valid, but not used so pass on signal '1'
                                SIGNAL   ff_src_in       : IN  t_dp_siso;
                                SIGNAL   ff_src_out      : OUT t_dp_sosi) IS
-    CONSTANT c_eth_header     : t_eth_header := total_header.eth;
-    CONSTANT c_arp_packet     : t_eth_total_header_arr := func_eth_arp_total_header( total_header.eth, total_header.arp);
-    CONSTANT c_icmp_header    : t_eth_total_header_arr := func_eth_icmp_total_header(total_header.eth, total_header.ip, total_header.icmp);
-    CONSTANT c_udp_header     : t_eth_total_header_arr := func_eth_udp_total_header( total_header.eth, total_header.ip, total_header.udp);
+    CONSTANT c_eth_header     : t_network_eth_header := total_header.eth;
+    CONSTANT c_arp_words_arr  : t_network_total_header_32b_arr := func_network_total_header_construct_arp( total_header.eth, total_header.arp);
+    CONSTANT c_icmp_words_arr : t_network_total_header_32b_arr := func_network_total_header_construct_icmp(total_header.eth, total_header.ip, total_header.icmp);
+    CONSTANT c_udp_words_arr  : t_network_total_header_32b_arr := func_network_total_header_construct_udp( total_header.eth, total_header.ip, total_header.udp);
     
     CONSTANT c_mod            : NATURAL := data_len MOD c_tse_symbols_per_beat;
     CONSTANT c_nof_data_beats : NATURAL := data_len   / c_tse_symbols_per_beat + sel_a_b(c_mod, 1, 0);
@@ -240,30 +241,30 @@ PACKAGE BODY tb_tech_tse_pkg IS
     ----------------------------------------------------------------------------
     -- ETH Header
     -- . sop
-    ff_src_out.data <= RESIZE_DP_DATA(c_udp_header(0));  -- all arp, icmp and udp contain the same eth header, so it is ok to use c_udp_header
+    ff_src_out.data <= RESIZE_DP_DATA(c_udp_words_arr(0));  -- all arp, icmp and udp contain the same eth header, so it is ok to use c_udp_words_arr
     proc_dp_stream_ready_latency(c_ready_latency, ff_clk, ff_src_in.ready, ff_en, '0', '1', '1', '0', ff_src_out.sync, ff_src_out.valid, ff_src_out.sop, ff_src_out.eop);
-    ff_src_out.data <= RESIZE_DP_DATA(c_udp_header(1));  -- prepare data before loop, so proc_dp_stream_ready_latency can be called at start of the loops
+    ff_src_out.data <= RESIZE_DP_DATA(c_udp_words_arr(1));  -- prepare data before loop, so proc_dp_stream_ready_latency can be called at start of the loops
     FOR I IN 2 TO c_nof_eth_beats-1 LOOP
       proc_dp_stream_ready_latency(c_ready_latency, ff_clk, ff_src_in.ready, ff_en, '0', '1', '0', '0', ff_src_out.sync, ff_src_out.valid, ff_src_out.sop, ff_src_out.eop);
-      ff_src_out.data <= RESIZE_DP_DATA(c_udp_header(I));
+      ff_src_out.data <= RESIZE_DP_DATA(c_udp_words_arr(I));
     END LOOP;
     ----------------------------------------------------------------------------
     -- ETH higher layer headers
     IF c_data_type=c_tb_tse_data_type_arp THEN
       FOR I IN c_nof_eth_beats TO c_nof_hdr_beats-2 LOOP
         proc_dp_stream_ready_latency(c_ready_latency, ff_clk, ff_src_in.ready, ff_en, '0', '1', '0', '0', ff_src_out.sync, ff_src_out.valid, ff_src_out.sop, ff_src_out.eop);
-        ff_src_out.data <= RESIZE_DP_DATA(c_arp_packet(I));
+        ff_src_out.data <= RESIZE_DP_DATA(c_arp_words_arr(I));
       END LOOP;
       proc_dp_stream_ready_latency(c_ready_latency, ff_clk, ff_src_in.ready, ff_en, '0', '1', '0', '0', ff_src_out.sync, ff_src_out.valid, ff_src_out.sop, ff_src_out.eop);
       -- . eop
-      ff_src_out.data <= RESIZE_DP_DATA(c_arp_packet(c_nof_hdr_beats-1));
+      ff_src_out.data <= RESIZE_DP_DATA(c_arp_words_arr(c_nof_hdr_beats-1));
       proc_dp_stream_ready_latency(c_ready_latency, ff_clk, ff_src_in.ready, ff_en, '0', '1', '0', '1', ff_src_out.sync, ff_src_out.valid, ff_src_out.sop, ff_src_out.eop);
     ELSIF c_data_type=c_tb_tse_data_type_ping OR c_data_type=c_tb_tse_data_type_udp THEN
       FOR I IN c_nof_eth_beats TO c_nof_hdr_beats-1 LOOP
         proc_dp_stream_ready_latency(c_ready_latency, ff_clk, ff_src_in.ready, ff_en, '0', '1', '0', '0', ff_src_out.sync, ff_src_out.valid, ff_src_out.sop, ff_src_out.eop);
         CASE c_data_type IS
-          WHEN c_tb_tse_data_type_ping => ff_src_out.data <= RESIZE_DP_DATA(c_icmp_header(I));
-          WHEN c_tb_tse_data_type_udp =>  ff_src_out.data <= RESIZE_DP_DATA(c_udp_header(I));
+          WHEN c_tb_tse_data_type_ping => ff_src_out.data <= RESIZE_DP_DATA(c_icmp_words_arr(I));
+          WHEN c_tb_tse_data_type_udp =>  ff_src_out.data <= RESIZE_DP_DATA(c_udp_words_arr(I));
           WHEN OTHERS => NULL;
         END CASE;
       END LOOP;
@@ -319,15 +320,15 @@ PACKAGE BODY tb_tech_tse_pkg IS
   -- . The CRC32 is also passed on to the user at eop.
   -- . Note that when empty/=0 then the CRC32 is not word aligned, so therefore use prev_data to be able
   --   to handle part of last data word in case empty/=0 at eop
-  PROCEDURE proc_tse_rx_packet(CONSTANT total_header : IN  t_eth_total_header;
+  PROCEDURE proc_tse_rx_packet(CONSTANT total_header : IN  t_network_total_header;
                                CONSTANT c_data_type  : IN  NATURAL;  -- c_tb_tse_data_type_*
                                SIGNAL   ff_clk       : IN  STD_LOGIC;
                                SIGNAL   ff_snk_in    : IN  t_dp_sosi;
                                SIGNAL   ff_snk_out   : OUT t_dp_siso) IS
-    CONSTANT c_eth_header     : t_eth_header := total_header.eth;
-    CONSTANT c_arp_packet     : t_eth_total_header_arr := func_eth_arp_total_header( total_header.eth, total_header.arp);
-    CONSTANT c_icmp_header    : t_eth_total_header_arr := func_eth_icmp_total_header(total_header.eth, total_header.ip, total_header.icmp);
-    CONSTANT c_udp_header     : t_eth_total_header_arr := func_eth_udp_total_header( total_header.eth, total_header.ip, total_header.udp);
+    CONSTANT c_eth_header     : t_network_eth_header := total_header.eth;
+    CONSTANT c_arp_words_arr  : t_network_total_header_32b_arr := func_network_total_header_construct_arp( total_header.eth, total_header.arp);
+    CONSTANT c_icmp_words_arr : t_network_total_header_32b_arr := func_network_total_header_construct_icmp(total_header.eth, total_header.ip, total_header.icmp);
+    CONSTANT c_udp_words_arr  : t_network_total_header_32b_arr := func_network_total_header_construct_udp( total_header.eth, total_header.ip, total_header.udp);
     VARIABLE v_sym            : UNSIGNED(c_tse_symbol_w-1 DOWNTO 0) := (OTHERS=>'0');
     VARIABLE v_num            : UNSIGNED(c_tse_data_w-1 DOWNTO 0) := (OTHERS=>'0');
     VARIABLE v_empty          : NATURAL;
@@ -355,7 +356,7 @@ PACKAGE BODY tb_tech_tse_pkg IS
     IF c_data_type=c_tb_tse_data_type_arp THEN
       FOR I IN c_nof_eth_beats TO c_nof_hdr_beats-1 LOOP
         proc_dp_stream_valid(ff_clk, ff_snk_in.valid);
-        ASSERT ff_snk_in.data(31 DOWNTO 0) = c_arp_packet(I) REPORT "RX: Wrong ARP response word" SEVERITY ERROR;
+        ASSERT ff_snk_in.data(31 DOWNTO 0) = c_arp_words_arr(I) REPORT "RX: Wrong ARP response word" SEVERITY ERROR;
       END LOOP;
       -- . continue to eop
       WHILE ff_snk_in.eop /= '1' LOOP
@@ -364,10 +365,10 @@ PACKAGE BODY tb_tech_tse_pkg IS
     ELSIF c_data_type=c_tb_tse_data_type_ping OR c_data_type=c_tb_tse_data_type_udp THEN
       FOR I IN c_nof_eth_beats TO c_nof_hdr_beats-1 LOOP
         proc_dp_stream_valid(ff_clk, ff_snk_in.valid);
-        IF I/=c_ip_header_checksum_wi THEN  -- do not verify tx ip header checksum
+        IF I/=c_network_total_header_32b_ip_header_checksum_wi THEN  -- do not verify tx ip header checksum
           CASE c_data_type IS
-            WHEN c_tb_tse_data_type_ping => ASSERT ff_snk_in.data(31 DOWNTO 0) = c_icmp_header(I) REPORT "RX: Wrong IP/ICMP = PING response word" SEVERITY ERROR;
-            WHEN c_tb_tse_data_type_udp =>  ASSERT ff_snk_in.data(31 DOWNTO 0) = c_udp_header(I)  REPORT "RX: Wrong IP/UDP response word" SEVERITY ERROR;
+            WHEN c_tb_tse_data_type_ping => ASSERT ff_snk_in.data(31 DOWNTO 0) = c_icmp_words_arr(I) REPORT "RX: Wrong IP/ICMP = PING response word" SEVERITY ERROR;
+            WHEN c_tb_tse_data_type_udp =>  ASSERT ff_snk_in.data(31 DOWNTO 0) = c_udp_words_arr(I)  REPORT "RX: Wrong IP/UDP response word" SEVERITY ERROR;
             WHEN OTHERS => NULL;
           END CASE;
         END IF;