diff --git a/Botanist/Botanist.cs b/Botanist/Botanist.cs
index 1cfc1fb..72750e3 100644
--- a/Botanist/Botanist.cs
+++ b/Botanist/Botanist.cs
@@ -97,7 +97,7 @@ public class Botanist : IObservatoryWorker
         set => botanistSettings = (BotanistSettings)value;
     }
 
-    public void JournalEvent<TJournal>(TJournal journal) where TJournal : IJournal
+    public void JournalEvent<TJournal>(TJournal journal) where TJournal : JournalBase
     {
         switch (journal)
         {
diff --git a/Pulsar/Features/Cargo/CargoController.cs b/Pulsar/Features/Cargo/CargoController.cs
new file mode 100644
index 0000000..084497f
--- /dev/null
+++ b/Pulsar/Features/Cargo/CargoController.cs
@@ -0,0 +1,13 @@
+using Observatory.Framework.Files;
+
+namespace Pulsar.Features.Cargo;
+
+[ApiController]
+[Route("api/[controller]")]
+public class CargoController(ICargoService cargoService) : ControllerBase
+{
+    public async Task<ActionResult<CargoFile>> Get()
+    {
+        return Ok(await cargoService.Get());
+    }
+}
\ No newline at end of file
diff --git a/Pulsar/Features/Cargo/CargoService.cs b/Pulsar/Features/Cargo/CargoService.cs
new file mode 100644
index 0000000..b1f4a0e
--- /dev/null
+++ b/Pulsar/Features/Cargo/CargoService.cs
@@ -0,0 +1,46 @@
+namespace Pulsar.Features.Cargo;
+
+using Observatory.Framework.Files;
+
+public interface ICargoService : IJournalHandler<CargoFile>;
+
+public class CargoService(IOptions<PulsarConfiguration> options, ILogger<CargoService> logger, IEventHubContext hub) : ICargoService
+{
+    public string FileName => "Cargo.json";
+    
+    public async Task HandleFile(string filePath)
+    {
+        if (!FileHelper.ValidateFile(filePath))
+        {
+            return;
+        }
+
+        var file = File.Open(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
+        var moduleInfo = await JsonSerializer.DeserializeAsync<CargoFile>(file);
+
+        if (moduleInfo == null)
+        {
+            logger.LogWarning("Failed to deserialize status file {FilePath}", filePath);
+            return;
+        }
+
+        await hub.Clients.All.CargoUpdated(moduleInfo);
+    }
+
+    public async Task<CargoFile> Get()
+    {
+        var cargoFile = Path.Combine(options.Value.JournalDirectory, FileName);
+
+        if (!FileHelper.ValidateFile(cargoFile))
+        {
+            return new CargoFile();
+        }
+
+        await using var file = File.Open(cargoFile, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
+        var cargo = await JsonSerializer.DeserializeAsync<CargoFile>(file);
+        if (cargo != null) return cargo;
+
+        logger.LogWarning("Failed to deserialize module info file {CargoFile}", cargoFile);
+        return new CargoFile();
+    }
+}
\ No newline at end of file
diff --git a/Pulsar/Features/FileHandlerService.cs b/Pulsar/Features/FileHandlerService.cs
index 4fdc846..01198e4 100644
--- a/Pulsar/Features/FileHandlerService.cs
+++ b/Pulsar/Features/FileHandlerService.cs
@@ -1,3 +1,5 @@
+using Observatory.Framework.Files;
+using Observatory.Framework.Files.Journal.Odyssey;
 using Pulsar.Features.ModulesInfo;
 using Pulsar.Features.ShipLocker;
 
@@ -12,9 +14,7 @@ public interface IFileHandlerService : IFileHandler;
 
 public class FileHandlerService(
     ILogger<FileHandlerService> logger,
-    IStatusService statusService,
-    IShipLockerService shipLockerService,
-    IModulesInfoService modulesService) : IFileHandlerService
+    IServiceProvider serviceProvider) : IFileHandlerService
 {
     public static readonly string MarketFileName = "Market.json";
     public static readonly string StatusFileName = "Status.json";
@@ -46,11 +46,13 @@ public class FileHandlerService(
         NavRouteFileName
     ];
 
-    private readonly Dictionary<string, IJournalHandler> Handlers = new()
+    private readonly Dictionary<string, Type> Handlers = new()
     {
-        { StatusFileName, statusService },
-        { ModulesInfoFileName, modulesService },
-        { ShipLockerFileName, shipLockerService }
+        { StatusFileName, typeof(IJournalHandler<Observatory.Framework.Files.Status>) },
+        { ModulesInfoFileName, typeof(IJournalHandler<ModuleInfoFile>) },
+        { ShipLockerFileName, typeof(IJournalHandler<ShipLockerMaterials>) },
+        { ShipLockerFileName, typeof(IJournalHandler<ShipLockerMaterials>) },
+        { CargoFileName, typeof(IJournalHandler<CargoFile>) },
     };
 
     public async Task HandleFile(string path)
@@ -68,10 +70,10 @@ public class FileHandlerService(
             return;
         }
 
-        if (Handlers.TryGetValue(match, out var handler))
+        if (Handlers.TryGetValue(match, out var type))
         {
-            logger.LogInformation("Handling file {FileName}", fileName);
-            await handler.HandleFile(fileInfo.Name);
+            logger.LogInformation("Handling file {FileName} with Type {Type}", fileName);
+            (serviceProvider.GetRequiredService(type) as IJournalHandler)?.HandleFile(path);
             return;
         }
 
diff --git a/Pulsar/Features/Interfaces/IJournalHandler.cs b/Pulsar/Features/Interfaces/IJournalHandler.cs
index d39ee0a..2373036 100644
--- a/Pulsar/Features/Interfaces/IJournalHandler.cs
+++ b/Pulsar/Features/Interfaces/IJournalHandler.cs
@@ -1,5 +1,3 @@
-using Observatory.Framework.Files.Journal;
-
 namespace Pulsar.Features;
 
 /// <summary>
@@ -8,8 +6,6 @@ namespace Pulsar.Features;
 public interface IJournalHandler : IFileHandler
 {
     string FileName { get; }
-
-    public bool ValidateFile(string filePath);
 }
 
 /// <summary>
diff --git a/Pulsar/Features/Journal/JournalService.cs b/Pulsar/Features/Journal/JournalService.cs
index 8dc3033..e6d165d 100644
--- a/Pulsar/Features/Journal/JournalService.cs
+++ b/Pulsar/Features/Journal/JournalService.cs
@@ -1,6 +1,6 @@
 namespace Pulsar.Features.Journal;
 
-using Observatory.Framework.Files;
+using System.Text.RegularExpressions;
 using Observatory.Framework.Files.Journal;
 
 public interface IJournalService : IJournalHandler<List<JournalBase>>;
@@ -12,57 +12,41 @@ public class JournalService
     IEventHubContext hub
 ) : IJournalService
 {
-    public string FileName => "Journal.2024-03-16T152419.01.log"; // FileHandlerService.JournalLogFileName;
-
-    public bool ValidateFile(string filePath)
-    {
-        if (!File.Exists(filePath))
-        {
-            logger.LogWarning("Journal file {JournalFile} does not exist", filePath);
-            return false;
-        }
-
-        var fileInfo = new FileInfo(filePath);
-
-        if (!string.Equals(fileInfo.Name, FileName, StringComparison.InvariantCultureIgnoreCase))
-        {
-            logger.LogWarning("Journal file {name} is not valid");
-            return false;
-        }
-
-        if (fileInfo.Length == 0)
-        {
-            logger.LogWarning("Journal file {name} is empty", filePath);
-            return false;
-        }
-
-        return true;
-    }
-
+    public string FileName => FileHandlerService.JournalLogFileName;
+    
     public async Task HandleFile(string filePath)
     {
-        if (!ValidateFile(filePath))
+        if (!FileHelper.ValidateFile(filePath))
         {
             return;
         }
 
         var file = File.Open(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
-        var moduleInfo = await JsonSerializer.DeserializeAsync<List<JournalBase>>(file);
+        var journals = await JsonSerializer.DeserializeAsync<List<JournalBase>>(file);
 
-        if (moduleInfo == null)
+        if (journals == null)
         {
             logger.LogWarning("Failed to deserialize status file {FilePath}", filePath);
             return;
         }
 
-        // await hub.Clients.All.ModuleInfoUpdated(moduleInfo);
+        await hub.Clients.All.JournalUpdated(journals);
     }
 
     public async Task<List<JournalBase>> Get()
     {
-        var dataFileName = Path.Combine(options.Value.JournalDirectory, FileName);
-
-        if (!ValidateFile(dataFileName))
+        var folder = new DirectoryInfo(options.Value.JournalDirectory);
+        var regex = new Regex(FileHandlerService.JournalLogFileNameRegEx);
+        
+        if (!folder.Exists)
+        {
+            logger.LogWarning("Journal directory {JournalDirectory} does not exist", folder.FullName);
+            return [];
+        }
+        
+        var dataFileName = folder.GetFiles().FirstOrDefault(f => regex.IsMatch(f.Name))?.FullName;
+        
+        if (!FileHelper.ValidateFile(dataFileName))
         {
             return [];
         }
diff --git a/Pulsar/PulsarServiceRegistry.cs b/Pulsar/PulsarServiceRegistry.cs
index ad36439..04ee0d5 100644
--- a/Pulsar/PulsarServiceRegistry.cs
+++ b/Pulsar/PulsarServiceRegistry.cs
@@ -1,6 +1,7 @@
 using System.Diagnostics.CodeAnalysis;
 using Lamar;
 using Pulsar.Features;
+using Pulsar.Features.Cargo;
 using Pulsar.Features.ModulesInfo;
 using Pulsar.Features.Journal;
 
@@ -14,6 +15,7 @@ public class PulsarServiceRegistry : ServiceRegistry
         For<IFileHandlerService>().Use<FileHandlerService>();
         For<IStatusService>().Use<StatusService>();
         For<IModulesInfoService>().Use<ModulesInfoService>();
+        For<ICargoService>().Use<CargoService>();
         For<IJournalService>().Use<JournalService>();
     }
 }
\ No newline at end of file
diff --git a/Pulsar/Utils/FileHelper.cs b/Pulsar/Utils/FileHelper.cs
new file mode 100644
index 0000000..b64ed09
--- /dev/null
+++ b/Pulsar/Utils/FileHelper.cs
@@ -0,0 +1,21 @@
+namespace Pulsar.Utils;
+
+public static class FileHelper
+{
+    public static bool ValidateFile(string filePath)
+    {
+        if (!File.Exists(filePath))
+        {
+            return false;
+        }
+
+        var fileInfo = new FileInfo(filePath);
+
+        if (fileInfo.Length == 0)
+        {
+            return false;
+        }
+
+        return true;
+    }
+}
\ No newline at end of file