diff --git a/Spigot-Server-Patches/Fix-invulnerable-end-crystals.patch b/Spigot-Server-Patches/Fix-invulnerable-end-crystals.patch
new file mode 100644
index 0000000000..1a2b800623
--- /dev/null
+++ b/Spigot-Server-Patches/Fix-invulnerable-end-crystals.patch
@@ -0,0 +1,76 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Jake Potrebic <jake.m.potrebic@gmail.com>
+Date: Thu, 27 May 2021 14:52:30 -0700
+Subject: [PATCH] Fix invulnerable end crystals
+
+MC-108513
+
+diff --git a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
+index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
+--- a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
++++ b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
+@@ -0,0 +0,0 @@ public class PaperWorldConfig {
+     private void fixItemsMergingThroughWalls() {
+         fixItemsMergingThroughWalls = getBoolean("fix-items-merging-through-walls", fixItemsMergingThroughWalls);
+     }
++
++    public boolean fixInvulnerableEndCrystalExploit = true;
++    private void fixInvulnerableEndCrystalExploit() {
++        fixInvulnerableEndCrystalExploit = getBoolean("unsupported-settings.fix-invulnerable-end-crystal-exploit", fixInvulnerableEndCrystalExploit);
++    }
+ }
+diff --git a/src/main/java/net/minecraft/world/level/dimension/end/EnderDragonBattle.java b/src/main/java/net/minecraft/world/level/dimension/end/EnderDragonBattle.java
+index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
+--- a/src/main/java/net/minecraft/world/level/dimension/end/EnderDragonBattle.java
++++ b/src/main/java/net/minecraft/world/level/dimension/end/EnderDragonBattle.java
+@@ -0,0 +0,0 @@ public class EnderDragonBattle {
+ 
+         while (iterator.hasNext()) {
+             WorldGenEnder.Spike worldgenender_spike = (WorldGenEnder.Spike) iterator.next();
++            if (!this.world.paperConfig.fixInvulnerableEndCrystalExploit || worldgenender_spike.crystal == null) { // Paper
+             List<EntityEnderCrystal> list = this.world.a(EntityEnderCrystal.class, worldgenender_spike.f());
+             Iterator iterator1 = list.iterator();
+ 
+@@ -0,0 +0,0 @@ public class EnderDragonBattle {
+                 entityendercrystal.setInvulnerable(false);
+                 entityendercrystal.setBeamTarget((BlockPosition) null);
+             }
++            // Paper start
++            } else {
++                worldgenender_spike.crystal.setInvulnerable(false);
++                worldgenender_spike.crystal.setBeamTarget(null);
++                worldgenender_spike.crystal = null;
++            }
++            // Paper end
+         }
+ 
+     }
+diff --git a/src/main/java/net/minecraft/world/level/levelgen/feature/WorldGenEnder.java b/src/main/java/net/minecraft/world/level/levelgen/feature/WorldGenEnder.java
+index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
+--- a/src/main/java/net/minecraft/world/level/levelgen/feature/WorldGenEnder.java
++++ b/src/main/java/net/minecraft/world/level/levelgen/feature/WorldGenEnder.java
+@@ -0,0 +0,0 @@ public class WorldGenEnder extends WorldGenerator<WorldGenFeatureEndSpikeConfigu
+         return (List) WorldGenEnder.a.getUnchecked(i);
+     }
+ 
+-    public boolean a(GeneratorAccessSeed generatoraccessseed, ChunkGenerator chunkgenerator, Random random, BlockPosition blockposition, WorldGenFeatureEndSpikeConfiguration worldgenfeatureendspikeconfiguration) {
++    public boolean generate(GeneratorAccessSeed generatoraccessseed, ChunkGenerator chunkgenerator, Random random, BlockPosition blockposition, WorldGenFeatureEndSpikeConfiguration worldgenfeatureendspikeconfiguration) { // Paper - decompile fix
+         List<WorldGenEnder.Spike> list = worldgenfeatureendspikeconfiguration.c();
+ 
+         if (list.isEmpty()) {
+@@ -0,0 +0,0 @@ public class WorldGenEnder extends WorldGenerator<WorldGenFeatureEndSpikeConfigu
+         entityendercrystal.setInvulnerable(worldgenfeatureendspikeconfiguration.b());
+         entityendercrystal.setPositionRotation((double) worldgenender_spike.a() + 0.5D, (double) (worldgenender_spike.d() + 1), (double) worldgenender_spike.b() + 0.5D, random.nextFloat() * 360.0F, 0.0F);
+         worldaccess.addEntity(entityendercrystal);
++        worldgenender_spike.crystal = entityendercrystal; // Paper
+         this.a(worldaccess, new BlockPosition(worldgenender_spike.a(), worldgenender_spike.d(), worldgenender_spike.b()), Blocks.BEDROCK.getBlockData());
+     }
+ 
+@@ -0,0 +0,0 @@ public class WorldGenEnder extends WorldGenerator<WorldGenFeatureEndSpikeConfigu
+         private final int e;
+         private final boolean f;
+         private final AxisAlignedBB g;
++        public EntityEnderCrystal crystal; // Paper
+ 
+         public Spike(int i, int j, int k, int l, boolean flag) {
+             this.b = i;