diff --git a/common/addr_table/mprocessor.xml b/common/addr_table/mprocessor.xml
index 3075dce5e54dad2556a4ab30b501be3f7c8afb67..9a988f46d8112a295d7d6f728a376d50f4327c0f 100644
--- a/common/addr_table/mprocessor.xml
+++ b/common/addr_table/mprocessor.xml
@@ -10,9 +10,14 @@
         <node id="header_user_bits" address="0x1"/>
     </node>
     
-    <node id="csr" address="0x24" description="MProcessor control and status" fwinfo="endpoint;width=2">
+    <node id="csr" address="0x30" description="MProcessor control and status" fwinfo="endpoint;width=3">
         <node id="header_start_select" address="0x0" mask="0x7"/>
-        <node id="lff" address="0x2" mask="0x0001"/>
-        <node id="super_id" address="0x3"/>
+        <node id="occupancy_windowL"   address="0x1"/>
+        <node id="occupancy_windowH"   address="0x2" mask="0x000f"/>
+        <node id="lff"                 address="0x4" mask="0x0001"/>
+        <node id="super_id"            address="0x5"/>
+        <node id="occupancy_max_value" address="0x6"/>
     </node>
+
+    <node id="occupancy_mem" address="0x400" size="0x100" mode="incremental" fwinfo="endpoint;width=8"/>
 </node>
diff --git a/common/firmware/cfg/module.dep b/common/firmware/cfg/module.dep
index 63dca63d46d330ed4792961e7454240fdf91a9a5..7975c1d2b46da0c23b15a492d62dc535d3f42bf2 100644
--- a/common/firmware/cfg/module.dep
+++ b/common/firmware/cfg/module.dep
@@ -11,6 +11,7 @@ src LinkCombinerCore.vhd
 src LinkCombinerIPBus.vhd
 src --vhdl2008 TrackReconstructor.vhd
 src mprocessor_data_types.vhd
+src PayloadHeaderGenerator.vhd
 
 src ipbus_decode_link_aggregator.vhd
 src ipbus_decode_mprocessor.vhd
