diff --git a/libraries/base/common/src/vhdl/common_network_total_header_pkg.vhd b/libraries/base/common/src/vhdl/common_network_total_header_pkg.vhd
index 9b4d2ef5dc03eebc44fe63d7ec552e4aa4fd0d6c..8212c0edaec24764c83ede03f2fecaaa3fe9605f 100644
--- a/libraries/base/common/src/vhdl/common_network_total_header_pkg.vhd
+++ b/libraries/base/common/src/vhdl/common_network_total_header_pkg.vhd
@@ -21,7 +21,28 @@
 -------------------------------------------------------------------------------
 
 -- Purpose: Map the fields of network headers on to a total header array of words
-
+-- Description:
+--
+-- * 32b, word align = 2 octets
+--         wi: |0  1  2  3 |4  5  6  7  8 | 9 10 | ...
+--    octet:   |---------------------------------|---------
+--         0   |x          |              |      |
+--         1   |x   eth    |   ipv4       | udp  | udp payload
+--         2   |    14     |   20         |  8   |
+--         3   |           |              |      |
+--
+-- * 64b, word align = 6 octets
+--         wi: |0  1  2 |3  4 |5 | ...
+--    octet:   |-----------------|---------
+--         0   |x       |     |  |
+--         1   |x  eth  |ipv4 |u | udp payload
+--         2   |x  14   | 20  |d |
+--         3   |x    ___|     |p |
+--         4   |x   |         |8 |
+--         5   |x   |         |  |
+--         6   |    |         |  |
+--         7   |    |         |  |
+--
 LIBRARY IEEE;
 USE IEEE.std_logic_1164.ALL;
 USE IEEE.numeric_std.ALL;
@@ -30,24 +51,101 @@ USE work.common_network_layers_pkg.ALL;
 
 PACKAGE common_network_total_header_pkg IS
 
-  -- All relevant packets in common_network_layers_pkg (arp, ipv4/icmp, ipv4/udp) have the same total header length
-  CONSTANT c_network_total_header_len           : NATURAL := 42;
+  -- Define total network header that fits all relevant packets in common_network_layers_pkg, because they have the same total header length
+  CONSTANT c_network_total_header_arp_len   : NATURAL := c_network_eth_header_len + c_network_arp_data_len;                               -- = 14 + 28     = 42
+  CONSTANT c_network_total_header_icmp_len  : NATURAL := c_network_eth_header_len + c_network_ip_header_len + c_network_icmp_header_len;  -- = 14 + 20 + 8 = 42
+  CONSTANT c_network_total_header_udp_len   : NATURAL := c_network_eth_header_len + c_network_ip_header_len + c_network_udp_header_len;   -- = 14 + 20 + 8 = 42
+  
+  CONSTANT c_network_total_header_len       : NATURAL := 42;
+
+  -----------------------------------------------------------------------------
+  -- Aggregate all supported network headers into one record
+  -----------------------------------------------------------------------------
+  
+  TYPE t_network_total_header IS RECORD
+    eth  : t_network_eth_header;
+    arp  : t_network_arp_packet;
+    ip   : t_network_ip_header;
+    icmp : t_network_icmp_header;
+    udp  : t_network_udp_header;
+  END RECORD;
+
 
-  -- Map total network header in 32b or 64b words
-  CONSTANT c_network_total_header_32b_align_len : NATURAL := 2;                            -- c_network_eth_header_len + 2 = 16, to align eth, ip and udp payload to 32 bit boundaries
+  -----------------------------------------------------------------------------
+  -- Map total network header in words array
+  -----------------------------------------------------------------------------
+  
+  CONSTANT c_network_total_header_32b_align_len : NATURAL := 2;                                         -- to align eth, ip and udp payload to 32 bit boundaries
   CONSTANT c_network_total_header_32b_align_w   : NATURAL := c_network_total_header_32b_align_len*c_8;
   
