diff --git a/purpur-api/src/main/java/org/purpurmc/purpur/event/entity/EntityTeleportHinderedEvent.java b/purpur-api/src/main/java/org/purpurmc/purpur/event/entity/EntityTeleportHinderedEvent.java
deleted file mode 100644
index fd61a3e31..000000000
--- a/purpur-api/src/main/java/org/purpurmc/purpur/event/entity/EntityTeleportHinderedEvent.java
+++ /dev/null
@@ -1,116 +0,0 @@
-package org.purpurmc.purpur.event.entity;
-
-import org.bukkit.entity.Entity;
-import org.bukkit.event.HandlerList;
-import org.bukkit.event.entity.EntityEvent;
-import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause;
-import org.jetbrains.annotations.ApiStatus;
-import org.jspecify.annotations.NullMarked;
-import org.jspecify.annotations.Nullable;
-
-/**
- * Fired when an entity is hindered from teleporting.
- * @deprecated no longer needed
- */
-@NullMarked
-@Deprecated(since = "1.21.10")
-public class EntityTeleportHinderedEvent extends EntityEvent {
- private static final HandlerList handlers = new HandlerList();
-
- private final Reason reason;
-
- private final @Nullable TeleportCause teleportCause;
-
- private boolean retry = false;
-
- @ApiStatus.Internal
- public EntityTeleportHinderedEvent(Entity what, Reason reason, @Nullable TeleportCause teleportCause) {
- super(what);
- this.reason = reason;
- this.teleportCause = teleportCause;
- }
-
- /**
- * @return why the teleport was hindered.
- */
- public Reason getReason() {
- return reason;
- }
-
- /**
- * @return why the teleport occurred if cause was given, otherwise {@code null}.
- */
- @Nullable
- public TeleportCause getTeleportCause() {
- return teleportCause;
- }
-
- /**
- * Whether the teleport should be retried.
- *
- * Note that this can put the server in a never-ending loop of trying to teleport someone resulting in a stack
- * overflow. Do not retry more than necessary.
- *
- *
- * @return whether the teleport should be retried.
- */
- public boolean shouldRetry() {
- return retry;
- }
-
- /**
- * Sets whether the teleport should be retried.
- *
- * Note that this can put the server in a never-ending loop of trying to teleport someone resulting in a stack
- * overflow. Do not retry more than necessary.
- *
- *
- * @param retry whether the teleport should be retried.
- */
- public void setShouldRetry(boolean retry) {
- this.retry = retry;
- }
-
- /**
- * Calls the event and tests if should retry.
- *
- * @return whether the teleport should be retried.
- */
- @Override
- public boolean callEvent() {
- super.callEvent();
- return shouldRetry();
- }
-
- @Override
- public HandlerList getHandlers() {
- return handlers;
- }
-
- public static HandlerList getHandlerList() {
- return handlers;
- }
-
- /**
- * Reason for hindrance in teleports.
- */
- public enum Reason {
- /**
- * The teleported entity is a passenger of another entity.
- */
- IS_PASSENGER,
-
- /**
- * The teleported entity has passengers.
- */
- IS_VEHICLE,
-
- /**
- * The teleport event was cancelled.
- *
- * This is only caused by players teleporting.
- *
- */
- EVENT_CANCELLED,
- }
-}
diff --git a/purpur-server/minecraft-patches/features/0016-Add-EntityTeleportHinderedEvent.patch b/purpur-server/minecraft-patches/features/0016-Add-EntityTeleportHinderedEvent.patch
deleted file mode 100644
index 2fd6b6ed5..000000000
--- a/purpur-server/minecraft-patches/features/0016-Add-EntityTeleportHinderedEvent.patch
+++ /dev/null
@@ -1,72 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Mariell Hoversholm
-Date: Sat, 9 Jan 2021 15:26:04 +0100
-Subject: [PATCH] Add EntityTeleportHinderedEvent
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program. If not, see .
-
-diff --git a/net/minecraft/world/level/block/EndGatewayBlock.java b/net/minecraft/world/level/block/EndGatewayBlock.java
-index 4b959091412defb5ae6ffe387f98ed1cc9a29e5f..7ed96070abb398384e82d7d85efa3e0a6c493aad 100644
---- a/net/minecraft/world/level/block/EndGatewayBlock.java
-+++ b/net/minecraft/world/level/block/EndGatewayBlock.java
-@@ -98,6 +98,13 @@ public class EndGatewayBlock extends BaseEntityBlock implements Portal {
- org.bukkit.event.entity.EntityPortalEnterEvent event = new org.bukkit.event.entity.EntityPortalEnterEvent(entity.getBukkitEntity(), org.bukkit.craftbukkit.util.CraftLocation.toBukkit(pos, level), org.bukkit.PortalType.END_GATEWAY); // Paper - add portal type
- if (!event.callEvent()) return;
- // Paper end - call EntityPortalEnterEvent
-+ // Purpur start - Add EntityTeleportHinderedEvent
-+ if (level.purpurConfig.imposeTeleportRestrictionsOnGateways && (entity.isVehicle() || entity.isPassenger())) {
-+ if (!new org.purpurmc.purpur.event.entity.EntityTeleportHinderedEvent(entity.getBukkitEntity(), entity.isPassenger() ? org.purpurmc.purpur.event.entity.EntityTeleportHinderedEvent.Reason.IS_PASSENGER : org.purpurmc.purpur.event.entity.EntityTeleportHinderedEvent.Reason.IS_VEHICLE, org.bukkit.event.player.PlayerTeleportEvent.TeleportCause.END_GATEWAY).callEvent()) {
-+ return;
-+ }
-+ }
-+ // Purpur end - Add EntityTeleportHinderedEvent
- entity.setAsInsidePortal(this, pos);
- TheEndGatewayBlockEntity.triggerCooldown(level, pos, state, theEndGatewayBlockEntity);
- }
-diff --git a/net/minecraft/world/level/block/EndPortalBlock.java b/net/minecraft/world/level/block/EndPortalBlock.java
-index 19590aa5af0eaf0f9bf76dc189ed67e67c692c77..cb41b33a3022a341a340e8186fed8e39373a3a2b 100644
---- a/net/minecraft/world/level/block/EndPortalBlock.java
-+++ b/net/minecraft/world/level/block/EndPortalBlock.java
-@@ -61,6 +61,13 @@ public class EndPortalBlock extends BaseEntityBlock implements Portal {
- protected void entityInside(BlockState state, Level level, BlockPos pos, Entity entity, InsideBlockEffectApplier effectApplier, boolean pastEdges) {
- if (!new io.papermc.paper.event.entity.EntityInsideBlockEvent(entity.getBukkitEntity(), org.bukkit.craftbukkit.block.CraftBlock.at(level, pos)).callEvent()) { return; } // Paper - Add EntityInsideBlockEvent
- if (entity.canUsePortal(false)) {
-+ // Purpur start - Add EntityTeleportHinderedEvent
-+ if (level.purpurConfig.imposeTeleportRestrictionsOnEndPortals && (entity.isVehicle() || entity.isPassenger())) {
-+ if (!new org.purpurmc.purpur.event.entity.EntityTeleportHinderedEvent(entity.getBukkitEntity(), entity.isPassenger() ? org.purpurmc.purpur.event.entity.EntityTeleportHinderedEvent.Reason.IS_PASSENGER : org.purpurmc.purpur.event.entity.EntityTeleportHinderedEvent.Reason.IS_VEHICLE, org.bukkit.event.player.PlayerTeleportEvent.TeleportCause.END_PORTAL).callEvent()) {
-+ return;
-+ }
-+ }
-+ // Purpur end - Add EntityTeleportHinderedEvent
- // CraftBukkit start - Entity in portal
- org.bukkit.event.entity.EntityPortalEnterEvent event = new org.bukkit.event.entity.EntityPortalEnterEvent(entity.getBukkitEntity(), org.bukkit.craftbukkit.util.CraftLocation.toBukkit(pos, level), org.bukkit.PortalType.ENDER); // Paper - add portal type
- level.getCraftServer().getPluginManager().callEvent(event);
-diff --git a/net/minecraft/world/level/block/NetherPortalBlock.java b/net/minecraft/world/level/block/NetherPortalBlock.java
-index 860e0c3ab118d8c6863936b9c2603bf6a278ca99..a37ae82d5c2407039d49304dc3937f7f0794bddc 100644
---- a/net/minecraft/world/level/block/NetherPortalBlock.java
-+++ b/net/minecraft/world/level/block/NetherPortalBlock.java
-@@ -114,6 +114,13 @@ public class NetherPortalBlock extends Block implements Portal {
- protected void entityInside(BlockState state, Level level, BlockPos pos, Entity entity, InsideBlockEffectApplier effectApplier, boolean pastEdges) {
- if (!new io.papermc.paper.event.entity.EntityInsideBlockEvent(entity.getBukkitEntity(), org.bukkit.craftbukkit.block.CraftBlock.at(level, pos)).callEvent()) { return; } // Paper - Add EntityInsideBlockEvent
- if (entity.canUsePortal(false)) {
-+ // Purpur start - Add EntityTeleportHinderedEvent
-+ if (level.purpurConfig.imposeTeleportRestrictionsOnNetherPortals && (entity.isVehicle() || entity.isPassenger())) {
-+ if (!new org.purpurmc.purpur.event.entity.EntityTeleportHinderedEvent(entity.getBukkitEntity(), entity.isPassenger() ? org.purpurmc.purpur.event.entity.EntityTeleportHinderedEvent.Reason.IS_PASSENGER : org.purpurmc.purpur.event.entity.EntityTeleportHinderedEvent.Reason.IS_VEHICLE, org.bukkit.event.player.PlayerTeleportEvent.TeleportCause.NETHER_PORTAL).callEvent()) {
-+ return;
-+ }
-+ }
-+ // Purpur end - Add EntityTeleportHinderedEvent
- // CraftBukkit start - Entity in portal
- org.bukkit.event.entity.EntityPortalEnterEvent event = new org.bukkit.event.entity.EntityPortalEnterEvent(entity.getBukkitEntity(), org.bukkit.craftbukkit.util.CraftLocation.toBukkit(pos, level), org.bukkit.PortalType.NETHER); // Paper - add portal type
- level.getCraftServer().getPluginManager().callEvent(event);