diff --git a/.vs/TournamentManager/DesignTimeBuild/.dtbcache.v2 b/.vs/TournamentManager/DesignTimeBuild/.dtbcache.v2
index e8e73d6227136f7bddc4bc618f9e9c0060654904..14abc66a026db82af534a2a836c1efea4dfa1f23 100644
Binary files a/.vs/TournamentManager/DesignTimeBuild/.dtbcache.v2 and b/.vs/TournamentManager/DesignTimeBuild/.dtbcache.v2 differ
diff --git a/.vs/TournamentManager/v16/.suo b/.vs/TournamentManager/v16/.suo
index 879509338c32a17b7c9cd17b59ff62d149c10d69..fa0a33aac9d84d09ff11f04e77f6c36a0cb279c7 100644
Binary files a/.vs/TournamentManager/v16/.suo and b/.vs/TournamentManager/v16/.suo differ
diff --git a/obj/Debug/net5.0-windows/TournamentManager.csprojAssemblyReference.cache b/obj/Debug/net5.0-windows/TournamentManager.csprojAssemblyReference.cache
index 00161d28bfa36275773cb5aeeabaddba6590f309..f94750e91f627e3ae7e8de71ee1c7ef20d9246b5 100644
Binary files a/obj/Debug/net5.0-windows/TournamentManager.csprojAssemblyReference.cache and b/obj/Debug/net5.0-windows/TournamentManager.csprojAssemblyReference.cache differ
diff --git a/src/AddEntrantControl.cs b/src/AddEntrantControl.cs
index 06abf17908a4401d34f1fac72f9cc87840dc0918..ec259b7ed07617f7ff20d5d6bd0cb8b9e448de23 100644
--- a/src/AddEntrantControl.cs
+++ b/src/AddEntrantControl.cs
@@ -17,7 +17,13 @@ namespace TournamentManager
 
         public Participant NewParticipant { get; private set; }
 
-        public event EventHandler SubmitParticipantClicked;
+        public delegate void ParticipantAddedDelegate(object sender, ParticipantAddedEventArgs e);
+        
+        public event ParticipantAddedDelegate SubmitParticipantClicked;
+
+        protected void OnSubmitParticipantClicked(ParticipantAddedEventArgs e) =>
+            SubmitParticipantClicked?.Invoke(this, e);
+        
         public AddEntrantControl()
         {
             InitializeComponent();
@@ -51,7 +57,7 @@ namespace TournamentManager
                 Rating = int.TryParse(tbRating.Text, out int rating) ? rating : 0
             };
             
-            SubmitParticipantClicked?.Invoke(this, e);
+            OnSubmitParticipantClicked(new ParticipantAddedEventArgs(NewParticipant));
         }
 
         private void btnReset_Click(object sender, EventArgs e)
diff --git a/src/GroupControl.cs b/src/GroupControl.cs
index fd578223fcd450a766b410eb1f2afad92bd2f1f7..898b63cd0e9eda79a59120c7e90755735cda9cae 100644
--- a/src/GroupControl.cs
+++ b/src/GroupControl.cs
@@ -84,7 +84,7 @@ namespace TournamentManager.src
                 cbSecondOpponent.SelectedItem.ToString(), (firstScore, secondScore), index - 1));
         }
         