-  CONSTANT c_network_total_header_64b_align_len : NATURAL := 6;                            -- c_network_eth_header_len + 2 = 16, to align eth, ip and udp payload to 32 bit boundaries and
-  CONSTANT c_network_total_header_64b_align_w   : NATURAL := c_network_total_header_64b_align_len*c_8;  --                                                         udp payload to 64 bit boundaries
+  CONSTANT c_network_total_header_64b_align_len : NATURAL := 6;                                         -- to align eth, ip and udp payload to 32 bit boundaries and
+  CONSTANT c_network_total_header_64b_align_w   : NATURAL := c_network_total_header_64b_align_len*c_8;  --                      udp payload to 64 bit boundaries
+  
+  CONSTANT c_network_total_header_32b_nof_words       : NATURAL := (c_network_total_header_32b_align_len + c_network_total_header_len)/4;  -- = 44 / c_word_sz     = 11
+  CONSTANT c_network_total_header_64b_nof_words       : NATURAL := (c_network_total_header_64b_align_len + c_network_total_header_len)/8;  -- = 48 / c_longword_sz = 6
   
-  CONSTANT c_network_total_header_nof_32b       : NATURAL := (c_network_total_header_32b_align_len + c_network_total_header_len)/4;  -- = 44 / c_word_sz     = 11
-  CONSTANT c_network_total_header_nof_64b       : NATURAL := (c_network_total_header_64b_align_len + c_network_total_header_len)/8;  -- = 48 / c_longword_sz = 6
+  TYPE t_network_total_header_32b_arr IS ARRAY(0 TO c_network_total_header_32b_nof_words-1) OF STD_LOGIC_VECTOR(c_32-1 DOWNTO 0);
+  TYPE t_network_total_header_64b_arr IS ARRAY(0 TO c_network_total_header_64b_nof_words-1) OF STD_LOGIC_VECTOR(c_64-1 DOWNTO 0);
   