diff --git a/common/firmware/hdl/LinkAggregatorCore.vhd b/common/firmware/hdl/LinkAggregatorCore.vhd
index 495ec9e43733f85e40ecb19296bc93560510f620..c6544ff89d00a359389539e677b43e673f04099a 100644
--- a/common/firmware/hdl/LinkAggregatorCore.vhd
+++ b/common/firmware/hdl/LinkAggregatorCore.vhd
@@ -11,7 +11,8 @@ use work.mprocessor_data_types.all;
 
 entity LinkAggregatorCore is
     generic (
-        N_LINKS : integer
+        N_LINKS : integer;
+        INDEX   : integer := 0
     );
     port (
         --- Input Ports ---
@@ -171,7 +172,7 @@ begin
             if rising_edge(clk_p) then
                 wr_en_array_cache <= (others => '0');
                 wr_en_array_cache(to_integer(unsigned(links_in(i).data(21 downto 19)))) <= links_in(i).valid;
-                data_in <= std_logic_vector(to_unsigned(i, 4)) & links_in(i).data(cFIFOWidth - 1 - 4 downto 0);
+                data_in <= std_logic_vector(to_unsigned(INDEX*N_LINKS + i, 4)) & links_in(i).data(cFIFOWidth - 1 - 4 downto 0);
             end if;
         end process pRouteInputData;
 
diff --git a/common/firmware/hdl/LinkAggregatorIPBus.vhd b/common/firmware/hdl/LinkAggregatorIPBus.vhd
index a17e22aec64e00becb670dc9243fa59dac4f8578..4f1664f19f6bee1b6c80f96ba88602a217af5168 100644
--- a/common/firmware/hdl/LinkAggregatorIPBus.vhd
+++ b/common/firmware/hdl/LinkAggregatorIPBus.vhd
@@ -12,7 +12,8 @@ use work.ipbus_decode_link_aggregator.all;
 
 entity LinkAggregatorIPBus is
     generic (
-        N_LINKS : integer
+        N_LINKS : integer;
+        INDEX   : integer := 0
     );
     port (
         --- Input Ports ---
@@ -201,7 +202,8 @@ begin
     LinkAggregatorInstance: entity work.LinkAggregatorCore
     --==============================--
     generic map (
-        N_LINKS => N_LINKS
+        N_LINKS => N_LINKS,
+        INDEX   => INDEX
     )
     port map (
         --- Input Ports ---
diff --git a/common/firmware/hdl/LinkCombinerCore.vhd b/common/firmware/hdl/LinkCombinerCore.vhd
index 0a217957fc6033307fa14499388c2bbae45ddff3..66086644dccc63c58fd09e47e4c28ba0cd4acc5e 100644
--- a/common/firmware/hdl/LinkCombinerCore.vhd
+++ b/common/firmware/hdl/LinkCombinerCore.vhd
@@ -5,6 +5,7 @@ use work.emp_data_types.all;
 use work.dtc_link_maps.all;
 use work.dtc_constants.all;
 use work.dtc_data_types.all;
+use IEEE.std_logic_misc.all;
 
 
 entity LinkCombinerCore is
@@ -19,14 +20,14 @@ entity LinkCombinerCore is
         output_enable    : in std_logic := '0';
         links_in         : in ldata(N_INPUT_LINKS - 1 downto 0);
         packet_start     : in std_logic;
-        header_in        : in tCICHeaderArray(cNumberOfFEModules * cNumberOfCICs - 1 downto 0) := (others => ('0', (others => '0'), (others => '0'), (others => '0')));
-        header_user_bits : in std_logic_vector(31 downto 0) := (others => '0');
+        payload_header   : in std_logic_vector(127 downto 0) := (others => '0');
         --- Ouput Ports ---
         link_out        : out lword := LWORD_NULL;
         --- Debug Ports ---
         debug            : out lword := LWORD_NULL;
         debug_super_id   : out std_logic_vector(31 downto 0);
-        debug_fifo       : out std_logic_vector(31 downto 0) := (others => '0')
+        debug_fifo       : out std_logic_vector(31 downto 0) := (others => '0');
+        debug_packet_size : out lword := LWORD_NULL
     );
 end LinkCombinerCore;
 
@@ -87,7 +88,7 @@ architecture Behavioral of LinkCombinerCore is
     constant cNullValidArray                                              : std_logic_vector(N_INPUT_LINKS - 1 downto 0)       := (others => '0');
     constant cFullEmptyArray                                              : std_logic_vector(N_INPUT_LINKS - 1 downto 0)       := (others => '1');
 
-    -- Signals    
+    -- Signals
     signal input_dout_array                                               : tWordArray(0 to N_INPUT_LINKS - 1)                 := (others => (others => '0'));
     signal input_rd_en_array                                              : std_logic_vector(N_INPUT_LINKS - 1 downto 0)       := (others => '0');
     signal input_almost_empty_array, input_valid_array                    : std_logic_vector(N_INPUT_LINKS - 1 downto 0)       := (others => '0');
@@ -113,7 +114,6 @@ architecture Behavioral of LinkCombinerCore is
     signal output_rd_en                    : std_logic                    := '0';
     
     signal counter                                                        : integer                                            := 0;
-    signal status_sr                                                      : tStatusShiftRegister                               := (others => (others => '0'));
     signal bcid_sr                                                        : tBCIDShiftRegister                                 := (others => (others => '0'));
     signal super_id                                                       : unsigned(32 - 1 downto 0)                          := (others => '0');
 
@@ -124,6 +124,7 @@ architecture Behavioral of LinkCombinerCore is
 
 begin
 
+
     --==============================--
     genInputLinkBuffers : for i in 0 to N_INPUT_LINKS - 1 generate
     --==============================--
@@ -193,6 +194,8 @@ begin
         variable data_count : unsigned(7 downto 0);
     begin
         if rising_edge(clk_p) then
+            debug_packet_size <= LWORD_NULL;
+
             output_valid_previous <= output_valid;
             if output_valid = '1' and output_rd_en_check = '1' then
                 link_out.valid <= '1';
@@ -212,6 +215,9 @@ begin
                 if data_count >= 2 and output_readout_countdown = 0 then
                     output_rd_en_check       <= output_enable;
                     output_readout_countdown <= to_integer(data_count);
+
+                    debug_packet_size.valid <= '1';
+                    debug_packet_size.data(7 downto 0) <= output_data_count;
                 elsif output_almost_full = '1' and output_readout_countdown = 0 then
                     output_rd_en_check       <= output_enable;
                     output_readout_countdown <= to_integer(data_count);
@@ -266,7 +272,7 @@ begin
     begin
         if rising_edge(clk_p) then
             -- Iterate pointer to successively empty the input FIFOs
-            if input_data_valid = '1' and counter = 4 then
+            if input_data_valid = '1' and counter = 3 then
                 if input_almost_empty_array(output_pointer) = '0' then
                     input_rd_en_array(output_pointer) <= '1';
                 else
@@ -284,6 +290,8 @@ begin
                     end if;
                 end if;
             else
+                output_pointer <= 0;
+                next_pointer_location := 0;
                 input_rd_en_array(output_pointer) <= '0';
             end if;
             
@@ -291,7 +299,7 @@ begin
             if packet_start = '1' then
                 counter <= 0;
             else
-                if counter < 4 then
+                if counter < 3 then
                     counter <= counter + 1;
                 else
                     counter <= counter;
@@ -299,83 +307,27 @@ begin
             end if;
             output_pointer_buffered <= output_pointer;
             output_din     <= input_dout_array(output_pointer_buffered);
-            output_wr_en   <= input_valid_array(output_pointer_buffered);
-            
-            
-            if reset = '1' then
-                packet_stub_count <= (others => '0');
-                packet_stub_count_previous <= packet_stub_count;
-                packet_stub_counter_pointer <= 0;
-                packet_stub_count_done <= '0';
-            else
-                if packet_stub_count_done = '0' then
-                    if packet_stub_counter_pointer = (cNumberOfFEModules - 1) * cNumberOfCICs then
-                        packet_stub_count_done <= '1';
-                    end if;
-                    packet_stub_count <= packet_stub_count + unsigned(header_in(packet_stub_counter_pointer).stub_count) + unsigned(header_in(packet_stub_counter_pointer + 1).stub_count);
-                    packet_stub_counter_pointer <= packet_stub_counter_pointer + cNumberOfCICs;
-                end if;
-            end if;
+            output_wr_en   <= input_valid_array(output_pointer_buffered) and (not reset);
             
             if counter = 1 then
-                output_wr_en_buf            <= '1';
-                output_din_buf(63 downto 32) <= header_user_bits;
-                output_din_buf(31 downto 0)  <= std_logic_vector(super_id);
-            elsif counter = 2 then
-                output_din_buf <= (others => '0');
-                output_din_buf(63 downto 56) <= std_logic_vector(packet_stub_count_previous);
-                output_din_buf(47 downto 36) <= bcid_sr(bcid_sr'high);
                 output_wr_en_buf <= '1';
-                if cNumberOfFEModules < 3 then
-                    output_din_buf(cNumberOfFEModules * cNumberOfCICs * 9 - 1 downto 0) <= status_sr(status_sr'high);
-                else
-                    output_din_buf(2 * cNumberOfCICs * 9 - 1 downto 0) <= status_sr(status_sr'high)(2 * cNumberOfCICs * 9 - 1 downto 0);
-                end if;
-            elsif counter = 3 then
+                output_din_buf   <= payload_header(63 downto 0);
+            elsif counter = 2 then
                 output_din_buf <= (others => '0');
+                output_din_buf(19 downto 0) <= payload_header(83 downto 64);
                 output_wr_en_buf <= '1';
-                if cNumberOfFEModules >= 3 and cNumberOfFEModules < 6 then
-                    output_din_buf((cNumberOfFEModules - 2) * cNumberOfCICs * 9 - 1 downto 0) <= status_sr(status_sr'high)(cNumberOfFEModules * cNumberOfCICs * 9 - 1 downto 2 * cNumberOfCICs * 9);
-                end if;
             else
-                output_wr_en_buf  <= output_wr_en;
+                output_wr_en_buf  <= output_wr_en and (not reset);
                 output_din_buf <= output_din;
             end if;
             
         end if;
     end process pCombineBuffers;
 
-
-    --==============================--
-    pBufferHeader: process(clk_p)
-    --==============================--
-        variable status           : std_logic_vector(cNumberOfFEModules * cNumberOfCICs * 9 - 1 downto 0) := (others => '0');
-        variable bcid             : std_logic_vector(12 - 1 downto 0)                                     := (others => '0');
-    begin
-        if rising_edge(clk_p) then
-            if output_reset = '1' then
-                super_id <= (others => '0');
-            else
-                if packet_start = '1' then
-                    for i in cNumberOfFEModules - 1 downto 0 loop
-                        status(i*cNumberOfCICs*9 + 8  downto i*cNumberOfCICs*9)     := std_logic_vector(header_in(i*cNumberOfCICs).status);
-                        status(i*cNumberOfCICs*9 + 17 downto i*cNumberOfCICs*9 + 9) := std_logic_vector(header_in(i*cNumberOfCICs + 1).status);
-                    end loop;
-                    status_sr <= status_sr(status_sr'high - 1 downto 0) & status;
-                    bcid      := std_logic_vector(header_in(0).bcid);
-                    bcid_sr   <= bcid_sr(bcid_sr'high - 1 downto 0) & bcid;
-                    if unsigned(bcid_sr(bcid_sr'high)) > unsigned(bcid_sr(bcid_sr'high - 1)) then
-                        super_id <= super_id + 1;
-                    end if;
-                end if;
-            end if;
-        end if;
-    end process pBufferHeader;
-
     --==============================--
     -- Debug
     --==============================--
-    debug.data(31 downto 0) <= std_logic_vector(super_id);
+    debug.data(31 downto 0) <= payload_header(31 downto 0);
     debug.data(39 downto 32) <= output_data_count;
     debug.data(47 downto 40) <= "00" & input_data_count(0);
     debug.data(51 downto 48) <= std_logic_vector(to_unsigned(counter, 4));
@@ -385,7 +337,7 @@ begin
     debug.data(58) <= input_data_valid;
     debug.valid <= '1';
     debug.strobe <= '1';
-    debug_super_id <= std_logic_vector(super_id);
+    debug_super_id <= payload_header(31 downto 0);
     debug_fifo(7 downto 0) <= output_data_count;
     debug_fifo(8) <= output_full;
     debug_fifo(9) <= output_rd_en;
diff --git a/common/firmware/hdl/LinkCombinerIPBus.vhd b/common/firmware/hdl/LinkCombinerIPBus.vhd
index c813671602e388933f2dc4c4e6396c822b895f3f..47ce10783312434bb69d77950bc6bf5868e5dc6f 100644
--- a/common/firmware/hdl/LinkCombinerIPBus.vhd
+++ b/common/firmware/hdl/LinkCombinerIPBus.vhd
@@ -21,7 +21,7 @@ entity LinkCombinerIPBus is
         reset            : in std_logic;
         links_in         : in ldata(N_INPUT_LINKS - 1 downto 0);
         packet_start     : in std_logic;
-        header_in        : in tCICHeaderArray(cNumberOfFEModules * cNumberOfCICs - 1 downto 0) := (others => ('0', (others => '0'), (others => '0'), (others => '0')));
+        payload_header   : in std_logic_vector(127 downto 0) := (others => '0');
         lff              : in std_logic;
         output_srst      : in std_logic := '0';
         --- Ouput Ports ---
@@ -32,7 +32,8 @@ entity LinkCombinerIPBus is
         ipb_in           : in  ipb_wbus;
         ipb_out          : out ipb_rbus;
         --- Debug Ports ---
-        super_id         : out std_logic_vector(31 downto 0)
+        super_id         : out std_logic_vector(31 downto 0);
+        debug_packet_size : out lword := LWORD_NULL
     );
 end LinkCombinerIPBus;
 
@@ -108,14 +109,13 @@ begin
         output_enable    => link_combiner_rd_en,
         links_in         => masked_input,
         packet_start     => packet_start,
-        header_in        => header_in,
-        header_user_bits => control_registers(1),
+        payload_header   => payload_header,
         --- Output Ports ---
         link_out         => link_out,
         --- Debug Ports ---
         -- debug            => link_combiner_debug,
-        debug_super_id   => super_id
-        -- debug_fifo       => link_aggregator_status_registers(2)
+        debug_super_id   => super_id,
+        debug_packet_size => debug_packet_size
     );
 
 end Behavioral;
diff --git a/common/firmware/hdl/MProcessor.vhd b/common/firmware/hdl/MProcessor.vhd
index 29ee4cceee6bfcc72d86875a30dded83fe00f02a..d8a4465b88679e5360010cb7e0c050db9409db70 100644
--- a/common/firmware/hdl/MProcessor.vhd
+++ b/common/firmware/hdl/MProcessor.vhd
@@ -16,14 +16,15 @@ use work.dtc_data_types.all;
 
 entity MProcessor is
     generic (
-        N_LINKS : integer
+        N_LINKS : integer;
+        INDEX   : integer := 0
     );
     port (
         --- Input Ports ---
         clk_p              : in  std_logic;
         links_in           : in  ldata(N_LINKS - 1 downto 0);
-        header_in          : in  tCICHeaderArray(cNumberOfFEModules * cNumberOfCICs - 1 downto 0) := (others => ('0', (others => '0'), (others => '0'), (others => '0')));
         header_start_array : in  tHeaderStartArray                                                := (others => (others => '0'));
+        payload_header     : in  std_logic_vector(127 downto 0)                                   := (others => '0');
         gbe_backpressure   : in  std_logic                                                        := '0';
         srst               : in  std_logic                                                        := '0';
         --- Output Ports ---
@@ -32,7 +33,9 @@ entity MProcessor is
         ipb_clk            : in  std_logic;
         ipb_rst            : in  std_logic;
         ipb_in             : in  ipb_wbus;
-        ipb_out            : out ipb_rbus
+        ipb_out            : out ipb_rbus;
+        --- Debug Ports ---
+        debug_readout_reset : out std_logic := '0'
     );
 end MProcessor;
 
@@ -47,11 +50,20 @@ architecture Behavorial of MProcessor is
     signal aggregated_stubs        : ldata(7 downto 0)           := (others => LWORD_NULL);
     signal link_aggregator_input   : ldata(N_LINKS - 1 downto 0) := (others => LWORD_NULL);
 
-    signal status_registers        : ipb_reg_v(2 - 1 downto 0)   := (others => (others => '0'));
-    signal control_registers       : ipb_reg_v(1 - 1 downto 0)   := (others => (others => '0'));
+    signal status_registers        : ipb_reg_v(3 - 1 downto 0)   := (others => (others => '0'));
+    signal control_registers       : ipb_reg_v(3 - 1 downto 0)   := (others => (others => '0'));
 
     signal super_id                : std_logic_vector(31 downto 0) := (others => '0');
 
+    signal occupancy_trigger_window_lower             : std_logic_vector(31 downto 0)            := (others => '0');
+    signal occupancy_trigger_window_upper             : std_logic_vector(3 downto 0)             := (others => '0');
+    signal occupancy_trigger_window                   : std_logic_vector(36 - 1 downto 0)        := X"0ffffffff";
+    signal occupancy_max_value                        : std_logic_vector(32 - 1 downto 0)        := (others => '0');
+    signal occupancy_histogram_reset                  : std_logic                                := '0';
+    signal debug_packet_size                          : lword                                    := LWORD_NULL;
+
+
+
 begin
 
     --==============================--
@@ -78,8 +90,8 @@ begin
     MProcessorControlInstance: entity work.ipbus_ctrlreg_v
     --==============================--
     generic map(
-        N_CTRL    => 1,
-        N_STAT    => 2
+        N_CTRL    => 3,
+        N_STAT    => 3
     )
     port map(
         clk       => ipb_clk,
@@ -94,7 +106,8 @@ begin
     LinkAggregatorInstance: entity work.LinkAggregatorIPBus
     --==============================--
     generic map (
-        N_LINKS       => N_LINKS
+        N_LINKS       => N_LINKS,
+        INDEX         => INDEX
     )
     port map (
         --- Input Ports ---
@@ -123,7 +136,7 @@ begin
         reset         => readout_reset,
         links_in      => aggregated_stubs,
         packet_start  => packet_start,
-        header_in     => header_in,
+        payload_header => payload_header,
         lff           => gbe_backpressure,
         output_srst   => srst,
         --- Output Ports ---
@@ -134,7 +147,8 @@ begin
         ipb_in        => ipb_to_slaves(N_SLV_LINK_COMBINER),
         ipb_out       => ipb_from_slaves(N_SLV_LINK_COMBINER),
         --- Debug Ports ---
-        super_id      => super_id
+        super_id      => super_id,
+        debug_packet_size => debug_packet_size
     );
 
     -- --==============================--
@@ -151,5 +165,47 @@ begin
     status_registers(0)(0) <= gbe_backpressure;
     status_registers(1)    <= super_id;
     packet_start           <= header_start_array(to_integer(unsigned(control_registers(0)(2 downto 0))))(0);
+    debug_readout_reset    <= readout_reset;
+
+
+    --==============================--
+    PacketSizeHistogramInstance : entity work.IPBusHistogram
+    --==============================--
+    generic map (
+        input_width => 8,
+        bin_width   => 32,
+        data_offset => 0
+    )
+    port map (
+        --- Input Ports ---
+        clk_p           => clk_p,
+        data_in         => debug_packet_size,
+        histogram_reset => occupancy_histogram_reset,
+        --- Output Ports ---
+        max_bin_value   => occupancy_max_value,
+        --- IPBus Ports ---
+        clk             => ipb_clk,
+        rst             => ipb_rst,
+        ipb_in          => ipb_to_slaves(N_SLV_OCCUPANCY_MEM),
+        ipb_out         => ipb_from_slaves(N_SLV_OCCUPANCY_MEM)
+    );
+
+    --==============================--
+    OccupancyHistogramResetter : entity work.HistogramResetter
+    --==============================--
+    port map (
+        --- Input Ports ---
+        clk_p           => clk_p,
+        trigger_window  => occupancy_trigger_window,
+        --- Output Ports ---
+        histogram_reset => occupancy_histogram_reset
+    );
+
+    occupancy_trigger_window_lower <= control_registers(1);
+    occupancy_trigger_window_upper <= control_registers(2)(3 downto 0);
+    occupancy_trigger_window       <= occupancy_trigger_window_upper & occupancy_trigger_window_lower;
+
+    status_registers(2)(32 - 1 downto 0) <= occupancy_max_value;
+
 
 end Behavorial;
diff --git a/common/firmware/hdl/PayloadHeaderGenerator.vhd b/common/firmware/hdl/PayloadHeaderGenerator.vhd
new file mode 100644
index 0000000000000000000000000000000000000000..c36d580d6bbeaf4bd4591e3a0bab52ac591526a9
--- /dev/null
+++ b/common/firmware/hdl/PayloadHeaderGenerator.vhd
@@ -0,0 +1,109 @@
+library IEEE;
+use IEEE.STD_LOGIC_1164.ALL;
+use IEEE.NUMERIC_STD.ALL;
+use work.emp_data_types.all;
+use work.dtc_link_maps.all;
+use work.dtc_constants.all;
+use work.dtc_data_types.all;
+use IEEE.std_logic_misc.all;
+use work.mprocessor_constants.all;
+
+
+entity PayloadHeaderGenerator is
+    port ( 
+        --- Input Ports ---
+        clk_p : in std_logic;
+        reset : in std_logic;
+        readout_reset : in std_logic;
+        header_start : in std_logic;
+        module_header_in : in tCICHeaderArray(cNumberOfFEModules * cNumberOfCICs - 1 downto 0) := (others => ('0', (others => '0'), (others => '0'), (others => '0')));
+        user_bits : in std_logic_vector(31 downto 0);
+        --- Ouput Ports ---
+        header_out : out tPayloadHeaderArray := (others => (others => '0'));
+        --- Debug Ports ---
+        debug_super_id : out std_logic_vector(31 downto 0) := (others => '0')
+    );
+end PayloadHeaderGenerator;
+
+architecture Behavioral of PayloadHeaderGenerator is
+
+    type tBCIDShiftRegister    is array(1 downto 0)       of std_logic_vector(12 - 1 downto 0);
+    type tInputDataCountArray  is array(integer range <>) of std_logic_vector(5 downto 0);
+    
+    signal bcid_sr                                                        : tBCIDShiftRegister                                 := (others => (others => '0'));
+    signal super_id                                                       : unsigned(32 - 1 downto 0)                          := (others => '0');
+
+    signal packet_stub_count, packet_stub_count_previous                  : unsigned(7 downto 0)                               := (others => '0');
+    signal packet_stub_counter_pointer                                    : integer                                            := 0;
+    signal packet_stub_count_done                                         : std_logic                                          := '0';
+    
+    signal header_word : std_logic_vector(127 downto 0) := (others => '0');
+
+begin
+
+    --==============================--
+    pBufferHeader: process(clk_p)
+    --==============================--
+        variable bcid             : std_logic_vector(12 - 1 downto 0)                                     := (others => '0');
+    begin
+        if rising_edge(clk_p) then
+            if reset = '1' then
+                super_id <= (others => '0');
+                header_word <= (others => '0');
+            else
+                if header_start = '1' then
+                    bcid      := std_logic_vector(module_header_in(0).bcid);
+                    bcid_sr   <= bcid_sr(bcid_sr'high - 1 downto 0) & bcid;
+                    if unsigned(bcid_sr(bcid_sr'high)) > unsigned(bcid_sr(bcid_sr'high - 1)) then
+                        super_id <= super_id + 1;
+                    end if;
+                end if;
+                
+                -- header_word <= (others => '0');
+                header_word(31 downto 0)  <= std_logic_vector(super_id);
+                header_word(63 downto 32) <= user_bits;
+                header_word(75 downto 64) <= bcid_sr(bcid_sr'high);
+            end if;
+        end if;
+    end process pBufferHeader;
+    
+
+    --==============================--
+    genOutput : for i in 0 to 2 - 1 generate
+    --==============================--
+                        
+        signal packet_stub_count, packet_stub_count_previous                  : unsigned(7 downto 0)                               := (others => '0');
+        signal packet_stub_counter_pointer                                    : integer                                            := 0;
+        signal packet_stub_count_done                                         : std_logic                                          := '0';
+
+    begin
+        --==============================--
+        pCountStubs : process(clk_p)
+        --==============================--
+        begin
+            if rising_edge(clk_p) then
+                if readout_reset = '1' then
+                    packet_stub_count <= (others => '0');
+                    packet_stub_count_previous <= packet_stub_count;
+                    packet_stub_counter_pointer <= 0;
+                    packet_stub_count_done <= '0';
+                else
+                    if packet_stub_count_done = '0' then
+                        if packet_stub_counter_pointer = (6 - 1) * cNumberOfCICs then
+                            packet_stub_count_done <= '1';
+                        end if;
+                        packet_stub_count <= packet_stub_count + unsigned(module_header_in((6*i) + packet_stub_counter_pointer).stub_count) + unsigned(module_header_in((6*i) + packet_stub_counter_pointer + 1).stub_count);
+                        packet_stub_counter_pointer <= packet_stub_counter_pointer + cNumberOfCICs;
+                    end if;
+                end if;
+                
+                header_out(i)(75 downto 0 ) <= header_word(75 downto 0);
+                header_out(i)(83 downto 76) <= std_logic_vector(packet_stub_count_previous);
+            end if;
+        end process pCountStubs;
+
+    end generate ; -- genOutput
+    
+    debug_super_id <= std_logic_vector(super_id);
+
+end Behavioral;
diff --git a/common/firmware/hdl/mprocessor_constants.vhd b/common/firmware/hdl/mprocessor_constants.vhd
index 367eb0996372120aec21e2d4da72d9240ed3ce45..00f1e166419cd2b27b16c3659cd4a115d2b202f6 100644
--- a/common/firmware/hdl/mprocessor_constants.vhd
+++ b/common/firmware/hdl/mprocessor_constants.vhd
@@ -7,6 +7,7 @@ use work.dtc_link_maps.all;
 package mprocessor_constants is
 
     type tHeaderStartArray is array(cNumberOfFEModules - 1 downto 0) of std_logic_vector(1 downto 0);
+    type tPayloadHeaderArray is array(2 - 1 downto 0) of std_logic_vector(127 downto 0);
 
     function convertSLVtoHeaderStartArray (input_vector : in std_logic_vector(2*cNumberOfFEModules - 1 downto 0)) return tHeaderStartArray;
     
diff --git a/top/addr_table/emp_payload.xml b/top/addr_table/emp_payload.xml
index 0eb42100fd332c0aed71be24da0468b27c36a703..04a81abafb5a6e2ad8be1906fc3d36f38b0bb744 100644
--- a/top/addr_table/emp_payload.xml
+++ b/top/addr_table/emp_payload.xml
@@ -7,17 +7,19 @@
 
     <node id="fe_chan" address="0x200" module="file://dtc_link_interface.xml" fwinfo="endpoint;width=9"/>
 
-    
-    <node id="mprocessor" address="0x400" description="MProcessor control and status" module="file://mprocessor.xml" fwinfo="endpoint;width=7"/>
-    <node id="mproc_ctrl" address="0x4ff" description="MProcessor channel control" fwinfo="endpoint;width=0">
-        <node id="chan_sel" mask="0x7f"/>
-        <node id="srst"     mask="0x80"/>
-        <node id="sync_fastreset"     mask="0x100"/>
-    </node>
-
     <node id="tcds_fast_cmd" address="0x600" module="file://dtc_tcds_fastcmd.xml"/>
 
     <node id="link_monitor" address="0x10000" module="file://LinkMonitorInterface.xml"/>
+
+    <node id="mprocessor" address="0x40000" description="MProcessor control and status" module="file://mprocessor.xml" fwinfo="endpoint;width=12"/>
+    <node id="mproc_ctrl" address="0x4fff0" description="MProcessor channel control" fwinfo="endpoint;width=1">
+        <node id="control" address="0x0">
+            <node id="chan_sel" mask="0x7f"/>
+            <node id="srst"     mask="0x80"/>
+            <node id="sync_fastreset"     mask="0x100"/>
+        </node>
+        <node id="header_user_bits" address="0x1"/>
+    </node>
     
     <node id="be_daq" address="0x40000000" module="file://dtc_data_aggregator.xml" fwinfo="endpoint;width=30"/>
 </node>
diff --git a/top/firmware/hdl/emp_payload.vhd b/top/firmware/hdl/emp_payload.vhd
index cfc5b2217899511711c56c1255cbaf60cfbc3dc6..68d7fe6234f324906c70cfdedd5bb923dd230c14 100644
--- a/top/firmware/hdl/emp_payload.vhd
+++ b/top/firmware/hdl/emp_payload.vhd
@@ -60,7 +60,8 @@ architecture rtl of emp_payload is
 
     signal fe_control_registers         : ipb_reg_v(0 downto 0);
     signal fe_status_registers          : ipb_reg_v(0 downto 0);
-    signal mproc_channel_sel            : ipb_reg_v(0 downto 0);
+    signal mproc_control_registers      : ipb_reg_v(1 downto 0);
+    signal mproc_status_registers       : ipb_reg_v(0 downto 0);
     signal link_aggr_control            : ipb_reg_v(0 downto 0);
 
 
@@ -84,6 +85,8 @@ architecture rtl of emp_payload is
 
     signal orbit_counter                : unsigned(31 downto 0)                    := to_unsigned(0   , 32);
     signal bunch_counter                : unsigned(11 downto 0)                    := to_unsigned(3564, 12);
+    signal readout_reset                : std_logic_vector(cNumberOfMProcessors - 1 downto 0) := (others => '0');
+    signal payload_headers              : tPayloadHeaderArray                                 := (others => (others => '0'));
 
 
     -- Daqpath
@@ -157,18 +160,17 @@ begin
     );
 
     --==============================--
-    mproc_channel_ctrl: entity work.ipbus_reg_v
+    mproc_ctrl: entity work.ipbus_ctrlreg_v
     --==============================--
     generic map(
-        N_REG           => 1
+        N_CTRL    => 2
     )
     port map(
         clk             => clk,
         reset           => rst,
         ipbus_in        => ipb_to_slaves(N_SLV_MPROC_CTRL),
         ipbus_out       => ipb_from_slaves(N_SLV_MPROC_CTRL),
-        q               => mproc_channel_sel,
-        qmask           => (0 => X"00000fff")
+        q		        => mproc_control_registers
     );
 
 
@@ -339,7 +341,7 @@ begin
     port map(
         clk             => clk,
         rst             => rst,
-        sel             => mproc_channel_sel(0)(6 downto 0),
+        sel             => mproc_control_registers(0)(6 downto 0),
         ipb_in          => ipb_to_slaves(N_SLV_MPROCESSOR),
         ipb_out         => ipb_from_slaves(N_SLV_MPROCESSOR),
         ipbdc_out       => mprocessor_ipb_chain(0),
@@ -378,14 +380,15 @@ begin
         MProcessorInstance: entity work.MProcessor
         --==============================--
         generic map(
-            N_LINKS => cNumberofInputLinks
+            N_LINKS => cNumberofInputLinks,
+            INDEX   => i
         )
         port map(
             --- Input Ports ---
             clk_p              => clk_p,
             links_in           => stubs(cNumberofInputLinks*i + (cNumberofInputLinks - 1) downto cNumberofInputLinks*i),
-            header_in          => header_array,
             header_start_array => convertSLVtoHeaderStartArray(header_start_array_buffered),
+            payload_header     => payload_headers(i),
             gbe_backpressure   => gbe_backpressure(i),
             srst               => srst,
             --- Output Ports ---
@@ -394,10 +397,28 @@ begin
             ipb_clk            => clk,
             ipb_rst            => rst,
             ipb_in             => ipb_to_channel,
-            ipb_out            => ipb_from_channel
+            ipb_out            => ipb_from_channel,
+            --- Debug Ports ---
+            debug_readout_reset => readout_reset(i)
         );
     end generate genMProcessors;
 
+    --==============================--
+    PayloadHeadeGeneratorInstance : entity work.PayloadHeaderGenerator
+    --==============================--
+    port map ( 
+        --- Input Ports ---
+        clk_p => clk_p,
+        reset => srst,
+        readout_reset => readout_reset(0),
+        header_start => header_start_array_buffered(0),
+        module_header_in => header_array,
+        user_bits => mproc_control_registers(1),
+        --- Ouput Ports ---
+        header_out => payload_headers
+    );
+    
+
 
     gbe_q <= eth_link_out;
     q(5) <= eth_link_out(0);
@@ -443,8 +464,8 @@ begin
         end if;
     end process;
 
-    ttc_resync_reset <= mproc_channel_sel(0)(8);
-    srst <= mproc_channel_sel(0)(7) or ttc_oc0;
+    ttc_resync_reset <= mproc_control_registers(0)(8);
+    srst <= mproc_control_registers(0)(7) or ttc_oc0;
 
     q(4).valid  <= '1';
     q(4).data   <= "0000" & std_logic_vector(bunch_counter) & "0000000000000000" & std_logic_vector(orbit_counter);