diff --git a/Spigot-Server-Patches/do-not-create-unnecessary-copies-of-passenger-list.patch b/Spigot-Server-Patches/do-not-create-unnecessary-copies-of-passenger-list.patch
new file mode 100644
index 0000000000..25a4354ddb
--- /dev/null
+++ b/Spigot-Server-Patches/do-not-create-unnecessary-copies-of-passenger-list.patch
@@ -0,0 +1,239 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: lukas81298 <lukas81298@gmail.com>
+Date: Sun, 13 Dec 2020 13:42:55 +0100
+Subject: [PATCH] do not create unnecessary copies of passenger list
+
+
+diff --git a/src/main/java/net/minecraft/server/Entity.java b/src/main/java/net/minecraft/server/Entity.java
+index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
+--- a/src/main/java/net/minecraft/server/Entity.java
++++ b/src/main/java/net/minecraft/server/Entity.java
+@@ -0,0 +0,0 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke
+     }
+ 
+     protected boolean q(Entity entity) {
+-        return this.getPassengers().size() < 1;
++        return this.passengers.size() < 1; // Paper - do not copy list
+     }
+ 
+     public final float getCollisionBorderSize() { return bg(); } // Paper - OBFHELPER
+@@ -0,0 +0,0 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke
+     }
+ 
+     public boolean isVehicle() {
+-        return !this.getPassengers().isEmpty();
++        return !this.passengers.isEmpty(); // Paper - do not copy list
+     }
+ 
+     public boolean bt() {
+@@ -0,0 +0,0 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke
+     }
+ 
+     public boolean w(Entity entity) {
+-        Iterator iterator = this.getPassengers().iterator();
++        Iterator iterator = this.passengers.iterator(); // Paper - do not copy list
+ 
+         Entity entity1;
+ 
+@@ -0,0 +0,0 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke
+     }
+ 
+     public boolean a(Class<? extends Entity> oclass) {
+-        Iterator iterator = this.getPassengers().iterator();
++        Iterator iterator = this.passengers.iterator(); // Paper - do not copy list
+ 
+         Entity entity;
+ 
+@@ -0,0 +0,0 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke
+ 
+     public Collection<Entity> getAllPassengers() {
+         Set<Entity> set = Sets.newHashSet();
+-        Iterator iterator = this.getPassengers().iterator();
++        Iterator iterator = this.passengers.iterator(); // Paper - do not copy list
+ 
+         while (iterator.hasNext()) {
+             Entity entity = (Entity) iterator.next();
+@@ -0,0 +0,0 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke
+     private void a(boolean flag, Set<Entity> set) {
+         Entity entity;
+ 
+-        for (Iterator iterator = this.getPassengers().iterator(); iterator.hasNext(); entity.a(flag, set)) {
++        for (Iterator iterator = this.passengers.iterator(); iterator.hasNext(); entity.a(flag, set)) { // Paper - do not copy list
+             entity = (Entity) iterator.next();
+             if (!flag || EntityPlayer.class.isAssignableFrom(entity.getClass())) {
+                 set.add(entity);
+diff --git a/src/main/java/net/minecraft/server/EntityBoat.java b/src/main/java/net/minecraft/server/EntityBoat.java
+index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
+--- a/src/main/java/net/minecraft/server/EntityBoat.java
++++ b/src/main/java/net/minecraft/server/EntityBoat.java
+@@ -0,0 +0,0 @@ public class EntityBoat extends Entity {
+         super.tick();
+         this.r();
+         if (this.cs()) {
+-            if (this.getPassengers().isEmpty() || !(this.getPassengers().get(0) instanceof EntityHuman)) {
++            if (this.passengers.isEmpty() || !(this.passengers.get(0) instanceof EntityHuman)) { // Paper - do not copy list
+                 this.a(false, false);
+             }
+ 
+@@ -0,0 +0,0 @@ public class EntityBoat extends Entity {
+                 Entity entity = (Entity) list.get(j);
+ 
+                 if (!entity.w(this)) {
+-                    if (flag && this.getPassengers().size() < 2 && !entity.isPassenger() && entity.getWidth() < this.getWidth() && entity instanceof EntityLiving && !(entity instanceof EntityWaterAnimal) && !(entity instanceof EntityHuman)) {
++                    if (flag && this.passengers.size() < 2 && !entity.isPassenger() && entity.getWidth() < this.getWidth() && entity instanceof EntityLiving && !(entity instanceof EntityWaterAnimal) && !(entity instanceof EntityHuman)) { // Paper - do not copy passenger list
+                         entity.startRiding(this);
+                     } else {
+                         this.collide(entity);
+@@ -0,0 +0,0 @@ public class EntityBoat extends Entity {
+             float f = 0.0F;
+             float f1 = (float) ((this.dead ? 0.009999999776482582D : this.bc()) + entity.bb());
+ 
+-            if (this.getPassengers().size() > 1) {
+-                int i = this.getPassengers().indexOf(entity);
++            if (this.passengers.size() > 1) { // Paper - do not copy list
++                int i = this.passengers.indexOf(entity); // Paper - do not copy list
+ 
+                 if (i == 0) {
+                     f = 0.2F;
+@@ -0,0 +0,0 @@ public class EntityBoat extends Entity {
+             entity.yaw += this.ak;
+             entity.setHeadRotation(entity.getHeadRotation() + this.ak);
+             this.a(entity);
+-            if (entity instanceof EntityAnimal && this.getPassengers().size() > 1) {
++            if (entity instanceof EntityAnimal && this.passengers.size() > 1) { // Paper - do not copy list
+                 int j = entity.getId() % 2 == 0 ? 90 : 270;
+ 
+                 entity.n(((EntityAnimal) entity).aA + (float) j);
+@@ -0,0 +0,0 @@ public class EntityBoat extends Entity {
+ 
+     @Override
+     protected boolean q(Entity entity) {
+-        return this.getPassengers().size() < 2 && !this.a((Tag) TagsFluid.WATER);
++        return this.passengers.size() < 2 && !this.a((Tag) TagsFluid.WATER); // Paper - do not copy list
+     }
+ 
+     @Nullable
+     @Override
+     public Entity getRidingPassenger() {
+-        List<Entity> list = this.getPassengers();
++        List<Entity> list = this.passengers; // Paper - do not copy list
+ 
+         return list.isEmpty() ? null : (Entity) list.get(0);
+     }
+diff --git a/src/main/java/net/minecraft/server/EntityHorseAbstract.java b/src/main/java/net/minecraft/server/EntityHorseAbstract.java
+index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
+--- a/src/main/java/net/minecraft/server/EntityHorseAbstract.java
++++ b/src/main/java/net/minecraft/server/EntityHorseAbstract.java
+@@ -0,0 +0,0 @@ public abstract class EntityHorseAbstract extends EntityAnimal implements IInven
+     @Nullable
+     @Override
+     public Entity getRidingPassenger() {
+-        return this.getPassengers().isEmpty() ? null : (Entity) this.getPassengers().get(0);
++        return this.passengers.isEmpty() ? null : (Entity) this.passengers.get(0); // Paper - do not copy list
+     }
+ 
+     @Nullable
+diff --git a/src/main/java/net/minecraft/server/EntityMinecartAbstract.java b/src/main/java/net/minecraft/server/EntityMinecartAbstract.java
+index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
+--- a/src/main/java/net/minecraft/server/EntityMinecartAbstract.java
++++ b/src/main/java/net/minecraft/server/EntityMinecartAbstract.java
+@@ -0,0 +0,0 @@ public abstract class EntityMinecartAbstract extends Entity {
+ 
+         vec3d1 = new Vec3D(d8 * d4 / d6, vec3d1.y, d8 * d5 / d6);
+         this.setMot(vec3d1);
+-        Entity entity = this.getPassengers().isEmpty() ? null : (Entity) this.getPassengers().get(0);
++        Entity entity = this.passengers.isEmpty() ? null : (Entity) this.passengers.get(0); // Paper - do not copy list
+ 
+         if (entity instanceof EntityHuman) {
+             Vec3D vec3d2 = entity.getMot();
+diff --git a/src/main/java/net/minecraft/server/EntityPig.java b/src/main/java/net/minecraft/server/EntityPig.java
+index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
+--- a/src/main/java/net/minecraft/server/EntityPig.java
++++ b/src/main/java/net/minecraft/server/EntityPig.java
+@@ -0,0 +0,0 @@ public class EntityPig extends EntityAnimal implements ISteerable, ISaddleable {
+     @Nullable
+     @Override
+     public Entity getRidingPassenger() {
+-        return this.getPassengers().isEmpty() ? null : (Entity) this.getPassengers().get(0);
++        return this.passengers.isEmpty() ? null : (Entity) this.passengers.get(0); // Paper - do not copy list
+     }
+ 
+     @Override
+diff --git a/src/main/java/net/minecraft/server/EntityRavager.java b/src/main/java/net/minecraft/server/EntityRavager.java
+index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
+--- a/src/main/java/net/minecraft/server/EntityRavager.java
++++ b/src/main/java/net/minecraft/server/EntityRavager.java
+@@ -0,0 +0,0 @@ public class EntityRavager extends EntityRaider {
+     @Nullable
+     @Override
+     public Entity getRidingPassenger() {
+-        return this.getPassengers().isEmpty() ? null : (Entity) this.getPassengers().get(0);
++        return this.passengers.isEmpty() ? null : (Entity) this.passengers.get(0); // Paper - do not copy list
+     }
+ 
+     @Override
+diff --git a/src/main/java/net/minecraft/server/EntityTrackerEntry.java b/src/main/java/net/minecraft/server/EntityTrackerEntry.java
+index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
+--- a/src/main/java/net/minecraft/server/EntityTrackerEntry.java
++++ b/src/main/java/net/minecraft/server/EntityTrackerEntry.java
+@@ -0,0 +0,0 @@ public class EntityTrackerEntry {
+ 
+     public final void tick() { this.a(); } // Paper - OBFHELPER
+     public void a() {
+-        List<Entity> list = this.tracker.getPassengers();
++        List<Entity> list = this.tracker.passengers; // Paper - do not copy list
+ 
+         if (!list.equals(this.p)) {
+-            this.p = list;
++            this.p = com.google.common.collect.ImmutableList.copyOf(list); // Paper - only copy list if something has changed
+             this.broadcastIncludingSelf(new PacketPlayOutMount(this.tracker)); // CraftBukkit
+         }
+ 
+@@ -0,0 +0,0 @@ public class EntityTrackerEntry {
+             }
+         }
+ 
+-        if (!this.tracker.getPassengers().isEmpty()) {
++        if (!this.tracker.passengers.isEmpty()) { // Paper - do not create copy of list
+             consumer.accept(new PacketPlayOutMount(this.tracker));
+         }
+ 
+diff --git a/src/main/java/net/minecraft/server/PacketPlayOutMount.java b/src/main/java/net/minecraft/server/PacketPlayOutMount.java
+index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
+--- a/src/main/java/net/minecraft/server/PacketPlayOutMount.java
++++ b/src/main/java/net/minecraft/server/PacketPlayOutMount.java
+@@ -0,0 +0,0 @@ public class PacketPlayOutMount implements Packet<PacketListenerPlayOut> {
+ 
+     public PacketPlayOutMount(Entity entity) {
+         this.a = entity.getId();
+-        List<Entity> list = entity.getPassengers();
++        List<Entity> list = entity.passengers; // Paper - do not create a copy of the list
+ 
+         this.b = new int[list.size()];
+ 
+diff --git a/src/main/java/net/minecraft/server/PathfinderGoalTame.java b/src/main/java/net/minecraft/server/PathfinderGoalTame.java
+index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
+--- a/src/main/java/net/minecraft/server/PathfinderGoalTame.java
++++ b/src/main/java/net/minecraft/server/PathfinderGoalTame.java
+@@ -0,0 +0,0 @@ public class PathfinderGoalTame extends PathfinderGoal {
+     @Override
+     public void e() {
+         if (!this.entity.isTamed() && this.entity.getRandom().nextInt(50) == 0) {
+-            Entity entity = (Entity) this.entity.getPassengers().get(0);
++            Entity entity = this.entity.passengers.isEmpty() ? null : this.entity.passengers.get(0); // Paper - do not copy list, fixed array out of bounds exception as well
+ 
+             if (entity == null) {
+                 return;
+diff --git a/src/main/java/net/minecraft/server/PlayerChunkMap.java b/src/main/java/net/minecraft/server/PlayerChunkMap.java
+index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
+--- a/src/main/java/net/minecraft/server/PlayerChunkMap.java
++++ b/src/main/java/net/minecraft/server/PlayerChunkMap.java
+@@ -0,0 +0,0 @@ Sections go from 0..16. Now whenever a section is not empty, it can potentially
+                 list.add(entity);
+             }
+ 
+-            if (!entity.getPassengers().isEmpty()) {
++            if (!entity.passengers.isEmpty()) { // Paper - do not copy list
+                 list1.add(entity);
+             }
+         }