diff --git a/Spigot-API-Patches/EntityTransformedEvent.patch b/Spigot-API-Patches/EntityTransformedEvent.patch
new file mode 100644
index 0000000000..dd159f834c
--- /dev/null
+++ b/Spigot-API-Patches/EntityTransformedEvent.patch
@@ -0,0 +1,98 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Anthony MacAllister <anthonymmacallister@gmail.com>
+Date: Thu, 26 Jul 2018 15:28:53 -0400
+Subject: [PATCH] EntityTransformedEvent
+
+
+diff --git a/src/main/java/com/destroystokyo/paper/event/entity/EntityTransformedEvent.java b/src/main/java/com/destroystokyo/paper/event/entity/EntityTransformedEvent.java
+new file mode 100644
+index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000
+--- /dev/null
++++ b/src/main/java/com/destroystokyo/paper/event/entity/EntityTransformedEvent.java
+@@ -0,0 +0,0 @@
++package com.destroystokyo.paper.event.entity;
++
++
++import org.bukkit.entity.Entity;
++import org.bukkit.event.Cancellable;
++import org.bukkit.event.HandlerList;
++import org.bukkit.event.entity.EntityEvent;
++
++/**
++ * Fired when an entity transforms into another entity
++ * <p>
++ * If the event is cancelled, the entity will not transform
++ */
++public class EntityTransformedEvent extends EntityEvent implements Cancellable {
++    private static final HandlerList handlers = new HandlerList();
++    private boolean cancelled;
++    private final Entity transformed;
++    private final TransformedReason reason;
++
++    public EntityTransformedEvent(Entity entity, Entity transformed, TransformedReason reason) {
++        super(entity);
++        this.transformed = transformed;
++        this.reason = reason;
++    }
++
++    /**
++     * The entity after it has transformed
++     *
++     * @return Transformed entity
++     */
++    public Entity getTransformed() {
++        return transformed;
++    }
++
++    /**
++     * @return The reason for the transformation
++     */
++    public TransformedReason getReason() {
++        return reason;
++    }
++
++
++    @Override
++    public HandlerList getHandlers(){
++        return handlers;
++    }
++
++    public static HandlerList getHandlerList(){
++        return handlers;
++    }
++
++    @Override
++    public boolean isCancelled(){
++        return cancelled;
++    }
++
++    @Override
++    public void setCancelled(boolean cancel){
++        cancelled = cancel;
++    }
++
++    public enum TransformedReason {
++        /**
++         * When a zombie drowns
++         */
++        DROWNED,
++        /**
++         * When a zombie villager is cured
++         */
++        CURED,
++        /**
++         * When a villager turns to a zombie villager
++         */
++        INFECTED,
++        /**
++         * When a mooshroom turns to a cow
++         */
++        SHEARED,
++        /**
++         * When a pig turns to a zombiepigman
++         */
++        LIGHTNING
++
++    }
++}
+--
\ No newline at end of file
diff --git a/Spigot-Server-Patches/EntityTransformedEvent.patch b/Spigot-Server-Patches/EntityTransformedEvent.patch
new file mode 100644
index 0000000000..16d325c650
--- /dev/null
+++ b/Spigot-Server-Patches/EntityTransformedEvent.patch
@@ -0,0 +1,67 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Anthony MacAllister <anthonymmacallister@gmail.com>
+Date: Thu, 26 Jul 2018 15:30:03 -0400
+Subject: [PATCH] EntityTransformedEvent
+
+
+diff --git a/src/main/java/net/minecraft/server/EntityMushroomCow.java b/src/main/java/net/minecraft/server/EntityMushroomCow.java
+index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
+--- a/src/main/java/net/minecraft/server/EntityMushroomCow.java
++++ b/src/main/java/net/minecraft/server/EntityMushroomCow.java
+@@ -0,0 +0,0 @@ public class EntityMushroomCow extends EntityCow {
+                 if (this.hasCustomName()) {
+                     entitycow.setCustomName(this.getCustomName());
+                 }
+-
++                if (!new com.destroystokyo.paper.event.entity.EntityTransformedEvent(this.getBukkitEntity(), entitycow.getBukkitEntity(), com.destroystokyo.paper.event.entity.EntityTransformedEvent.TransformedReason.SHEARED).callEvent()) return false; // Paper
+                 this.world.addEntity(entitycow);
+ 
+                 for (int i = 0; i < 5; ++i) {
+diff --git a/src/main/java/net/minecraft/server/EntityVillager.java b/src/main/java/net/minecraft/server/EntityVillager.java
+index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
+--- a/src/main/java/net/minecraft/server/EntityVillager.java
++++ b/src/main/java/net/minecraft/server/EntityVillager.java
+@@ -0,0 +0,0 @@ public class EntityVillager extends EntityAgeable implements NPC, IMerchant {
+                 entitywitch.setCustomName(this.getCustomName());
+                 entitywitch.setCustomNameVisible(this.getCustomNameVisible());
+             }
+-
++            if (!new com.destroystokyo.paper.event.entity.EntityTransformedEvent(this.getBukkitEntity(), entitywitch.getBukkitEntity(), com.destroystokyo.paper.event.entity.EntityTransformedEvent.TransformedReason.LIGHTNING).callEvent()) return; // Paper
+             this.world.addEntity(entitywitch, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.LIGHTNING); // Paper - Added lightning spawn reason for this entity
+             this.die();
+         }
+diff --git a/src/main/java/net/minecraft/server/EntityZombie.java b/src/main/java/net/minecraft/server/EntityZombie.java
+index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
+--- a/src/main/java/net/minecraft/server/EntityZombie.java
++++ b/src/main/java/net/minecraft/server/EntityZombie.java
+@@ -0,0 +0,0 @@ public class EntityZombie extends EntityMonster {
+                 entityzombie.setCustomName(this.getCustomName());
+                 entityzombie.setCustomNameVisible(this.getCustomNameVisible());
+             }
+-
++            if (!new com.destroystokyo.paper.event.entity.EntityTransformedEvent(this.getBukkitEntity(), entityzombie.getBukkitEntity(), com.destroystokyo.paper.event.entity.EntityTransformedEvent.TransformedReason.DROWNED).callEvent()) return; // Paper
+             this.world.addEntity(entityzombie);
+             this.die();
+         }
+@@ -0,0 +0,0 @@ public class EntityZombie extends EntityMonster {
+                 entityzombievillager.setCustomNameVisible(entityvillager.getCustomNameVisible());
+             }
+ 
++            if (!new com.destroystokyo.paper.event.entity.EntityTransformedEvent(this.getBukkitEntity(), entityvillager.getBukkitEntity(), com.destroystokyo.paper.event.entity.EntityTransformedEvent.TransformedReason.INFECTED).callEvent()) return; // Paper
+             this.world.addEntity(entityzombievillager, CreatureSpawnEvent.SpawnReason.INFECTION); // CraftBukkit - add SpawnReason
+             this.world.a((EntityHuman) null, 1026, new BlockPosition(this), 0);
+         }
+diff --git a/src/main/java/net/minecraft/server/EntityZombieVillager.java b/src/main/java/net/minecraft/server/EntityZombieVillager.java
+index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
+--- a/src/main/java/net/minecraft/server/EntityZombieVillager.java
++++ b/src/main/java/net/minecraft/server/EntityZombieVillager.java
+@@ -0,0 +0,0 @@ public class EntityZombieVillager extends EntityZombie {
+             entityvillager.setCustomName(this.getCustomName());
+             entityvillager.setCustomNameVisible(this.getCustomNameVisible());
+         }
+-
++        if (!new com.destroystokyo.paper.event.entity.EntityTransformedEvent(this.getBukkitEntity(), entityvillager.getBukkitEntity(), com.destroystokyo.paper.event.entity.EntityTransformedEvent.TransformedReason.CURED).callEvent()) return; // Paper
+         this.world.addEntity(entityvillager, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.CURED); // CraftBukkit - add SpawnReason
+         if (this.bD != null) {
+             EntityHuman entityhuman = this.world.b(this.bD);
+--
\ No newline at end of file