--- a/net/minecraft/server/ServerScoreboard.java
+++ b/net/minecraft/server/ServerScoreboard.java
@@ -43,9 +_,7 @@
     protected void onScoreChanged(ScoreHolder scoreHolder, Objective objective, Score score) {
         super.onScoreChanged(scoreHolder, objective, score);
         if (this.trackedObjectives.contains(objective)) {
-            this.server
-                .getPlayerList()
-                .broadcastAll(
+            this.broadcastAll( // CraftBukkit
                     new ClientboundSetScorePacket(
                         scoreHolder.getScoreboardName(),
                         objective.getName(),
@@ -68,7 +_,7 @@
     @Override
     public void onPlayerRemoved(ScoreHolder scoreHolder) {
         super.onPlayerRemoved(scoreHolder);
-        this.server.getPlayerList().broadcastAll(new ClientboundResetScorePacket(scoreHolder.getScoreboardName(), null));
+        this.broadcastAll(new ClientboundResetScorePacket(scoreHolder.getScoreboardName(), null)); // CraftBukkit
         this.setDirty();
     }
 
@@ -76,7 +_,7 @@
     public void onPlayerScoreRemoved(ScoreHolder scoreHolder, Objective objective) {
         super.onPlayerScoreRemoved(scoreHolder, objective);
         if (this.trackedObjectives.contains(objective)) {
-            this.server.getPlayerList().broadcastAll(new ClientboundResetScorePacket(scoreHolder.getScoreboardName(), objective.getName()));
+            this.broadcastAll(new ClientboundResetScorePacket(scoreHolder.getScoreboardName(), objective.getName())); // CraftBukkit
         }
 
         this.setDirty();
@@ -88,7 +_,7 @@
         super.setDisplayObjective(slot, objective);
         if (displayObjective != objective && displayObjective != null) {
             if (this.getObjectiveDisplaySlotCount(displayObjective) > 0) {
-                this.server.getPlayerList().broadcastAll(new ClientboundSetDisplayObjectivePacket(slot, objective));
+                this.broadcastAll(new ClientboundSetDisplayObjectivePacket(slot, objective)); // CraftBukkit
             } else {
                 this.stopTrackingObjective(displayObjective);
             }
@@ -96,7 +_,7 @@
 
         if (objective != null) {
             if (this.trackedObjectives.contains(objective)) {
-                this.server.getPlayerList().broadcastAll(new ClientboundSetDisplayObjectivePacket(slot, objective));
+                this.broadcastAll(new ClientboundSetDisplayObjectivePacket(slot, objective)); // CraftBukkit
             } else {
                 this.startTrackingObjective(objective);
             }
@@ -108,24 +_,50 @@
     @Override
     public boolean addPlayerToTeam(String playerName, PlayerTeam team) {
         if (super.addPlayerToTeam(playerName, team)) {
-            this.server
-                .getPlayerList()
-                .broadcastAll(ClientboundSetPlayerTeamPacket.createPlayerPacket(team, playerName, ClientboundSetPlayerTeamPacket.Action.ADD));
-            this.setDirty();
-            return true;
-        } else {
-            return false;
-        }
-    }
+            this.broadcastAll(ClientboundSetPlayerTeamPacket.createPlayerPacket(team, playerName, ClientboundSetPlayerTeamPacket.Action.ADD)); // CraftBukkit
+            this.setDirty();
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    // Paper start - Multiple Entries with Scoreboards
+    public boolean addPlayersToTeam(java.util.Collection<String> players, PlayerTeam team) {
+        boolean anyAdded = false;
+        for (String playerName : players) {
+            if (super.addPlayerToTeam(playerName, team)) {
+                anyAdded = true;
+            }
+        }
+
+        if (anyAdded) {
+            this.broadcastAll(ClientboundSetPlayerTeamPacket.createMultiplePlayerPacket(team, players, ClientboundSetPlayerTeamPacket.Action.ADD));
+            this.setDirty();
+            return true;
+        } else {
+            return false;
+        }
+    }
+    // Paper end - Multiple Entries with Scoreboards
 
     @Override
     public void removePlayerFromTeam(String username, PlayerTeam playerTeam) {
         super.removePlayerFromTeam(username, playerTeam);
-        this.server
-            .getPlayerList()
-            .broadcastAll(ClientboundSetPlayerTeamPacket.createPlayerPacket(playerTeam, username, ClientboundSetPlayerTeamPacket.Action.REMOVE));
-        this.setDirty();
-    }
+        this.broadcastAll(ClientboundSetPlayerTeamPacket.createPlayerPacket(playerTeam, username, ClientboundSetPlayerTeamPacket.Action.REMOVE)); // CraftBukkit
+        this.setDirty();
+    }
+
+    // Paper start - Multiple Entries with Scoreboards
+    public void removePlayersFromTeam(java.util.Collection<String> players, PlayerTeam team) {
+        for (String playerName : players) {
+            super.removePlayerFromTeam(playerName, team);
+        }
+
+        this.broadcastAll(ClientboundSetPlayerTeamPacket.createMultiplePlayerPacket(team, players, ClientboundSetPlayerTeamPacket.Action.REMOVE));
+        this.setDirty();
+    }
+    // Paper end - Multiple Entries with Scoreboards
 
     @Override
     public void onObjectiveAdded(Objective objective) {
@@ -137,7 +_,7 @@
     public void onObjectiveChanged(Objective objective) {
         super.onObjectiveChanged(objective);
         if (this.trackedObjectives.contains(objective)) {
-            this.server.getPlayerList().broadcastAll(new ClientboundSetObjectivePacket(objective, 2));
+            this.broadcastAll(new ClientboundSetObjectivePacket(objective, 2)); // CraftBukkit
         }
 
         this.setDirty();
@@ -156,21 +_,21 @@
     @Override
     public void onTeamAdded(PlayerTeam playerTeam) {
         super.onTeamAdded(playerTeam);
-        this.server.getPlayerList().broadcastAll(ClientboundSetPlayerTeamPacket.createAddOrModifyPacket(playerTeam, true));
+        this.broadcastAll(ClientboundSetPlayerTeamPacket.createAddOrModifyPacket(playerTeam, true)); // CraftBukkit
         this.setDirty();
     }
 
     @Override
     public void onTeamChanged(PlayerTeam playerTeam) {
         super.onTeamChanged(playerTeam);
-        this.server.getPlayerList().broadcastAll(ClientboundSetPlayerTeamPacket.createAddOrModifyPacket(playerTeam, false));
+        this.broadcastAll(ClientboundSetPlayerTeamPacket.createAddOrModifyPacket(playerTeam, false)); // CraftBukkit
         this.setDirty();
     }
 
     @Override
     public void onTeamRemoved(PlayerTeam playerTeam) {
         super.onTeamRemoved(playerTeam);
-        this.server.getPlayerList().broadcastAll(ClientboundSetPlayerTeamPacket.createRemovePacket(playerTeam));
+        this.broadcastAll(ClientboundSetPlayerTeamPacket.createRemovePacket(playerTeam)); // CraftBukkit
         this.setDirty();
     }
 
@@ -213,6 +_,7 @@
         List<Packet<?>> startTrackingPackets = this.getStartTrackingPackets(objective);
 
         for (ServerPlayer serverPlayer : this.server.getPlayerList().getPlayers()) {
+            if (serverPlayer.getBukkitEntity().getScoreboard().getHandle() != this) continue; // CraftBukkit - Only players on this board
             for (Packet<?> packet : startTrackingPackets) {
                 serverPlayer.connection.send(packet);
             }
@@ -238,6 +_,7 @@
         List<Packet<?>> stopTrackingPackets = this.getStopTrackingPackets(objective);
 
         for (ServerPlayer serverPlayer : this.server.getPlayerList().getPlayers()) {
+            if (serverPlayer.getBukkitEntity().getScoreboard().getHandle() != this) continue; // CraftBukkit - Only players on this board
             for (Packet<?> packet : stopTrackingPackets) {
                 serverPlayer.connection.send(packet);
             }
@@ -269,6 +_,16 @@
         scoreboardSaveData.loadFrom(data);
         return scoreboardSaveData;
     }
+
+    // CraftBukkit start - Send to players
+    private void broadcastAll(Packet<?> packet) {
+        for (ServerPlayer serverPlayer : this.server.getPlayerList().players) {
+            if (serverPlayer.getBukkitEntity().getScoreboard().getHandle() == this) {
+                serverPlayer.connection.send(packet);
+            }
+        }
+    }
+    // CraftBukkit end
 
     public static enum Method {
         CHANGE,
