diff --git a/Mage.Tests/src/test/java/org/mage/test/serverside/tournament/SwissPairingMinimalWeightMatchingTest.java b/Mage.Tests/src/test/java/org/mage/test/serverside/tournament/SwissPairingMinimalWeightMatchingTest.java
index 9429f71f91..068639b97b 100644
--- a/Mage.Tests/src/test/java/org/mage/test/serverside/tournament/SwissPairingMinimalWeightMatchingTest.java
+++ b/Mage.Tests/src/test/java/org/mage/test/serverside/tournament/SwissPairingMinimalWeightMatchingTest.java
@@ -82,6 +82,7 @@ public class SwissPairingMinimalWeightMatchingTest {
 
         CheckPair(roundPairings.getPairings(), player1, player2);
         CheckPair(roundPairings.getPairings(), player3, player4);
+        Assert.assertEquals(0, roundPairings.getPlayerByes().size());
     }
 
     @Test
@@ -131,6 +132,46 @@ public class SwissPairingMinimalWeightMatchingTest {
 
         CheckPair(roundPairings.getPairings(), player1, player4);
         CheckPair(roundPairings.getPairings(), player2, player3);
+        Assert.assertEquals(0, roundPairings.getPlayerByes().size());
+    }
+
+    @Test
+    public void PlayerLeftTournamentAfterFirstRound() {
+        // 1 > 3
+        // 2 > 4
+        // 4 left the tournament
+
+        TournamentPlayer player1 = new TournamentPlayer(new PlayerStub(), null);
+        TournamentPlayer player2 = new TournamentPlayer(new PlayerStub(), null);
+        TournamentPlayer player3 = new TournamentPlayer(new PlayerStub(), null);
+        TournamentPlayer player4 = new TournamentPlayer(new PlayerStub(), null);
+        List<TournamentPlayer> players = new ArrayList<>();
+        //players.add(player4); -- player 4 is not active
+        players.add(player2);
+        players.add(player3);
+        players.add(player1);
+
+        player1.setPoints(3);
+        player2.setPoints(3);
+        player3.setPoints(0);
+        player4.setPoints(0);
+
+        List<Round> rounds = new ArrayList<>();
+        Round round = new Round(1, new TournamentStub());
+        TournamentPairing pair1 = new TournamentPairing(player1, player3);
+        round.addPairing(pair1);
+        TournamentPairing pair2 = new TournamentPairing(player4, player2);
+        round.addPairing(pair2);
+        rounds.add(round);
+
+        SwissPairingMinimalWeightMatching swissPairing = new SwissPairingMinimalWeightMatching(players, rounds);
+        RoundPairings roundPairings = swissPairing.getRoundPairings();
+
+        Assert.assertEquals(1, roundPairings.getPairings().size());
+        Assert.assertEquals(1, roundPairings.getPlayerByes().size());
+
+        CheckPair(roundPairings.getPairings(), player1, player2);
+        Assert.assertTrue(roundPairings.getPlayerByes().contains(player3));
     }
 
     @Test
@@ -190,6 +231,53 @@ public class SwissPairingMinimalWeightMatchingTest {
         Assert.assertTrue(roundPairings.getPlayerByes().contains(player3));
     }
 
