--- a/net/minecraft/world/entity/monster/ZombieVillager.java
+++ b/net/minecraft/world/entity/monster/ZombieVillager.java
@@ -51,7 +_,7 @@
 import net.minecraft.world.level.block.state.BlockState;
 
 public class ZombieVillager extends Zombie implements VillagerDataHolder {
-    private static final EntityDataAccessor<Boolean> DATA_CONVERTING_ID = SynchedEntityData.defineId(ZombieVillager.class, EntityDataSerializers.BOOLEAN);
+    public static final EntityDataAccessor<Boolean> DATA_CONVERTING_ID = SynchedEntityData.defineId(ZombieVillager.class, EntityDataSerializers.BOOLEAN);
     private static final EntityDataAccessor<VillagerData> DATA_VILLAGER_DATA = SynchedEntityData.defineId(
         ZombieVillager.class, EntityDataSerializers.VILLAGER_DATA
     );
@@ -61,9 +_,9 @@
     private static final int SPECIAL_BLOCK_RADIUS = 4;
     private static final int NOT_CONVERTING = -1;
     private static final int DEFAULT_XP = 0;
-    private int villagerConversionTime;
+    public int villagerConversionTime;
     @Nullable
-    private UUID conversionStarter;
+    public UUID conversionStarter;
     @Nullable
     private GossipContainer gossips;
     @Nullable
@@ -159,13 +_,21 @@
         return this.getEntityData().get(DATA_CONVERTING_ID);
     }
 
-    private void startConverting(@Nullable UUID conversionStarter, int villagerConversionTime) {
+    public void startConverting(@Nullable UUID conversionStarter, int villagerConversionTime) {
+        // Paper start - missing entity behaviour api - converting without entity event
+        this.startConverting(conversionStarter, villagerConversionTime, true);
+    }
+
+    public void startConverting(@Nullable UUID conversionStarter, int villagerConversionTime, boolean broadcastEntityEvent) {
+        // Paper end - missing entity behaviour api - converting without entity event
         this.conversionStarter = conversionStarter;
         this.villagerConversionTime = villagerConversionTime;
         this.getEntityData().set(DATA_CONVERTING_ID, true);
-        this.removeEffect(MobEffects.WEAKNESS);
-        this.addEffect(new MobEffectInstance(MobEffects.STRENGTH, villagerConversionTime, Math.min(this.level().getDifficulty().getId() - 1, 0)));
-        this.level().broadcastEntityEvent(this, (byte)16);
+        // CraftBukkit start
+        this.removeEffect(MobEffects.WEAKNESS, org.bukkit.event.entity.EntityPotionEffectEvent.Cause.CONVERSION);
+        this.addEffect(new MobEffectInstance(MobEffects.STRENGTH, villagerConversionTime, Math.min(this.level().getDifficulty().getId() - 1, 0)), org.bukkit.event.entity.EntityPotionEffectEvent.Cause.CONVERSION);
+        // CraftBukkit end
+        if (broadcastEntityEvent) this.level().broadcastEntityEvent(this, (byte)16); // Paper - missing entity behaviour api - converting without entity event
     }
 
     @Override
@@ -190,7 +_,7 @@
     }
 
     private void finishConversion(ServerLevel level) {
-        this.convertTo(
+        Villager converted = this.convertTo( // CraftBukkit
             EntityType.VILLAGER,
             ConversionParams.single(this, false, false),
             villager -> {
@@ -214,19 +_,24 @@
                 villager.finalizeSpawn(level, level.getCurrentDifficultyAt(villager.blockPosition()), EntitySpawnReason.CONVERSION, null);
                 villager.refreshBrain(level);
                 if (this.conversionStarter != null) {
-                    Player playerByUuid = level.getPlayerByUUID(this.conversionStarter);
+                    Player playerByUuid = level.getGlobalPlayerByUUID(this.conversionStarter); // Paper - check global player list where appropriate
                     if (playerByUuid instanceof ServerPlayer) {
                         CriteriaTriggers.CURED_ZOMBIE_VILLAGER.trigger((ServerPlayer)playerByUuid, this, villager);
                         level.onReputationEvent(ReputationEventType.ZOMBIE_VILLAGER_CURED, playerByUuid, villager);
                     }
                 }
 
-                villager.addEffect(new MobEffectInstance(MobEffects.NAUSEA, 200, 0));
+                villager.addEffect(new MobEffectInstance(MobEffects.NAUSEA, 200, 0), org.bukkit.event.entity.EntityPotionEffectEvent.Cause.CONVERSION); // CraftBukkit
                 if (!this.isSilent()) {
                     level.levelEvent(null, 1027, this.blockPosition(), 0);
                 }
-            }
+                // CraftBukkit start
+            }, org.bukkit.event.entity.EntityTransformEvent.TransformReason.CURED, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.CURED // CraftBukkit
         );
+        if (converted == null) {
+            ((org.bukkit.entity.ZombieVillager) this.getBukkitEntity()).setConversionTime(-1); // SPIGOT-5208: End conversion to stop event spam
+        }
+        // CraftBukkit end
     }
 
     @VisibleForTesting
