diff --git a/OpenSky.Agent.sln.DotSettings b/OpenSky.Agent.sln.DotSettings
index 01f4390..ad724fa 100644
--- a/OpenSky.Agent.sln.DotSettings
+++ b/OpenSky.Agent.sln.DotSettings
@@ -585,6 +585,7 @@ OpenSky project ${CurrentDate.Year}
True
True
True
+ True
True
True
True
diff --git a/OpenSky.Agent/OpenSky.Agent.csproj b/OpenSky.Agent/OpenSky.Agent.csproj
index 694e6f1..01f12ce 100644
--- a/OpenSky.Agent/OpenSky.Agent.csproj
+++ b/OpenSky.Agent/OpenSky.Agent.csproj
@@ -167,6 +167,9 @@
+
+ AddAircraft.xaml
+
FlightTracking.xaml
@@ -176,6 +179,7 @@
LoginNotification.xaml
+
@@ -237,6 +241,10 @@
Designer
MSBuild:Compile
+
+ Designer
+ MSBuild:Compile
+
Designer
MSBuild:Compile
diff --git a/OpenSky.Agent/Views/AddAircraft.xaml b/OpenSky.Agent/Views/AddAircraft.xaml
new file mode 100644
index 0000000..7036f12
--- /dev/null
+++ b/OpenSky.Agent/Views/AddAircraft.xaml
@@ -0,0 +1,69 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Aircraft identification
+
+
+
+
+
+
+
+ Aircraft currently loaded in the sim identified as:
+
+
+
+
+
+
+
+ Add new aircraft
+
+
+
+
+
+
+
+
+
+ Name
+
+ Comments
+
+
+
+
+
+
+
+
+
diff --git a/OpenSky.Agent/Views/AddAircraft.xaml.cs b/OpenSky.Agent/Views/AddAircraft.xaml.cs
new file mode 100644
index 0000000..11fad5a
--- /dev/null
+++ b/OpenSky.Agent/Views/AddAircraft.xaml.cs
@@ -0,0 +1,110 @@
+// --------------------------------------------------------------------------------------------------------------------
+//
+// OpenSky project 2021-2023
+//
+// --------------------------------------------------------------------------------------------------------------------
+
+namespace OpenSky.Agent.Views
+{
+ using System.Windows;
+
+ using OpenSky.Agent.Views.Models;
+
+ /// -------------------------------------------------------------------------------------------------
+ ///
+ /// Simple add aircraft window for users.
+ ///
+ /// -------------------------------------------------------------------------------------------------
+ public partial class AddAircraft
+ {
+ /// -------------------------------------------------------------------------------------------------
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ ///
+ /// sushi.at, 12/12/2023.
+ ///
+ /// -------------------------------------------------------------------------------------------------
+ private AddAircraft()
+ {
+ this.InitializeComponent();
+ }
+
+ /// -------------------------------------------------------------------------------------------------
+ ///
+ /// The single instance of this view.
+ ///
+ /// -------------------------------------------------------------------------------------------------
+ private static AddAircraft Instance { get; set; }
+
+ /// -------------------------------------------------------------------------------------------------
+ ///
+ /// Open the add aircraft view or bring the existing instance into view.
+ ///
+ ///
+ /// sushi.at, 23/03/2021.
+ ///
+ /// -------------------------------------------------------------------------------------------------
+ public static void Open()
+ {
+ if (Instance == null)
+ {
+ if (!UserSessionService.Instance.IsUserLoggedIn)
+ {
+ LoginNotification.Open();
+ return;
+ }
+
+ Instance = new AddAircraft();
+ Instance.Closed += (_, _) => Instance = null;
+ Instance.Show();
+ }
+ else
+ {
+ Instance.BringIntoView();
+ Instance.Activate();
+ }
+ }
+
+ /// -------------------------------------------------------------------------------------------------
+ ///
+ /// Add aircraft on loaded.
+ ///
+ ///
+ /// sushi.at, 12/12/2023.
+ ///
+ ///
+ /// Source of the event.
+ ///
+ ///
+ /// Routed event information.
+ ///
+ /// -------------------------------------------------------------------------------------------------
+ private void AddAircraftLoaded(object sender, RoutedEventArgs e)
+ {
+ if (this.DataContext is AddAircraftViewModel viewModel)
+ {
+ viewModel.ViewReference = this;
+ }
+ }
+
+ /// -------------------------------------------------------------------------------------------------
+ ///
+ /// View model fired close window event.
+ ///
+ ///
+ /// sushi.at, 13/12/2023.
+ ///
+ ///
+ /// Source of the event.
+ ///
+ ///
+ /// An object to process.
+ ///
+ /// -------------------------------------------------------------------------------------------------
+ private void ViewModelCloseWindow(object sender, object e)
+ {
+ this.Close();
+ }
+ }
+}
\ No newline at end of file
diff --git a/OpenSky.Agent/Views/AircraftTypes.xaml.cs b/OpenSky.Agent/Views/AircraftTypes.xaml.cs
index 2cfc6c8..240fd9f 100644
--- a/OpenSky.Agent/Views/AircraftTypes.xaml.cs
+++ b/OpenSky.Agent/Views/AircraftTypes.xaml.cs
@@ -14,7 +14,7 @@ namespace OpenSky.Agent.Views
/// -------------------------------------------------------------------------------------------------
///
- /// Plane identity collector window.
+ /// Aircraft types management window.
///
/// -------------------------------------------------------------------------------------------------
public partial class AircraftTypes
@@ -41,7 +41,7 @@ private AircraftTypes()
/// -------------------------------------------------------------------------------------------------
///
- /// Open the plane identity collector view or bring the existing instance into view.
+ /// Open the aircraft type management view or bring the existing instance into view.
///
///
/// sushi.at, 23/03/2021.
diff --git a/OpenSky.Agent/Views/Models/AddAircraftViewModel.cs b/OpenSky.Agent/Views/Models/AddAircraftViewModel.cs
new file mode 100644
index 0000000..2afae86
--- /dev/null
+++ b/OpenSky.Agent/Views/Models/AddAircraftViewModel.cs
@@ -0,0 +1,480 @@
+// --------------------------------------------------------------------------------------------------------------------
+//
+// OpenSky project 2021-2023
+//
+// --------------------------------------------------------------------------------------------------------------------
+
+namespace OpenSky.Agent.Views.Models
+{
+ using System;
+ using System.Collections.ObjectModel;
+ using System.Diagnostics;
+ using System.Linq;
+ using System.Threading;
+ using System.Windows;
+
+ using OpenSky.Agent.Controls;
+ using OpenSky.Agent.Controls.Models;
+ using OpenSky.Agent.MVVM;
+ using OpenSky.Agent.Simulator.Tools;
+ using OpenSky.Agent.Tools;
+
+ using OpenSkyApi;
+
+ /// -------------------------------------------------------------------------------------------------
+ ///
+ /// Add aircraft view model.
+ ///
+ ///
+ /// sushi.at, 12/12/2023.
+ ///
+ ///
+ /// -------------------------------------------------------------------------------------------------
+ public class AddAircraftViewModel : ViewModel
+ {
+ /// -------------------------------------------------------------------------------------------------
+ ///
+ /// The optional comments (what mod was loaded, etc.).
+ ///
+ /// -------------------------------------------------------------------------------------------------
+ private string comments = string.Empty;
+
+ /// -------------------------------------------------------------------------------------------------
+ ///
+ /// Information describing the identified aircraft.
+ ///
+ /// -------------------------------------------------------------------------------------------------
+ private string identifiedAircraftInfo = "Unknown";
+
+ /// -------------------------------------------------------------------------------------------------
+ ///
+ /// The loading text.
+ ///
+ /// -------------------------------------------------------------------------------------------------
+ private string loadingText;
+
+ /// -------------------------------------------------------------------------------------------------
+ ///
+ /// The name of the aircraft type.
+ ///
+ /// -------------------------------------------------------------------------------------------------
+ private string name = string.Empty;
+
+ /// -------------------------------------------------------------------------------------------------
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ ///
+ /// sushi.at, 12/12/2023.
+ ///
+ /// -------------------------------------------------------------------------------------------------
+ public AddAircraftViewModel()
+ {
+ // Initialize data structures
+ this.ExistingAircraftTypes = new ObservableCollection();
+
+ // Initialize commands
+ this.RefreshAircraftTypesCommand = new AsynchronousCommand(this.RefreshAircraftTypes);
+ this.IdentifyAircraftCommand = new Command(this.IdentifyAircraft);
+ this.AddAircraftTypeCommand = new AsynchronousCommand(this.AddAircraftType);
+ this.CancelCommand = new Command(this.CancelAddAircraft);
+
+ // Execute initial commands
+ this.RefreshAircraftTypesCommand.DoExecute(null);
+ }
+
+ /// -------------------------------------------------------------------------------------------------
+ ///
+ /// Occurs when the view model wants to close the window.
+ ///
+ /// -------------------------------------------------------------------------------------------------
+ public event EventHandler