diff --git a/Spigot-API-Patches/AnvilDamageEvent.patch b/Spigot-API-Patches/AnvilDamageEvent.patch
new file mode 100644
index 0000000000..d6d5ec79e7
--- /dev/null
+++ b/Spigot-API-Patches/AnvilDamageEvent.patch
@@ -0,0 +1,152 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: BillyGalbreath <Blake.Galbreath@GMail.com>
+Date: Fri, 20 Jul 2018 23:36:55 -0500
+Subject: [PATCH] AnvilDamageEvent
+
+
+diff --git a/src/main/java/com/destroystokyo/paper/event/block/AnvilDamagedEvent.java b/src/main/java/com/destroystokyo/paper/event/block/AnvilDamagedEvent.java
+new file mode 100644
+index 00000000..fd3c5c02
+--- /dev/null
++++ b/src/main/java/com/destroystokyo/paper/event/block/AnvilDamagedEvent.java
+@@ -0,0 +0,0 @@
++package com.destroystokyo.paper.event.block;
++
++import org.bukkit.Material;
++import org.bukkit.block.data.BlockData;
++import org.bukkit.event.Cancellable;
++import org.bukkit.event.HandlerList;
++import org.bukkit.event.inventory.InventoryEvent;
++import org.bukkit.inventory.AnvilInventory;
++import org.bukkit.inventory.InventoryView;
++
++/**
++ * Called when an anvil is damaged from being used
++ */
++public class AnvilDamagedEvent extends InventoryEvent implements Cancellable {
++    private static final HandlerList handlers = new HandlerList();
++    private boolean cancel;
++    private DamageState damageState;
++
++    public AnvilDamagedEvent(InventoryView inventory, BlockData blockData) {
++        super(inventory);
++        this.damageState = DamageState.getState(blockData);
++    }
++
++    @Override
++    public AnvilInventory getInventory() {
++        return (AnvilInventory) super.getInventory();
++    }
++
++    /**
++     * Gets the new state of damage on the anvil
++     *
++     * @return Damage state
++     */
++    public DamageState getDamageState() {
++        return damageState;
++    }
++
++    /**
++     * Sets the new state of damage on the anvil
++     *
++     * @param damageState Damage state
++     */
++    public void setDamageState(DamageState damageState) {
++        this.damageState = damageState;
++    }
++
++    /**
++     * Gets if anvil is breaking on this use
++     *
++     * @return True if breaking
++     */
++    public boolean isBreaking() {
++        return damageState == DamageState.BROKEN;
++    }
++
++    /**
++     * Sets if anvil is breaking on this use
++     *
++     * @param breaking True if breaking
++     */
++    public void setBreaking(boolean breaking) {
++        if (breaking) {
++            damageState = DamageState.BROKEN;
++        } else if (damageState == DamageState.BROKEN) {
++            damageState = DamageState.DAMAGED;
++        }
++    }
++
++    public boolean isCancelled() {
++        return cancel;
++    }
++
++    public void setCancelled(boolean cancel) {
++        this.cancel = cancel;
++    }
++
++    public HandlerList getHandlers() {
++        return handlers;
++    }
++
++    public static HandlerList getHandlerList() {
++        return handlers;
++    }
++
++    /**
++     * Represents the amount of damage on an anvil block
++     */
++    public enum DamageState {
++        FULL(Material.ANVIL),
++        CHIPPED(Material.CHIPPED_ANVIL),
++        DAMAGED(Material.DAMAGED_ANVIL),
++        BROKEN(Material.AIR);
++
++        private Material material;
++
++        DamageState(Material material) {
++            this.material = material;
++        }
++
++        /**
++         * Get block material of this state
++         *
++         * @return Material
++         */
++        public Material getMaterial() {
++            return material;
++        }
++
++        /**
++         * Get damaged state by block data
++         *
++         * @param blockData Block data
++         * @return DamageState
++         * @throws IllegalArgumentException If non anvil block data is given
++         */
++        public static DamageState getState(BlockData blockData) {
++            return blockData == null ? BROKEN : getState(blockData.getMaterial());
++        }
++
++        /**
++         * Get damaged state by block material
++         *
++         * @param material Block material
++         * @return DamageState
++         * @throws IllegalArgumentException If non anvil material is given
++         */
++        public static DamageState getState(Material material) {
++            if (material == null) {
++                return BROKEN;
++            }
++            for (DamageState state : values()) {
++                if (state.material == material) {
++                    return state;
++                }
++            }
++            throw new IllegalArgumentException("Material not an anvil");
++        }
++    }
++}
+--
\ No newline at end of file
diff --git a/Spigot-Server-Patches/AnvilDamageEvent.patch b/Spigot-Server-Patches/AnvilDamageEvent.patch
new file mode 100644
index 0000000000..c3c0b4a322
--- /dev/null
+++ b/Spigot-Server-Patches/AnvilDamageEvent.patch
@@ -0,0 +1,28 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: BillyGalbreath <Blake.Galbreath@GMail.com>
+Date: Fri, 20 Jul 2018 23:37:03 -0500
+Subject: [PATCH] AnvilDamageEvent
+
+
+diff --git a/src/main/java/net/minecraft/server/ContainerAnvil.java b/src/main/java/net/minecraft/server/ContainerAnvil.java
+index c252ff6d5..1f0a46aaf 100644
+--- a/src/main/java/net/minecraft/server/ContainerAnvil.java
++++ b/src/main/java/net/minecraft/server/ContainerAnvil.java
+@@ -0,0 +0,0 @@ public class ContainerAnvil extends Container {
+                 if (!world.isClientSide) {
+                     if (!entityhuman.abilities.canInstantlyBuild && iblockdata.a(TagsBlock.x) && entityhuman.getRandom().nextFloat() < 0.12F) {
+                         IBlockData iblockdata1 = BlockAnvil.a_(iblockdata);
++                        // Paper start
++                        com.destroystokyo.paper.event.block.AnvilDamagedEvent event = new com.destroystokyo.paper.event.block.AnvilDamagedEvent(getBukkitView(), org.bukkit.craftbukkit.block.data.CraftBlockData.fromData(iblockdata1));
++                        if (!event.callEvent()) {
++                            return itemstack;
++                        } else if (event.getDamageState() == com.destroystokyo.paper.event.block.AnvilDamagedEvent.DamageState.BROKEN) {
++                            iblockdata1 = null;
++                        } else {
++                            iblockdata1 = ((org.bukkit.craftbukkit.block.data.CraftBlockData) event.getDamageState().getMaterial().createBlockData()).getState().set(BlockAnvil.FACING, iblockdata.get(BlockAnvil.FACING));
++                        }
++                        // Paper end
+ 
+                         if (iblockdata1 == null) {
+                             world.setAir(blockposition);
+--
\ No newline at end of file