My suggestion is to add a BlockChangeEvent to the API. This event would live on block level, and is fired whenever a block changes it's type, for any reason. This would be useful when tracking block metadata or other, custom data. This way you can be guaranteed the data is removed when the block is also removed. Right now many different causes have different events, such as PistonExtendEvent, EntityExplodeEvent, BlockExplodeEvent and more. The information in the event should hold the block in question, and the BlockState(or material) it will change to. Optionally it could hold an BlockChangeReason enum. Hierarchy BlockChangeEvent would extend BlockEvent, and the excisting events could extend this BlockChangeEvent. One event would be an exception, EntityChangeBlockEvent, since that is currently an EntityEvent. List of suggested subclasses: BlockBreakEvent, BlockPhysicsEvent, BlockPistonEvent, EntityChangeBlockEvent, BlockFromToEvent, EntityExplodeEvent, BlockExplodeEvent, BlockPlaceEvent, BlockBurnEvent, BlockGrowEvent.