--- a/net/minecraft/world/entity/EntityAreaEffectCloud.java
+++ b/net/minecraft/world/entity/EntityAreaEffectCloud.java
@@ -33,6 +33,12 @@
 import net.minecraft.world.level.material.EnumPistonReaction;
 import org.slf4j.Logger;
 
+// CraftBukkit start
+import org.bukkit.craftbukkit.entity.CraftLivingEntity;
+import org.bukkit.entity.LivingEntity;
+import org.bukkit.event.entity.EntityRemoveEvent;
+// CraftBukkit end
+
 public class EntityAreaEffectCloud extends Entity implements TraceableEntity {
 
     private static final Logger LOGGER = LogUtils.getLogger();
@@ -200,7 +206,7 @@
 
     private void serverTick(WorldServer worldserver) {
         if (this.tickCount >= this.waitTime + this.duration) {
-            this.discard();
+            this.discard(EntityRemoveEvent.Cause.DESPAWN); // CraftBukkit - add Bukkit remove cause
         } else {
             boolean flag = this.isWaiting();
             boolean flag1 = this.tickCount < this.waitTime;
@@ -215,7 +221,7 @@
                 if (this.radiusPerTick != 0.0F) {
                     f += this.radiusPerTick;
                     if (f < 0.5F) {
-                        this.discard();
+                        this.discard(EntityRemoveEvent.Cause.DESPAWN); // CraftBukkit - add Bukkit remove cause
                         return;
                     }
 
@@ -249,11 +255,12 @@
                         if (!list1.isEmpty()) {
                             Iterator iterator1 = list1.iterator();
 
+                            List<LivingEntity> entities = new java.util.ArrayList<LivingEntity>(); // CraftBukkit
                             while (iterator1.hasNext()) {
                                 EntityLiving entityliving = (EntityLiving) iterator1.next();
 
                                 if (!this.victims.containsKey(entityliving) && entityliving.isAffectedByPotions()) {
-                                    Stream stream = list.stream();
+                                    Stream<MobEffect> stream = list.stream(); // CraftBukkit - decompile error
 
                                     Objects.requireNonNull(entityliving);
                                     if (!stream.noneMatch(entityliving::canBeAffected)) {
@@ -262,6 +269,19 @@
                                         double d2 = d0 * d0 + d1 * d1;
 
                                         if (d2 <= (double) (f * f)) {
+                                            // CraftBukkit start
+                                            entities.add((LivingEntity) entityliving.getBukkitEntity());
+                                        }
+                                    }
+                                }
+                            }
+                            {
+                                org.bukkit.event.entity.AreaEffectCloudApplyEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callAreaEffectCloudApplyEvent(this, entities);
+                                if (!event.isCancelled()) {
+                                    for (LivingEntity entity : event.getAffectedEntities()) {
+                                        if (entity instanceof CraftLivingEntity) {
+                                            EntityLiving entityliving = ((CraftLivingEntity) entity).getHandle();
+                                            // CraftBukkit end
                                             this.victims.put(entityliving, this.tickCount + this.reapplicationDelay);
                                             Iterator iterator2 = list.iterator();
 
@@ -271,14 +291,14 @@
                                                 if (((MobEffectList) mobeffect1.getEffect().value()).isInstantenous()) {
                                                     ((MobEffectList) mobeffect1.getEffect().value()).applyInstantenousEffect(worldserver, this, this.getOwner(), entityliving, mobeffect1.getAmplifier(), 0.5D);
                                                 } else {
-                                                    entityliving.addEffect(new MobEffect(mobeffect1), this);
+                                                    entityliving.addEffect(new MobEffect(mobeffect1), this, org.bukkit.event.entity.EntityPotionEffectEvent.Cause.AREA_EFFECT_CLOUD); // CraftBukkit
                                                 }
                                             }
 
                                             if (this.radiusOnUse != 0.0F) {
                                                 f += this.radiusOnUse;
                                                 if (f < 0.5F) {
-                                                    this.discard();
+                                                    this.discard(EntityRemoveEvent.Cause.DESPAWN); // CraftBukkit - add Bukkit remove cause
                                                     return;
                                                 }
 
@@ -288,7 +308,7 @@
                                             if (this.durationOnUse != 0) {
                                                 this.duration += this.durationOnUse;
                                                 if (this.duration <= 0) {
-                                                    this.discard();
+                                                    this.discard(EntityRemoveEvent.Cause.DESPAWN); // CraftBukkit - add Bukkit remove cause
                                                     return;
                                                 }
                                             }
