diff --git a/build-data/paper.at b/build-data/paper.at
index 700f8363bb..38986ed82d 100644
--- a/build-data/paper.at
+++ b/build-data/paper.at
@@ -236,3 +236,8 @@ public-f com.mojang.brigadier.tree.CommandNode requirement
 # Block Enderpearl Travel Exploit
 public net.minecraft.world.entity.projectile.Projectile cachedOwner
 public net.minecraft.world.entity.projectile.Projectile ownerUUID
+
+# Add missing display slots
+public org.bukkit.craftbukkit.scoreboard.CraftScoreboardTranslations
+public org.bukkit.craftbukkit.scoreboard.CraftScoreboardTranslations toBukkitSlot(I)Lorg/bukkit/scoreboard/DisplaySlot;
+public org.bukkit.craftbukkit.scoreboard.CraftScoreboardTranslations fromBukkitSlot(Lorg/bukkit/scoreboard/DisplaySlot;)I
diff --git a/patches/api/Add-missing-team-sidebar-display-slots.patch b/patches/api/Add-missing-team-sidebar-display-slots.patch
new file mode 100644
index 0000000000..96014a3e2d
--- /dev/null
+++ b/patches/api/Add-missing-team-sidebar-display-slots.patch
@@ -0,0 +1,69 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Jake Potrebic <jake.m.potrebic@gmail.com>
+Date: Fri, 1 Oct 2021 08:04:43 -0700
+Subject: [PATCH] Add missing team sidebar display slots
+
+
+diff --git a/src/main/java/org/bukkit/scoreboard/DisplaySlot.java b/src/main/java/org/bukkit/scoreboard/DisplaySlot.java
+index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
+--- a/src/main/java/org/bukkit/scoreboard/DisplaySlot.java
++++ b/src/main/java/org/bukkit/scoreboard/DisplaySlot.java
+@@ -0,0 +0,0 @@
+ package org.bukkit.scoreboard;
+ 
++import net.kyori.adventure.text.format.NamedTextColor; // Paper
+ /**
+  * Locations for displaying objectives to the player
+  */
+ public enum DisplaySlot {
+-    BELOW_NAME,
+-    PLAYER_LIST,
+-    SIDEBAR;
++    // Paper start
++    BELOW_NAME("belowName"),
++    PLAYER_LIST("list"),
++    SIDEBAR("sidebar"),
++    SIDEBAR_TEAM_BLACK(NamedTextColor.BLACK),
++    SIDEBAR_TEAM_DARK_BLUE(NamedTextColor.DARK_BLUE),
++    SIDEBAR_TEAM_DARK_GREEN(NamedTextColor.DARK_GREEN),
++    SIDEBAR_TEAM_DARK_AQUA(NamedTextColor.DARK_AQUA),
++    SIDEBAR_TEAM_DARK_RED(NamedTextColor.DARK_RED),
++    SIDEBAR_TEAM_DARK_PURPLE(NamedTextColor.DARK_PURPLE),
++    SIDEBAR_TEAM_GOLD(NamedTextColor.GOLD),
++    SIDEBAR_TEAM_GRAY(NamedTextColor.GRAY),
++    SIDEBAR_TEAM_DARK_GRAY(NamedTextColor.DARK_GRAY),
++    SIDEBAR_TEAM_BLUE(NamedTextColor.BLUE),
++    SIDEBAR_TEAM_GREEN(NamedTextColor.GREEN),
++    SIDEBAR_TEAM_AQUA(NamedTextColor.AQUA),
++    SIDEBAR_TEAM_RED(NamedTextColor.RED),
++    SIDEBAR_TEAM_LIGHT_PURPLE(NamedTextColor.LIGHT_PURPLE),
++    SIDEBAR_TEAM_YELLOW(NamedTextColor.YELLOW),
++    SIDEBAR_TEAM_WHITE(NamedTextColor.WHITE);
++
++    public static final net.kyori.adventure.util.Index<String, DisplaySlot> NAMES = net.kyori.adventure.util.Index.create(DisplaySlot.class, DisplaySlot::getId);
++
++    private final String id;
++
++    DisplaySlot(@org.jetbrains.annotations.NotNull String id) {
++        this.id = id;
++    }
++
++    DisplaySlot(@org.jetbrains.annotations.NotNull NamedTextColor color) {
++        this.id = "sidebar.team." + color;
++    }
++
++    /**
++     * Get the string id of this display slot.
++     *
++     * @return the string id
++     */
++    public @org.jetbrains.annotations.NotNull String getId() {
++        return id;
++    }
++
++    @Override
++    public String toString() {
++        return this.id;
++    }
++    // Paper end
+ }
diff --git a/patches/server/Add-missing-team-sidebar-display-slots.patch b/patches/server/Add-missing-team-sidebar-display-slots.patch
new file mode 100644
index 0000000000..987ee70f99
--- /dev/null
+++ b/patches/server/Add-missing-team-sidebar-display-slots.patch
@@ -0,0 +1,65 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Jake Potrebic <jake.m.potrebic@gmail.com>
+Date: Fri, 1 Oct 2021 08:04:39 -0700
+Subject: [PATCH] Add missing team sidebar display slots
+
+
+diff --git a/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftScoreboardTranslations.java b/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftScoreboardTranslations.java
+index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
+--- a/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftScoreboardTranslations.java
++++ b/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftScoreboardTranslations.java
+@@ -0,0 +0,0 @@ import org.bukkit.scoreboard.DisplaySlot;
+ import org.bukkit.scoreboard.RenderType;
+ 
+ public final class CraftScoreboardTranslations {
+-    static final int MAX_DISPLAY_SLOT = 3;
++    static final int MAX_DISPLAY_SLOT = Scoreboard.getDisplaySlotNames().length; // Paper
++    @Deprecated // Paper
+     static ImmutableBiMap<DisplaySlot, String> SLOTS = ImmutableBiMap.of(
+             DisplaySlot.BELOW_NAME, "belowName",
+             DisplaySlot.PLAYER_LIST, "list",
+@@ -0,0 +0,0 @@ public final class CraftScoreboardTranslations {
+     private CraftScoreboardTranslations() {}
+ 
+     public static DisplaySlot toBukkitSlot(int i) {
++        if (true) return org.bukkit.scoreboard.DisplaySlot.NAMES.value(Scoreboard.getDisplaySlotName(i)); // Paper
+         return CraftScoreboardTranslations.SLOTS.inverse().get(Scoreboard.getDisplaySlotName(i));
+     }
+ 
+     public static int fromBukkitSlot(DisplaySlot slot) {
++        if (true) return Scoreboard.getDisplaySlotByName(slot.getId()); // Paper
+         return Scoreboard.getDisplaySlotByName(CraftScoreboardTranslations.SLOTS.get(slot));
+     }
+ 
+diff --git a/src/test/java/io/papermc/paper/scoreboard/DisplaySlotTest.java b/src/test/java/io/papermc/paper/scoreboard/DisplaySlotTest.java
+new file mode 100644
+index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000
+--- /dev/null
++++ b/src/test/java/io/papermc/paper/scoreboard/DisplaySlotTest.java
+@@ -0,0 +0,0 @@
++package io.papermc.paper.scoreboard;
++
++import net.minecraft.world.scores.Scoreboard;
++import org.bukkit.craftbukkit.scoreboard.CraftScoreboardTranslations;
++import org.bukkit.scoreboard.DisplaySlot;
++import org.junit.Test;
++
++import static org.junit.Assert.assertNotEquals;
++import static org.junit.Assert.assertNotNull;
++
++public class DisplaySlotTest {
++
++    @Test
++    public void testBukkitToMinecraftDisplaySlots() {
++        for (DisplaySlot value : DisplaySlot.values()) {
++            assertNotEquals(-1, CraftScoreboardTranslations.fromBukkitSlot(value));
++        }
++    }
++
++    @Test
++    public void testMinecraftToBukkitDisplaySlots() {
++        for (String name : Scoreboard.getDisplaySlotNames()) {
++            assertNotNull(CraftScoreboardTranslations.toBukkitSlot(Scoreboard.getDisplaySlotByName(name)));
++        }
++    }
++}