diff --git a/.gitignore b/.gitignore
index 288436f5c22977bf0acbde4e6d3455f50a0ca91c..576be0e20f94edc09b5af63ff68813123d59ac64 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,5 +2,5 @@
 .settings/
 .project
 .classpath
-
+tournament.*
 .DS_Store
diff --git a/pom.xml b/pom.xml
index 2b9412c35866a10aa29d27c6cbf60fa2171344f9..7f79730283a47928c7581945c9af6a85ba1ac5a1 100644
--- a/pom.xml
+++ b/pom.xml
@@ -33,5 +33,41 @@
 			<version>5.5.2</version>
 			<scope>test</scope>
 		</dependency>
+		<dependency>
+			<groupId>jakarta.xml.bind</groupId>
+			<artifactId>jakarta.xml.bind-api</artifactId>
+			<version>4.0.1</version>
+		</dependency>
+
+		<dependency>
+			<groupId>com.sun.xml.bind</groupId>
+			<artifactId>jaxb-impl</artifactId>
+			<version>4.0.4</version>
+		</dependency>
+
+		<dependency>
+
+			<groupId>org.eclipse.persistence</groupId>
+			<artifactId>org.eclipse.persistence.moxy</artifactId>
+			<version>4.0.2</version>
+		</dependency>
+
+		<dependency>
+			<groupId>com.sun.xml.bind</groupId>
+			<artifactId>jaxb-xjc</artifactId>
+			<version>4.0.4</version>
+		</dependency>
+
+		<dependency>
+			<groupId>jakarta.json</groupId>
+			<artifactId>jakarta.json-api</artifactId>
+			<version>2.1.3</version>
+		</dependency>
+
+		<dependency>
+			<groupId>org.eclipse.parsson</groupId>
+			<artifactId>parsson</artifactId>
+			<version>1.1.5</version>
+		</dependency>
 	</dependencies>
 </project>
diff --git a/src/main/java/cz/jezek/lab11/Match.java b/src/main/java/cz/jezek/lab11/Match.java
index 00f2851654a1d6d954cc57bb12c10c81111d72bd..a4ac3a3838d5cf7bd682d1221e31b6a65ba2cfa4 100644
--- a/src/main/java/cz/jezek/lab11/Match.java
+++ b/src/main/java/cz/jezek/lab11/Match.java
@@ -2,12 +2,24 @@ package cz.jezek.lab11;
 
 import java.util.Objects;
 
