diff --git a/tools/log-converter/log_converter.py b/tools/log-converter/log_converter.py
index 9e24f77eb6e015dfcfea0e6086c822c54a9c5728..50a2b7076d2bcd1ebfbb6e07e9e6613ea44fba48 100644
--- a/tools/log-converter/log_converter.py
+++ b/tools/log-converter/log_converter.py
@@ -5,14 +5,17 @@ import click
 import polars as pl
 
 NAS_CALIBRATE_STATE = 1
-FLYING_FMM_STATE = 10
+MAIN_FLYING_FMM_STATE = 10
+PAYLOAD_FLYING_FMM_STATE = 9
 SECONDS_BEFORE_FLYING = 15
 
 
 @click.command()
 @click.argument("path", type=click.Path(exists=True))
 @click.option("--output", type=click.Path(), default=".")
-def main(path: Path, output: Path):
+@click.option("--origin-main", "origin", flag_value="main", default=True)
+@click.option("--origin-payload", "origin", flag_value="payload")
+def main(path: Path, output: Path, origin: str):
     """
     Convert the logs found in the given path to a format compliant with ARPIST.
     """
@@ -21,27 +24,39 @@ def main(path: Path, output: Path):
     nas_state_path = None
     reference_values_path = None
     fmm_status_path = None
+    gps_path = None
 
     for p, _, fn in os.walk(path):
         for f in fn:
-            if f == "main_Main_NASControllerStatus.csv":
-                nas_controller_status_path = os.path.join(p, f)
-            elif f == "main_Main_FlightModeManagerStatus.csv":
-                fmm_status_path = os.path.join(p, f)
-            elif f == "main_Boardcore_NASState.csv":
-                nas_state_path = os.path.join(p, f)
-            elif f == "main_Boardcore_ReferenceValues.csv":
+            if origin == "main":
+                if f == "main_Main_NASControllerStatus.csv":
+                    nas_controller_status_path = os.path.join(p, f)
+                elif f == "main_Main_FlightModeManagerStatus.csv":
+                    fmm_status_path = os.path.join(p, f)
+                elif f == "main_Boardcore_NASState.csv":
+                    nas_state_path = os.path.join(p, f)
+            elif origin == "payload":
+                if f == "payload_Payload_NASControllerStatus.csv":
+                    nas_controller_status_path = os.path.join(p, f)
+                elif f == "payload_Payload_FlightModeManagerStatus.csv":
+                    fmm_status_path = os.path.join(p, f)
+                elif f == "payload_Boardcore_NASState.csv":
+                    nas_state_path = os.path.join(p, f)
+                elif f == "payload_Boardcore_UBXGPSData.csv":
+                    gps_path = os.path.join(p, f)
+            if f == "main_Boardcore_ReferenceValues.csv":
                 reference_values_path = os.path.join(p, f)
 
-    if not all(
-        [
-            nas_controller_status_path,
-            nas_state_path,
-            reference_values_path,
-            fmm_status_path,
-        ]
-    ):
-        raise ValueError("Not all files were found in the given path.")
+    if nas_controller_status_path is None:
+        raise FileNotFoundError("NAS controller status file not found")
+    if nas_state_path is None:
+        raise FileNotFoundError("NAS state file not found")
+    if reference_values_path is None:
+        raise FileNotFoundError("Reference values file not found")
+    if fmm_status_path is None:
+        raise FileNotFoundError("FMM status file not found")
+    if origin == "payload" and gps_path is None:
+        raise FileNotFoundError("GPS data file not found")
 
     nas_controller_status = pl.read_csv(nas_controller_status_path)
     nas_state = pl.read_csv(nas_state_path)
@@ -77,11 +92,37 @@ def main(path: Path, output: Path):
         pl.from_epoch(pl.col("timestamp"), time_unit="us"), "state"
     )
 
