--- a/net/minecraft/server/TileEntityBeehive.java
+++ b/net/minecraft/server/TileEntityBeehive.java
@@ -108,6 +108,18 @@
 
     public void a(Entity entity, boolean flag, int i) {
         if (this.bees.size() < 3) {
+            // CraftBukkit start
+            if (this.world != null) {
+                org.bukkit.event.entity.EntityEnterBlockEvent event = new org.bukkit.event.entity.EntityEnterBlockEvent(entity.getBukkitEntity(), org.bukkit.craftbukkit.block.CraftBlock.at(world, getPosition()));
+                org.bukkit.Bukkit.getPluginManager().callEvent(event);
+                if (event.isCancelled()) {
+                    if (entity instanceof EntityBee) {
+                        ((EntityBee) entity).setCannotEnterHiveTicks(400);
+                    }
+                    return;
+                }
+            }
+            // CraftBukkit end
             entity.stopRiding();
             entity.ejectPassengers();
             NBTTagCompound nbttagcompound = new NBTTagCompound();
@@ -163,6 +175,7 @@
                     if (!entity.getEntityType().a(TagsEntity.BEEHIVE_INHABITORS)) {
                         return false;
                     } else {
+                        if (!this.world.addEntity(entity, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.BEEHIVE)) return false; // CraftBukkit - SpawnReason, moved from below
                         if (entity instanceof EntityBee) {
                             EntityBee entitybee = (EntityBee) entity;
 
@@ -196,7 +209,7 @@
                         BlockPosition blockposition2 = this.getPosition();
 
                         this.world.playSound((EntityHuman) null, (double) blockposition2.getX(), (double) blockposition2.getY(), (double) blockposition2.getZ(), SoundEffects.BLOCK_BEEHIVE_EXIT, SoundCategory.BLOCKS, 1.0F, 1.0F);
-                        return this.world.addEntity(entity);
+                        return true; // return this.world.addEntity(entity); // CraftBukkit - moved up
                     }
                 } else {
                     return false;
@@ -223,6 +236,11 @@
                 if (this.a(iblockdata, nbttagcompound, (List) null, tileentitybeehive_releasestatus)) {
                     iterator.remove();
                 }
+                // CraftBukkit start
+                else {
+                    tileentitybeehive_hivebee.ticksInHive = tileentitybeehive_hivebee.minOccupationTicks / 2; // Not strictly Vanilla behaviour in cases where bees cannot spawn but still reasonable
+                }
+                // CraftBukkit end
             } else {
                 tileentitybeehive_hivebee.ticksInHive++;
             }