+import jakarta.xml.bind.annotation.XmlAttribute;
+import jakarta.xml.bind.annotation.XmlElement;
+
 public class Match {
 
+	@XmlElement
 	private Oponents oponents;
+	
+	@XmlAttribute
 	private int player1Scorel;
+	
+	@XmlAttribute
 	private int player2Scorel;
 
+	@SuppressWarnings("unused")
+	private Match() {
+	}
+	
 	public Match(Player player1, int player1Scorel, Player player2, int player2Scorel) {
 		this.oponents = new Oponents(player1, player2);
 		this.player1Scorel = player1Scorel;
diff --git a/src/main/java/cz/jezek/lab11/Oponents.java b/src/main/java/cz/jezek/lab11/Oponents.java
index 1de0f68f0823e939f4bde09bcc3b2f4ee84697cc..1cb4432c8fb70f60c38069c319bf7e766bf37670 100644
--- a/src/main/java/cz/jezek/lab11/Oponents.java
+++ b/src/main/java/cz/jezek/lab11/Oponents.java
@@ -2,11 +2,23 @@ package cz.jezek.lab11;
 
 import java.util.Objects;
 
+import jakarta.xml.bind.annotation.XmlAttribute;
+import jakarta.xml.bind.annotation.XmlIDREF;
+
 public class Oponents {
 
+	@XmlIDREF
+	@XmlAttribute
 	private Player player1;
+	
+	@XmlIDREF
+	@XmlAttribute
 	private Player player2;
 
+	@SuppressWarnings("unused")
+	private Oponents() {
+	}
+	
 	public Oponents(Player player1, Player player2) {
 		super();
 		this.player1 = player1;
diff --git a/src/main/java/cz/jezek/lab11/Player.java b/src/main/java/cz/jezek/lab11/Player.java
index 2a27b1b969e9d93d8144da9ab23f330eb8d3c13b..692e220cf28854fee269ef5a517484a7e919e2c7 100644
--- a/src/main/java/cz/jezek/lab11/Player.java
+++ b/src/main/java/cz/jezek/lab11/Player.java
@@ -1,5 +1,8 @@
 package cz.jezek.lab11;
 
+import jakarta.xml.bind.annotation.XmlAttribute;
+import jakarta.xml.bind.annotation.XmlID;
+
 public class Player {
 
 	private String firstName;
@@ -10,6 +13,10 @@ public class Player {
 				RandomGenerator.selectRandom(RandomGenerator.SURNAMES));
 	}
 
+	@SuppressWarnings("unused")
+	private Player() {
+	}
+	
 	public Player(String firstName, String lastName) {
 		super();
 		this.firstName = firstName;
@@ -31,6 +38,12 @@ public class Player {
 	public void setLastName(String lastName) {
 		this.lastName = lastName;
 	}
+	
+	@XmlID
+	@XmlAttribute
+	public String getId() {
+		return toString();
+	}
 
 	@Override
 	public int hashCode() {
diff --git a/src/main/java/cz/jezek/lab11/StreamMain.java b/src/main/java/cz/jezek/lab11/StreamMain.java
index ea4babca284042d2a29e402e622abee1e01f3158..836696f7d0f5d0d9277e9bb3a082412dc1713269 100644
--- a/src/main/java/cz/jezek/lab11/StreamMain.java
+++ b/src/main/java/cz/jezek/lab11/StreamMain.java
@@ -1,5 +1,14 @@
 package cz.jezek.lab11;
 
+import java.io.File;
+
+import org.eclipse.persistence.jaxb.MarshallerProperties;
+
+import jakarta.xml.bind.JAXBContext;
+import jakarta.xml.bind.JAXBException;
+import jakarta.xml.bind.Marshaller;
+import jakarta.xml.bind.Unmarshaller;
+
 public class StreamMain {
 
   public static void main(String[] args) {
@@ -8,7 +17,19 @@ public class StreamMain {
     printStatAboutTournament(tournament);
 
     saveTournament(tournament);
-    loadTournament();
+    Tournament tournament2 = loadTournament();
+    System.out.println();
+    System.out.println("First player from first match is between players: " 
+    					+ tournament2.getPlayers().stream()
+    					.anyMatch(p -> p == tournament2.getMatches().get(0).getOponents().getPlayer1()));
+    
+    saveTournamentJSON(tournament);
+    Tournament tournament3 = loadTournamentJSON();
+    System.out.println(tournament3);
+    System.out.println("First player from first match is between players: " 
+			+ tournament3.getPlayers().stream()
+			.anyMatch(p -> p == tournament3.getMatches().get(0).getOponents().getPlayer1()));
+
   }
 
   public static void printStatAboutTournament(Tournament tournament) {
@@ -34,11 +55,61 @@ public class StreamMain {
     //TODO 4.c Show match with the largest total number (sum of both players) scored goals between relevant players (help Streams)
   }
 
-  public static void loadTournament() {
+  public static Tournament loadTournament() {
     //TODO 5.b Load a serialized tournament from a file
+	  try {
+		JAXBContext jaxbContext = JAXBContext.newInstance(Tournament.class);
+		Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
+		return (Tournament) unmarshaller.unmarshal(new File("tournament.xml"));
+	} catch (JAXBException e) {
+		e.printStackTrace();
+		return null;
+	}
   }
 
   public static void saveTournament(Tournament tournament) {
-    //TODO 5.a Save the tournament to a file using object serialization.
+	  try {
+		JAXBContext jaxbContext = JAXBContext.newInstance(Tournament.class);
+		Marshaller marshaller = jaxbContext.createMarshaller();
+		marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
+		System.out.println();
+		System.out.println();
+		marshaller.marshal(tournament, System.out);
+		marshaller.marshal(tournament, new File("tournament.xml"));
+	} catch (JAXBException e) {
+		e.printStackTrace();
+	}
+  }
+  
+  public static void saveTournamentJSON(Tournament tournament) {
+	  try {
+		System.setProperty("jakarta.xml.bind.JAXBContextFactory", "org.eclipse.persistence.jaxb.JAXBContextFactory");
+		JAXBContext jaxbContext = JAXBContext.newInstance(Tournament.class);
+		Marshaller marshaller = jaxbContext.createMarshaller();
+		marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
+		marshaller.setProperty(MarshallerProperties.MEDIA_TYPE, "application/json");
+		marshaller.setProperty(MarshallerProperties.JSON_INCLUDE_ROOT, true);
+		System.out.println();
+		System.out.println();
+		marshaller.marshal(tournament, System.out);
+		marshaller.marshal(tournament, new File("tournament.json"));
+	} catch (JAXBException e) {
+		e.printStackTrace();
+	}
   }
+  
+  public static Tournament loadTournamentJSON() {
+	    //TODO 5.b Load a serialized tournament from a file
+		  try {
+			JAXBContext jaxbContext = JAXBContext.newInstance(Tournament.class);
+			Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
+			unmarshaller.setProperty(MarshallerProperties.MEDIA_TYPE, "application/json");
+			unmarshaller.setProperty(MarshallerProperties.JSON_INCLUDE_ROOT, true);
+			
+			return (Tournament) unmarshaller.unmarshal(new File("tournament.json"));
+		} catch (JAXBException e) {
+			e.printStackTrace();
+			return null;
+		}
+	  }
 }
diff --git a/src/main/java/cz/jezek/lab11/Tournament.java b/src/main/java/cz/jezek/lab11/Tournament.java
index 708a391ecb85c160d079a6befe62d505b609f2d8..462014cc687bf419924e3d3864e56e25e93fe75a 100644
--- a/src/main/java/cz/jezek/lab11/Tournament.java
+++ b/src/main/java/cz/jezek/lab11/Tournament.java
@@ -9,13 +9,27 @@ import java.io.Serializable;
 import java.util.List;
 import java.util.stream.Stream;
 
+import jakarta.xml.bind.annotation.XmlElement;
+import jakarta.xml.bind.annotation.XmlElementWrapper;
+import jakarta.xml.bind.annotation.XmlRootElement;
+
+@XmlRootElement
 public class Tournament implements Serializable{
 
   private static final long serialVersionUID = 1L;
   
+  @XmlElement(name = "player")
+  @XmlElementWrapper(name = "players")
   private List<Player> players;
+  
+  @XmlElement(name = "match")
+  @XmlElementWrapper(name = "matches")
   private List<Match> matches;
 
+  @SuppressWarnings("unused")
+  private Tournament() {
+  }
+  
   public static Tournament generate() {
 	// TO DO 1.a Generate a list of 10 random players using the stream and then filter so that it does not contain players with the same name
 	List<Player> players = Stream.generate(Player::generateRandom) 
@@ -26,7 +40,7 @@ public class Tournament implements Serializable{
     // TODO 1.b Use the stream to generate a list of 50 matches between random players (from the list of players) with a random result. Make sure the player does not play with himself.
     List<Match> matches = Stream.generate(() -> generateRandomMatch(players))
     							.filter(m -> m.getOponents().getPlayer1() !=  m.getOponents().getPlayer2())
-    							.limit(500)
+    							.limit(50)
     							.toList();
 
 
diff --git a/src/main/java/module-info.java b/src/main/java/module-info.java
index 35757404f5d12da2642d679d3eb1b4ce681e75da..446615d0de2caa20e09400477a0356ba511cf0cc 100644
--- a/src/main/java/module-info.java
+++ b/src/main/java/module-info.java
@@ -1,4 +1,8 @@
 module cz.jezek.lab10 {
-    opens cz.jezek.lab11 to javafx.fxml;
+	opens cz.jezek.lab11 to jakarta.xml.bind;
     exports cz.jezek.lab11;
+    requires jakarta.xml.bind; 
+    requires org.eclipse.persistence.moxy;
+    requires jakarta.json;
+    requires com.sun.tools.xjc;
 }
\ No newline at end of file