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 d797249aab360c0db60204621f49b30aff0b4904..776725036e8d8eb73af541f833876f7bfbe1dc1e 100644
--- a/src/main/java/it/unibz/inf/isochrone/config/ConfigDataset.java
+++ b/src/main/java/it/unibz/inf/isochrone/config/ConfigDataset.java
@@ -22,6 +22,7 @@ import java.text.DateFormat;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Calendar;
 import java.util.Collection;
 import java.util.Collections;
@@ -74,7 +75,7 @@ public class ConfigDataset {
 	}
 
 	private static final Logger LOGGER = LoggerFactory.getLogger(ConfigDataset.class);
-	private static final Collection<String> ALL_DATASETS = initDatasets();
+	private static final Collection<String> ALL_DATASETS = getAvailableDatasets(true);
 	private static final String DS_CONFIG_PATTERN = ".*config\\_(.*)\\.xml";
 	private static Map<String, ConfigDataset> instanceMap = new HashMap<>();
 
@@ -174,14 +175,12 @@ public class ConfigDataset {
 	protected TableEntry vertexTableEntry;
 
 	public static ConfigDataset getInstance(final String datasetName) {
-		final List<String> propertyFiles = new ArrayList<>(1);
-		propertyFiles.add("config_" + datasetName);
+		if (!ALL_DATASETS.contains(datasetName)) {
+			return null;
+		}
 
 		if (!instanceMap.containsKey(datasetName)) {
-			final ConfigDataset config = new ConfigBuilder<>(ConfigDataset.class).overridePropertiesFiles(propertyFiles).build();
-			config.datasetName = datasetName;
-			config.initTableEntries();
-
+			final ConfigDataset config = createInstance(datasetName);
 			instanceMap.put(datasetName, config);
 			return config;
 		}
@@ -369,8 +368,57 @@ public class ConfigDataset {
 		return clientArrivalTime;
 	}
 
+	// Protected static methods
+
+	protected static Collection<String> getAvailableDatasets(final boolean filterInvalid) {
+		final Pattern dsConfigPattern = Pattern.compile(DS_CONFIG_PATTERN);
+
+		Collection<String> fileCollection = null;
+		try {
+			fileCollection = ResourceHelper.getResources(dsConfigPattern);
+		} catch (IOException e) {
+			fileCollection = null;
+			LOGGER.warn("Datasets could not be read. There might be no configured datasets available!");
+		}
+
+		if (fileCollection == null) {
+			return Collections.emptyList();
+		}
+
+		final List<String> datasets = new ArrayList<>(fileCollection.size());
+		for (String fileName : fileCollection) {
+			final Matcher m = dsConfigPattern.matcher(fileName);
+			if (m.matches()) {
+				datasets.add(m.group(1));
+			}
+		}
+
+		Collections.sort(datasets);
+		if (filterInvalid) {
+			return filterInvalidDatasets(datasets);
+		}
+
+		return datasets;
+	}
+
 	// Private methods
 
+	private boolean hasValidDatabase(final Collection<String> allTables) {
+		Collection<String> configTables = new ArrayList<>();
+		configTables.add(getTableDatecodes());
+		configTables.add(getTableEdges());
+//		configTables.add(getTableIsoAreaBuffer());
+//		configTables.add(getTableIsoLinks());
+//		configTables.add(getTableIsoNodes());
+//		configTables.add(getTableIsoNodesAnnotations());
+		configTables.add(getTableRoutes());
+		configTables.add(getTableSchedule());
+		configTables.add(getTableVertex());
+		configTables.add(getTableVertexDensity());
+
+		return allTables.containsAll(configTables);
+	};
+
 	private void initTableEntries() {
 		edgeTableEntry = createTableEntry(getTableIsoLinks(), getIndexIsoLinks(), TableType.EDGE);
 		areaBufferTableEntry = createTableEntry(getTableIsoAreaBuffer(), getIndexIsoAreaBuffer(), TableType.COVERAGE);
@@ -380,6 +428,15 @@ public class ConfigDataset {
 
 	// Private static methods
 
+	private static ConfigDataset createInstance(final String datasetName) {
+		final List<String> baseNames = Arrays.asList(new String[]{"config_" + datasetName});
+		final ConfigDataset config = new ConfigBuilder<>(ConfigDataset.class).overridePropertiesFiles(baseNames).build();
+		config.datasetName = datasetName;
+		config.initTableEntries();
+
+		return config;
+	}
+
 	private static TableEntry createTableEntry(final String tblName) {
 		return createTableEntry(tblName, null, null);
 	}
@@ -395,32 +452,21 @@ public class ConfigDataset {
 		return new TableEntry(tblName.trim(), idxName.trim(), type);
 	}
 
-	private static Collection<String> initDatasets() {
-		final Pattern dsConfigPattern = Pattern.compile(DS_CONFIG_PATTERN);
-
-		Collection<String> fileCollection = null;
-		try {
-			fileCollection = ResourceHelper.getResources(dsConfigPattern);
-		} catch (IOException e) {
-			fileCollection = null;
-			LOGGER.warn("Datasets could not be read. There might be no configured datasets available!");
-		}
-
-		if (fileCollection == null) {
-			return Collections.emptyList();
-		}
-
-		final List<String> dsConfigCollection = new ArrayList<>(fileCollection.size());
-		for (String fileName : fileCollection) {
-			final Matcher m = dsConfigPattern.matcher(fileName);
-			if (m.matches()) {
-				dsConfigCollection.add(m.group(1));
+	private static Collection<String> filterInvalidDatasets(final Collection<String> datasets) {
+		final Collection<String> filteredList = new ArrayList<String>(datasets.size());
+		final ConfigIsochrone config = ConfigIsochrone.getInstance();
+		final Collection<String> allTables = config.getAllTables();
+		for (final String ds : datasets) {
+			final ConfigDataset c = ConfigDataset.createInstance(ds);
+			if (c.hasValidDatabase(allTables)) {
+				LOGGER.info("Dataset configuration \"" + ds + "\" will be available to clients");
+				filteredList.add(ds);
+			} else {
+				LOGGER.warn("Not using dataset configuration \"" + ds + "\" since configured tables are not available!");
 			}
 		}
 
-		// TODO: Remove datasets, which are not configured correctly or have no data (or datatables) int
-		Collections.sort(dsConfigCollection);
-
-		return dsConfigCollection;
+		return filteredList;
 	}
+
 }
diff --git a/src/main/java/it/unibz/inf/isochrone/config/ConfigIsochrone.java b/src/main/java/it/unibz/inf/isochrone/config/ConfigIsochrone.java
index a20536aac0f265c5b2d610dea990ce1edf348003..3053c0ef3ed7c146f843406717585b406eebbea3 100644
--- a/src/main/java/it/unibz/inf/isochrone/config/ConfigIsochrone.java
+++ b/src/main/java/it/unibz/inf/isochrone/config/ConfigIsochrone.java
@@ -11,10 +11,14 @@ import com.tngtech.configbuilder.annotation.valueextractor.PropertyValue;
 import it.unibz.inf.isochrone.db.ConnectionFactory;
 
 import java.sql.Connection;
+import java.sql.ResultSet;
 import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.Collection;
 
 import javax.validation.constraints.NotNull;
 
+import org.apache.commons.dbutils.DbUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -174,4 +178,23 @@ public final class ConfigIsochrone {
 		}
 	}
 
+	public Collection<String> getAllTables() {
+		final Collection<String> result = new ArrayList<>();
+		final String query = "SELECT tablename FROM pg_tables WHERE schemaname='public'";
+
+		ResultSet rs = null;
+		try {
+			rs = getConnection().prepareCall(query).executeQuery();
+			while (rs.next()) {
+				result.add(rs.getString("tablename"));
+			}
+		} catch (SQLException e) {
+			LOGGER.warn("Could not get tables from database");
+		} finally {
+			DbUtils.closeQuietly(rs);
+		}
+
+		return result;
+	}
+
 }
diff --git a/src/test/java/it/unibz/inf/isochrone/config/ConfigDatasetTest.java b/src/test/java/it/unibz/inf/isochrone/config/ConfigDatasetTest.java
index 0d381af52dd19ef12ec559e17ed2f7a5092640a0..6cb7673421e9b7667a92a14a8cd3fe98b50a7fd5 100644
--- a/src/test/java/it/unibz/inf/isochrone/config/ConfigDatasetTest.java
+++ b/src/test/java/it/unibz/inf/isochrone/config/ConfigDatasetTest.java
@@ -8,20 +8,35 @@ import org.testng.annotations.Test;
 
 public class ConfigDatasetTest {
 	private static final int EXPECTED_NUM_DATASETS = 4;
+	private static final int EXPECTED_NUM_DATASETS_FILTERED = 1;
 	private static final String[] EXPECTED_DATASETS = new String[] {"bz", "it", "sf", "st"};
+	private static final String[] EXPECTED_DATASETS_FILTERED = new String[] {"bz"};
 
 	@Test
 	public void testDatasetCount() throws URISyntaxException {
-		final Collection<String> datasetCollection = ConfigDataset.getAllDatasets();
+		final Collection<String> datasetCollection = ConfigDataset.getAvailableDatasets(false);
 		Assert.assertEquals(datasetCollection.size(), EXPECTED_NUM_DATASETS, "Unexpected number of configured datasets");
 	}
 
 	@Test
 	public void testDatasetNames() throws URISyntaxException {
-		final Collection<String> datasetCollection = ConfigDataset.getAllDatasets();
-
+		final Collection<String> datasetCollection = ConfigDataset.getAvailableDatasets(false);
 		for (String dsName : EXPECTED_DATASETS) {
 			Assert.assertTrue(datasetCollection.contains(dsName), "Dataset of " + dsName + " unconfigured");
 		}
 	}
+
+	@Test
+	public void testDatasetCountFiltered() throws URISyntaxException {
+		final Collection<String> datasetCollection = ConfigDataset.getAvailableDatasets(true);
+		Assert.assertEquals(datasetCollection.size(), EXPECTED_NUM_DATASETS_FILTERED, "Unexpected number of configured datasets");
+	}
+
+	@Test
+	public void testDatasetNamesFiltered() throws URISyntaxException {
+		final Collection<String> datasetCollection = ConfigDataset.getAvailableDatasets(true);
+		for (String dsName : EXPECTED_DATASETS_FILTERED) {
+			Assert.assertTrue(datasetCollection.contains(dsName), "Dataset of " + dsName + " unconfigured");
+		}
+	}
 }