-    # find the min and max timestamp
-    # min_ts = min(
-    #     reference_values.select("timestamp").min().item(0, 0),
-    #     (nas_state.select("timestamp").min().item(0, 0)),
-    # )
+    # find stop timestamp based on last state of the fmm plus 10 seconds
+    stop_ts = fmm_status.select(pl.col("timestamp") + pl.duration(seconds=2))[-1, 0]
+
+    # filter the reference values and nas state dataframes
+    reference_values = reference_values.filter(pl.col("timestamp") <= stop_ts)
+    nas_state = nas_state.filter(pl.col("timestamp") <= stop_ts)
+
+    # apply correction to the reference values if payload origin
+    if origin == "payload":
+        gps_data = pl.read_csv(gps_path, infer_schema_length=10000)
+        gps_data = gps_data.select(
+            pl.from_epoch(pl.col("gpsTimestamp"), time_unit="us").alias("timestamp"),
+            "latitude",
+            "longitude",
+        )
+        new_reference_values = []
+        for row in reference_values.rows():
+            timestamp = row[0]
+            (lat, lon) = (
+                gps_data.filter(pl.col("timestamp") < timestamp)
+                .tail(1)
+                .to_numpy()[0, 1:]
+            )
+            new_reference_values.append(
+                [timestamp, lat, lon, row[3] + 1.5]  # altitude is corrected
+            )
+        reference_values = pl.DataFrame(
+            new_reference_values, schema=reference_values.schema, orient="row"
+        )
+
+    # find max timestamp
     max_ts = max(
         reference_values.select("timestamp").max().item(0, 0),
         (nas_state.select("timestamp").max().item(0, 0)),
@@ -105,7 +146,10 @@ def main(path: Path, output: Path):
     )
 
     # filter from 15 seconds before flying
