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 e1865496b6c450fcdbea9ac9c86a9825ea059de9..e5c140fc21688adf72dc3d8ca0f45658e098e177 100644
--- a/src/main/java/it/unibz/inf/isochrone/config/ConfigDataset.java
+++ b/src/main/java/it/unibz/inf/isochrone/config/ConfigDataset.java
@@ -436,8 +436,8 @@ public class ConfigDataset {
 	};
 
 	private void initTableEntries() {
-		edgeTableEntry = createTableEntry(getTableIsoLinks(), getIndexIsoLinks(), TableType.EDGE);
 		areaBufferTableEntry = createTableEntry(getTableIsoAreaBuffer(), getIndexIsoAreaBuffer(), TableType.COVERAGE);
+		edgeTableEntry = createTableEntry(getTableIsoLinks(), getIndexIsoLinks(), TableType.EDGE);
 		vertexAnnotatedTableEntry = createTableEntry(getTableIsoNodesAnnotations());
 		vertexTableEntry = createTableEntry(getTableIsoNodes(), getIndexIsoNodes(), TableType.VERTEX);
 	}
diff --git a/src/main/java/it/unibz/inf/isoga/db/DbUtility.java b/src/main/java/it/unibz/inf/isoga/db/DbUtility.java
index 517b252332187fe684317f176b572504db8e5331..35f38a70f36d4ddb68d9c711fecdeb685a12aa23 100644
--- a/src/main/java/it/unibz/inf/isoga/db/DbUtility.java
+++ b/src/main/java/it/unibz/inf/isoga/db/DbUtility.java
@@ -43,20 +43,35 @@ public final class DbUtility {
 	// Public static methods
 
 	public static void dropTable(final Connection connection, final String tableName, final boolean cascade) {
-		executeStatement(connection, "DROP TABLE " + tableName + (cascade ? " CASCADE" : ""));
+		if (tableName == null || tableName.length() <= 0) {
+			return;
+		}
+
+		executeStatement(connection, "DROP TABLE IF EXISTS " + tableName + (cascade ? " CASCADE" : ""));
 	}
 
 	public static void truncateTable(final Connection connection, final String tableName) {
+		if (tableName == null || tableName.length() <= 0) {
+			return;
+		}
+
 		executeStatement(connection, "DELETE FROM " + tableName);
 	}
 
 	public static void dropIndex(final Connection connection, final String indexName) {
+		if (indexName == null || indexName.length() <= 0) {
+			return;
+		}
+
 		executeStatement(connection, "DROP INDEX IF EXISTS " + indexName);
 	}
 
-	public static void createTargetEdgeTable(final Connection connection, final String edgeTableName) {
-		executeStatement(connection, "CREATE TABLE " + edgeTableName
-				+ " (\"ID\" integer NOT NULL, \"SOURCE\" integer, \"TARGET\" integer, \"OFFSET\" double precision, \"LENGTH\" double precision)");
+	public static void createTargetEdgeTable(final Connection connection, final String tableName) {
+		if (tableName == null || tableName.length() <= 0) {
+			return;
+		}
+
+		executeStatement(connection, "CREATE TABLE " + tableName + " (\"ID\" integer NOT NULL, \"SOURCE\" integer, \"TARGET\" integer, \"OFFSET\" double precision, \"LENGTH\" double precision)");
 	}
 
 	public static void insertGeometryMetadata(final Connection connection, final TableEntry tableEntry, final int serverSrid) {
@@ -85,7 +100,17 @@ public final class DbUtility {
 	}
 
 	public static void createSpatialIndex(final Connection connection, final TableEntry tableEntry) {
-		executeStatement(connection, "CREATE INDEX " + tableEntry.getIndexName() + " ON " + tableEntry.getTableName() + " USING GIST(\"GEOMETRY\")");
+		final String indexName = tableEntry.getIndexName();
+		if (indexName == null || indexName.length() <= 0) {
+			return;
+		}
+
+		final String tableName = tableEntry.getTableName();
+		if (tableName == null || tableName.length() <= 0) {
+			return;
+		}
+
+		executeStatement(connection, "CREATE INDEX " + indexName + " ON " + tableName + " USING GIST(\"GEOMETRY\")");
 	}
 
 	public static boolean dropTablesByRegexp(final Connection connection, final String regex) {
@@ -129,14 +154,26 @@ public final class DbUtility {
 	}
 
 	public static void createVertexAnnotationTable(final Connection connection, final String tableName) {
+		if (tableName == null || tableName.length() <= 0) {
+			return;
+		}
+
 		executeStatement(connection, "CREATE TABLE " + tableName + " (\"ID\" integer NOT NULL, \"ROUTE_ID\" smallint,\"TIME_A\" integer,\"TIME_D\" integer)");
 	}
 
 	public static void createTargetVertexTable(final Connection connection, final String tableName) {
+		if (tableName == null || tableName.length() <= 0) {
+			return;
+		}
+
 		executeStatement(connection, "CREATE TABLE " + tableName + " (\"ID\" integer NOT NULL, \"DISTANCE\" double precision, \"ROUTE_ID\" smallint, \"STATE\" VARCHAR(7), \"T_TYPE\" smallint)");
 	}
 
 	public static void createTargetBufferTable(final Connection connection, final String tableName) {
+		if (tableName == null || tableName.length() <= 0) {
+			return;
+		}
+
 		executeStatement(connection, "CREATE TABLE " + tableName + " (\"ID\" integer NOT NULL, CONSTRAINT pkey_" + tableName + " PRIMARY KEY (\"ID\"))");
 	}
 
diff --git a/src/main/java/it/unibz/inf/isoga/service/AbstractService.java b/src/main/java/it/unibz/inf/isoga/service/AbstractService.java
index 48cfd01d111b6a89de5fd09d5b6acf8d796b397d..ee5bfa4bb02caa9e982ee827fb00e286bb1b0f5f 100644
--- a/src/main/java/it/unibz/inf/isoga/service/AbstractService.java
+++ b/src/main/java/it/unibz/inf/isoga/service/AbstractService.java
@@ -12,6 +12,8 @@ import it.unibz.inf.isoga.service.dto.IRequest;
 import it.unibz.inf.isoga.service.dto.IResponse;
 
 import java.sql.Connection;
+import java.util.ArrayList;
+import java.util.Collection;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -36,6 +38,15 @@ public abstract class AbstractService<T extends IRequest, U extends IResponse> i
 
 	// Protected methods
 
+	private void performDbCleanup(final Connection connection, final Collection<TableEntry> createdEntries) {
+		for (TableEntry entry : createdEntries) {
+			LOGGER.debug("Deleting created layer, since an error occured during client config registration");
+			DbUtility.deleteGeometryMetadata(connection, entry.getTableName());
+			DbUtility.dropTable(connection, entry.getTableName(), false);
+			DbUtility.dropIndex(connection, entry.getIndexName());
+		}
+	}
+
 	/**
 	 * Creates the database tables and new layers for every session.
 	 *
@@ -43,6 +54,7 @@ public abstract class AbstractService<T extends IRequest, U extends IResponse> i
 	 * @param configClient the configuration containing the tables and layer names which are created/registered.
 	 */
 	protected void registerTableAndLayers(final Connection connection, final ConfigClient configClient) {
+		final Collection<TableEntry> createdEntries = new ArrayList<>(5);
 		final ConfigGeoserver configGeoserver = ConfigGeoserver.getInstance();
 		final GeoServerRESTPublisher publisher = configGeoserver.getGeoServerPublisher();
 		final String ws = configGeoserver.getRenderServerWorkspace();
@@ -52,18 +64,21 @@ public abstract class AbstractService<T extends IRequest, U extends IResponse> i
 		final int serverSrid = configClient.getServerSRID();
 		final String srs = "EPSG:" + serverSrid;
 
-		// register edge layer
+		// register edge table and layer
 		final TableEntry edgeTableEntry = configClient.getEdgeTableEntry();
 		DbUtility.deleteGeometryMetadata(connection, edgeTableEntry.getTableName());
 		DbUtility.createTargetEdgeTable(connection, edgeTableEntry.getTableName());
 		DbUtility.insertGeometryMetadata(connection, edgeTableEntry, serverSrid);
 		DbUtility.createSpatialIndex(connection, edgeTableEntry);
-		// TODO: Log database table creation
+		createdEntries.add(edgeTableEntry);
+		LOGGER.debug("Successfully created edge table \"" + edgeTableEntry.getTableName() + "\"");
+
 		final GSFeatureTypeEncoder edgeFeatureTypeEncoder = getFeatureEncoder(edgeTableEntry, serverExtend, srs);
 		final GSLayerEncoder edgeLayerEncoder = new GSLayerEncoder();
 		edgeLayerEncoder.setDefaultStyle("STYLE_ISO_EDGES");
 		if (!publisher.publishDBLayer(ws, ds, edgeFeatureTypeEncoder, edgeLayerEncoder)) {
 			LOGGER.debug("Could not register edge layer \"" + edgeFeatureTypeEncoder.getName() + "\"");
+			performDbCleanup(connection, createdEntries);
 			throw new RuntimeException("Couldn't register edge layer on the GeoServer");
 		}
 		LOGGER.debug("Successfully registered edge layer \"" + edgeFeatureTypeEncoder.getName() + "\"");
@@ -71,33 +86,43 @@ public abstract class AbstractService<T extends IRequest, U extends IResponse> i
 		// create vertex annotation table
 		final TableEntry annotatedTableEntry = configClient.getVertexAnnotatedTableEntry();
 		DbUtility.createVertexAnnotationTable(connection, annotatedTableEntry.getTableName());
+		createdEntries.add(annotatedTableEntry);
 		LOGGER.debug("Successfully created vertex annotation table \"" + annotatedTableEntry.getTableName() + "\"");
 
-		// register vertex table
+		// register vertex table and layer
 		final TableEntry vertexTableEntry = configClient.getVertexTableEntry();
 		DbUtility.deleteGeometryMetadata(connection, vertexTableEntry.getTableName());
 		DbUtility.createTargetVertexTable(connection, vertexTableEntry.getTableName());
 		DbUtility.insertGeometryMetadata(connection, vertexTableEntry, serverSrid);
 		DbUtility.createSpatialIndex(connection, vertexTableEntry);
+		createdEntries.add(vertexTableEntry);
+		LOGGER.debug("Successfully created vertex table \"" + vertexTableEntry.getTableName() + "\"");
+
 		final GSFeatureTypeEncoder vertexFeatureTypeEncoder = getFeatureEncoder(vertexTableEntry, serverExtend, srs);
 		final GSLayerEncoder vertexLayerEncoder = new GSLayerEncoder();
 		vertexLayerEncoder.setDefaultStyle("STYLE_VERTICES_EXPIRATION");
 		if (!publisher.publishDBLayer(ws, ds, vertexFeatureTypeEncoder, vertexLayerEncoder)) {
 			LOGGER.debug("Could not register vertex layer \"" + vertexFeatureTypeEncoder.getName() + "\"");
+			performDbCleanup(connection, createdEntries);
 			throw new RuntimeException("Couldn't register vertex layer on the GeoServer");
 		}
 		LOGGER.debug("Successfully registered vertex layer \"" + vertexFeatureTypeEncoder.getName() + "\"");
 
+		// register area buffer table and layer
 		final TableEntry areaBufferTableEntry = configClient.getAreaBufferTableEntry();
 		DbUtility.deleteGeometryMetadata(connection, areaBufferTableEntry.getTableName());
 		DbUtility.createTargetBufferTable(connection, areaBufferTableEntry.getTableName());
 		DbUtility.insertGeometryMetadata(connection, areaBufferTableEntry, serverSrid);
 		DbUtility.createSpatialIndex(connection, areaBufferTableEntry);
+		createdEntries.add(areaBufferTableEntry);
+		LOGGER.debug("Successfully created areaBuffer table \"" + areaBufferTableEntry.getTableName() + "\"");
+
 		final GSFeatureTypeEncoder bufferFeatureTypeEncoder = getFeatureEncoder(areaBufferTableEntry, serverExtend, srs);
 		final GSLayerEncoder bufferLayerEncoder = new GSLayerEncoder();
 		bufferLayerEncoder.setDefaultStyle("STYLE_ISO_AREA");
 		if (!publisher.publishDBLayer(ws, ds, bufferFeatureTypeEncoder, bufferLayerEncoder)) {
 			LOGGER.warn("Could not register feature layer \"" + bufferFeatureTypeEncoder.getName() + "\"");
+			performDbCleanup(connection, createdEntries);
 			throw new RuntimeException("Couldn't register areaBuffer layer on the GeoServer");
 		}
 		LOGGER.debug("Successfully registered feature layer \"" + bufferFeatureTypeEncoder.getName() + "\"");
diff --git a/src/main/java/it/unibz/inf/isoga/web/JsonWebsocket.java b/src/main/java/it/unibz/inf/isoga/web/JsonWebsocket.java
index 052db3686b418cbc986103219f2734463261eb76..26b35fe49e92aff23a7f6c5db246428f57b5da43 100644
--- a/src/main/java/it/unibz/inf/isoga/web/JsonWebsocket.java
+++ b/src/main/java/it/unibz/inf/isoga/web/JsonWebsocket.java
@@ -73,12 +73,14 @@ public class JsonWebsocket {
 		for (final ConfigClient clientDSetConfig : allClientDatasetConfigs) {
 			if (clientDSetConfig.isRegistered()) {
 				// unregister layers
-				for (final TableEntry layerName : clientDSetConfig.getLayers()) {
+				final Collection<TableEntry> layers = clientDSetConfig.getLayers();
+				for (final TableEntry layerName : layers) {
 					publisher.removeLayer(ws, layerName.getTableName());
 				}
 
 				// drop tables
-				for (final TableEntry tableEntry : clientDSetConfig.getTables()) {
+				final Collection<TableEntry> tables = clientDSetConfig.getTables();
+				for (final TableEntry tableEntry : tables) {
 					DbUtility.dropIndex(connection, tableEntry.getIndexName());
 					DbUtility.dropTable(connection, tableEntry.getTableName(), true);
 				}
diff --git a/src/main/java/it/unibz/inf/isoga/web/StartupListener.java b/src/main/java/it/unibz/inf/isoga/web/StartupListener.java
index ba660cc14cf60b7733f9e2f42bd10b3f5dd21b87..88465c088111a6226cda206997f1a5bbe11b550c 100644
--- a/src/main/java/it/unibz/inf/isoga/web/StartupListener.java
+++ b/src/main/java/it/unibz/inf/isoga/web/StartupListener.java
@@ -52,7 +52,7 @@ public class StartupListener implements ServletContextListener {
 		final ConfigIsochrone isoConfig = ConfigIsochrone.getInstance();
 		final String prefixConf = isoConfig.getPrefix();
 		final boolean prefixSet = (prefixConf != null && prefixConf.length() > 0);
-		final String prefix = (prefixSet) ? ("^" + prefixConf + "\\_") : "^";
+		final String prefix = (prefixSet) ? (prefixConf + "\\_") : "";
 		final String[] regexpTables = new String[] {
 			prefix + "__\\_iso\\_edge%",
 			prefix + "__\\_iso\\_node%",