+    @Test
+    public void PlayerWithByeLeftTournament() {
+        // 1 > 2
+        // 3 > 4
+        // 5
+        // 5 left the tournament
+
+
+        TournamentPlayer player1 = new TournamentPlayer(new PlayerStub(), null);
+        TournamentPlayer player2 = new TournamentPlayer(new PlayerStub(), null);
+        TournamentPlayer player3 = new TournamentPlayer(new PlayerStub(), null);
+        TournamentPlayer player4 = new TournamentPlayer(new PlayerStub(), null);
+        TournamentPlayer player5 = new TournamentPlayer(new PlayerStub(), null);
+        List<TournamentPlayer> players = new ArrayList<>();
+        //players.add(player5); -- player 5 is not active
+        players.add(player4);
+        players.add(player2);
+        players.add(player3);
+        players.add(player1);
+
+        player1.setPoints(3);
+        player2.setPoints(0);
+        player3.setPoints(3);
+        player4.setPoints(0);
+        player5.setPoints(3);
+
+        List<Round> rounds = new ArrayList<>();
+        // first round
+        Round round = new Round(1, new TournamentStub());
+        TournamentPairing pair1 = new TournamentPairing(player1, player2);
+        round.addPairing(pair1);
+        TournamentPairing pair2 = new TournamentPairing(player3, player4);
+        round.addPairing(pair2);
+        round.getPlayerByes().add(player5);
+        rounds.add(round);
+
+        SwissPairingMinimalWeightMatching swissPairing = new SwissPairingMinimalWeightMatching(players, rounds);
+        RoundPairings roundPairings = swissPairing.getRoundPairings();
+
+        Assert.assertEquals(2, roundPairings.getPairings().size());
+        Assert.assertEquals(0, roundPairings.getPlayerByes().size());
+
+        CheckPair(roundPairings.getPairings(), player1, player3);
+        CheckPair(roundPairings.getPairings(), player2, player4);
+        Assert.assertEquals(0, roundPairings.getPlayerByes().size());
+    }
+
     @Test
     public void SimulateDifferentTournaments() {
         int playersCount = 12;
diff --git a/Mage/src/mage/game/tournament/pairing/SwissPairingMinimalWeightMatching.java b/Mage/src/mage/game/tournament/pairing/SwissPairingMinimalWeightMatching.java
index bff184c5ab..880694e04b 100644
--- a/Mage/src/mage/game/tournament/pairing/SwissPairingMinimalWeightMatching.java
+++ b/Mage/src/mage/game/tournament/pairing/SwissPairingMinimalWeightMatching.java
@@ -61,20 +61,19 @@ public class SwissPairingMinimalWeightMatching {
         playersCount = players.size();
 
         swissPlayers = new ArrayList<PlayerInfo>();
-        for (int i = 0; i < playersCount; i++) {
+        for (TournamentPlayer tournamentPlayer : players) {
             PlayerInfo swissPlayer = new PlayerInfo();
-            swissPlayer.tournamentPlayer = players.get(i);
-            swissPlayer.playerId = players.get(i).getPlayer().getId();
-            swissPlayer.points = players.get(i).getPoints();
+            swissPlayer.tournamentPlayer = tournamentPlayer;
+            swissPlayer.points = tournamentPlayer.getPoints();
             swissPlayers.add(swissPlayer);
         }
 
         // shuffle players first to add some randomness
         Collections.shuffle(swissPlayers);
-        Map<UUID, Integer> map = new HashMap<>();
+        Map<TournamentPlayer, Integer> map = new HashMap<>();
         for (int i = 0; i < playersCount; i++) {
             swissPlayers.get(i).id = i;
-            map.put(swissPlayers.get(i).playerId, i);
+            map.put(swissPlayers.get(i).tournamentPlayer, i);
         }
 
         // calculate Tie Breaker points -- Sum of Opponents' Scores (SOS)
@@ -84,11 +83,16 @@ public class SwissPairingMinimalWeightMatching {
                 TournamentPlayer player1 = pairing.getPlayer1();
                 TournamentPlayer player2 = pairing.getPlayer2();
 
-                int id1 = map.get(player1.getPlayer().getId());
-                int id2 = map.get(player2.getPlayer().getId());
+                Integer id1 = map.get(player1);
+                Integer id2 = map.get(player2);
 
-                swissPlayers.get(id1).sosPoints += player2.getPoints();
-                swissPlayers.get(id2).sosPoints += player1.getPoints();
+                // a player could have left the tournament, so we should check if id is not null
+                if (id1 != null) {
+                    swissPlayers.get(id1).sosPoints += player2.getPoints();
+                }
+                if (id2 != null) {
+                    swissPlayers.get(id2).sosPoints += player1.getPoints();
+                }
                 // todo: sos points for byes? maybe add player points?
             }
         }
@@ -106,9 +110,10 @@ public class SwissPairingMinimalWeightMatching {
         });
 
         // order could be changed, update ids and mapping
+        map.clear();
         for (int i = 0; i < playersCount; i++) {
             swissPlayers.get(i).id = i;
-            map.put(swissPlayers.get(i).playerId, i);
+            map.put(swissPlayers.get(i).tournamentPlayer, i);
         }
 
         // count ties and matches between players
@@ -119,15 +124,19 @@ public class SwissPairingMinimalWeightMatching {
                 TournamentPlayer player1 = pairing.getPlayer1();
                 TournamentPlayer player2 = pairing.getPlayer2();
 
-                int id1 = map.get(player1.getPlayer().getId());
-                int id2 = map.get(player2.getPlayer().getId());
+                Integer id1 = map.get(player1);
+                Integer id2 = map.get(player2);
 
-                duels[id1][id2]++;
-                duels[id2][id1]++;
+                if (id1 != null && id2 != null) {
+                    duels[id1][id2]++;
+                    duels[id2][id1]++;
+                }
             }
             for (TournamentPlayer playerBye : round.getPlayerByes()) {
-                int id = map.get(playerBye.getPlayer().getId());
-                byes[id]++;
+                Integer id = map.get(playerBye);
+                if (id != null) {
+                    byes[id]++;
+                }
             }
         }
 
@@ -273,8 +282,6 @@ public class SwissPairingMinimalWeightMatching {
 
         public TournamentPlayer tournamentPlayer;
 
-        public UUID playerId;
-
         public int points;
 
         public int sosPoints;