diff --git a/common/firmware/cfg/module.dep b/common/firmware/cfg/module.dep
index 2036591c661b33313e8bc13abeedcfdf403b94da..9c4f36cf174e77590b7780560073d51e1dc006dc 100644
--- a/common/firmware/cfg/module.dep
+++ b/common/firmware/cfg/module.dep
@@ -14,6 +14,7 @@ src LinkCombinerIPBus.vhd
 src --vhdl2008 TrackReconstructor.vhd
 src mprocessor_data_types.vhd
 src PayloadHeaderGenerator.vhd
+src TrackFinder.vhd
 
 src EcalLinkInterface.vhd 
 src EcalDataDecoder.vhd 
diff --git a/common/firmware/hdl/LinkAggregatorCore.vhd b/common/firmware/hdl/LinkAggregatorCore.vhd
index b80a640a37fdeadbfb34ca5d9355339f18c432bd..8bfa4f0731915e339adeedc45a8444c828375751 100644
--- a/common/firmware/hdl/LinkAggregatorCore.vhd
+++ b/common/firmware/hdl/LinkAggregatorCore.vhd
@@ -30,6 +30,7 @@ entity LinkAggregatorCore is
         --- Debug Ports ---
         status_bits        : out std_logic_vector(15 downto 0);
         debug_tracking_event_count : out std_logic_vector(31 downto 0) := (others => '0');
+        debug_tracking_stubs_out : out ldata(5 downto 0) := (others => LWORD_NULL);
         non_empty_counts   : out ipb_reg_v(8*N_LINKS - 1 downto 0);
         bx_valid_count_out : out ipb_reg_v(0 downto 0)
     );
@@ -145,8 +146,10 @@ architecture compressed of LinkAggregatorCore is
     signal pBx_counter           : integer                                  := 0;
     
     signal readout_reset_signal : std_logic := '0';
+    signal links_out_signal     : ldata(7 downto 0) := (others => LWORD_NULL);
+    signal uncompressed_stubs_signal : ldata(N_LINKS * 8 - 1 downto 0) := (others => LWORD_NULL);
     
-    signal track_stubs : tTrackStubs := (others => LWORD_NULL);
+    signal track_stubs : ldata(5 downto 0) := (others => LWORD_NULL);
     signal single_stub_event : std_logic_vector(N_LINKS - 1 downto 0) := (others => '0');
     signal event_valid_for_tracking : std_logic := '0';
     signal tracking_event_count : unsigned(31 downto 0) := (others => '0');
@@ -270,8 +273,8 @@ begin
             -- Enable writing of routing FIFO using the valid flag of the cache FIFO
             wr_en_route <= valid_cache;
             din_route <= dout_cache;
-            uncompressed_stubs(cBoxcarBx * i + j).data <= dout_cache;
-            uncompressed_stubs(cBoxcarBx * i + j).valid <= valid_cache;
+            uncompressed_stubs_signal(cBoxcarBx * i + j).data <= dout_cache;
+            uncompressed_stubs_signal(cBoxcarBx * i + j).valid <= valid_cache;
             
             
             --==============================--
@@ -313,7 +316,7 @@ begin
                 data_count => count_route
             );
 
-            -- Combine the IPBus 'reset' with the 'packet_start_buffered' signal to generate the reset signal for the routing FIFO.
+            -- Combine the IPBus 'reset' with the 'packet_start' signal to generate the reset signal for the routing FIFO.
             route_reset <= reset or packet_start_buffered;
                 
         end generate genLinkBxCache;
@@ -400,13 +403,13 @@ begin
                 end if;
 
                 if valid = '1' then
-                    links_out(i).valid <= '1';
-                    links_out(i).data  <= dout;
+                    links_out_signal(i).valid <= '1';
+                    links_out_signal(i).data  <= dout;
                 else
-                    links_out(i).valid <= '0';
-                    links_out(i).data  <= (others => '0');
+                    links_out_signal(i).valid <= '0';
+                    links_out_signal(i).data  <= (others => '0');
                 end if;               
-                links_out(i).strobe <= '1';
+                links_out_signal(i).strobe <= '1';
             end if;
             
         end process pIteratePointer;
@@ -453,7 +456,7 @@ begin
                 end if;
             end if;
             -- If counter is at the end of a packet, then start to readout the contents of the aggregated FIFOs
-            if counter = 48 then
+            if counter = 49 then
                 readout_reset_signal <= '1';
             else
                 readout_reset_signal <= '0';
@@ -489,19 +492,31 @@ begin
         end if;
     end process pCountValidBits;
     
-    
+    --==============================--
     pExtractTrackingEvent : process(clk_p)
+    --==============================--
     begin
         if rising_edge(clk_p) then
             event_valid_for_tracking <= and_reduce(single_stub_event);
             
-            if readout_reset_signal = '1' and event_valid_for_tracking = '1' then
-                tracking_event_count <= tracking_event_count + 1;
+            if readout_reset_signal = '1' then
+                if event_valid_for_tracking = '1' then
+                    tracking_event_count <= tracking_event_count + 1;
+                    
+                    for i in 0 to 5 loop
+                        track_stubs(i).valid <= '1';
+                        track_stubs(i).data <= uncompressed_stubs_signal(8*i).data;
+                    end loop;
+                else
+                    track_stubs <= (others => LWORD_NULL);
+                end if;
             end if;
         end if;
     end process pExtractTrackingEvent;
     
     readout_reset <= readout_reset_signal;
+    links_out <= links_out_signal;
+    uncompressed_stubs <= uncompressed_stubs_signal;
 
     --==============================--
     -- Debug
