@Override
  protected void loadFile() {
    super.loadFile();
    FileConfiguration internalConfig =
        YamlConfiguration.loadConfiguration(plugin.getResource(fileName));

    Set<String> configKeys = config.getKeys(true);
    Set<String> internalConfigKeys = internalConfig.getKeys(true);

    boolean needSave = false;

    Set<String> oldKeys = new HashSet<String>(configKeys);
    oldKeys.removeAll(internalConfigKeys);

    Set<String> newKeys = new HashSet<String>(internalConfigKeys);
    newKeys.removeAll(configKeys);

    // Don't need a re-save if we have old keys sticking around?
    // Would be less saving, but less... correct?
    if (!newKeys.isEmpty() || !oldKeys.isEmpty()) {
      needSave = true;
    }

    for (String key : oldKeys) {
      plugin.debug("Removing unused key: " + key);
      config.set(key, null);
    }

    for (String key : newKeys) {
      plugin.debug("Adding new key: " + key + " = " + internalConfig.get(key));
      config.set(key, internalConfig.get(key));
    }

    if (needSave) {
      // Get Bukkit's version of an acceptable config with new keys, and no old keys
      String output = config.saveToString();

      // Convert to the superior 4 space indentation
      output = output.replace("  ", "    ");

      // Rip out Bukkit's attempt to save comments at the top of the file
      while (output.indexOf('#') != -1) {
        output = output.substring(output.indexOf('\n', output.indexOf('#')) + 1);
      }

      // Read the internal config to get comments, then put them in the new one
      try {
        // Read internal
        BufferedReader reader =
            new BufferedReader(new InputStreamReader(plugin.getResource(fileName)));
        HashMap<String, String> comments = new HashMap<String, String>();
        String temp = "";

        String line;
        while ((line = reader.readLine()) != null) {
          if (line.contains("#")) {
            temp += line + "\n";
          } else if (line.contains(":")) {
            line = line.substring(0, line.indexOf(":") + 1);
            if (!temp.isEmpty()) {
              comments.put(line, temp);
              temp = "";
            }
          }
        }

        // Dump to the new one
        for (String key : comments.keySet()) {
          if (output.contains(key)) {
            output =
                output.substring(0, output.indexOf(key))
                    + comments.get(key)
                    + output.substring(output.indexOf(key));
          }
        }
      } catch (Exception e) {
        e.printStackTrace();
      }

      // Save it
      try {
        String saveName = fileName;
        // At this stage we cannot guarantee that Config has been loaded, so we do the check
        // directly here
        if (!plugin.getConfig().getBoolean("General.Config_Update_Overwrite", true)) {
          saveName += ".new";
        }

        BufferedWriter writer =
            new BufferedWriter(new FileWriter(new File(plugin.getDataFolder(), saveName)));
        writer.write(output);
        writer.flush();
        writer.close();
      } catch (Exception e) {
        e.printStackTrace();
      }
    }
  }