-  TYPE t_network_total_header_32b_arr IS ARRAY(0 TO c_network_total_header_nof_32b-1) OF STD_LOGIC_VECTOR(c_32-1 DOWNTO 0);
-  TYPE t_network_total_header_64b_arr IS ARRAY(0 TO c_network_total_header_nof_64b-1) OF STD_LOGIC_VECTOR(c_64-1 DOWNTO 0);
+  -- Word indices in the total header array to know when the field in the mapped record is valid
+  CONSTANT c_network_total_header_32b_eth_lo_wi              : NATURAL := 0;  -- first word index
+  CONSTANT c_network_total_header_32b_eth_dst_mac_wi         : NATURAL := 1;
+  CONSTANT c_network_total_header_32b_eth_src_mac_wi         : NATURAL := 3;
+  CONSTANT c_network_total_header_32b_eth_type_wi            : NATURAL := 3;
+  CONSTANT c_network_total_header_32b_eth_hi_wi              : NATURAL := 3;  -- last word index
+  CONSTANT c_network_total_header_32b_eth_nof_words          : NATURAL := c_network_total_header_32b_eth_hi_wi - c_network_total_header_32b_eth_lo_wi + 1;
+  
+  CONSTANT c_network_total_header_32b_ip_lo_wi               : NATURAL := 4;  -- first word index
+  CONSTANT c_network_total_header_32b_ip_version_wi          : NATURAL := 4;
+  CONSTANT c_network_total_header_32b_ip_header_length_wi    : NATURAL := 4;
+  CONSTANT c_network_total_header_32b_ip_services_wi         : NATURAL := 4;
+  CONSTANT c_network_total_header_32b_ip_total_length_wi     : NATURAL := 4;
+  CONSTANT c_network_total_header_32b_ip_identification_wi   : NATURAL := 5;
+  CONSTANT c_network_total_header_32b_ip_flags_wi            : NATURAL := 5;
+  CONSTANT c_network_total_header_32b_ip_fragment_offset_wi  : NATURAL := 5;
+  CONSTANT c_network_total_header_32b_ip_time_to_live_wi     : NATURAL := 6;
+  CONSTANT c_network_total_header_32b_ip_protocol_wi         : NATURAL := 6;
+  CONSTANT c_network_total_header_32b_ip_header_checksum_wi  : NATURAL := 6;
+  CONSTANT c_network_total_header_32b_ip_src_ip_addr_wi      : NATURAL := 7;
+  CONSTANT c_network_total_header_32b_ip_dst_ip_addr_wi      : NATURAL := 8;
+  CONSTANT c_network_total_header_32b_ip_hi_wi               : NATURAL := 8;  -- last word index
+  CONSTANT c_network_total_header_32b_ip_nof_words           : NATURAL := c_network_total_header_32b_ip_hi_wi - c_network_total_header_32b_ip_lo_wi + 1;
+
+  CONSTANT c_network_total_header_32b_arp_lo_wi              : NATURAL := 4;   -- first word index
+  CONSTANT c_network_total_header_32b_arp_htype_wi           : NATURAL := 4;
+  CONSTANT c_network_total_header_32b_arp_ptype_wi           : NATURAL := 4;
+  CONSTANT c_network_total_header_32b_arp_hlen_wi            : NATURAL := 5;
+  CONSTANT c_network_total_header_32b_arp_plen_wi            : NATURAL := 5;
+  CONSTANT c_network_total_header_32b_arp_oper_wi            : NATURAL := 5;
+  CONSTANT c_network_total_header_32b_arp_sha_wi             : NATURAL := 7;
+  CONSTANT c_network_total_header_32b_arp_spa_wi             : NATURAL := 8;
+  CONSTANT c_network_total_header_32b_arp_tha_wi             : NATURAL := 9;
+  CONSTANT c_network_total_header_32b_arp_tpa_wi             : NATURAL := 10;
+  CONSTANT c_network_total_header_32b_arp_hi_wi              : NATURAL := 10;  -- last word index
+  CONSTANT c_network_total_header_32b_arp_nof_words          : NATURAL := c_network_total_header_32b_arp_hi_wi - c_network_total_header_32b_arp_lo_wi + 1;
+
+  CONSTANT c_network_total_header_32b_icmp_lo_wi             : NATURAL := 9;   -- first word index                                            
+  CONSTANT c_network_total_header_32b_icmp_msg_type_wi       : NATURAL := 9;                                                                  
+  CONSTANT c_network_total_header_32b_icmp_code_wi           : NATURAL := 9;                                                                  
+  CONSTANT c_network_total_header_32b_icmp_checksum_wi       : NATURAL := 9;                                                                  
+  CONSTANT c_network_total_header_32b_icmp_id_wi             : NATURAL := 10;                                                                 
+  CONSTANT c_network_total_header_32b_icmp_sequence_wi       : NATURAL := 10;                                                                 
+  CONSTANT c_network_total_header_32b_icmp_hi_wi             : NATURAL := 10;  -- last word index                                             
+  CONSTANT c_network_total_header_32b_icmp_nof_words         : NATURAL := c_network_total_header_32b_icmp_hi_wi - c_network_total_header_32b_icmp_lo_wi + 1;
+  
+  CONSTANT c_network_total_header_32b_udp_lo_wi              : NATURAL := 9;   -- first word index
+  CONSTANT c_network_total_header_32b_udp_src_port_wi        : NATURAL := 9;
+  CONSTANT c_network_total_header_32b_udp_dst_port_wi        : NATURAL := 9;
+  CONSTANT c_network_total_header_32b_udp_total_length_wi    : NATURAL := 10;
+  CONSTANT c_network_total_header_32b_udp_checksum_wi        : NATURAL := 10;
+  CONSTANT c_network_total_header_32b_udp_hi_wi              : NATURAL := 10;  -- last word index
+  CONSTANT c_network_total_header_32b_udp_nof_words          : NATURAL := c_network_total_header_32b_udp_hi_wi - c_network_total_header_32b_udp_lo_wi + 1;
+
+  -----------------------------------------------------------------------------
+  -- Functions to map between header record fields and header words array
+  -----------------------------------------------------------------------------
   
-  -- Combinatorial map of the total header array on to a network header record
-  -- Type casting an array to a record is not possible, so therefore we need these functions
+  -- Combinatorial map of the total header array on to a network header record (type casting an array to a record is not possible, so therefore we need these functions)
   FUNCTION func_network_total_header_extract_eth( hdr_arr : t_network_total_header_32b_arr) RETURN t_network_eth_header;
   FUNCTION func_network_total_header_extract_ip(  hdr_arr : t_network_total_header_32b_arr) RETURN t_network_ip_header;
   FUNCTION func_network_total_header_extract_arp( hdr_arr : t_network_total_header_32b_arr) RETURN t_network_arp_packet;