--- a/net/minecraft/world/entity/animal/EntityBee.java
+++ b/net/minecraft/world/entity/animal/EntityBee.java
@@ -93,6 +93,12 @@
 import net.minecraft.world.level.pathfinder.PathType;
 import net.minecraft.world.phys.Vec3D;
 
+// CraftBukkit start
+import org.bukkit.craftbukkit.event.CraftEventFactory;
+import org.bukkit.event.entity.EntityPotionEffectEvent;
+import org.bukkit.event.entity.EntityTargetEvent;
+// CraftBukkit end
+
 public class EntityBee extends EntityAnimal implements IEntityAngerable, EntityBird {
 
     public static final float FLAP_DEGREES_PER_TICK = 120.32113F;
@@ -198,12 +204,19 @@
 
     @Override
     public void addAdditionalSaveData(NBTTagCompound nbttagcompound) {
+        // CraftBukkit start - selectively save data
+        addAdditionalSaveData(nbttagcompound, true);
+    }
+
+    @Override
+    public void addAdditionalSaveData(NBTTagCompound nbttagcompound, boolean includeAll) {
+        // CraftBukkit end
         super.addAdditionalSaveData(nbttagcompound);
-        if (this.hasHive()) {
+        if (includeAll && this.hasHive()) { // CraftBukkit - selectively save hive
             nbttagcompound.put("hive_pos", GameProfileSerializer.writeBlockPos(this.getHivePos()));
         }
 
-        if (this.hasSavedFlowerPos()) {
+        if (includeAll && this.hasSavedFlowerPos()) { // CraftBukkit - selectively save flower
             nbttagcompound.put("flower_pos", GameProfileSerializer.writeBlockPos(this.getSavedFlowerPos()));
         }
 
@@ -223,8 +236,8 @@
         this.ticksWithoutNectarSinceExitingHive = nbttagcompound.getInt("TicksSincePollination");
         this.stayOutOfHiveCountdown = nbttagcompound.getInt("CannotEnterHiveTicks");
         this.numCropsGrownSincePollination = nbttagcompound.getInt("CropsGrownSincePollination");
-        this.hivePos = (BlockPosition) GameProfileSerializer.readBlockPos(nbttagcompound, "hive_pos").orElse((Object) null);
-        this.savedFlowerPos = (BlockPosition) GameProfileSerializer.readBlockPos(nbttagcompound, "flower_pos").orElse((Object) null);
+        this.hivePos = (BlockPosition) GameProfileSerializer.readBlockPos(nbttagcompound, "hive_pos").orElse(null); // CraftBukkit - decompile error
+        this.savedFlowerPos = (BlockPosition) GameProfileSerializer.readBlockPos(nbttagcompound, "flower_pos").orElse(null); // CraftBukkit - decompile error
         this.readPersistentAngerSaveData(this.level(), nbttagcompound);
     }
 
@@ -248,7 +261,7 @@
                 }
 
                 if (b0 > 0) {
-                    entityliving.addEffect(new MobEffect(MobEffects.POISON, b0 * 20, 0), this);
+                    entityliving.addEffect(new MobEffect(MobEffects.POISON, b0 * 20, 0), this, EntityPotionEffectEvent.Cause.ATTACK); // CraftBukkit
                 }
             }
 
@@ -506,7 +519,7 @@
 
     @Nullable
     TileEntityBeehive getBeehiveBlockEntity() {
-        return this.hivePos == null ? null : (this.isTooFarAway(this.hivePos) ? null : (TileEntityBeehive) this.level().getBlockEntity(this.hivePos, TileEntityTypes.BEEHIVE).orElse((Object) null));
+        return this.hivePos == null ? null : (this.isTooFarAway(this.hivePos) ? null : (TileEntityBeehive) this.level().getBlockEntity(this.hivePos, TileEntityTypes.BEEHIVE).orElse(null)); // CraftBukkit - decompile error
     }
 
     boolean isHiveValid() {
@@ -671,8 +684,14 @@
         if (this.isInvulnerableTo(worldserver, damagesource)) {
             return false;
         } else {
+            // CraftBukkit start - Only stop pollinating if entity was damaged
+            boolean result = super.hurtServer(worldserver, damagesource, f);
+            if (!result) {
+                return result;
+            }
+            // CraftBukkit end
             this.beePollinateGoal.stopPollinating();
-            return super.hurtServer(worldserver, damagesource, f);
+            return result; // CraftBukkit
         }
     }
 
@@ -1082,7 +1101,7 @@
 
         e() {
             super();
-            this.travellingTicks = EntityBee.this.level().random.nextInt(10);
+            this.travellingTicks = EntityBee.this.random.nextInt(10); // CraftBukkit - SPIGOT-7495: Give Bees another chance and let them use their own random, avoid concurrency issues
             this.blacklistedTargets = Lists.newArrayList();
             this.setFlags(EnumSet.of(PathfinderGoal.Type.MOVE));
         }
@@ -1196,7 +1215,7 @@
 
         f() {
             super();
-            this.travellingTicks = EntityBee.this.level().random.nextInt(10);
+            this.travellingTicks = EntityBee.this.random.nextInt(10); // CraftBukkit - SPIGOT-7495: Give Bees another chance and let them use their own random, avoid concurrency issues
             this.setFlags(EnumSet.of(PathfinderGoal.Type.MOVE));
         }
 
@@ -1301,7 +1320,7 @@
                             }
                         }
 
-                        if (iblockdata1 != null) {
+                        if (iblockdata1 != null && CraftEventFactory.callEntityChangeBlockEvent(EntityBee.this, blockposition, iblockdata1)) { // CraftBukkit
                             EntityBee.this.level().levelEvent(2011, blockposition, 15);
                             EntityBee.this.level().setBlockAndUpdate(blockposition, iblockdata1);
                             EntityBee.this.incrementNumCropsGrownSincePollination();
@@ -1378,7 +1397,7 @@
         @Override
         protected void alertOther(EntityInsentient entityinsentient, EntityLiving entityliving) {
             if (entityinsentient instanceof EntityBee && this.mob.hasLineOfSight(entityliving)) {
-                entityinsentient.setTarget(entityliving);
+                entityinsentient.setTarget(entityliving, EntityTargetEvent.TargetReason.TARGET_ATTACKED_ENTITY, true); // CraftBukkit - reason
             }
 
         }
@@ -1387,7 +1406,7 @@
     private static class c extends PathfinderGoalNearestAttackableTarget<EntityHuman> {
 
         c(EntityBee entitybee) {
-            Objects.requireNonNull(entitybee);
+            // Objects.requireNonNull(entitybee); // CraftBukkit - decompile error
             super(entitybee, EntityHuman.class, 10, true, false, entitybee::isAngryAt);
         }
 
