diff --git a/Spigot-API-Patches/PlayerAdvancementCriterionGrantEvent.patch b/Spigot-API-Patches/PlayerAdvancementCriterionGrantEvent.patch
new file mode 100644
index 0000000000..d75286d59a
--- /dev/null
+++ b/Spigot-API-Patches/PlayerAdvancementCriterionGrantEvent.patch
@@ -0,0 +1,71 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: BillyGalbreath <Blake.Galbreath@GMail.com>
+Date: Fri, 19 Jan 2018 08:15:14 -0600
+Subject: [PATCH] PlayerAdvancementCriterionGrantEvent
+
+
+diff --git a/src/main/java/com/destroystokyo/paper/event/player/PlayerAdvancementCriterionGrantEvent.java b/src/main/java/com/destroystokyo/paper/event/player/PlayerAdvancementCriterionGrantEvent.java
+new file mode 100644
+index 00000000..b65ee9e5
+--- /dev/null
++++ b/src/main/java/com/destroystokyo/paper/event/player/PlayerAdvancementCriterionGrantEvent.java
+@@ -0,0 +0,0 @@
++package com.destroystokyo.paper.event.player;
++
++import org.bukkit.advancement.Advancement;
++import org.bukkit.entity.Player;
++import org.bukkit.event.Cancellable;
++import org.bukkit.event.HandlerList;
++import org.bukkit.event.player.PlayerEvent;
++
++/**
++ * Called when a player is granted a criteria in an advancement.
++ */
++public class PlayerAdvancementCriterionGrantEvent extends PlayerEvent implements Cancellable {
++    private static final HandlerList handlers = new HandlerList();
++    private final Advancement advancement;
++    private final String criterion;
++    private boolean cancel = false;
++
++    public PlayerAdvancementCriterionGrantEvent(Player who, Advancement advancement, String criterion) {
++        super(who);
++        this.advancement = advancement;
++        this.criterion = criterion;
++    }
++
++    /**
++     * Get the advancement which has been affected.
++     *
++     * @return affected advancement
++     */
++    public Advancement getAdvancement() {
++        return advancement;
++    }
++
++    /**
++     * Get the criterion which has been granted.
++     *
++     * @return granted criterion
++     */
++    public String getCriterion() {
++        return criterion;
++    }
++
++    public boolean isCancelled() {
++        return cancel;
++    }
++
++    public void setCancelled(boolean cancel) {
++        this.cancel = cancel;
++    }
++
++    @Override
++    public HandlerList getHandlers() {
++        return handlers;
++    }
++
++    public static HandlerList getHandlerList() {
++        return handlers;
++    }
++}
+--
\ No newline at end of file
diff --git a/Spigot-Server-Patches/PlayerAdvancementCriterionGrantEvent.patch b/Spigot-Server-Patches/PlayerAdvancementCriterionGrantEvent.patch
new file mode 100644
index 0000000000..37b2f3d2cd
--- /dev/null
+++ b/Spigot-Server-Patches/PlayerAdvancementCriterionGrantEvent.patch
@@ -0,0 +1,24 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: BillyGalbreath <Blake.Galbreath@GMail.com>
+Date: Fri, 19 Jan 2018 08:15:29 -0600
+Subject: [PATCH] PlayerAdvancementCriterionGrantEvent
+
+
+diff --git a/src/main/java/net/minecraft/server/AdvancementDataPlayer.java b/src/main/java/net/minecraft/server/AdvancementDataPlayer.java
+index 6896b709..8913e274 100644
+--- a/src/main/java/net/minecraft/server/AdvancementDataPlayer.java
++++ b/src/main/java/net/minecraft/server/AdvancementDataPlayer.java
+@@ -0,0 +0,0 @@ public class AdvancementDataPlayer {
+         boolean flag1 = advancementprogress.isDone();
+ 
+         if (advancementprogress.a(s)) {
++            // Paper start
++            if (!new com.destroystokyo.paper.event.player.PlayerAdvancementCriterionGrantEvent(this.player.getBukkitEntity(), advancement.bukkit, s).callEvent()) {
++                advancementprogress.b(s);
++                return false;
++            }
++            // Paper end
+             this.d(advancement);
+             this.i.add(advancement);
+             flag = true;
+--
\ No newline at end of file