-        protected void OnOpponentsSelected()
+        private void OnOpponentsSelected()
         {
             ClearTextBoxes();
             if (cbFirstOpponent.SelectedItem == null || cbSecondOpponent.SelectedItem == null)
diff --git a/src/ManageTournamentForm.cs b/src/ManageTournamentForm.cs
index fbc7fc91d295a709904f8bcc2d3dd73b1d40af00..90ffc8353d148ac3c03b9273e098d2d341f07cc9 100644
--- a/src/ManageTournamentForm.cs
+++ b/src/ManageTournamentForm.cs
@@ -2,7 +2,9 @@
 using System.Collections.Generic;
 using System.Collections.ObjectModel;
 using System.Collections.Specialized;
+using System.IO;
 using System.Linq;
+using System.Text.Json;
 using System.Threading.Tasks;
 using System.Windows.Forms;
 
@@ -13,16 +15,36 @@ namespace TournamentManager
         private const string RemoveParticipantError = "Participant with this name is already signed in competition";
         private const string EditParticipantError = "Participant with this name is already signed in competition";
         private const string ErrorCaption = "Error";
-        private readonly ObservableCollection<Participant> _participants = new();
-        private List<Group> _groups;
-        private PlayOffTree _playOff;
+        private TournamentData _data;
+        private readonly string _path;
+
+        // private readonly ObservableCollection<Participant> _data.Participants = new();
+        // private List<Group> _data.Groups;
+        // private PlayOffTree _data.PlayOff;
         
         public ManageTournamentForm(string path)
         {
             InitializeComponent();
+            _path = path;
             
+            AsignEventHandlers();
+            AsignSaves();
+
+            foreach (var p in _data.Participants)
+            {
+                manageParticipantsControl.CbAddParticipant($"{p.FirstName} {p.Surname}");
+            }
+        }
+
+        private void AsignSaves()
+        {
+            enterantCntrl.SubmitParticipantClicked += OnSubmitParticipantClicked;
+
+        }
+
+        private void AsignEventHandlers()
+        {
             enterantCntrl.SubmitParticipantClicked += OnSubmitParticipantClicked;
-            _participants.CollectionChanged += HandleParticipantsChanged;
             manageParticipantsControl.ParticipantsModified += HandleOnParticipantRemovedClicked;
             computeControl.ComputeGroups += HandleOnComputeGroupsClicked;
             computeControl.ComputePlayOff += HandleOnComputePlayOffClicked;
@@ -32,37 +54,34 @@ namespace TournamentManager
             playOffControl.RoundSelected += HandleOnRoundSelected;
             playOffControl.MatchSelected += HandleOnMatchSelected;
             playOffControl.SubmitPlayOffMatchClicked += HandleOnSubmitPlayOffMatchClicked;
-            
-            foreach (var p in _participants)
+        }
+
+        private async Task Save()
+        {
+            var options = new JsonSerializerOptions
             {
-                manageParticipantsControl.CbAddParticipant($"{p.FirstName} {p.Surname}");
-            }
+                WriteIndented = true,
+            };
+            using var stream = File.Create(_path);
+            await JsonSerializer.SerializeAsync(stream, _data, options);
+            await stream.DisposeAsync();
+            
         }
         
         #region eventHandlers
         
