public void init() {
	PlanAreaCreationListener areaCreationListener = new PlanAreaCreationListener();
	areaCreationListener.addListener(this);
	BuildingPlanner.pm.registerEvent(Type.SIGN_CHANGE, areaCreationListener, Priority.Normal,
		BuildingPlanner.plugin);

	PlanAreaDestroyListener areaDestroyListener = new PlanAreaDestroyListener(planAreas);
	areaDestroyListener.addListener(this);
	BuildingPlanner.pm
		.registerEvent(Type.BLOCK_BREAK, areaDestroyListener, Priority.Normal, BuildingPlanner.plugin);

	PlanAreaModificationListener areaModifyListener = new PlanAreaModificationListener();
	BuildingPlanner.pm.registerEvent(Type.BLOCK_FROMTO, areaModifyListener, Priority.Normal, BuildingPlanner.plugin);
	BuildingPlanner.pm.registerEvent(Type.BLOCK_BREAK, areaModifyListener, Priority.Normal, BuildingPlanner.plugin);
	BuildingPlanner.pm
		.registerEvent(Type.BLOCK_IGNITE, areaModifyListener, Priority.Normal, BuildingPlanner.plugin);
	BuildingPlanner.pm
		.registerEvent(Type.BLOCK_DAMAGE, areaModifyListener, Priority.Normal, BuildingPlanner.plugin);
	BuildingPlanner.pm.registerEvent(Type.BLOCK_PLACE, areaModifyListener, Priority.Normal, BuildingPlanner.plugin);

	PlayerAreaListener movementListener = new PlayerAreaListener();
	BuildingPlanner.pm.registerEvent(Type.PLAYER_INTERACT, movementListener, Priority.Normal,
		BuildingPlanner.plugin);
	BuildingPlanner.pm.registerEvent(Type.PLAYER_MOVE, movementListener, Priority.Normal,
		BuildingPlanner.plugin);
	
	BuildingPlanner.pm.registerEvent(Type.ITEM_SPAWN, new PlanItemListener(), Priority.Normal,
		BuildingPlanner.plugin);

	PlanEntityListener entityListener = new PlanEntityListener();
	BuildingPlanner.pm.registerEvent(Type.ENTITY_DAMAGE, entityListener, Priority.Normal,
		BuildingPlanner.plugin);
	BuildingPlanner.pm.registerEvent(Type.ENTITY_EXPLODE, entityListener, Priority.Normal,
		BuildingPlanner.plugin);

	Thread supplyCheckThread = new Thread("PlanAreaSupplyThread") {
	    @Override
	    public void run() {
		while (BuildingPlanner.plugin.isEnabled()) {
		    try {
			if (checkAreas()) {
			    // Try build again sooner if block has been built
			    Thread.sleep(500);
			} else {
			    Thread.sleep(5000);
			}
			// Catch all throwables so that the thread doesn't die if something breaks.
		    } catch (Throwable e) {
			e.printStackTrace();
		    }
		}
	    }
	};
	supplyCheckThread.setDaemon(true);
	supplyCheckThread.start();

	Thread saveThread = new Thread("PlanAreaSave") {
	    @Override
	    public void run() {
		while (BuildingPlanner.plugin.isEnabled()) {

		    try {
			saveAreas();
			Thread.sleep(5000);
			// Catch all throwables so that the thread doesn't die if something breaks.
		    } catch (Throwable e) {
			e.printStackTrace();
		    }

		}
	    }
	};
	saveThread.setDaemon(true);
	saveThread.start();

	File[] areaList = BuildingPlanner.plugin.getDataFolder().listFiles(new FilenameFilter() {

	    public boolean accept(File dir, String name) {
		if (name.endsWith(".area")) {
		    return true;
		}
		return false;
	    }
	});

	for (File file : areaList) {
	    BuildingPlanner.info("Loading Area: "+file.getName());
	    PlanArea area = new PlanArea();
	    area.loadArea(file);
	    synchronized (planAreas) {
		planAreas.add(area);
	    }
	}
    }