@Override
    public void onBlockBreak(BlockBreakEvent event) {
	if (event.isCancelled()) {
	    return;
	}
	List<PlanArea> areas = new ArrayList<PlanArea>(planAreas);
	for (PlanArea area : areas) {
	    if (Config.isFloorInvincible() && area.isFloorBlock(event.getBlock())) {
		event.setCancelled(true);
		return;
	    }

	    if (area.fenceContains(event.getBlock()) || event.getBlock().equals(area.getSignBlock())) {
		if (!area.checkPermission(event.getPlayer(), OpType.DESTROY)) {
		    event.setCancelled(true);
		    return;
		}

		if (area.isLocked()) {
		    event.getPlayer().sendMessage("Area is locked: " + area.getLockReason());
		    event.setCancelled(true);
		    return;
		}

		BuildingPlanner.info("Destroying Plan");
		final PlanArea destroyArea = area;
		Thread planDestroyThread = new Thread("Plan destroy thread") {
		    public void run() {
			destroyArea.destroyArea();

			for (PlanAreaListener listener : listeners) {
			    listener.destroy(destroyArea);
			}
		    };
		};
		planDestroyThread.setDaemon(true);
		planDestroyThread.start();
		continue;
	    }
	}
    }