diff --git a/src/main/java/it/unibz/inf/isochrone/config/ConfigDataset.java b/src/main/java/it/unibz/inf/isochrone/config/ConfigDataset.java
index 2a9085a65ca199158a94fb64835d601f67b822a9..d797249aab360c0db60204621f49b30aff0b4904 100644
--- a/src/main/java/it/unibz/inf/isochrone/config/ConfigDataset.java
+++ b/src/main/java/it/unibz/inf/isochrone/config/ConfigDataset.java
@@ -12,12 +12,12 @@ import com.tngtech.configbuilder.annotation.valueextractor.PropertyValue;
 
 import it.unibz.inf.isochrone.util.EnumContainer.TableType;
 import it.unibz.inf.isochrone.util.Point;
+import it.unibz.inf.isochrone.util.ResourceHelper;
 import it.unibz.inf.isoga.db.DatabaseWeb;
 import it.unibz.inf.isoga.db.TableEntry;
 import it.unibz.inf.isoga.geometry.BBox;
 
-import java.io.File;
-import java.net.URISyntaxException;
+import java.io.IOException;
 import java.text.DateFormat;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
@@ -29,10 +29,11 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 import javax.validation.constraints.NotNull;
 
-import org.apache.commons.io.FileUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -72,11 +73,10 @@ public class ConfigDataset {
 		}
 	}
 
-	private static Map<String, ConfigDataset> instanceMap = new HashMap<>();
 	private static final Logger LOGGER = LoggerFactory.getLogger(ConfigDataset.class);
 	private static final Collection<String> ALL_DATASETS = initDatasets();
-	private static final String[] DS_CONFIG_EXT_ARR = new String[] {"xml"};
-	private static final String DS_CONFIG_PREFIX = "config_";
+	private static final String DS_CONFIG_PATTERN = ".*config\\_(.*)\\.xml";
+	private static Map<String, ConfigDataset> instanceMap = new HashMap<>();
 
 	@PropertyValue("client.tArrival")
 	@TypeTransformers(CalendarTransformer.class)
@@ -396,32 +396,31 @@ public class ConfigDataset {
 	}
 
 	private static Collection<String> initDatasets() {
-		File resourceDir = null;
+		final Pattern dsConfigPattern = Pattern.compile(DS_CONFIG_PATTERN);
+
+		Collection<String> fileCollection = null;
 		try {
-			resourceDir = new File(ConfigDataset.class.getResource("/").toURI());
-		} catch (URISyntaxException e) {
+			fileCollection = ResourceHelper.getResources(dsConfigPattern);
+		} catch (IOException e) {
+			fileCollection = null;
 			LOGGER.warn("Datasets could not be read. There might be no configured datasets available!");
 		}
 
-		if (resourceDir == null) {
+		if (fileCollection == null) {
 			return Collections.emptyList();
 		}
 
-		final Collection<File> fileCollection = FileUtils.listFiles(resourceDir, DS_CONFIG_EXT_ARR, false);
 		final List<String> dsConfigCollection = new ArrayList<>(fileCollection.size());
-
-		// TODO: Only add datasets that are also configured in the db
-		final int prefixLength = DS_CONFIG_PREFIX.length();
-		for (File file : fileCollection) {
-			final String fileName = file.getName();
-			if (fileName.startsWith(DS_CONFIG_PREFIX)) {
-				String datasetName = fileName.substring(prefixLength);
-				datasetName = datasetName.substring(0, datasetName.lastIndexOf("."));
-				dsConfigCollection.add(datasetName);
+		for (String fileName : fileCollection) {
+			final Matcher m = dsConfigPattern.matcher(fileName);
+			if (m.matches()) {
+				dsConfigCollection.add(m.group(1));
 			}
 		}
 
+		// TODO: Remove datasets, which are not configured correctly or have no data (or datatables) int
 		Collections.sort(dsConfigCollection);
+
 		return dsConfigCollection;
 	}
 }
diff --git a/src/main/java/it/unibz/inf/isochrone/util/ResourceHelper.java b/src/main/java/it/unibz/inf/isochrone/util/ResourceHelper.java
new file mode 100644
index 0000000000000000000000000000000000000000..54d6c290e9b1239acb3b08d17f0a062404d88b6d
--- /dev/null
+++ b/src/main/java/it/unibz/inf/isochrone/util/ResourceHelper.java
@@ -0,0 +1,104 @@
+package it.unibz.inf.isochrone.util;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Enumeration;
+import java.util.regex.Pattern;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
+
+/**
+ * Gets available resources (from the classpath) by a regular expression pattern.
+ */
+public final class ResourceHelper {
+
+	// Constructor
+
+	private ResourceHelper() {}
+
+	// Public static methods
+
+	/**
+	 * Gets all resources matching the given pattern.
+	 *
+	 * @param pattern the pattern to match against (as string)
+	 * @return the resources in the order they are found
+	 * @throws IOException if an I/O error occurs
+	 */
+	public static Collection<String> getResources(final String pattern) throws IOException {
+		return getResources(Pattern.compile(pattern));
+	}
+
+	/**
+	 * Gets all resources matching the given pattern.
+	 *
+	 * @param pattern the pattern to match against
+	 * @return the resources in the order they are found
+	 * @throws IOException if an I/O error occurs
+	 */
+	public static Collection<String> getResources(final Pattern pattern) throws IOException {
+		final Collection<String> retval = new ArrayList<String>();
+		final String classPath = System.getProperty("java.class.path", ".");
+		final String[] classPathElements = classPath.split(File.pathSeparator);
+		for (final String element : classPathElements) {
+			retval.addAll(getResources(element, pattern));
+		}
+
+		return retval;
+	}
+
+	// Private static methods
+
+	private static Collection<String> getResources(final String element, final Pattern pattern) throws IOException {
+		final Collection<String> retval = new ArrayList<String>();
+
+		final File file = new File(element);
+		if (file.isDirectory()) {
+			retval.addAll(getResourcesFromDirectory(file, pattern));
+		} else {
+			retval.addAll(getResourcesFromJarFile(file, pattern));
+		}
+
+		return retval;
+	}
+
+	private static Collection<String> getResourcesFromJarFile(final File file, final Pattern pattern) throws IOException {
+		final Collection<String> retval = new ArrayList<String>();
+		try (final ZipFile zf = new ZipFile(file)) {
+			final Enumeration<? extends ZipEntry> e = zf.entries();
+			while (e.hasMoreElements()) {
+				final ZipEntry ze = e.nextElement();
+				final String fileName = ze.getName();
+				final boolean accept = pattern.matcher(fileName).matches();
+				if (accept) {
+					retval.add(fileName);
+				}
+			}
+		} catch (final IOException ioe) {
+			throw ioe;
+		}
+
+		return retval;
+	}
+
+	private static Collection<String> getResourcesFromDirectory(final File directory, final Pattern pattern) throws IOException {
+		final Collection<String> retval = new ArrayList<String>();
+
+		final File[] fileList = directory.listFiles();
+		for (final File file : fileList) {
+			if (file.isDirectory()) {
+				retval.addAll(getResourcesFromDirectory(file, pattern));
+			} else {
+				final String fileName = file.getCanonicalPath();
+				final boolean accept = pattern.matcher(fileName).matches();
+				if (accept) {
+					retval.add(fileName);
+				}
+			}
+		}
+
+		return retval;
+	}
+}