diff --git a/stitch_project/stitch/DistanceUnwrapper.vhd b/stitch_project/stitch/DistanceUnwrapper.vhd
new file mode 100644
index 0000000000000000000000000000000000000000..5ccdab7cc478f9e395c35f799a3dce8605af464d
--- /dev/null
+++ b/stitch_project/stitch/DistanceUnwrapper.vhd
@@ -0,0 +1,158 @@
+----------------------------------------------------------------------------------
+-- Company: ETH Zurich
+-- Engineer: Pascal Engeler <engeler.pascal@gmail.com>
+-- 
+-- Create Date:    14:32:01 09/06/2024 
+-- Design Name: 
+-- Module Name:    DistanceUnwrapper - 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.STD_LOGIC_UNSIGNED.ALL;
+use IEEE.NUMERIC_STD.ALL;
+
+entity DistanceUnwrapper is
+    Port (  clk100			: in STD_LOGIC;
+			en 				: in  STD_LOGIC;
+			dr				: in STD_LOGIC;
+		    distance_in	 	: in  STD_LOGIC_VECTOR(20 downto 0);
+            distance_out    : out STD_LOGIC_VECTOR(24 downto 0);
+			dr_out			: out STD_LOGIC);
+end DistanceUnwrapper;
+
+architecture Behavioral of DistanceUnwrapper is
+
+type STATE_T is (IDLE_S, STATE1, STATE2, STATE3, STATE4, STATE5, STATE6);
+
+signal current_state : STATE_T := IDLE_S;
+
+signal currentDistance : STD_LOGIC_VECTOR(24 downto 0) := (others => '0');
+signal prevDistance : STD_LOGIC_VECTOR(24 downto 0) := (others => '0');
+signal distanceInWide : STD_LOGIC_VECTOR(24 downto 0) := (others => '0');
+signal calcDelta : STD_LOGIC_VECTOR(24 downto 0) := (others => '0');
+
+signal maxDelta : STD_LOGIC_VECTOR(24 downto 0) := "0000100000000000000000000";
+signal corrDelta : STD_LOGIC_VECTOR(24 downto 0) := "0001000000000000000000000";
+signal corrDeltaN : STD_LOGIC_VECTOR(24 downto 0) := "1111000000000000000000000";
+signal currentOffset : STD_LOGIC_VECTOR(24 downto 0) := (others => '0');
+
+signal dr_prev : STD_LOGIC := '0';
+
+begin
+
+distanceInWide(20 downto 0) <= distance_in;
+distanceInWide(24 downto 21) <= (others => '0');
+
+
+dr_update: process(clk100)
+begin
+	if rising_edge(clk100) then
+		dr_prev <= dr;
+	end if;
+end process;
+
+
+proc: process(clk100)
+begin
+	if rising_edge(clk100) then
+		if en = '1' then
+			case current_state is
+			when IDLE_S =>
+				if dr = '1' and dr_prev = '0' then
+					current_state <= STATE1;
+					--calculate relevant delta distance here
+					if prevDistance > distanceInWide then
+						calcDelta <= prevDistance - distanceInWide;
+					else 
+						calcDelta <= distanceInWide - prevDistance;
+				else
+
+				end if;
+			when STATE1 =>
+				current_state <= STATE2;
+				--calculate change to offset here 
+			when STATE2 => 
+				current_state <= STATE3;
+				--calculate output distance here
+			when STATE3 =>
+				current_state <= IDLE_S;
+				--set output ready here
+				
+			end case;
+
+		else 
+			currentDistance <= (others => '0');
+			prevDistance <= (others => '0');
+		end if;
+
+	end if;
+		
+end process;
+
+
+
+
+
+
+
+
+
+
+signal cmd_received_sig : STD_LOGIC := '0';
+signal rxs : STD_LOGIC := '0';
+signal rx_delay_line: STD_LOGIC_VECTOR(5 downto 0);
+signal serial_data : STD_LOGIC_VECTOR(9 downto 0) := (others => '0');
+signal serial_counter : STD_LOGIC_VECTOR (9 downto 0) := (others => '0');
+--baud rate: 115200
+signal serial_counter_max : STD_LOGIC_VECTOR(9 downto 0) := "1101100011"; --change this for baud rate change
+signal serial_counter_offset : STD_LOGIC_VECTOR(9 downto 0) := "0110110001"; --change this for baud rate change
+
+begin
+
+sanitize_input: process(clk100)
+begin
+	if rising_edge(clk100) then
+		rx_delay_line(5) <= s_data_in;
+		rx_delay_line(4 downto 0) <= rx_delay_line(5 downto 1);
+		rxs <= rx_delay_line(0);
+	end if;
+end process;
+
+receive_serial: process(clk100)
+begin
+	if rising_edge(clk100) then
+		if(rxs = '1') AND (serial_data(0) = '0') then
+			serial_data <= "1111111111";
+			cmd_received_sig <= '0';
+			serial_counter <= serial_counter_offset;
+		else
+			if (serial_counter = serial_counter_max) AND (serial_data(0) = '1') then
+				serial_counter <= (others => '0');
+				serial_data(8 downto 0) <= serial_data(9 downto 1);
+				serial_data(9) <= NOT rxs;
+				cmd_received_sig <= not serial_data(1); --this should maybe be serial_data(0) update: no, i think this is correct.
+			else
+				serial_counter <= serial_counter + 1;
+				cmd_received_sig <= '0';
+				serial_data <= serial_data;
+			end if;
+		end if;
+	end if;
+end process;
+
+data <= serial_data(8 downto 1);
+cmd_received <= cmd_received_sig;
+			
+end Behavioral;
+