--- a/net/minecraft/world/entity/animal/EntityFox.java
+++ b/net/minecraft/world/entity/animal/EntityFox.java
@@ -523,7 +523,8 @@
     protected void pickUpItem(EntityItem entityitem) {
         ItemStack itemstack = entityitem.getItem();
 
-        if (this.canHoldItem(itemstack)) {
+        if (!org.bukkit.craftbukkit.event.CraftEventFactory.callEntityPickupItemEvent(this, entityitem, itemstack.getCount() - 1, !this.canHoldItem(itemstack)).isCancelled()) { // CraftBukkit - call EntityPickupItemEvent
+            itemstack = entityitem.getItem(); // CraftBukkit - update ItemStack from event
             int i = itemstack.getCount();
 
             if (i > 1) {
@@ -883,6 +884,16 @@
                 if (entityplayer1 != null && entityplayer != entityplayer1) {
                     entityfox.addTrustedUUID(entityplayer1.getUUID());
                 }
+                // CraftBukkit start - call EntityBreedEvent
+                entityfox.setAge(-24000);
+                entityfox.moveTo(this.animal.getX(), this.animal.getY(), this.animal.getZ(), 0.0F, 0.0F);
+                int experience = this.animal.getRandom().nextInt(7) + 1;
+                org.bukkit.event.entity.EntityBreedEvent entityBreedEvent = org.bukkit.craftbukkit.event.CraftEventFactory.callEntityBreedEvent(entityfox, animal, partner, entityplayer, this.animal.breedItem, experience);
+                if (entityBreedEvent.isCancelled()) {
+                    return;
+                }
+                experience = entityBreedEvent.getExperience();
+                // CraftBukkit end
 
                 if (entityplayer2 != null) {
                     entityplayer2.awardStat(StatisticList.ANIMALS_BRED);
@@ -893,12 +904,14 @@
                 this.partner.setAge(6000);
                 this.animal.resetLove();
                 this.partner.resetLove();
-                entityfox.setAge(-24000);
-                entityfox.moveTo(this.animal.getX(), this.animal.getY(), this.animal.getZ(), 0.0F, 0.0F);
-                worldserver.addFreshEntityWithPassengers(entityfox);
+                worldserver.addFreshEntityWithPassengers(entityfox, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.BREEDING); // CraftBukkit - added SpawnReason
                 this.level.broadcastEntityEvent(this.animal, (byte) 18);
                 if (this.level.getGameRules().getBoolean(GameRules.RULE_DOMOBLOOT)) {
-                    this.level.addFreshEntity(new EntityExperienceOrb(this.level, this.animal.getX(), this.animal.getY(), this.animal.getZ(), this.animal.getRandom().nextInt(7) + 1));
+                    // CraftBukkit start - use event experience
+                    if (experience > 0) {
+                        this.level.addFreshEntity(new EntityExperienceOrb(this.level, this.animal.getX(), this.animal.getY(), this.animal.getZ(), experience));
+                    }
+                    // CraftBukkit end
                 }
 
             }
@@ -1294,6 +1307,11 @@
             int i = (Integer) iblockdata.getValue(BlockSweetBerryBush.AGE);
 
             iblockdata.setValue(BlockSweetBerryBush.AGE, 1);
+            // CraftBukkit start - call EntityChangeBlockEvent
+            if (!org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(EntityFox.this, this.blockPos, iblockdata.setValue(BlockSweetBerryBush.AGE, 1))) {
+                return;
+            }
+            // CraftBukkit end
             int j = 1 + EntityFox.this.level().random.nextInt(2) + (i == 3 ? 1 : 0);
             ItemStack itemstack = EntityFox.this.getItemBySlot(EnumItemSlot.MAINHAND);
 
@@ -1451,7 +1469,7 @@
         private EntityLiving trustedLastHurt;
         private int timestamp;
 
-        public a(Class oclass, boolean flag, boolean flag1, @Nullable Predicate predicate) {
+        public a(Class oclass, boolean flag, boolean flag1, @Nullable Predicate<EntityLiving> predicate) { // CraftBukkit - decompile error
             super(EntityFox.this, oclass, 10, flag, flag1, predicate);
         }
 