-    start_ts = fmm_status.filter(pl.col("state") == FLYING_FMM_STATE).select(
+    flying_fmm_state = (
+        MAIN_FLYING_FMM_STATE if origin == "main" else PAYLOAD_FLYING_FMM_STATE
+    )
+    start_ts = fmm_status.filter(pl.col("state") == flying_fmm_state).select(
         "timestamp"
     )[0, 0] - pl.duration(seconds=SECONDS_BEFORE_FLYING)
     reference_values = reference_values.filter(pl.col("timestamp") >= start_ts)
diff --git a/tools/log-converter/pyproject.toml b/tools/log-converter/pyproject.toml
index e3c42ba2659d66692871b958e92296a95ad24126..a13734d7320fae194d1080b010ad246229480aff 100644
--- a/tools/log-converter/pyproject.toml
+++ b/tools/log-converter/pyproject.toml
@@ -4,7 +4,11 @@ version = "0.1.0"
 description = "Add your description here"
 readme = "README.md"
 requires-python = ">=3.12"
-dependencies = ["click>=8.1.7", "polars>=1.8.2"]
+dependencies = [
+    "click>=8.1.7",
+    "numpy>=2.1.1",
+    "polars>=1.8.2",
+]
 
 [project.scripts]
 log-converter = "log_converter:main"
diff --git a/tools/log-converter/uv.lock b/tools/log-converter/uv.lock
index 6a88285cabfe42553c618b34c8c8930cf3afff3a..d9de18bbd203295cc820ae6596582f7626cac219 100644
--- a/tools/log-converter/uv.lock
+++ b/tools/log-converter/uv.lock
@@ -28,15 +28,53 @@ version = "0.1.0"
 source = { virtual = "." }
 dependencies = [
     { name = "click" },
+    { name = "numpy" },
     { name = "polars" },
 ]
 
 [package.metadata]
 requires-dist = [
     { name = "click", specifier = ">=8.1.7" },
+    { name = "numpy", specifier = ">=2.1.1" },
     { name = "polars", specifier = ">=1.8.2" },
 ]
 
+[[package]]
+name = "numpy"
+version = "2.1.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/59/5f/9003bb3e632f2b58f5e3a3378902dcc73c5518070736c6740fe52454e8e1/numpy-2.1.1.tar.gz", hash = "sha256:d0cf7d55b1051387807405b3898efafa862997b4cba8aa5dbe657be794afeafd", size = 18874860 }
+wheels = [
+    { url = "https://files.pythonhosted.org/packages/36/11/c573ef66c004f991989c2c6218229d9003164525549409aec5ec9afc0285/numpy-2.1.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:7c803b7934a7f59563db459292e6aa078bb38b7ab1446ca38dd138646a38203e", size = 20884403 },
+    { url = "https://files.pythonhosted.org/packages/6b/6c/a9fbef5fd2f9685212af2a9e47485cde9357c3e303e079ccf85127516f2d/numpy-2.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6435c48250c12f001920f0751fe50c0348f5f240852cfddc5e2f97e007544cbe", size = 13493375 },
+    { url = "https://files.pythonhosted.org/packages/34/f2/1316a6b08ad4c161d793abe81ff7181e9ae2e357a5b06352a383b9f8e800/numpy-2.1.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:3269c9eb8745e8d975980b3a7411a98976824e1fdef11f0aacf76147f662b15f", size = 5088823 },
+    { url = "https://files.pythonhosted.org/packages/be/15/fabf78a6d4a10c250e87daf1cd901af05e71501380532ac508879cc46a7e/numpy-2.1.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:fac6e277a41163d27dfab5f4ec1f7a83fac94e170665a4a50191b545721c6521", size = 6619825 },
+    { url = "https://files.pythonhosted.org/packages/9f/8a/76ddef3e621541ddd6984bc24d256a4e3422d036790cbbe449e6cad439ee/numpy-2.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fcd8f556cdc8cfe35e70efb92463082b7f43dd7e547eb071ffc36abc0ca4699b", size = 13696705 },
+    { url = "https://files.pythonhosted.org/packages/cb/22/2b840d297183916a95847c11f82ae11e248fa98113490b2357f774651e1d/numpy-2.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b9cd92c8f8e7b313b80e93cedc12c0112088541dcedd9197b5dee3738c1201", size = 16041649 },
+    { url = "https://files.pythonhosted.org/packages/c7/e8/6f4825d8f576cfd5e4d6515b9eec22bd618868bdafc8a8c08b446dcb65f0/numpy-2.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:afd9c680df4de71cd58582b51e88a61feed4abcc7530bcd3d48483f20fc76f2a", size = 16409358 },
+    { url = "https://files.pythonhosted.org/packages/bf/f8/5edf1105b0dc24fd66fc3e9e7f3bca3d920cde571caaa4375ec1566073c3/numpy-2.1.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8661c94e3aad18e1ea17a11f60f843a4933ccaf1a25a7c6a9182af70610b2313", size = 14172488 },
+    { url = "https://files.pythonhosted.org/packages/f4/c2/dddca3e69a024d2f249a5b68698328163cbdafb7e65fbf6d36373bbabf12/numpy-2.1.1-cp312-cp312-win32.whl", hash = "sha256:950802d17a33c07cba7fd7c3dcfa7d64705509206be1606f196d179e539111ed", size = 6237195 },
+    { url = "https://files.pythonhosted.org/packages/b7/98/5640a09daa3abf0caeaefa6e7bf0d10c0aa28a77c84e507d6a716e0e23df/numpy-2.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:3fc5eabfc720db95d68e6646e88f8b399bfedd235994016351b1d9e062c4b270", size = 12568082 },
+    { url = "https://files.pythonhosted.org/packages/6b/9e/8bc6f133bc6d359ccc9ec051853aded45504d217685191f31f46d36b7065/numpy-2.1.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:046356b19d7ad1890c751b99acad5e82dc4a02232013bd9a9a712fddf8eb60f5", size = 20834810 },
+    { url = "https://files.pythonhosted.org/packages/32/1b/429519a2fa28681814c511574017d35f3aab7136d554cc65f4c1526dfbf5/numpy-2.1.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6e5a9cb2be39350ae6c8f79410744e80154df658d5bea06e06e0ac5bb75480d5", size = 13507739 },
+    { url = "https://files.pythonhosted.org/packages/25/18/c732d7dd9896d11e4afcd487ac65e62f9fa0495563b7614eb850765361fa/numpy-2.1.1-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:d4c57b68c8ef5e1ebf47238e99bf27657511ec3f071c465f6b1bccbef12d4136", size = 5074465 },
+    { url = "https://files.pythonhosted.org/packages/3e/37/838b7ae9262c370ab25312bab365492016f11810ffc03ebebbd54670b669/numpy-2.1.1-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:8ae0fd135e0b157365ac7cc31fff27f07a5572bdfc38f9c2d43b2aff416cc8b0", size = 6606418 },
+    { url = "https://files.pythonhosted.org/packages/8b/b9/7ff3bfb71e316a5b43a124c4b7a5881ab12f3c32636014bef1f757f19dbd/numpy-2.1.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:981707f6b31b59c0c24bcda52e5605f9701cb46da4b86c2e8023656ad3e833cb", size = 13692464 },
+    { url = "https://files.pythonhosted.org/packages/42/78/75bcf16e6737cd196ff7ecf0e1fd3f953293a34dff4fd93fb488e8308536/numpy-2.1.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ca4b53e1e0b279142113b8c5eb7d7a877e967c306edc34f3b58e9be12fda8df", size = 16037763 },
+    { url = "https://files.pythonhosted.org/packages/23/99/36bf5ffe034d06df307bc783e25cf164775863166dcd878879559fe0379f/numpy-2.1.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:e097507396c0be4e547ff15b13dc3866f45f3680f789c1a1301b07dadd3fbc78", size = 16410374 },
+    { url = "https://files.pythonhosted.org/packages/7f/16/04c5dab564887d4cd31a9ed30e51467fa70d52a4425f5a9bd1eed5b3d34c/numpy-2.1.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f7506387e191fe8cdb267f912469a3cccc538ab108471291636a96a54e599556", size = 14169873 },
+    { url = "https://files.pythonhosted.org/packages/09/e0/d1b5adbf1731886c4186c59a9fa208585df9452a43a2b60e79af7c649717/numpy-2.1.1-cp313-cp313-win32.whl", hash = "sha256:251105b7c42abe40e3a689881e1793370cc9724ad50d64b30b358bbb3a97553b", size = 6234118 },
+    { url = "https://files.pythonhosted.org/packages/d0/9c/2391ee6e9ebe77232ddcab29d92662b545e99d78c3eb3b4e26d59b9ca1ca/numpy-2.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:f212d4f46b67ff604d11fff7cc62d36b3e8714edf68e44e9760e19be38c03eb0", size = 12561742 },
+    { url = "https://files.pythonhosted.org/packages/38/0e/c4f754f9e73f9bb520e8bf418c646f2c4f70c5d5f2bc561e90f884593193/numpy-2.1.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:920b0911bb2e4414c50e55bd658baeb78281a47feeb064ab40c2b66ecba85553", size = 20858403 },
+    { url = "https://files.pythonhosted.org/packages/32/fc/d69092b9171efa0cb8079577e71ce0cac0e08f917d33f6e99c916ed51d44/numpy-2.1.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:bab7c09454460a487e631ffc0c42057e3d8f2a9ddccd1e60c7bb8ed774992480", size = 13519851 },
+    { url = "https://files.pythonhosted.org/packages/14/2a/d7cf2cd9f15b23f623075546ea64a2c367cab703338ca22aaaecf7e704df/numpy-2.1.1-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:cea427d1350f3fd0d2818ce7350095c1a2ee33e30961d2f0fef48576ddbbe90f", size = 5115444 },
+    { url = "https://files.pythonhosted.org/packages/8e/00/e87b2cb4afcecca3b678deefb8fa53005d7054f3b5c39596e5554e5d98f8/numpy-2.1.1-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:e30356d530528a42eeba51420ae8bf6c6c09559051887196599d96ee5f536468", size = 6628903 },
+    { url = "https://files.pythonhosted.org/packages/ab/9d/337ae8721b3beec48c3413d71f2d44b2defbf3c6f7a85184fc18b7b61f4a/numpy-2.1.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8dfa9e94fc127c40979c3eacbae1e61fda4fe71d84869cc129e2721973231ef", size = 13665945 },
+    { url = "https://files.pythonhosted.org/packages/c0/90/ee8668e84c5d5cc080ef3beb622c016adf19ca3aa51afe9dbdcc6a9baf59/numpy-2.1.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:910b47a6d0635ec1bd53b88f86120a52bf56dcc27b51f18c7b4a2e2224c29f0f", size = 16023473 },
+    { url = "https://files.pythonhosted.org/packages/38/a0/57c24b2131879183051dc698fbb53fd43b77c3fa85b6e6311014f2bc2973/numpy-2.1.1-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:13cc11c00000848702322af4de0147ced365c81d66053a67c2e962a485b3717c", size = 16400624 },
+    { url = "https://files.pythonhosted.org/packages/bb/4c/14a41eb5c9548c6cee6af0936eabfd985c69230ffa2f2598321431a9aa0a/numpy-2.1.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:53e27293b3a2b661c03f79aa51c3987492bd4641ef933e366e0f9f6c9bf257ec", size = 14155072 },
+]
+
 [[package]]
 name = "polars"
 version = "1.8.2"