-        private void OnSubmitParticipantClicked(object sender, EventArgs e)
+        private void OnSubmitParticipantClicked(object sender, ParticipantAddedEventArgs e)
         {
-            if (_participants.Any(x =>
+            if (_data.Participants.Any(x =>
                 x.FirstName.Equals(enterantCntrl.NewParticipant.FirstName) &&
                 x.Surname.Equals(enterantCntrl.NewParticipant.Surname))) 
             {
                 MessageBox.Show(RemoveParticipantError, ErrorCaption, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                 return;
             }
-            _participants.Add(enterantCntrl.NewParticipant);
+            _data.Participants.Add(enterantCntrl.NewParticipant);
             enterantCntrl.ResetControl();
-        }
-
-        private void HandleParticipantsChanged(object sender, NotifyCollectionChangedEventArgs e)
-        {
-            if (e.Action == NotifyCollectionChangedAction.Add)
-            {
-                foreach (Participant p in e.NewItems ?? new List<Participant>())
-                {
-                    manageParticipantsControl.CbAddParticipant($"{p.FirstName} {p.Surname}");
-                }
-            }
+            manageParticipantsControl.CbAddParticipant($"{e.Participant.FirstName} {e.Participant.Surname}");
         }
 
         private void HandleOnParticipantRemovedClicked(object sender, ParticipantsModifiedEventArgs e)
@@ -72,7 +91,7 @@ namespace TournamentManager
 
             var name = e.ParticipantName.Split();
 
-            _participants.Remove(_participants.FirstOrDefault(x => 
+            _data.Participants.Remove(_data.Participants.FirstOrDefault(x => 
                 x.FirstName.Equals(name[0]) && x.Surname.Equals(name[1])));
         }
         
@@ -89,15 +108,15 @@ namespace TournamentManager
         private void HandleOnComputeGroupsClicked(object sender, ComputeEventArgs e)
         {
             groupControl.ClearInputData();
-            var numberOfGroups = (_participants.Count - 1) / e.Amount + 1;
+            var numberOfGroups = (_data.Participants.Count - 1) / e.Amount + 1;
             var groupIndex = 0;
-            var orderedParticipants = _participants.OrderBy(x => x.Rating);
+            var orderedParticipants = _data.Participants.OrderBy(x => x.Rating);
 
             groupControl.AddGroups(numberOfGroups);
-            _groups = new List<Group>();
+            _data.Groups = new List<Group>();
             for (int i = 0; i < numberOfGroups; i++)
             {
-                _groups.Add(new Group());
+                _data.Groups.Add(new Group());
             }
             
             foreach (var participant in orderedParticipants)
@@ -107,10 +126,10 @@ namespace TournamentManager
                 {
                     groupIndex = 0;
                 }
-                _groups[groupIndex].Members.Add(participant);
+                _data.Groups[groupIndex].Members.Add(participant);
             }
 
-            foreach (var group in _groups)
+            foreach (var group in _data.Groups)
             {
                 var memberCount = group.Members.Count;
                 group.Matches = new int[memberCount, memberCount];
@@ -122,10 +141,10 @@ namespace TournamentManager
             playOffControl.ResetInput();
             try
             {
-                var toKeep = (int)Math.Round(((double)_participants.Count / (double)100) * (double)(100 - e.Amount), 0);
+                var toKeep = (int)Math.Round(((double)_data.Participants.Count / (double)100) * (double)(100 - e.Amount), 0);
                 var sortedParticipants = (await ComputeAllGroupOrders()).Take(toKeep).ToList();
-                _playOff = new PlayOffTree(sortedParticipants);
-                playOffControl.SetRounds(_playOff.Depth);
+                _data.PlayOff = new PlayOffTree(sortedParticipants);
+                playOffControl.SetRounds(_data.PlayOff.Depth);
             }
             catch (Exception ex)
             {
@@ -144,7 +163,7 @@ namespace TournamentManager
                 return;
             }
 
-            var groupMembers = _groups[result - 1].Members
+            var groupMembers = _data.Groups[result - 1].Members
                 .Select(x => $"{x.FirstName} {x.Surname}").ToArray();
             groupControl.AddToFirstOpponentList(groupMembers);
             groupControl.AddToSecondOpponentList(groupMembers);
@@ -158,7 +177,7 @@ namespace TournamentManager
                 return;
             }
 
-            var group = _groups[e.Index];
+            var group = _data.Groups[e.Index];
             var firstOpponent = group.ExtractGroupMember(e.FirstOpponent);
             var secondOpponent = group.ExtractGroupMember(e.SecondOpponent);
             
@@ -172,7 +191,7 @@ namespace TournamentManager
                 //TODO:ERROR MESSAGE
                 return;
             }
-            var group = _groups[e.Index];
+            var group = _data.Groups[e.Index];
             Func<string[], Participant> matchOpponent = x => group.Members
                 .FirstOrDefault(p => p.FirstName.Equals(x[0]) && p.Surname.Equals(x[1]));
             
@@ -189,7 +208,7 @@ namespace TournamentManager
             {
                 throw new Exception();
             }
-            var matches = _playOff.GetRoundMatches(round);
+            var matches = _data.PlayOff.GetRoundMatches(round);
             playOffControl.SetMatches(matches);
         }
         
@@ -200,14 +219,14 @@ namespace TournamentManager
                 throw new Exception();
             }
 
-            var match = _playOff.GetMatch(round, e.SelectedMatch);
+            var match = _data.PlayOff.GetMatch(round, e.SelectedMatch);
 
             playOffControl.SetMatch(match);
         }
         
         private void HandleOnSubmitPlayOffMatchClicked(object sender, MatchSubmittedEventArgs e)
         {
-            var matchNode = _playOff.GetMatchNode(e.FirstOpponent, e.SecondOpponent, e.Index);
+            var matchNode = _data.PlayOff.GetMatchNode(e.FirstOpponent, e.SecondOpponent, e.Index);
             matchNode.TreeMatch.Scores = e.Score;
 
             if (matchNode.IsRoot())
@@ -235,7 +254,7 @@ namespace TournamentManager
         {
             return Task.Factory.StartNew(() =>
             {
-                return _groups.AsParallel().SelectMany(x => ComputeGroupOrder(x))
+                return _data.Groups.AsParallel().SelectMany(x => ComputeGroupOrder(x))
                     .OrderByDescending(x => x.Item2)
                     .ThenByDescending(x => x.Item3)
                     .Select(x => x.Item1)
diff --git a/src/ParticipantAddedEventArgs.cs b/src/ParticipantAddedEventArgs.cs
new file mode 100644
index 0000000000000000000000000000000000000000..eb4b32b582f3e8ca5a83eac0bfb713fb9f08cf73
--- /dev/null
+++ b/src/ParticipantAddedEventArgs.cs
@@ -0,0 +1,14 @@
+using System;
+
+namespace TournamentManager
+{
+    public class ParticipantAddedEventArgs : EventArgs
+    {
+        public Participant Participant { get; }
+
+        public ParticipantAddedEventArgs(Participant participant)
+        {
+            Participant = participant;
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/TournamentData.cs b/src/TournamentData.cs
new file mode 100644
index 0000000000000000000000000000000000000000..361bd355b18dd646f15e6970e4d90c9b7a19fabd
--- /dev/null
+++ b/src/TournamentData.cs
@@ -0,0 +1,12 @@
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+
+namespace TournamentManager
+{
+    public class TournamentData
+    {
+        public readonly ObservableCollection<Participant> Participants = new();
+        public List<Group> Groups { get; set; }
+        public PlayOffTree PlayOff { get; set; }
+    }
+}
\ No newline at end of file