n.block.setType(Material.GLASS); In game this works and works well. The blocks are set to glass, things look good. This is trigged when a certain type of block (log + some logic) is chopped down with an axe. Nevermind those details, they work as advertised. The glass is just a filler and later "decays" (via a thread spinning out random numbers and a runable task that actually does the block changes in the main thread via scheduleSyncRepeatingTask and a thread safe queue) into air and drops wood. It is just an effect to visualize to the player that "something happened". In the end a sapling is planted and all the glass turns to air having dropped the wood using n.block.getWorld().dropItem(n.block.getLocation(), new ItemStack(Material.LOG,1)); (again, this is in the main thread because I know that the world does not take kindly to being modified otherwise). Hit that sapling with an axe (it was planted with setType jut like the glass and the glass decaying to air) and the game behaves as if the blocks that used to be the tree were SILL WOOD. The trunk of the tree re-appears in glass form and decays into wood. In short the algorithm sees wood there. Somehow, SOMEWHERE, those blocks are stored as wood, but they show up in game as air. Can even walk through them to plummet to your doom through them. It's not my code, it looks around using constructs like test.block.getFace(BlockFace.DOWN).getType().equals(Material.DIRT) all starting with the block passed via the break block event. I'm terribly confused. Any insight?