@@ -519,5 +534,6 @@ begin
     non_empty_counts <= non_empty_fifo_count;
     bx_valid_count_out <= bx_valid_count;
     debug_tracking_event_count <= std_logic_vector(tracking_event_count);
+    debug_tracking_stubs_out <= track_stubs;
 
 end compressed;
diff --git a/common/firmware/hdl/TrackFinder.vhd b/common/firmware/hdl/TrackFinder.vhd
new file mode 100644
index 0000000000000000000000000000000000000000..32e63137329eaf47e736412888f50fff99a4c184
--- /dev/null
+++ b/common/firmware/hdl/TrackFinder.vhd
@@ -0,0 +1,65 @@
+----------------------------------------------------------------------------------
+-- Company: 
+-- Engineer: 
+-- 
+-- Create Date: 09/09/2023 11:30:24 PM
+-- Design Name: 
+-- Module Name: TrackFinder - Behavioral
+-- Project Name: 
+-- Target Devices: 
+-- Tool Versions: 
+-- Description: 
+-- 
+-- Dependencies: 
+-- 
+-- Revision:
+-- Revision 0.01 - File Created
+-- Additional Comments:
+-- 
+----------------------------------------------------------------------------------
+
+
+library IEEE;
+use IEEE.STD_LOGIC_1164.ALL;
+use IEEE.NUMERIC_STD.ALL;
+use IEEE.STD_LOGIC_MISC.ALL;
+
+use work.emp_data_types.all;
+use work.tracking_constants.all;
+
+entity TrackFinder is
+    port (
+        clk_p : in STD_LOGIC;
+        stubs_in : in ldata(5 downto 0) := (others => LWORD_NULL);
+        header_start : in std_logic
+    );
+end TrackFinder;
+
+architecture Behavioral of TrackFinder is
+
+    signal stub_array : tDecodedStubArray := (others => cNullDecodedStub);
+    signal valid_event_array : std_logic_vector(5 downto 0);
+    signal valid_event : std_logic := '0';
+
+begin
+
+    genValidEventArray: for i in 0 to 5 generate
+    begin
+        valid_event_array(i) <= stubs_in(i).valid;
+    end generate;
+
+    pMain : process(clk_p)
+    begin
+        if rising_edge(clk_p) then
+            if header_start = '1' then
+                valid_event <= and_reduce(valid_event_array);
+                for i in 0 to 5 loop
+                    if stubs_in(i).valid = '1' then
+                        stub_array(i) <= convertStubtoDecodedStub(convertSLVtoStub(stubs_in(i).data));
+                    end if;
+                end loop;
+            end if;
+        end if;
+    end process pMain;
+
+end Behavioral;
diff --git a/common/firmware/hdl/tracking_constants.vhd b/common/firmware/hdl/tracking_constants.vhd
index 121f21cf9d473ebe0bca8275623b08145f1b7b58..32964941729fbc89cee9afcb8f0701fbff3e68b9 100644
--- a/common/firmware/hdl/tracking_constants.vhd
+++ b/common/firmware/hdl/tracking_constants.vhd
@@ -8,4 +8,59 @@ package tracking_constants is
     
     type tTrackStubs is array (0 to 5) of lword;
     
-end package tracking_constants;
\ No newline at end of file
+    type tStub is record
+        z : std_logic_vector(3 downto 0);
+        bend : std_logic_vector(3 downto 0);
+        address : std_logic_vector(7 downto 0);
+        cbc : std_logic_vector(2 downto 0);
+        cic : std_logic_vector(0 downto 0);
+    end record;
+    constant cNullStub : tStub := ((others => '0'), (others => '0'), (others => '0'), (others => '0'), (others => '0'));
+    type tStubArray is array(0 to 5) of tStub;
+    
+    function convertSLVtoStub(word_in : in std_logic_vector(63 downto 0)) return tStub;
+    
+    type tCICMappingArray is array (0 to 7) of integer;
+    constant cCICMapping : tCICMappingArray := (0, 1, 2, 3, 7, 6, 5, 4);
+
+
+    
+    type tDecodedStub is record
+        localx : integer;
+        localy : integer;
+    end record;
+    constant cNullDecodedStub : tDecodedStub := (0, 0);
+    type tDecodedStubArray is array(0 to 5) of tDecodedStub;
+    
+    function convertStubtoDecodedStub(stub_in: tStub) return tDecodedStub;
+    
+end package tracking_constants;
+
+
+package body tracking_constants is
+
+    function convertSLVtoStub(word_in : in std_logic_vector(63 downto 0)) return tStub is
+        variable stub : tStub;
+    begin
+        stub.z := word_in(3 downto 0);
+        stub.bend := word_in(7 downto 4);
+        stub.address := word_in(15 downto 8);
+        stub.cbc := word_in(18 downto 16);
+        stub.cic := word_in(50 downto 50);
+        return stub;
+    end convertSLVtoStub;
+    
+    function convertStubtoDecodedStub(stub_in: tStub) return tDecodedStub is
+        variable decoded_stub : tDecodedStub;
+    begin
+        if stub_in.cic = "1" then
+            decoded_stub.localy := 1;
+            decoded_stub.localx := 2032 - to_integer(unsigned(stub_in.address)) - 254*cCICMapping(to_integer(unsigned(stub_in.cbc))) + 2;
+        else
+            decoded_stub.localy := 0;
+            decoded_stub.localx := to_integer(unsigned(stub_in.address)) + 254* cCICMapping(to_integer(unsigned(stub_in.cbc)));
+        end if;
+        return decoded_stub;
+    end convertStubtoDecodedStub;
+
+end tracking_constants;