private static void load() {
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    factory.setValidating(false);
    factory.setIgnoringComments(true);

    for (File file : Util.getDatapackFiles("mapregion", ".xml")) {
      try {
        Document doc = factory.newDocumentBuilder().parse(file);
        for (Node n = doc.getFirstChild(); n != null; n = n.getNextSibling()) {
          if ("list".equalsIgnoreCase(n.getNodeName())) {
            for (Node d = n.getFirstChild(); d != null; d = d.getNextSibling()) {
              if ("region".equalsIgnoreCase(d.getNodeName())) {
                NamedNodeMap attrs = d.getAttributes();
                Node att;
                String name = "";
                String town = "";
                int locId = -1;
                int castle = -1;
                int bbs = -1;

                att = attrs.getNamedItem("name");
                if (att == null) {
                  _log.severe("Missing name for MapRegion, skipping");
                  continue;
                }
                name = att.getNodeValue();

                att = attrs.getNamedItem("town");
                if (att == null) {
                  _log.severe("Missing town for MapRegion name: " + name + ", skipping");
                  continue;
                }
                town = att.getNodeValue();

                att = attrs.getNamedItem("locId");
                if (att == null) {
                  _log.severe("Missing locId for MapRegion name: " + name + ", skipping");
                  continue;
                }
                locId = Integer.parseInt(att.getNodeValue());

                att = attrs.getNamedItem("castle");
                if (att == null) {
                  _log.severe("Missing castle for MapRegion name: " + name + ", skipping");
                  continue;
                }
                castle = Integer.parseInt(att.getNodeValue());

                att = attrs.getNamedItem("bbs");
                if (att == null) {
                  _log.severe("Missing bbs for MapRegion name: " + name + ", skipping");
                  continue;
                }
                bbs = Integer.parseInt(att.getNodeValue());

                L2MapRegion region = new L2MapRegion(name, town, locId, castle, bbs);
                for (Node c = d.getFirstChild(); c != null; c = c.getNextSibling()) {
                  if ("respawnPoint".equalsIgnoreCase(c.getNodeName())) {
                    attrs = c.getAttributes();
                    int spawnX = Integer.parseInt(attrs.getNamedItem("X").getNodeValue());
                    int spawnY = Integer.parseInt(attrs.getNamedItem("Y").getNodeValue());
                    int spawnZ = Integer.parseInt(attrs.getNamedItem("Z").getNodeValue());

                    Node val = attrs.getNamedItem("isOther");
                    boolean other = val != null && Boolean.parseBoolean(val.getNodeValue());

                    val = attrs.getNamedItem("isChaotic");
                    boolean chaotic = val != null && Boolean.parseBoolean(val.getNodeValue());

                    val = attrs.getNamedItem("isBanish");
                    boolean banish = val != null && Boolean.parseBoolean(val.getNodeValue());

                    if (other) region.addOtherSpawn(spawnX, spawnY, spawnZ);
                    else if (chaotic) region.addChaoticSpawn(spawnX, spawnY, spawnZ);
                    else if (banish) region.addBanishSpawn(spawnX, spawnY, spawnZ);
                    else region.addSpawn(spawnX, spawnY, spawnZ);
                  } else if ("map".equalsIgnoreCase(c.getNodeName())) {
                    attrs = c.getAttributes();
                    int mapX = Integer.parseInt(attrs.getNamedItem("X").getNodeValue());
                    int mapY = Integer.parseInt(attrs.getNamedItem("Y").getNodeValue());

                    region.addMap(mapX, mapY);
                  } else if ("banned".equalsIgnoreCase(c.getNodeName())) {
                    attrs = c.getAttributes();
                    String race = attrs.getNamedItem("race").getNodeValue();
                    String point = attrs.getNamedItem("point").getNodeValue();

                    region.addBannedRace(race, point);
                  }
                }
                _regions.put(name, region);
              }
            }
          }
        }
      } catch (Exception e) {
        _log.severe("MapRegion file (" + file.getAbsolutePath() + ") doesnt exists.");
      }
    }
  }