M src/PacketLogger/Models/Packets/DummyPacketProvider.cs => src/PacketLogger/Models/Packets/DummyPacketProvider.cs +3 -0
  
@@ 58,6 58,9 @@ public class DummyPacketProvider : IPacketProvider, IDisposable
     }
 
     /// <inheritdoc />
+    public bool Closed => false;
+
+    /// <inheritdoc />
     public string Name { get; }
 
     /// <inheritdoc />
 
M src/PacketLogger/Models/Packets/FilePacketProvider.cs => src/PacketLogger/Models/Packets/FilePacketProvider.cs +3 -0
  
@@ 45,6 45,9 @@ public class FilePacketProvider : IPacketProvider
     public string DocumentTitle { get; set; } = string.Empty;
 
     /// <inheritdoc />
+    public bool Closed => false;
+
+    /// <inheritdoc />
     public string Name => Path.GetFileName(_fileName);
 
     /// <inheritdoc />
 
M src/PacketLogger/Models/Packets/IPacketProvider.cs => src/PacketLogger/Models/Packets/IPacketProvider.cs +5 -0
  
@@ 23,6 23,11 @@ namespace PacketLogger.Models.Packets;
 public interface IPacketProvider : INotifyPropertyChanged, IDisposable
 {
     /// <summary>
+    /// Gets whether the connection is closed.
+    /// </summary>
+    public bool Closed { get; }
+
+    /// <summary>
     /// Gets the name.
     /// </summary>
     public string Name { get; }
 
M src/PacketLogger/Models/Titles/NumberedTitleGenerator.cs => src/PacketLogger/Models/Titles/NumberedTitleGenerator.cs +29 -29
  
@@ 18,7 18,7 @@ namespace PacketLogger.Models.Titles;
 /// </summary>
 public class NumberedTitleGenerator
 {
-    private readonly SemaphoreSlim _semaphore;
+    private readonly object _lock = new object();
     private readonly ConcurrentDictionary<string, List<Title>> _titles;
 
     /// <summary>
@@ 26,7 26,6 @@ public class NumberedTitleGenerator
     /// </summary>
     public NumberedTitleGenerator()
     {
-        _semaphore = new SemaphoreSlim(1, 1);
         _titles = new ConcurrentDictionary<string, List<Title>>();
     }
 
@@ 76,33 75,34 @@ public class NumberedTitleGenerator
 
     private void HandleTitleChange(Title title, string newTitle)
     {
-        _semaphore.Wait();
-        _titles.AddOrUpdate
-        (
-            title.CurrentTitle,
-            _ => new List<Title>(),
-            (_, u) =>
-            {
-                u.Remove(title);
-                return u;
-            }
-        );
-        UpdateNumbers(title.CurrentTitle);
-
-        title.CurrentTitle = newTitle;
-        _titles.TryAdd(newTitle, new List<Title>());
-        _titles.AddOrUpdate
-        (
-            newTitle,
-            _ => new List<Title>(),
-            (_, u) =>
-            {
-                u.Add(title);
-                return u;
-            }
-        );
-        UpdateNumbers(title.CurrentTitle);
-        _semaphore.Release();
+        lock (_lock)
+        {
+            _titles.AddOrUpdate
+            (
+                title.CurrentTitle,
+                _ => new List<Title>(),
+                (_, u) =>
+                {
+                    u.Remove(title);
+                    return u;
+                }
+            );
+            UpdateNumbers(title.CurrentTitle);
+
+            title.CurrentTitle = newTitle;
+            _titles.TryAdd(newTitle, new List<Title>());
+            _titles.AddOrUpdate
+            (
+                newTitle,
+                _ => new List<Title>(),
+                (_, u) =>
+                {
+                    u.Add(title);
+                    return u;
+                }
+            );
+            UpdateNumbers(title.CurrentTitle);
+        }
     }
 
     private void UpdateNumbers(string title)
 
M src/PacketLogger/ViewModels/DocumentViewModel.cs => src/PacketLogger/ViewModels/DocumentViewModel.cs +5 -2
  
@@ 313,14 313,17 @@ public class DocumentViewModel : Document, INotifyPropertyChanged, IDisposable
             {
                 Loading = true;
                 NestedViewModel = new PacketSenderViewModel(provider);
+                _cleanUp?.Dispose();
+                _cleanUp = null;
+
                 _titleHandle?.Dispose();
                 _titleHandle = titleGenerator.AddTitle
                 (
                     title => Title = title,
                     provider
-                        .WhenAnyValue(x => x.DocumentTitle)
+                        .WhenValueChanged(x => x.DocumentTitle)
                         .ObserveOn(RxApp.MainThreadScheduler)
-                        .Select(x => $"Sender - {provider.DocumentTitle}"),
+                        .Select(x => "Sender - " + x),
                     provider.Name
                 );
                 Loaded = true;