diff --git a/src/main/java/cz/jezek/lab11/Match.java b/src/main/java/cz/jezek/lab11/Match.java
index 00f2851654a1d6d954cc57bb12c10c81111d72bd..e942489365816a6f2d5fabb86e6ffa3b0d13fe81 100644
--- a/src/main/java/cz/jezek/lab11/Match.java
+++ b/src/main/java/cz/jezek/lab11/Match.java
@@ -1,9 +1,12 @@
 package cz.jezek.lab11;
 
+import java.io.Serializable;
 import java.util.Objects;
 
-public class Match {
+public class Match implements Serializable{
 
+	private static final long serialVersionUID = 1L;
+	
 	private Oponents oponents;
 	private int player1Scorel;
 	private int player2Scorel;
diff --git a/src/main/java/cz/jezek/lab11/Oponents.java b/src/main/java/cz/jezek/lab11/Oponents.java
index 1de0f68f0823e939f4bde09bcc3b2f4ee84697cc..5758cd44a6588c7b4618d13366d9028b32f05d5f 100644
--- a/src/main/java/cz/jezek/lab11/Oponents.java
+++ b/src/main/java/cz/jezek/lab11/Oponents.java
@@ -1,9 +1,11 @@
 package cz.jezek.lab11;
 
+import java.io.Serializable;
 import java.util.Objects;
 
-public class Oponents {
+public class Oponents implements Serializable{
 
+	private static final long serialVersionUID = 1L;
 	private Player player1;
 	private Player player2;
 
diff --git a/src/main/java/cz/jezek/lab11/Player.java b/src/main/java/cz/jezek/lab11/Player.java
index 2a27b1b969e9d93d8144da9ab23f330eb8d3c13b..c5a3464ab2ec25271f129868c7244ac70730179b 100644
--- a/src/main/java/cz/jezek/lab11/Player.java
+++ b/src/main/java/cz/jezek/lab11/Player.java
@@ -1,8 +1,13 @@
 package cz.jezek.lab11;
 
-public class Player {
+import java.io.Serializable;
 
+public class Player implements Serializable{
+
+	private static final long serialVersionUID = 1L;
+	
 	private String firstName;
+	
 	private String lastName;
 
 	public static Player generateRandom() {
diff --git a/src/main/java/cz/jezek/lab11/StreamMain.java b/src/main/java/cz/jezek/lab11/StreamMain.java
index ea4babca284042d2a29e402e622abee1e01f3158..7a59eaf5c4aad572dc45c704553628292788869a 100644
--- a/src/main/java/cz/jezek/lab11/StreamMain.java
+++ b/src/main/java/cz/jezek/lab11/StreamMain.java
@@ -1,14 +1,23 @@
 package cz.jezek.lab11;
 
+import static java.lang.System.out;
+import static java.util.stream.Collectors.joining;
+
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+
 public class StreamMain {
 
   public static void main(String[] args) {
-    Tournament tournament = Tournament.generate();
+    Tournament tournament = loadTournament();
 
     printStatAboutTournament(tournament);
 
     saveTournament(tournament);
-    loadTournament();
+    
   }
 
   public static void printStatAboutTournament(Tournament tournament) {
@@ -18,27 +27,62 @@ public class StreamMain {
     System.out.println(player);
     System.out.print("Number of matches: ");
     //TODO 3.a Show the number of matches played by a given player (using Streams)
+    //filter
+    out.println( 
+    		tournament.getMatches()
+    		 		  .stream()
+    		 		  .filter(m -> m.getOponents().contains(player))
+    		 		  .count());
     
     System.out.print("Goals scored: ");
     //TODO 3.b Show the number of goals scored by a given player (help Streams)
+    //IntStream <- mapToInt()
+    //sum
+    System.out.print(tournament.getMatches()
+								  .stream()
+								  .filter(m -> m.getOponents().contains(player))
+								  .mapToInt( m-> m.getScoreForPlayer(player))
+								  .sum());
+    
 
     Oponents oponents = new Oponents(tournament.getRandomPlayer(),
         tournament.getRandomPlayer());
     System.out.println("Mutual statistics of oponents:" + oponents);
     
     System.out.print("Matches: ");
+    System.out.println(tournament.getMatches()
+			.stream()
+			.filter(m -> m.getOponents().equals(oponents))
+			.map(Object::toString)
+			.collect(joining("\n")));
     //TODO 4.a List the matches played between the given players (using the stream)
     System.out.print("Number of mathes: ");
     //TODO 4.b Print the number of matches played between the given players (using the stream)
     System.out.print("Match with the largest total number:");
+    System.out.println(tournament.getMatches()
+    							.stream()
+    							.filter(m -> m.getOponents().equals(oponents))
+    							.mapToInt(m -> m.getPlayer1Scorel() + m.getPlayer2Scorel())
+    							.max()
+    							.orElse(0));
     //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() {
-    //TODO 5.b Load a serialized tournament from a file
+  public static Tournament loadTournament() {
+    try(ObjectInputStream oos = new ObjectInputStream(new FileInputStream("tournament.obj"))) {
+    	return (Tournament) oos.readObject();
+	} catch (IOException | ClassNotFoundException e) {
+		e.printStackTrace();
+		return null;
+	}
   }
 
   public static void saveTournament(Tournament tournament) {
     //TODO 5.a Save the tournament to a file using object serialization.
+	  try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("tournament.obj"))) {
+		  oos.writeObject(tournament);
+	} catch (IOException e) {
+		e.printStackTrace();
+	}
   }
 }
diff --git a/src/main/java/cz/jezek/lab11/Tournament.java b/src/main/java/cz/jezek/lab11/Tournament.java
index 8442be38135239116933fae58bab7e982522eac9..708a391ecb85c160d079a6befe62d505b609f2d8 100644
--- a/src/main/java/cz/jezek/lab11/Tournament.java
+++ b/src/main/java/cz/jezek/lab11/Tournament.java
@@ -1,23 +1,41 @@
 package cz.jezek.lab11;
 
-import java.util.Collections;
+import static cz.jezek.lab11.RandomGenerator.random;
+import static cz.jezek.lab11.RandomGenerator.selectRandom;
+import static java.util.stream.Collectors.joining;
+import static java.util.stream.Collectors.toList;
+
+import java.io.Serializable;
 import java.util.List;
+import java.util.stream.Stream;
 
-public class Tournament {
+public class Tournament implements Serializable{
 
+  private static final long serialVersionUID = 1L;
+  
   private List<Player> players;
   private List<Match> matches;
 
   public static Tournament generate() {
-	// TODO 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 = Collections.emptyList();
+	// 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) 
+								 .distinct()
+								 .limit(10)
+								 .collect(toList());
 
     // 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 = Collections.emptyList();
+    List<Match> matches = Stream.generate(() -> generateRandomMatch(players))
+    							.filter(m -> m.getOponents().getPlayer1() !=  m.getOponents().getPlayer2())
+    							.limit(500)
+    							.toList();
 
 
     return new Tournament(players, matches);
   }
+  
+  private static Match generateRandomMatch(List<Player> players) {
+	  return new Match(selectRandom(players), random.nextInt(11), selectRandom(players), random.nextInt(11));
+  }
 
   public Tournament(List<Player> players, List<Match> matches) {
     this.players = players;
@@ -45,11 +63,15 @@ public class Tournament {
 
     builder.append("\n\nPlayers:\n");
     // TODO 2.a Use the stream to add a listing of all players to the builder. Individual players are separated by a "\ n" character
-    builder.append(/* list of all players */"");
+    builder.append(players.stream()
+    					  .map(Object::toString)
+    					  .collect(joining("\n")));
 
     builder.append("\n\nMatches:\n");
     // TODO 2.b Use the stream to add a listing of all entries to the builder. Individual matches are separated by a "\ n" character
-    builder.append(/* list of all matches */"");
+    builder.append(matches.stream()
+			  			  .map(Object::toString)
+			  			  .collect(joining("\n")));
 
     return builder.toString();
   }