private synchronized Properties loadBootstrapProperties() throws IOException {
    if (loaded) {
      return cache;
    }

    URL url = null;

    // Try current working directory
    File propertiesFile = new File(".", DEFAULT_CONFIG_FILE_NAME);
    if (propertiesFile.exists()) {
      url = propertiesFile.toURI().toURL();
    }

    if (url == null) {
      url = Dropship.class.getClassLoader().getResource(DEFAULT_CONFIG_FILE_NAME);
    }

    if (url == null) {

      String propertiesLocation = System.getProperty(DEFAULT_CONFIG_FILE_NAME);
      if (propertiesLocation != null) {
        propertiesFile = new File(propertiesLocation);
        if (propertiesFile.exists()) {
          url = propertiesFile.toURI().toURL();
        } else {
          logger.warn("%s at %s does not exist", DEFAULT_CONFIG_FILE_NAME, propertiesLocation);
        }
      }
    }

    if (url == null) {
      logger.warn("No dropship.properties found! Using defaults");
    } else {
      logger.info("Loading configuration from %s", url);
      cache.load(url.openStream());
      for (Map.Entry<Object, Object> entry : cache.entrySet()) {
        logger.debug(" %s: %s = %s", url.getPath(), entry.getKey(), entry.getValue());
      }
    }

    for (Map.Entry<Object, Object> entry : loadPackageInformation().entrySet()) {
      //noinspection UseOfPropertiesAsHashtable
      cache.put(entry.getKey(), entry.getValue());
      logger.debug(" MANIFEST: %s = %s", entry.getKey(), entry.getValue());
    }
    loaded = true;
    return cache;
  }