diff --git a/src/main/java/net/minecraft/server/BlockSapling.java b/src/main/java/net/minecraft/server/BlockSapling.java
index 22197bb813..4152bd70e4 100644
--- a/src/main/java/net/minecraft/server/BlockSapling.java
+++ b/src/main/java/net/minecraft/server/BlockSapling.java
@@ -34,8 +34,7 @@ public class BlockSapling extends BlockPlant implements IBlockFragilePlantElemen
                 this.grow(world, i, j, k, random);
                 // CraftBukkit start
                 world.captureTreeGeneration = false;
-                if (world.capturedBlockStates.size() > 0)
-                {
+                if (world.capturedBlockStates.size() > 0) {
                     TreeType treeType = BlockSapling.treeType;
                     BlockSapling.treeType = null;
                     Location location = new Location(world.getWorld(), i, j, k);
diff --git a/src/main/java/net/minecraft/server/ItemStack.java b/src/main/java/net/minecraft/server/ItemStack.java
index bae352b2a4..73428488c7 100644
--- a/src/main/java/net/minecraft/server/ItemStack.java
+++ b/src/main/java/net/minecraft/server/ItemStack.java
@@ -100,6 +100,10 @@ public final class ItemStack {
             }
         }
         boolean flag = this.getItem().interactWith(this, entityhuman, world, i, j, k, l, f, f1, f2);
+        int newData = this.getData();
+        int newCount = this.count;
+        this.count = count;
+        this.setData(data);
         world.captureBlockStates = false;
         if (flag && world.captureTreeGeneration && world.capturedBlockStates.size() > 0) {
             world.captureTreeGeneration = false;
@@ -114,6 +118,11 @@ public final class ItemStack {
                 org.bukkit.Bukkit.getPluginManager().callEvent(event);
             }
             if (event == null || !event.isCancelled()) {
+                // Change the stack to its new contents if it hasn't been tampered with.
+                if (this.count == count && this.getData() == data) {
+                    this.setData(newData);
+                    this.count = newCount;
+                }
                 for (BlockState blockstate : blocks) {
                     blockstate.update(true);
                 }
@@ -139,10 +148,12 @@ public final class ItemStack {
                 for (BlockState blockstate : blocks) {
                     blockstate.update(true, false);
                 }
-                // make sure to restore stack after cancel
-                this.setData(data);
-                this.count = count;
             } else {
+                // Change the stack to its new contents if it hasn't been tampered with.
+                if (this.count == count && this.getData() == data) {
+                    this.setData(newData);
+                    this.count = newCount;
+                }
                 for (BlockState blockstate : blocks) {
                     int x = blockstate.getX();
                     int y = blockstate.getY();