M src/PacketLogger/Models/Packets/CommsPacketProvider.cs => src/PacketLogger/Models/Packets/CommsPacketProvider.cs +6 -0
  
@@ 89,4 89,10 @@ public class CommsPacketProvider : IPacketSender
             Packets.Add(new PacketInfo(index, DateTime.Now, packetArgs.Source, packetArgs.PacketString));
         }
     }
+
+    /// <inheritdoc />
+    public void Dispose()
+    {
+        Packets.Dispose();
+    }
 }=
\ No newline at end of file
 
M src/PacketLogger/Models/Packets/DummyPacketProvider.cs => src/PacketLogger/Models/Packets/DummyPacketProvider.cs +2 -2
  
@@ 70,13 70,13 @@ public class DummyPacketProvider : IPacketProvider, IDisposable
     /// <inheritdoc />
     public Task<Result> Open()
     {
-        throw new System.NotImplementedException();
+        return Task.FromResult(Result.FromSuccess());
     }
 
     /// <inheritdoc />
     public Task<Result> Close()
     {
-        throw new System.NotImplementedException();
+        return Task.FromResult(Result.FromSuccess());
     }
 
     /// <inheritdoc />
 
M src/PacketLogger/Models/Packets/FilePacketProvider.cs => src/PacketLogger/Models/Packets/FilePacketProvider.cs +6 -0
  
@@ 119,4 119,10 @@ public class FilePacketProvider : IPacketProvider
 
     /// <inheritdoc />
     public event PropertyChangedEventHandler? PropertyChanged;
+
+    /// <inheritdoc/>
+    public void Dispose()
+    {
+        _packets?.Dispose();
+    }
 }=
\ No newline at end of file
 
M src/PacketLogger/Models/Packets/IPacketProvider.cs => src/PacketLogger/Models/Packets/IPacketProvider.cs +2 -1
  
@@ 4,6 4,7 @@
 //  Copyright (c) František Boháček. All rights reserved.
 //  Licensed under the MIT license. See LICENSE file in the project root for full license information.
 
+using System;
 using System.Collections.Generic;
 using System.Collections.ObjectModel;
 using System.ComponentModel;
@@ 17,7 18,7 @@ namespace PacketLogger.Models.Packets;
 /// <summary>
 /// Provides packets from some kind of a source.
 /// </summary>
-public interface IPacketProvider : INotifyPropertyChanged
+public interface IPacketProvider : INotifyPropertyChanged, IDisposable
 {
     /// <summary>
     /// Gets whether <see cref="Open"/> was called and successfully finished.
 
M src/PacketLogger/ViewModels/DockFactory.cs => src/PacketLogger/ViewModels/DockFactory.cs +6 -0
  
@@ 44,6 44,12 @@ public class DockFactory : Factory, IDisposable
         _injector = injector;
     }
 
+    /// <inheritdoc />
+    public override IDockWindow CreateDockWindow()
+    {
+        return base.CreateDockWindow();
+    }
+
     /// <summary>
     /// Gets the document dock.
     /// </summary>
 
M src/PacketLogger/ViewModels/LogFilterTabViewModel.cs => src/PacketLogger/ViewModels/LogFilterTabViewModel.cs +0 -1
  
@@ 49,7 49,6 @@ public class LogFilterTabViewModel : ViewModelBase, IDisposable
                 }
             }
         );
-
     }
 
     /// <summary>
 
M src/PacketLogger/ViewModels/LogTabViewModel.cs => src/PacketLogger/ViewModels/LogTabViewModel.cs +5 -0
  
@@ 227,6 227,11 @@ public class LogTabViewModel : ViewModelBase, IDisposable
     public void Dispose()
     {
         TogglePane.Dispose();
+        CopyPackets.Dispose();
+        Clear.Dispose();
         _cleanUp.Dispose();
+
+        SendFilter.Dispose();
+        RecvFilter.Dispose();
     }
 }=
\ No newline at end of file
 
M src/PacketLogger/ViewModels/PacketLogDocumentViewModel.cs => src/PacketLogger/ViewModels/PacketLogDocumentViewModel.cs +21 -2
  
@@ 31,7 31,7 @@ using ReactiveUI;
 namespace PacketLogger.ViewModels;
 
 /// <inheritdoc />
-public class PacketLogDocumentViewModel : Document, INotifyPropertyChanged
+public class PacketLogDocumentViewModel : Document, INotifyPropertyChanged, IDisposable
 {
     private readonly CommsInjector _injector;
     private readonly NostaleProcesses _processes;
@@ 68,7 68,7 @@ public class PacketLogDocumentViewModel : Document, INotifyPropertyChanged
             {
                 var mainWindow = (App.Current!.ApplicationLifetime as IClassicDesktopStyleApplicationLifetime)
                     ?.MainWindow;
-                var result = await new OpenFileDialog()
+                var result = await new OpenFileDialog
                 {
                     AllowMultiple = false,
                     InitialFileName = Assembly.GetEntryAssembly()?.GetModules().FirstOrDefault()?.FullyQualifiedName
@@ 184,4 184,23 @@ public class PacketLogDocumentViewModel : Document, INotifyPropertyChanged
     /// Gets the command for opening a process / connecting to a process.
     /// </summary>
     public ReactiveCommand<NostaleProcess, Unit> OpenProcess { get; }
+
+    /// <inheritdoc />
+    public override bool OnClose()
+    {
+        LogViewModel?.Provider.Close().GetAwaiter().GetResult();
+        Dispose();
+        return base.OnClose();
+    }
+
+    /// <inheritdoc />
+    public void Dispose()
+    {
+        _ctSource.Cancel();
+        _ctSource.Dispose();
+        LogViewModel?.Dispose();
+        OpenDummy.Dispose();
+        OpenFile.Dispose();
+        OpenProcess.Dispose();
+    }
 }=
\ No newline at end of file